@mirror-physics/fractal-ui 0.2.0-next.27 → 0.2.0-next.28

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;
@@ -580,6 +632,11 @@
580
632
  font-size: 0.875rem;
581
633
  color: var(--fg-secondary);
582
634
  }
635
+ .fractal-modal-body--loading {
636
+ display: grid;
637
+ min-height: 168px;
638
+ place-items: center;
639
+ }
583
640
  .fractal-modal-body--lg {
584
641
  flex: 1;
585
642
  min-height: 0;
@@ -1192,45 +1249,65 @@
1192
1249
 
1193
1250
  /* src/components/ContentSwitcher/ContentSwitcher.css */
1194
1251
  .fractal-content-switcher {
1252
+ position: relative;
1195
1253
  display: inline-flex;
1196
1254
  gap: 2px;
1197
1255
  padding: 2px;
1198
- border: 1px solid var(--border-strong);
1256
+ border: 1px solid var(--border-subtle);
1199
1257
  border-radius: var(--radius-md);
1200
- background: var(--bg-inverse);
1258
+ background: var(--bg-surface-subtle);
1201
1259
  font-family: var(--font-sans);
1202
1260
  }
1261
+ .fractal-content-switcher__indicator {
1262
+ position: absolute;
1263
+ top: 0;
1264
+ left: 0;
1265
+ width: var(--fractal-content-switcher-indicator-width, 0);
1266
+ height: var(--fractal-content-switcher-indicator-height, 0);
1267
+ border-radius: var(--radius-sm);
1268
+ background: var(--bg-canvas);
1269
+ opacity: 0;
1270
+ pointer-events: none;
1271
+ transform: translate3d(var(--fractal-content-switcher-indicator-x, 0), var(--fractal-content-switcher-indicator-y, 0), 0);
1272
+ }
1273
+ .fractal-content-switcher[data-indicator-ready=true] .fractal-content-switcher__indicator {
1274
+ opacity: 1;
1275
+ transition:
1276
+ transform var(--duration-normal) var(--ease-in-out),
1277
+ width var(--duration-normal) var(--ease-in-out),
1278
+ height var(--duration-normal) var(--ease-in-out),
1279
+ opacity var(--duration-fast) var(--ease-out);
1280
+ }
1203
1281
  .fractal-content-switcher--full-width {
1204
1282
  display: flex;
1205
1283
  width: 100%;
1206
1284
  }
1207
1285
  .fractal-content-switcher__item {
1286
+ position: relative;
1287
+ z-index: 1;
1208
1288
  min-width: 128px;
1209
1289
  min-height: 40px;
1210
1290
  padding: 0 var(--space-4);
1211
1291
  border: 0;
1292
+ border-radius: var(--radius-sm);
1212
1293
  background: transparent;
1213
- color: var(--fg-inverse-secondary);
1294
+ color: var(--fg-secondary);
1214
1295
  cursor: pointer;
1215
1296
  font: inherit;
1216
1297
  font-size: 0.875rem;
1217
1298
  line-height: 1.25;
1218
1299
  text-align: center;
1219
- transition:
1220
- background-color var(--duration-fast) var(--ease-out),
1221
- color var(--duration-fast) var(--ease-out),
1222
- border-radius var(--duration-fast) var(--ease-out);
1300
+ transition: background-color var(--duration-fast) var(--ease-out), color var(--duration-fast) var(--ease-out);
1223
1301
  }
1224
1302
  .fractal-content-switcher--full-width .fractal-content-switcher__item {
1225
1303
  flex: 1;
1226
1304
  }
1227
1305
  .fractal-content-switcher__item:hover:not(:disabled):not(.fractal-content-switcher__item--active) {
1228
- background: var(--bg-inverse-subtle);
1229
- color: var(--fg-inverse);
1306
+ background: var(--hover-surface);
1307
+ color: var(--fg-primary);
1230
1308
  }
1231
1309
  .fractal-content-switcher__item--active {
1232
- border-radius: var(--radius-sm);
1233
- background: var(--bg-canvas);
1310
+ background: transparent;
1234
1311
  color: var(--fg-primary);
1235
1312
  }
1236
1313
  .fractal-content-switcher__item:focus-visible {
@@ -1241,9 +1318,14 @@
1241
1318
  }
1242
1319
  .fractal-content-switcher__item:disabled {
1243
1320
  cursor: not-allowed;
1244
- color: var(--fg-inverse-secondary);
1321
+ color: var(--fg-disabled);
1245
1322
  opacity: 0.5;
1246
1323
  }
1324
+ @media (prefers-reduced-motion: reduce) {
1325
+ .fractal-content-switcher[data-indicator-ready=true] .fractal-content-switcher__indicator {
1326
+ transition: none;
1327
+ }
1328
+ }
1247
1329
 
1248
1330
  /* src/components/Disclosure/Disclosure.css */
1249
1331
  .fractal-disclosure {
@@ -1371,6 +1453,305 @@
1371
1453
  }
1372
1454
  }
