@mirror-physics/fractal-ui 0.2.0-next.7 → 0.2.0-next.71

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,137 @@
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
+ display: none;
552
+ -webkit-appearance: none;
553
+ appearance: none;
554
+ }
555
+
556
+ /* src/components/NumberInput/NumberInput.css */
557
+ .fractal-number-input {
558
+ position: relative;
559
+ width: 100%;
560
+ height: 40px;
561
+ align-self: start;
562
+ }
563
+ .fractal-number-input .fractal-input {
564
+ padding-right: calc(80px + var(--space-3, 12px));
565
+ appearance: textfield;
566
+ }
567
+ .fractal-number-input .fractal-input::-webkit-inner-spin-button,
568
+ .fractal-number-input .fractal-input::-webkit-outer-spin-button {
569
+ margin: 0;
570
+ appearance: none;
571
+ }
572
+ .fractal-number-input-controls {
573
+ position: absolute;
574
+ top: 1px;
575
+ right: 1px;
576
+ bottom: 1px;
577
+ display: flex;
578
+ align-items: stretch;
579
+ overflow: hidden;
580
+ border-radius: 0 calc(var(--radius-sm, 4px) - 1px) calc(var(--radius-sm, 4px) - 1px) 0;
581
+ background: var(--bg-canvas);
582
+ }
583
+ .fractal-number-input-unit {
584
+ position: absolute;
585
+ top: 50%;
586
+ color: var(--fg-secondary);
587
+ font-size: 0.875rem;
588
+ line-height: 1;
589
+ pointer-events: none;
590
+ transform: translateY(-50%);
591
+ user-select: none;
592
+ }
593
+ .fractal-number-input-step {
594
+ display: grid;
595
+ width: 40px;
596
+ place-items: center;
597
+ padding: 0;
598
+ border: 0;
599
+ border-left: 1px solid var(--border-subtle);
600
+ background: transparent;
601
+ color: var(--fg-tertiary);
602
+ cursor: pointer;
603
+ }
604
+ .fractal-number-input-step:hover:not(:disabled) {
605
+ background: var(--bg-surface-1);
606
+ color: var(--fg-primary);
607
+ }
608
+ .fractal-number-input-step:focus-visible {
609
+ position: relative;
610
+ z-index: 1;
611
+ outline: 2px solid var(--border-focus);
612
+ outline-offset: -2px;
613
+ }
614
+ .fractal-number-input-step:disabled {
615
+ color: var(--fg-disabled);
616
+ cursor: not-allowed;
617
+ }
618
+
619
+ /* src/components/PasswordInput/PasswordInput.css */
620
+ .fractal-password-input {
621
+ position: relative;
622
+ width: 100%;
623
+ height: 40px;
624
+ align-self: start;
625
+ }
626
+ .fractal-password-input-field {
627
+ padding-right: calc(40px + var(--space-2, 8px));
628
+ }
629
+ .fractal-password-input-toggle {
630
+ position: absolute;
631
+ top: 4px;
632
+ right: 4px;
633
+ display: grid;
634
+ width: 32px;
635
+ height: 32px;
636
+ place-items: center;
637
+ padding: 0;
638
+ border: 0;
639
+ border-radius: var(--radius-sm, 4px);
640
+ background: transparent;
641
+ color: var(--fg-secondary);
642
+ cursor: pointer;
643
+ transition: background-color 150ms ease, color 150ms ease;
644
+ }
645
+ .fractal-password-input-toggle:hover:not(:disabled) {
646
+ background: var(--hover-canvas, var(--bg-surface-1));
647
+ color: var(--fg-primary);
648
+ }
649
+ .fractal-password-input-toggle:focus-visible {
650
+ outline: 2px solid var(--border-focus);
651
+ outline-offset: -2px;
652
+ }
653
+ .fractal-password-input-toggle:disabled {
654
+ color: var(--fg-disabled);
655
+ cursor: not-allowed;
656
+ opacity: 0.5;
657
+ }
658
+ @media (prefers-reduced-motion: reduce) {
659
+ .fractal-password-input-toggle {
660
+ transition-duration: 0.01ms;
661
+ }
662
+ }
663
+
372
664
  /* src/components/Label/Label.css */
373
665
  .fractal-label {
374
666
  font-size: 0.875rem;
@@ -401,9 +693,11 @@
401
693
  height: 18px;
402
694
  font-size: 0.75rem;
403
695
  font-weight: 600;
404
- border-radius: 50%;
405
696
  margin-top: 1px;
406
697
  }
698
+ .fractal-alert-icon svg {
699
+ display: block;
700
+ }
407
701
  .fractal-alert-content {
408
702
  flex: 1;
409
703
  min-width: 0;
@@ -415,53 +709,49 @@
415
709
  line-height: 1.4;
416
710
  }
417
711
  .fractal-alert-description {
712
+ color: var(--fg-secondary);
418
713
  font-size: 0.875rem;
419
714
  line-height: 1.5;
420
715
  }
421
716
  .fractal-alert--default {
422
717
  background-color: var(--bg-canvas);
423
- border-color: var(--border-default);
718
+ border-color: var(--border-subtle);
424
719
  color: var(--fg-primary);
425
720
  }
426
721
  .fractal-alert--default .fractal-alert-icon {
427
- background: var(--bg-surface-2);
428
722
  color: var(--fg-secondary);
429
723
  }
430
724
  .fractal-alert--info {
431
725
  background-color: var(--accent-surface);
432
- border-color: var(--accent-default);
726
+ border-color: var(--accent-surface-stroke);
433
727
  color: var(--fg-primary);
434
728
  }
435
729
  .fractal-alert--info .fractal-alert-icon {
436
- background: var(--accent-default);
437
- color: var(--fg-inverse);
730
+ color: var(--accent-default);
438
731
  }
439
732
  .fractal-alert--success {
440
733
  background-color: var(--success-surface);
441
- border-color: var(--success-default);
734
+ border-color: var(--success-surface-stroke);
442
735
  color: var(--fg-primary);
443
736
  }
444
737
  .fractal-alert--success .fractal-alert-icon {
445
- background: var(--success-default);
446
- color: var(--fg-inverse);
738
+ color: var(--success-default);
447
739
  }
448
740
  .fractal-alert--warning {
449
741
  background-color: var(--warning-surface);
450
- border-color: var(--warning-default);
742
+ border-color: var(--warning-surface-stroke);
451
743
  color: var(--fg-primary);
452
744
  }
453
745
  .fractal-alert--warning .fractal-alert-icon {
454
- background: var(--warning-default);
455
- color: var(--fg-inverse);
746
+ color: var(--warning-default);
456
747
  }
457
748
  .fractal-alert--error {
458
749
  background-color: var(--error-surface);
459
- border-color: var(--error-default);
750
+ border-color: var(--error-surface-stroke);
460
751
  color: var(--fg-primary);
461
752
  }
462
753
  .fractal-alert--error .fractal-alert-icon {
463
- background: var(--error-default);
464
- color: var(--fg-inverse);
754
+ color: var(--error-default);
465
755
  }
466
756
 
467
757
  /* src/components/Toggle/Toggle.css */
@@ -506,6 +796,60 @@
506
796
  user-select: none;
507
797
  }
508
798
 
799
+ /* src/components/UILoader/UILoader.css */
800
+ .fractal-ui-loader {
801
+ display: inline-flex;
802
+ line-height: 0;
803
+ }
804
+ .fractal-ui-loader svg {
805
+ display: block;
806
+ overflow: visible;
807
+ }
808
+ .fractal-ui-loader__stop-start {
809
+ stop-color: var(--grey-200);
810
+ }
811
+ .fractal-ui-loader__stop-end {
812
+ stop-color: var(--grey-100);
813
+ }
814
+ .fractal-ui-loader--blue .fractal-ui-loader__stop-start {
815
+ stop-color: var(--blue-500);
816
+ }
817
+ .fractal-ui-loader--blue .fractal-ui-loader__stop-end {
818
+ stop-color: var(--blue-300);
819
+ }
820
+ .fractal-ui-loader--green .fractal-ui-loader__stop-start {
821
+ stop-color: var(--green-500);
822
+ }
823
+ .fractal-ui-loader--green .fractal-ui-loader__stop-end {
824
+ stop-color: var(--green-300);
825
+ }
826
+ .fractal-ui-loader__shine-axis {
827
+ transform-box: view-box;
828
+ transform-origin: 0 0;
829
+ }
830
+ .fractal-ui-loader__shine {
831
+ animation: fractal-ui-loader-shine 2500ms var(--ease-in-out) infinite;
832
+ transform-box: view-box;
833
+ transform-origin: 0 0;
834
+ }
835
+ @keyframes fractal-ui-loader-shine {
836
+ 0%, 12% {
837
+ transform: translateX(-120px);
838
+ }
839
+ 48% {
840
+ transform: translateX(120px);
841
+ }
842
+ 49%, 100% {
843
+ transform: translateX(-120px);
844
+ }
845
+ }
846
+ @media (prefers-reduced-motion: reduce) {
847
+ .fractal-ui-loader__shine {
848
+ animation: none;
849
+ transform: translateX(0);
850
+ }
851
+ }
852
+
509
853
  /* src/components/Modal/Modal.css */
