@mirror-physics/fractal-ui 0.2.0-next.6 → 0.2.0-next.60

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,135 @@
369
530
  padding: 0;
370
531
  }
371
532
 
533
+ /* src/components/TableSearch/TableSearch.css */
534
+ .fractal-table-search {
535
+ position: relative;
536
+ width: 100%;
537
+ }
538
+ .fractal-table-search__icon {
539
+ position: absolute;
540
+ z-index: 1;
541
+ top: 50%;
542
+ left: var(--space-3, 12px);
543
+ color: var(--fg-secondary);
544
+ pointer-events: none;
545
+ transform: translateY(-50%);
546
+ }
547
+ .fractal-table-search__input {
548
+ padding-left: 40px;
549
+ }
550
+ .fractal-table-search__input::-webkit-search-cancel-button {
551
+ cursor: pointer;
552
+ }
553
+
554
+ /* src/components/NumberInput/NumberInput.css */
555
+ .fractal-number-input {
556
+ position: relative;
557
+ width: 100%;
558
+ height: 40px;
559
+ align-self: start;
560
+ }
561
+ .fractal-number-input .fractal-input {
562
+ padding-right: calc(80px + var(--space-3, 12px));
563
+ appearance: textfield;
564
+ }
565
+ .fractal-number-input .fractal-input::-webkit-inner-spin-button,
566
+ .fractal-number-input .fractal-input::-webkit-outer-spin-button {
567
+ margin: 0;
568
+ appearance: none;
569
+ }
570
+ .fractal-number-input-controls {
571
+ position: absolute;
572
+ top: 1px;
573
+ right: 1px;
574
+ bottom: 1px;
575
+ display: flex;
576
+ align-items: stretch;
577
+ overflow: hidden;
578
+ border-radius: 0 calc(var(--radius-sm, 4px) - 1px) calc(var(--radius-sm, 4px) - 1px) 0;
579
+ background: var(--bg-canvas);
580
+ }
581
+ .fractal-number-input-unit {
582
+ position: absolute;
583
+ top: 50%;
584
+ color: var(--fg-secondary);
585
+ font-size: 0.875rem;
586
+ line-height: 1;
587
+ pointer-events: none;
588
+ transform: translateY(-50%);
589
+ user-select: none;
590
+ }
591
+ .fractal-number-input-step {
592
+ display: grid;
593
+ width: 40px;
594
+ place-items: center;
595
+ padding: 0;
596
+ border: 0;
597
+ border-left: 1px solid var(--border-subtle);
598
+ background: transparent;
599
+ color: var(--fg-tertiary);
600
+ cursor: pointer;
601
+ }
602
+ .fractal-number-input-step:hover:not(:disabled) {
603
+ background: var(--bg-surface-1);
604
+ color: var(--fg-primary);
605
+ }
606
+ .fractal-number-input-step:focus-visible {
607
+ position: relative;
608
+ z-index: 1;
609
+ outline: 2px solid var(--border-focus);
610
+ outline-offset: -2px;
611
+ }
612
+ .fractal-number-input-step:disabled {
613
+ color: var(--fg-disabled);
614
+ cursor: not-allowed;
615
+ }
616
+
617
+ /* src/components/PasswordInput/PasswordInput.css */
618
+ .fractal-password-input {
619
+ position: relative;
620
+ width: 100%;
621
+ height: 40px;
622
+ align-self: start;
623
+ }
624
+ .fractal-password-input-field {
625
+ padding-right: calc(40px + var(--space-2, 8px));
626
+ }
627
+ .fractal-password-input-toggle {
628
+ position: absolute;
629
+ top: 4px;
630
+ right: 4px;
631
+ display: grid;
632
+ width: 32px;
633
+ height: 32px;
634
+ place-items: center;
635
+ padding: 0;
636
+ border: 0;
637
+ border-radius: var(--radius-sm, 4px);
638
+ background: transparent;
639
+ color: var(--fg-secondary);
640
+ cursor: pointer;
641
+ transition: background-color 150ms ease, color 150ms ease;
642
+ }
643
+ .fractal-password-input-toggle:hover:not(:disabled) {
644
+ background: var(--hover-canvas, var(--bg-surface-1));
645
+ color: var(--fg-primary);
646
+ }
647
+ .fractal-password-input-toggle:focus-visible {
648
+ outline: 2px solid var(--border-focus);
649
+ outline-offset: -2px;
650
+ }
651
+ .fractal-password-input-toggle:disabled {
652
+ color: var(--fg-disabled);
653
+ cursor: not-allowed;
654
+ opacity: 0.5;
655
+ }
656
+ @media (prefers-reduced-motion: reduce) {
657
+ .fractal-password-input-toggle {
658
+ transition-duration: 0.01ms;
659
+ }
660
+ }
661
+
372
662
  /* src/components/Label/Label.css */
373
663
  .fractal-label {
374
664
  font-size: 0.875rem;
@@ -401,9 +691,11 @@
401
691
  height: 18px;
402
692
  font-size: 0.75rem;
403
693
  font-weight: 600;
404
- border-radius: 50%;
405
694
  margin-top: 1px;
406
695
  }
696
+ .fractal-alert-icon svg {
697
+ display: block;
698
+ }
407
699
  .fractal-alert-content {
408
700
  flex: 1;
409
701
  min-width: 0;
@@ -415,53 +707,49 @@
415
707
  line-height: 1.4;
416
708
  }
417
709
  .fractal-alert-description {
710
+ color: var(--fg-secondary);
418
711
  font-size: 0.875rem;
419
712
  line-height: 1.5;
420
713
  }
421
714
  .fractal-alert--default {
422
715
  background-color: var(--bg-canvas);
423
- border-color: var(--border-default);
716
+ border-color: var(--border-subtle);
424
717
  color: var(--fg-primary);
425
718
  }
426
719
  .fractal-alert--default .fractal-alert-icon {
427
- background: var(--bg-surface-2);
428
720
  color: var(--fg-secondary);
429
721
  }
430
722
  .fractal-alert--info {
431
723
  background-color: var(--accent-surface);
432
- border-color: var(--accent-default);
724
+ border-color: var(--accent-surface-stroke);
433
725
  color: var(--fg-primary);
434
726
  }
435
727
  .fractal-alert--info .fractal-alert-icon {
436
- background: var(--accent-default);
437
- color: var(--fg-inverse);
728
+ color: var(--accent-default);
438
729
  }
439
730
  .fractal-alert--success {
440
731
  background-color: var(--success-surface);
441
- border-color: var(--success-default);
732
+ border-color: var(--success-surface-stroke);
442
733
  color: var(--fg-primary);
443
734
  }
444
735
  .fractal-alert--success .fractal-alert-icon {
445
- background: var(--success-default);
446
- color: var(--fg-inverse);
736
+ color: var(--success-default);
447
737
  }
448
738
  .fractal-alert--warning {
449
739
  background-color: var(--warning-surface);
450
- border-color: var(--warning-default);
740
+ border-color: var(--warning-surface-stroke);
451
741
  color: var(--fg-primary);
452
742
  }
453
743
  .fractal-alert--warning .fractal-alert-icon {
454
- background: var(--warning-default);
455
- color: var(--fg-inverse);
744
+ color: var(--warning-default);
456
745
  }
457
746
  .fractal-alert--error {
458
747
  background-color: var(--error-surface);
459
- border-color: var(--error-default);
748
+ border-color: var(--error-surface-stroke);
460
749
  color: var(--fg-primary);
461
750
  }
462
751
  .fractal-alert--error .fractal-alert-icon {
463
- background: var(--error-default);
464
- color: var(--fg-inverse);
752
+ color: var(--error-default);
465
753
  }
466
754
 
467
755
  /* src/components/Toggle/Toggle.css */
@@ -506,6 +794,60 @@
506
794
  user-select: none;
507
795
  }
508
796
 
