@mirror-physics/fractal-ui 0.2.0-next.74 → 0.2.0-next.76

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
@@ -1,3 +1,61 @@
1
+ /* src/styles/control.css */
2
+ [data-control-size=xs] {
3
+ --control-font-size: var(--control-xs-font-size);
4
+ --control-line-height: var(--control-xs-line-height);
5
+ --control-padding-block: var(--control-xs-padding-block);
6
+ --control-padding-inline: var(--control-xs-padding-inline);
7
+ --control-icon-size: var(--control-xs-icon-size);
8
+ }
9
+ [data-control-size=sm] {
10
+ --control-font-size: var(--control-sm-font-size);
11
+ --control-line-height: var(--control-sm-line-height);
12
+ --control-padding-block: var(--control-sm-padding-block);
13
+ --control-padding-inline: var(--control-sm-padding-inline);
14
+ --control-icon-size: var(--control-sm-icon-size);
15
+ }
16
+ [data-control-size=md] {
17
+ --control-font-size: var(--control-md-font-size);
18
+ --control-line-height: var(--control-md-line-height);
19
+ --control-padding-block: var(--control-md-padding-block);
20
+ --control-padding-inline: var(--control-md-padding-inline);
21
+ --control-icon-size: var(--control-md-icon-size);
22
+ }
23
+ [data-control-size=lg] {
24
+ --control-font-size: var(--control-lg-font-size);
25
+ --control-line-height: var(--control-lg-line-height);
26
+ --control-padding-block: var(--control-lg-padding-block);
27
+ --control-padding-inline: var(--control-lg-padding-inline);
28
+ --control-icon-size: var(--control-lg-icon-size);
29
+ }
30
+ [data-control-size=xl] {
31
+ --control-font-size: var(--control-xl-font-size);
32
+ --control-line-height: var(--control-xl-line-height);
33
+ --control-padding-block: var(--control-xl-padding-block);
34
+ --control-padding-inline: var(--control-xl-padding-inline);
35
+ --control-icon-size: var(--control-xl-icon-size);
36
+ }
37
+ [data-control-size] {
38
+ --control-min-block-size: calc(var(--control-line-height) + 2 * var(--control-padding-block) + 2 * var(--control-border-width));
39
+ }
40
+ .fractal-control {
41
+ box-sizing: border-box;
42
+ height: auto;
43
+ min-block-size: var(--control-min-block-size);
44
+ margin: 0;
45
+ padding: var(--control-padding-block) var(--control-padding-inline);
46
+ font-family: var(--font-sans);
47
+ font-size: var(--control-font-size);
48
+ font-weight: 400;
49
+ line-height: var(--control-line-height);
50
+ letter-spacing: normal;
51
+ }
52
+ .fractal-field {
53
+ display: grid;
54
+ align-content: start;
55
+ gap: var(--control-label-gap);
56
+ min-inline-size: 0;
57
+ }
58
+
1
59
  /* src/components/Button/Button.css */
2
60
  .fractal-button {
3
61
  display: inline-flex;
@@ -6,7 +64,6 @@
6
64
  white-space: nowrap;
7
65
  font-weight: 400;
8
66
  font-family: var(--font-sans);
9
- line-height: 1;
10
67
  text-decoration: none;
11
68
  box-sizing: border-box;
12
69
  transform: scale(1);
@@ -31,6 +88,18 @@
31
88
  transition-duration: 0.01ms;
32
89
  }
33
90
  }
91
+ .fractal-button {
92
+ gap: var(--control-icon-gap);
93
+ }
94
+ .fractal-button svg {
95
+ inline-size: var(--control-icon-size);
96
+ block-size: var(--control-icon-size);
97
+ flex-shrink: 0;
98
+ }
99
+ .fractal-button[data-icon-only] {
100
+ inline-size: var(--control-min-block-size);
101
+ padding-inline: 0;
102
+ }
34
103
 
35
104
  /* src/components/CodeBlock/CodeBlock.css */
36
105
  .fractal-code-block {
@@ -199,7 +268,7 @@
199
268
  border: 1px solid var(--border-subtle);
200
269
  background-color: var(--bg-surface-1);
201
270
  color: var(--fg-primary);
202
- box-shadow: var(--shadow-xs);
271
+ box-shadow: none;
203
272
  font-family: var(--font-sans);
204
273
  }
