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

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,72 @@
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
+ padding: 0 !important;
1477
+ }
1478
+ .fractal-sortable-table-selection-cell > .fractal-checkbox {
1479
+ position: absolute;
1480
+ inset: 0;
1481
+ width: 100%;
1482
+ height: 100%;
1483
+ border-radius: 0;
1484
+ }
1485
+ .fractal-sortable-table-selection-cell > .fractal-checkbox:hover:not(:disabled) {
1486
+ background: var(--hover-surface);
1487
+ }
1488
+ .fractal-sortable-table-selection-cell > .fractal-checkbox:focus-visible {
1489
+ outline-offset: -2px;
1490
+ }
1491
+ .fractal-sortable-table-td--row-action {
1492
+ position: relative;
1493
+ }
1494
+ .fractal-sortable-table-td .fractal-dropdown-trigger--icon-only.fractal-dropdown-trigger--tertiary:hover {
1495
+ background: var(--bg-canvas);
1496
+ }
1497
+ .fractal-sortable-table-row-action {
1498
+ position: absolute;
1499
+ z-index: 1;
1500
+ top: 0;
1501
+ right: -1px;
1502
+ bottom: 0;
1503
+ display: flex;
1504
+ width: min(280px, calc(200% + 32px));
1505
+ align-items: center;
1506
+ justify-content: flex-end;
1507
+ padding-right: var(--space-4);
1508
+ background:
1509
+ linear-gradient(
1510
+ 90deg,
1511
+ transparent 0%,
1512
+ color-mix(in srgb, var(--hover-surface) 72%, transparent) 52%,
1513
+ var(--hover-surface) 100%);
1514
+ opacity: 0;
1515
+ pointer-events: none;
1516
+ transition: opacity 150ms ease-out;
1517
+ }
1518
+ .fractal-sortable-table-row--interactive:hover .fractal-sortable-table-row-action,
1519
+ .fractal-sortable-table-row--interactive:focus-visible .fractal-sortable-table-row-action {
1520
+ opacity: 1;
1521
+ }
1522
+ .fractal-sortable-table-row-action__icon {
1523
+ display: grid;
1524
+ width: 32px;
1525
+ height: 32px;
1526
+ place-items: center;
1527
+ border: 1px solid var(--border-default);
1528
+ border-radius: var(--radius-full);
1529
+ background: var(--bg-canvas);
1530
+ color: var(--fg-primary);
1531
+ }
983
1532
  .fractal-sortable-table-row--interactive:focus-visible {
984
1533
  position: relative;
985
1534
  z-index: 1;
@@ -1002,17 +1551,14 @@
1002
1551
  vertical-align: top;
1003
1552
  overflow-wrap: anywhere;
1004
1553
  }
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,
1554
+ .fractal-sortable-table--sm .fractal-sortable-table-th:not(.fractal-sortable-table-th--sortable),
1009
1555
  .fractal-sortable-table--sm .fractal-sortable-table-sort-button {
1010
1556
  padding: 8px 12px;
1011
1557
  }
1012
1558
  .fractal-sortable-table--sm .fractal-sortable-table-td {
1013
1559
  padding: 10px 12px;
1014
1560
  }
1015
- .fractal-sortable-table--lg .fractal-sortable-table-th,
1561
+ .fractal-sortable-table--lg .fractal-sortable-table-th:not(.fractal-sortable-table-th--sortable),
1016
1562
  .fractal-sortable-table--lg .fractal-sortable-table-sort-button {
1017
1563
  padding: 18px 24px;
1018
1564
  }
@@ -1026,17 +1572,60 @@
1026
1572
  font-size: 0.875rem;
1027
1573
  }
1028
1574
  .fractal-tabs-list {
1575
+ position: relative;
1029
1576
  display: flex;
1030
1577
  gap: 24px;
1578
+ margin-bottom: var(--space-6);
1579
+ }
1580
+ .fractal-tabs--divider > .fractal-tabs-list {
1031
1581
  border-bottom: 1px solid var(--border-subtle);
1032
- margin-bottom: 16px;
1582
+ }
1583
+ .fractal-tabs--surface > .fractal-tabs-list {
1584
+ width: 100%;
1585
+ gap: 0;
1586
+ margin-bottom: 0;
1587
+ background: var(--bg-surface-1);
1588
+ }
1589
+ .fractal-tabs--surface > .fractal-tabs-list::before {
1590
+ position: absolute;
1591
+ z-index: 3;
1592
+ right: 0;
1593
+ bottom: 0;
1594
+ left: 0;
1595
+ height: 1px;
1596
+ background: var(--border-subtle);
1597
+ content: "";
1598
+ pointer-events: none;
1599
+ }
1600
+ .fractal-tabs-list::after {
1601
+ position: absolute;
1602
+ bottom: -1px;
1603
+ left: 0;
1604
+ width: var(--fractal-tabs-indicator-width, 0px);
1605
+ height: 2px;
1606
+ background: var(--accent-default);
1607
+ content: "";
1608
+ opacity: 0;
1609
+ transform: translateX(var(--fractal-tabs-indicator-offset, 0px));
1610
+ transition:
1611
+ transform 180ms var(--ease-standard, ease),
1612
+ width 180ms var(--ease-standard, ease),
1613
+ opacity 100ms ease;
1614
+ }
1615
+ .fractal-tabs-list[data-indicator-ready=true]::after {
1616
+ opacity: 1;
1617
+ }
1618
+ .fractal-tabs--surface > .fractal-tabs-list::after {
1619
+ display: none;
1033
1620
  }