797
+ /* src/components/UILoader/UILoader.css */
798
+ .fractal-ui-loader {
799
+ display: inline-flex;
800
+ line-height: 0;
801
+ }
802
+ .fractal-ui-loader svg {
803
+ display: block;
804
+ overflow: visible;
805
+ }
806
+ .fractal-ui-loader__stop-start {
807
+ stop-color: var(--grey-200);
808
+ }
809
+ .fractal-ui-loader__stop-end {
810
+ stop-color: var(--grey-100);
811
+ }
812
+ .fractal-ui-loader--blue .fractal-ui-loader__stop-start {
813
+ stop-color: var(--blue-500);
814
+ }
815
+ .fractal-ui-loader--blue .fractal-ui-loader__stop-end {
816
+ stop-color: var(--blue-300);
817
+ }
818
+ .fractal-ui-loader--green .fractal-ui-loader__stop-start {
819
+ stop-color: var(--green-500);
820
+ }
821
+ .fractal-ui-loader--green .fractal-ui-loader__stop-end {
822
+ stop-color: var(--green-300);
823
+ }
824
+ .fractal-ui-loader__shine-axis {
825
+ transform-box: view-box;
826
+ transform-origin: 0 0;
827
+ }
828
+ .fractal-ui-loader__shine {
829
+ animation: fractal-ui-loader-shine 2500ms var(--ease-in-out) infinite;
830
+ transform-box: view-box;
831
+ transform-origin: 0 0;
832
+ }
833
+ @keyframes fractal-ui-loader-shine {
834
+ 0%, 12% {
835
+ transform: translateX(-120px);
836
+ }
837
+ 48% {
838
+ transform: translateX(120px);
839
+ }
840
+ 49%, 100% {
841
+ transform: translateX(-120px);
842
+ }
843
+ }
844
+ @media (prefers-reduced-motion: reduce) {
845
+ .fractal-ui-loader__shine {
846
+ animation: none;
847
+ transform: translateX(0);
848
+ }
849
+ }
850
+
509
851
  /* src/components/Modal/Modal.css */
510
852
  .fractal-modal-overlay {
511
853
  position: fixed;
@@ -517,11 +859,13 @@
517
859
  z-index: 9998;
518
860
  }
519
861
  .fractal-modal-panel {
862
+ --fractal-modal-panel-padding: var(--space-6, 24px);
863
+ box-sizing: border-box;
520
864
  background: var(--bg-canvas);
521
865
  border: 1px solid var(--border-subtle);
522
866
  border-radius: var(--radius-lg, 8px);
523
867
  box-shadow: var(--shadow-lg);
524
- padding: var(--space-6, 24px);
868
+ padding: var(--fractal-modal-panel-padding);
525
869
  max-width: 90vw;
526
870
  font-family: var(--font-sans);
527
871
  }
@@ -538,6 +882,12 @@
538
882
  display: flex;
539
883
  flex-direction: column;
540
884
  }
885
+ .fractal-modal-panel--scrollable {
886
+ display: flex;
887
+ max-height: calc(100dvh - 2rem);
888
+ flex-direction: column;
889
+ padding-bottom: 0;
890
+ }
541
891
  .fractal-modal-panel--danger {
542
892
  border-color: var(--error-subtle);
543
893
  }
@@ -576,21 +926,52 @@
576
926
  color: var(--fg-primary);
577
927
  background: var(--bg-surface-1);
578
928
  }
929
+ .fractal-modal-close:disabled {
930
+ cursor: not-allowed;
931
+ opacity: 0.4;
932
+ }
933
+ .fractal-modal-close:disabled:hover {
934
+ color: var(--fg-secondary);
935
+ background: none;
936
+ }
579
937
  .fractal-modal-body {
580
938
  font-size: 0.875rem;
581
939
  color: var(--fg-secondary);
582
940
  }
941
+ .fractal-modal-body--loading {
942
+ display: grid;
943
+ min-height: 168px;
944
+ place-items: center;
945
+ }
583
946
  .fractal-modal-body--lg {
584
947
  flex: 1;
585
948
  min-height: 0;
586
949
  overflow: hidden;
587
950
  }
951
+ .fractal-modal-body--scrollable {
952
+ box-sizing: border-box;
953
+ width: calc(100% + var(--fractal-modal-panel-padding) + var(--fractal-modal-panel-padding));
954
+ min-height: 0;
955
+ margin-inline: calc(0px - var(--fractal-modal-panel-padding));
956
+ overflow-y: auto;
957
+ overscroll-behavior: contain;
958
+ padding-inline: var(--fractal-modal-panel-padding);
959
+ }
588
960
  .fractal-modal-footer {
589
961
  display: flex;
590
962
  justify-content: flex-end;
591
963
  gap: var(--space-2, 8px);
592
964
  margin-top: var(--space-4, 16px);
593
965
  }
966
+ .fractal-modal-footer--divided {
967
+ box-sizing: border-box;
968
+ width: calc(100% + var(--fractal-modal-panel-padding) + var(--fractal-modal-panel-padding));
969
+ flex: 0 0 auto;
970
+ margin-top: 0;
971
+ margin-inline: calc(0px - var(--fractal-modal-panel-padding));
972
+ padding: var(--space-4, 16px) var(--fractal-modal-panel-padding);
973
+ border-top: 1px solid var(--border-subtle);
974
+ }
594
975
 
595
976
  /* src/components/DataTable/DataTable.css */
596
977
  .fractal-datatable {
@@ -639,9 +1020,6 @@
639
1020
  border-bottom: 1px solid var(--border-subtle);
640
1021
  vertical-align: middle;
641
1022
  }
642
- .fractal-datatable-th + .fractal-datatable-th {
643
- border-left: 1px solid var(--border-subtle);
644
- }
645
1023
  .fractal-datatable-row {
646
1024
  background: var(--bg-canvas);
647
1025
  transition: background 120ms ease;
@@ -656,8 +1034,8 @@
656
1034
  vertical-align: top;
657
1035
  overflow-wrap: anywhere;
658
1036
  }