205
274
  .fractal-card-header {
@@ -495,16 +564,12 @@
495
564
 
496
565
  /* src/components/Input/Input.css */
497
566
  .fractal-input {
498
- display: flex;
499
- height: 40px;
567
+ display: block;
568
+ min-width: 0;
500
569
  width: 100%;
501
570
  border-radius: var(--radius-sm, 4px);
502
571
  border: 1px solid var(--border-default);
503
572
  background-color: var(--bg-canvas);
504
- padding: 8px 12px;
505
- font-size: 0.875rem;
506
- font-family: var(--font-sans);
507
- line-height: 1.5;
508
573
  color: var(--fg-primary);
509
574
  transition: border-color 0.15s ease, box-shadow 0.15s ease;
510
575
  box-sizing: border-box;
@@ -527,6 +592,7 @@
527
592
  background: transparent;
528
593
  font-size: 0.875rem;
529
594
  height: auto;
595
+ min-block-size: 0;
530
596
  padding: 0;
531
597
  }
532
598
 
@@ -539,13 +605,15 @@
539
605
  position: absolute;
540
606
  z-index: 1;
541
607
  top: 50%;
542
- left: var(--space-3, 12px);
608
+ left: calc(var(--control-padding-inline) + var(--control-border-width));
609
+ width: var(--control-icon-size);
610
+ height: var(--control-icon-size);
543
611
  color: var(--fg-secondary);
544
612
  pointer-events: none;
545
613
  transform: translateY(-50%);
546
614
  }
547
615
  .fractal-table-search__input {
548
- padding-left: 40px;
616
+ padding-left: calc(var(--control-padding-inline) + var(--control-icon-size) + var(--control-icon-gap));
549
617
  }