1034
1621
  .fractal-tabs-trigger {
1035
1622
  position: relative;
1036
1623
  display: inline-flex;
1624
+ min-width: 88px;
1037
1625
  align-items: center;
1626
+ justify-content: center;
1038
1627
  gap: 6px;
1039
- padding: 10px 0;
1628
+ padding: 10px 1rem;
1040
1629
  background: none;
1041
1630
  border: 0;
1042
1631
  font: inherit;
@@ -1044,8 +1633,7 @@
1044
1633
  font-weight: 400;
1045
1634
  color: var(--fg-secondary);
1046
1635
  cursor: pointer;
1047
- transition: color 0.15s ease, box-shadow 0.15s ease;
1048
- box-shadow: inset 0 -1px 0 transparent;
1636
+ transition: color 0.15s ease;
1049
1637
  margin-bottom: -1px;
1050
1638
  }
1051
1639
  .fractal-tabs-trigger:hover:not(.fractal-tabs-trigger--active):not(.fractal-tabs-trigger--disabled) {
@@ -1059,7 +1647,21 @@
1059
1647
  .fractal-tabs-trigger--active {
1060
1648
  color: var(--accent-default);
1061
1649
  font-weight: 500;
1062
- box-shadow: inset 0 -1px 0 var(--accent-default);
1650
+ }
1651
+ .fractal-tabs:not(.fractal-tabs--divider):not(.fractal-tabs--surface) > .fractal-tabs-list > .fractal-tabs-trigger:not(.fractal-tabs-trigger--active) {
1652
+ box-shadow: inset 0 -1px 0 var(--border-subtle);
1653
+ }
1654
+ .fractal-tabs--surface > .fractal-tabs-list > .fractal-tabs-trigger {
1655
+ margin-bottom: 0;
1656
+ border-right: 1px solid var(--border-subtle);
1657
+ background: var(--bg-surface-1);
1658
+ }
1659
+ .fractal-tabs--surface > .fractal-tabs-list > .fractal-tabs-trigger:hover:not(.fractal-tabs-trigger--active):not(.fractal-tabs-trigger--disabled) {
1660
+ background: var(--hover-surface);
1661
+ }
1662
+ .fractal-tabs--surface > .fractal-tabs-list > .fractal-tabs-trigger--active {
1663
+ background: var(--bg-canvas);
1664
+ color: var(--fg-primary);
1063
1665
  }
1064
1666
  .fractal-tabs-trigger--disabled {
1065
1667
  color: var(--fg-disabled, var(--fg-secondary));
@@ -1073,6 +1675,94 @@
1073
1675
  .fractal-tabs-panel[hidden] {
1074
1676
  display: none;
1075
1677
  }
1678
+ @media (prefers-reduced-motion: reduce) {
1679
+ .fractal-tabs-list::after {
1680
+ transition: none;
1681
+ }
1682
+ }
1683
+
1684
+ /* src/components/ContentSwitcher/ContentSwitcher.css */
1685
+ .fractal-content-switcher {
1686
+ position: relative;
1687
+ display: inline-flex;
1688
+ gap: 2px;
1689
+ padding: 2px;
1690
+ border: 1px solid color-mix(in srgb, var(--border-subtle) 55%, transparent);
1691
+ border-radius: var(--radius-md);
1692
+ background: var(--bg-surface-subtle);
1693
+ font-family: var(--font-sans);
1694
+ }
1695
+ .fractal-content-switcher__indicator {
1696
+ position: absolute;
1697
+ top: 0;
1698
+ left: 0;
1699
+ width: var(--fractal-content-switcher-indicator-width, 0);
1700
+ height: var(--fractal-content-switcher-indicator-height, 0);
1701
+ border-radius: var(--radius-sm);
1702
+ background: var(--bg-canvas);
1703
+ box-shadow: var(--shadow-sm);
1704
+ opacity: 0;
1705
+ pointer-events: none;
1706
+ transform: translate3d(var(--fractal-content-switcher-indicator-x, 0), var(--fractal-content-switcher-indicator-y, 0), 0);
1707
+ }
1708
+ .fractal-content-switcher[data-indicator-ready=true] .fractal-content-switcher__indicator {
1709
+ opacity: 1;
1710
+ }
1711
+ .fractal-content-switcher[data-indicator-ready=true][data-indicator-animate=true] .fractal-content-switcher__indicator {
1712
+ transition:
1713
+ transform var(--duration-normal) var(--ease-in-out),
1714
+ width var(--duration-normal) var(--ease-in-out),
1715
+ height var(--duration-normal) var(--ease-in-out),
1716
+ opacity var(--duration-fast) var(--ease-out);
1717
+ }
1718
+ .fractal-content-switcher--full-width {
1719
+ display: flex;
1720
+ width: 100%;
1721
+ }
1722
+ .fractal-content-switcher__item {
1723
+ position: relative;
1724
+ z-index: 1;
1725
+ min-width: 128px;
1726
+ min-height: 40px;
1727
+ padding: 0 var(--space-4);
1728
+ border: 0;
1729
+ border-radius: var(--radius-sm);
1730
+ background: transparent;
1731
+ color: var(--fg-secondary);
1732
+ cursor: pointer;
1733
+ font: inherit;
1734
+ font-size: 0.875rem;
1735
+ line-height: 1.25;
1736
+ text-align: center;
1737
+ transition: background-color var(--duration-fast) var(--ease-out), color var(--duration-fast) var(--ease-out);
1738
+ }
1739
+ .fractal-content-switcher--full-width .fractal-content-switcher__item {
1740
+ flex: 1;
1741
+ }
1742
+ .fractal-content-switcher__item:hover:not(:disabled):not(.fractal-content-switcher__item--active) {
1743
+ background: var(--hover-surface);
1744
+ color: var(--fg-primary);
1745
+ }
1746
+ .fractal-content-switcher__item--active {
1747
+ background: transparent;
1748
+ color: var(--fg-primary);
1749
+ }
1750
+ .fractal-content-switcher__item:focus-visible {
1751
+ position: relative;
1752
+ z-index: 1;
1753
+ outline: 2px solid var(--border-focus);
1754
+ outline-offset: -2px;
1755
+ }
1756
+ .fractal-content-switcher__item:disabled {
1757
+ cursor: not-allowed;
1758
+ color: var(--fg-disabled);
1759
+ opacity: 0.5;
1760
+ }
1761
+ @media (prefers-reduced-motion: reduce) {
1762
+ .fractal-content-switcher[data-indicator-ready=true][data-indicator-animate=true] .fractal-content-switcher__indicator {
1763
+ transition: none;
1764
+ }
1765
+ }
1076
1766
 
1077
1767
  /* src/components/Disclosure/Disclosure.css */
1078
1768
  .fractal-disclosure {
@@ -1104,6 +1794,17 @@
1104
1794
  .fractal-disclosure-trigger:hover {
1105
1795
  background: var(--bg-surface-1);
1106
1796
  }
1797
+ .fractal-disclosure--disabled .fractal-disclosure-trigger {
1798
+ color: var(--fg-tertiary);
1799
+ cursor: not-allowed;
1800
+ }
1801
+ .fractal-disclosure--disabled .fractal-disclosure-trigger:hover {
1802
+ background: transparent;
1803
+ }
1804
+ .fractal-disclosure--disabled .fractal-disclosure-icon,
1805
+ .fractal-disclosure--disabled .fractal-disclosure-meta {
1806
+ color: var(--fg-tertiary);
1807
+ }
1107
1808
  .fractal-disclosure-trigger:focus-visible {
1108
1809
  outline: 2px solid var(--border-focus);
1109
1810
  outline-offset: -2px;
@@ -1146,58 +1847,498 @@
1146
1847
  padding: 4px 0 12px 24px;
1147
1848
  }
1148
1849
 
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 {
1850
+ /* src/components/LatticeLoader/LatticeLoader.css */
1851
+ .fractal-lattice-loader {
1164
1852
  display: flex;
1165
- min-height: 48px;
1166
1853
  align-items: center;
1167
- padding: 0 var(--space-4);
1168
- border-bottom: 1px solid var(--border-subtle);
1854
+ gap: 6px;
1855
+ width: 100%;
1856
+ height: 12px;
1857
+ overflow: hidden;
1858
+ color: var(--fg-secondary);
1169
1859
  }
1170
- .fractal-sidebar__brand {
1171
- display: inline-flex;
1860
+ .fractal-lattice-loader__cell {
1861
+ position: relative;
1862
+ width: 12px;
1863
+ flex: 0 0 12px;
1864
+ aspect-ratio: 1;
1865
+ background: currentColor;
1866
+ -webkit-mask: url("./lattice-FAYE5KWW.svg") center / contain no-repeat;
1867
+ mask: url("./lattice-FAYE5KWW.svg") center / contain no-repeat;
1868
+ opacity: 0.08;
1869
+ animation: fractal-lattice-wave 3.2s ease-in-out infinite;
1870
+ animation-delay: calc((var(--fractal-lattice-index) * 40ms) - 3.2s);
1871
+ }
1872
+ @keyframes fractal-lattice-wave {
1873
+ 0%, 58%, 100% {
1874
+ opacity: 0.08;
1875
+ }
1876
+ 18% {
1877
+ opacity: 0.28;
1878
+ }
1879
+ 30% {
1880
+ opacity: 1;
1881
+ }
1882
+ 42% {
1883
+ opacity: 0.28;
1884
+ }
1885
+ }
1886
+ @media (prefers-reduced-motion: reduce) {
1887
+ .fractal-lattice-loader__cell {
1888
+ opacity: 0.35;
1889
+ animation: none;
1890
+ }
1891
+ }
1892
+
1893
+ /* src/components/Ghost/Ghost.css */
1894
+ .fractal-ghost {
1895
+ --fractal-ghost-base: var(--bg-surface-1);
1896
+ --fractal-ghost-shine: color-mix(in srgb, var(--bg-canvas) 82%, transparent);
1897
+ position: relative;
1898
+ display: block;
1172
1899
  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);
1900
+ min-height: 1px;
1901
+ overflow: hidden;
1902
+ background: var(--fractal-ghost-base);
1903
+ border-radius: var(--radius-sm);
1184
1904
  }
1185
- .fractal-sidebar__brand:hover {
1186
- background: var(--nav-hover);
1905
+ .fractal-ghost::after {
1906
+ position: absolute;
1907
+ top: 0;
1908
+ bottom: 0;
1909
+ left: -50%;
1910
+ width: 50%;
1911
+ background:
1912
+ linear-gradient(
1913
+ 105deg,
1914
+ transparent 0%,
1915
+ var(--fractal-ghost-shine) 50%,
1916
+ transparent 100%);
1917
+ content: "";
1918
+ pointer-events: none;
1919
+ transform: translate3d(-100%, 0, 0);
1920
+ animation: fractal-ghost-shine var(--duration-ambient) linear infinite;
1921
+ will-change: transform;
1187
1922
  }
1188
- .fractal-sidebar__brand:active {
1189
- transform: scale(0.98);
1923
+ .fractal-ghost-line {
1924
+ height: 0.875rem;
1190
1925
  }
1191
- .fractal-sidebar__brand:focus-visible,
1192
- .fractal-sidebar__nav-item:focus-visible {
1193
- outline: 2px solid var(--border-focus);
1194
- outline-offset: 2px;
1926
+ .fractal-ghost-line--sm {
1927
+ height: 0.6875rem;
1195
1928
  }
1196
- .fractal-sidebar__nav {
1197
- display: flex;
1198
- flex: 1;
1199
- flex-direction: column;
1200
- gap: 0;
1929
+ .fractal-ghost-line--lg {
1930
+ height: 1.125rem;
1931
+ }
1932
+ .fractal-ghost-stack {
1933
+ display: grid;
1934
+ gap: var(--space-2);
1935
+ }
1936
+ .fractal-ghost-button {
1937
+ border-radius: var(--radius-full);
1938
+ }
1939
+ .fractal-ghost-button--xs {
1940
+ width: 72px;
1941
+ height: 28px;
1942
+ }
1943
+ .fractal-ghost-button--sm {
1944
+ width: 84px;
1945
+ height: 32px;
1946
+ }
1947
+ .fractal-ghost-button--md {
1948
+ width: 96px;
1949
+ height: 40px;
1950
+ }
1951
+ .fractal-ghost-button--lg {
1952
+ width: 108px;
1953
+ height: 44px;
1954
+ }
1955
+ .fractal-ghost-button--xl {
1956
+ width: 128px;
1957
+ height: 56px;
1958
+ }
1959
+ .fractal-ghost-button--icon-only {
1960
+ width: var(--fractal-ghost-icon-size, 40px);
1961
+ }
1962
+ .fractal-ghost-button--xs.fractal-ghost-button--icon-only {
1963
+ --fractal-ghost-icon-size: 28px;
1964
+ }
1965
+ .fractal-ghost-button--sm.fractal-ghost-button--icon-only {
1966
+ --fractal-ghost-icon-size: 32px;
1967
+ }
1968
+ .fractal-ghost-button--lg.fractal-ghost-button--icon-only {
1969
+ --fractal-ghost-icon-size: 44px;
1970
+ }
1971
+ .fractal-ghost-button--xl.fractal-ghost-button--icon-only {
1972
+ --fractal-ghost-icon-size: 56px;
1973
+ }
1974
+ .fractal-ghost-card {
1975
+ display: grid;
1976
+ gap: var(--space-4);
1977
+ padding: var(--space-5);
1978
+ border: 1px solid var(--border-subtle);
1979
+ border-radius: var(--radius-md);
1980
+ background: var(--bg-canvas);
1981
+ }
1982
+ .fractal-ghost-table {
1983
+ overflow: hidden;
1984
+ border: 1px solid var(--border-subtle);
1985
+ border-radius: var(--radius-md);
1986
+ background: var(--bg-canvas);
1987
+ }
1988
+ .fractal-ghost-table__table {
1989
+ width: 100%;
1990
+ border-collapse: separate;
1991
+ border-spacing: 0;
1992
+ }
1993
+ .fractal-ghost-table__head-row {
1994
+ background: var(--bg-surface-1);
1995
+ }
1996
+ .fractal-ghost-table th {
1997
+ padding: 12px 16px;
1998
+ border-bottom: 1px solid var(--border-subtle);
1999
+ color: var(--fg-secondary);
2000
+ font-size: 0.75rem;
2001
+ font-weight: 500;
2002
+ text-align: left;
2003
+ }
2004
+ .fractal-ghost-table td {
2005
+ padding: 14px 16px;
2006
+ }
2007
+ .fractal-ghost-table__row + .fractal-ghost-table__row td {
2008
+ border-top: 1px solid var(--border-subtle);
2009
+ }
2010
+ .fractal-ghost-table--sm th {
2011
+ padding: 8px 12px;
2012
+ }
2013
+ .fractal-ghost-table--sm td {
2014
+ padding: 10px 12px;
2015
+ }
2016
+ .fractal-ghost-table--lg th {
2017
+ padding: 18px 24px;
2018
+ }
2019
+ .fractal-ghost-table--lg td {
2020
+ padding: 22px 24px;
2021
+ }
2022
+ .fractal-ghost-field {
2023
+ display: grid;
2024
+ gap: var(--space-2);
2025
+ }
2026
+ .fractal-ghost-field__control {
2027
+ width: 100%;
2028
+ height: 40px;
2029
+ border: 1px solid var(--border-subtle);
2030
+ border-radius: var(--radius-md);
2031
+ }
2032
+ .fractal-ghost-field__control--multiline {
2033
+ height: 112px;
2034
+ }
2035
+ .fractal-ghost-label {
2036
+ border-radius: var(--radius-sm);
2037
+ }
2038
+ .fractal-ghost-alert {
2039
+ display: grid;
2040
+ gap: var(--space-2);
2041
+ padding: var(--space-4);
2042
+ border: 1px solid var(--border-subtle);
2043
+ border-radius: var(--radius-md);
2044
+ }
2045
+ .fractal-ghost-choice {
2046
+ display: flex;
2047
+ align-items: center;
2048
+ gap: var(--space-2);
2049
+ }
2050
+ .fractal-ghost-choice__control {
2051
+ width: 16px;
2052
+ height: 16px;
2053
+ border-radius: var(--radius-sm);
2054
+ }
2055
+ .fractal-ghost-chip {
2056
+ border-radius: var(--radius-full);
2057
+ }
2058
+ .fractal-ghost-link {
2059
+ display: inline-block;
2060
+ }
2061
+ .fractal-ghost-dropdown {
2062
+ display: flex;
2063
+ align-items: center;
2064
+ justify-content: space-between;
2065
+ width: 220px;
2066
+ height: 40px;
2067
+ padding: 0 var(--space-3);
2068
+ border: 1px solid var(--border-subtle);
2069
+ border-radius: var(--radius-md);
2070
+ }
2071
+ .fractal-ghost-dropdown__chevron {
2072
+ width: 14px;
2073
+ height: 14px;
2074
+ border-radius: var(--radius-full);
2075
+ }
2076
+ .fractal-ghost-switcher {
2077
+ display: flex;
2078
+ width: fit-content;
2079
+ gap: 2px;
2080
+ padding: 3px;
2081
+ border-radius: var(--radius-md);
2082
+ background: var(--bg-surface-1);
2083
+ }
2084
+ .fractal-ghost-switcher > .fractal-ghost {
2085
+ width: 76px;
2086
+ height: 32px;
2087
+ border-radius: calc(var(--radius-md) - 2px);
2088
+ }
2089
+ .fractal-ghost-disclosure {
2090
+ display: flex;
2091
+ align-items: center;
2092
+ gap: var(--space-3);
2093
+ padding: var(--space-3) 0;
2094
+ border-bottom: 1px solid var(--border-subtle);
2095
+ }
2096
+ .fractal-ghost-disclosure__icon {
2097
+ width: 16px;
2098
+ height: 16px;
2099
+ border-radius: var(--radius-full);
2100
+ }
2101
+ .fractal-ghost-pagination {
2102
+ display: flex;
2103
+ gap: var(--space-2);
2104
+ }
2105
+ .fractal-ghost-pagination > .fractal-ghost {
2106
+ width: 32px;
2107
+ height: 32px;
2108
+ border-radius: var(--radius-md);
2109
+ }
2110
+ .fractal-ghost-dropzone {
2111
+ display: grid;
2112
+ place-items: center;
2113
+ gap: var(--space-3);
2114
+ min-height: 184px;
2115
+ padding: var(--space-6);
2116
+ border: 1px dashed var(--border-default);
2117
+ border-radius: var(--radius-md);
2118
+ }
2119
+ .fractal-ghost-dropzone__icon {
2120
+ width: 32px;
2121
+ height: 32px;
2122
+ border-radius: var(--radius-full);
2123
+ }
2124
+ .fractal-ghost-prompt-card {
2125
+ min-height: 176px;
2126
+ }
2127
+ .fractal-ghost-conversation {
2128
+ display: flex;
2129
+ width: 100%;
2130
+ min-width: 0;
2131
+ flex-direction: column;
2132
+ gap: var(--space-6);
2133
+ }
2134
+ .fractal-ghost-conversation__message {
2135
+ display: grid;
2136
+ width: min(92%, 42rem);
2137
+ min-width: 0;
2138
+ gap: var(--space-2);
2139
+ }
2140
+ .fractal-ghost-conversation__message--user {
2141
+ width: min(78%, 36rem);
2142
+ align-self: flex-end;
2143
+ }
2144
+ .fractal-ghost-conversation__bubble {
2145
+ --fractal-ghost-base: color-mix(in srgb, var(--accent-text) 12%, transparent);
2146
+ --fractal-ghost-shine: color-mix(in srgb, var(--accent-text) 5%, transparent);
2147
+ display: grid;
2148
+ gap: var(--space-2);
2149
+ padding: var(--space-4);
2150
+ border: 1px solid var(--accent-surface-stroke);
2151
+ border-radius: 12px 12px 4px;
2152
+ background: var(--accent-surface-stroke);
2153
+ }
2154
+ .fractal-ghost-sidebar {
2155
+ display: grid;
2156
+ align-content: start;
2157
+ gap: var(--space-7);
2158
+ width: 248px;
2159
+ min-height: 100%;
2160
+ padding: var(--space-5);
2161
+ border-right: 1px solid var(--border-subtle);
2162
+ background: var(--bg-canvas);
2163
+ }
2164
+ .fractal-ghost-sidebar__brand {
2165
+ width: 112px;
2166
+ height: 24px;
2167
+ }
2168
+ .fractal-ghost-sidebar__items {
2169
+ display: grid;
2170
+ gap: var(--space-2);
2171
+ }
2172
+ .fractal-ghost-sidebar__item {
2173
+ display: flex;
2174
+ align-items: center;
2175
+ gap: var(--space-3);
2176
+ height: 36px;
2177
+ padding: 0 var(--space-2);
2178
+ }
2179
+ .fractal-ghost-sidebar__item > .fractal-ghost {
2180
+ width: 16px;
2181
+ height: 16px;
2182
+ border-radius: var(--radius-sm);
2183
+ }
2184
+ .fractal-ghost-surface {
2185
+ display: grid;
2186
+ gap: var(--space-5);
2187
+ padding: var(--space-6);
2188
+ border: 1px solid var(--border-subtle);
2189
+ border-radius: var(--radius-lg);
2190
+ background: var(--bg-canvas);
2191
+ }
2192
+ .fractal-ghost-modal {
2193
+ width: min(100%, 420px);
2194
+ }
2195
+ .fractal-ghost-side-panel {
2196
+ width: min(100%, 540px);
2197
+ min-height: 480px;
2198
+ }
2199
+ .fractal-ghost-surface__header {
2200
+ display: flex;
2201
+ align-items: center;
2202
+ justify-content: space-between;
2203
+ }
2204
+ .fractal-ghost-surface__close {
2205
+ width: 28px;
2206
+ height: 28px;
2207
+ border-radius: var(--radius-md);
2208
+ }
2209
+ .fractal-ghost-surface__title {
2210
+ color: var(--fg-secondary);
2211
+ font-size: 0.75rem;
2212
+ }
2213
+ @keyframes fractal-ghost-shine {
2214
+ from {
2215
+ transform: translate3d(-100%, 0, 0);
2216
+ }
2217
+ to {
2218
+ transform: translate3d(300%, 0, 0);
2219
+ }
2220
+ }
2221
+ @media (prefers-reduced-motion: reduce) {
2222
+ .fractal-ghost::after {
2223
+ display: none;
2224
+ animation: none;
2225
+ }
2226
+ }
2227
+
2228
+ /* src/components/Sidebar/Sidebar.css */
2229
+ .fractal-sidebar {
2230
+ --fractal-sidebar-width: 232px;
2231
+ --fractal-sidebar-compact-width: 56px;
2232
+ box-sizing: border-box;
2233
+ display: flex;
2234
+ width: var(--fractal-sidebar-width);
2235
+ min-width: var(--fractal-sidebar-width);
2236
+ min-height: 100%;
2237
+ flex-direction: column;
2238
+ background: var(--bg-surface-1);
2239
+ border-right: 1px solid var(--nav-border);
2240
+ color: var(--fg-primary);
2241
+ font-family: var(--font-sans);
2242
+ }
2243
+ .fractal-sidebar[data-compact] {
2244
+ z-index: 10;
2245
+ width: var(--fractal-sidebar-compact-width);
2246
+ min-width: var(--fractal-sidebar-compact-width);
2247
+ overflow: hidden;
2248
+ transition:
2249
+ width var(--duration-normal) var(--ease-out),
2250
+ min-width var(--duration-normal) var(--ease-out),
2251
+ box-shadow var(--duration-normal) var(--ease-out);
2252
+ }
2253
+ .fractal-sidebar[data-compact]:hover,
2254
+ .fractal-sidebar[data-compact]:focus-within {
2255
+ width: var(--fractal-sidebar-width);
2256
+ min-width: var(--fractal-sidebar-width);
2257
+ box-shadow: var(--shadow-md);
2258
+ }
2259
+ .fractal-sidebar__header {
2260
+ display: flex;
2261
+ min-height: 48px;
2262
+ align-items: center;
2263
+ padding: var(--space-2);
2264
+ border-bottom: 1px solid var(--border-subtle);
2265
+ }
2266
+ .fractal-sidebar__brand {
2267
+ display: inline-flex;
2268
+ min-width: 0;
2269
+ align-items: center;
2270
+ gap: var(--space-2);
2271
+ padding: var(--space-1);
2272
+ border: 0;
2273
+ border-radius: var(--radius-md);
2274
+ background: transparent;
2275
+ color: var(--fg-primary);
2276
+ cursor: pointer;
2277
+ font: inherit;
2278
+ text-align: left;
2279
+ transition: background-color var(--duration-fast) var(--ease-out), transform var(--duration-fast) var(--ease-out);
2280
+ }
2281
+ .fractal-sidebar__brand:hover {
2282
+ background: var(--nav-hover);
2283
+ }
2284
+ .fractal-sidebar__brand:active {
2285
+ transform: scale(0.98);
2286
+ }
2287
+ .fractal-sidebar__brand:focus-visible,
2288
+ .fractal-sidebar__nav-item:focus-visible,
2289
+ .fractal-sidebar__account-trigger:focus-visible {
2290
+ outline: 2px solid var(--border-focus);
2291
+ outline-offset: 2px;
2292
+ }
2293
+ .fractal-sidebar__account {
2294
+ display: block;
2295
+ width: 100%;
2296
+ }
2297
+ .fractal-sidebar__account-trigger {
2298
+ width: 100%;
2299
+ min-height: 36px;
2300
+ box-sizing: border-box;
2301
+ gap: var(--space-2);
2302
+ padding: 8px 10px;
2303
+ border: 0;
2304
+ background: transparent;
2305
+ border-radius: var(--radius-md);
2306
+ color: var(--fg-primary);
2307
+ font-weight: 500;
2308
+ }
2309
+ .fractal-sidebar__account-trigger:hover,
2310
+ .fractal-sidebar__account-trigger.fractal-dropdown-trigger--tertiary:hover {
2311
+ background: var(--nav-hover);
2312
+ }
2313
+ .fractal-sidebar__account-name {
2314
+ min-width: 0;
2315
+ flex: 1;
2316
+ overflow: hidden;
2317
+ text-overflow: ellipsis;
2318
+ white-space: nowrap;
2319
+ }
2320
+ .fractal-sidebar__account-icon {
2321
+ display: inline-flex;
2322
+ width: 18px;
2323
+ height: 18px;
2324
+ flex: 0 0 18px;
2325
+ align-items: center;
2326
+ justify-content: center;
2327
+ }
2328
+ .fractal-sidebar__account-icon > img,
2329
+ .fractal-sidebar__account-icon > svg {
2330
+ display: block;
2331
+ width: 18px;
2332
+ height: 18px;
2333
+ }
2334
+ .fractal-sidebar__account-panel {
2335
+ min-width: 100%;
2336
+ }
2337
+ .fractal-sidebar__nav {
2338
+ display: flex;
2339
+ flex: 1;
2340
+ flex-direction: column;
2341
+ gap: 0;
1201
2342
  overflow-y: auto;
1202
2343
  padding: var(--space-2);
1203
2344
  }
@@ -1284,6 +2425,7 @@
1284
2425
  border-top: 1px solid var(--border-subtle);
1285
2426
  }
1286
2427
  @media (prefers-reduced-motion: reduce) {
2428
+ .fractal-sidebar[data-compact],
1287
2429
  .fractal-sidebar__brand,
1288
2430
  .fractal-sidebar__nav-item {
1289
2431
  transition: none;
@@ -1298,6 +2440,7 @@
1298
2440
  display: flex;
1299
2441
  justify-content: flex-end;
1300
2442
  background: color-mix(in srgb, var(--fg-primary) 16%, transparent);
2443
+ animation: fractal-side-panel-overlay-in 180ms ease-out both;
1301
2444
  }
1302
2445
  .fractal-side-panel {
1303
2446
  display: flex;
@@ -1309,6 +2452,7 @@
1309
2452
  box-shadow: var(--shadow-lg);
1310
2453
  color: var(--fg-primary);
1311
2454
  font-family: var(--font-sans);
2455
+ animation: fractal-side-panel-in 180ms cubic-bezier(0.16, 1, 0.3, 1) both;
1312
2456
  }
1313
2457
  .fractal-side-panel--sm {
1314
2458
  width: min(100vw, 420px);
@@ -1319,19 +2463,23 @@
1319
2463
  .fractal-side-panel--lg {
1320
2464
  width: min(100vw, 680px);
1321
2465
  }
2466
+ .fractal-side-panel--xl {
2467
+ width: min(100vw, 960px);
2468
+ }
1322
2469
  .fractal-side-panel__header {
1323
2470
  display: flex;
1324
- min-height: 72px;
1325
2471
  align-items: flex-start;
1326
2472
  justify-content: space-between;
1327
2473
  gap: var(--space-4);
1328
- padding: var(--space-5) var(--space-6);
1329
- border-bottom: 1px solid var(--border-subtle);
2474
+ padding: var(--space-5) var(--space-6) var(--space-4);
1330
2475
  }
1331
2476
  .fractal-side-panel__heading {
1332
2477
  min-width: 0;
1333
2478
  }
1334
2479
  .fractal-side-panel__title {
2480
+ display: flex;
2481
+ min-height: 32px;
2482
+ align-items: center;
1335
2483
  margin: 0;
1336
2484
  font-size: 1rem;
1337
2485
  font-weight: 500;
@@ -1367,7 +2515,11 @@
1367
2515
  min-height: 0;
1368
2516
  flex: 1;
1369
2517
  overflow: auto;
1370
- padding: var(--space-6);
2518
+ padding: var(--space-2) var(--space-6) var(--space-6);
2519
+ }
2520
+ .fractal-side-panel__body--loading {
2521
+ display: grid;
2522
+ place-items: center;
1371
2523
  }
1372
2524
  .fractal-side-panel__footer {
1373
2525
  display: flex;
@@ -1381,15 +2533,37 @@
1381
2533
  width: 100%;
1382
2534
  }
1383
2535
  .fractal-side-panel__header {
1384
- padding: var(--space-4) var(--space-5);
2536
+ padding: var(--space-4) var(--space-5) var(--space-3);
1385
2537
  }
1386
2538
  .fractal-side-panel__body {
1387
- padding: var(--space-5);
2539
+ padding: var(--space-2) var(--space-5) var(--space-5);
1388
2540
  }
1389
2541
  .fractal-side-panel__footer {
1390
2542
  padding: var(--space-3) var(--space-5);
1391
2543
  }
1392
2544
  }
2545
+ @keyframes fractal-side-panel-overlay-in {
2546
+ from {
2547
+ opacity: 0;
2548
+ }
2549
+ to {
2550
+ opacity: 1;
2551
+ }
2552
+ }
2553
+ @keyframes fractal-side-panel-in {
2554
+ from {
2555
+ transform: translateX(100%);
2556
+ }
2557
+ to {
2558
+ transform: translateX(0);
2559
+ }
2560
+ }
2561
+ @media (prefers-reduced-motion: reduce) {
2562
+ .fractal-side-panel-overlay,
2563
+ .fractal-side-panel {
2564
+ animation-duration: 0.01ms;
2565
+ }
2566
+ }
1393
2567
 
1394
2568
  /* src/components/Textarea/Textarea.css */
1395
2569
  .fractal-textarea {
@@ -1420,4 +2594,214 @@
1420
2594
  opacity: 0.5;
1421
2595
  background: var(--bg-surface-1);
1422
2596
  }
2597
+
2598
+ /* src/components/TextButton/TextButton.css */
2599
+ .fractal-text-button {
2600
+ display: inline-flex;
2601
+ align-items: center;
2602
+ gap: var(--space-1);
2603
+ border: 0;
2604
+ background: transparent;
2605
+ cursor: pointer;
2606
+ font-family: var(--font-sans);
2607
+ font-weight: 500;
2608
+ line-height: 1.4;
2609
+ padding: 0;
2610
+ text-align: left;
2611
+ transition: color 120ms ease;
2612
+ }
2613
+ .fractal-text-button--primary {
2614
+ color: var(--fg-primary);
2615
+ }
2616
+ .fractal-text-button--primary:hover:not(:disabled) {
2617
+ color: var(--fg-secondary);
2618
+ }
2619
+ .fractal-text-button--secondary {
2620
+ color: var(--fg-secondary);
2621
+ }
2622
+ .fractal-text-button--secondary:hover:not(:disabled) {
2623
+ color: var(--fg-primary);
2624
+ }
2625
+ .fractal-text-button:focus-visible {
2626
+ outline: 2px solid var(--border-focus);
2627
+ outline-offset: 3px;
2628
+ border-radius: var(--radius-sm);
2629
+ }
2630
+ .fractal-text-button:disabled {
2631
+ cursor: not-allowed;
2632
+ opacity: 0.5;
2633
+ }
2634
+ .fractal-text-button--sm {
2635
+ font-size: 0.8125rem;
2636
+ }
2637
+ .fractal-text-button--md {
2638
+ font-size: 0.875rem;
2639
+ }
2640
+ .fractal-text-button__icon {
2641
+ display: inline-grid;
2642
+ place-items: center;
2643
+ }
2644
+
2645
+ /* src/components/FileDropzone/FileDropzone.css */
2646
+ .fractal-file-dropzone {
2647
+ display: grid;
2648
+ gap: var(--space-2);
2649
+ color: var(--fg-primary);
2650
+ font-family: var(--font-sans);
2651
+ }
2652
+ .fractal-file-dropzone__input {
2653
+ display: none;
2654
+ }
2655
+ .fractal-file-dropzone__target {
2656
+ display: flex;
2657
+ width: 100%;
2658
+ min-height: 92px;
2659
+ align-items: center;
2660
+ justify-content: center;
2661
+ gap: var(--space-3);
2662
+ border: 1px dashed var(--border-default);
2663
+ border-radius: var(--radius-md);
2664
+ background: var(--bg-canvas);
2665
+ color: var(--fg-secondary);
2666
+ cursor: pointer;
2667
+ padding: var(--space-4);
2668
+ text-align: left;
2669
+ }
2670
+ .fractal-file-dropzone__target:hover,
2671
+ .fractal-file-dropzone__target[data-dragging] {
2672
+ border-color: var(--border-focus);
2673
+ background: var(--hover-surface);
2674
+ color: var(--fg-primary);
2675
+ }
2676
+ .fractal-file-dropzone__target:focus-visible {
2677
+ outline: 2px solid var(--border-focus);
2678
+ outline-offset: 2px;
2679
+ }
2680
+ .fractal-file-dropzone__target:disabled {
2681
+ cursor: not-allowed;
2682
+ opacity: 0.5;
2683
+ }
2684
+ .fractal-file-dropzone__copy {
2685
+ display: grid;
2686
+ gap: var(--space-1);
2687
+ }
2688
+ .fractal-file-dropzone__title {
2689
+ font-size: 0.875rem;
2690
+ font-weight: 500;
2691
+ line-height: 1.4;
2692
+ }
2693
+ .fractal-file-dropzone__description {
2694
+ color: var(--fg-secondary);
2695
+ font-size: 0.8125rem;
2696
+ line-height: 1.4;
2697
+ }
2698
+ .fractal-file-dropzone__files {
2699
+ display: grid;
2700
+ gap: var(--space-1);
2701
+ margin: 0;
2702
+ padding: 0;
2703
+ list-style: none;
2704
+ }
2705
+ .fractal-file-dropzone__file {
2706
+ display: flex;
2707
+ min-width: 0;
2708
+ align-items: center;
2709
+ gap: var(--space-2);
2710
+ padding: var(--space-2) var(--space-3);
2711
+ border: 1px solid var(--border-subtle);
2712
+ border-radius: var(--radius-md);
2713
+ background: var(--bg-canvas);
2714
+ font-size: 0.8125rem;
2715
+ line-height: 1.4;
2716
+ }
2717
+ .fractal-file-dropzone__file-name {
2718
+ min-width: 0;
2719
+ flex: 1;
2720
+ overflow: hidden;
2721
+ text-overflow: ellipsis;
2722
+ white-space: nowrap;
2723
+ }
2724
+ .fractal-file-dropzone__file-meta {
2725
+ color: var(--fg-secondary);
2726
+ white-space: nowrap;
2727
+ }
2728
+ .fractal-file-dropzone__remove {
2729
+ display: grid;
2730
+ width: 24px;
2731
+ height: 24px;
2732
+ flex: 0 0 auto;
2733
+ place-items: center;
2734
+ border: 0;
2735
+ border-radius: var(--radius-sm);
2736
+ background: transparent;
2737
+ color: var(--fg-secondary);
2738
+ cursor: pointer;
2739
+ }
2740
+ .fractal-file-dropzone__remove:hover {
2741
+ background: var(--hover-surface);
2742
+ color: var(--fg-primary);
2743
+ }
2744
+ .fractal-file-dropzone__remove:focus-visible {
2745
+ outline: 2px solid var(--border-focus);
2746
+ outline-offset: 1px;
2747
+ }
2748
+ .fractal-file-dropzone__remove:disabled {
2749
+ cursor: not-allowed;
2750
+ opacity: 0.5;
2751
+ }
2752
+
2753
+ /* src/components/Pagination/Pagination.css */
2754
+ .fractal-pagination {
2755
+ display: flex;
2756
+ align-items: center;
2757
+ justify-content: space-between;
2758
+ gap: var(--space-3);
2759
+ color: var(--fg-secondary);
2760
+ font-family: var(--font-sans);
2761
+ font-size: 0.8125rem;
2762
+ line-height: 1.4;
2763
+ }
2764
+ .fractal-pagination__controls {
2765
+ display: flex;
2766
+ align-items: center;
2767
+ gap: var(--space-2);
2768
+ }
2769
+ .fractal-pagination__page-size .fractal-dropdown-trigger {
2770
+ padding: 4px 0;
2771
+ border: 0;
2772
+ background: transparent;
2773
+ color: var(--fg-secondary);
2774
+ }
2775
+ .fractal-pagination__page-size .fractal-dropdown-trigger:hover {
2776
+ background: transparent;
2777
+ color: var(--fg-primary);
2778
+ }
2779
+ .fractal-pagination__button {
2780
+ display: grid;
2781
+ width: 28px;
2782
+ height: 28px;
2783
+ place-items: center;
2784
+ border: 1px solid var(--border-default);
2785
+ border-radius: var(--radius-sm);
2786
+ background: var(--bg-canvas);
2787
+ color: var(--fg-secondary);
2788
+ cursor: pointer;
2789
+ }
2790
+ .fractal-pagination__button:hover:not(:disabled) {
2791
+ background: var(--hover-surface);
2792
+ color: var(--fg-primary);
2793
+ }
2794
+ .fractal-pagination__button:focus-visible {
2795
+ outline: 2px solid var(--border-focus);
2796
+ outline-offset: 2px;
2797
+ }
2798
+ .fractal-pagination__button:disabled {
2799
+ cursor: not-allowed;
2800
+ opacity: 0.45;
2801
+ }
2802
+ .fractal-pagination__page {
2803
+ min-width: 44px;
2804
+ text-align: center;
2805
+ white-space: nowrap;
2806
+ }
1423
2807
  /*# sourceMappingURL=index.css.map */