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

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 {
@@ -700,6 +765,16 @@
700
765
  padding: 4px 8px;
701
766
  font-size: 0.75rem;
702
767
  }
768
+ .fractal-dropdown-trigger--icon-only {
769
+ width: 32px;
770
+ height: 32px;
771
+ justify-content: center;
772
+ padding: 0;
773
+ }
774
+ .fractal-dropdown-trigger--icon-only.fractal-dropdown-trigger--sm {
775
+ width: 28px;
776
+ height: 28px;
777
+ }
703
778
  .fractal-dropdown-trigger--tertiary {
704
779
  border-color: transparent;
705
780
  background: transparent;
@@ -708,6 +783,17 @@
708
783
  .fractal-dropdown-trigger--tertiary:hover {
709
784
  background: var(--bg-surface-1);
710
785
  }
786
+ .fractal-dropdown-trigger:disabled,
787
+ .fractal-dropdown-trigger:disabled:hover {
788
+ color: var(--fg-disabled);
789
+ cursor: not-allowed;
790
+ background: var(--bg-surface-1);
791
+ }
792
+ .fractal-dropdown-trigger:disabled .fractal-dropdown-selected-text,
793
+ .fractal-dropdown-trigger:disabled .fractal-dropdown-chevron,
794
+ .fractal-dropdown-trigger:disabled .fractal-dropdown-icon {
795
+ color: var(--fg-disabled);
796
+ }
711
797
  .fractal-dropdown-trigger:focus-visible {
712
798
  outline: none;
713
799
  box-shadow: 0 0 0 2px var(--bg-canvas), 0 0 0 4px var(--border-focus);
@@ -731,12 +817,15 @@
731
817
  .fractal-dropdown-chevron {
732
818
  display: flex;
733
819
  flex-shrink: 0;
820
+ margin-left: auto;
734
821
  color: var(--fg-secondary);
735
822
  }
736
823
  .fractal-dropdown-panel {
737
824
  position: absolute;
738
825
  z-index: 999999;
826
+ min-width: 100%;
739
827
  overflow: hidden;
828
+ box-sizing: border-box;
740
829
  border-radius: var(--radius-md, 6px);
741
830
  border: 1px solid var(--border-subtle);
742
831
  background: var(--bg-canvas);
@@ -755,6 +844,7 @@
755
844
  .fractal-dropdown-option {
756
845
  display: flex;
757
846
  width: 100%;
847
+ box-sizing: border-box;
758
848
  align-items: center;
759
849
  gap: 8px;
760
850
  padding: 6px 8px;
@@ -778,7 +868,7 @@
778
868
  }
779
869
  .fractal-dropdown-option:hover,
780
870
  .fractal-dropdown-option:focus-visible {
781
- background: var(--hover-canvas, var(--bg-surface-2));
871
+ background: var(--hover-surface, var(--bg-surface-2));
782
872
  outline: none;
783
873
  }
784
874
  .fractal-dropdown-separator {
@@ -874,6 +964,35 @@
874
964
  color: var(--accent-default);
875
965
  }
876
966
 
967
+ /* src/components/Checkbox/Checkbox.css */
968
+ .fractal-checkbox {
969
+ display: grid;
970
+ width: 28px;
971
+ height: 28px;
972
+ place-items: center;
973
+ padding: 0;
974
+ border: 0;
975
+ border-radius: var(--radius-sm);
976
+ background: transparent;
977
+ color: var(--fg-secondary);
978
+ cursor: pointer;
979
+ }
980
+ .fractal-checkbox:hover:not(:disabled) {
981
+ background: var(--hover-canvas);
982
+ color: var(--fg-primary);
983
+ }
984
+ .fractal-checkbox--checked {
985
+ color: var(--fg-primary);
986
+ }
987
+ .fractal-checkbox:focus-visible {
988
+ outline: 2px solid var(--border-focus);
989
+ outline-offset: 2px;
990
+ }
991
+ .fractal-checkbox:disabled {
992
+ cursor: not-allowed;
993
+ color: var(--fg-disabled);
994
+ }
995
+
877
996
  /* src/components/SortableTable/SortableTable.css */
878
997
  .fractal-sortable-table {
879
998
  font-family: var(--font-sans);
@@ -882,9 +1001,14 @@
882
1001
  .fractal-sortable-table-surface {
883
1002
  overflow: hidden;
884
1003
  border: 1px solid var(--border-subtle);
885
- border-radius: var(--radius-xl, 12px);
1004
+ border-radius: var(--radius-md, 6px);
886
1005
  background: var(--bg-canvas);
887
1006
  }
1007
+ .fractal-sortable-table--embedded .fractal-sortable-table-surface {
1008
+ border: 0;
1009
+ border-top: 1px solid var(--border-subtle);
1010
+ border-radius: 0;
1011
+ }
888
1012
  .fractal-sortable-table-header {
889
1013
  display: flex;
890
1014
  align-items: center;
@@ -922,9 +1046,6 @@
922
1046
  vertical-align: middle;
923
1047
  white-space: nowrap;
924
1048
  }
925
- .fractal-sortable-table-th + .fractal-sortable-table-th {
926
- border-left: 1px solid var(--border-subtle);
927
- }
928
1049
  .fractal-sortable-table-th--sortable {
929
1050
  padding: 0;
930
1051
  }
@@ -977,6 +1098,53 @@
977
1098
  .fractal-sortable-table-row:hover {
978
1099
  background: var(--bg-surface-1);
979
1100
  }
1101
+ .fractal-sortable-table-row--interactive {
1102
+ cursor: pointer;
1103
+ }
1104
+ .fractal-sortable-table-td--row-action {
1105
+ position: relative;
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,82 +1422,455 @@
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);
1209
- left: var(--space-2);
1210
- height: 1px;
1211
- background: var(--border-subtle);
1212
- content: "";
1521
+ .fractal-ghost-button--icon-only {
1522
+ width: var(--fractal-ghost-icon-size, 40px);
1213
1523
  }
1214
- .fractal-sidebar__nav-item {
1215
- display: flex;
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 th + th,
1567
+ .fractal-ghost-table td + td {
1568
+ border-left: 1px solid var(--border-subtle);
1569
+ }
1570
+ .fractal-ghost-table td {
1571
+ padding: 14px 16px;
1572
+ }
1573
+ .fractal-ghost-table__row + .fractal-ghost-table__row td {
1574
+ border-top: 1px solid var(--border-subtle);
1575
+ }
1576
+ .fractal-ghost-table--sm th {
1577
+ padding: 8px 12px;
1578
+ }
1579
+ .fractal-ghost-table--sm td {
1580
+ padding: 10px 12px;
1581
+ }
1582
+ .fractal-ghost-table--lg th {
1583
+ padding: 18px 24px;
1584
+ }
1585
+ .fractal-ghost-table--lg td {
1586
+ padding: 22px 24px;
1587
+ }
1588
+ .fractal-ghost-field {
1589
+ display: grid;
1590
+ gap: var(--space-2);
1591
+ }
1592
+ .fractal-ghost-field__control {
1593
+ width: 100%;
1594
+ height: 40px;
1595
+ border: 1px solid var(--border-subtle);
1596
+ border-radius: var(--radius-md);
1597
+ }
1598
+ .fractal-ghost-field__control--multiline {
1599
+ height: 112px;
1600
+ }
1601
+ .fractal-ghost-label {
1602
+ border-radius: var(--radius-sm);
1603
+ }
1604
+ .fractal-ghost-alert {
1605
+ display: grid;
1606
+ gap: var(--space-2);
1607
+ padding: var(--space-4);
1608
+ border: 1px solid var(--border-subtle);
1609
+ border-radius: var(--radius-md);
1610
+ }
1611
+ .fractal-ghost-choice {
1612
+ display: flex;
1613
+ align-items: center;
1614
+ gap: var(--space-2);
1615
+ }
1616
+ .fractal-ghost-choice__control {
1617
+ width: 16px;
1618
+ height: 16px;
1619
+ border-radius: var(--radius-sm);
1620
+ }
1621
+ .fractal-ghost-chip {
1622
+ border-radius: var(--radius-full);
1623
+ }
1624
+ .fractal-ghost-link {
1625
+ display: inline-block;
1626
+ }
1627
+ .fractal-ghost-dropdown {
1628
+ display: flex;
1629
+ align-items: center;
1630
+ justify-content: space-between;
1631
+ width: 220px;
1632
+ height: 40px;
1633
+ padding: 0 var(--space-3);
1634
+ border: 1px solid var(--border-subtle);
1635
+ border-radius: var(--radius-md);
1636
+ }
1637
+ .fractal-ghost-dropdown__chevron {
1638
+ width: 14px;
1639
+ height: 14px;
1640
+ border-radius: var(--radius-full);
1641
+ }
1642
+ .fractal-ghost-switcher {
1643
+ display: flex;
1644
+ width: fit-content;
1645
+ gap: 2px;
1646
+ padding: 3px;
1647
+ border-radius: var(--radius-md);
1648
+ background: var(--bg-surface-1);
1649
+ }
1650
+ .fractal-ghost-switcher > .fractal-ghost {
1651
+ width: 76px;
1652
+ height: 32px;
1653
+ border-radius: calc(var(--radius-md) - 2px);
1654
+ }
1655
+ .fractal-ghost-disclosure {
1656
+ display: flex;
1657
+ align-items: center;
1658
+ gap: var(--space-3);
1659
+ padding: var(--space-3) 0;
1660
+ border-bottom: 1px solid var(--border-subtle);
1661
+ }
1662
+ .fractal-ghost-disclosure__icon {
1663
+ width: 16px;
1664
+ height: 16px;
1665
+ border-radius: var(--radius-full);
1666
+ }
1667
+ .fractal-ghost-pagination {
1668
+ display: flex;
1669
+ gap: var(--space-2);
1670
+ }
1671
+ .fractal-ghost-pagination > .fractal-ghost {
1672
+ width: 32px;
1673
+ height: 32px;
1674
+ border-radius: var(--radius-md);
1675
+ }
1676
+ .fractal-ghost-dropzone {
1677
+ display: grid;
1678
+ place-items: center;
1679
+ gap: var(--space-3);
1680
+ min-height: 184px;
1681
+ padding: var(--space-6);
1682
+ border: 1px dashed var(--border-default);
1683
+ border-radius: var(--radius-md);
1684
+ }
1685
+ .fractal-ghost-dropzone__icon {
1686
+ width: 32px;
1687
+ height: 32px;
1688
+ border-radius: var(--radius-full);
1689
+ }
1690
+ .fractal-ghost-prompt-card {
1691
+ min-height: 176px;
1692
+ }
1693
+ .fractal-ghost-sidebar {
1694
+ display: grid;
1695
+ align-content: start;
1696
+ gap: var(--space-7);
1697
+ width: 248px;
1698
+ min-height: 100%;
1699
+ padding: var(--space-5);
1700
+ border-right: 1px solid var(--border-subtle);
1701
+ background: var(--bg-canvas);
1702
+ }
1703
+ .fractal-ghost-sidebar__brand {
1704
+ width: 112px;
1705
+ height: 24px;
1706
+ }
1707
+ .fractal-ghost-sidebar__items {
1708
+ display: grid;
1709
+ gap: var(--space-2);
1710
+ }
1711
+ .fractal-ghost-sidebar__item {
1712
+ display: flex;
1713
+ align-items: center;
1714
+ gap: var(--space-3);
1715
+ height: 36px;
1716
+ padding: 0 var(--space-2);
1717
+ }
1718
+ .fractal-ghost-sidebar__item > .fractal-ghost {
1719
+ width: 16px;
1720
+ height: 16px;
1721
+ border-radius: var(--radius-sm);
1722
+ }
1723
+ .fractal-ghost-surface {
1724
+ display: grid;
1725
+ gap: var(--space-5);
1726
+ padding: var(--space-6);
1727
+ border: 1px solid var(--border-subtle);
1728
+ border-radius: var(--radius-lg);
1729
+ background: var(--bg-canvas);
1730
+ }
1731
+ .fractal-ghost-modal {
1732
+ width: min(100%, 420px);
1733
+ }
1734
+ .fractal-ghost-side-panel {
1735
+ width: min(100%, 540px);
1736
+ min-height: 480px;
1737
+ }
1738
+ .fractal-ghost-surface__header {
1739
+ display: flex;
1740
+ align-items: center;
1741
+ justify-content: space-between;
1742
+ }
1743
+ .fractal-ghost-surface__close {
1744
+ width: 28px;
1745
+ height: 28px;
1746
+ border-radius: var(--radius-md);
1747
+ }
1748
+ .fractal-ghost-surface__title {
1749
+ color: var(--fg-secondary);
1750
+ font-size: 0.75rem;
1751
+ }
1752
+ @keyframes fractal-ghost-shine {
1753
+ from {
1754
+ background-position: 110% 0;
1755
+ }
1756
+ to {
1757
+ background-position: -110% 0;
1758
+ }
1759
+ }
1760
+ @media (prefers-reduced-motion: reduce) {
1761
+ .fractal-ghost {
1762
+ animation: none;
1763
+ background: var(--fractal-ghost-base);
1764
+ }
1765
+ }
1766
+
1767
+ /* src/components/Sidebar/Sidebar.css */
1768
+ .fractal-sidebar {
1769
+ --fractal-sidebar-width: 232px;
1770
+ box-sizing: border-box;
1771
+ display: flex;
1772
+ width: var(--fractal-sidebar-width);
1773
+ min-width: var(--fractal-sidebar-width);
1774
+ min-height: 100%;
1775
+ flex-direction: column;
1776
+ background: var(--bg-surface-1);
1777
+ border-right: 1px solid var(--nav-border);
1778
+ color: var(--fg-primary);
1779
+ font-family: var(--font-sans);
1780
+ }
1781
+ .fractal-sidebar__header {
1782
+ display: flex;
1783
+ min-height: 48px;
1784
+ align-items: center;
1785
+ padding: var(--space-2);
1786
+ border-bottom: 1px solid var(--border-subtle);
1787
+ }
1788
+ .fractal-sidebar__brand {
1789
+ display: inline-flex;
1790
+ min-width: 0;
1791
+ align-items: center;
1792
+ gap: var(--space-2);
1793
+ padding: var(--space-1);
1794
+ border: 0;
1795
+ border-radius: var(--radius-md);
1796
+ background: transparent;
1797
+ color: var(--fg-primary);
1798
+ cursor: pointer;
1799
+ font: inherit;
1800
+ text-align: left;
1801
+ transition: background-color var(--duration-fast) var(--ease-out), transform var(--duration-fast) var(--ease-out);
1802
+ }
1803
+ .fractal-sidebar__brand:hover {
1804
+ background: var(--nav-hover);
1805
+ }
1806
+ .fractal-sidebar__brand:active {
1807
+ transform: scale(0.98);
1808
+ }
1809
+ .fractal-sidebar__brand:focus-visible,
1810
+ .fractal-sidebar__nav-item:focus-visible,
1811
+ .fractal-sidebar__account-trigger:focus-visible {
1812
+ outline: 2px solid var(--border-focus);
1813
+ outline-offset: 2px;
1814
+ }
1815
+ .fractal-sidebar__account {
1816
+ display: block;
1817
+ width: 100%;
1818
+ }
1819
+ .fractal-sidebar__account-trigger {
1820
+ width: 100%;
1821
+ min-height: 36px;
1822
+ box-sizing: border-box;
1823
+ gap: var(--space-2);
1824
+ padding: 8px 10px;
1825
+ border: 0;
1826
+ background: transparent;
1827
+ border-radius: var(--radius-md);
1828
+ color: var(--fg-primary);
1829
+ font-weight: 500;
1830
+ }
1831
+ .fractal-sidebar__account-trigger:hover,
1832
+ .fractal-sidebar__account-trigger.fractal-dropdown-trigger--tertiary:hover {
1833
+ background: var(--nav-hover);
1834
+ }
1835
+ .fractal-sidebar__account-name {
1836
+ min-width: 0;
1837
+ flex: 1;
1838
+ overflow: hidden;
1839
+ text-overflow: ellipsis;
1840
+ white-space: nowrap;
1841
+ }
1842
+ .fractal-sidebar__account-panel {
1843
+ min-width: 100%;
1844
+ }
1845
+ .fractal-sidebar__nav {
1846
+ display: flex;
1847
+ flex: 1;
1848
+ flex-direction: column;
1849
+ gap: 0;
1850
+ overflow-y: auto;
1851
+ padding: var(--space-2);
1852
+ }
1853
+ .fractal-sidebar__section {
1854
+ display: flex;
1855
+ flex-direction: column;
1856
+ gap: 1px;
1857
+ }
1858
+ .fractal-sidebar__section + .fractal-sidebar__section {
1859
+ position: relative;
1860
+ margin-top: var(--space-2);
1861
+ padding-top: var(--space-2);
1862
+ }
1863
+ .fractal-sidebar__section + .fractal-sidebar__section::before {
1864
+ position: absolute;
1865
+ top: 0;
1866
+ right: var(--space-2);
1867
+ left: var(--space-2);
1868
+ height: 1px;
1869
+ background: var(--border-subtle);
1870
+ content: "";
1871
+ }
1872
+ .fractal-sidebar__nav-item {
1873
+ display: flex;
1216
1874
  width: 100%;
1217
1875
  min-height: 36px;
1218
1876
  align-items: center;
@@ -1280,4 +1938,374 @@
1280
1938
  transition: none;
1281
1939
  }
1282
1940
  }
1941
+
1942
+ /* src/components/SidePanel/SidePanel.css */
1943
+ .fractal-side-panel-overlay {
1944
+ position: fixed;
1945
+ inset: 0;
1946
+ z-index: 9998;
1947
+ display: flex;
1948
+ justify-content: flex-end;
1949
+ background: color-mix(in srgb, var(--fg-primary) 16%, transparent);
1950
+ animation: fractal-side-panel-overlay-in 180ms ease-out both;
1951
+ }
1952
+ .fractal-side-panel {
1953
+ display: flex;
1954
+ width: min(100vw, 540px);
1955
+ height: 100%;
1956
+ flex-direction: column;
1957
+ border-left: 1px solid var(--border-subtle);
1958
+ background: var(--bg-canvas);
1959
+ box-shadow: var(--shadow-lg);
1960
+ color: var(--fg-primary);
1961
+ font-family: var(--font-sans);
1962
+ animation: fractal-side-panel-in 180ms cubic-bezier(0.16, 1, 0.3, 1) both;
1963
+ }
1964
+ .fractal-side-panel--sm {
1965
+ width: min(100vw, 420px);
1966
+ }
1967
+ .fractal-side-panel--md {
1968
+ width: min(100vw, 540px);
1969
+ }
1970
+ .fractal-side-panel--lg {
1971
+ width: min(100vw, 680px);
1972
+ }
1973
+ .fractal-side-panel--xl {
1974
+ width: min(100vw, 960px);
1975
+ }
1976
+ .fractal-side-panel__header {
1977
+ display: flex;
1978
+ align-items: flex-start;
1979
+ justify-content: space-between;
1980
+ gap: var(--space-4);
1981
+ padding: var(--space-5) var(--space-6) var(--space-4);
1982
+ }
1983
+ .fractal-side-panel__heading {
1984
+ min-width: 0;
1985
+ }
1986
+ .fractal-side-panel__title {
1987
+ margin: 0;
1988
+ font-size: 1rem;
1989
+ font-weight: 500;
1990
+ line-height: 1.4;
1991
+ }
1992
+ .fractal-side-panel__description {
1993
+ margin: var(--space-1) 0 0;
1994
+ color: var(--fg-secondary);
1995
+ font-size: 0.875rem;
1996
+ line-height: 1.4;
1997
+ }
1998
+ .fractal-side-panel__close {
1999
+ display: grid;
2000
+ width: 32px;
2001
+ height: 32px;
2002
+ flex: 0 0 auto;
2003
+ place-items: center;
2004
+ border: 0;
2005
+ border-radius: var(--radius-md);
2006
+ background: transparent;
2007
+ color: var(--fg-secondary);
2008
+ cursor: pointer;
2009
+ }
2010
+ .fractal-side-panel__close:hover {
2011
+ background: var(--hover-surface);
2012
+ color: var(--fg-primary);
2013
+ }
2014
+ .fractal-side-panel__close:focus-visible {
2015
+ outline: 2px solid var(--border-focus);
2016
+ outline-offset: 2px;
2017
+ }
2018
+ .fractal-side-panel__body {
2019
+ min-height: 0;
2020
+ flex: 1;
2021
+ overflow: auto;
2022
+ padding: var(--space-2) var(--space-6) var(--space-6);
2023
+ }
2024
+ .fractal-side-panel__body--loading {
2025
+ display: grid;
2026
+ place-items: center;
2027
+ }
2028
+ .fractal-side-panel__footer {
2029
+ display: flex;
2030
+ justify-content: flex-end;
2031
+ gap: var(--space-2);
2032
+ padding: var(--space-4) var(--space-6);
2033
+ border-top: 1px solid var(--border-subtle);
2034
+ }
2035
+ @media (max-width: 640px) {
2036
+ .fractal-side-panel {
2037
+ width: 100%;
2038
+ }
2039
+ .fractal-side-panel__header {
2040
+ padding: var(--space-4) var(--space-5) var(--space-3);
2041
+ }
2042
+ .fractal-side-panel__body {
2043
+ padding: var(--space-2) var(--space-5) var(--space-5);
2044
+ }
2045
+ .fractal-side-panel__footer {
2046
+ padding: var(--space-3) var(--space-5);
2047
+ }
2048
+ }
2049
+ @keyframes fractal-side-panel-overlay-in {
2050
+ from {
2051
+ opacity: 0;
2052
+ }
2053
+ to {
2054
+ opacity: 1;
2055
+ }
2056
+ }
2057
+ @keyframes fractal-side-panel-in {
2058
+ from {
2059
+ transform: translateX(100%);
2060
+ }
2061
+ to {
2062
+ transform: translateX(0);
2063
+ }
2064
+ }
2065
+ @media (prefers-reduced-motion: reduce) {
2066
+ .fractal-side-panel-overlay,
2067
+ .fractal-side-panel {
2068
+ animation-duration: 0.01ms;
2069
+ }
2070
+ }
2071
+
2072
+ /* src/components/Textarea/Textarea.css */
2073
+ .fractal-textarea {
2074
+ display: block;
2075
+ width: 100%;
2076
+ min-height: 120px;
2077
+ resize: vertical;
2078
+ border: 1px solid var(--border-default);
2079
+ border-radius: var(--radius-md);
2080
+ background: var(--bg-canvas);
2081
+ padding: var(--space-3);
2082
+ color: var(--fg-primary);
2083
+ font: 0.8125rem/1.55 var(--font-mono);
2084
+ }
2085
+ .fractal-textarea::placeholder {
2086
+ color: var(--fg-placeholder);
2087
+ }
2088
+ .fractal-textarea:hover {
2089
+ border-color: var(--fg-tertiary);
2090
+ }
2091
+ .fractal-textarea:focus-visible {
2092
+ outline: none;
2093
+ border-color: var(--border-focus);
2094
+ box-shadow: 0 0 0 2px var(--accent-surface);
2095
+ }
2096
+ .fractal-textarea:disabled {
2097
+ cursor: not-allowed;
2098
+ opacity: 0.5;
2099
+ background: var(--bg-surface-1);
2100
+ }
2101
+
2102
+ /* src/components/TextButton/TextButton.css */
2103
+ .fractal-text-button {
2104
+ display: inline-flex;
2105
+ align-items: center;
2106
+ gap: var(--space-1);
2107
+ border: 0;
2108
+ background: transparent;
2109
+ cursor: pointer;
2110
+ font-family: var(--font-sans);
2111
+ font-weight: 500;
2112
+ line-height: 1.4;
2113
+ padding: 0;
2114
+ text-align: left;
2115
+ transition: color 120ms ease;
2116
+ }
2117
+ .fractal-text-button--primary {
2118
+ color: var(--fg-primary);
2119
+ }
2120
+ .fractal-text-button--primary:hover:not(:disabled) {
2121
+ color: var(--fg-secondary);
2122
+ }
2123
+ .fractal-text-button--secondary {
2124
+ color: var(--fg-secondary);
2125
+ }
2126
+ .fractal-text-button--secondary:hover:not(:disabled) {
2127
+ color: var(--fg-primary);
2128
+ }
2129
+ .fractal-text-button:focus-visible {
2130
+ outline: 2px solid var(--border-focus);
2131
+ outline-offset: 3px;
2132
+ border-radius: var(--radius-sm);
2133
+ }
2134
+ .fractal-text-button:disabled {
2135
+ cursor: not-allowed;
2136
+ opacity: 0.5;
2137
+ }
2138
+ .fractal-text-button--sm {
2139
+ font-size: 0.8125rem;
2140
+ }
2141
+ .fractal-text-button--md {
2142
+ font-size: 0.875rem;
2143
+ }
2144
+ .fractal-text-button__icon {
2145
+ display: inline-grid;
2146
+ place-items: center;
2147
+ }
2148
+
2149
+ /* src/components/FileDropzone/FileDropzone.css */
2150
+ .fractal-file-dropzone {
2151
+ display: grid;
2152
+ gap: var(--space-2);
2153
+ color: var(--fg-primary);
2154
+ font-family: var(--font-sans);
2155
+ }
2156
+ .fractal-file-dropzone__input {
2157
+ display: none;
2158
+ }
2159
+ .fractal-file-dropzone__target {
2160
+ display: flex;
2161
+ width: 100%;
2162
+ min-height: 92px;
2163
+ align-items: center;
2164
+ justify-content: center;
2165
+ gap: var(--space-3);
2166
+ border: 1px dashed var(--border-default);
2167
+ border-radius: var(--radius-md);
2168
+ background: var(--bg-canvas);
2169
+ color: var(--fg-secondary);
2170
+ cursor: pointer;
2171
+ padding: var(--space-4);
2172
+ text-align: left;
2173
+ }
2174
+ .fractal-file-dropzone__target:hover,
2175
+ .fractal-file-dropzone__target[data-dragging] {
2176
+ border-color: var(--border-focus);
2177
+ background: var(--hover-surface);
2178
+ color: var(--fg-primary);
2179
+ }
2180
+ .fractal-file-dropzone__target:focus-visible {
2181
+ outline: 2px solid var(--border-focus);
2182
+ outline-offset: 2px;
2183
+ }
2184
+ .fractal-file-dropzone__target:disabled {
2185
+ cursor: not-allowed;
2186
+ opacity: 0.5;
2187
+ }
2188
+ .fractal-file-dropzone__copy {
2189
+ display: grid;
2190
+ gap: var(--space-1);
2191
+ }
2192
+ .fractal-file-dropzone__title {
2193
+ font-size: 0.875rem;
2194
+ font-weight: 500;
2195
+ line-height: 1.4;
2196
+ }
2197
+ .fractal-file-dropzone__description {
2198
+ color: var(--fg-secondary);
2199
+ font-size: 0.8125rem;
2200
+ line-height: 1.4;
2201
+ }
2202
+ .fractal-file-dropzone__files {
2203
+ display: grid;
2204
+ gap: var(--space-1);
2205
+ margin: 0;
2206
+ padding: 0;
2207
+ list-style: none;
2208
+ }
2209
+ .fractal-file-dropzone__file {
2210
+ display: flex;
2211
+ min-width: 0;
2212
+ align-items: center;
2213
+ gap: var(--space-2);
2214
+ padding: var(--space-2) var(--space-3);
2215
+ border: 1px solid var(--border-subtle);
2216
+ border-radius: var(--radius-md);
2217
+ background: var(--bg-canvas);
2218
+ font-size: 0.8125rem;
2219
+ line-height: 1.4;
2220
+ }
2221
+ .fractal-file-dropzone__file-name {
2222
+ min-width: 0;
2223
+ flex: 1;
2224
+ overflow: hidden;
2225
+ text-overflow: ellipsis;
2226
+ white-space: nowrap;
2227
+ }
2228
+ .fractal-file-dropzone__file-meta {
2229
+ color: var(--fg-secondary);
2230
+ white-space: nowrap;
2231
+ }
2232
+ .fractal-file-dropzone__remove {
2233
+ display: grid;
2234
+ width: 24px;
2235
+ height: 24px;
2236
+ flex: 0 0 auto;
2237
+ place-items: center;
2238
+ border: 0;
2239
+ border-radius: var(--radius-sm);
2240
+ background: transparent;
2241
+ color: var(--fg-secondary);
2242
+ cursor: pointer;
2243
+ }
2244
+ .fractal-file-dropzone__remove:hover {
2245
+ background: var(--hover-surface);
2246
+ color: var(--fg-primary);
2247
+ }
2248
+ .fractal-file-dropzone__remove:focus-visible {
2249
+ outline: 2px solid var(--border-focus);
2250
+ outline-offset: 1px;
2251
+ }
2252
+ .fractal-file-dropzone__remove:disabled {
2253
+ cursor: not-allowed;
2254
+ opacity: 0.5;
2255
+ }
2256
+
2257
+ /* src/components/Pagination/Pagination.css */
2258
+ .fractal-pagination {
2259
+ display: flex;
2260
+ align-items: center;
2261
+ justify-content: space-between;
2262
+ gap: var(--space-3);
2263
+ color: var(--fg-secondary);
2264
+ font-family: var(--font-sans);
2265
+ font-size: 0.8125rem;
2266
+ line-height: 1.4;
2267
+ }
2268
+ .fractal-pagination__controls {
2269
+ display: flex;
2270
+ align-items: center;
2271
+ gap: var(--space-2);
2272
+ }
2273
+ .fractal-pagination__page-size .fractal-dropdown-trigger {
2274
+ padding: 4px 0;
2275
+ border: 0;
2276
+ background: transparent;
2277
+ color: var(--fg-secondary);
2278
+ }
2279
+ .fractal-pagination__page-size .fractal-dropdown-trigger:hover {
2280
+ background: transparent;
2281
+ color: var(--fg-primary);
2282
+ }
2283
+ .fractal-pagination__button {
2284
+ display: grid;
2285
+ width: 28px;
2286
+ height: 28px;
2287
+ place-items: center;
2288
+ border: 1px solid var(--border-default);
2289
+ border-radius: var(--radius-sm);
2290
+ background: var(--bg-canvas);
2291
+ color: var(--fg-secondary);
2292
+ cursor: pointer;
2293
+ }
2294
+ .fractal-pagination__button:hover:not(:disabled) {
2295
+ background: var(--hover-surface);
2296
+ color: var(--fg-primary);
2297
+ }
2298
+ .fractal-pagination__button:focus-visible {
2299
+ outline: 2px solid var(--border-focus);
2300
+ outline-offset: 2px;
2301
+ }
2302
+ .fractal-pagination__button:disabled {
2303
+ cursor: not-allowed;
2304
+ opacity: 0.45;
2305
+ }
2306
+ .fractal-pagination__page {
2307
+ min-width: 44px;
2308
+ text-align: center;
2309
+ white-space: nowrap;
2310
+ }
1283
2311
  /*# sourceMappingURL=index.css.map */