510
854
  .fractal-modal-overlay {
511
855
  position: fixed;
@@ -517,11 +861,13 @@
517
861
  z-index: 9998;
518
862
  }
519
863
  .fractal-modal-panel {
864
+ --fractal-modal-panel-padding: var(--space-6, 24px);
865
+ box-sizing: border-box;
520
866
  background: var(--bg-canvas);
521
867
  border: 1px solid var(--border-subtle);
522
868
  border-radius: var(--radius-lg, 8px);
523
869
  box-shadow: var(--shadow-lg);
524
- padding: var(--space-6, 24px);
870
+ padding: var(--fractal-modal-panel-padding);
525
871
  max-width: 90vw;
526
872
  font-family: var(--font-sans);
527
873
  }
@@ -538,6 +884,12 @@
538
884
  display: flex;
539
885
  flex-direction: column;
540
886
  }
887
+ .fractal-modal-panel--scrollable {
888
+ display: flex;
889
+ max-height: calc(100dvh - 2rem);
890
+ flex-direction: column;
891
+ padding-bottom: 0;
892
+ }
541
893
  .fractal-modal-panel--danger {
542
894
  border-color: var(--error-subtle);
543
895
  }
@@ -550,6 +902,29 @@
550
902
  align-items: center;
551
903
  margin-bottom: var(--space-4, 16px);
552
904
  }
905
+ .fractal-modal-title-row--scrollable {
906
+ position: relative;
907
+ box-sizing: border-box;
908
+ width: calc(100% + var(--fractal-modal-panel-padding) + var(--fractal-modal-panel-padding));
909
+ flex: 0 0 auto;
910
+ margin: 0 calc(0px - var(--fractal-modal-panel-padding));
911
+ padding: 0 var(--fractal-modal-panel-padding) var(--space-4, 16px);
912
+ }
913
+ .fractal-modal-title-row--scrollable::after {
914
+ position: absolute;
915
+ right: 0;
916
+ bottom: 0;
917
+ left: 0;
918
+ height: 1px;
919
+ background: var(--border-subtle);
920
+ content: "";
921
+ opacity: 0;
922
+ pointer-events: none;
923
+ transition: opacity 160ms ease;
924
+ }
925
+ .fractal-modal-title-row--scrolled::after {
926
+ opacity: 1;
927
+ }
553
928
  .fractal-modal-title {
554
929
  margin: 0;
555
930
  font-size: 1rem;
@@ -576,24 +951,55 @@
576
951
  color: var(--fg-primary);
577
952
  background: var(--bg-surface-1);
578
953
  }
954
+ .fractal-modal-close:disabled {
955
+ cursor: not-allowed;
956
+ opacity: 0.4;
957
+ }
958
+ .fractal-modal-close:disabled:hover {
959
+ color: var(--fg-secondary);
960
+ background: none;
961
+ }
579
962
  .fractal-modal-body {
580
963
  font-size: 0.875rem;
581
964
  color: var(--fg-secondary);
582
965
  }
966
+ .fractal-modal-body--loading {
967
+ display: grid;
968
+ min-height: 168px;
969
+ place-items: center;
970
+ }
583
971
  .fractal-modal-body--lg {
584
972
  flex: 1;
585
973
  min-height: 0;
586
974
  overflow: hidden;
587
975
  }
976
+ .fractal-modal-body--scrollable {
977
+ box-sizing: border-box;
978
+ width: calc(100% + var(--fractal-modal-panel-padding) + var(--fractal-modal-panel-padding));
979
+ min-height: 0;
980
+ margin-inline: calc(0px - var(--fractal-modal-panel-padding));
981
+ overflow-y: auto;
982
+ overscroll-behavior: contain;
983
+ padding-inline: var(--fractal-modal-panel-padding);
984
+ }
588
985
  .fractal-modal-footer {
589
986
  display: flex;
590
987
  justify-content: flex-end;
591
988
  gap: var(--space-2, 8px);
592
989
  margin-top: var(--space-4, 16px);
593
990
  }
594
-
595
- /* src/components/DataTable/DataTable.css */
596
- .fractal-datatable {
991
+ .fractal-modal-footer--divided {
992
+ box-sizing: border-box;
993
+ width: calc(100% + var(--fractal-modal-panel-padding) + var(--fractal-modal-panel-padding));
994
+ flex: 0 0 auto;
995
+ margin-top: 0;
996
+ margin-inline: calc(0px - var(--fractal-modal-panel-padding));
997
+ padding: var(--space-4, 16px) var(--fractal-modal-panel-padding);
998
+ border-top: 1px solid var(--border-subtle);
999
+ }
1000
+
1001
+ /* src/components/DataTable/DataTable.css */
1002
+ .fractal-datatable {
597
1003
  font-family: var(--font-sans);
598
1004
  font-size: 0.875rem;
599
1005
  }
@@ -639,9 +1045,6 @@
639
1045
  border-bottom: 1px solid var(--border-subtle);
640
1046
  vertical-align: middle;
641
1047
  }
642
- .fractal-datatable-th + .fractal-datatable-th {
643
- border-left: 1px solid var(--border-subtle);
644
- }
645
1048
  .fractal-datatable-row {
646
1049
  background: var(--bg-canvas);
647
1050
  transition: background 120ms ease;
@@ -656,8 +1059,8 @@
656
1059
  vertical-align: top;
657
1060
  overflow-wrap: anywhere;
658
1061
  }
