@mirror-physics/fractal-ui 0.2.0-next.5 → 0.2.0-next.50

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,167 @@
32
32
  }
33
33
  }
34
34
 
35
+ /* src/components/CodeBlock/CodeBlock.css */
36
+ .fractal-code-block {
37
+ position: relative;
38
+ min-width: 0;
39
+ overflow: hidden;
40
+ border: 1px solid var(--border-subtle);
41
+ border-radius: var(--radius-md, 8px);
42
+ background: var(--bg-canvas);
43
+ color: var(--fg-primary);
44
+ font-family: var(--font-sans);
45
+ }
46
+ .fractal-code-block:focus-within {
47
+ border-color: var(--border-focus);
48
+ box-shadow: 0 0 0 1px var(--border-focus);
49
+ }
50
+ .fractal-code-block__toolbar {
51
+ display: flex;
52
+ min-height: 32px;
53
+ align-items: center;
54
+ justify-content: space-between;
55
+ gap: var(--space-3, 12px);
56
+ padding: 4px 6px 4px 12px;
57
+ border-bottom: 1px solid var(--border-subtle);
58
+ background: var(--bg-surface-1);
59
+ }
60
+ .fractal-code-block__identity {
61
+ display: flex;
62
+ min-width: 0;
63
+ align-items: center;
64
+ gap: var(--space-2, 8px);
65
+ }
66
+ .fractal-code-block__label {
67
+ overflow: hidden;
68
+ color: var(--fg-secondary);
69
+ font: 500 0.6875rem/1.4 var(--font-mono);
70
+ text-overflow: ellipsis;
71
+ white-space: nowrap;
72
+ }
73
+ .fractal-code-block__language,
74
+ .fractal-code-block__mode {
75
+ flex: 0 0 auto;
76
+ color: var(--fg-tertiary);
77
+ font-size: 0.6875rem;
78
+ line-height: 1.4;
79
+ }
80
+ .fractal-code-block__language::before {
81
+ margin-right: var(--space-2, 8px);
82
+ color: var(--border-strong);
83
+ content: "\b7";
84
+ }
85
+ .fractal-code-block__mode {
86
+ padding: 1px 6px;
87
+ border-radius: var(--radius-full, 9999px);
88
+ background: var(--accent-surface);
89
+ color: var(--accent-text);
90
+ }
91
+ .fractal-code-block__copy {
92
+ display: inline-flex;
93
+ min-height: 24px;
94
+ flex: 0 0 auto;
95
+ align-items: center;
96
+ gap: 5px;
97
+ padding: 3px 7px;
98
+ border: 0;
99
+ border-radius: var(--radius-sm, 4px);
100
+ background: transparent;
101
+ color: var(--fg-tertiary);
102
+ font: 500 0.6875rem/1 var(--font-sans);
103
+ cursor: pointer;
104
+ }
105
+ .fractal-code-block__copy:hover {
106
+ background: var(--hover-surface);
107
+ color: var(--fg-primary);
108
+ }
109
+ .fractal-code-block__copy:focus-visible {
110
+ outline: 2px solid var(--border-focus);
111
+ outline-offset: 1px;
112
+ }
113
+ .fractal-code-block__copy svg {
114
+ flex: 0 0 auto;
115
+ }
116
+ .fractal-code-block__surface {
117
+ min-width: 0;
118
+ background: var(--bg-canvas);
119
+ }
120
+ .fractal-code-block__surface .cm-editor {
121
+ min-width: 0;
122
+ }
123
+ .fractal-code-block--no-line-numbers .cm-content {
124
+ padding-block: 10px;
125
+ }
126
+ .fractal-code-block__status {
127
+ position: absolute;
128
+ width: 1px;
129
+ height: 1px;
130
+ overflow: hidden;
131
+ clip: rect(0 0 0 0);
132
+ clip-path: inset(50%);
133
+ white-space: nowrap;
134
+ }
135
+ @media (prefers-reduced-motion: reduce) {
136
+ .fractal-code-block,
137
+ .fractal-code-block__copy {
138
+ transition: none;
139
+ }
140
+ }
141
+
142
+ /* src/components/Breadcrumbs/Breadcrumbs.css */
143
+ .fractal-breadcrumbs {
144
+ min-width: 0;
145
+ color: var(--fg-primary);
146
+ font-family: var(--font-sans);
147
+ font-size: 0.875rem;
148
+ line-height: 1.4;
149
+ }
150
+ .fractal-breadcrumbs__list {
151
+ display: flex;
152
+ min-width: 0;
153
+ align-items: center;
154
+ margin: 0;
155
+ padding: 0;
156
+ list-style: none;
157
+ }
158
+ .fractal-breadcrumbs__item {
159
+ display: flex;
160
+ min-width: 0;
161
+ align-items: center;
162
+ gap: var(--space-1);
163
+ }
164
+ .fractal-breadcrumbs__separator {
165
+ display: inline-grid;
166
+ flex: 0 0 auto;
167
+ place-items: center;
168
+ color: var(--fg-tertiary);
169
+ }
170
+ .fractal-breadcrumbs__link,
171
+ .fractal-breadcrumbs__current {
172
+ min-width: 0;
173
+ overflow: hidden;
174
+ text-overflow: ellipsis;
175
+ white-space: nowrap;
176
+ }
177
+ .fractal-breadcrumbs__link {
178
+ color: var(--fg-tertiary);
179
+ font: inherit;
180
+ text-decoration: none;
181
+ transition: color 120ms ease;
182
+ }
183
+ .fractal-breadcrumbs__link:hover {
184
+ color: var(--fg-primary);
185
+ }
186
+ .fractal-breadcrumbs__link:focus-visible {
187
+ border-radius: var(--radius-sm);
188
+ outline: 2px solid var(--border-focus);
189
+ outline-offset: 2px;
190
+ }
191
+ .fractal-breadcrumbs__current {
192
+ color: var(--fg-primary);
193
+ font-weight: 500;
194
+ }
195
+
35
196
  /* src/components/Card/Card.css */
36
197
  .fractal-card {
37
198
  border-radius: var(--radius-lg, 8px);
@@ -369,6 +530,114 @@
369
530
  padding: 0;
370
531
  }
371
532
 
533
+ /* src/components/NumberInput/NumberInput.css */
534
+ .fractal-number-input {
535
+ position: relative;
536
+ width: 100%;
537
+ height: 40px;
538
+ align-self: start;
539
+ }
540
+ .fractal-number-input .fractal-input {
541
+ padding-right: calc(80px + var(--space-3, 12px));
542
+ appearance: textfield;
543
+ }
544
+ .fractal-number-input .fractal-input::-webkit-inner-spin-button,
545
+ .fractal-number-input .fractal-input::-webkit-outer-spin-button {
546
+ margin: 0;
547
+ appearance: none;
548
+ }
549
+ .fractal-number-input-controls {
550
+ position: absolute;
551
+ top: 1px;
552
+ right: 1px;
553
+ bottom: 1px;
554
+ display: flex;
555
+ align-items: stretch;
556
+ overflow: hidden;
557
+ border-radius: 0 calc(var(--radius-sm, 4px) - 1px) calc(var(--radius-sm, 4px) - 1px) 0;
558
+ background: var(--bg-canvas);
559
+ }
560
+ .fractal-number-input-unit {
561
+ position: absolute;
562
+ top: 50%;
563
+ color: var(--fg-secondary);
564
+ font-size: 0.875rem;
565
+ line-height: 1;
566
+ pointer-events: none;
567
+ transform: translateY(-50%);
568
+ user-select: none;
569
+ }
570
+ .fractal-number-input-step {
571
+ display: grid;
572
+ width: 40px;
573
+ place-items: center;
574
+ padding: 0;
575
+ border: 0;
576
+ border-left: 1px solid var(--border-subtle);
577
+ background: transparent;
578
+ color: var(--fg-tertiary);
579
+ cursor: pointer;
580
+ }
581
+ .fractal-number-input-step:hover:not(:disabled) {
582
+ background: var(--bg-surface-1);
583
+ color: var(--fg-primary);
584
+ }
585
+ .fractal-number-input-step:focus-visible {
586
+ position: relative;
587
+ z-index: 1;
588
+ outline: 2px solid var(--border-focus);
589
+ outline-offset: -2px;
590
+ }
591
+ .fractal-number-input-step:disabled {
592
+ color: var(--fg-disabled);
593
+ cursor: not-allowed;
594
+ }
595
+
596
+ /* src/components/PasswordInput/PasswordInput.css */
597
+ .fractal-password-input {
598
+ position: relative;
599
+ width: 100%;
600
+ height: 40px;
601
+ align-self: start;
602
+ }
603
+ .fractal-password-input-field {
604
+ padding-right: calc(40px + var(--space-2, 8px));
605
+ }
606
+ .fractal-password-input-toggle {
607
+ position: absolute;
608
+ top: 4px;
609
+ right: 4px;
610
+ display: grid;
611
+ width: 32px;
612
+ height: 32px;
613
+ place-items: center;
614
+ padding: 0;
615
+ border: 0;
616
+ border-radius: var(--radius-sm, 4px);
617
+ background: transparent;
618
+ color: var(--fg-secondary);
619
+ cursor: pointer;
620
+ transition: background-color 150ms ease, color 150ms ease;
621
+ }
622
+ .fractal-password-input-toggle:hover:not(:disabled) {
623
+ background: var(--hover-canvas, var(--bg-surface-1));
624
+ color: var(--fg-primary);
625
+ }
626
+ .fractal-password-input-toggle:focus-visible {
627
+ outline: 2px solid var(--border-focus);
628
+ outline-offset: -2px;
629
+ }
630
+ .fractal-password-input-toggle:disabled {
631
+ color: var(--fg-disabled);
632
+ cursor: not-allowed;
633
+ opacity: 0.5;
634
+ }
635
+ @media (prefers-reduced-motion: reduce) {
636
+ .fractal-password-input-toggle {
637
+ transition-duration: 0.01ms;
638
+ }
639
+ }
640
+
372
641
  /* src/components/Label/Label.css */
