@mirror-physics/fractal-ui 0.2.0-next.3 → 0.2.0-next.31

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
@@ -401,9 +401,11 @@
401
401
  height: 18px;
402
402
  font-size: 0.75rem;
403
403
  font-weight: 600;
404
- border-radius: 50%;
405
404
  margin-top: 1px;
406
405
  }
406
+ .fractal-alert-icon svg {
407
+ display: block;
408
+ }
407
409
  .fractal-alert-content {
408
410
  flex: 1;
409
411
  min-width: 0;
@@ -415,53 +417,49 @@
415
417
  line-height: 1.4;
416
418
  }
417
419
  .fractal-alert-description {
420
+ color: var(--fg-secondary);
418
421
  font-size: 0.875rem;
419
422
  line-height: 1.5;
420
423
  }
421
424
  .fractal-alert--default {
422
425
  background-color: var(--bg-canvas);
423
- border-color: var(--border-default);
426
+ border-color: var(--border-subtle);
424
427
  color: var(--fg-primary);
425
428
  }
426
429
  .fractal-alert--default .fractal-alert-icon {
427
- background: var(--bg-surface-2);
428
430
  color: var(--fg-secondary);
429
431
  }
430
432
  .fractal-alert--info {
431
433
  background-color: var(--accent-surface);
432
- border-color: var(--accent-default);
434
+ border-color: var(--accent-surface-stroke);
433
435
  color: var(--fg-primary);
434
436
  }
435
437
  .fractal-alert--info .fractal-alert-icon {
436
- background: var(--accent-default);
437
- color: var(--fg-inverse);
438
+ color: var(--accent-default);
438
439
  }
439
440
  .fractal-alert--success {
440
441
  background-color: var(--success-surface);
441
- border-color: var(--success-default);
442
+ border-color: var(--success-surface-stroke);
442
443
  color: var(--fg-primary);
443
444
  }
444
445
  .fractal-alert--success .fractal-alert-icon {
445
- background: var(--success-default);
446
- color: var(--fg-inverse);
446
+ color: var(--success-default);
447
447
  }
448
448
  .fractal-alert--warning {
449
449
  background-color: var(--warning-surface);
450
- border-color: var(--warning-default);
450
+ border-color: var(--warning-surface-stroke);
451
451
  color: var(--fg-primary);
452
452
  }
453
453
  .fractal-alert--warning .fractal-alert-icon {
454
- background: var(--warning-default);
455
- color: var(--fg-inverse);
454
+ color: var(--warning-default);
456
455
  }
457
456
  .fractal-alert--error {
458
457
  background-color: var(--error-surface);
459
- border-color: var(--error-default);
458
+ border-color: var(--error-surface-stroke);
460
459
  color: var(--fg-primary);
461
460
  }
462
461
  .fractal-alert--error .fractal-alert-icon {
463
- background: var(--error-default);
464
- color: var(--fg-inverse);
462
+ color: var(--error-default);
465
463
  }
466
464
 
467
465
  /* src/components/Toggle/Toggle.css */
@@ -506,6 +504,60 @@
506
504
  user-select: none;
507
505
  }
508
506
 
507
+ /* src/components/UILoader/UILoader.css */
508
+ .fractal-ui-loader {
509
+ display: inline-flex;
510
+ line-height: 0;
511
+ }
512
+ .fractal-ui-loader svg {
513
+ display: block;
514
+ overflow: visible;
515
+ }
516
+ .fractal-ui-loader__stop-start {
517
+ stop-color: var(--grey-200);
518
+ }
519
+ .fractal-ui-loader__stop-end {
520
+ stop-color: var(--grey-100);
521
+ }
522
+ .fractal-ui-loader--blue .fractal-ui-loader__stop-start {
523
+ stop-color: var(--blue-500);
524
+ }
525
+ .fractal-ui-loader--blue .fractal-ui-loader__stop-end {
526
+ stop-color: var(--blue-300);
527
+ }
528
+ .fractal-ui-loader--green .fractal-ui-loader__stop-start {
529
+ stop-color: var(--green-500);
530
+ }
531
+ .fractal-ui-loader--green .fractal-ui-loader__stop-end {
532
+ stop-color: var(--green-300);
533
+ }
534
+ .fractal-ui-loader__shine-axis {
535
+ transform-box: view-box;
536
+ transform-origin: 0 0;
537
+ }
538
+ .fractal-ui-loader__shine {
539
+ animation: fractal-ui-loader-shine 2500ms var(--ease-in-out) infinite;
540
+ transform-box: view-box;
541
+ transform-origin: 0 0;
542
+ }
543
+ @keyframes fractal-ui-loader-shine {
544
+ 0%, 12% {
545
+ transform: translateX(-120px);
546
+ }
547
+ 48% {
548
+ transform: translateX(120px);
549
+ }
550
+ 49%, 100% {
551
+ transform: translateX(-120px);
552
+ }
553
+ }
554
+ @media (prefers-reduced-motion: reduce) {
555
+ .fractal-ui-loader__shine {
556
+ animation: none;
557
+ transform: translateX(0);
558
+ }
559
+ }
560
+
509
561
  /* src/components/Modal/Modal.css */
510
562
  .fractal-modal-overlay {
511
563
  position: fixed;
@@ -576,10 +628,23 @@
576
628
  color: var(--fg-primary);
577
629
  background: var(--bg-surface-1);
578
630
  }
631
+ .fractal-modal-close:disabled {
632
+ cursor: not-allowed;
633
+ opacity: 0.4;
634
+ }
635
+ .fractal-modal-close:disabled:hover {
636
+ color: var(--fg-secondary);
637
+ background: none;
638
+ }
579
639
  .fractal-modal-body {
580
640
  font-size: 0.875rem;
581
641
  color: var(--fg-secondary);
582
642
  }