550
618
  .fractal-table-search__input::-webkit-search-cancel-button {
551
619
  display: none;
@@ -557,12 +625,16 @@
557
625
  .fractal-number-input {
558
626
  position: relative;
559
627
  width: 100%;
560
- height: 40px;
628
+ font-family: var(--font-sans);
629
+ font-size: var(--control-font-size);
630
+ line-height: var(--control-line-height);
631
+ font-variant-numeric: tabular-nums;
561
632
  align-self: start;
562
633
  }
563
634
  .fractal-number-input .fractal-input {
564
- padding-right: calc(80px + var(--space-3, 12px));
635
+ padding-right: calc(2 * var(--control-min-block-size) + var(--control-padding-inline));
565
636
  appearance: textfield;
637
+ font-variant-numeric: tabular-nums;
566
638
  }
567
639
  .fractal-number-input .fractal-input::-webkit-inner-spin-button,
568
640
  .fractal-number-input .fractal-input::-webkit-outer-spin-button {
@@ -584,15 +656,16 @@
584
656
  position: absolute;
585
657
  top: 50%;
586
658
  color: var(--fg-secondary);
587
- font-size: 0.875rem;
588
- line-height: 1;
659
+ font-size: var(--control-font-size);
660
+ margin-left: var(--space-1);
661
+ line-height: var(--control-line-height);
589
662
  pointer-events: none;
590
663
  transform: translateY(-50%);
591
664
  user-select: none;
592
665
  }
593
666
  .fractal-number-input-step {
594
667
  display: grid;
595
- width: 40px;
668
+ width: var(--control-min-block-size);
596
669
  place-items: center;
597
670
  padding: 0;
598
671
  border: 0;
@@ -615,6 +688,10 @@
615
688
  color: var(--fg-disabled);
616
689
  cursor: not-allowed;
617
690
  }
691
+ .fractal-number-input-step svg {
692
+ width: var(--control-icon-size);
693
+ height: var(--control-icon-size);
694
+ }
618
695
 
619
696
  /* src/components/Slider/Slider.css */
620
697
  .fractal-slider {
@@ -725,19 +802,18 @@
725
802
  .fractal-password-input {
726
803
  position: relative;
727
804
  width: 100%;
728
- height: 40px;
729
805
  align-self: start;
730
806
  }
731
807
  .fractal-password-input-field {
732
- padding-right: calc(40px + var(--space-2, 8px));
808
+ padding-right: calc(var(--control-min-block-size) + var(--control-padding-inline));
733
809
  }
734
810
  .fractal-password-input-toggle {
735
811
  position: absolute;
736
- top: 4px;
737
- right: 4px;
812
+ top: var(--control-border-width);
813
+ bottom: var(--control-border-width);
814
+ right: var(--control-border-width);
738
815
  display: grid;
739
- width: 32px;
740
- height: 32px;
816
+ width: calc(var(--control-min-block-size) - 2 * var(--control-border-width));
741
817
  place-items: center;
742
818
  padding: 0;
743
819
  border: 0;
@@ -765,12 +841,19 @@
765
841
  transition-duration: 0.01ms;
766
842
  }
767
843
  }
844
+ .fractal-password-input-toggle svg {
845
+ width: var(--control-icon-size);
846
+ height: var(--control-icon-size);
847
+ }
768
848
 
769
849
  /* src/components/Label/Label.css */
770
850
  .fractal-label {
771
- font-size: 0.875rem;
851
+ display: block;
852
+ margin: 0;
853
+ font-family: var(--font-sans);
854
+ font-size: var(--control-font-size);
772
855
  font-weight: 500;
773
- line-height: 1;
856
+ line-height: var(--control-line-height);
774
857
  color: var(--fg-primary);
775
858
  }
776
859
  .fractal-label[data-disabled] {
@@ -1326,28 +1409,23 @@
1326
1409
  /* src/components/Dropdown/Dropdown.css */
1327
1410
  .fractal-dropdown {
1328
1411
  position: relative;
1329
- display: inline-block;
1412
+ display: inline-flex;
1413
+ vertical-align: top;
1414
+ min-width: 0;
1330
1415
  }
1331
1416
  .fractal-dropdown-trigger {
1332
1417
  display: inline-flex;
1333
1418
  align-items: center;
1334
- gap: 8px;
1419
+ gap: var(--control-icon-gap);
1335
1420
  border-radius: var(--radius-md, 6px);
1336
1421
  border: 1px solid var(--border-subtle);
1337
1422
  background: var(--bg-canvas);
1338
- padding: 8px 12px;
1339
1423
  text-align: left;
1340
- font-size: 0.875rem;
1341
1424
  font-family: var(--font-sans);
1342
1425
  color: var(--fg-primary);
1343
1426
  cursor: pointer;
1344
1427
  transition: background-color 0.15s;
1345
1428
  }
1346
- .fractal-dropdown-trigger--sm {
1347
- gap: 6px;
1348
- padding: 4px 8px;
1349
- font-size: 0.75rem;
1350
- }
1351
1429
  .fractal-dropdown-trigger--vertical {
1352
1430
  flex-direction: column;
1353
1431
  justify-content: flex-start;
@@ -1365,14 +1443,9 @@
1365
1443
  margin: 0 0 auto;
1366
1444
  }
1367
1445
  .fractal-dropdown-trigger--icon-only {
1368
- width: 32px;
1369
- height: 32px;
1446
+ inline-size: var(--control-min-block-size);
1370
1447
  justify-content: center;
1371
- padding: 0;
1372
- }
1373
- .fractal-dropdown-trigger--icon-only.fractal-dropdown-trigger--sm {
1374
- width: 28px;
1375
- height: 28px;
1448
+ padding-inline: 0;
1376
1449
  }
1377
1450
  .fractal-dropdown-trigger--tertiary {
1378
1451
  border-color: transparent;
@@ -1434,7 +1507,7 @@
1434
1507
  }
1435
1508
  .fractal-dropdown-label {
1436
1509
  width: 100%;
1437
- padding: 6px 8px;
1510
+ padding: var(--space-1) var(--control-padding-inline);
1438
1511
  font-size: 0.75rem;
1439
1512
  font-weight: 500;
1440
1513
  color: var(--fg-secondary);
@@ -1446,9 +1519,10 @@
1446
1519
  box-sizing: border-box;
1447
1520
  align-items: center;
1448
1521
  gap: 8px;
1449
- padding: 6px 8px;
1522
+ padding: var(--control-padding-block) var(--control-padding-inline);
1450
1523
  text-align: left;
1451
- font-size: 0.875rem;
1524
+ font-size: var(--control-font-size);
1525
+ line-height: var(--control-line-height);
1452
1526
  font-family: var(--font-sans);
1453
1527
  background: none;
1454
1528
  border: none;
@@ -1457,14 +1531,6 @@
1457
1531
  color: var(--fg-primary);
1458
1532
  transition: background-color 0.1s;
1459
1533
  }
1460
- .fractal-dropdown-panel--sm .fractal-dropdown-label,
1461
- .fractal-dropdown-panel--sm .fractal-dropdown-option {
1462
- padding: 4px 8px;
1463
- font-size: 0.75rem;
1464
- }
1465
- .fractal-dropdown-panel--sm .fractal-dropdown-option {
1466
- gap: 6px;
1467
- }
1468
1534
  .fractal-dropdown-option:hover,
1469
1535
  .fractal-dropdown-option:focus-visible {
1470
1536
  background: var(--hover-surface, var(--bg-surface-2));
@@ -1485,6 +1551,14 @@
1485
1551
  padding-left: 8px;
1486
1552
  color: var(--accent-default);
1487
1553
  }
1554
+ .fractal-dropdown-trigger {
1555
+ white-space: nowrap;
1556
+ }
1557
+ .fractal-dropdown-icon--trigger svg,
1558
+ .fractal-dropdown-chevron svg {
1559
+ width: var(--control-icon-size);
1560
+ height: var(--control-icon-size);
1561
+ }
1488
1562
 
1489
1563
  /* src/components/Link/Link.css */
1490
1564
  .fractal-link {
@@ -1600,6 +1674,87 @@
1600
1674
  color: var(--fg-disabled);
1601
1675
  }
1602
1676
 
1677
+ /* src/components/Radio/Radio.css */
1678
+ .fractal-radio {
1679
+ position: relative;
1680
+ display: grid;
1681
+ grid-template-columns: 18px minmax(0, 1fr);
1682
+ align-items: start;
1683
+ gap: var(--space-2, 8px);
1684
+ color: var(--fg-primary);
1685
+ cursor: pointer;
1686
+ font-family: var(--font-sans);
1687
+ }
1688
+ .fractal-radio__input {
1689
+ position: absolute;
1690
+ width: 18px;
1691
+ height: 18px;
1692
+ margin: 0;
1693
+ opacity: 0;
1694
+ cursor: inherit;
1695
+ }
1696
+ .fractal-radio__control {
1697
+ display: grid;
1698
+ width: 18px;
1699
+ height: 18px;
1700
+ box-sizing: border-box;
1701
+ place-items: center;
1702
+ border: 1px solid var(--border-strong);
1703
+ border-radius: var(--radius-full, 9999px);
1704
+ background: var(--bg-canvas);
1705
+ transition: border-color 120ms ease, box-shadow 120ms ease;
1706
+ }
1707
+ .fractal-radio__dot {
1708
+ width: 8px;
1709
+ height: 8px;
1710
+ border-radius: var(--radius-full, 9999px);
1711
+ background: var(--accent-default);
1712
+ opacity: 0;
1713
+ transform: scale(0.5);
1714
+ transition: opacity 120ms ease, transform 120ms ease;
1715
+ }
1716
+ .fractal-radio__input:checked + .fractal-radio__control {
1717
+ border-color: var(--accent-default);
1718
+ }
1719
+ .fractal-radio__input:checked + .fractal-radio__control .fractal-radio__dot {
1720
+ opacity: 1;
1721
+ transform: scale(1);
1722
+ }
1723
+ .fractal-radio:hover:not(.fractal-radio--disabled) .fractal-radio__control {
1724
+ border-color: var(--fg-secondary);
1725
+ }
1726
+ .fractal-radio__input:focus-visible + .fractal-radio__control {
1727
+ box-shadow: 0 0 0 2px var(--bg-canvas), 0 0 0 4px var(--border-focus);
1728
+ }
1729
+ .fractal-radio__content {
1730
+ display: grid;
1731
+ min-width: 0;
1732
+ gap: 2px;
1733
+ }
1734
+ .fractal-radio__label {
1735
+ font-size: 0.8125rem;
1736
+ line-height: 18px;
1737
+ }
1738
+ .fractal-radio__description {
1739
+ color: var(--fg-secondary);
1740
+ font-size: 0.75rem;
1741
+ line-height: 1.4;
1742
+ }
1743
+ .fractal-radio--disabled {
1744
+ color: var(--fg-disabled);
1745
+ cursor: not-allowed;
1746
+ }
1747
+ .fractal-radio--disabled .fractal-radio__control {
1748
+ border-color: var(--border-subtle);
1749
+ background: var(--bg-surface-1);
1750
+ }
1751
+ .fractal-radio--disabled .fractal-radio__dot {
1752
+ background: var(--fg-disabled);
1753
+ }
1754
+ .fractal-radio--disabled .fractal-radio__description {
1755
+ color: var(--fg-disabled);
1756
+ }
1757
+
1603
1758
  /* src/components/SortableTable/SortableTable.css */
1604
1759
  .fractal-sortable-table {
1605
1760
  font-family: var(--font-sans);
@@ -1716,8 +1871,23 @@
1716
1871
  background: var(--bg-surface-1);
1717
1872
  }
1718
1873
  .fractal-sortable-table-selection-cell {
1874
+ position: relative;
1719
1875
  width: 52px;
1720
- padding-right: 0 !important;
1876
+ min-width: 52px;
1877
+ padding: 0 !important;
1878
+ }
1879
+ .fractal-sortable-table-selection-cell > .fractal-checkbox {
1880
+ position: absolute;
1881
+ inset: 0;
1882
+ width: 100%;
1883
+ height: 100%;
1884
+ border-radius: 0;
1885
+ }
1886
+ .fractal-sortable-table-selection-cell > .fractal-checkbox:hover:not(:disabled) {
1887
+ background: var(--hover-surface);
1888
+ }
1889
+ .fractal-sortable-table-selection-cell > .fractal-checkbox:focus-visible {
1890
+ outline-offset: -2px;
1721
1891
  }
1722
1892
  .fractal-sortable-table-td--row-action {
1723
1893
  position: relative;
@@ -2165,42 +2335,26 @@
2165
2335
  gap: var(--space-2);
2166
2336
  }
2167
2337
  .fractal-ghost-button {
2338
+ height: var(--control-min-block-size);
2168
2339
  border-radius: var(--radius-full);
2169
2340
  }
2170
2341
  .fractal-ghost-button--xs {
2171
2342
  width: 72px;
2172
- height: 28px;
2173
2343
  }
2174
2344
  .fractal-ghost-button--sm {
2175
2345
  width: 84px;
2176
- height: 32px;
2177
2346
  }
2178
2347
  .fractal-ghost-button--md {
2179
2348
  width: 96px;
2180
- height: 40px;
2181
2349
  }
2182
2350
  .fractal-ghost-button--lg {
2183
2351
  width: 108px;
2184
- height: 44px;
2185
2352
  }
2186
2353
  .fractal-ghost-button--xl {
2187
2354
  width: 128px;
2188
- height: 56px;
2189
2355
  }
2190
2356
  .fractal-ghost-button--icon-only {
2191
- width: var(--fractal-ghost-icon-size, 40px);
2192
- }
2193
- .fractal-ghost-button--xs.fractal-ghost-button--icon-only {
2194
- --fractal-ghost-icon-size: 28px;
2195
- }
2196
- .fractal-ghost-button--sm.fractal-ghost-button--icon-only {
2197
- --fractal-ghost-icon-size: 32px;
2198
- }
2199
- .fractal-ghost-button--lg.fractal-ghost-button--icon-only {
2200
- --fractal-ghost-icon-size: 44px;
2201
- }
2202
- .fractal-ghost-button--xl.fractal-ghost-button--icon-only {
2203
- --fractal-ghost-icon-size: 56px;
2357
+ width: var(--control-min-block-size);
2204
2358
  }
2205
2359
  .fractal-ghost-card {
2206
2360
  display: grid;
@@ -2252,11 +2406,15 @@
2252
2406
  }
2253
2407
  .fractal-ghost-field {
2254
2408
  display: grid;
2255
- gap: var(--space-2);
2409
+ gap: var(--control-label-gap);
2410
+ }
2411
+ .fractal-ghost-field > .fractal-ghost-label {
2412
+ height: var(--control-line-height);
2256
2413
  }
2257
2414
  .fractal-ghost-field__control {
2415
+ box-sizing: border-box;
2258
2416
  width: 100%;
2259
- height: 40px;
2417
+ height: var(--control-min-block-size);
2260
2418
  border: 1px solid var(--border-subtle);
2261
2419
  border-radius: var(--radius-md);
2262
2420
  }
@@ -2293,9 +2451,10 @@
2293
2451
  display: flex;
2294
2452
  align-items: center;
2295
2453
  justify-content: space-between;
2454
+ box-sizing: border-box;
2296
2455
  width: 220px;
2297
- height: 40px;
2298
- padding: 0 var(--space-3);
2456
+ height: var(--control-min-block-size);
2457
+ padding: 0 var(--control-padding-inline);
2299
2458
  border: 1px solid var(--border-subtle);
2300
2459
  border-radius: var(--radius-md);
2301
2460
  }
@@ -2457,6 +2616,10 @@
2457
2616
  }
2458
2617
 
2459
2618
  /* src/components/Sidebar/Sidebar.css */
2619
+ .fractal-sidebar:not([data-fractal-border-surface]) {
2620
+ --border-subtle: var(--border-on-surface-1);
2621
+ --border-default: var(--border-subtle);
2622
+ }
2460
2623
  .fractal-sidebar {
2461
2624
  --fractal-sidebar-width: 232px;
2462
2625
  --fractal-sidebar-compact-width: 56px;
@@ -2467,7 +2630,7 @@
2467
2630
  min-height: 100%;
2468
2631
  flex-direction: column;
2469
2632
  background: var(--bg-surface-1);
2470
- border-right: 1px solid var(--nav-border);
2633
+ border-right: 1px solid var(--border-subtle);
2471
2634
  color: var(--fg-primary);
2472
2635
  font-family: var(--font-sans);
2473
2636
  }