373
642
  .fractal-label {
374
643
  font-size: 0.875rem;
@@ -401,9 +670,11 @@
401
670
  height: 18px;
402
671
  font-size: 0.75rem;
403
672
  font-weight: 600;
404
- border-radius: 50%;
405
673
  margin-top: 1px;
406
674
  }
675
+ .fractal-alert-icon svg {
676
+ display: block;
677
+ }
407
678
  .fractal-alert-content {
408
679
  flex: 1;
409
680
  min-width: 0;
@@ -415,53 +686,49 @@
415
686
  line-height: 1.4;
416
687
  }
417
688
  .fractal-alert-description {
689
+ color: var(--fg-secondary);
418
690
  font-size: 0.875rem;
419
691
  line-height: 1.5;
420
692
  }
421
693
  .fractal-alert--default {
422
694
  background-color: var(--bg-canvas);
423
- border-color: var(--border-default);
695
+ border-color: var(--border-subtle);
424
696
  color: var(--fg-primary);
425
697
  }
426
698
  .fractal-alert--default .fractal-alert-icon {
427
- background: var(--bg-surface-2);
428
699
  color: var(--fg-secondary);
429
700
  }
430
701
  .fractal-alert--info {
431
702
  background-color: var(--accent-surface);
432
- border-color: var(--accent-default);
703
+ border-color: var(--accent-surface-stroke);
433
704
  color: var(--fg-primary);
434
705
  }
435
706
  .fractal-alert--info .fractal-alert-icon {
436
- background: var(--accent-default);
437
- color: var(--fg-inverse);
707
+ color: var(--accent-default);
438
708
  }
439
709
  .fractal-alert--success {
440
710
  background-color: var(--success-surface);
441
- border-color: var(--success-default);
711
+ border-color: var(--success-surface-stroke);
442
712
  color: var(--fg-primary);
443
713
  }
444
714
  .fractal-alert--success .fractal-alert-icon {
445
- background: var(--success-default);
446
- color: var(--fg-inverse);
715
+ color: var(--success-default);
447
716
  }
448
717
  .fractal-alert--warning {
449
718
  background-color: var(--warning-surface);
450
- border-color: var(--warning-default);
719
+ border-color: var(--warning-surface-stroke);
451
720
  color: var(--fg-primary);
452
721
  }
453
722
  .fractal-alert--warning .fractal-alert-icon {
454
- background: var(--warning-default);
455
- color: var(--fg-inverse);
723
+ color: var(--warning-default);
456
724
  }
457
725
  .fractal-alert--error {
458
726
  background-color: var(--error-surface);
459
- border-color: var(--error-default);
727
+ border-color: var(--error-surface-stroke);
460
728
  color: var(--fg-primary);
461
729
  }
462
730
  .fractal-alert--error .fractal-alert-icon {
463
- background: var(--error-default);
464
- color: var(--fg-inverse);
731
+ color: var(--error-default);
465
732
  }
466
733
 
467
734
  /* src/components/Toggle/Toggle.css */
@@ -506,6 +773,60 @@
506
773
  user-select: none;
507
774
  }
508
775
 
776
+ /* src/components/UILoader/UILoader.css */
777
+ .fractal-ui-loader {
778
+ display: inline-flex;
779
+ line-height: 0;
780
+ }
781
+ .fractal-ui-loader svg {
782
+ display: block;
783
+ overflow: visible;
784
+ }
785
+ .fractal-ui-loader__stop-start {
786
+ stop-color: var(--grey-200);
787
+ }
788
+ .fractal-ui-loader__stop-end {
789
+ stop-color: var(--grey-100);
790
+ }
791
+ .fractal-ui-loader--blue .fractal-ui-loader__stop-start {
792
+ stop-color: var(--blue-500);
793
+ }
794
+ .fractal-ui-loader--blue .fractal-ui-loader__stop-end {
795
+ stop-color: var(--blue-300);
796
+ }
797
+ .fractal-ui-loader--green .fractal-ui-loader__stop-start {
798
+ stop-color: var(--green-500);
799
+ }
800
+ .fractal-ui-loader--green .fractal-ui-loader__stop-end {
801
+ stop-color: var(--green-300);
802
+ }
803
+ .fractal-ui-loader__shine-axis {
804
+ transform-box: view-box;
805
+ transform-origin: 0 0;
806
+ }
807
+ .fractal-ui-loader__shine {
808
+ animation: fractal-ui-loader-shine 2500ms var(--ease-in-out) infinite;
809
+ transform-box: view-box;
810
+ transform-origin: 0 0;
811
+ }
812
+ @keyframes fractal-ui-loader-shine {
813
+ 0%, 12% {
814
+ transform: translateX(-120px);
815
+ }
816
+ 48% {
817
+ transform: translateX(120px);
818
+ }
819
+ 49%, 100% {
820
+ transform: translateX(-120px);
821
+ }
822
+ }
823
+ @media (prefers-reduced-motion: reduce) {
824
+ .fractal-ui-loader__shine {
825
+ animation: none;
826
+ transform: translateX(0);
827
+ }
828
+ }
829
+
509
830
  /* src/components/Modal/Modal.css */
510
831
  .fractal-modal-overlay {
511
832
  position: fixed;
@@ -517,11 +838,13 @@
517
838
  z-index: 9998;
518
839
  }
519
840
  .fractal-modal-panel {
841
+ --fractal-modal-panel-padding: var(--space-6, 24px);
842
+ box-sizing: border-box;
520
843
  background: var(--bg-canvas);
521
844
  border: 1px solid var(--border-subtle);
522
845
  border-radius: var(--radius-lg, 8px);
523
846
  box-shadow: var(--shadow-lg);
524
- padding: var(--space-6, 24px);
847
+ padding: var(--fractal-modal-panel-padding);
525
848
  max-width: 90vw;
526
849
  font-family: var(--font-sans);
527
850
  }
@@ -538,6 +861,12 @@
538
861
  display: flex;
539
862
  flex-direction: column;
540
863
  }
864
+ .fractal-modal-panel--scrollable {
865
+ display: flex;
866
+ max-height: calc(100dvh - 2rem);
867
+ flex-direction: column;
868
+ padding-bottom: 0;
869
+ }
541
870
  .fractal-modal-panel--danger {
542
871
  border-color: var(--error-subtle);
543
872
  }
@@ -576,21 +905,52 @@
576
905
  color: var(--fg-primary);
577
906
  background: var(--bg-surface-1);
578
907
  }
908
+ .fractal-modal-close:disabled {
909
+ cursor: not-allowed;
910
+ opacity: 0.4;
911
+ }
912
+ .fractal-modal-close:disabled:hover {
913
+ color: var(--fg-secondary);
914
+ background: none;
915
+ }
579
916
  .fractal-modal-body {
580
917
  font-size: 0.875rem;
581
918
  color: var(--fg-secondary);
582
919
  }
920
+ .fractal-modal-body--loading {
921
+ display: grid;
922
+ min-height: 168px;
923
+ place-items: center;
924
+ }
583
925
  .fractal-modal-body--lg {
584
926
  flex: 1;
585
927
  min-height: 0;
586
928
  overflow: hidden;
587
929
  }
930
+ .fractal-modal-body--scrollable {
931
+ box-sizing: border-box;
932
+ width: calc(100% + var(--fractal-modal-panel-padding) + var(--fractal-modal-panel-padding));
933
+ min-height: 0;
934
+ margin-inline: calc(0px - var(--fractal-modal-panel-padding));
935
+ overflow-y: auto;
936
+ overscroll-behavior: contain;
937
+ padding-inline: var(--fractal-modal-panel-padding);
938
+ }
588
939
  .fractal-modal-footer {
589
940
  display: flex;
590
941
  justify-content: flex-end;
591
942
  gap: var(--space-2, 8px);
592
943
  margin-top: var(--space-4, 16px);
593
944
  }