659
- .fractal-datatable-td + .fractal-datatable-td {
660
- border-left: 1px solid var(--border-subtle);
1037
+ .fractal-datatable-td .fractal-dropdown-trigger--icon-only.fractal-dropdown-trigger--tertiary:hover {
1038
+ background: var(--bg-canvas);
661
1039
  }
662
1040
  .fractal-datatable-row + .fractal-datatable-row .fractal-datatable-td {
663
1041
  border-top: 1px solid var(--border-subtle);
@@ -700,13 +1078,50 @@
700
1078
  padding: 4px 8px;
701
1079
  font-size: 0.75rem;
702
1080
  }
703
- .fractal-dropdown-trigger--tertiary {
704
- border-color: transparent;
705
- background: transparent;
1081
+ .fractal-dropdown-trigger--vertical {
1082
+ flex-direction: column;
1083
+ justify-content: flex-start;
706
1084
  }
707
- .fractal-dropdown-trigger:hover,
708
- .fractal-dropdown-trigger--tertiary:hover {
709
- background: var(--bg-surface-1);
1085
+ .fractal-dropdown-trigger--vertical .fractal-dropdown-selected-text {
1086
+ writing-mode: vertical-rl;
1087
+ transform: rotate(180deg);
1088
+ }
1089
+ .fractal-dropdown-trigger--vertical .fractal-dropdown-icon--trigger {
1090
+ writing-mode: vertical-rl;
1091
+ transform: rotate(180deg);
1092
+ }
1093
+ .fractal-dropdown-trigger--vertical .fractal-dropdown-chevron {
1094
+ order: -1;
1095
+ margin: 0 0 auto;
1096
+ }
1097
+ .fractal-dropdown-trigger--icon-only {
1098
+ width: 32px;
1099
+ height: 32px;
1100
+ justify-content: center;
1101
+ padding: 0;
1102
+ }
1103
+ .fractal-dropdown-trigger--icon-only.fractal-dropdown-trigger--sm {
1104
+ width: 28px;
1105
+ height: 28px;
1106
+ }
1107
+ .fractal-dropdown-trigger--tertiary {
1108
+ border-color: transparent;
1109
+ background: transparent;
1110
+ }
1111
+ .fractal-dropdown-trigger:hover,
1112
+ .fractal-dropdown-trigger--tertiary:hover {
1113
+ background: var(--bg-surface-1);
1114
+ }
1115
+ .fractal-dropdown-trigger:disabled,
1116
+ .fractal-dropdown-trigger:disabled:hover {
1117
+ color: var(--fg-disabled);
1118
+ cursor: not-allowed;
1119
+ background: var(--bg-surface-1);
1120
+ }
1121
+ .fractal-dropdown-trigger:disabled .fractal-dropdown-selected-text,
1122
+ .fractal-dropdown-trigger:disabled .fractal-dropdown-chevron,
1123
+ .fractal-dropdown-trigger:disabled .fractal-dropdown-icon {
1124
+ color: var(--fg-disabled);
710
1125
  }
711
1126
  .fractal-dropdown-trigger:focus-visible {
712
1127
  outline: none;
@@ -731,12 +1146,15 @@
731
1146
  .fractal-dropdown-chevron {
732
1147
  display: flex;
733
1148
  flex-shrink: 0;
1149
+ margin-left: auto;
734
1150
  color: var(--fg-secondary);
735
1151
  }
736
1152
  .fractal-dropdown-panel {
737
1153
  position: absolute;
738
1154
  z-index: 999999;
1155
+ min-width: 100%;
739
1156
  overflow: hidden;
1157
+ box-sizing: border-box;
740
1158
  border-radius: var(--radius-md, 6px);
741
1159
  border: 1px solid var(--border-subtle);
742
1160
  background: var(--bg-canvas);
@@ -755,6 +1173,7 @@
755
1173
  .fractal-dropdown-option {
756
1174
  display: flex;
757
1175
  width: 100%;
1176
+ box-sizing: border-box;
758
1177
  align-items: center;
759
1178
  gap: 8px;
760
1179
  padding: 6px 8px;
@@ -778,7 +1197,7 @@
778
1197
  }
779
1198
  .fractal-dropdown-option:hover,
780
1199
  .fractal-dropdown-option:focus-visible {
781
- background: var(--hover-canvas, var(--bg-surface-2));
1200
+ background: var(--hover-surface, var(--bg-surface-2));
782
1201
  outline: none;
783
1202
  }
784
1203
  .fractal-dropdown-separator {
@@ -874,6 +1293,43 @@
874
1293
  color: var(--accent-default);
875
1294
  }
876
1295
 
1296
+ /* src/components/Checkbox/Checkbox.css */
1297
+ .fractal-checkbox {
1298
+ display: grid;
1299
+ width: 28px;
1300
+ height: 28px;
1301
+ place-items: center;
1302
+ padding: 0;
1303
+ border: 0;
1304
+ border-radius: var(--radius-sm);
1305
+ background: transparent;
1306
+ color: var(--fg-secondary);
1307
+ cursor: pointer;
1308
+ }
1309
+ .fractal-checkbox:hover:not(:disabled) {
1310
+ background: var(--hover-canvas);
1311
+ color: var(--fg-primary);
1312
+ }
1313
+ .fractal-checkbox--checked {
1314
+ color: var(--fg-primary);
1315
+ }
1316
+ .fractal-checkbox__indeterminate-icon {
1317
+ position: relative;
1318
+ display: grid;
1319
+ place-items: center;
1320
+ }
1321
+ .fractal-checkbox__indeterminate-mark {
1322
+ position: absolute;
1323
+ }
1324
+ .fractal-checkbox:focus-visible {
1325
+ outline: 2px solid var(--border-focus);
1326
+ outline-offset: 2px;
1327
+ }
1328
+ .fractal-checkbox:disabled {
1329
+ cursor: not-allowed;
1330
+ color: var(--fg-disabled);
1331
+ }
1332
+
877
1333
  /* src/components/SortableTable/SortableTable.css */
878
1334
  .fractal-sortable-table {
879
1335
  font-family: var(--font-sans);
@@ -885,6 +1341,11 @@
885
1341
  border-radius: var(--radius-md, 6px);
886
1342
  background: var(--bg-canvas);
887
1343
  }
1344
+ .fractal-sortable-table--embedded .fractal-sortable-table-surface {
1345
+ border: 0;
1346
+ border-top: 1px solid var(--border-subtle);
1347
+ border-radius: 0;
1348
+ }
888
1349
  .fractal-sortable-table-header {
889
1350
  display: flex;
890
1351
  align-items: center;
@@ -922,9 +1383,6 @@
922
1383
  vertical-align: middle;
923
1384
  white-space: nowrap;
924
1385
  }
925
- .fractal-sortable-table-th + .fractal-sortable-table-th {
926
- border-left: 1px solid var(--border-subtle);
927
- }
928
1386
  .fractal-sortable-table-th--sortable {
929
1387
  padding: 0;
930
1388
  }
@@ -980,6 +1438,47 @@
980
1438
  .fractal-sortable-table-row--interactive {
981
1439
  cursor: pointer;
982
1440
  }
1441
+ .fractal-sortable-table-td--row-action {
1442
+ position: relative;
1443
+ }
1444
+ .fractal-sortable-table-td .fractal-dropdown-trigger--icon-only.fractal-dropdown-trigger--tertiary:hover {
1445
+ background: var(--bg-canvas);
1446
+ }
1447
+ .fractal-sortable-table-row-action {
1448
+ position: absolute;
1449
+ z-index: 1;
1450
+ top: 0;
1451
+ right: -1px;
1452
+ bottom: 0;
1453
+ display: flex;
1454
+ width: min(280px, calc(200% + 32px));
1455
+ align-items: center;
1456
+ justify-content: flex-end;
1457
+ padding-right: var(--space-4);
1458
+ background:
1459
+ linear-gradient(
1460
+ 90deg,
1461
+ transparent 0%,
1462
+ color-mix(in srgb, var(--hover-surface) 72%, transparent) 52%,
1463
+ var(--hover-surface) 100%);
1464
+ opacity: 0;
1465
+ pointer-events: none;
1466
+ transition: opacity 150ms ease-out;
1467
+ }
1468
+ .fractal-sortable-table-row--interactive:hover .fractal-sortable-table-row-action,
1469
+ .fractal-sortable-table-row--interactive:focus-visible .fractal-sortable-table-row-action {
1470
+ opacity: 1;
1471
+ }
1472
+ .fractal-sortable-table-row-action__icon {
1473
+ display: grid;
1474
+ width: 32px;
1475
+ height: 32px;
1476
+ place-items: center;
1477
+ border: 1px solid var(--border-default);
1478
+ border-radius: var(--radius-full);
1479
+ background: var(--bg-canvas);
1480
+ color: var(--fg-primary);
1481
+ }
983
1482
  .fractal-sortable-table-row--interactive:focus-visible {
984
1483
  position: relative;
985
1484
  z-index: 1;
@@ -1002,17 +1501,14 @@
1002
1501
  vertical-align: top;
1003
1502
  overflow-wrap: anywhere;
1004
1503
  }
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,
1504
+ .fractal-sortable-table--sm .fractal-sortable-table-th:not(.fractal-sortable-table-th--sortable),
1009
1505
  .fractal-sortable-table--sm .fractal-sortable-table-sort-button {
1010
1506
  padding: 8px 12px;
1011
1507
  }
1012
1508
  .fractal-sortable-table--sm .fractal-sortable-table-td {
1013
1509
  padding: 10px 12px;
1014
1510
  }
1015
- .fractal-sortable-table--lg .fractal-sortable-table-th,
1511
+ .fractal-sortable-table--lg .fractal-sortable-table-th:not(.fractal-sortable-table-th--sortable),
1016
1512
  .fractal-sortable-table--lg .fractal-sortable-table-sort-button {
1017
1513
  padding: 18px 24px;
1018
1514
  }
@@ -1026,17 +1522,60 @@
1026
1522
  font-size: 0.875rem;
1027
1523
  }
1028
1524
  .fractal-tabs-list {
1525
+ position: relative;
1029
1526
  display: flex;
1030
1527
  gap: 24px;
1528
+ margin-bottom: var(--space-6);
1529
+ }
1530
+ .fractal-tabs--divider > .fractal-tabs-list {
1031
1531
  border-bottom: 1px solid var(--border-subtle);
1032
- margin-bottom: 16px;
1532
+ }
1533
+ .fractal-tabs--surface > .fractal-tabs-list {
1534
+ width: 100%;
1535
+ gap: 0;
1536
+ margin-bottom: 0;
1537
+ background: var(--bg-surface-1);
1538
+ }
1539
+ .fractal-tabs--surface > .fractal-tabs-list::before {
1540
+ position: absolute;
1541
+ z-index: 3;
1542
+ right: 0;
1543
+ bottom: 0;
1544
+ left: 0;
1545
+ height: 1px;
1546
+ background: var(--border-subtle);
1547
+ content: "";
1548
+ pointer-events: none;
1549
+ }
1550
+ .fractal-tabs-list::after {
1551
+ position: absolute;
1552
+ bottom: -1px;
1553
+ left: 0;
1554
+ width: var(--fractal-tabs-indicator-width, 0px);
1555
+ height: 2px;
1556
+ background: var(--accent-default);
1557
+ content: "";
1558
+ opacity: 0;
1559
+ transform: translateX(var(--fractal-tabs-indicator-offset, 0px));
1560
+ transition:
1561
+ transform 180ms var(--ease-standard, ease),
1562
+ width 180ms var(--ease-standard, ease),
1563
+ opacity 100ms ease;
1564
+ }
1565
+ .fractal-tabs-list[data-indicator-ready=true]::after {
1566
+ opacity: 1;
1567
+ }
1568
+ .fractal-tabs--surface > .fractal-tabs-list::after {
1569
+ display: none;
1033
1570
  }
1034
1571
  .fractal-tabs-trigger {
1035
1572
  position: relative;
1036
1573
  display: inline-flex;
1574
+ min-width: 88px;
1037
1575
  align-items: center;
1576
+ justify-content: center;
1038
1577
  gap: 6px;
1039
- padding: 10px 0;
1578
+ padding: 10px 1rem;
1040
1579
  background: none;
1041
1580
  border: 0;
1042
1581
  font: inherit;
@@ -1044,8 +1583,7 @@
1044
1583
  font-weight: 400;
1045
1584
  color: var(--fg-secondary);
1046
1585
  cursor: pointer;
1047
- transition: color 0.15s ease, box-shadow 0.15s ease;
1048
- box-shadow: inset 0 -1px 0 transparent;
1586
+ transition: color 0.15s ease;
1049
1587
  margin-bottom: -1px;
1050
1588
  }
1051
1589
  .fractal-tabs-trigger:hover:not(.fractal-tabs-trigger--active):not(.fractal-tabs-trigger--disabled) {
@@ -1059,7 +1597,21 @@
1059
1597
  .fractal-tabs-trigger--active {
1060
1598
  color: var(--accent-default);
1061
1599
  font-weight: 500;
1062
- box-shadow: inset 0 -1px 0 var(--accent-default);
1600
+ }
1601
+ .fractal-tabs:not(.fractal-tabs--divider):not(.fractal-tabs--surface) > .fractal-tabs-list > .fractal-tabs-trigger:not(.fractal-tabs-trigger--active) {
1602
+ box-shadow: inset 0 -1px 0 var(--border-subtle);
1603
+ }
1604
+ .fractal-tabs--surface > .fractal-tabs-list > .fractal-tabs-trigger {
1605
+ margin-bottom: 0;
1606
+ border-right: 1px solid var(--border-subtle);
1607
+ background: var(--bg-surface-1);
1608
+ }
1609
+ .fractal-tabs--surface > .fractal-tabs-list > .fractal-tabs-trigger:hover:not(.fractal-tabs-trigger--active):not(.fractal-tabs-trigger--disabled) {
1610
+ background: var(--hover-surface);
1611
+ }
1612
+ .fractal-tabs--surface > .fractal-tabs-list > .fractal-tabs-trigger--active {
1613
+ background: var(--bg-canvas);
1614
+ color: var(--fg-primary);
1063
1615
  }
1064
1616
  .fractal-tabs-trigger--disabled {
1065
1617
  color: var(--fg-disabled, var(--fg-secondary));
@@ -1073,6 +1625,94 @@
1073
1625
  .fractal-tabs-panel[hidden] {
1074
1626
  display: none;
1075
1627
  }
1628
+ @media (prefers-reduced-motion: reduce) {
1629
+ .fractal-tabs-list::after {
1630
+ transition: none;
1631
+ }
1632
+ }
1633
+
1634
+ /* src/components/ContentSwitcher/ContentSwitcher.css */
1635
+ .fractal-content-switcher {
1636
+ position: relative;
1637
+ display: inline-flex;
1638
+ gap: 2px;
1639
+ padding: 2px;
1640
+ border: 1px solid color-mix(in srgb, var(--border-subtle) 55%, transparent);
1641
+ border-radius: var(--radius-md);
1642
+ background: var(--bg-surface-subtle);
1643
+ font-family: var(--font-sans);
1644
+ }
1645
+ .fractal-content-switcher__indicator {
1646
+ position: absolute;
1647
+ top: 0;
1648
+ left: 0;
1649
+ width: var(--fractal-content-switcher-indicator-width, 0);
1650
+ height: var(--fractal-content-switcher-indicator-height, 0);
1651
+ border-radius: var(--radius-sm);
1652
+ background: var(--bg-canvas);
1653
+ box-shadow: var(--shadow-sm);
1654
+ opacity: 0;
1655
+ pointer-events: none;
1656
+ transform: translate3d(var(--fractal-content-switcher-indicator-x, 0), var(--fractal-content-switcher-indicator-y, 0), 0);
1657
+ }
1658
+ .fractal-content-switcher[data-indicator-ready=true] .fractal-content-switcher__indicator {
1659
+ opacity: 1;
1660
+ }
1661
+ .fractal-content-switcher[data-indicator-ready=true][data-indicator-animate=true] .fractal-content-switcher__indicator {
1662
+ transition:
1663
+ transform var(--duration-normal) var(--ease-in-out),
1664
+ width var(--duration-normal) var(--ease-in-out),
1665
+ height var(--duration-normal) var(--ease-in-out),
1666
+ opacity var(--duration-fast) var(--ease-out);
1667
+ }
1668
+ .fractal-content-switcher--full-width {
1669
+ display: flex;
1670
+ width: 100%;
1671
+ }
1672
+ .fractal-content-switcher__item {
1673
+ position: relative;
1674
+ z-index: 1;
1675
+ min-width: 128px;
1676
+ min-height: 40px;
1677
+ padding: 0 var(--space-4);
1678
+ border: 0;
1679
+ border-radius: var(--radius-sm);
1680
+ background: transparent;
1681
+ color: var(--fg-secondary);
1682
+ cursor: pointer;
1683
+ font: inherit;
1684
+ font-size: 0.875rem;
1685
+ line-height: 1.25;
1686
+ text-align: center;
1687
+ transition: background-color var(--duration-fast) var(--ease-out), color var(--duration-fast) var(--ease-out);
1688
+ }
1689
+ .fractal-content-switcher--full-width .fractal-content-switcher__item {
1690
+ flex: 1;
1691
+ }
1692
+ .fractal-content-switcher__item:hover:not(:disabled):not(.fractal-content-switcher__item--active) {
1693
+ background: var(--hover-surface);
1694
+ color: var(--fg-primary);
1695
+ }
1696
+ .fractal-content-switcher__item--active {
1697
+ background: transparent;
1698
+ color: var(--fg-primary);
1699
+ }
1700
+ .fractal-content-switcher__item:focus-visible {
1701
+ position: relative;
1702
+ z-index: 1;
1703
+ outline: 2px solid var(--border-focus);
1704
+ outline-offset: -2px;
1705
+ }
1706
+ .fractal-content-switcher__item:disabled {
1707
+ cursor: not-allowed;
1708
+ color: var(--fg-disabled);
1709
+ opacity: 0.5;
1710
+ }
1711
+ @media (prefers-reduced-motion: reduce) {
1712
+ .fractal-content-switcher[data-indicator-ready=true][data-indicator-animate=true] .fractal-content-switcher__indicator {
1713
+ transition: none;
1714
+ }
1715
+ }
1076
1716
 
1077
1717
  /* src/components/Disclosure/Disclosure.css */
1078
1718
  .fractal-disclosure {
@@ -1104,6 +1744,17 @@
1104
1744
  .fractal-disclosure-trigger:hover {
1105
1745
  background: var(--bg-surface-1);
1106
1746
  }
1747
+ .fractal-disclosure--disabled .fractal-disclosure-trigger {
1748
+ color: var(--fg-tertiary);
1749
+ cursor: not-allowed;
1750
+ }
1751
+ .fractal-disclosure--disabled .fractal-disclosure-trigger:hover {
1752
+ background: transparent;
1753
+ }
1754
+ .fractal-disclosure--disabled .fractal-disclosure-icon,
1755
+ .fractal-disclosure--disabled .fractal-disclosure-meta {
1756
+ color: var(--fg-tertiary);
1757
+ }
1107
1758
  .fractal-disclosure-trigger:focus-visible {
1108
1759
  outline: 2px solid var(--border-focus);
1109
1760
  outline-offset: -2px;
@@ -1146,87 +1797,514 @@
1146
1797
  padding: 4px 0 12px 24px;
1147
1798
  }
1148
1799
 
1149
- /* src/components/Sidebar/Sidebar.css */
1150
- .fractal-sidebar {
1151
- --fractal-sidebar-width: 232px;
1152
- box-sizing: border-box;
1153
- display: flex;
1154
- width: var(--fractal-sidebar-width);
1155
- min-width: var(--fractal-sidebar-width);
1156
- min-height: 100%;
1157
- flex-direction: column;
1158
- background: var(--bg-surface-1);
1159
- border-right: 1px solid var(--nav-border);
1160
- color: var(--fg-primary);
1161
- font-family: var(--font-sans);
1162
- }
1163
- .fractal-sidebar__header {
1800
+ /* src/components/LatticeLoader/LatticeLoader.css */
1801
+ .fractal-lattice-loader {
1164
1802
  display: flex;
1165
- min-height: 48px;
1166
1803
  align-items: center;
1167
- padding: 0 var(--space-4);
1168
- border-bottom: 1px solid var(--border-subtle);
1804
+ gap: 6px;
1805
+ width: 100%;
1806
+ height: 12px;
1807
+ overflow: hidden;
1808
+ color: var(--fg-secondary);
1169
1809
  }
1170
- .fractal-sidebar__brand {
1171
- display: inline-flex;
1810
+ .fractal-lattice-loader__cell {
1811
+ position: relative;
1812
+ width: 12px;
1813
+ flex: 0 0 12px;
1814
+ aspect-ratio: 1;
1815
+ background: currentColor;
1816
+ -webkit-mask: url("./lattice-FAYE5KWW.svg") center / contain no-repeat;
1817
+ mask: url("./lattice-FAYE5KWW.svg") center / contain no-repeat;
1818
+ opacity: 0.08;
1819
+ animation: fractal-lattice-wave 3.2s ease-in-out infinite;
1820
+ animation-delay: calc((var(--fractal-lattice-index) * 40ms) - 3.2s);
1821
+ }
1822
+ @keyframes fractal-lattice-wave {
1823
+ 0%, 58%, 100% {
1824
+ opacity: 0.08;
1825
+ }
1826
+ 18% {
1827
+ opacity: 0.28;
1828
+ }
1829
+ 30% {
1830
+ opacity: 1;
1831
+ }
1832
+ 42% {
1833
+ opacity: 0.28;
1834
+ }
1835
+ }
1836
+ @media (prefers-reduced-motion: reduce) {
1837
+ .fractal-lattice-loader__cell {
1838
+ opacity: 0.35;
1839
+ animation: none;
1840
+ }
1841
+ }
1842
+
1843
+ /* src/components/Ghost/Ghost.css */
1844
+ .fractal-ghost {
1845
+ --fractal-ghost-base: var(--bg-surface-1);
1846
+ --fractal-ghost-shine: color-mix(in srgb, var(--bg-canvas) 82%, transparent);
1847
+ display: block;
1172
1848
  min-width: 0;
1173
- align-items: center;
1849
+ min-height: 1px;
1850
+ background:
1851
+ linear-gradient(
1852
+ 105deg,
1853
+ var(--fractal-ghost-base) 20%,
1854
+ var(--fractal-ghost-shine) 44%,
1855
+ var(--fractal-ghost-base) 68%);
1856
+ background-size: 220% 100%;
1857
+ border-radius: var(--radius-sm);
1858
+ animation: fractal-ghost-shine var(--duration-ambient) var(--ease-in-out) infinite;
1859
+ }
1860
+ .fractal-ghost-line {
1861
+ height: 0.875rem;
1862
+ }
1863
+ .fractal-ghost-line--sm {
1864
+ height: 0.6875rem;
1865
+ }
1866
+ .fractal-ghost-line--lg {
1867
+ height: 1.125rem;
1868
+ }
1869
+ .fractal-ghost-stack {
1870
+ display: grid;
1174
1871
  gap: var(--space-2);
1175
- padding: var(--space-1);
1176
- border: 0;
1177
- border-radius: var(--radius-md);
1178
- background: transparent;
1179
- color: var(--fg-primary);
1180
- cursor: pointer;
1181
- font: inherit;
1182
- text-align: left;
1183
- transition: background-color var(--duration-fast) var(--ease-out), transform var(--duration-fast) var(--ease-out);
1184
1872
  }
1185
- .fractal-sidebar__brand:hover {
1186
- background: var(--nav-hover);
1873
+ .fractal-ghost-button {
1874
+ border-radius: var(--radius-full);
1187
1875
  }
1188
- .fractal-sidebar__brand:active {
1189
- transform: scale(0.98);
1876
+ .fractal-ghost-button--xs {
1877
+ width: 72px;
1878
+ height: 28px;
1190
1879
  }
1191
- .fractal-sidebar__brand:focus-visible,
1192
- .fractal-sidebar__nav-item:focus-visible {
1193
- outline: 2px solid var(--border-focus);
1194
- outline-offset: 2px;
1880
+ .fractal-ghost-button--sm {
1881
+ width: 84px;
1882
+ height: 32px;
1195
1883
  }
1196
- .fractal-sidebar__nav {
1197
- display: flex;
1198
- flex: 1;
1199
- flex-direction: column;
1200
- gap: 0;
1201
- overflow-y: auto;
1202
- padding: var(--space-2);
1884
+ .fractal-ghost-button--md {
1885
+ width: 96px;
1886
+ height: 40px;
1203
1887
  }
1204
- .fractal-sidebar__section {
1205
- display: flex;
1206
- flex-direction: column;
1207
- gap: 1px;
1888
+ .fractal-ghost-button--lg {
1889
+ width: 108px;
1890
+ height: 44px;
1208
1891
  }
1209
- .fractal-sidebar__section + .fractal-sidebar__section {
1210
- position: relative;
1211
- margin-top: var(--space-2);
1212
- padding-top: var(--space-2);
1892
+ .fractal-ghost-button--xl {
1893
+ width: 128px;
1894
+ height: 56px;
1213
1895
  }
1214
- .fractal-sidebar__section + .fractal-sidebar__section::before {
1215
- position: absolute;
1216
- top: 0;
1217
- right: var(--space-2);
1218
- left: var(--space-2);
1219
- height: 1px;
1220
- background: var(--border-subtle);
1221
- content: "";
1896
+ .fractal-ghost-button--icon-only {
1897
+ width: var(--fractal-ghost-icon-size, 40px);
1222
1898
  }
1223
- .fractal-sidebar__nav-item {
1224
- display: flex;
1225
- width: 100%;
1226
- min-height: 36px;
1227
- align-items: center;
1228
- gap: 10px;
1229
- padding: 8px 10px;
1899
+ .fractal-ghost-button--xs.fractal-ghost-button--icon-only {
1900
+ --fractal-ghost-icon-size: 28px;
1901
+ }
1902
+ .fractal-ghost-button--sm.fractal-ghost-button--icon-only {
1903
+ --fractal-ghost-icon-size: 32px;
1904
+ }
1905
+ .fractal-ghost-button--lg.fractal-ghost-button--icon-only {
1906
+ --fractal-ghost-icon-size: 44px;
1907
+ }
1908
+ .fractal-ghost-button--xl.fractal-ghost-button--icon-only {
1909
+ --fractal-ghost-icon-size: 56px;
1910
+ }
1911
+ .fractal-ghost-card {
1912
+ display: grid;
1913
+ gap: var(--space-4);
1914
+ padding: var(--space-5);
1915
+ border: 1px solid var(--border-subtle);
1916
+ border-radius: var(--radius-md);
1917
+ background: var(--bg-canvas);
1918
+ }
1919
+ .fractal-ghost-table {
1920
+ overflow: hidden;
1921
+ border: 1px solid var(--border-subtle);
1922
+ border-radius: var(--radius-md);
1923
+ background: var(--bg-canvas);
1924
+ }
1925
+ .fractal-ghost-table__table {
1926
+ width: 100%;
1927
+ border-collapse: separate;
1928
+ border-spacing: 0;
1929
+ }
1930
+ .fractal-ghost-table__head-row {
1931
+ background: var(--bg-surface-1);
1932
+ }
1933
+ .fractal-ghost-table th {
1934
+ padding: 12px 16px;
1935
+ border-bottom: 1px solid var(--border-subtle);
1936
+ color: var(--fg-secondary);
1937
+ font-size: 0.75rem;
1938
+ font-weight: 500;
1939
+ text-align: left;
1940
+ }
1941
+ .fractal-ghost-table td {
1942
+ padding: 14px 16px;
1943
+ }
1944
+ .fractal-ghost-table__row + .fractal-ghost-table__row td {
1945
+ border-top: 1px solid var(--border-subtle);
1946
+ }
1947
+ .fractal-ghost-table--sm th {
1948
+ padding: 8px 12px;
1949
+ }
1950
+ .fractal-ghost-table--sm td {
1951
+ padding: 10px 12px;
1952
+ }
1953
+ .fractal-ghost-table--lg th {
1954
+ padding: 18px 24px;
1955
+ }
1956
+ .fractal-ghost-table--lg td {
1957
+ padding: 22px 24px;
1958
+ }
1959
+ .fractal-ghost-field {
1960
+ display: grid;
1961
+ gap: var(--space-2);
1962
+ }
1963
+ .fractal-ghost-field__control {
1964
+ width: 100%;
1965
+ height: 40px;
1966
+ border: 1px solid var(--border-subtle);
1967
+ border-radius: var(--radius-md);
1968
+ }
1969
+ .fractal-ghost-field__control--multiline {
1970
+ height: 112px;
1971
+ }
1972
+ .fractal-ghost-label {
1973
+ border-radius: var(--radius-sm);
1974
+ }
1975
+ .fractal-ghost-alert {
1976
+ display: grid;
1977
+ gap: var(--space-2);
1978
+ padding: var(--space-4);
1979
+ border: 1px solid var(--border-subtle);
1980
+ border-radius: var(--radius-md);
1981
+ }
1982
+ .fractal-ghost-choice {
1983
+ display: flex;
1984
+ align-items: center;
1985
+ gap: var(--space-2);
1986
+ }
1987
+ .fractal-ghost-choice__control {
1988
+ width: 16px;
1989
+ height: 16px;
1990
+ border-radius: var(--radius-sm);
1991
+ }
1992
+ .fractal-ghost-chip {
1993
+ border-radius: var(--radius-full);
1994
+ }
1995
+ .fractal-ghost-link {
1996
+ display: inline-block;
1997
+ }
1998
+ .fractal-ghost-dropdown {
1999
+ display: flex;
2000
+ align-items: center;
2001
+ justify-content: space-between;
2002
+ width: 220px;
2003
+ height: 40px;
2004
+ padding: 0 var(--space-3);
2005
+ border: 1px solid var(--border-subtle);
2006
+ border-radius: var(--radius-md);
2007
+ }
2008
+ .fractal-ghost-dropdown__chevron {
2009
+ width: 14px;
2010
+ height: 14px;
2011
+ border-radius: var(--radius-full);
2012
+ }
2013
+ .fractal-ghost-switcher {
2014
+ display: flex;
2015
+ width: fit-content;
2016
+ gap: 2px;
2017
+ padding: 3px;
2018
+ border-radius: var(--radius-md);
2019
+ background: var(--bg-surface-1);
2020
+ }
2021
+ .fractal-ghost-switcher > .fractal-ghost {
2022
+ width: 76px;
2023
+ height: 32px;
2024
+ border-radius: calc(var(--radius-md) - 2px);
2025
+ }
2026
+ .fractal-ghost-disclosure {
2027
+ display: flex;
2028
+ align-items: center;
2029
+ gap: var(--space-3);
2030
+ padding: var(--space-3) 0;
2031
+ border-bottom: 1px solid var(--border-subtle);
2032
+ }
2033
+ .fractal-ghost-disclosure__icon {
2034
+ width: 16px;
2035
+ height: 16px;
2036
+ border-radius: var(--radius-full);
2037
+ }
2038
+ .fractal-ghost-pagination {
2039
+ display: flex;
2040
+ gap: var(--space-2);
2041
+ }
2042
+ .fractal-ghost-pagination > .fractal-ghost {
2043
+ width: 32px;
2044
+ height: 32px;
2045
+ border-radius: var(--radius-md);
2046
+ }
2047
+ .fractal-ghost-dropzone {
2048
+ display: grid;
2049
+ place-items: center;
2050
+ gap: var(--space-3);
2051
+ min-height: 184px;
2052
+ padding: var(--space-6);
2053
+ border: 1px dashed var(--border-default);
2054
+ border-radius: var(--radius-md);
2055
+ }
2056
+ .fractal-ghost-dropzone__icon {
2057
+ width: 32px;
2058
+ height: 32px;
2059
+ border-radius: var(--radius-full);
2060
+ }
2061
+ .fractal-ghost-prompt-card {
2062
+ min-height: 176px;
2063
+ }
2064
+ .fractal-ghost-conversation {
2065
+ display: flex;
2066
+ width: 100%;
2067
+ min-width: 0;
2068
+ flex-direction: column;
2069
+ gap: var(--space-6);
2070
+ }
2071
+ .fractal-ghost-conversation__message {
2072
+ display: grid;
2073
+ width: min(92%, 42rem);
2074
+ min-width: 0;
2075
+ gap: var(--space-2);
2076
+ }
2077
+ .fractal-ghost-conversation__message--user {
2078
+ width: min(78%, 36rem);
2079
+ align-self: flex-end;
2080
+ }
2081
+ .fractal-ghost-conversation__bubble {
2082
+ --fractal-ghost-base: color-mix(in srgb, var(--accent-text) 12%, transparent);
2083
+ --fractal-ghost-shine: color-mix(in srgb, var(--accent-text) 5%, transparent);
2084
+ display: grid;
2085
+ gap: var(--space-2);
2086
+ padding: var(--space-4);
2087
+ border: 1px solid var(--accent-surface-stroke);
2088
+ border-radius: 12px 12px 4px;
2089
+ background: var(--accent-surface-stroke);
2090
+ }
2091
+ .fractal-ghost-sidebar {
2092
+ display: grid;
2093
+ align-content: start;
2094
+ gap: var(--space-7);
2095
+ width: 248px;
2096
+ min-height: 100%;
2097
+ padding: var(--space-5);
2098
+ border-right: 1px solid var(--border-subtle);
2099
+ background: var(--bg-canvas);
2100
+ }
2101
+ .fractal-ghost-sidebar__brand {
2102
+ width: 112px;
2103
+ height: 24px;
2104
+ }
2105
+ .fractal-ghost-sidebar__items {
2106
+ display: grid;
2107
+ gap: var(--space-2);
2108
+ }
2109
+ .fractal-ghost-sidebar__item {
2110
+ display: flex;
2111
+ align-items: center;
2112
+ gap: var(--space-3);
2113
+ height: 36px;
2114
+ padding: 0 var(--space-2);
2115
+ }
2116
+ .fractal-ghost-sidebar__item > .fractal-ghost {
2117
+ width: 16px;
2118
+ height: 16px;
2119
+ border-radius: var(--radius-sm);
2120
+ }
2121
+ .fractal-ghost-surface {
2122
+ display: grid;
2123
+ gap: var(--space-5);
2124
+ padding: var(--space-6);
2125
+ border: 1px solid var(--border-subtle);
2126
+ border-radius: var(--radius-lg);
2127
+ background: var(--bg-canvas);
2128
+ }
2129
+ .fractal-ghost-modal {
2130
+ width: min(100%, 420px);
2131
+ }
2132
+ .fractal-ghost-side-panel {
2133
+ width: min(100%, 540px);
2134
+ min-height: 480px;
2135
+ }
2136
+ .fractal-ghost-surface__header {
2137
+ display: flex;
2138
+ align-items: center;
2139
+ justify-content: space-between;
2140
+ }
2141
+ .fractal-ghost-surface__close {
2142
+ width: 28px;
2143
+ height: 28px;
2144
+ border-radius: var(--radius-md);
2145
+ }
2146
+ .fractal-ghost-surface__title {
2147
+ color: var(--fg-secondary);
2148
+ font-size: 0.75rem;
2149
+ }
2150
+ @keyframes fractal-ghost-shine {
2151
+ from {
2152
+ background-position: 110% 0;
2153
+ }
2154
+ to {
2155
+ background-position: -110% 0;
2156
+ }
2157
+ }
2158
+ @media (prefers-reduced-motion: reduce) {
2159
+ .fractal-ghost {
2160
+ animation: none;
2161
+ background: var(--fractal-ghost-base);
2162
+ }
2163
+ }
2164
+
2165
+ /* src/components/Sidebar/Sidebar.css */
2166
+ .fractal-sidebar {
2167
+ --fractal-sidebar-width: 232px;
2168
+ --fractal-sidebar-compact-width: 56px;
2169
+ box-sizing: border-box;
2170
+ display: flex;
2171
+ width: var(--fractal-sidebar-width);
2172
+ min-width: var(--fractal-sidebar-width);
2173
+ min-height: 100%;
2174
+ flex-direction: column;
2175
+ background: var(--bg-surface-1);
2176
+ border-right: 1px solid var(--nav-border);
2177
+ color: var(--fg-primary);
2178
+ font-family: var(--font-sans);
2179
+ }
2180
+ .fractal-sidebar[data-compact] {
2181
+ z-index: 10;
2182
+ width: var(--fractal-sidebar-compact-width);
2183
+ min-width: var(--fractal-sidebar-compact-width);
2184
+ overflow: hidden;
2185
+ transition:
2186
+ width var(--duration-normal) var(--ease-out),
2187
+ min-width var(--duration-normal) var(--ease-out),
2188
+ box-shadow var(--duration-normal) var(--ease-out);
2189
+ }
2190
+ .fractal-sidebar[data-compact]:hover,
2191
+ .fractal-sidebar[data-compact]:focus-within {
2192
+ width: var(--fractal-sidebar-width);
2193
+ min-width: var(--fractal-sidebar-width);
2194
+ box-shadow: var(--shadow-md);
2195
+ }
2196
+ .fractal-sidebar__header {
2197
+ display: flex;
2198
+ min-height: 48px;
2199
+ align-items: center;
2200
+ padding: var(--space-2);
2201
+ border-bottom: 1px solid var(--border-subtle);
2202
+ }
2203
+ .fractal-sidebar__brand {
2204
+ display: inline-flex;
2205
+ min-width: 0;
2206
+ align-items: center;
2207
+ gap: var(--space-2);
2208
+ padding: var(--space-1);
2209
+ border: 0;
2210
+ border-radius: var(--radius-md);
2211
+ background: transparent;
2212
+ color: var(--fg-primary);
2213
+ cursor: pointer;
2214
+ font: inherit;
2215
+ text-align: left;
2216
+ transition: background-color var(--duration-fast) var(--ease-out), transform var(--duration-fast) var(--ease-out);
2217
+ }
2218
+ .fractal-sidebar__brand:hover {
2219
+ background: var(--nav-hover);
2220
+ }
2221
+ .fractal-sidebar__brand:active {
2222
+ transform: scale(0.98);
2223
+ }
2224
+ .fractal-sidebar__brand:focus-visible,
2225
+ .fractal-sidebar__nav-item:focus-visible,
2226
+ .fractal-sidebar__account-trigger:focus-visible {
2227
+ outline: 2px solid var(--border-focus);
2228
+ outline-offset: 2px;
2229
+ }
2230
+ .fractal-sidebar__account {
2231
+ display: block;
2232
+ width: 100%;
2233
+ }
2234
+ .fractal-sidebar__account-trigger {
2235
+ width: 100%;
2236
+ min-height: 36px;
2237
+ box-sizing: border-box;
2238
+ gap: var(--space-2);
2239
+ padding: 8px 10px;
2240
+ border: 0;
2241
+ background: transparent;
2242
+ border-radius: var(--radius-md);
2243
+ color: var(--fg-primary);
2244
+ font-weight: 500;
2245
+ }
2246
+ .fractal-sidebar__account-trigger:hover,
2247
+ .fractal-sidebar__account-trigger.fractal-dropdown-trigger--tertiary:hover {
2248
+ background: var(--nav-hover);
2249
+ }
2250
+ .fractal-sidebar__account-name {
2251
+ min-width: 0;
2252
+ flex: 1;
2253
+ overflow: hidden;
2254
+ text-overflow: ellipsis;
2255
+ white-space: nowrap;
2256
+ }
2257
+ .fractal-sidebar__account-icon {
2258
+ display: inline-flex;
2259
+ width: 18px;
2260
+ height: 18px;
2261
+ flex: 0 0 18px;
2262
+ align-items: center;
2263
+ justify-content: center;
2264
+ }
2265
+ .fractal-sidebar__account-icon > img,
2266
+ .fractal-sidebar__account-icon > svg {
2267
+ display: block;
2268
+ width: 18px;
2269
+ height: 18px;
2270
+ }
2271
+ .fractal-sidebar__account-panel {
2272
+ min-width: 100%;
2273
+ }
2274
+ .fractal-sidebar__nav {
2275
+ display: flex;
2276
+ flex: 1;
2277
+ flex-direction: column;
2278
+ gap: 0;
2279
+ overflow-y: auto;
2280
+ padding: var(--space-2);
2281
+ }
2282
+ .fractal-sidebar__section {
2283
+ display: flex;
2284
+ flex-direction: column;
2285
+ gap: 1px;
2286
+ }
2287
+ .fractal-sidebar__section + .fractal-sidebar__section {
2288
+ position: relative;
2289
+ margin-top: var(--space-2);
2290
+ padding-top: var(--space-2);
2291
+ }
2292
+ .fractal-sidebar__section + .fractal-sidebar__section::before {
2293
+ position: absolute;
2294
+ top: 0;
2295
+ right: var(--space-2);
2296
+ left: var(--space-2);
2297
+ height: 1px;
2298
+ background: var(--border-subtle);
2299
+ content: "";
2300
+ }
2301
+ .fractal-sidebar__nav-item {
2302
+ display: flex;
2303
+ width: 100%;
2304
+ min-height: 36px;
2305
+ align-items: center;
2306
+ gap: 10px;
2307
+ padding: 8px 10px;
1230
2308
  border: 0;
1231
2309
  border-radius: var(--radius-md);
1232
2310
  background: transparent;
@@ -1284,40 +2362,13 @@
1284
2362
  border-top: 1px solid var(--border-subtle);
1285
2363
  }
1286
2364
  @media (prefers-reduced-motion: reduce) {
2365
+ .fractal-sidebar[data-compact],
1287
2366
  .fractal-sidebar__brand,
1288
2367
  .fractal-sidebar__nav-item {
1289
2368
  transition: none;
1290
2369
  }
1291
2370
  }
1292
2371
 
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
- flex-wrap: wrap;
1300
- gap: var(--space-5);
1301
- color: var(--fg-primary);
1302
- font-family: var(--font-sans);
1303
- }
1304
- .fractal-page-header__content {
1305
- min-width: 0;
1306
- }
1307
- .fractal-page-header__title {
1308
- margin: 0;
1309
- color: var(--fg-primary);
1310
- font-size: 1rem;
1311
- font-weight: 500;
1312
- line-height: 1.4;
1313
- }
1314
- .fractal-page-header__actions {
1315
- display: flex;
1316
- flex: 0 0 auto;
1317
- align-items: center;
1318
- gap: var(--space-2);
1319
- }
1320
-
1321
2372
  /* src/components/SidePanel/SidePanel.css */
1322
2373
  .fractal-side-panel-overlay {
1323
2374
  position: fixed;
@@ -1326,6 +2377,7 @@
1326
2377
  display: flex;
1327
2378
  justify-content: flex-end;
1328
2379
  background: color-mix(in srgb, var(--fg-primary) 16%, transparent);
2380
+ animation: fractal-side-panel-overlay-in 180ms ease-out both;
1329
2381
  }
1330
2382
  .fractal-side-panel {
1331
2383
  display: flex;
@@ -1337,6 +2389,7 @@
1337
2389
  box-shadow: var(--shadow-lg);
1338
2390
  color: var(--fg-primary);
1339
2391
  font-family: var(--font-sans);
2392
+ animation: fractal-side-panel-in 180ms cubic-bezier(0.16, 1, 0.3, 1) both;
1340
2393
  }
1341
2394
  .fractal-side-panel--sm {
1342
2395
  width: min(100vw, 420px);
@@ -1347,19 +2400,23 @@
1347
2400
  .fractal-side-panel--lg {
1348
2401
  width: min(100vw, 680px);
1349
2402
  }
2403
+ .fractal-side-panel--xl {
2404
+ width: min(100vw, 960px);
2405
+ }
1350
2406
  .fractal-side-panel__header {
1351
2407
  display: flex;
1352
- min-height: 72px;
1353
2408
  align-items: flex-start;
1354
2409
  justify-content: space-between;
1355
2410
  gap: var(--space-4);
1356
- padding: var(--space-5) var(--space-6);
1357
- border-bottom: 1px solid var(--border-subtle);
2411
+ padding: var(--space-5) var(--space-6) var(--space-4);
1358
2412
  }
1359
2413
  .fractal-side-panel__heading {
1360
2414
  min-width: 0;
1361
2415
  }
1362
2416
  .fractal-side-panel__title {
2417
+ display: flex;
2418
+ min-height: 32px;
2419
+ align-items: center;
1363
2420
  margin: 0;
1364
2421
  font-size: 1rem;
1365
2422
  font-weight: 500;
@@ -1395,7 +2452,11 @@
1395
2452
  min-height: 0;
1396
2453
  flex: 1;
1397
2454
  overflow: auto;
1398
- padding: var(--space-6);
2455
+ padding: var(--space-2) var(--space-6) var(--space-6);
2456
+ }
2457
+ .fractal-side-panel__body--loading {
2458
+ display: grid;
2459
+ place-items: center;
1399
2460
  }
1400
2461
  .fractal-side-panel__footer {
1401
2462
  display: flex;
@@ -1409,15 +2470,37 @@
1409
2470
  width: 100%;
1410
2471
  }
1411
2472
  .fractal-side-panel__header {
1412
- padding: var(--space-4) var(--space-5);
2473
+ padding: var(--space-4) var(--space-5) var(--space-3);
1413
2474
  }
1414
2475
  .fractal-side-panel__body {
1415
- padding: var(--space-5);
2476
+ padding: var(--space-2) var(--space-5) var(--space-5);
1416
2477
  }
1417
2478
  .fractal-side-panel__footer {
1418
2479
  padding: var(--space-3) var(--space-5);
1419
2480
  }
1420
2481
  }
2482
+ @keyframes fractal-side-panel-overlay-in {
2483
+ from {
2484
+ opacity: 0;
2485
+ }
2486
+ to {
2487
+ opacity: 1;
2488
+ }
2489
+ }
2490
+ @keyframes fractal-side-panel-in {
2491
+ from {
2492
+ transform: translateX(100%);
2493
+ }
2494
+ to {
2495
+ transform: translateX(0);
2496
+ }
2497
+ }
2498
+ @media (prefers-reduced-motion: reduce) {
2499
+ .fractal-side-panel-overlay,
2500
+ .fractal-side-panel {
2501
+ animation-duration: 0.01ms;
2502
+ }
2503
+ }
1421
2504
 
1422
2505
  /* src/components/Textarea/Textarea.css */
1423
2506
  .fractal-textarea {
@@ -1448,4 +2531,214 @@
1448
2531
  opacity: 0.5;
1449
2532
  background: var(--bg-surface-1);
1450
2533
  }
2534
+
2535
+ /* src/components/TextButton/TextButton.css */
2536
+ .fractal-text-button {
2537
+ display: inline-flex;
2538
+ align-items: center;
2539
+ gap: var(--space-1);
2540
+ border: 0;
2541
+ background: transparent;
2542
+ cursor: pointer;
2543
+ font-family: var(--font-sans);
2544
+ font-weight: 500;
2545
+ line-height: 1.4;
2546
+ padding: 0;
2547
+ text-align: left;
2548
+ transition: color 120ms ease;
2549
+ }
2550
+ .fractal-text-button--primary {
2551
+ color: var(--fg-primary);
2552
+ }
2553
+ .fractal-text-button--primary:hover:not(:disabled) {
2554
+ color: var(--fg-secondary);
2555
+ }
2556
+ .fractal-text-button--secondary {
2557
+ color: var(--fg-secondary);
2558
+ }
2559
+ .fractal-text-button--secondary:hover:not(:disabled) {
2560
+ color: var(--fg-primary);
2561
+ }
2562
+ .fractal-text-button:focus-visible {
2563
+ outline: 2px solid var(--border-focus);
2564
+ outline-offset: 3px;
2565
+ border-radius: var(--radius-sm);
2566
+ }
2567
+ .fractal-text-button:disabled {
2568
+ cursor: not-allowed;
2569
+ opacity: 0.5;
2570
+ }
2571
+ .fractal-text-button--sm {
2572
+ font-size: 0.8125rem;
2573
+ }
2574
+ .fractal-text-button--md {
2575
+ font-size: 0.875rem;
2576
+ }
2577
+ .fractal-text-button__icon {
2578
+ display: inline-grid;
2579
+ place-items: center;
2580
+ }
2581
+
2582
+ /* src/components/FileDropzone/FileDropzone.css */
2583
+ .fractal-file-dropzone {
2584
+ display: grid;
2585
+ gap: var(--space-2);
2586
+ color: var(--fg-primary);
2587
+ font-family: var(--font-sans);
2588
+ }
2589
+ .fractal-file-dropzone__input {
2590
+ display: none;
2591
+ }
2592
+ .fractal-file-dropzone__target {
2593
+ display: flex;
2594
+ width: 100%;
2595
+ min-height: 92px;
2596
+ align-items: center;
2597
+ justify-content: center;
2598
+ gap: var(--space-3);
2599
+ border: 1px dashed var(--border-default);
2600
+ border-radius: var(--radius-md);
2601
+ background: var(--bg-canvas);
2602
+ color: var(--fg-secondary);
2603
+ cursor: pointer;
2604
+ padding: var(--space-4);
2605
+ text-align: left;
2606
+ }
2607
+ .fractal-file-dropzone__target:hover,
2608
+ .fractal-file-dropzone__target[data-dragging] {
2609
+ border-color: var(--border-focus);
2610
+ background: var(--hover-surface);
2611
+ color: var(--fg-primary);
2612
+ }
2613
+ .fractal-file-dropzone__target:focus-visible {
2614
+ outline: 2px solid var(--border-focus);
2615
+ outline-offset: 2px;
2616
+ }
2617
+ .fractal-file-dropzone__target:disabled {
2618
+ cursor: not-allowed;
2619
+ opacity: 0.5;
2620
+ }
2621
+ .fractal-file-dropzone__copy {
2622
+ display: grid;
2623
+ gap: var(--space-1);
2624
+ }
2625
+ .fractal-file-dropzone__title {
2626
+ font-size: 0.875rem;
2627
+ font-weight: 500;
2628
+ line-height: 1.4;
2629
+ }
2630
+ .fractal-file-dropzone__description {
2631
+ color: var(--fg-secondary);
2632
+ font-size: 0.8125rem;
2633
+ line-height: 1.4;
2634
+ }
2635
+ .fractal-file-dropzone__files {
2636
+ display: grid;
2637
+ gap: var(--space-1);
2638
+ margin: 0;
2639
+ padding: 0;
2640
+ list-style: none;
2641
+ }
2642
+ .fractal-file-dropzone__file {
2643
+ display: flex;
2644
+ min-width: 0;
2645
+ align-items: center;
2646
+ gap: var(--space-2);
2647
+ padding: var(--space-2) var(--space-3);
2648
+ border: 1px solid var(--border-subtle);
2649
+ border-radius: var(--radius-md);
2650
+ background: var(--bg-canvas);
2651
+ font-size: 0.8125rem;
2652
+ line-height: 1.4;
2653
+ }
2654
+ .fractal-file-dropzone__file-name {
2655
+ min-width: 0;
2656
+ flex: 1;
2657
+ overflow: hidden;
2658
+ text-overflow: ellipsis;
2659
+ white-space: nowrap;
2660
+ }
2661
+ .fractal-file-dropzone__file-meta {
2662
+ color: var(--fg-secondary);
2663
+ white-space: nowrap;
2664
+ }
2665
+ .fractal-file-dropzone__remove {
2666
+ display: grid;
2667
+ width: 24px;
2668
+ height: 24px;
2669
+ flex: 0 0 auto;
2670
+ place-items: center;
2671
+ border: 0;
2672
+ border-radius: var(--radius-sm);
2673
+ background: transparent;
2674
+ color: var(--fg-secondary);
2675
+ cursor: pointer;
2676
+ }
2677
+ .fractal-file-dropzone__remove:hover {
2678
+ background: var(--hover-surface);
2679
+ color: var(--fg-primary);
2680
+ }
2681
+ .fractal-file-dropzone__remove:focus-visible {
2682
+ outline: 2px solid var(--border-focus);
2683
+ outline-offset: 1px;
2684
+ }
2685
+ .fractal-file-dropzone__remove:disabled {
2686
+ cursor: not-allowed;
2687
+ opacity: 0.5;
2688
+ }
2689
+
2690
+ /* src/components/Pagination/Pagination.css */
2691
+ .fractal-pagination {
2692
+ display: flex;
2693
+ align-items: center;
2694
+ justify-content: space-between;
2695
+ gap: var(--space-3);
2696
+ color: var(--fg-secondary);
2697
+ font-family: var(--font-sans);
2698
+ font-size: 0.8125rem;
2699
+ line-height: 1.4;
2700
+ }
2701
+ .fractal-pagination__controls {
2702
+ display: flex;
2703
+ align-items: center;
2704
+ gap: var(--space-2);
2705
+ }
2706
+ .fractal-pagination__page-size .fractal-dropdown-trigger {
2707
+ padding: 4px 0;
2708
+ border: 0;
2709
+ background: transparent;
2710
+ color: var(--fg-secondary);
2711
+ }
2712
+ .fractal-pagination__page-size .fractal-dropdown-trigger:hover {
2713
+ background: transparent;
2714
+ color: var(--fg-primary);
2715
+ }
2716
+ .fractal-pagination__button {
2717
+ display: grid;
2718
+ width: 28px;
2719
+ height: 28px;
2720
+ place-items: center;
2721
+ border: 1px solid var(--border-default);
2722
+ border-radius: var(--radius-sm);
2723
+ background: var(--bg-canvas);
2724
+ color: var(--fg-secondary);
2725
+ cursor: pointer;
2726
+ }
2727
+ .fractal-pagination__button:hover:not(:disabled) {
2728
+ background: var(--hover-surface);
2729
+ color: var(--fg-primary);
2730
+ }
2731
+ .fractal-pagination__button:focus-visible {
2732
+ outline: 2px solid var(--border-focus);
2733
+ outline-offset: 2px;
2734
+ }
2735
+ .fractal-pagination__button:disabled {
2736
+ cursor: not-allowed;
2737
+ opacity: 0.45;
2738
+ }
2739
+ .fractal-pagination__page {
2740
+ min-width: 44px;
2741
+ text-align: center;
2742
+ white-space: nowrap;
2743
+ }
1451
2744
  /*# sourceMappingURL=index.css.map */