@mirror-physics/fractal-ui 0.2.0-next.75 → 0.2.0-next.77

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 {
@@ -2261,42 +2335,26 @@
2261
2335
  gap: var(--space-2);
2262
2336
  }
2263
2337
  .fractal-ghost-button {
2338
+ height: var(--control-min-block-size);
2264
2339
  border-radius: var(--radius-full);
2265
2340
  }
2266
2341
  .fractal-ghost-button--xs {
2267
2342
  width: 72px;
2268
- height: 28px;
2269
2343
  }
2270
2344
  .fractal-ghost-button--sm {
2271
2345
  width: 84px;
2272
- height: 32px;
2273
2346
  }
2274
2347
  .fractal-ghost-button--md {
2275
2348
  width: 96px;
2276
- height: 40px;
2277
2349
  }
2278
2350
  .fractal-ghost-button--lg {
2279
2351
  width: 108px;
2280
- height: 44px;
2281
2352
  }
2282
2353
  .fractal-ghost-button--xl {
2283
2354
  width: 128px;
2284
- height: 56px;
2285
2355
  }
2286
2356
  .fractal-ghost-button--icon-only {
2287
- width: var(--fractal-ghost-icon-size, 40px);
2288
- }
2289
- .fractal-ghost-button--xs.fractal-ghost-button--icon-only {
2290
- --fractal-ghost-icon-size: 28px;
2291
- }
2292
- .fractal-ghost-button--sm.fractal-ghost-button--icon-only {
2293
- --fractal-ghost-icon-size: 32px;
2294
- }
2295
- .fractal-ghost-button--lg.fractal-ghost-button--icon-only {
2296
- --fractal-ghost-icon-size: 44px;
2297
- }
2298
- .fractal-ghost-button--xl.fractal-ghost-button--icon-only {
2299
- --fractal-ghost-icon-size: 56px;
2357
+ width: var(--control-min-block-size);
2300
2358
  }
2301
2359
  .fractal-ghost-card {
2302
2360
  display: grid;
@@ -2348,11 +2406,15 @@
2348
2406
  }
2349
2407
  .fractal-ghost-field {
2350
2408
  display: grid;
2351
- gap: var(--space-2);
2409
+ gap: var(--control-label-gap);
2410
+ }
2411
+ .fractal-ghost-field > .fractal-ghost-label {
2412
+ height: var(--control-line-height);
2352
2413
  }
2353
2414
  .fractal-ghost-field__control {
2415
+ box-sizing: border-box;
2354
2416
  width: 100%;
2355
- height: 40px;
2417
+ height: var(--control-min-block-size);
2356
2418
  border: 1px solid var(--border-subtle);
2357
2419
  border-radius: var(--radius-md);
2358
2420
  }
@@ -2389,9 +2451,10 @@
2389
2451
  display: flex;
2390
2452
  align-items: center;
2391
2453
  justify-content: space-between;
2454
+ box-sizing: border-box;
2392
2455
  width: 220px;
2393
- height: 40px;
2394
- padding: 0 var(--space-3);
2456
+ height: var(--control-min-block-size);
2457
+ padding: 0 var(--control-padding-inline);
2395
2458
  border: 1px solid var(--border-subtle);
2396
2459
  border-radius: var(--radius-md);
2397
2460
  }
@@ -2553,6 +2616,10 @@
2553
2616
  }
2554
2617
 
2555
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
+ }
2556
2623
  .fractal-sidebar {
2557
2624
  --fractal-sidebar-width: 232px;
2558
2625
  --fractal-sidebar-compact-width: 56px;
@@ -2563,7 +2630,7 @@
2563
2630
  min-height: 100%;
2564
2631
  flex-direction: column;
2565
2632
  background: var(--bg-surface-1);
2566
- border-right: 1px solid var(--nav-border);
2633
+ border-right: 1px solid var(--border-subtle);
2567
2634
  color: var(--fg-primary);
2568
2635
  font-family: var(--font-sans);
2569
2636
  }
@@ -2767,7 +2834,7 @@
2767
2834
  display: flex;
2768
2835
  justify-content: flex-end;
2769
2836
  background: color-mix(in srgb, var(--fg-primary) 16%, transparent);
2770
- animation: fractal-side-panel-overlay-in 180ms ease-out both;
2837
+ animation: fractal-side-panel-overlay-in var(--duration-normal) var(--ease-out) both;
2771
2838
  }
2772
2839
  .fractal-side-panel {
2773
2840
  display: flex;
@@ -2779,7 +2846,7 @@
2779
2846
  box-shadow: var(--shadow-lg);
2780
2847
  color: var(--fg-primary);
2781
2848
  font-family: var(--font-sans);
2782
- animation: fractal-side-panel-in 180ms cubic-bezier(0.16, 1, 0.3, 1) both;
2849
+ animation: fractal-side-panel-in var(--duration-normal) var(--ease-out) both;
2783
2850
  }
2784
2851
  .fractal-side-panel--sm {
2785
2852
  width: min(100vw, 420px);
@@ -2853,7 +2920,33 @@
2853
2920
  justify-content: flex-end;
2854
2921
  gap: var(--space-2);
2855
2922
  padding: var(--space-4) var(--space-6);
2856
- border-top: 1px solid var(--border-subtle);
2923
+ border-top: 1px solid transparent;
2924
+ }
2925
+ .fractal-side-panel__header,
2926
+ .fractal-side-panel__footer {
2927
+ position: relative;
2928
+ flex-shrink: 0;
2929
+ }
2930
+ .fractal-side-panel__header::after,
2931
+ .fractal-side-panel__footer::before {
2932
+ content: "";
2933
+ position: absolute;
2934
+ inset-inline: 0;
2935
+ height: 1px;
2936
+ background: var(--border-subtle);
2937
+ opacity: 0;
2938
+ pointer-events: none;
2939
+ transition: opacity var(--duration-fast) var(--ease-out);
2940
+ }
2941
+ .fractal-side-panel__header::after {
2942
+ bottom: 0;
2943
+ }
2944
+ .fractal-side-panel__footer::before {
2945
+ top: -1px;
2946
+ }
2947
+ .fractal-side-panel__header[data-scroll-divider=true]::after,
2948
+ .fractal-side-panel__footer[data-scroll-divider=true]::before {
2949
+ opacity: 1;
2857
2950
  }
2858
2951
  @media (max-width: 640px) {
2859
2952
  .fractal-side-panel {
@@ -2888,7 +2981,11 @@
2888
2981
  @media (prefers-reduced-motion: reduce) {
2889
2982
  .fractal-side-panel-overlay,
2890
2983
  .fractal-side-panel {
2891
- animation-duration: 0.01ms;
2984
+ animation: none;
2985
+ }
2986
+ .fractal-side-panel__header::after,
2987
+ .fractal-side-panel__footer::before {
2988
+ transition: none;
2892
2989
  }
2893
2990
  }
2894
2991