643
+ .fractal-modal-body--loading {
644
+ display: grid;
645
+ min-height: 168px;
646
+ place-items: center;
647
+ }
583
648
  .fractal-modal-body--lg {
584
649
  flex: 1;
585
650
  min-height: 0;
@@ -600,7 +665,7 @@
600
665
  .fractal-datatable-surface {
601
666
  overflow: hidden;
602
667
  border: 1px solid var(--border-subtle);
603
- border-radius: var(--radius-xl, 12px);
668
+ border-radius: var(--radius-md, 6px);
604
669
  background: var(--bg-canvas);
605
670
  }
606
671
  .fractal-datatable-header {
@@ -639,9 +704,6 @@
639
704
  border-bottom: 1px solid var(--border-subtle);
640
705
  vertical-align: middle;
641
706
  }
642
- .fractal-datatable-th + .fractal-datatable-th {
643
- border-left: 1px solid var(--border-subtle);
644
- }
645
707
  .fractal-datatable-row {
646
708
  background: var(--bg-canvas);
647
709
  transition: background 120ms ease;
@@ -656,8 +718,8 @@
656
718
  vertical-align: top;
657
719
  overflow-wrap: anywhere;
658
720
  }
659
- .fractal-datatable-td + .fractal-datatable-td {
660
- border-left: 1px solid var(--border-subtle);
721
+ .fractal-datatable-td .fractal-dropdown-trigger--icon-only.fractal-dropdown-trigger--tertiary:hover {
722
+ background: var(--bg-canvas);
661
723
  }
662
724
  .fractal-datatable-row + .fractal-datatable-row .fractal-datatable-td {
663
725
  border-top: 1px solid var(--border-subtle);
@@ -700,6 +762,16 @@
700
762
  padding: 4px 8px;
701
763
  font-size: 0.75rem;
702
764
  }
765
+ .fractal-dropdown-trigger--icon-only {
766
+ width: 32px;
767
+ height: 32px;
768
+ justify-content: center;
769
+ padding: 0;
770
+ }
771
+ .fractal-dropdown-trigger--icon-only.fractal-dropdown-trigger--sm {
772
+ width: 28px;
773
+ height: 28px;
774
+ }
703
775
  .fractal-dropdown-trigger--tertiary {
704
776
  border-color: transparent;
705
777
  background: transparent;
@@ -708,6 +780,17 @@
708
780
  .fractal-dropdown-trigger--tertiary:hover {
709
781
  background: var(--bg-surface-1);
710
782
  }
783
+ .fractal-dropdown-trigger:disabled,
784
+ .fractal-dropdown-trigger:disabled:hover {
785
+ color: var(--fg-disabled);
786
+ cursor: not-allowed;
787
+ background: var(--bg-surface-1);
788
+ }
789
+ .fractal-dropdown-trigger:disabled .fractal-dropdown-selected-text,
790
+ .fractal-dropdown-trigger:disabled .fractal-dropdown-chevron,
791
+ .fractal-dropdown-trigger:disabled .fractal-dropdown-icon {
792
+ color: var(--fg-disabled);
793
+ }
711
794
  .fractal-dropdown-trigger:focus-visible {
712
795
  outline: none;
713
796
  box-shadow: 0 0 0 2px var(--bg-canvas), 0 0 0 4px var(--border-focus);
@@ -731,12 +814,15 @@
731
814
  .fractal-dropdown-chevron {
732
815
  display: flex;
733
816
  flex-shrink: 0;
817
+ margin-left: auto;
734
818
  color: var(--fg-secondary);
735
819
  }
736
820
  .fractal-dropdown-panel {
737
821
  position: absolute;
738
822
  z-index: 999999;
823
+ min-width: 100%;
739
824
  overflow: hidden;
825
+ box-sizing: border-box;
740
826
  border-radius: var(--radius-md, 6px);
741
827
  border: 1px solid var(--border-subtle);
742
828
  background: var(--bg-canvas);
@@ -755,6 +841,7 @@
755
841
  .fractal-dropdown-option {
756
842
  display: flex;
757
843
  width: 100%;
844
+ box-sizing: border-box;
758
845
  align-items: center;
759
846
  gap: 8px;
760
847
  padding: 6px 8px;
@@ -778,7 +865,7 @@
778
865
  }
779
866
  .fractal-dropdown-option:hover,
780
867
  .fractal-dropdown-option:focus-visible {
781
- background: var(--hover-canvas, var(--bg-surface-2));
868
+ background: var(--hover-surface, var(--bg-surface-2));
782
869
  outline: none;
783
870
  }
784
871
  .fractal-dropdown-separator {
@@ -874,6 +961,35 @@
874
961
  color: var(--accent-default);
875
962
  }
876
963
 
964
+ /* src/components/Checkbox/Checkbox.css */
965
+ .fractal-checkbox {
966
+ display: grid;
967
+ width: 28px;
968
+ height: 28px;
969
+ place-items: center;
970
+ padding: 0;
971
+ border: 0;
972
+ border-radius: var(--radius-sm);
973
+ background: transparent;
974
+ color: var(--fg-secondary);
975
+ cursor: pointer;
976
+ }
977
+ .fractal-checkbox:hover:not(:disabled) {
978
+ background: var(--hover-canvas);
979
+ color: var(--fg-primary);
980
+ }
981
+ .fractal-checkbox--checked {
982
+ color: var(--fg-primary);
983
+ }
984
+ .fractal-checkbox:focus-visible {
985
+ outline: 2px solid var(--border-focus);
986
+ outline-offset: 2px;
987
+ }
988
+ .fractal-checkbox:disabled {
989
+ cursor: not-allowed;
990
+ color: var(--fg-disabled);
991
+ }
992
+
877
993
  /* src/components/SortableTable/SortableTable.css */
878
994
  .fractal-sortable-table {
879
995
  font-family: var(--font-sans);
@@ -882,9 +998,14 @@
882
998
  .fractal-sortable-table-surface {
883
999
  overflow: hidden;
884
1000
  border: 1px solid var(--border-subtle);
885
- border-radius: var(--radius-xl, 12px);
1001
+ border-radius: var(--radius-md, 6px);
886
1002
  background: var(--bg-canvas);
887
1003
  }
1004
+ .fractal-sortable-table--embedded .fractal-sortable-table-surface {
1005
+ border: 0;
1006
+ border-top: 1px solid var(--border-subtle);
1007
+ border-radius: 0;
1008
+ }
888
1009
  .fractal-sortable-table-header {
889
1010
  display: flex;
890
1011
  align-items: center;
@@ -922,9 +1043,6 @@
922
1043
  vertical-align: middle;
923
1044
  white-space: nowrap;
924
1045
  }
925
- .fractal-sortable-table-th + .fractal-sortable-table-th {
926
- border-left: 1px solid var(--border-subtle);
927
- }
928
1046
  .fractal-sortable-table-th--sortable {
929
1047
  padding: 0;
930
1048
  }
@@ -977,6 +1095,56 @@
977
1095
  .fractal-sortable-table-row:hover {
978
1096
  background: var(--bg-surface-1);
979
1097
  }
1098
+ .fractal-sortable-table-row--interactive {
1099
+ cursor: pointer;
1100
+ }
1101
+ .fractal-sortable-table-td--row-action {
1102
+ position: relative;
1103
+ }
1104
+ .fractal-sortable-table-td .fractal-dropdown-trigger--icon-only.fractal-dropdown-trigger--tertiary:hover {
1105
+ background: var(--bg-canvas);
1106
+ }
1107
+ .fractal-sortable-table-row-action {
1108
+ position: absolute;
1109
+ z-index: 1;
1110
+ top: 0;
1111
+ right: -1px;
1112
+ bottom: 0;
1113
+ display: flex;
1114
+ width: min(280px, calc(200% + 32px));
1115
+ align-items: center;
1116
+ justify-content: flex-end;
1117
+ padding-right: var(--space-4);
1118
+ background:
1119
+ linear-gradient(
1120
+ 90deg,
1121
+ transparent 0%,
1122
+ color-mix(in srgb, var(--hover-surface) 72%, transparent) 52%,
1123
+ var(--hover-surface) 100%);
1124
+ opacity: 0;
1125
+ pointer-events: none;
1126
+ transition: opacity 150ms ease-out;
1127
+ }
1128
+ .fractal-sortable-table-row--interactive:hover .fractal-sortable-table-row-action,
1129
+ .fractal-sortable-table-row--interactive:focus-visible .fractal-sortable-table-row-action {
1130
+ opacity: 1;
1131
+ }
1132
+ .fractal-sortable-table-row-action__icon {
1133
+ display: grid;
1134
+ width: 32px;
1135
+ height: 32px;
1136
+ place-items: center;
1137
+ border: 1px solid var(--border-default);
1138
+ border-radius: var(--radius-full);
1139
+ background: var(--bg-canvas);
1140
+ color: var(--fg-primary);
1141
+ }
1142
+ .fractal-sortable-table-row--interactive:focus-visible {
1143
+ position: relative;
1144
+ z-index: 1;
1145
+ outline: 2px solid var(--border-focus);
1146
+ outline-offset: -2px;
1147
+ }
980
1148
  .fractal-sortable-table-row + .fractal-sortable-table-row .fractal-sortable-table-td {
981
1149
  border-top: 1px solid var(--border-subtle);
982
1150
  }
@@ -993,17 +1161,14 @@
993
1161
  vertical-align: top;
994
1162
  overflow-wrap: anywhere;
995
1163
  }
996
- .fractal-sortable-table-td + .fractal-sortable-table-td {
997
- border-left: 1px solid var(--border-subtle);
998
- }
999
- .fractal-sortable-table--sm .fractal-sortable-table-th,
1164
+ .fractal-sortable-table--sm .fractal-sortable-table-th:not(.fractal-sortable-table-th--sortable),
1000
1165
  .fractal-sortable-table--sm .fractal-sortable-table-sort-button {
1001
1166
  padding: 8px 12px;
1002
1167
  }
1003
1168
  .fractal-sortable-table--sm .fractal-sortable-table-td {
1004
1169
  padding: 10px 12px;
1005
1170
  }
1006
- .fractal-sortable-table--lg .fractal-sortable-table-th,
1171
+ .fractal-sortable-table--lg .fractal-sortable-table-th:not(.fractal-sortable-table-th--sortable),
1007
1172
  .fractal-sortable-table--lg .fractal-sortable-table-sort-button {
1008
1173
  padding: 18px 24px;
1009
1174
  }
@@ -1017,17 +1182,40 @@
1017
1182
  font-size: 0.875rem;
1018
1183
  }
1019
1184
  .fractal-tabs-list {
1185
+ position: relative;
1020
1186
  display: flex;
1021
1187
  gap: 24px;
1188
+ margin-bottom: var(--space-6);
1189
+ }
1190
+ .fractal-tabs--divider > .fractal-tabs-list {
1022
1191
  border-bottom: 1px solid var(--border-subtle);
1023
- margin-bottom: 16px;
1192
+ }
1193
+ .fractal-tabs-list::after {
1194
+ position: absolute;
1195
+ bottom: -1px;
1196
+ left: 0;
1197
+ width: var(--fractal-tabs-indicator-width, 0px);
1198
+ height: 2px;
1199
+ background: var(--accent-default);
1200
+ content: "";
1201
+ opacity: 0;
1202
+ transform: translateX(var(--fractal-tabs-indicator-offset, 0px));
1203
+ transition:
1204
+ transform 180ms var(--ease-standard, ease),
1205
+ width 180ms var(--ease-standard, ease),
1206
+ opacity 100ms ease;
1207
+ }
1208
+ .fractal-tabs-list[data-indicator-ready=true]::after {
1209
+ opacity: 1;
1024
1210
  }
1025
1211
  .fractal-tabs-trigger {
1026
1212
  position: relative;
1027
1213
  display: inline-flex;
1214
+ min-width: 88px;
1028
1215
  align-items: center;
1216
+ justify-content: center;
1029
1217
  gap: 6px;
1030
- padding: 10px 0;
1218
+ padding: 10px 1rem;
1031
1219
  background: none;
1032
1220
  border: 0;
1033
1221
  font: inherit;
@@ -1035,8 +1223,7 @@
1035
1223
  font-weight: 400;
1036
1224
  color: var(--fg-secondary);
1037
1225
  cursor: pointer;
1038
- transition: color 0.15s ease, box-shadow 0.15s ease;
1039
- box-shadow: inset 0 -1px 0 transparent;
1226
+ transition: color 0.15s ease;
1040
1227
  margin-bottom: -1px;
1041
1228
  }
1042
1229
  .fractal-tabs-trigger:hover:not(.fractal-tabs-trigger--active):not(.fractal-tabs-trigger--disabled) {
@@ -1050,7 +1237,9 @@
1050
1237
  .fractal-tabs-trigger--active {
1051
1238
  color: var(--accent-default);
1052
1239
  font-weight: 500;
1053
- box-shadow: inset 0 -1px 0 var(--accent-default);
1240
+ }
1241
+ .fractal-tabs:not(.fractal-tabs--divider) > .fractal-tabs-list > .fractal-tabs-trigger:not(.fractal-tabs-trigger--active) {
1242
+ box-shadow: inset 0 -1px 0 var(--border-subtle);
1054
1243
  }
1055
1244
  .fractal-tabs-trigger--disabled {
1056
1245
  color: var(--fg-disabled, var(--fg-secondary));
@@ -1064,6 +1253,91 @@
1064
1253
  .fractal-tabs-panel[hidden] {
1065
1254
  display: none;
1066
1255
  }
1256
+ @media (prefers-reduced-motion: reduce) {
1257
+ .fractal-tabs-list::after {
1258
+ transition: none;
1259
+ }
1260
+ }
1261
+
1262
+ /* src/components/ContentSwitcher/ContentSwitcher.css */
1263
+ .fractal-content-switcher {
1264
+ position: relative;
1265
+ display: inline-flex;
1266
+ gap: 2px;
1267
+ padding: 2px;
1268
+ border: 1px solid var(--border-subtle);
1269
+ border-radius: var(--radius-md);
1270
+ background: var(--bg-surface-subtle);
1271
+ font-family: var(--font-sans);
1272
+ }
1273
+ .fractal-content-switcher__indicator {
1274
+ position: absolute;
1275
+ top: 0;
1276
+ left: 0;
1277
+ width: var(--fractal-content-switcher-indicator-width, 0);
1278
+ height: var(--fractal-content-switcher-indicator-height, 0);
1279
+ border-radius: var(--radius-sm);
1280
+ background: var(--bg-canvas);
1281
+ opacity: 0;
1282
+ pointer-events: none;
1283
+ transform: translate3d(var(--fractal-content-switcher-indicator-x, 0), var(--fractal-content-switcher-indicator-y, 0), 0);
1284
+ }
1285
+ .fractal-content-switcher[data-indicator-ready=true] .fractal-content-switcher__indicator {
1286
+ opacity: 1;
1287
+ transition:
1288
+ transform var(--duration-normal) var(--ease-in-out),
1289
+ width var(--duration-normal) var(--ease-in-out),
1290
+ height var(--duration-normal) var(--ease-in-out),
1291
+ opacity var(--duration-fast) var(--ease-out);
1292
+ }
1293
+ .fractal-content-switcher--full-width {
1294
+ display: flex;
1295
+ width: 100%;
1296
+ }
1297
+ .fractal-content-switcher__item {
1298
+ position: relative;
1299
+ z-index: 1;
1300
+ min-width: 128px;
1301
+ min-height: 40px;
1302
+ padding: 0 var(--space-4);
1303
+ border: 0;
1304
+ border-radius: var(--radius-sm);
1305
+ background: transparent;
1306
+ color: var(--fg-secondary);
1307
+ cursor: pointer;
1308
+ font: inherit;
1309
+ font-size: 0.875rem;
1310
+ line-height: 1.25;
1311
+ text-align: center;
1312
+ transition: background-color var(--duration-fast) var(--ease-out), color var(--duration-fast) var(--ease-out);
1313
+ }
1314
+ .fractal-content-switcher--full-width .fractal-content-switcher__item {
1315
+ flex: 1;
1316
+ }
1317
+ .fractal-content-switcher__item:hover:not(:disabled):not(.fractal-content-switcher__item--active) {
1318
+ background: var(--hover-surface);
1319
+ color: var(--fg-primary);
1320
+ }
1321
+ .fractal-content-switcher__item--active {
1322
+ background: transparent;
1323
+ color: var(--fg-primary);
1324
+ }
1325
+ .fractal-content-switcher__item:focus-visible {
1326
+ position: relative;
1327
+ z-index: 1;
1328
+ outline: 2px solid var(--border-focus);
1329
+ outline-offset: -2px;
1330
+ }
1331
+ .fractal-content-switcher__item:disabled {
1332
+ cursor: not-allowed;
1333
+ color: var(--fg-disabled);
1334
+ opacity: 0.5;
1335
+ }
1336
+ @media (prefers-reduced-motion: reduce) {
1337
+ .fractal-content-switcher[data-indicator-ready=true] .fractal-content-switcher__indicator {
1338
+ transition: none;
1339
+ }
1340
+ }
1067
1341
 
1068
1342
  /* src/components/Disclosure/Disclosure.css */
1069
1343
  .fractal-disclosure {
@@ -1095,6 +1369,17 @@
1095
1369
  .fractal-disclosure-trigger:hover {
1096
1370
  background: var(--bg-surface-1);
1097
1371
  }
1372
+ .fractal-disclosure--disabled .fractal-disclosure-trigger {
1373
+ color: var(--fg-tertiary);
1374
+ cursor: not-allowed;
1375
+ }
1376
+ .fractal-disclosure--disabled .fractal-disclosure-trigger:hover {
1377
+ background: transparent;
1378
+ }
1379
+ .fractal-disclosure--disabled .fractal-disclosure-icon,
1380
+ .fractal-disclosure--disabled .fractal-disclosure-meta {
1381
+ color: var(--fg-tertiary);
1382
+ }
1098
1383
  .fractal-disclosure-trigger:focus-visible {
1099
1384
  outline: 2px solid var(--border-focus);
1100
1385
  outline-offset: -2px;
@@ -1137,75 +1422,444 @@
1137
1422
  padding: 4px 0 12px 24px;
1138
1423
  }
1139
1424
 
1140
- /* src/components/Sidebar/Sidebar.css */
1141
- .fractal-sidebar {
1142
- --fractal-sidebar-width: 232px;
1143
- box-sizing: border-box;
1144
- display: flex;
1145
- width: var(--fractal-sidebar-width);
1146
- min-width: var(--fractal-sidebar-width);
1147
- min-height: 100%;
1148
- flex-direction: column;
1149
- background: var(--bg-surface-1);
1150
- border-right: 1px solid var(--nav-border);
1151
- color: var(--fg-primary);
1152
- font-family: var(--font-sans);
1153
- }
1154
- .fractal-sidebar__header {
1425
+ /* src/components/LatticeLoader/LatticeLoader.css */
1426
+ .fractal-lattice-loader {
1155
1427
  display: flex;
1156
- min-height: 48px;
1157
1428
  align-items: center;
1158
- padding: 0 var(--space-4);
1159
- border-bottom: 1px solid var(--border-subtle);
1429
+ gap: 6px;
1430
+ width: 100%;
1431
+ height: 12px;
1432
+ overflow: hidden;
1433
+ color: var(--fg-secondary);
1160
1434
  }
1161
- .fractal-sidebar__brand {
1162
- display: inline-flex;
1435
+ .fractal-lattice-loader__cell {
1436
+ position: relative;
1437
+ width: 12px;
1438
+ flex: 0 0 12px;
1439
+ aspect-ratio: 1;
1440
+ background: currentColor;
1441
+ -webkit-mask: url("./lattice-FAYE5KWW.svg") center / contain no-repeat;
1442
+ mask: url("./lattice-FAYE5KWW.svg") center / contain no-repeat;
1443
+ opacity: 0.08;
1444
+ animation: fractal-lattice-wave 3.2s ease-in-out infinite;
1445
+ animation-delay: calc((var(--fractal-lattice-index) * 40ms) - 3.2s);
1446
+ }
1447
+ @keyframes fractal-lattice-wave {
1448
+ 0%, 58%, 100% {
1449
+ opacity: 0.08;
1450
+ }
1451
+ 18% {
1452
+ opacity: 0.28;
1453
+ }
1454
+ 30% {
1455
+ opacity: 1;
1456
+ }
1457
+ 42% {
1458
+ opacity: 0.28;
1459
+ }
1460
+ }
1461
+ @media (prefers-reduced-motion: reduce) {
1462
+ .fractal-lattice-loader__cell {
1463
+ opacity: 0.35;
1464
+ animation: none;
1465
+ }
1466
+ }
1467
+
1468
+ /* src/components/Ghost/Ghost.css */
1469
+ .fractal-ghost {
1470
+ --fractal-ghost-base: var(--bg-surface-1);
1471
+ --fractal-ghost-shine: color-mix(in srgb, var(--bg-canvas) 82%, transparent);
1472
+ display: block;
1163
1473
  min-width: 0;
1164
- align-items: center;
1474
+ min-height: 1px;
1475
+ background:
1476
+ linear-gradient(
1477
+ 105deg,
1478
+ var(--fractal-ghost-base) 20%,
1479
+ var(--fractal-ghost-shine) 44%,
1480
+ var(--fractal-ghost-base) 68%);
1481
+ background-size: 220% 100%;
1482
+ border-radius: var(--radius-sm);
1483
+ animation: fractal-ghost-shine var(--duration-ambient) var(--ease-in-out) infinite;
1484
+ }
1485
+ .fractal-ghost-line {
1486
+ height: 0.875rem;
1487
+ }
1488
+ .fractal-ghost-line--sm {
1489
+ height: 0.6875rem;
1490
+ }
1491
+ .fractal-ghost-line--lg {
1492
+ height: 1.125rem;
1493
+ }
1494
+ .fractal-ghost-stack {
1495
+ display: grid;
1165
1496
  gap: var(--space-2);
1166
- padding: var(--space-1);
1167
- border: 0;
1168
- border-radius: var(--radius-md);
1169
- background: transparent;
1170
- color: var(--fg-primary);
1171
- cursor: pointer;
1172
- font: inherit;
1173
- text-align: left;
1174
- transition: background-color var(--duration-fast) var(--ease-out), transform var(--duration-fast) var(--ease-out);
1175
1497
  }
1176
- .fractal-sidebar__brand:hover {
1177
- background: var(--nav-hover);
1498
+ .fractal-ghost-button {
1499
+ border-radius: var(--radius-full);
1178
1500
  }
1179
- .fractal-sidebar__brand:active {
1180
- transform: scale(0.98);
1501
+ .fractal-ghost-button--xs {
1502
+ width: 72px;
1503
+ height: 28px;
1181
1504
  }
1182
- .fractal-sidebar__brand:focus-visible,
1183
- .fractal-sidebar__nav-item:focus-visible {
1184
- outline: 2px solid var(--border-focus);
1185
- outline-offset: 2px;
1505
+ .fractal-ghost-button--sm {
1506
+ width: 84px;
1507
+ height: 32px;
1186
1508
  }
1187
- .fractal-sidebar__nav {
1188
- display: flex;
1189
- flex: 1;
1190
- flex-direction: column;
1191
- gap: 0;
1192
- overflow-y: auto;
1193
- padding: var(--space-2);
1509
+ .fractal-ghost-button--md {
1510
+ width: 96px;
1511
+ height: 40px;
1194
1512
  }
1195
- .fractal-sidebar__section {
1196
- display: flex;
1197
- flex-direction: column;
1198
- gap: 1px;
1513
+ .fractal-ghost-button--lg {
1514
+ width: 108px;
1515
+ height: 44px;
1199
1516
  }
1200
- .fractal-sidebar__section + .fractal-sidebar__section {
1201
- position: relative;
1202
- margin-top: var(--space-2);
1203
- padding-top: var(--space-2);
1517
+ .fractal-ghost-button--xl {
1518
+ width: 128px;
1519
+ height: 56px;
1204
1520
  }
1205
- .fractal-sidebar__section + .fractal-sidebar__section::before {
1206
- position: absolute;
1207
- top: 0;
1208
- right: var(--space-2);
1521
+ .fractal-ghost-button--icon-only {
1522
+ width: var(--fractal-ghost-icon-size, 40px);
1523
+ }
1524
+ .fractal-ghost-button--xs.fractal-ghost-button--icon-only {
1525
+ --fractal-ghost-icon-size: 28px;
1526
+ }
1527
+ .fractal-ghost-button--sm.fractal-ghost-button--icon-only {
1528
+ --fractal-ghost-icon-size: 32px;
1529
+ }
1530
+ .fractal-ghost-button--lg.fractal-ghost-button--icon-only {
1531
+ --fractal-ghost-icon-size: 44px;
1532
+ }
1533
+ .fractal-ghost-button--xl.fractal-ghost-button--icon-only {
1534
+ --fractal-ghost-icon-size: 56px;
1535
+ }
1536
+ .fractal-ghost-card {
1537
+ display: grid;
1538
+ gap: var(--space-4);
1539
+ padding: var(--space-5);
1540
+ border: 1px solid var(--border-subtle);
1541
+ border-radius: var(--radius-md);
1542
+ background: var(--bg-canvas);
1543
+ }
1544
+ .fractal-ghost-table {
1545
+ overflow: hidden;
1546
+ border: 1px solid var(--border-subtle);
1547
+ border-radius: var(--radius-md);
1548
+ background: var(--bg-canvas);
1549
+ }
1550
+ .fractal-ghost-table__table {
1551
+ width: 100%;
1552
+ border-collapse: separate;
1553
+ border-spacing: 0;
1554
+ }
1555
+ .fractal-ghost-table__head-row {
1556
+ background: var(--bg-surface-1);
1557
+ }
1558
+ .fractal-ghost-table th {
1559
+ padding: 12px 16px;
1560
+ border-bottom: 1px solid var(--border-subtle);
1561
+ color: var(--fg-secondary);
1562
+ font-size: 0.75rem;
1563
+ font-weight: 500;
1564
+ text-align: left;
1565
+ }
1566
+ .fractal-ghost-table td {
1567
+ padding: 14px 16px;
1568
+ }
1569
+ .fractal-ghost-table__row + .fractal-ghost-table__row td {
1570
+ border-top: 1px solid var(--border-subtle);
1571
+ }
1572
+ .fractal-ghost-table--sm th {
1573
+ padding: 8px 12px;
1574
+ }
1575
+ .fractal-ghost-table--sm td {
1576
+ padding: 10px 12px;
1577
+ }
1578
+ .fractal-ghost-table--lg th {
1579
+ padding: 18px 24px;
1580
+ }
1581
+ .fractal-ghost-table--lg td {
1582
+ padding: 22px 24px;
1583
+ }
1584
+ .fractal-ghost-field {
1585
+ display: grid;
1586
+ gap: var(--space-2);
1587
+ }
1588
+ .fractal-ghost-field__control {
1589
+ width: 100%;
1590
+ height: 40px;
1591
+ border: 1px solid var(--border-subtle);
1592
+ border-radius: var(--radius-md);
1593
+ }
1594
+ .fractal-ghost-field__control--multiline {
1595
+ height: 112px;
1596
+ }
1597
+ .fractal-ghost-label {
1598
+ border-radius: var(--radius-sm);
1599
+ }
1600
+ .fractal-ghost-alert {
1601
+ display: grid;
1602
+ gap: var(--space-2);
1603
+ padding: var(--space-4);
1604
+ border: 1px solid var(--border-subtle);
1605
+ border-radius: var(--radius-md);
1606
+ }
1607
+ .fractal-ghost-choice {
1608
+ display: flex;
1609
+ align-items: center;
1610
+ gap: var(--space-2);
1611
+ }
1612
+ .fractal-ghost-choice__control {
1613
+ width: 16px;
1614
+ height: 16px;
1615
+ border-radius: var(--radius-sm);
1616
+ }
1617
+ .fractal-ghost-chip {
1618
+ border-radius: var(--radius-full);
1619
+ }
1620
+ .fractal-ghost-link {
1621
+ display: inline-block;
1622
+ }
1623
+ .fractal-ghost-dropdown {
1624
+ display: flex;
1625
+ align-items: center;
1626
+ justify-content: space-between;
1627
+ width: 220px;
1628
+ height: 40px;
1629
+ padding: 0 var(--space-3);
1630
+ border: 1px solid var(--border-subtle);
1631
+ border-radius: var(--radius-md);
1632
+ }
1633
+ .fractal-ghost-dropdown__chevron {
1634
+ width: 14px;
1635
+ height: 14px;
1636
+ border-radius: var(--radius-full);
1637
+ }
1638
+ .fractal-ghost-switcher {
1639
+ display: flex;
1640
+ width: fit-content;
1641
+ gap: 2px;
1642
+ padding: 3px;
1643
+ border-radius: var(--radius-md);
1644
+ background: var(--bg-surface-1);
1645
+ }
1646
+ .fractal-ghost-switcher > .fractal-ghost {
1647
+ width: 76px;
1648
+ height: 32px;
1649
+ border-radius: calc(var(--radius-md) - 2px);
1650
+ }
1651
+ .fractal-ghost-disclosure {
1652
+ display: flex;
1653
+ align-items: center;
1654
+ gap: var(--space-3);
1655
+ padding: var(--space-3) 0;
1656
+ border-bottom: 1px solid var(--border-subtle);
1657
+ }
1658
+ .fractal-ghost-disclosure__icon {
1659
+ width: 16px;
1660
+ height: 16px;
1661
+ border-radius: var(--radius-full);
1662
+ }
1663
+ .fractal-ghost-pagination {
1664
+ display: flex;
1665
+ gap: var(--space-2);
1666
+ }
1667
+ .fractal-ghost-pagination > .fractal-ghost {
1668
+ width: 32px;
1669
+ height: 32px;
1670
+ border-radius: var(--radius-md);
1671
+ }
1672
+ .fractal-ghost-dropzone {
1673
+ display: grid;
1674
+ place-items: center;
1675
+ gap: var(--space-3);
1676
+ min-height: 184px;
1677
+ padding: var(--space-6);
1678
+ border: 1px dashed var(--border-default);
1679
+ border-radius: var(--radius-md);
1680
+ }
1681
+ .fractal-ghost-dropzone__icon {
1682
+ width: 32px;
1683
+ height: 32px;
1684
+ border-radius: var(--radius-full);
1685
+ }
1686
+ .fractal-ghost-prompt-card {
1687
+ min-height: 176px;
1688
+ }
1689
+ .fractal-ghost-sidebar {
1690
+ display: grid;
1691
+ align-content: start;
1692
+ gap: var(--space-7);
1693
+ width: 248px;
1694
+ min-height: 100%;
1695
+ padding: var(--space-5);
1696
+ border-right: 1px solid var(--border-subtle);
1697
+ background: var(--bg-canvas);
1698
+ }
1699
+ .fractal-ghost-sidebar__brand {
1700
+ width: 112px;
1701
+ height: 24px;
1702
+ }
1703
+ .fractal-ghost-sidebar__items {
1704
+ display: grid;
1705
+ gap: var(--space-2);
1706
+ }
1707
+ .fractal-ghost-sidebar__item {
1708
+ display: flex;
1709
+ align-items: center;
1710
+ gap: var(--space-3);
1711
+ height: 36px;
1712
+ padding: 0 var(--space-2);
1713
+ }
1714
+ .fractal-ghost-sidebar__item > .fractal-ghost {
1715
+ width: 16px;
1716
+ height: 16px;
1717
+ border-radius: var(--radius-sm);
1718
+ }
1719
+ .fractal-ghost-surface {
1720
+ display: grid;
1721
+ gap: var(--space-5);
1722
+ padding: var(--space-6);
1723
+ border: 1px solid var(--border-subtle);
1724
+ border-radius: var(--radius-lg);
1725
+ background: var(--bg-canvas);
1726
+ }
1727
+ .fractal-ghost-modal {
1728
+ width: min(100%, 420px);
1729
+ }
1730
+ .fractal-ghost-side-panel {
1731
+ width: min(100%, 540px);
1732
+ min-height: 480px;
1733
+ }
1734
+ .fractal-ghost-surface__header {
1735
+ display: flex;
1736
+ align-items: center;
1737
+ justify-content: space-between;
1738
+ }
1739
+ .fractal-ghost-surface__close {
1740
+ width: 28px;
1741
+ height: 28px;
1742
+ border-radius: var(--radius-md);
1743
+ }
1744
+ .fractal-ghost-surface__title {
1745
+ color: var(--fg-secondary);
1746
+ font-size: 0.75rem;
1747
+ }
1748
+ @keyframes fractal-ghost-shine {
1749
+ from {
1750
+ background-position: 110% 0;
1751
+ }
1752
+ to {
1753
+ background-position: -110% 0;
1754
+ }
1755
+ }
1756
+ @media (prefers-reduced-motion: reduce) {
1757
+ .fractal-ghost {
1758
+ animation: none;
1759
+ background: var(--fractal-ghost-base);
1760
+ }
1761
+ }
1762
+
1763
+ /* src/components/Sidebar/Sidebar.css */
1764
+ .fractal-sidebar {
1765
+ --fractal-sidebar-width: 232px;
1766
+ box-sizing: border-box;
1767
+ display: flex;
1768
+ width: var(--fractal-sidebar-width);
1769
+ min-width: var(--fractal-sidebar-width);
1770
+ min-height: 100%;
1771
+ flex-direction: column;
1772
+ background: var(--bg-surface-1);
1773
+ border-right: 1px solid var(--nav-border);
1774
+ color: var(--fg-primary);
1775
+ font-family: var(--font-sans);
1776
+ }
1777
+ .fractal-sidebar__header {
1778
+ display: flex;
1779
+ min-height: 48px;
1780
+ align-items: center;
1781
+ padding: var(--space-2);
1782
+ border-bottom: 1px solid var(--border-subtle);
1783
+ }
1784
+ .fractal-sidebar__brand {
1785
+ display: inline-flex;
1786
+ min-width: 0;
1787
+ align-items: center;
1788
+ gap: var(--space-2);
1789
+ padding: var(--space-1);
1790
+ border: 0;
1791
+ border-radius: var(--radius-md);
1792
+ background: transparent;
1793
+ color: var(--fg-primary);
1794
+ cursor: pointer;
1795
+ font: inherit;
1796
+ text-align: left;
1797
+ transition: background-color var(--duration-fast) var(--ease-out), transform var(--duration-fast) var(--ease-out);
1798
+ }
1799
+ .fractal-sidebar__brand:hover {
1800
+ background: var(--nav-hover);
1801
+ }
1802
+ .fractal-sidebar__brand:active {
1803
+ transform: scale(0.98);
1804
+ }
1805
+ .fractal-sidebar__brand:focus-visible,
1806
+ .fractal-sidebar__nav-item:focus-visible,
1807
+ .fractal-sidebar__account-trigger:focus-visible {
1808
+ outline: 2px solid var(--border-focus);
1809
+ outline-offset: 2px;
1810
+ }
1811
+ .fractal-sidebar__account {
1812
+ display: block;
1813
+ width: 100%;
1814
+ }
1815
+ .fractal-sidebar__account-trigger {
1816
+ width: 100%;
1817
+ min-height: 36px;
1818
+ box-sizing: border-box;
1819
+ gap: var(--space-2);
1820
+ padding: 8px 10px;
1821
+ border: 0;
1822
+ background: transparent;
1823
+ border-radius: var(--radius-md);
1824
+ color: var(--fg-primary);
1825
+ font-weight: 500;
1826
+ }
1827
+ .fractal-sidebar__account-trigger:hover,
1828
+ .fractal-sidebar__account-trigger.fractal-dropdown-trigger--tertiary:hover {
1829
+ background: var(--nav-hover);
1830
+ }
1831
+ .fractal-sidebar__account-name {
1832
+ min-width: 0;
1833
+ flex: 1;
1834
+ overflow: hidden;
1835
+ text-overflow: ellipsis;
1836
+ white-space: nowrap;
1837
+ }
1838
+ .fractal-sidebar__account-panel {
1839
+ min-width: 100%;
1840
+ }
1841
+ .fractal-sidebar__nav {
1842
+ display: flex;
1843
+ flex: 1;
1844
+ flex-direction: column;
1845
+ gap: 0;
1846
+ overflow-y: auto;
1847
+ padding: var(--space-2);
1848
+ }
1849
+ .fractal-sidebar__section {
1850
+ display: flex;
1851
+ flex-direction: column;
1852
+ gap: 1px;
1853
+ }
1854
+ .fractal-sidebar__section + .fractal-sidebar__section {
1855
+ position: relative;
1856
+ margin-top: var(--space-2);
1857
+ padding-top: var(--space-2);
1858
+ }
1859
+ .fractal-sidebar__section + .fractal-sidebar__section::before {
1860
+ position: absolute;
1861
+ top: 0;
1862
+ right: var(--space-2);
1209
1863
  left: var(--space-2);
1210
1864
  height: 1px;
1211
1865
  background: var(--border-subtle);
@@ -1280,4 +1934,374 @@
1280
1934
  transition: none;
1281
1935
  }
1282
1936
  }
1937
+
1938
+ /* src/components/SidePanel/SidePanel.css */
1939
+ .fractal-side-panel-overlay {
1940
+ position: fixed;
1941
+ inset: 0;
1942
+ z-index: 9998;
1943
+ display: flex;
1944
+ justify-content: flex-end;
1945
+ background: color-mix(in srgb, var(--fg-primary) 16%, transparent);
1946
+ animation: fractal-side-panel-overlay-in 180ms ease-out both;
1947
+ }
1948
+ .fractal-side-panel {
1949
+ display: flex;
1950
+ width: min(100vw, 540px);
1951
+ height: 100%;
1952
+ flex-direction: column;
1953
+ border-left: 1px solid var(--border-subtle);
1954
+ background: var(--bg-canvas);
1955
+ box-shadow: var(--shadow-lg);
1956
+ color: var(--fg-primary);
1957
+ font-family: var(--font-sans);
1958
+ animation: fractal-side-panel-in 180ms cubic-bezier(0.16, 1, 0.3, 1) both;
1959
+ }
1960
+ .fractal-side-panel--sm {
1961
+ width: min(100vw, 420px);
1962
+ }
1963
+ .fractal-side-panel--md {
1964
+ width: min(100vw, 540px);
1965
+ }
1966
+ .fractal-side-panel--lg {
1967
+ width: min(100vw, 680px);
1968
+ }
1969
+ .fractal-side-panel--xl {
1970
+ width: min(100vw, 960px);
1971
+ }
1972
+ .fractal-side-panel__header {
1973
+ display: flex;
1974
+ align-items: flex-start;
1975
+ justify-content: space-between;
1976
+ gap: var(--space-4);
1977
+ padding: var(--space-5) var(--space-6) var(--space-4);
1978
+ }
1979
+ .fractal-side-panel__heading {
1980
+ min-width: 0;
1981
+ }
1982
+ .fractal-side-panel__title {
1983
+ margin: 0;
1984
+ font-size: 1rem;
1985
+ font-weight: 500;
1986
+ line-height: 1.4;
1987
+ }
1988
+ .fractal-side-panel__description {
1989
+ margin: var(--space-1) 0 0;
1990
+ color: var(--fg-secondary);
1991
+ font-size: 0.875rem;
1992
+ line-height: 1.4;
1993
+ }
1994
+ .fractal-side-panel__close {
1995
+ display: grid;
1996
+ width: 32px;
1997
+ height: 32px;
1998
+ flex: 0 0 auto;
1999
+ place-items: center;
2000
+ border: 0;
2001
+ border-radius: var(--radius-md);
2002
+ background: transparent;
2003
+ color: var(--fg-secondary);
2004
+ cursor: pointer;
2005
+ }
2006
+ .fractal-side-panel__close:hover {
2007
+ background: var(--hover-surface);
2008
+ color: var(--fg-primary);
2009
+ }
2010
+ .fractal-side-panel__close:focus-visible {
2011
+ outline: 2px solid var(--border-focus);
2012
+ outline-offset: 2px;
2013
+ }
2014
+ .fractal-side-panel__body {
2015
+ min-height: 0;
2016
+ flex: 1;
2017
+ overflow: auto;
2018
+ padding: var(--space-2) var(--space-6) var(--space-6);
2019
+ }
2020
+ .fractal-side-panel__body--loading {
2021
+ display: grid;
2022
+ place-items: center;
2023
+ }
2024
+ .fractal-side-panel__footer {
2025
+ display: flex;
2026
+ justify-content: flex-end;
2027
+ gap: var(--space-2);
2028
+ padding: var(--space-4) var(--space-6);
2029
+ border-top: 1px solid var(--border-subtle);
2030
+ }
2031
+ @media (max-width: 640px) {
2032
+ .fractal-side-panel {
2033
+ width: 100%;
2034
+ }
2035
+ .fractal-side-panel__header {
2036
+ padding: var(--space-4) var(--space-5) var(--space-3);
2037
+ }
2038
+ .fractal-side-panel__body {
2039
+ padding: var(--space-2) var(--space-5) var(--space-5);
2040
+ }
2041
+ .fractal-side-panel__footer {
2042
+ padding: var(--space-3) var(--space-5);
2043
+ }
2044
+ }
2045
+ @keyframes fractal-side-panel-overlay-in {
2046
+ from {
2047
+ opacity: 0;
2048
+ }
2049
+ to {
2050
+ opacity: 1;
2051
+ }
2052
+ }
2053
+ @keyframes fractal-side-panel-in {
2054
+ from {
2055
+ transform: translateX(100%);
2056
+ }
2057
+ to {
2058
+ transform: translateX(0);
2059
+ }
2060
+ }
2061
+ @media (prefers-reduced-motion: reduce) {
2062
+ .fractal-side-panel-overlay,
2063
+ .fractal-side-panel {
2064
+ animation-duration: 0.01ms;
2065
+ }
2066
+ }
2067
+
2068
+ /* src/components/Textarea/Textarea.css */
2069
+ .fractal-textarea {
2070
+ display: block;
2071
+ width: 100%;
2072
+ min-height: 120px;
2073
+ resize: vertical;
2074
+ border: 1px solid var(--border-default);
2075
+ border-radius: var(--radius-md);
2076
+ background: var(--bg-canvas);
2077
+ padding: var(--space-3);
2078
+ color: var(--fg-primary);
2079
+ font: 0.8125rem/1.55 var(--font-mono);
2080
+ }
2081
+ .fractal-textarea::placeholder {
2082
+ color: var(--fg-placeholder);
2083
+ }
2084
+ .fractal-textarea:hover {
2085
+ border-color: var(--fg-tertiary);
2086
+ }
2087
+ .fractal-textarea:focus-visible {
2088
+ outline: none;
2089
+ border-color: var(--border-focus);
2090
+ box-shadow: 0 0 0 2px var(--accent-surface);
2091
+ }
2092
+ .fractal-textarea:disabled {
2093
+ cursor: not-allowed;
2094
+ opacity: 0.5;
2095
+ background: var(--bg-surface-1);
2096
+ }
2097
+
2098
+ /* src/components/TextButton/TextButton.css */
2099
+ .fractal-text-button {
2100
+ display: inline-flex;
2101
+ align-items: center;
2102
+ gap: var(--space-1);
2103
+ border: 0;
2104
+ background: transparent;
2105
+ cursor: pointer;
2106
+ font-family: var(--font-sans);
2107
+ font-weight: 500;
2108
+ line-height: 1.4;
2109
+ padding: 0;
2110
+ text-align: left;
2111
+ transition: color 120ms ease;
2112
+ }
2113
+ .fractal-text-button--primary {
2114
+ color: var(--fg-primary);
2115
+ }
2116
+ .fractal-text-button--primary:hover:not(:disabled) {
2117
+ color: var(--fg-secondary);
2118
+ }
2119
+ .fractal-text-button--secondary {
2120
+ color: var(--fg-secondary);
2121
+ }
2122
+ .fractal-text-button--secondary:hover:not(:disabled) {
2123
+ color: var(--fg-primary);
2124
+ }
2125
+ .fractal-text-button:focus-visible {
2126
+ outline: 2px solid var(--border-focus);
2127
+ outline-offset: 3px;
2128
+ border-radius: var(--radius-sm);
2129
+ }
2130
+ .fractal-text-button:disabled {
2131
+ cursor: not-allowed;
2132
+ opacity: 0.5;
2133
+ }
2134
+ .fractal-text-button--sm {
2135
+ font-size: 0.8125rem;
2136
+ }
2137
+ .fractal-text-button--md {
2138
+ font-size: 0.875rem;
2139
+ }
2140
+ .fractal-text-button__icon {
2141
+ display: inline-grid;
2142
+ place-items: center;
2143
+ }
2144
+
2145
+ /* src/components/FileDropzone/FileDropzone.css */
2146
+ .fractal-file-dropzone {
2147
+ display: grid;
2148
+ gap: var(--space-2);
2149
+ color: var(--fg-primary);
2150
+ font-family: var(--font-sans);
2151
+ }
2152
+ .fractal-file-dropzone__input {
2153
+ display: none;
2154
+ }
2155
+ .fractal-file-dropzone__target {
2156
+ display: flex;
2157
+ width: 100%;
2158
+ min-height: 92px;
2159
+ align-items: center;
2160
+ justify-content: center;
2161
+ gap: var(--space-3);
2162
+ border: 1px dashed var(--border-default);
2163
+ border-radius: var(--radius-md);
2164
+ background: var(--bg-canvas);
2165
+ color: var(--fg-secondary);
2166
+ cursor: pointer;
2167
+ padding: var(--space-4);
2168
+ text-align: left;
2169
+ }
2170
+ .fractal-file-dropzone__target:hover,
2171
+ .fractal-file-dropzone__target[data-dragging] {
2172
+ border-color: var(--border-focus);
2173
+ background: var(--hover-surface);
2174
+ color: var(--fg-primary);
2175
+ }
2176
+ .fractal-file-dropzone__target:focus-visible {
2177
+ outline: 2px solid var(--border-focus);
2178
+ outline-offset: 2px;
2179
+ }
2180
+ .fractal-file-dropzone__target:disabled {
2181
+ cursor: not-allowed;
2182
+ opacity: 0.5;
2183
+ }
2184
+ .fractal-file-dropzone__copy {
2185
+ display: grid;
2186
+ gap: var(--space-1);
2187
+ }
2188
+ .fractal-file-dropzone__title {
2189
+ font-size: 0.875rem;
2190
+ font-weight: 500;
2191
+ line-height: 1.4;
2192
+ }
2193
+ .fractal-file-dropzone__description {
2194
+ color: var(--fg-secondary);
2195
+ font-size: 0.8125rem;
2196
+ line-height: 1.4;
2197
+ }
2198
+ .fractal-file-dropzone__files {
2199
+ display: grid;
2200
+ gap: var(--space-1);
2201
+ margin: 0;
2202
+ padding: 0;
2203
+ list-style: none;
2204
+ }
2205
+ .fractal-file-dropzone__file {
2206
+ display: flex;
2207
+ min-width: 0;
2208
+ align-items: center;
2209
+ gap: var(--space-2);
2210
+ padding: var(--space-2) var(--space-3);
2211
+ border: 1px solid var(--border-subtle);
2212
+ border-radius: var(--radius-md);
2213
+ background: var(--bg-canvas);
2214
+ font-size: 0.8125rem;
2215
+ line-height: 1.4;
2216
+ }
2217
+ .fractal-file-dropzone__file-name {
2218
+ min-width: 0;
2219
+ flex: 1;
2220
+ overflow: hidden;
2221
+ text-overflow: ellipsis;
2222
+ white-space: nowrap;
2223
+ }
2224
+ .fractal-file-dropzone__file-meta {
2225
+ color: var(--fg-secondary);
2226
+ white-space: nowrap;
2227
+ }
2228
+ .fractal-file-dropzone__remove {
2229
+ display: grid;
2230
+ width: 24px;
2231
+ height: 24px;
2232
+ flex: 0 0 auto;
2233
+ place-items: center;
2234
+ border: 0;
2235
+ border-radius: var(--radius-sm);
2236
+ background: transparent;
2237
+ color: var(--fg-secondary);
2238
+ cursor: pointer;
2239
+ }
2240
+ .fractal-file-dropzone__remove:hover {
2241
+ background: var(--hover-surface);
2242
+ color: var(--fg-primary);
2243
+ }
2244
+ .fractal-file-dropzone__remove:focus-visible {
2245
+ outline: 2px solid var(--border-focus);
2246
+ outline-offset: 1px;
2247
+ }
2248
+ .fractal-file-dropzone__remove:disabled {
2249
+ cursor: not-allowed;
2250
+ opacity: 0.5;
2251
+ }
2252
+
2253
+ /* src/components/Pagination/Pagination.css */
2254
+ .fractal-pagination {
2255
+ display: flex;
2256
+ align-items: center;
2257
+ justify-content: space-between;
2258
+ gap: var(--space-3);
2259
+ color: var(--fg-secondary);
2260
+ font-family: var(--font-sans);
2261
+ font-size: 0.8125rem;
2262
+ line-height: 1.4;
2263
+ }
2264
+ .fractal-pagination__controls {
2265
+ display: flex;
2266
+ align-items: center;
2267
+ gap: var(--space-2);
2268
+ }
2269
+ .fractal-pagination__page-size .fractal-dropdown-trigger {
2270
+ padding: 4px 0;
2271
+ border: 0;
2272
+ background: transparent;
2273
+ color: var(--fg-secondary);
2274
+ }
2275
+ .fractal-pagination__page-size .fractal-dropdown-trigger:hover {
2276
+ background: transparent;
2277
+ color: var(--fg-primary);
2278
+ }
2279
+ .fractal-pagination__button {
2280
+ display: grid;
2281
+ width: 28px;
2282
+ height: 28px;
2283
+ place-items: center;
2284
+ border: 1px solid var(--border-default);
2285
+ border-radius: var(--radius-sm);
2286
+ background: var(--bg-canvas);
2287
+ color: var(--fg-secondary);
2288
+ cursor: pointer;
2289
+ }
2290
+ .fractal-pagination__button:hover:not(:disabled) {
2291
+ background: var(--hover-surface);
2292
+ color: var(--fg-primary);
2293
+ }
2294
+ .fractal-pagination__button:focus-visible {
2295
+ outline: 2px solid var(--border-focus);
2296
+ outline-offset: 2px;
2297
+ }
2298
+ .fractal-pagination__button:disabled {
2299
+ cursor: not-allowed;
2300
+ opacity: 0.45;
2301
+ }
2302
+ .fractal-pagination__page {
2303
+ min-width: 44px;
2304
+ text-align: center;
2305
+ white-space: nowrap;
2306
+ }
1283
2307
  /*# sourceMappingURL=index.css.map */