659
- .fractal-datatable-td + .fractal-datatable-td {
660
- border-left: 1px solid var(--border-subtle);
1062
+ .fractal-datatable-td .fractal-dropdown-trigger--icon-only.fractal-dropdown-trigger--tertiary:hover {
1063
+ background: var(--bg-canvas);
661
1064
  }
662
1065
  .fractal-datatable-row + .fractal-datatable-row .fractal-datatable-td {
663
1066
  border-top: 1px solid var(--border-subtle);
@@ -700,6 +1103,32 @@
700
1103
  padding: 4px 8px;
701
1104
  font-size: 0.75rem;
702
1105
  }
1106
+ .fractal-dropdown-trigger--vertical {
1107
+ flex-direction: column;
1108
+ justify-content: flex-start;
1109
+ }
1110
+ .fractal-dropdown-trigger--vertical .fractal-dropdown-selected-text {
1111
+ writing-mode: vertical-rl;
1112
+ transform: rotate(180deg);
1113
+ }
1114
+ .fractal-dropdown-trigger--vertical .fractal-dropdown-icon--trigger {
1115
+ writing-mode: vertical-rl;
1116
+ transform: rotate(180deg);
1117
+ }
1118
+ .fractal-dropdown-trigger--vertical .fractal-dropdown-chevron {
1119
+ order: -1;
1120
+ margin: 0 0 auto;
1121
+ }
1122
+ .fractal-dropdown-trigger--icon-only {
1123
+ width: 32px;
1124
+ height: 32px;
1125
+ justify-content: center;
1126
+ padding: 0;
1127
+ }
1128
+ .fractal-dropdown-trigger--icon-only.fractal-dropdown-trigger--sm {
1129
+ width: 28px;
1130
+ height: 28px;
1131
+ }
703
1132
  .fractal-dropdown-trigger--tertiary {
704
1133
  border-color: transparent;
705
1134
  background: transparent;
@@ -708,6 +1137,17 @@
708
1137
  .fractal-dropdown-trigger--tertiary:hover {
709
1138
  background: var(--bg-surface-1);
710
1139
  }
1140
+ .fractal-dropdown-trigger:disabled,
1141
+ .fractal-dropdown-trigger:disabled:hover {
1142
+ color: var(--fg-disabled);
1143
+ cursor: not-allowed;
1144
+ background: var(--bg-surface-1);
1145
+ }
1146
+ .fractal-dropdown-trigger:disabled .fractal-dropdown-selected-text,
1147
+ .fractal-dropdown-trigger:disabled .fractal-dropdown-chevron,
1148
+ .fractal-dropdown-trigger:disabled .fractal-dropdown-icon {
1149
+ color: var(--fg-disabled);
1150
+ }
711
1151
  .fractal-dropdown-trigger:focus-visible {
712
1152
  outline: none;
713
1153
  box-shadow: 0 0 0 2px var(--bg-canvas), 0 0 0 4px var(--border-focus);
@@ -731,12 +1171,15 @@
731
1171
  .fractal-dropdown-chevron {
732
1172
  display: flex;
733
1173
  flex-shrink: 0;
1174
+ margin-left: auto;
734
1175
  color: var(--fg-secondary);
735
1176
  }
736
1177
  .fractal-dropdown-panel {
737
1178
  position: absolute;
738
1179
  z-index: 999999;
1180
+ min-width: 100%;
739
1181
  overflow: hidden;
1182
+ box-sizing: border-box;
740
1183
  border-radius: var(--radius-md, 6px);
741
1184
  border: 1px solid var(--border-subtle);
742
1185
  background: var(--bg-canvas);
@@ -755,6 +1198,7 @@
755
1198
  .fractal-dropdown-option {
756
1199
  display: flex;
757
1200
  width: 100%;
1201
+ box-sizing: border-box;
758
1202
  align-items: center;
759
1203
  gap: 8px;
760
1204
  padding: 6px 8px;
@@ -778,7 +1222,7 @@
778
1222
  }
779
1223
  .fractal-dropdown-option:hover,
780
1224
  .fractal-dropdown-option:focus-visible {
781
- background: var(--hover-canvas, var(--bg-surface-2));
1225
+ background: var(--hover-surface, var(--bg-surface-2));
782
1226
  outline: none;
783
1227
  }
784
1228
  .fractal-dropdown-separator {
@@ -874,6 +1318,43 @@
874
1318
  color: var(--accent-default);
875
1319
  }
876
1320
 
1321
+ /* src/components/Checkbox/Checkbox.css */
1322
+ .fractal-checkbox {
1323
+ display: grid;
1324
+ width: 28px;
1325
+ height: 28px;
1326
+ place-items: center;
1327
+ padding: 0;
1328
+ border: 0;
1329
+ border-radius: var(--radius-sm);
1330
+ background: transparent;
1331
+ color: var(--fg-secondary);
1332
+ cursor: pointer;
1333
+ }
1334
+ .fractal-checkbox:hover:not(:disabled) {
1335
+ background: var(--hover-canvas);
1336
+ color: var(--fg-primary);
1337
+ }
1338
+ .fractal-checkbox--checked {
1339
+ color: var(--fg-primary);
1340
+ }
1341
+ .fractal-checkbox__indeterminate-icon {
1342
+ position: relative;
1343
+ display: grid;
1344
+ place-items: center;
1345
+ }
1346
+ .fractal-checkbox__indeterminate-mark {
1347
+ position: absolute;
1348
+ }
1349
+ .fractal-checkbox:focus-visible {
1350
+ outline: 2px solid var(--border-focus);
1351
+ outline-offset: 2px;
1352
+ }
1353
+ .fractal-checkbox:disabled {
1354
+ cursor: not-allowed;
1355
+ color: var(--fg-disabled);
1356
+ }
1357
+
877
1358
  /* src/components/SortableTable/SortableTable.css */
878
1359
  .fractal-sortable-table {
879
1360
  font-family: var(--font-sans);
@@ -885,6 +1366,11 @@
885
1366
  border-radius: var(--radius-md, 6px);
886
1367
  background: var(--bg-canvas);
887
1368
  }
1369
+ .fractal-sortable-table--embedded .fractal-sortable-table-surface {
1370
+ border: 0;
1371
+ border-top: 1px solid var(--border-subtle);
1372
+ border-radius: 0;
1373
+ }
888
1374
  .fractal-sortable-table-header {
889
1375
  display: flex;
890
1376
  align-items: center;
@@ -922,9 +1408,6 @@
922
1408
  vertical-align: middle;
923
1409
  white-space: nowrap;
924
1410
  }
925
- .fractal-sortable-table-th + .fractal-sortable-table-th {
926
- border-left: 1px solid var(--border-subtle);
927
- }
928
1411
  .fractal-sortable-table-th--sortable {
929
1412
  padding: 0;
930
1413
  }
@@ -980,6 +1463,73 @@
980
1463
  .fractal-sortable-table-row--interactive {
981
1464
  cursor: pointer;
982
1465
  }
1466
+ .fractal-sortable-table-row--disabled {
1467
+ background: var(--bg-surface-1);
1468
+ opacity: 0.55;
1469
+ }
1470
+ .fractal-sortable-table-row--disabled:hover {
1471
+ background: var(--bg-surface-1);
1472
+ }
1473
+ .fractal-sortable-table-selection-cell {
1474
+ position: relative;
1475
+ width: 52px;
1476
+ min-width: 52px;
1477
+ padding: 0 !important;
1478
+ }
1479
+ .fractal-sortable-table-selection-cell > .fractal-checkbox {
1480
+ position: absolute;
1481
+ inset: 0;
1482
+ width: 100%;
1483
+ height: 100%;
1484
+ border-radius: 0;
1485
+ }
1486
+ .fractal-sortable-table-selection-cell > .fractal-checkbox:hover:not(:disabled) {
1487
+ background: var(--hover-surface);
1488
+ }
1489
+ .fractal-sortable-table-selection-cell > .fractal-checkbox:focus-visible {
1490
+ outline-offset: -2px;
1491
+ }
1492
+ .fractal-sortable-table-td--row-action {
1493
+ position: relative;
1494
+ }
1495
+ .fractal-sortable-table-td .fractal-dropdown-trigger--icon-only.fractal-dropdown-trigger--tertiary:hover {
1496
+ background: var(--bg-canvas);
1497
+ }
1498
+ .fractal-sortable-table-row-action {
1499
+ position: absolute;
1500
+ z-index: 1;
1501
+ top: 0;
1502
+ right: -1px;
1503
+ bottom: 0;
1504
+ display: flex;
1505
+ width: min(280px, calc(200% + 32px));
1506
+ align-items: center;
1507
+ justify-content: flex-end;
1508
+ padding-right: var(--space-4);
1509
+ background:
1510
+ linear-gradient(
1511
+ 90deg,
1512
+ transparent 0%,
1513
+ color-mix(in srgb, var(--hover-surface) 72%, transparent) 52%,
1514
+ var(--hover-surface) 100%);
1515
+ opacity: 0;
1516
+ pointer-events: none;
1517
+ transition: opacity 150ms ease-out;
1518
+ }
1519
+ .fractal-sortable-table-row--interactive:hover .fractal-sortable-table-row-action,
1520
+ .fractal-sortable-table-row--interactive:focus-visible .fractal-sortable-table-row-action {
1521
+ opacity: 1;
1522
+ }
1523
+ .fractal-sortable-table-row-action__icon {
1524
+ display: grid;
1525
+ width: 32px;
1526
+ height: 32px;
1527
+ place-items: center;
1528
+ border: 1px solid var(--border-default);
1529
+ border-radius: var(--radius-full);
1530
+ background: var(--bg-canvas);
1531
+ color: var(--fg-primary);
1532
+ }
983
1533
  .fractal-sortable-table-row--interactive:focus-visible {
984
1534
  position: relative;
985
1535
  z-index: 1;
@@ -1002,17 +1552,14 @@
1002
1552
  vertical-align: top;
1003
1553
  overflow-wrap: anywhere;
1004
1554
  }
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,
1555
+ .fractal-sortable-table--sm .fractal-sortable-table-th:not(.fractal-sortable-table-th--sortable),
1009
1556
  .fractal-sortable-table--sm .fractal-sortable-table-sort-button {
1010
1557
  padding: 8px 12px;
1011
1558
  }
1012
1559
  .fractal-sortable-table--sm .fractal-sortable-table-td {
1013
1560
  padding: 10px 12px;
1014
1561
  }
1015
- .fractal-sortable-table--lg .fractal-sortable-table-th,
1562
+ .fractal-sortable-table--lg .fractal-sortable-table-th:not(.fractal-sortable-table-th--sortable),
1016
1563
  .fractal-sortable-table--lg .fractal-sortable-table-sort-button {
1017
1564
  padding: 18px 24px;
1018
1565
  }
@@ -1026,17 +1573,60 @@
1026
1573
  font-size: 0.875rem;
1027
1574
  }
1028
1575
  .fractal-tabs-list {
1576
+ position: relative;
1029
1577
  display: flex;
1030
1578
  gap: 24px;
1579
+ margin-bottom: var(--space-6);
1580
+ }
1581
+ .fractal-tabs--divider > .fractal-tabs-list {
1031
1582
  border-bottom: 1px solid var(--border-subtle);
1032
- margin-bottom: 16px;
1583
+ }
1584
+ .fractal-tabs--surface > .fractal-tabs-list {
1585
+ width: 100%;
1586
+ gap: 0;
1587
+ margin-bottom: 0;
1588
+ background: var(--bg-surface-1);
1589
+ }
1590
+ .fractal-tabs--surface > .fractal-tabs-list::before {
1591
+ position: absolute;
1592
+ z-index: 3;
1593
+ right: 0;
1594
+ bottom: 0;
1595
+ left: 0;
1596
+ height: 1px;
1597
+ background: var(--border-subtle);
1598
+ content: "";
1599
+ pointer-events: none;
1600
+ }
1601
+ .fractal-tabs-list::after {
1602
+ position: absolute;
1603
+ bottom: -1px;
1604
+ left: 0;
1605
+ width: var(--fractal-tabs-indicator-width, 0px);
1606
+ height: 2px;
1607
+ background: var(--accent-default);
1608
+ content: "";
1609
+ opacity: 0;
1610
+ transform: translateX(var(--fractal-tabs-indicator-offset, 0px));
1611
+ transition:
1612
+ transform 180ms var(--ease-standard, ease),
1613
+ width 180ms var(--ease-standard, ease),
1614
+ opacity 100ms ease;
1615
+ }
1616
+ .fractal-tabs-list[data-indicator-ready=true]::after {
1617
+ opacity: 1;
1618
+ }
1619
+ .fractal-tabs--surface > .fractal-tabs-list::after {
1620
+ display: none;
1033
1621
  }
1034
1622
  .fractal-tabs-trigger {
1035
1623
  position: relative;
1036
1624
  display: inline-flex;
1625
+ min-width: 88px;
1037
1626
  align-items: center;
1627
+ justify-content: center;
1038
1628
  gap: 6px;
1039
- padding: 10px 0;
1629
+ padding: 10px 1rem;
1040
1630
  background: none;
1041
1631
  border: 0;
1042
1632
  font: inherit;
@@ -1044,8 +1634,7 @@
1044
1634
  font-weight: 400;
1045
1635
  color: var(--fg-secondary);
1046
1636
  cursor: pointer;
1047
- transition: color 0.15s ease, box-shadow 0.15s ease;
1048
- box-shadow: inset 0 -1px 0 transparent;
1637
+ transition: color 0.15s ease;
1049
1638
  margin-bottom: -1px;
1050
1639
  }
1051
1640
  .fractal-tabs-trigger:hover:not(.fractal-tabs-trigger--active):not(.fractal-tabs-trigger--disabled) {
@@ -1059,7 +1648,21 @@
1059
1648
  .fractal-tabs-trigger--active {
1060
1649
  color: var(--accent-default);
1061
1650
  font-weight: 500;
1062
- box-shadow: inset 0 -1px 0 var(--accent-default);
1651
+ }
1652
+ .fractal-tabs:not(.fractal-tabs--divider):not(.fractal-tabs--surface) > .fractal-tabs-list > .fractal-tabs-trigger:not(.fractal-tabs-trigger--active) {
1653
+ box-shadow: inset 0 -1px 0 var(--border-subtle);
1654
+ }
1655
+ .fractal-tabs--surface > .fractal-tabs-list > .fractal-tabs-trigger {
1656
+ margin-bottom: 0;
1657
+ border-right: 1px solid var(--border-subtle);
1658
+ background: var(--bg-surface-1);
1659
+ }
1660
+ .fractal-tabs--surface > .fractal-tabs-list > .fractal-tabs-trigger:hover:not(.fractal-tabs-trigger--active):not(.fractal-tabs-trigger--disabled) {
1661
+ background: var(--hover-surface);
1662
+ }
1663
+ .fractal-tabs--surface > .fractal-tabs-list > .fractal-tabs-trigger--active {
1664
+ background: var(--bg-canvas);
1665
+ color: var(--fg-primary);
1063
1666
  }
1064
1667
  .fractal-tabs-trigger--disabled {
1065
1668
  color: var(--fg-disabled, var(--fg-secondary));
@@ -1073,6 +1676,94 @@
1073
1676
  .fractal-tabs-panel[hidden] {
1074
1677
  display: none;
1075
1678
  }
1679
+ @media (prefers-reduced-motion: reduce) {
1680
+ .fractal-tabs-list::after {
1681
+ transition: none;
1682
+ }
1683
+ }
1684
+
1685
+ /* src/components/ContentSwitcher/ContentSwitcher.css */
1686
+ .fractal-content-switcher {
1687
+ position: relative;
1688
+ display: inline-flex;
1689
+ gap: 2px;
1690
+ padding: 2px;
1691
+ border: 1px solid color-mix(in srgb, var(--border-subtle) 55%, transparent);
1692
+ border-radius: var(--radius-md);
1693
+ background: var(--bg-surface-subtle);
1694
+ font-family: var(--font-sans);
1695
+ }
1696
+ .fractal-content-switcher__indicator {
1697
+ position: absolute;
1698
+ top: 0;
1699
+ left: 0;
1700
+ width: var(--fractal-content-switcher-indicator-width, 0);
1701
+ height: var(--fractal-content-switcher-indicator-height, 0);
1702
+ border-radius: var(--radius-sm);
1703
+ background: var(--bg-canvas);
1704
+ box-shadow: var(--shadow-sm);
1705
+ opacity: 0;
1706
+ pointer-events: none;
1707
+ transform: translate3d(var(--fractal-content-switcher-indicator-x, 0), var(--fractal-content-switcher-indicator-y, 0), 0);
1708
+ }
1709
+ .fractal-content-switcher[data-indicator-ready=true] .fractal-content-switcher__indicator {
1710
+ opacity: 1;
1711
+ }
1712
+ .fractal-content-switcher[data-indicator-ready=true][data-indicator-animate=true] .fractal-content-switcher__indicator {
1713
+ transition:
1714
+ transform var(--duration-normal) var(--ease-in-out),
1715
+ width var(--duration-normal) var(--ease-in-out),
1716
+ height var(--duration-normal) var(--ease-in-out),
1717
+ opacity var(--duration-fast) var(--ease-out);
1718
+ }
1719
+ .fractal-content-switcher--full-width {
1720
+ display: flex;
1721
+ width: 100%;
1722
+ }
1723
+ .fractal-content-switcher__item {
1724
+ position: relative;
1725
+ z-index: 1;
1726
+ min-width: 128px;
1727
+ min-height: 40px;
1728
+ padding: 0 var(--space-4);
1729
+ border: 0;
1730
+ border-radius: var(--radius-sm);
1731
+ background: transparent;
1732
+ color: var(--fg-secondary);
1733
+ cursor: pointer;
1734
+ font: inherit;
1735
+ font-size: 0.875rem;
1736
+ line-height: 1.25;
1737
+ text-align: center;
1738
+ transition: background-color var(--duration-fast) var(--ease-out), color var(--duration-fast) var(--ease-out);
1739
+ }
1740
+ .fractal-content-switcher--full-width .fractal-content-switcher__item {
1741
+ flex: 1;
1742
+ }
1743
+ .fractal-content-switcher__item:hover:not(:disabled):not(.fractal-content-switcher__item--active) {
1744
+ background: var(--hover-surface);
1745
+ color: var(--fg-primary);
1746
+ }
1747
+ .fractal-content-switcher__item--active {
1748
+ background: transparent;
1749
+ color: var(--fg-primary);
1750
+ }
1751
+ .fractal-content-switcher__item:focus-visible {
1752
+ position: relative;
1753
+ z-index: 1;
1754
+ outline: 2px solid var(--border-focus);
1755
+ outline-offset: -2px;
1756
+ }
1757
+ .fractal-content-switcher__item:disabled {
1758
+ cursor: not-allowed;
1759
+ color: var(--fg-disabled);
1760
+ opacity: 0.5;
1761
+ }
1762
+ @media (prefers-reduced-motion: reduce) {
1763
+ .fractal-content-switcher[data-indicator-ready=true][data-indicator-animate=true] .fractal-content-switcher__indicator {
1764
+ transition: none;
1765
+ }
1766
+ }
1076
1767
 
1077
1768
  /* src/components/Disclosure/Disclosure.css */
1078
1769
  .fractal-disclosure {
@@ -1104,6 +1795,17 @@
1104
1795
  .fractal-disclosure-trigger:hover {
1105
1796
  background: var(--bg-surface-1);
1106
1797
  }
1798
+ .fractal-disclosure--disabled .fractal-disclosure-trigger {
1799
+ color: var(--fg-tertiary);
1800
+ cursor: not-allowed;
1801
+ }
1802
+ .fractal-disclosure--disabled .fractal-disclosure-trigger:hover {
1803
+ background: transparent;
1804
+ }
1805
+ .fractal-disclosure--disabled .fractal-disclosure-icon,
1806
+ .fractal-disclosure--disabled .fractal-disclosure-meta {
1807
+ color: var(--fg-tertiary);
1808
+ }
1107
1809
  .fractal-disclosure-trigger:focus-visible {
1108
1810
  outline: 2px solid var(--border-focus);
1109
1811
  outline-offset: -2px;
@@ -1146,58 +1848,498 @@
1146
1848
  padding: 4px 0 12px 24px;
1147
1849
  }
1148
1850
 
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 {
1851
+ /* src/components/LatticeLoader/LatticeLoader.css */
1852
+ .fractal-lattice-loader {
1164
1853
  display: flex;
1165
- min-height: 48px;
1166
1854
  align-items: center;
1167
- padding: 0 var(--space-4);
1168
- border-bottom: 1px solid var(--border-subtle);
1855
+ gap: 6px;
1856
+ width: 100%;
1857
+ height: 12px;
1858
+ overflow: hidden;
1859
+ color: var(--fg-secondary);
1169
1860
  }
1170
- .fractal-sidebar__brand {
1171
- display: inline-flex;
1861
+ .fractal-lattice-loader__cell {
1862
+ position: relative;
1863
+ width: 12px;
1864
+ flex: 0 0 12px;
1865
+ aspect-ratio: 1;
1866
+ background: currentColor;
1867
+ -webkit-mask: url("./lattice-FAYE5KWW.svg") center / contain no-repeat;
1868
+ mask: url("./lattice-FAYE5KWW.svg") center / contain no-repeat;
1869
+ opacity: 0.08;
1870
+ animation: fractal-lattice-wave 3.2s ease-in-out infinite;
1871
+ animation-delay: calc((var(--fractal-lattice-index) * 40ms) - 3.2s);
1872
+ }
1873
+ @keyframes fractal-lattice-wave {
1874
+ 0%, 58%, 100% {
1875
+ opacity: 0.08;
1876
+ }
1877
+ 18% {
1878
+ opacity: 0.28;
1879
+ }
1880
+ 30% {
1881
+ opacity: 1;
1882
+ }
1883
+ 42% {
1884
+ opacity: 0.28;
1885
+ }
1886
+ }
1887
+ @media (prefers-reduced-motion: reduce) {
1888
+ .fractal-lattice-loader__cell {
1889
+ opacity: 0.35;
1890
+ animation: none;
1891
+ }
1892
+ }
1893
+
1894
+ /* src/components/Ghost/Ghost.css */
1895
+ .fractal-ghost {
1896
+ --fractal-ghost-base: var(--bg-surface-1);
1897
+ --fractal-ghost-shine: color-mix(in srgb, var(--bg-canvas) 82%, transparent);
1898
+ position: relative;
1899
+ display: block;
1172
1900
  min-width: 0;
1173
- align-items: center;
1174
- 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);
1901
+ min-height: 1px;
1902
+ overflow: hidden;
1903
+ background: var(--fractal-ghost-base);
1904
+ border-radius: var(--radius-sm);
1184
1905
  }
1185
- .fractal-sidebar__brand:hover {
1186
- background: var(--nav-hover);
1906
+ .fractal-ghost::after {
1907
+ position: absolute;
1908
+ top: 0;
1909
+ bottom: 0;
1910
+ left: -50%;
1911
+ width: 50%;
1912
+ background:
1913
+ linear-gradient(
1914
+ 105deg,
1915
+ transparent 0%,
1916
+ var(--fractal-ghost-shine) 50%,
1917
+ transparent 100%);
1918
+ content: "";
1919
+ pointer-events: none;
1920
+ transform: translate3d(-100%, 0, 0);
1921
+ animation: fractal-ghost-shine var(--duration-ambient) linear infinite;
1922
+ will-change: transform;
1187
1923
  }
1188
- .fractal-sidebar__brand:active {
1189
- transform: scale(0.98);
1924
+ .fractal-ghost-line {
1925
+ height: 0.875rem;
1190
1926
  }
1191
- .fractal-sidebar__brand:focus-visible,
1192
- .fractal-sidebar__nav-item:focus-visible {
1193
- outline: 2px solid var(--border-focus);
1194
- outline-offset: 2px;
1927
+ .fractal-ghost-line--sm {
1928
+ height: 0.6875rem;
1195
1929
  }
1196
- .fractal-sidebar__nav {
1197
- display: flex;
1198
- flex: 1;
1199
- flex-direction: column;
1200
- gap: 0;
1930
+ .fractal-ghost-line--lg {
1931
+ height: 1.125rem;
1932
+ }
1933
+ .fractal-ghost-stack {
1934
+ display: grid;
1935
+ gap: var(--space-2);
1936
+ }
1937
+ .fractal-ghost-button {
1938
+ border-radius: var(--radius-full);
1939
+ }
1940
+ .fractal-ghost-button--xs {
1941
+ width: 72px;
1942
+ height: 28px;
1943
+ }
1944
+ .fractal-ghost-button--sm {
1945
+ width: 84px;
1946
+ height: 32px;
1947
+ }
1948
+ .fractal-ghost-button--md {
1949
+ width: 96px;
1950
+ height: 40px;
1951
+ }
1952
+ .fractal-ghost-button--lg {
1953
+ width: 108px;
1954
+ height: 44px;
1955
+ }
1956
+ .fractal-ghost-button--xl {
1957
+ width: 128px;
1958
+ height: 56px;
1959
+ }
1960
+ .fractal-ghost-button--icon-only {
1961
+ width: var(--fractal-ghost-icon-size, 40px);
1962
+ }
1963
+ .fractal-ghost-button--xs.fractal-ghost-button--icon-only {
1964
+ --fractal-ghost-icon-size: 28px;
1965
+ }
1966
+ .fractal-ghost-button--sm.fractal-ghost-button--icon-only {
1967
+ --fractal-ghost-icon-size: 32px;
1968
+ }
1969
+ .fractal-ghost-button--lg.fractal-ghost-button--icon-only {
1970
+ --fractal-ghost-icon-size: 44px;
1971
+ }
1972
+ .fractal-ghost-button--xl.fractal-ghost-button--icon-only {
1973
+ --fractal-ghost-icon-size: 56px;
1974
+ }
1975
+ .fractal-ghost-card {
1976
+ display: grid;
1977
+ gap: var(--space-4);
1978
+ padding: var(--space-5);
1979
+ border: 1px solid var(--border-subtle);
1980
+ border-radius: var(--radius-md);
1981
+ background: var(--bg-canvas);
1982
+ }
1983
+ .fractal-ghost-table {
1984
+ overflow: hidden;
1985
+ border: 1px solid var(--border-subtle);
1986
+ border-radius: var(--radius-md);
1987
+ background: var(--bg-canvas);
1988
+ }
1989
+ .fractal-ghost-table__table {
1990
+ width: 100%;
1991
+ border-collapse: separate;
1992
+ border-spacing: 0;
1993
+ }
1994
+ .fractal-ghost-table__head-row {
1995
+ background: var(--bg-surface-1);
1996
+ }
1997
+ .fractal-ghost-table th {
1998
+ padding: 12px 16px;
1999
+ border-bottom: 1px solid var(--border-subtle);
2000
+ color: var(--fg-secondary);
2001
+ font-size: 0.75rem;
2002
+ font-weight: 500;
2003
+ text-align: left;
2004
+ }
2005
+ .fractal-ghost-table td {
2006
+ padding: 14px 16px;
2007
+ }
2008
+ .fractal-ghost-table__row + .fractal-ghost-table__row td {
2009
+ border-top: 1px solid var(--border-subtle);
2010
+ }
2011
+ .fractal-ghost-table--sm th {
2012
+ padding: 8px 12px;
2013
+ }
2014
+ .fractal-ghost-table--sm td {
2015
+ padding: 10px 12px;
2016
+ }
2017
+ .fractal-ghost-table--lg th {
2018
+ padding: 18px 24px;
2019
+ }
2020
+ .fractal-ghost-table--lg td {
2021
+ padding: 22px 24px;
2022
+ }
2023
+ .fractal-ghost-field {
2024
+ display: grid;
2025
+ gap: var(--space-2);
2026
+ }
2027
+ .fractal-ghost-field__control {
2028
+ width: 100%;
2029
+ height: 40px;
2030
+ border: 1px solid var(--border-subtle);
2031
+ border-radius: var(--radius-md);
2032
+ }
2033
+ .fractal-ghost-field__control--multiline {
2034
+ height: 112px;
2035
+ }
2036
+ .fractal-ghost-label {
2037
+ border-radius: var(--radius-sm);
2038
+ }
2039
+ .fractal-ghost-alert {
2040
+ display: grid;
2041
+ gap: var(--space-2);
2042
+ padding: var(--space-4);
2043
+ border: 1px solid var(--border-subtle);
2044
+ border-radius: var(--radius-md);
2045
+ }
2046
+ .fractal-ghost-choice {
2047
+ display: flex;
2048
+ align-items: center;
2049
+ gap: var(--space-2);
2050
+ }
2051
+ .fractal-ghost-choice__control {
2052
+ width: 16px;
2053
+ height: 16px;
2054
+ border-radius: var(--radius-sm);
2055
+ }
2056
+ .fractal-ghost-chip {
2057
+ border-radius: var(--radius-full);
2058
+ }
2059
+ .fractal-ghost-link {
2060
+ display: inline-block;
2061
+ }
2062
+ .fractal-ghost-dropdown {
2063
+ display: flex;
2064
+ align-items: center;
2065
+ justify-content: space-between;
2066
+ width: 220px;
2067
+ height: 40px;
2068
+ padding: 0 var(--space-3);
2069
+ border: 1px solid var(--border-subtle);
2070
+ border-radius: var(--radius-md);
2071
+ }
2072
+ .fractal-ghost-dropdown__chevron {
2073
+ width: 14px;
2074
+ height: 14px;
2075
+ border-radius: var(--radius-full);
2076
+ }
2077
+ .fractal-ghost-switcher {
2078
+ display: flex;
2079
+ width: fit-content;
2080
+ gap: 2px;
2081
+ padding: 3px;
2082
+ border-radius: var(--radius-md);
2083
+ background: var(--bg-surface-1);
2084
+ }
2085
+ .fractal-ghost-switcher > .fractal-ghost {
2086
+ width: 76px;
2087
+ height: 32px;
2088
+ border-radius: calc(var(--radius-md) - 2px);
2089
+ }
2090
+ .fractal-ghost-disclosure {
2091
+ display: flex;
2092
+ align-items: center;
2093
+ gap: var(--space-3);
2094
+ padding: var(--space-3) 0;
2095
+ border-bottom: 1px solid var(--border-subtle);
2096
+ }
2097
+ .fractal-ghost-disclosure__icon {
2098
+ width: 16px;
2099
+ height: 16px;
2100
+ border-radius: var(--radius-full);
2101
+ }
2102
+ .fractal-ghost-pagination {
2103
+ display: flex;
2104
+ gap: var(--space-2);
2105
+ }
2106
+ .fractal-ghost-pagination > .fractal-ghost {
2107
+ width: 32px;
2108
+ height: 32px;
2109
+ border-radius: var(--radius-md);
2110
+ }
2111
+ .fractal-ghost-dropzone {
2112
+ display: grid;
2113
+ place-items: center;
2114
+ gap: var(--space-3);
2115
+ min-height: 184px;
2116
+ padding: var(--space-6);
2117
+ border: 1px dashed var(--border-default);
2118
+ border-radius: var(--radius-md);
2119
+ }
2120
+ .fractal-ghost-dropzone__icon {
2121
+ width: 32px;
2122
+ height: 32px;
2123
+ border-radius: var(--radius-full);
2124
+ }
2125
+ .fractal-ghost-prompt-card {
2126
+ min-height: 176px;
2127
+ }
2128
+ .fractal-ghost-conversation {
2129
+ display: flex;
2130
+ width: 100%;
2131
+ min-width: 0;
2132
+ flex-direction: column;
2133
+ gap: var(--space-6);
2134
+ }
2135
+ .fractal-ghost-conversation__message {
2136
+ display: grid;
2137
+ width: min(92%, 42rem);
2138
+ min-width: 0;
2139
+ gap: var(--space-2);
2140
+ }
2141
+ .fractal-ghost-conversation__message--user {
2142
+ width: min(78%, 36rem);
2143
+ align-self: flex-end;
2144
+ }
2145
+ .fractal-ghost-conversation__bubble {
2146
+ --fractal-ghost-base: color-mix(in srgb, var(--accent-text) 12%, transparent);
2147
+ --fractal-ghost-shine: color-mix(in srgb, var(--accent-text) 5%, transparent);
2148
+ display: grid;
2149
+ gap: var(--space-2);
2150
+ padding: var(--space-4);
2151
+ border: 1px solid var(--accent-surface-stroke);
2152
+ border-radius: 12px 12px 4px;
2153
+ background: var(--accent-surface-stroke);
2154
+ }
2155
+ .fractal-ghost-sidebar {
2156
+ display: grid;
2157
+ align-content: start;
2158
+ gap: var(--space-7);
2159
+ width: 248px;
2160
+ min-height: 100%;
2161
+ padding: var(--space-5);
2162
+ border-right: 1px solid var(--border-subtle);
2163
+ background: var(--bg-canvas);
2164
+ }
2165
+ .fractal-ghost-sidebar__brand {
2166
+ width: 112px;
2167
+ height: 24px;
2168
+ }
2169
+ .fractal-ghost-sidebar__items {
2170
+ display: grid;
2171
+ gap: var(--space-2);
2172
+ }
2173
+ .fractal-ghost-sidebar__item {
2174
+ display: flex;
2175
+ align-items: center;
2176
+ gap: var(--space-3);
2177
+ height: 36px;
2178
+ padding: 0 var(--space-2);
2179
+ }
2180
+ .fractal-ghost-sidebar__item > .fractal-ghost {
2181
+ width: 16px;
2182
+ height: 16px;
2183
+ border-radius: var(--radius-sm);
2184
+ }
2185
+ .fractal-ghost-surface {
2186
+ display: grid;
2187
+ gap: var(--space-5);
2188
+ padding: var(--space-6);
2189
+ border: 1px solid var(--border-subtle);
2190
+ border-radius: var(--radius-lg);
2191
+ background: var(--bg-canvas);
2192
+ }
2193
+ .fractal-ghost-modal {
2194
+ width: min(100%, 420px);
2195
+ }
2196
+ .fractal-ghost-side-panel {
2197
+ width: min(100%, 540px);
2198
+ min-height: 480px;
2199
+ }
2200
+ .fractal-ghost-surface__header {
2201
+ display: flex;
2202
+ align-items: center;
2203
+ justify-content: space-between;
2204
+ }
2205
+ .fractal-ghost-surface__close {
2206
+ width: 28px;
2207
+ height: 28px;
2208
+ border-radius: var(--radius-md);
2209
+ }
2210
+ .fractal-ghost-surface__title {
2211
+ color: var(--fg-secondary);
2212
+ font-size: 0.75rem;
2213
+ }
2214
+ @keyframes fractal-ghost-shine {
2215
+ from {
2216
+ transform: translate3d(-100%, 0, 0);
2217
+ }
2218
+ to {
2219
+ transform: translate3d(300%, 0, 0);
2220
+ }
2221
+ }
2222
+ @media (prefers-reduced-motion: reduce) {
2223
+ .fractal-ghost::after {
2224
+ display: none;
2225
+ animation: none;
2226
+ }
2227
+ }
2228
+
2229
+ /* src/components/Sidebar/Sidebar.css */
2230
+ .fractal-sidebar {
2231
+ --fractal-sidebar-width: 232px;
2232
+ --fractal-sidebar-compact-width: 56px;
2233
+ box-sizing: border-box;
2234
+ display: flex;
2235
+ width: var(--fractal-sidebar-width);
2236
+ min-width: var(--fractal-sidebar-width);
2237
+ min-height: 100%;
2238
+ flex-direction: column;
2239
+ background: var(--bg-surface-1);
2240
+ border-right: 1px solid var(--nav-border);
2241
+ color: var(--fg-primary);
2242
+ font-family: var(--font-sans);
2243
+ }
2244
+ .fractal-sidebar[data-compact] {
2245
+ z-index: 10;
2246
+ width: var(--fractal-sidebar-compact-width);
2247
+ min-width: var(--fractal-sidebar-compact-width);
2248
+ overflow: hidden;
2249
+ transition:
2250
+ width var(--duration-normal) var(--ease-out),
2251
+ min-width var(--duration-normal) var(--ease-out),
2252
+ box-shadow var(--duration-normal) var(--ease-out);
2253
+ }
2254
+ .fractal-sidebar[data-compact]:hover,
2255
+ .fractal-sidebar[data-compact]:focus-within {
2256
+ width: var(--fractal-sidebar-width);
2257
+ min-width: var(--fractal-sidebar-width);
2258
+ box-shadow: var(--shadow-md);
2259
+ }
2260
+ .fractal-sidebar__header {
2261
+ display: flex;
2262
+ min-height: 48px;
2263
+ align-items: center;
2264
+ padding: var(--space-2);
2265
+ border-bottom: 1px solid var(--border-subtle);
2266
+ }
2267
+ .fractal-sidebar__brand {
2268
+ display: inline-flex;
2269
+ min-width: 0;
2270
+ align-items: center;
2271
+ gap: var(--space-2);
2272
+ padding: var(--space-1);
2273
+ border: 0;
2274
+ border-radius: var(--radius-md);
2275
+ background: transparent;
2276
+ color: var(--fg-primary);
2277
+ cursor: pointer;
2278
+ font: inherit;
2279
+ text-align: left;
2280
+ transition: background-color var(--duration-fast) var(--ease-out), transform var(--duration-fast) var(--ease-out);
2281
+ }
2282
+ .fractal-sidebar__brand:hover {
2283
+ background: var(--nav-hover);
2284
+ }
2285
+ .fractal-sidebar__brand:active {
2286
+ transform: scale(0.98);
2287
+ }
2288
+ .fractal-sidebar__brand:focus-visible,
2289
+ .fractal-sidebar__nav-item:focus-visible,
2290
+ .fractal-sidebar__account-trigger:focus-visible {
2291
+ outline: 2px solid var(--border-focus);
2292
+ outline-offset: 2px;
2293
+ }
2294
+ .fractal-sidebar__account {
2295
+ display: block;
2296
+ width: 100%;
2297
+ }
2298
+ .fractal-sidebar__account-trigger {
2299
+ width: 100%;
2300
+ min-height: 36px;
2301
+ box-sizing: border-box;
2302
+ gap: var(--space-2);
2303
+ padding: 8px 10px;
2304
+ border: 0;
2305
+ background: transparent;
2306
+ border-radius: var(--radius-md);
2307
+ color: var(--fg-primary);
2308
+ font-weight: 500;
2309
+ }
2310
+ .fractal-sidebar__account-trigger:hover,
2311
+ .fractal-sidebar__account-trigger.fractal-dropdown-trigger--tertiary:hover {
2312
+ background: var(--nav-hover);
2313
+ }
2314
+ .fractal-sidebar__account-name {
2315
+ min-width: 0;
2316
+ flex: 1;
2317
+ overflow: hidden;
2318
+ text-overflow: ellipsis;
2319
+ white-space: nowrap;
2320
+ }
2321
+ .fractal-sidebar__account-icon {
2322
+ display: inline-flex;
2323
+ width: 18px;
2324
+ height: 18px;
2325
+ flex: 0 0 18px;
2326
+ align-items: center;
2327
+ justify-content: center;
2328
+ }
2329
+ .fractal-sidebar__account-icon > img,
2330
+ .fractal-sidebar__account-icon > svg {
2331
+ display: block;
2332
+ width: 18px;
2333
+ height: 18px;
2334
+ }
2335
+ .fractal-sidebar__account-panel {
2336
+ min-width: 100%;
2337
+ }
2338
+ .fractal-sidebar__nav {
2339
+ display: flex;
2340
+ flex: 1;
2341
+ flex-direction: column;
2342
+ gap: 0;
1201
2343
  overflow-y: auto;
1202
2344
  padding: var(--space-2);
1203
2345
  }
@@ -1284,6 +2426,7 @@
1284
2426
  border-top: 1px solid var(--border-subtle);
1285
2427
  }
1286
2428
  @media (prefers-reduced-motion: reduce) {
2429
+ .fractal-sidebar[data-compact],
1287
2430
  .fractal-sidebar__brand,
1288
2431
  .fractal-sidebar__nav-item {
1289
2432
  transition: none;
@@ -1298,6 +2441,7 @@
1298
2441
  display: flex;
1299
2442
  justify-content: flex-end;
1300
2443
  background: color-mix(in srgb, var(--fg-primary) 16%, transparent);
2444
+ animation: fractal-side-panel-overlay-in 180ms ease-out both;
1301
2445
  }
1302
2446
  .fractal-side-panel {
1303
2447
  display: flex;
@@ -1309,6 +2453,7 @@
1309
2453
  box-shadow: var(--shadow-lg);
1310
2454
  color: var(--fg-primary);
1311
2455
  font-family: var(--font-sans);
2456
+ animation: fractal-side-panel-in 180ms cubic-bezier(0.16, 1, 0.3, 1) both;
1312
2457
  }
1313
2458
  .fractal-side-panel--sm {
1314
2459
  width: min(100vw, 420px);
@@ -1319,19 +2464,23 @@
1319
2464
  .fractal-side-panel--lg {
1320
2465
  width: min(100vw, 680px);
1321
2466
  }
2467
+ .fractal-side-panel--xl {
2468
+ width: min(100vw, 960px);
2469
+ }
1322
2470
  .fractal-side-panel__header {
1323
2471
  display: flex;
1324
- min-height: 72px;
1325
2472
  align-items: flex-start;
1326
2473
  justify-content: space-between;
1327
2474
  gap: var(--space-4);
1328
- padding: var(--space-5) var(--space-6);
1329
- border-bottom: 1px solid var(--border-subtle);
2475
+ padding: var(--space-5) var(--space-6) var(--space-4);
1330
2476
  }
1331
2477
  .fractal-side-panel__heading {
1332
2478
  min-width: 0;
1333
2479
  }
1334
2480
  .fractal-side-panel__title {
2481
+ display: flex;
2482
+ min-height: 32px;
2483
+ align-items: center;
1335
2484
  margin: 0;
1336
2485
  font-size: 1rem;
1337
2486
  font-weight: 500;
@@ -1367,7 +2516,11 @@
1367
2516
  min-height: 0;
1368
2517
  flex: 1;
1369
2518
  overflow: auto;
1370
- padding: var(--space-6);
2519
+ padding: var(--space-2) var(--space-6) var(--space-6);
2520
+ }
2521
+ .fractal-side-panel__body--loading {
2522
+ display: grid;
2523
+ place-items: center;
1371
2524
  }
1372
2525
  .fractal-side-panel__footer {
1373
2526
  display: flex;
@@ -1381,15 +2534,37 @@
1381
2534
  width: 100%;
1382
2535
  }
1383
2536
  .fractal-side-panel__header {
1384
- padding: var(--space-4) var(--space-5);
2537
+ padding: var(--space-4) var(--space-5) var(--space-3);
1385
2538
  }
1386
2539
  .fractal-side-panel__body {
1387
- padding: var(--space-5);
2540
+ padding: var(--space-2) var(--space-5) var(--space-5);
1388
2541
  }
1389
2542
  .fractal-side-panel__footer {
1390
2543
  padding: var(--space-3) var(--space-5);
1391
2544
  }
1392
2545
  }
2546
+ @keyframes fractal-side-panel-overlay-in {
2547
+ from {
2548
+ opacity: 0;
2549
+ }
2550
+ to {
2551
+ opacity: 1;
2552
+ }
2553
+ }
2554
+ @keyframes fractal-side-panel-in {
2555
+ from {
2556
+ transform: translateX(100%);
2557
+ }
2558
+ to {
2559
+ transform: translateX(0);
2560
+ }
2561
+ }
2562
+ @media (prefers-reduced-motion: reduce) {
2563
+ .fractal-side-panel-overlay,
2564
+ .fractal-side-panel {
2565
+ animation-duration: 0.01ms;
2566
+ }
2567
+ }
1393
2568
 
1394
2569
  /* src/components/Textarea/Textarea.css */
1395
2570
  .fractal-textarea {
@@ -1420,4 +2595,214 @@
1420
2595
  opacity: 0.5;
1421
2596
  background: var(--bg-surface-1);
1422
2597
  }
2598
+
2599
+ /* src/components/TextButton/TextButton.css */
2600
+ .fractal-text-button {
2601
+ display: inline-flex;
2602
+ align-items: center;
2603
+ gap: var(--space-1);
2604
+ border: 0;
2605
+ background: transparent;
2606
+ cursor: pointer;
2607
+ font-family: var(--font-sans);
2608
+ font-weight: 500;
2609
+ line-height: 1.4;
2610
+ padding: 0;
2611
+ text-align: left;
2612
+ transition: color 120ms ease;
2613
+ }
2614
+ .fractal-text-button--primary {
2615
+ color: var(--fg-primary);
2616
+ }
2617
+ .fractal-text-button--primary:hover:not(:disabled) {
2618
+ color: var(--fg-secondary);
2619
+ }
2620
+ .fractal-text-button--secondary {
2621
+ color: var(--fg-secondary);
2622
+ }
2623
+ .fractal-text-button--secondary:hover:not(:disabled) {
2624
+ color: var(--fg-primary);
2625
+ }
2626
+ .fractal-text-button:focus-visible {
2627
+ outline: 2px solid var(--border-focus);
2628
+ outline-offset: 3px;
2629
+ border-radius: var(--radius-sm);
2630
+ }
2631
+ .fractal-text-button:disabled {
2632
+ cursor: not-allowed;
2633
+ opacity: 0.5;
2634
+ }
2635
+ .fractal-text-button--sm {
2636
+ font-size: 0.8125rem;
2637
+ }
2638
+ .fractal-text-button--md {
2639
+ font-size: 0.875rem;
2640
+ }
2641
+ .fractal-text-button__icon {
2642
+ display: inline-grid;
2643
+ place-items: center;
2644
+ }
2645
+
2646
+ /* src/components/FileDropzone/FileDropzone.css */
2647
+ .fractal-file-dropzone {
2648
+ display: grid;
2649
+ gap: var(--space-2);
2650
+ color: var(--fg-primary);
2651
+ font-family: var(--font-sans);
2652
+ }
2653
+ .fractal-file-dropzone__input {
2654
+ display: none;
2655
+ }
2656
+ .fractal-file-dropzone__target {
2657
+ display: flex;
2658
+ width: 100%;
2659
+ min-height: 92px;
2660
+ align-items: center;
2661
+ justify-content: center;
2662
+ gap: var(--space-3);
2663
+ border: 1px dashed var(--border-default);
2664
+ border-radius: var(--radius-md);
2665
+ background: var(--bg-canvas);
2666
+ color: var(--fg-secondary);
2667
+ cursor: pointer;
2668
+ padding: var(--space-4);
2669
+ text-align: left;
2670
+ }
2671
+ .fractal-file-dropzone__target:hover,
2672
+ .fractal-file-dropzone__target[data-dragging] {
2673
+ border-color: var(--border-focus);
2674
+ background: var(--hover-surface);
2675
+ color: var(--fg-primary);
2676
+ }
2677
+ .fractal-file-dropzone__target:focus-visible {
2678
+ outline: 2px solid var(--border-focus);
2679
+ outline-offset: 2px;
2680
+ }
2681
+ .fractal-file-dropzone__target:disabled {
2682
+ cursor: not-allowed;
2683
+ opacity: 0.5;
2684
+ }
2685
+ .fractal-file-dropzone__copy {
2686
+ display: grid;
2687
+ gap: var(--space-1);
2688
+ }
2689
+ .fractal-file-dropzone__title {
2690
+ font-size: 0.875rem;
2691
+ font-weight: 500;
2692
+ line-height: 1.4;
2693
+ }
2694
+ .fractal-file-dropzone__description {
2695
+ color: var(--fg-secondary);
2696
+ font-size: 0.8125rem;
2697
+ line-height: 1.4;
2698
+ }
2699
+ .fractal-file-dropzone__files {
2700
+ display: grid;
2701
+ gap: var(--space-1);
2702
+ margin: 0;
2703
+ padding: 0;
2704
+ list-style: none;
2705
+ }
2706
+ .fractal-file-dropzone__file {
2707
+ display: flex;
2708
+ min-width: 0;
2709
+ align-items: center;
2710
+ gap: var(--space-2);
2711
+ padding: var(--space-2) var(--space-3);
2712
+ border: 1px solid var(--border-subtle);
2713
+ border-radius: var(--radius-md);
2714
+ background: var(--bg-canvas);
2715
+ font-size: 0.8125rem;
2716
+ line-height: 1.4;
2717
+ }
2718
+ .fractal-file-dropzone__file-name {
2719
+ min-width: 0;
2720
+ flex: 1;
2721
+ overflow: hidden;
2722
+ text-overflow: ellipsis;
2723
+ white-space: nowrap;
2724
+ }
2725
+ .fractal-file-dropzone__file-meta {
2726
+ color: var(--fg-secondary);
2727
+ white-space: nowrap;
2728
+ }
2729
+ .fractal-file-dropzone__remove {
2730
+ display: grid;
2731
+ width: 24px;
2732
+ height: 24px;
2733
+ flex: 0 0 auto;
2734
+ place-items: center;
2735
+ border: 0;
2736
+ border-radius: var(--radius-sm);
2737
+ background: transparent;
2738
+ color: var(--fg-secondary);
2739
+ cursor: pointer;
2740
+ }
2741
+ .fractal-file-dropzone__remove:hover {
2742
+ background: var(--hover-surface);
2743
+ color: var(--fg-primary);
2744
+ }
2745
+ .fractal-file-dropzone__remove:focus-visible {
2746
+ outline: 2px solid var(--border-focus);
2747
+ outline-offset: 1px;
2748
+ }
2749
+ .fractal-file-dropzone__remove:disabled {
2750
+ cursor: not-allowed;
2751
+ opacity: 0.5;
2752
+ }
2753
+
2754
+ /* src/components/Pagination/Pagination.css */
2755
+ .fractal-pagination {
2756
+ display: flex;
2757
+ align-items: center;
2758
+ justify-content: space-between;
2759
+ gap: var(--space-3);
2760
+ color: var(--fg-secondary);
2761
+ font-family: var(--font-sans);
2762
+ font-size: 0.8125rem;
2763
+ line-height: 1.4;
2764
+ }
2765
+ .fractal-pagination__controls {
2766
+ display: flex;
2767
+ align-items: center;
2768
+ gap: var(--space-2);
2769
+ }
2770
+ .fractal-pagination__page-size .fractal-dropdown-trigger {
2771
+ padding: 4px 0;
2772
+ border: 0;
2773
+ background: transparent;
2774
+ color: var(--fg-secondary);
2775
+ }
2776
+ .fractal-pagination__page-size .fractal-dropdown-trigger:hover {
2777
+ background: transparent;
2778
+ color: var(--fg-primary);
2779
+ }
2780
+ .fractal-pagination__button {
2781
+ display: grid;
2782
+ width: 28px;
2783
+ height: 28px;
2784
+ place-items: center;
2785
+ border: 1px solid var(--border-default);
2786
+ border-radius: var(--radius-sm);
2787
+ background: var(--bg-canvas);
2788
+ color: var(--fg-secondary);
2789
+ cursor: pointer;
2790
+ }
2791
+ .fractal-pagination__button:hover:not(:disabled) {
2792
+ background: var(--hover-surface);
2793
+ color: var(--fg-primary);
2794
+ }
2795
+ .fractal-pagination__button:focus-visible {
2796
+ outline: 2px solid var(--border-focus);
2797
+ outline-offset: 2px;
2798
+ }
2799
+ .fractal-pagination__button:disabled {
2800
+ cursor: not-allowed;
2801
+ opacity: 0.45;
2802
+ }
2803
+ .fractal-pagination__page {
2804
+ min-width: 44px;
2805
+ text-align: center;
2806
+ white-space: nowrap;
2807
+ }
1423
2808
  /*# sourceMappingURL=index.css.map */