1373
1455
 
1456
+ /* src/components/Ghost/Ghost.css */
1457
+ .fractal-ghost {
1458
+ --fractal-ghost-base: var(--bg-surface-1);
1459
+ --fractal-ghost-shine: color-mix(in srgb, var(--bg-canvas) 82%, transparent);
1460
+ display: block;
1461
+ min-width: 0;
1462
+ min-height: 1px;
1463
+ background:
1464
+ linear-gradient(
1465
+ 105deg,
1466
+ var(--fractal-ghost-base) 20%,
1467
+ var(--fractal-ghost-shine) 44%,
1468
+ var(--fractal-ghost-base) 68%);
1469
+ background-size: 220% 100%;
1470
+ border-radius: var(--radius-sm);
1471
+ animation: fractal-ghost-shine var(--duration-ambient) var(--ease-in-out) infinite;
1472
+ }
1473
+ .fractal-ghost-line {
1474
+ height: 0.875rem;
1475
+ }
1476
+ .fractal-ghost-line--sm {
1477
+ height: 0.6875rem;
1478
+ }
1479
+ .fractal-ghost-line--lg {
1480
+ height: 1.125rem;
1481
+ }
1482
+ .fractal-ghost-stack {
1483
+ display: grid;
1484
+ gap: var(--space-2);
1485
+ }
1486
+ .fractal-ghost-button {
1487
+ border-radius: var(--radius-full);
1488
+ }
1489
+ .fractal-ghost-button--xs {
1490
+ width: 72px;
1491
+ height: 28px;
1492
+ }
1493
+ .fractal-ghost-button--sm {
1494
+ width: 84px;
1495
+ height: 32px;
1496
+ }
1497
+ .fractal-ghost-button--md {
1498
+ width: 96px;
1499
+ height: 40px;
1500
+ }
1501
+ .fractal-ghost-button--lg {
1502
+ width: 108px;
1503
+ height: 44px;
1504
+ }
1505
+ .fractal-ghost-button--xl {
1506
+ width: 128px;
1507
+ height: 56px;
1508
+ }
1509
+ .fractal-ghost-button--icon-only {
1510
+ width: var(--fractal-ghost-icon-size, 40px);
1511
+ }
1512
+ .fractal-ghost-button--xs.fractal-ghost-button--icon-only {
1513
+ --fractal-ghost-icon-size: 28px;
1514
+ }
1515
+ .fractal-ghost-button--sm.fractal-ghost-button--icon-only {
1516
+ --fractal-ghost-icon-size: 32px;
1517
+ }
1518
+ .fractal-ghost-button--lg.fractal-ghost-button--icon-only {
1519
+ --fractal-ghost-icon-size: 44px;
1520
+ }
1521
+ .fractal-ghost-button--xl.fractal-ghost-button--icon-only {
1522
+ --fractal-ghost-icon-size: 56px;
1523
+ }
1524
+ .fractal-ghost-card {
1525
+ display: grid;
1526
+ gap: var(--space-4);
1527
+ padding: var(--space-5);
1528
+ border: 1px solid var(--border-subtle);
1529
+ border-radius: var(--radius-md);
1530
+ background: var(--bg-canvas);
1531
+ }
1532
+ .fractal-ghost-table {
1533
+ overflow: hidden;
1534
+ border: 1px solid var(--border-subtle);
1535
+ border-radius: var(--radius-md);
1536
+ background: var(--bg-canvas);
1537
+ }
1538
+ .fractal-ghost-table__table {
1539
+ width: 100%;
1540
+ border-collapse: separate;
1541
+ border-spacing: 0;
1542
+ }
1543
+ .fractal-ghost-table__head-row {
1544
+ background: var(--bg-surface-1);
1545
+ }
1546
+ .fractal-ghost-table th {
1547
+ padding: 12px 16px;
1548
+ border-bottom: 1px solid var(--border-subtle);
1549
+ color: var(--fg-secondary);
1550
+ font-size: 0.75rem;
1551
+ font-weight: 500;
1552
+ text-align: left;
1553
+ }
1554
+ .fractal-ghost-table th + th,
1555
+ .fractal-ghost-table td + td {
1556
+ border-left: 1px solid var(--border-subtle);
1557
+ }
1558
+ .fractal-ghost-table td {
1559
+ padding: 14px 16px;
1560
+ }
1561
+ .fractal-ghost-table__row + .fractal-ghost-table__row td {
1562
+ border-top: 1px solid var(--border-subtle);
1563
+ }
1564
+ .fractal-ghost-table--sm th {
1565
+ padding: 8px 12px;
1566
+ }
1567
+ .fractal-ghost-table--sm td {
1568
+ padding: 10px 12px;
1569
+ }
1570
+ .fractal-ghost-table--lg th {
1571
+ padding: 18px 24px;
1572
+ }
1573
+ .fractal-ghost-table--lg td {
1574
+ padding: 22px 24px;
1575
+ }
1576
+ .fractal-ghost-field {
1577
+ display: grid;
1578
+ gap: var(--space-2);
1579
+ }
1580
+ .fractal-ghost-field__control {
1581
+ width: 100%;
1582
+ height: 40px;
1583
+ border: 1px solid var(--border-subtle);
1584
+ border-radius: var(--radius-md);
1585
+ }
1586
+ .fractal-ghost-field__control--multiline {
1587
+ height: 112px;
1588
+ }
1589
+ .fractal-ghost-label {
1590
+ border-radius: var(--radius-sm);
1591
+ }
1592
+ .fractal-ghost-alert {
1593
+ display: grid;
1594
+ gap: var(--space-2);
1595
+ padding: var(--space-4);
1596
+ border: 1px solid var(--border-subtle);
1597
+ border-radius: var(--radius-md);
1598
+ }
1599
+ .fractal-ghost-choice {
1600
+ display: flex;
1601
+ align-items: center;
1602
+ gap: var(--space-2);
1603
+ }
1604
+ .fractal-ghost-choice__control {
1605
+ width: 16px;
1606
+ height: 16px;
1607
+ border-radius: var(--radius-sm);
1608
+ }
1609
+ .fractal-ghost-chip {
1610
+ border-radius: var(--radius-full);
1611
+ }
1612
+ .fractal-ghost-link {
1613
+ display: inline-block;
1614
+ }
1615
+ .fractal-ghost-dropdown {
1616
+ display: flex;
1617
+ align-items: center;
1618
+ justify-content: space-between;
1619
+ width: 220px;
1620
+ height: 40px;
1621
+ padding: 0 var(--space-3);
1622
+ border: 1px solid var(--border-subtle);
1623
+ border-radius: var(--radius-md);
1624
+ }
1625
+ .fractal-ghost-dropdown__chevron {
1626
+ width: 14px;
1627
+ height: 14px;
1628
+ border-radius: var(--radius-full);
1629
+ }
1630
+ .fractal-ghost-switcher {
1631
+ display: flex;
1632
+ width: fit-content;
1633
+ gap: 2px;
1634
+ padding: 3px;
1635
+ border-radius: var(--radius-md);
1636
+ background: var(--bg-surface-1);
1637
+ }
1638
+ .fractal-ghost-switcher > .fractal-ghost {
1639
+ width: 76px;
1640
+ height: 32px;
1641
+ border-radius: calc(var(--radius-md) - 2px);
1642
+ }
1643
+ .fractal-ghost-disclosure {
1644
+ display: flex;
1645
+ align-items: center;
1646
+ gap: var(--space-3);
1647
+ padding: var(--space-3) 0;
1648
+ border-bottom: 1px solid var(--border-subtle);
1649
+ }
1650
+ .fractal-ghost-disclosure__icon {
1651
+ width: 16px;
1652
+ height: 16px;
1653
+ border-radius: var(--radius-full);
1654
+ }
1655
+ .fractal-ghost-pagination {
1656
+ display: flex;
1657
+ gap: var(--space-2);
1658
+ }
1659
+ .fractal-ghost-pagination > .fractal-ghost {
1660
+ width: 32px;
1661
+ height: 32px;
1662
+ border-radius: var(--radius-md);
1663
+ }
1664
+ .fractal-ghost-dropzone {
1665
+ display: grid;
1666
+ place-items: center;
1667
+ gap: var(--space-3);
1668
+ min-height: 184px;
1669
+ padding: var(--space-6);
1670
+ border: 1px dashed var(--border-default);
1671
+ border-radius: var(--radius-md);
1672
+ }
1673
+ .fractal-ghost-dropzone__icon {
1674
+ width: 32px;
1675
+ height: 32px;
1676
+ border-radius: var(--radius-full);
1677
+ }
1678
+ .fractal-ghost-prompt-card {
1679
+ min-height: 176px;
1680
+ }
1681
+ .fractal-ghost-sidebar {
1682
+ display: grid;
1683
+ align-content: start;
1684
+ gap: var(--space-7);
1685
+ width: 248px;
1686
+ min-height: 100%;
1687
+ padding: var(--space-5);
1688
+ border-right: 1px solid var(--border-subtle);
1689
+ background: var(--bg-canvas);
1690
+ }
1691
+ .fractal-ghost-sidebar__brand {
1692
+ width: 112px;
1693
+ height: 24px;
1694
+ }
1695
+ .fractal-ghost-sidebar__items {
1696
+ display: grid;
1697
+ gap: var(--space-2);
1698
+ }
1699
+ .fractal-ghost-sidebar__item {
1700
+ display: flex;
1701
+ align-items: center;
1702
+ gap: var(--space-3);
1703
+ height: 36px;
1704
+ padding: 0 var(--space-2);
1705
+ }
1706
+ .fractal-ghost-sidebar__item > .fractal-ghost {
1707
+ width: 16px;
1708
+ height: 16px;
1709
+ border-radius: var(--radius-sm);
1710
+ }
1711
+ .fractal-ghost-surface {
1712
+ display: grid;
1713
+ gap: var(--space-5);
1714
+ padding: var(--space-6);
1715
+ border: 1px solid var(--border-subtle);
1716
+ border-radius: var(--radius-lg);
1717
+ background: var(--bg-canvas);
1718
+ }
1719
+ .fractal-ghost-modal {
1720
+ width: min(100%, 420px);
1721
+ }
1722
+ .fractal-ghost-side-panel {
1723
+ width: min(100%, 540px);
1724
+ min-height: 480px;
1725
+ }
1726
+ .fractal-ghost-surface__header {
1727
+ display: flex;
1728
+ align-items: center;
1729
+ justify-content: space-between;
1730
+ }
1731
+ .fractal-ghost-surface__close {
1732
+ width: 28px;
1733
+ height: 28px;
1734
+ border-radius: var(--radius-md);
1735
+ }
1736
+ .fractal-ghost-surface__title {
1737
+ color: var(--fg-secondary);
1738
+ font-size: 0.75rem;
1739
+ }
1740
+ @keyframes fractal-ghost-shine {
1741
+ from {
1742
+ background-position: 110% 0;
1743
+ }
1744
+ to {
1745
+ background-position: -110% 0;
1746
+ }
1747
+ }
1748
+ @media (prefers-reduced-motion: reduce) {
1749
+ .fractal-ghost {
1750
+ animation: none;
1751
+ background: var(--fractal-ghost-base);
1752
+ }
1753
+ }
1754
+
1374
1755
  /* src/components/Sidebar/Sidebar.css */
1375
1756
  .fractal-sidebar {
1376
1757
  --fractal-sidebar-width: 232px;
@@ -1551,7 +1932,6 @@
1551
1932
  }
1552
1933
  .fractal-side-panel__header {
1553
1934
  display: flex;
1554
- min-height: 72px;
1555
1935
  align-items: flex-start;
1556
1936
  justify-content: space-between;
1557
1937
  gap: var(--space-4);
@@ -1598,6 +1978,10 @@
1598
1978
  overflow: auto;
1599
1979
  padding: var(--space-2) var(--space-6) var(--space-6);
1600
1980
  }
1981
+ .fractal-side-panel__body--loading {
1982
+ display: grid;
1983
+ place-items: center;
1984
+ }
1601
1985
  .fractal-side-panel__footer {
1602
1986
  display: flex;
1603
1987
  justify-content: flex-end;