945
+ .fractal-modal-footer--divided {
946
+ box-sizing: border-box;
947
+ width: calc(100% + var(--fractal-modal-panel-padding) + var(--fractal-modal-panel-padding));
948
+ flex: 0 0 auto;
949
+ margin-top: 0;
950
+ margin-inline: calc(0px - var(--fractal-modal-panel-padding));
951
+ padding: var(--space-4, 16px) var(--fractal-modal-panel-padding);
952
+ border-top: 1px solid var(--border-subtle);
953
+ }
594
954
 
595
955
  /* src/components/DataTable/DataTable.css */
596
956
  .fractal-datatable {
@@ -600,7 +960,7 @@
600
960
  .fractal-datatable-surface {
601
961
  overflow: hidden;
602
962
  border: 1px solid var(--border-subtle);
603
- border-radius: var(--radius-xl, 12px);
963
+ border-radius: var(--radius-md, 6px);
604
964
  background: var(--bg-canvas);
605
965
  }
606
966
  .fractal-datatable-header {
@@ -639,9 +999,6 @@
639
999
  border-bottom: 1px solid var(--border-subtle);
640
1000
  vertical-align: middle;
641
1001
  }
642
- .fractal-datatable-th + .fractal-datatable-th {
643
- border-left: 1px solid var(--border-subtle);
644
- }
645
1002
  .fractal-datatable-row {
646
1003
  background: var(--bg-canvas);
647
1004
  transition: background 120ms ease;
@@ -656,8 +1013,8 @@
656
1013
  vertical-align: top;
657
1014
  overflow-wrap: anywhere;
658
1015
  }
659
- .fractal-datatable-td + .fractal-datatable-td {
660
- border-left: 1px solid var(--border-subtle);
1016
+ .fractal-datatable-td .fractal-dropdown-trigger--icon-only.fractal-dropdown-trigger--tertiary:hover {
1017
+ background: var(--bg-canvas);
661
1018
  }
662
1019
  .fractal-datatable-row + .fractal-datatable-row .fractal-datatable-td {
663
1020
  border-top: 1px solid var(--border-subtle);
@@ -700,6 +1057,16 @@
700
1057
  padding: 4px 8px;
701
1058
  font-size: 0.75rem;
702
1059
  }
1060
+ .fractal-dropdown-trigger--icon-only {
1061
+ width: 32px;
1062
+ height: 32px;
1063
+ justify-content: center;
1064
+ padding: 0;
1065
+ }
1066
+ .fractal-dropdown-trigger--icon-only.fractal-dropdown-trigger--sm {
1067
+ width: 28px;
1068
+ height: 28px;
1069
+ }
703
1070
  .fractal-dropdown-trigger--tertiary {
704
1071
  border-color: transparent;
705
1072
  background: transparent;
@@ -708,6 +1075,17 @@
708
1075
  .fractal-dropdown-trigger--tertiary:hover {
709
1076
  background: var(--bg-surface-1);
710
1077
  }
1078
+ .fractal-dropdown-trigger:disabled,
1079
+ .fractal-dropdown-trigger:disabled:hover {
1080
+ color: var(--fg-disabled);
1081
+ cursor: not-allowed;
1082
+ background: var(--bg-surface-1);
1083
+ }
1084
+ .fractal-dropdown-trigger:disabled .fractal-dropdown-selected-text,
1085
+ .fractal-dropdown-trigger:disabled .fractal-dropdown-chevron,
1086
+ .fractal-dropdown-trigger:disabled .fractal-dropdown-icon {
1087
+ color: var(--fg-disabled);
1088
+ }
711
1089
  .fractal-dropdown-trigger:focus-visible {
712
1090
  outline: none;
713
1091
  box-shadow: 0 0 0 2px var(--bg-canvas), 0 0 0 4px var(--border-focus);
@@ -731,12 +1109,15 @@
731
1109
  .fractal-dropdown-chevron {
732
1110
  display: flex;
733
1111
  flex-shrink: 0;
1112
+ margin-left: auto;
734
1113
  color: var(--fg-secondary);
735
1114
  }
736
1115
  .fractal-dropdown-panel {
737
1116
  position: absolute;
738
1117
  z-index: 999999;
1118
+ min-width: 100%;
739
1119
  overflow: hidden;
1120
+ box-sizing: border-box;
740
1121
  border-radius: var(--radius-md, 6px);
741
1122
  border: 1px solid var(--border-subtle);
742
1123
  background: var(--bg-canvas);
@@ -755,6 +1136,7 @@
755
1136
  .fractal-dropdown-option {
756
1137
  display: flex;
757
1138
  width: 100%;
1139
+ box-sizing: border-box;
758
1140
  align-items: center;
759
1141
  gap: 8px;
760
1142
  padding: 6px 8px;
@@ -778,7 +1160,7 @@
778
1160
  }
779
1161
  .fractal-dropdown-option:hover,
780
1162
  .fractal-dropdown-option:focus-visible {
781
- background: var(--hover-canvas, var(--bg-surface-2));
1163
+ background: var(--hover-surface, var(--bg-surface-2));
782
1164
  outline: none;
783
1165
  }
784
1166
  .fractal-dropdown-separator {
@@ -874,17 +1256,59 @@
874
1256
  color: var(--accent-default);
875
1257
  }
876
1258
 
877
- /* src/components/SortableTable/SortableTable.css */
878
- .fractal-sortable-table {
879
- font-family: var(--font-sans);
880
- font-size: 0.875rem;
881
- }
1259
+ /* src/components/Checkbox/Checkbox.css */
1260
+ .fractal-checkbox {
1261
+ display: grid;
1262
+ width: 28px;
1263
+ height: 28px;
1264
+ place-items: center;
1265
+ padding: 0;
1266
+ border: 0;
1267
+ border-radius: var(--radius-sm);
1268
+ background: transparent;
1269
+ color: var(--fg-secondary);
1270
+ cursor: pointer;
1271
+ }
1272
+ .fractal-checkbox:hover:not(:disabled) {
1273
+ background: var(--hover-canvas);
1274
+ color: var(--fg-primary);
1275
+ }
1276
+ .fractal-checkbox--checked {
1277
+ color: var(--fg-primary);
1278
+ }
1279
+ .fractal-checkbox__indeterminate-icon {
1280
+ position: relative;
1281
+ display: grid;
1282
+ place-items: center;
1283
+ }
1284
+ .fractal-checkbox__indeterminate-mark {
1285
+ position: absolute;
1286
+ }
1287
+ .fractal-checkbox:focus-visible {
1288
+ outline: 2px solid var(--border-focus);
1289
+ outline-offset: 2px;
1290
+ }
1291
+ .fractal-checkbox:disabled {
1292
+ cursor: not-allowed;
1293
+ color: var(--fg-disabled);
1294
+ }
1295
+
1296
+ /* src/components/SortableTable/SortableTable.css */
1297
+ .fractal-sortable-table {
1298
+ font-family: var(--font-sans);
1299
+ font-size: 0.875rem;
1300
+ }
882
1301
  .fractal-sortable-table-surface {
883
1302
  overflow: hidden;
884
1303
  border: 1px solid var(--border-subtle);
885
- border-radius: var(--radius-xl, 12px);
1304
+ border-radius: var(--radius-md, 6px);
886
1305
  background: var(--bg-canvas);
887
1306
  }
1307
+ .fractal-sortable-table--embedded .fractal-sortable-table-surface {
1308
+ border: 0;
1309
+ border-top: 1px solid var(--border-subtle);
1310
+ border-radius: 0;
1311
+ }
888
1312
  .fractal-sortable-table-header {
889
1313
  display: flex;
890
1314
  align-items: center;
@@ -922,9 +1346,6 @@
922
1346
  vertical-align: middle;
923
1347
  white-space: nowrap;
924
1348
  }
925
- .fractal-sortable-table-th + .fractal-sortable-table-th {
926
- border-left: 1px solid var(--border-subtle);
927
- }
928
1349
  .fractal-sortable-table-th--sortable {
929
1350
  padding: 0;
930
1351
  }
@@ -980,6 +1401,47 @@
980
1401
  .fractal-sortable-table-row--interactive {
981
1402
  cursor: pointer;
982
1403
  }
1404
+ .fractal-sortable-table-td--row-action {
1405
+ position: relative;
1406
+ }
1407
+ .fractal-sortable-table-td .fractal-dropdown-trigger--icon-only.fractal-dropdown-trigger--tertiary:hover {
1408
+ background: var(--bg-canvas);
1409
+ }
1410
+ .fractal-sortable-table-row-action {
1411
+ position: absolute;
1412
+ z-index: 1;
1413
+ top: 0;
1414
+ right: -1px;
1415
+ bottom: 0;
1416
+ display: flex;
1417
+ width: min(280px, calc(200% + 32px));
1418
+ align-items: center;
1419
+ justify-content: flex-end;
1420
+ padding-right: var(--space-4);
1421
+ background:
1422
+ linear-gradient(
1423
+ 90deg,
1424
+ transparent 0%,
1425
+ color-mix(in srgb, var(--hover-surface) 72%, transparent) 52%,
1426
+ var(--hover-surface) 100%);
1427
+ opacity: 0;
1428
+ pointer-events: none;
1429
+ transition: opacity 150ms ease-out;
1430
+ }
1431
+ .fractal-sortable-table-row--interactive:hover .fractal-sortable-table-row-action,
1432
+ .fractal-sortable-table-row--interactive:focus-visible .fractal-sortable-table-row-action {
1433
+ opacity: 1;
1434
+ }
1435
+ .fractal-sortable-table-row-action__icon {
1436
+ display: grid;
1437
+ width: 32px;
1438
+ height: 32px;
1439
+ place-items: center;
1440
+ border: 1px solid var(--border-default);
1441
+ border-radius: var(--radius-full);
1442
+ background: var(--bg-canvas);
1443
+ color: var(--fg-primary);
1444
+ }
983
1445
  .fractal-sortable-table-row--interactive:focus-visible {
984
1446
  position: relative;
985
1447
  z-index: 1;
@@ -1002,17 +1464,14 @@
1002
1464
  vertical-align: top;
1003
1465
  overflow-wrap: anywhere;
1004
1466
  }
1005
- .fractal-sortable-table-td + .fractal-sortable-table-td {
1006
- border-left: 1px solid var(--border-subtle);
1007
- }
1008
- .fractal-sortable-table--sm .fractal-sortable-table-th,
1467
+ .fractal-sortable-table--sm .fractal-sortable-table-th:not(.fractal-sortable-table-th--sortable),
1009
1468
  .fractal-sortable-table--sm .fractal-sortable-table-sort-button {
1010
1469
  padding: 8px 12px;
1011
1470
  }
1012
1471
  .fractal-sortable-table--sm .fractal-sortable-table-td {
1013
1472
  padding: 10px 12px;
1014
1473
  }
1015
- .fractal-sortable-table--lg .fractal-sortable-table-th,
1474
+ .fractal-sortable-table--lg .fractal-sortable-table-th:not(.fractal-sortable-table-th--sortable),
1016
1475
  .fractal-sortable-table--lg .fractal-sortable-table-sort-button {
1017
1476
  padding: 18px 24px;
1018
1477
  }
@@ -1026,17 +1485,60 @@
1026
1485
  font-size: 0.875rem;
1027
1486
  }
1028
1487
  .fractal-tabs-list {
1488
+ position: relative;
1029
1489
  display: flex;
1030
1490
  gap: 24px;
1491
+ margin-bottom: var(--space-6);
1492
+ }
1493
+ .fractal-tabs--divider > .fractal-tabs-list {
1031
1494
  border-bottom: 1px solid var(--border-subtle);
1032
- margin-bottom: 16px;
1495
+ }
1496
+ .fractal-tabs--surface > .fractal-tabs-list {
1497
+ width: 100%;
1498
+ gap: 0;
1499
+ margin-bottom: 0;
1500
+ background: var(--bg-surface-1);
1501
+ }
1502
+ .fractal-tabs--surface > .fractal-tabs-list::before {
1503
+ position: absolute;
1504
+ z-index: 3;
1505
+ right: 0;
1506
+ bottom: 0;
1507
+ left: 0;
1508
+ height: 1px;
1509
+ background: var(--border-subtle);
1510
+ content: "";
1511
+ pointer-events: none;
1512
+ }
1513
+ .fractal-tabs-list::after {
1514
+ position: absolute;
1515
+ bottom: -1px;
1516
+ left: 0;
1517
+ width: var(--fractal-tabs-indicator-width, 0px);
1518
+ height: 2px;
1519
+ background: var(--accent-default);
1520
+ content: "";
1521
+ opacity: 0;
1522
+ transform: translateX(var(--fractal-tabs-indicator-offset, 0px));
1523
+ transition:
1524
+ transform 180ms var(--ease-standard, ease),
1525
+ width 180ms var(--ease-standard, ease),
1526
+ opacity 100ms ease;
1527
+ }
1528
+ .fractal-tabs-list[data-indicator-ready=true]::after {
1529
+ opacity: 1;
1530
+ }
1531
+ .fractal-tabs--surface > .fractal-tabs-list::after {
1532
+ display: none;
1033
1533
  }
1034
1534
  .fractal-tabs-trigger {
1035
1535
  position: relative;
1036
1536
  display: inline-flex;
1537
+ min-width: 88px;
1037
1538
  align-items: center;
1539
+ justify-content: center;
1038
1540
  gap: 6px;
1039
- padding: 10px 0;
1541
+ padding: 10px 1rem;
1040
1542
  background: none;
1041
1543
  border: 0;
1042
1544
  font: inherit;
@@ -1044,8 +1546,7 @@
1044
1546
  font-weight: 400;
1045
1547
  color: var(--fg-secondary);
1046
1548
  cursor: pointer;
1047
- transition: color 0.15s ease, box-shadow 0.15s ease;
1048
- box-shadow: inset 0 -1px 0 transparent;
1549
+ transition: color 0.15s ease;
1049
1550
  margin-bottom: -1px;
1050
1551
  }
1051
1552
  .fractal-tabs-trigger:hover:not(.fractal-tabs-trigger--active):not(.fractal-tabs-trigger--disabled) {
@@ -1059,7 +1560,21 @@
1059
1560
  .fractal-tabs-trigger--active {
1060
1561
  color: var(--accent-default);
1061
1562
  font-weight: 500;
1062
- box-shadow: inset 0 -1px 0 var(--accent-default);
1563
+ }
1564
+ .fractal-tabs:not(.fractal-tabs--divider):not(.fractal-tabs--surface) > .fractal-tabs-list > .fractal-tabs-trigger:not(.fractal-tabs-trigger--active) {
1565
+ box-shadow: inset 0 -1px 0 var(--border-subtle);
1566
+ }
1567
+ .fractal-tabs--surface > .fractal-tabs-list > .fractal-tabs-trigger {
1568
+ margin-bottom: 0;
1569
+ border-right: 1px solid var(--border-subtle);
1570
+ background: var(--bg-surface-1);
1571
+ }
1572
+ .fractal-tabs--surface > .fractal-tabs-list > .fractal-tabs-trigger:hover:not(.fractal-tabs-trigger--active):not(.fractal-tabs-trigger--disabled) {
1573
+ background: var(--hover-surface);
1574
+ }
1575
+ .fractal-tabs--surface > .fractal-tabs-list > .fractal-tabs-trigger--active {
1576
+ background: var(--bg-canvas);
1577
+ color: var(--fg-primary);
1063
1578
  }
1064
1579
  .fractal-tabs-trigger--disabled {
1065
1580
  color: var(--fg-disabled, var(--fg-secondary));
@@ -1073,6 +1588,94 @@
1073
1588
  .fractal-tabs-panel[hidden] {
1074
1589
  display: none;
1075
1590
  }
1591
+ @media (prefers-reduced-motion: reduce) {
1592
+ .fractal-tabs-list::after {
1593
+ transition: none;
1594
+ }
1595
+ }
1596
+
1597
+ /* src/components/ContentSwitcher/ContentSwitcher.css */
1598
+ .fractal-content-switcher {
1599
+ position: relative;
1600
+ display: inline-flex;
1601
+ gap: 2px;
1602
+ padding: 2px;
1603
+ border: 1px solid color-mix(in srgb, var(--border-subtle) 55%, transparent);
1604
+ border-radius: var(--radius-md);
1605
+ background: var(--bg-surface-subtle);
1606
+ font-family: var(--font-sans);
1607
+ }
1608
+ .fractal-content-switcher__indicator {
1609
+ position: absolute;
1610
+ top: 0;
1611
+ left: 0;
1612
+ width: var(--fractal-content-switcher-indicator-width, 0);
1613
+ height: var(--fractal-content-switcher-indicator-height, 0);
1614
+ border-radius: var(--radius-sm);
1615
+ background: var(--bg-canvas);
1616
+ box-shadow: var(--shadow-sm);
1617
+ opacity: 0;
1618
+ pointer-events: none;
1619
+ transform: translate3d(var(--fractal-content-switcher-indicator-x, 0), var(--fractal-content-switcher-indicator-y, 0), 0);
1620
+ }
1621
+ .fractal-content-switcher[data-indicator-ready=true] .fractal-content-switcher__indicator {
1622
+ opacity: 1;
1623
+ }
1624
+ .fractal-content-switcher[data-indicator-ready=true][data-indicator-animate=true] .fractal-content-switcher__indicator {
1625
+ transition:
1626
+ transform var(--duration-normal) var(--ease-in-out),
1627
+ width var(--duration-normal) var(--ease-in-out),
1628
+ height var(--duration-normal) var(--ease-in-out),
1629
+ opacity var(--duration-fast) var(--ease-out);
1630
+ }
1631
+ .fractal-content-switcher--full-width {
1632
+ display: flex;
1633
+ width: 100%;
1634
+ }
1635
+ .fractal-content-switcher__item {
1636
+ position: relative;
1637
+ z-index: 1;
1638
+ min-width: 128px;
1639
+ min-height: 40px;
1640
+ padding: 0 var(--space-4);
1641
+ border: 0;
1642
+ border-radius: var(--radius-sm);
1643
+ background: transparent;
1644
+ color: var(--fg-secondary);
1645
+ cursor: pointer;
1646
+ font: inherit;
1647
+ font-size: 0.875rem;
1648
+ line-height: 1.25;
1649
+ text-align: center;
1650
+ transition: background-color var(--duration-fast) var(--ease-out), color var(--duration-fast) var(--ease-out);
1651
+ }
1652
+ .fractal-content-switcher--full-width .fractal-content-switcher__item {
1653
+ flex: 1;
1654
+ }
1655
+ .fractal-content-switcher__item:hover:not(:disabled):not(.fractal-content-switcher__item--active) {
1656
+ background: var(--hover-surface);
1657
+ color: var(--fg-primary);
1658
+ }
1659
+ .fractal-content-switcher__item--active {
1660
+ background: transparent;
1661
+ color: var(--fg-primary);
1662
+ }
1663
+ .fractal-content-switcher__item:focus-visible {
1664
+ position: relative;
1665
+ z-index: 1;
1666
+ outline: 2px solid var(--border-focus);
1667
+ outline-offset: -2px;
1668
+ }
1669
+ .fractal-content-switcher__item:disabled {
1670
+ cursor: not-allowed;
1671
+ color: var(--fg-disabled);
1672
+ opacity: 0.5;
1673
+ }
1674
+ @media (prefers-reduced-motion: reduce) {
1675
+ .fractal-content-switcher[data-indicator-ready=true][data-indicator-animate=true] .fractal-content-switcher__indicator {
1676
+ transition: none;
1677
+ }
1678
+ }
1076
1679
 
1077
1680
  /* src/components/Disclosure/Disclosure.css */
1078
1681
  .fractal-disclosure {
@@ -1104,6 +1707,17 @@
1104
1707
  .fractal-disclosure-trigger:hover {
1105
1708
  background: var(--bg-surface-1);
1106
1709
  }
1710
+ .fractal-disclosure--disabled .fractal-disclosure-trigger {
1711
+ color: var(--fg-tertiary);
1712
+ cursor: not-allowed;
1713
+ }
1714
+ .fractal-disclosure--disabled .fractal-disclosure-trigger:hover {
1715
+ background: transparent;
1716
+ }
1717
+ .fractal-disclosure--disabled .fractal-disclosure-icon,
1718
+ .fractal-disclosure--disabled .fractal-disclosure-meta {
1719
+ color: var(--fg-tertiary);
1720
+ }
1107
1721
  .fractal-disclosure-trigger:focus-visible {
1108
1722
  outline: 2px solid var(--border-focus);
1109
1723
  outline-offset: -2px;
@@ -1130,25 +1744,391 @@
1130
1744
  .fractal-disclosure-panel[hidden] {
1131
1745
  display: none;
1132
1746
  }
1133
- .fractal-disclosure-panel-inner {
1134
- padding: 16px;
1135
- color: var(--fg-primary);
1136
- font-size: 0.875rem;
1137
- line-height: 1.55;
1747
+ .fractal-disclosure-panel-inner {
1748
+ padding: 16px;
1749
+ color: var(--fg-primary);
1750
+ font-size: 0.875rem;
1751
+ line-height: 1.55;
1752
+ }
1753
+ .fractal-disclosure:not(.fractal-disclosure--card) .fractal-disclosure-trigger {
1754
+ padding: 8px 0;
1755
+ }
1756
+ .fractal-disclosure:not(.fractal-disclosure--card).fractal-disclosure--open .fractal-disclosure-trigger {
1757
+ border-bottom: 0;
1758
+ }
1759
+ .fractal-disclosure:not(.fractal-disclosure--card) .fractal-disclosure-panel-inner {
1760
+ padding: 4px 0 12px 24px;
1761
+ }
1762
+
1763
+ /* src/components/LatticeLoader/LatticeLoader.css */
1764
+ .fractal-lattice-loader {
1765
+ display: flex;
1766
+ align-items: center;
1767
+ gap: 6px;
1768
+ width: 100%;
1769
+ height: 12px;
1770
+ overflow: hidden;
1771
+ color: var(--fg-secondary);
1772
+ }
1773
+ .fractal-lattice-loader__cell {
1774
+ position: relative;
1775
+ width: 12px;
1776
+ flex: 0 0 12px;
1777
+ aspect-ratio: 1;
1778
+ background: currentColor;
1779
+ -webkit-mask: url("./lattice-FAYE5KWW.svg") center / contain no-repeat;
1780
+ mask: url("./lattice-FAYE5KWW.svg") center / contain no-repeat;
1781
+ opacity: 0.08;
1782
+ animation: fractal-lattice-wave 3.2s ease-in-out infinite;
1783
+ animation-delay: calc((var(--fractal-lattice-index) * 40ms) - 3.2s);
1784
+ }
1785
+ @keyframes fractal-lattice-wave {
1786
+ 0%, 58%, 100% {
1787
+ opacity: 0.08;
1788
+ }
1789
+ 18% {
1790
+ opacity: 0.28;
1791
+ }
1792
+ 30% {
1793
+ opacity: 1;
1794
+ }
1795
+ 42% {
1796
+ opacity: 0.28;
1797
+ }
1798
+ }
1799
+ @media (prefers-reduced-motion: reduce) {
1800
+ .fractal-lattice-loader__cell {
1801
+ opacity: 0.35;
1802
+ animation: none;
1803
+ }
1804
+ }
1805
+
1806
+ /* src/components/Ghost/Ghost.css */
1807
+ .fractal-ghost {
1808
+ --fractal-ghost-base: var(--bg-surface-1);
1809
+ --fractal-ghost-shine: color-mix(in srgb, var(--bg-canvas) 82%, transparent);
1810
+ display: block;
1811
+ min-width: 0;
1812
+ min-height: 1px;
1813
+ background:
1814
+ linear-gradient(
1815
+ 105deg,
1816
+ var(--fractal-ghost-base) 20%,
1817
+ var(--fractal-ghost-shine) 44%,
1818
+ var(--fractal-ghost-base) 68%);
1819
+ background-size: 220% 100%;
1820
+ border-radius: var(--radius-sm);
1821
+ animation: fractal-ghost-shine var(--duration-ambient) var(--ease-in-out) infinite;
1822
+ }
1823
+ .fractal-ghost-line {
1824
+ height: 0.875rem;
1825
+ }
1826
+ .fractal-ghost-line--sm {
1827
+ height: 0.6875rem;
1828
+ }
1829
+ .fractal-ghost-line--lg {
1830
+ height: 1.125rem;
1831
+ }
1832
+ .fractal-ghost-stack {
1833
+ display: grid;
1834
+ gap: var(--space-2);
1835
+ }
1836
+ .fractal-ghost-button {
1837
+ border-radius: var(--radius-full);
1838
+ }
1839
+ .fractal-ghost-button--xs {
1840
+ width: 72px;
1841
+ height: 28px;
1842
+ }
1843
+ .fractal-ghost-button--sm {
1844
+ width: 84px;
1845
+ height: 32px;
1846
+ }
1847
+ .fractal-ghost-button--md {
1848
+ width: 96px;
1849
+ height: 40px;
1850
+ }
1851
+ .fractal-ghost-button--lg {
1852
+ width: 108px;
1853
+ height: 44px;
1854
+ }
1855
+ .fractal-ghost-button--xl {
1856
+ width: 128px;
1857
+ height: 56px;
1858
+ }
1859
+ .fractal-ghost-button--icon-only {
1860
+ width: var(--fractal-ghost-icon-size, 40px);
1861
+ }
1862
+ .fractal-ghost-button--xs.fractal-ghost-button--icon-only {
1863
+ --fractal-ghost-icon-size: 28px;
1864
+ }
1865
+ .fractal-ghost-button--sm.fractal-ghost-button--icon-only {
1866
+ --fractal-ghost-icon-size: 32px;
1867
+ }
1868
+ .fractal-ghost-button--lg.fractal-ghost-button--icon-only {
1869
+ --fractal-ghost-icon-size: 44px;
1870
+ }
1871
+ .fractal-ghost-button--xl.fractal-ghost-button--icon-only {
1872
+ --fractal-ghost-icon-size: 56px;
1873
+ }
1874
+ .fractal-ghost-card {
1875
+ display: grid;
1876
+ gap: var(--space-4);
1877
+ padding: var(--space-5);
1878
+ border: 1px solid var(--border-subtle);
1879
+ border-radius: var(--radius-md);
1880
+ background: var(--bg-canvas);
1881
+ }
1882
+ .fractal-ghost-table {
1883
+ overflow: hidden;
1884
+ border: 1px solid var(--border-subtle);
1885
+ border-radius: var(--radius-md);
1886
+ background: var(--bg-canvas);
1887
+ }
1888
+ .fractal-ghost-table__table {
1889
+ width: 100%;
1890
+ border-collapse: separate;
1891
+ border-spacing: 0;
1892
+ }
1893
+ .fractal-ghost-table__head-row {
1894
+ background: var(--bg-surface-1);
1895
+ }
1896
+ .fractal-ghost-table th {
1897
+ padding: 12px 16px;
1898
+ border-bottom: 1px solid var(--border-subtle);
1899
+ color: var(--fg-secondary);
1900
+ font-size: 0.75rem;
1901
+ font-weight: 500;
1902
+ text-align: left;
1903
+ }
1904
+ .fractal-ghost-table td {
1905
+ padding: 14px 16px;
1906
+ }
1907
+ .fractal-ghost-table__row + .fractal-ghost-table__row td {
1908
+ border-top: 1px solid var(--border-subtle);
1909
+ }
1910
+ .fractal-ghost-table--sm th {
1911
+ padding: 8px 12px;
1912
+ }
1913
+ .fractal-ghost-table--sm td {
1914
+ padding: 10px 12px;
1915
+ }
1916
+ .fractal-ghost-table--lg th {
1917
+ padding: 18px 24px;
1918
+ }
1919
+ .fractal-ghost-table--lg td {
1920
+ padding: 22px 24px;
1921
+ }
1922
+ .fractal-ghost-field {
1923
+ display: grid;
1924
+ gap: var(--space-2);
1925
+ }
1926
+ .fractal-ghost-field__control {
1927
+ width: 100%;
1928
+ height: 40px;
1929
+ border: 1px solid var(--border-subtle);
1930
+ border-radius: var(--radius-md);
1931
+ }
1932
+ .fractal-ghost-field__control--multiline {
1933
+ height: 112px;
1934
+ }
1935
+ .fractal-ghost-label {
1936
+ border-radius: var(--radius-sm);
1937
+ }
1938
+ .fractal-ghost-alert {
1939
+ display: grid;
1940
+ gap: var(--space-2);
1941
+ padding: var(--space-4);
1942
+ border: 1px solid var(--border-subtle);
1943
+ border-radius: var(--radius-md);
1944
+ }
1945
+ .fractal-ghost-choice {
1946
+ display: flex;
1947
+ align-items: center;
1948
+ gap: var(--space-2);
1949
+ }
1950
+ .fractal-ghost-choice__control {
1951
+ width: 16px;
1952
+ height: 16px;
1953
+ border-radius: var(--radius-sm);
1954
+ }
1955
+ .fractal-ghost-chip {
1956
+ border-radius: var(--radius-full);
1957
+ }
1958
+ .fractal-ghost-link {
1959
+ display: inline-block;
1960
+ }
1961
+ .fractal-ghost-dropdown {
1962
+ display: flex;
1963
+ align-items: center;
1964
+ justify-content: space-between;
1965
+ width: 220px;
1966
+ height: 40px;
1967
+ padding: 0 var(--space-3);
1968
+ border: 1px solid var(--border-subtle);
1969
+ border-radius: var(--radius-md);
1970
+ }
1971
+ .fractal-ghost-dropdown__chevron {
1972
+ width: 14px;
1973
+ height: 14px;
1974
+ border-radius: var(--radius-full);
1975
+ }
1976
+ .fractal-ghost-switcher {
1977
+ display: flex;
1978
+ width: fit-content;
1979
+ gap: 2px;
1980
+ padding: 3px;
1981
+ border-radius: var(--radius-md);
1982
+ background: var(--bg-surface-1);
1983
+ }
1984
+ .fractal-ghost-switcher > .fractal-ghost {
1985
+ width: 76px;
1986
+ height: 32px;
1987
+ border-radius: calc(var(--radius-md) - 2px);
1988
+ }
1989
+ .fractal-ghost-disclosure {
1990
+ display: flex;
1991
+ align-items: center;
1992
+ gap: var(--space-3);
1993
+ padding: var(--space-3) 0;
1994
+ border-bottom: 1px solid var(--border-subtle);
1995
+ }
1996
+ .fractal-ghost-disclosure__icon {
1997
+ width: 16px;
1998
+ height: 16px;
1999
+ border-radius: var(--radius-full);
2000
+ }
2001
+ .fractal-ghost-pagination {
2002
+ display: flex;
2003
+ gap: var(--space-2);
2004
+ }
2005
+ .fractal-ghost-pagination > .fractal-ghost {
2006
+ width: 32px;
2007
+ height: 32px;
2008
+ border-radius: var(--radius-md);
2009
+ }
2010
+ .fractal-ghost-dropzone {
2011
+ display: grid;
2012
+ place-items: center;
2013
+ gap: var(--space-3);
2014
+ min-height: 184px;
2015
+ padding: var(--space-6);
2016
+ border: 1px dashed var(--border-default);
2017
+ border-radius: var(--radius-md);
2018
+ }
2019
+ .fractal-ghost-dropzone__icon {
2020
+ width: 32px;
2021
+ height: 32px;
2022
+ border-radius: var(--radius-full);
2023
+ }
2024
+ .fractal-ghost-prompt-card {
2025
+ min-height: 176px;
2026
+ }
2027
+ .fractal-ghost-conversation {
2028
+ display: flex;
2029
+ width: 100%;
2030
+ min-width: 0;
2031
+ flex-direction: column;
2032
+ gap: var(--space-6);
2033
+ }
2034
+ .fractal-ghost-conversation__message {
2035
+ display: grid;
2036
+ width: min(92%, 42rem);
2037
+ min-width: 0;
2038
+ gap: var(--space-2);
2039
+ }
2040
+ .fractal-ghost-conversation__message--user {
2041
+ width: min(78%, 36rem);
2042
+ align-self: flex-end;
2043
+ }
2044
+ .fractal-ghost-conversation__bubble {
2045
+ --fractal-ghost-base: color-mix(in srgb, var(--accent-text) 12%, transparent);
2046
+ --fractal-ghost-shine: color-mix(in srgb, var(--accent-text) 5%, transparent);
2047
+ display: grid;
2048
+ gap: var(--space-2);
2049
+ padding: var(--space-4);
2050
+ border: 1px solid var(--accent-surface-stroke);
2051
+ border-radius: 12px 12px 4px;
2052
+ background: var(--accent-surface-stroke);
2053
+ }
2054
+ .fractal-ghost-sidebar {
2055
+ display: grid;
2056
+ align-content: start;
2057
+ gap: var(--space-7);
2058
+ width: 248px;
2059
+ min-height: 100%;
2060
+ padding: var(--space-5);
2061
+ border-right: 1px solid var(--border-subtle);
2062
+ background: var(--bg-canvas);
2063
+ }
2064
+ .fractal-ghost-sidebar__brand {
2065
+ width: 112px;
2066
+ height: 24px;
2067
+ }
2068
+ .fractal-ghost-sidebar__items {
2069
+ display: grid;
2070
+ gap: var(--space-2);
2071
+ }
2072
+ .fractal-ghost-sidebar__item {
2073
+ display: flex;
2074
+ align-items: center;
2075
+ gap: var(--space-3);
2076
+ height: 36px;
2077
+ padding: 0 var(--space-2);
2078
+ }
2079
+ .fractal-ghost-sidebar__item > .fractal-ghost {
2080
+ width: 16px;
2081
+ height: 16px;
2082
+ border-radius: var(--radius-sm);
2083
+ }
2084
+ .fractal-ghost-surface {
2085
+ display: grid;
2086
+ gap: var(--space-5);
2087
+ padding: var(--space-6);
2088
+ border: 1px solid var(--border-subtle);
2089
+ border-radius: var(--radius-lg);
2090
+ background: var(--bg-canvas);
2091
+ }
2092
+ .fractal-ghost-modal {
2093
+ width: min(100%, 420px);
2094
+ }
2095
+ .fractal-ghost-side-panel {
2096
+ width: min(100%, 540px);
2097
+ min-height: 480px;
2098
+ }
2099
+ .fractal-ghost-surface__header {
2100
+ display: flex;
2101
+ align-items: center;
2102
+ justify-content: space-between;
2103
+ }
2104
+ .fractal-ghost-surface__close {
2105
+ width: 28px;
2106
+ height: 28px;
2107
+ border-radius: var(--radius-md);
1138
2108
  }
1139
- .fractal-disclosure:not(.fractal-disclosure--card) .fractal-disclosure-trigger {
1140
- padding: 8px 0;
2109
+ .fractal-ghost-surface__title {
2110
+ color: var(--fg-secondary);
2111
+ font-size: 0.75rem;
1141
2112
  }
1142
- .fractal-disclosure:not(.fractal-disclosure--card).fractal-disclosure--open .fractal-disclosure-trigger {
1143
- border-bottom: 0;
2113
+ @keyframes fractal-ghost-shine {
2114
+ from {
2115
+ background-position: 110% 0;
2116
+ }
2117
+ to {
2118
+ background-position: -110% 0;
2119
+ }
1144
2120
  }
1145
- .fractal-disclosure:not(.fractal-disclosure--card) .fractal-disclosure-panel-inner {
1146
- padding: 4px 0 12px 24px;
2121
+ @media (prefers-reduced-motion: reduce) {
2122
+ .fractal-ghost {
2123
+ animation: none;
2124
+ background: var(--fractal-ghost-base);
2125
+ }
1147
2126
  }
1148
2127
 
1149
2128
  /* src/components/Sidebar/Sidebar.css */
1150
2129
  .fractal-sidebar {
1151
2130
  --fractal-sidebar-width: 232px;
2131
+ --fractal-sidebar-compact-width: 56px;
1152
2132
  box-sizing: border-box;
1153
2133
  display: flex;
1154
2134
  width: var(--fractal-sidebar-width);
@@ -1160,11 +2140,27 @@
1160
2140
  color: var(--fg-primary);
1161
2141
  font-family: var(--font-sans);
1162
2142
  }
2143
+ .fractal-sidebar[data-compact] {
2144
+ z-index: 10;
2145
+ width: var(--fractal-sidebar-compact-width);
2146
+ min-width: var(--fractal-sidebar-compact-width);
2147
+ overflow: hidden;
2148
+ transition:
2149
+ width var(--duration-normal) var(--ease-out),
2150
+ min-width var(--duration-normal) var(--ease-out),
2151
+ box-shadow var(--duration-normal) var(--ease-out);
2152
+ }
2153
+ .fractal-sidebar[data-compact]:hover,
2154
+ .fractal-sidebar[data-compact]:focus-within {
2155
+ width: var(--fractal-sidebar-width);
2156
+ min-width: var(--fractal-sidebar-width);
2157
+ box-shadow: var(--shadow-md);
2158
+ }
1163
2159
  .fractal-sidebar__header {
1164
2160
  display: flex;
1165
2161
  min-height: 48px;
1166
2162
  align-items: center;
1167
- padding: 0 var(--space-4);
2163
+ padding: var(--space-2);
1168
2164
  border-bottom: 1px solid var(--border-subtle);
1169
2165
  }
1170
2166
  .fractal-sidebar__brand {
@@ -1189,10 +2185,55 @@
1189
2185
  transform: scale(0.98);
1190
2186
  }
1191
2187
  .fractal-sidebar__brand:focus-visible,
1192
- .fractal-sidebar__nav-item:focus-visible {
2188
+ .fractal-sidebar__nav-item:focus-visible,
2189
+ .fractal-sidebar__account-trigger:focus-visible {
1193
2190
  outline: 2px solid var(--border-focus);
1194
2191
  outline-offset: 2px;
1195
2192
  }
2193
+ .fractal-sidebar__account {
2194
+ display: block;
2195
+ width: 100%;
2196
+ }
2197
+ .fractal-sidebar__account-trigger {
2198
+ width: 100%;
2199
+ min-height: 36px;
2200
+ box-sizing: border-box;
2201
+ gap: var(--space-2);
2202
+ padding: 8px 10px;
2203
+ border: 0;
2204
+ background: transparent;
2205
+ border-radius: var(--radius-md);
2206
+ color: var(--fg-primary);
2207
+ font-weight: 500;
2208
+ }
2209
+ .fractal-sidebar__account-trigger:hover,
2210
+ .fractal-sidebar__account-trigger.fractal-dropdown-trigger--tertiary:hover {
2211
+ background: var(--nav-hover);
2212
+ }
2213
+ .fractal-sidebar__account-name {
2214
+ min-width: 0;
2215
+ flex: 1;
2216
+ overflow: hidden;
2217
+ text-overflow: ellipsis;
2218
+ white-space: nowrap;
2219
+ }
2220
+ .fractal-sidebar__account-icon {
2221
+ display: inline-flex;
2222
+ width: 18px;
2223
+ height: 18px;
2224
+ flex: 0 0 18px;
2225
+ align-items: center;
2226
+ justify-content: center;
2227
+ }
2228
+ .fractal-sidebar__account-icon > img,
2229
+ .fractal-sidebar__account-icon > svg {
2230
+ display: block;
2231
+ width: 18px;
2232
+ height: 18px;
2233
+ }
2234
+ .fractal-sidebar__account-panel {
2235
+ min-width: 100%;
2236
+ }
1196
2237
  .fractal-sidebar__nav {
1197
2238
  display: flex;
1198
2239
  flex: 1;
@@ -1284,56 +2325,13 @@
1284
2325
  border-top: 1px solid var(--border-subtle);
1285
2326
  }
1286
2327
  @media (prefers-reduced-motion: reduce) {
2328
+ .fractal-sidebar[data-compact],
1287
2329
  .fractal-sidebar__brand,
1288
2330
  .fractal-sidebar__nav-item {
1289
2331
  transition: none;
1290
2332
  }
1291
2333
  }
1292
2334
 
1293
- /* src/components/PageHeader/PageHeader.css */
1294
- .fractal-page-header {
1295
- display: flex;
1296
- min-height: 48px;
1297
- align-items: center;
1298
- justify-content: space-between;
1299
- gap: var(--space-5);
1300
- color: var(--fg-primary);
1301
- font-family: var(--font-sans);
1302
- }
1303
- .fractal-page-header__content {
1304
- min-width: 0;
1305
- }
1306
- .fractal-page-header__title {
1307
- margin: 0;
1308
- color: var(--fg-primary);
1309
- font-size: 1rem;
1310
- font-weight: 500;
1311
- line-height: 1.4;
1312
- }
1313
- .fractal-page-header__description {
1314
- margin: var(--space-1) 0 0;
1315
- color: var(--fg-secondary);
1316
- font-size: 0.875rem;
1317
- font-weight: 400;
1318
- line-height: 1.4;
1319
- }
1320
- .fractal-page-header__actions {
1321
- display: flex;
1322
- flex: 0 0 auto;
1323
- align-items: center;
1324
- gap: var(--space-2);
1325
- }
1326
- @media (max-width: 640px) {
1327
- .fractal-page-header {
1328
- align-items: flex-start;
1329
- flex-direction: column;
1330
- gap: var(--space-3);
1331
- }
1332
- .fractal-page-header__actions {
1333
- width: 100%;
1334
- }
1335
- }
1336
-
1337
2335
  /* src/components/SidePanel/SidePanel.css */
1338
2336
  .fractal-side-panel-overlay {
1339
2337
  position: fixed;
@@ -1342,6 +2340,7 @@
1342
2340
  display: flex;
1343
2341
  justify-content: flex-end;
1344
2342
  background: color-mix(in srgb, var(--fg-primary) 16%, transparent);
2343
+ animation: fractal-side-panel-overlay-in 180ms ease-out both;
1345
2344
  }
1346
2345
  .fractal-side-panel {
1347
2346
  display: flex;
@@ -1353,6 +2352,7 @@
1353
2352
  box-shadow: var(--shadow-lg);
1354
2353
  color: var(--fg-primary);
1355
2354
  font-family: var(--font-sans);
2355
+ animation: fractal-side-panel-in 180ms cubic-bezier(0.16, 1, 0.3, 1) both;
1356
2356
  }
1357
2357
  .fractal-side-panel--sm {
1358
2358
  width: min(100vw, 420px);
@@ -1363,19 +2363,23 @@
1363
2363
  .fractal-side-panel--lg {
1364
2364
  width: min(100vw, 680px);
1365
2365
  }
2366
+ .fractal-side-panel--xl {
2367
+ width: min(100vw, 960px);
2368
+ }
1366
2369
  .fractal-side-panel__header {
1367
2370
  display: flex;
1368
- min-height: 72px;
1369
2371
  align-items: flex-start;
1370
2372
  justify-content: space-between;
1371
2373
  gap: var(--space-4);
1372
- padding: var(--space-5) var(--space-6);
1373
- border-bottom: 1px solid var(--border-subtle);
2374
+ padding: var(--space-5) var(--space-6) var(--space-4);
1374
2375
  }
1375
2376
  .fractal-side-panel__heading {
1376
2377
  min-width: 0;
1377
2378
  }
1378
2379
  .fractal-side-panel__title {
2380
+ display: flex;
2381
+ min-height: 32px;
2382
+ align-items: center;
1379
2383
  margin: 0;
1380
2384
  font-size: 1rem;
1381
2385
  font-weight: 500;
@@ -1411,7 +2415,11 @@
1411
2415
  min-height: 0;
1412
2416
  flex: 1;
1413
2417
  overflow: auto;
1414
- padding: var(--space-6);
2418
+ padding: var(--space-2) var(--space-6) var(--space-6);
2419
+ }
2420
+ .fractal-side-panel__body--loading {
2421
+ display: grid;
2422
+ place-items: center;
1415
2423
  }
1416
2424
  .fractal-side-panel__footer {
1417
2425
  display: flex;
@@ -1425,15 +2433,37 @@
1425
2433
  width: 100%;
1426
2434
  }
1427
2435
  .fractal-side-panel__header {
1428
- padding: var(--space-4) var(--space-5);
2436
+ padding: var(--space-4) var(--space-5) var(--space-3);
1429
2437
  }
1430
2438
  .fractal-side-panel__body {
1431
- padding: var(--space-5);
2439
+ padding: var(--space-2) var(--space-5) var(--space-5);
1432
2440
  }
1433
2441
  .fractal-side-panel__footer {
1434
2442
  padding: var(--space-3) var(--space-5);
1435
2443
  }
1436
2444
  }
2445
+ @keyframes fractal-side-panel-overlay-in {
2446
+ from {
2447
+ opacity: 0;
2448
+ }
2449
+ to {
2450
+ opacity: 1;
2451
+ }
2452
+ }
2453
+ @keyframes fractal-side-panel-in {
2454
+ from {
2455
+ transform: translateX(100%);
2456
+ }
2457
+ to {
2458
+ transform: translateX(0);
2459
+ }
2460
+ }
2461
+ @media (prefers-reduced-motion: reduce) {
2462
+ .fractal-side-panel-overlay,
2463
+ .fractal-side-panel {
2464
+ animation-duration: 0.01ms;
2465
+ }
2466
+ }
1437
2467
 
1438
2468
  /* src/components/Textarea/Textarea.css */
1439
2469
  .fractal-textarea {
@@ -1464,4 +2494,214 @@
1464
2494
  opacity: 0.5;
1465
2495
  background: var(--bg-surface-1);
1466
2496
  }
2497
+
2498
+ /* src/components/TextButton/TextButton.css */
2499
+ .fractal-text-button {
2500
+ display: inline-flex;
2501
+ align-items: center;
2502
+ gap: var(--space-1);
2503
+ border: 0;
2504
+ background: transparent;
2505
+ cursor: pointer;
2506
+ font-family: var(--font-sans);
2507
+ font-weight: 500;
2508
+ line-height: 1.4;
2509
+ padding: 0;
2510
+ text-align: left;
2511
+ transition: color 120ms ease;
2512
+ }
2513
+ .fractal-text-button--primary {
2514
+ color: var(--fg-primary);
2515
+ }
2516
+ .fractal-text-button--primary:hover:not(:disabled) {
2517
+ color: var(--fg-secondary);
2518
+ }
2519
+ .fractal-text-button--secondary {
2520
+ color: var(--fg-secondary);
2521
+ }
2522
+ .fractal-text-button--secondary:hover:not(:disabled) {
2523
+ color: var(--fg-primary);
2524
+ }
2525
+ .fractal-text-button:focus-visible {
2526
+ outline: 2px solid var(--border-focus);
2527
+ outline-offset: 3px;
2528
+ border-radius: var(--radius-sm);
2529
+ }
2530
+ .fractal-text-button:disabled {
2531
+ cursor: not-allowed;
2532
+ opacity: 0.5;
2533
+ }
2534
+ .fractal-text-button--sm {
2535
+ font-size: 0.8125rem;
2536
+ }
2537
+ .fractal-text-button--md {
2538
+ font-size: 0.875rem;
2539
+ }
2540
+ .fractal-text-button__icon {
2541
+ display: inline-grid;
2542
+ place-items: center;
2543
+ }
2544
+
2545
+ /* src/components/FileDropzone/FileDropzone.css */
2546
+ .fractal-file-dropzone {
2547
+ display: grid;
2548
+ gap: var(--space-2);
2549
+ color: var(--fg-primary);
2550
+ font-family: var(--font-sans);
2551
+ }
2552
+ .fractal-file-dropzone__input {
2553
+ display: none;
2554
+ }
2555
+ .fractal-file-dropzone__target {
2556
+ display: flex;
2557
+ width: 100%;
2558
+ min-height: 92px;
2559
+ align-items: center;
2560
+ justify-content: center;
2561
+ gap: var(--space-3);
2562
+ border: 1px dashed var(--border-default);
2563
+ border-radius: var(--radius-md);
2564
+ background: var(--bg-canvas);
2565
+ color: var(--fg-secondary);
2566
+ cursor: pointer;
2567
+ padding: var(--space-4);
2568
+ text-align: left;
2569
+ }
2570
+ .fractal-file-dropzone__target:hover,
2571
+ .fractal-file-dropzone__target[data-dragging] {
2572
+ border-color: var(--border-focus);
2573
+ background: var(--hover-surface);
2574
+ color: var(--fg-primary);
2575
+ }
2576
+ .fractal-file-dropzone__target:focus-visible {
2577
+ outline: 2px solid var(--border-focus);
2578
+ outline-offset: 2px;
2579
+ }
2580
+ .fractal-file-dropzone__target:disabled {
2581
+ cursor: not-allowed;
2582
+ opacity: 0.5;
2583
+ }
2584
+ .fractal-file-dropzone__copy {
2585
+ display: grid;
2586
+ gap: var(--space-1);
2587
+ }
2588
+ .fractal-file-dropzone__title {
2589
+ font-size: 0.875rem;
2590
+ font-weight: 500;
2591
+ line-height: 1.4;
2592
+ }
2593
+ .fractal-file-dropzone__description {
2594
+ color: var(--fg-secondary);
2595
+ font-size: 0.8125rem;
2596
+ line-height: 1.4;
2597
+ }
2598
+ .fractal-file-dropzone__files {
2599
+ display: grid;
2600
+ gap: var(--space-1);
2601
+ margin: 0;
2602
+ padding: 0;
2603
+ list-style: none;
2604
+ }
2605
+ .fractal-file-dropzone__file {
2606
+ display: flex;
2607
+ min-width: 0;
2608
+ align-items: center;
2609
+ gap: var(--space-2);
2610
+ padding: var(--space-2) var(--space-3);
2611
+ border: 1px solid var(--border-subtle);
2612
+ border-radius: var(--radius-md);
2613
+ background: var(--bg-canvas);
2614
+ font-size: 0.8125rem;
2615
+ line-height: 1.4;
2616
+ }
2617
+ .fractal-file-dropzone__file-name {
2618
+ min-width: 0;
2619
+ flex: 1;
2620
+ overflow: hidden;
2621
+ text-overflow: ellipsis;
2622
+ white-space: nowrap;
2623
+ }
2624
+ .fractal-file-dropzone__file-meta {
2625
+ color: var(--fg-secondary);
2626
+ white-space: nowrap;
2627
+ }
2628
+ .fractal-file-dropzone__remove {
2629
+ display: grid;
2630
+ width: 24px;
2631
+ height: 24px;
2632
+ flex: 0 0 auto;
2633
+ place-items: center;
2634
+ border: 0;
2635
+ border-radius: var(--radius-sm);
2636
+ background: transparent;
2637
+ color: var(--fg-secondary);
2638
+ cursor: pointer;
2639
+ }
2640
+ .fractal-file-dropzone__remove:hover {
2641
+ background: var(--hover-surface);
2642
+ color: var(--fg-primary);
2643
+ }
2644
+ .fractal-file-dropzone__remove:focus-visible {
2645
+ outline: 2px solid var(--border-focus);
2646
+ outline-offset: 1px;
2647
+ }
2648
+ .fractal-file-dropzone__remove:disabled {
2649
+ cursor: not-allowed;
2650
+ opacity: 0.5;
2651
+ }
2652
+
2653
+ /* src/components/Pagination/Pagination.css */
2654
+ .fractal-pagination {
2655
+ display: flex;
2656
+ align-items: center;
2657
+ justify-content: space-between;
2658
+ gap: var(--space-3);
2659
+ color: var(--fg-secondary);
2660
+ font-family: var(--font-sans);
2661
+ font-size: 0.8125rem;
2662
+ line-height: 1.4;
2663
+ }
2664
+ .fractal-pagination__controls {
2665
+ display: flex;
2666
+ align-items: center;
2667
+ gap: var(--space-2);
2668
+ }
2669
+ .fractal-pagination__page-size .fractal-dropdown-trigger {
2670
+ padding: 4px 0;
2671
+ border: 0;
2672
+ background: transparent;
2673
+ color: var(--fg-secondary);
2674
+ }
2675
+ .fractal-pagination__page-size .fractal-dropdown-trigger:hover {
2676
+ background: transparent;
2677
+ color: var(--fg-primary);
2678
+ }
2679
+ .fractal-pagination__button {
2680
+ display: grid;
2681
+ width: 28px;
2682
+ height: 28px;
2683
+ place-items: center;
2684
+ border: 1px solid var(--border-default);
2685
+ border-radius: var(--radius-sm);
2686
+ background: var(--bg-canvas);
2687
+ color: var(--fg-secondary);
2688
+ cursor: pointer;
2689
+ }
2690
+ .fractal-pagination__button:hover:not(:disabled) {
2691
+ background: var(--hover-surface);
2692
+ color: var(--fg-primary);
2693
+ }
2694
+ .fractal-pagination__button:focus-visible {
2695
+ outline: 2px solid var(--border-focus);
2696
+ outline-offset: 2px;
2697
+ }
2698
+ .fractal-pagination__button:disabled {
2699
+ cursor: not-allowed;
2700
+ opacity: 0.45;
2701
+ }
2702
+ .fractal-pagination__page {
2703
+ min-width: 44px;
2704
+ text-align: center;
2705
+ white-space: nowrap;
2706
+ }
1467
2707
  /*# sourceMappingURL=index.css.map */