@usefidel/design-system 0.15.0 → 0.16.0
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/fidel.manifest.json +2 -2
- package/dist/icons.cjs +34 -0
- package/dist/icons.d.cts +11 -0
- package/dist/icons.d.ts +11 -0
- package/dist/icons.js +28 -0
- package/dist/index.cjs +326 -0
- package/dist/index.css +531 -0
- package/dist/index.d.cts +142 -1
- package/dist/index.d.ts +142 -1
- package/dist/index.js +317 -0
- package/package.json +1 -1
package/dist/index.css
CHANGED
|
@@ -165,6 +165,22 @@
|
|
|
165
165
|
color: #a3a3a3;
|
|
166
166
|
cursor: not-allowed;
|
|
167
167
|
}
|
|
168
|
+
.fds-button--dark {
|
|
169
|
+
background-color: var(--color-primary, #171717);
|
|
170
|
+
color: var(--color-primary-text, #ffffff);
|
|
171
|
+
box-shadow: var(--shadow-xs, 0 1px 2px rgba(0, 0, 0, 0.04));
|
|
172
|
+
}
|
|
173
|
+
.fds-button--dark:hover:not(:disabled) {
|
|
174
|
+
background-color: var(--color-primary-hover, #262626);
|
|
175
|
+
}
|
|
176
|
+
.fds-button--dark:active:not(:disabled) {
|
|
177
|
+
background-color: #000000;
|
|
178
|
+
}
|
|
179
|
+
.fds-button--dark:disabled {
|
|
180
|
+
background-color: var(--color-surface, #f5f5f5);
|
|
181
|
+
color: #a3a3a3;
|
|
182
|
+
cursor: not-allowed;
|
|
183
|
+
}
|
|
168
184
|
.fds-button--neutral {
|
|
169
185
|
background-color: var(--color-surface-subtle, #fafafa);
|
|
170
186
|
color: var(--color-text-on-neutral, #404040);
|
|
@@ -1421,3 +1437,518 @@
|
|
|
1421
1437
|
position: static;
|
|
1422
1438
|
}
|
|
1423
1439
|
}
|
|
1440
|
+
|
|
1441
|
+
/* src/components/Badge/badge.css */
|
|
1442
|
+
.fds-badge {
|
|
1443
|
+
box-sizing: border-box;
|
|
1444
|
+
display: inline-flex;
|
|
1445
|
+
align-items: center;
|
|
1446
|
+
gap: 6px;
|
|
1447
|
+
padding: 6px 12px;
|
|
1448
|
+
border-radius: var(--radius-pill, 9999px);
|
|
1449
|
+
font-family: var(--font-body, "Rethink Sans", system-ui, sans-serif);
|
|
1450
|
+
font-size: var(--font-size-text-sm, 14px);
|
|
1451
|
+
line-height: 20px;
|
|
1452
|
+
font-weight: var(--font-weight-medium, 500);
|
|
1453
|
+
white-space: nowrap;
|
|
1454
|
+
}
|
|
1455
|
+
.fds-badge__icon {
|
|
1456
|
+
display: inline-flex;
|
|
1457
|
+
flex-shrink: 0;
|
|
1458
|
+
}
|
|
1459
|
+
.fds-badge__icon > svg {
|
|
1460
|
+
width: 12px;
|
|
1461
|
+
height: 12px;
|
|
1462
|
+
}
|
|
1463
|
+
.fds-badge--neutral {
|
|
1464
|
+
background: var(--color-surface, #f5f5f5);
|
|
1465
|
+
color: var(--color-text-secondary, #525252);
|
|
1466
|
+
}
|
|
1467
|
+
.fds-badge--info {
|
|
1468
|
+
background: var(--color-info-surface, #eff6ff);
|
|
1469
|
+
color: var(--color-info-strong, #2563eb);
|
|
1470
|
+
}
|
|
1471
|
+
.fds-badge--success {
|
|
1472
|
+
background: var(--color-success-bg, #f0fdf4);
|
|
1473
|
+
color: var(--color-success-text, #15803d);
|
|
1474
|
+
}
|
|
1475
|
+
.fds-badge--warning {
|
|
1476
|
+
background: var(--color-warning-bg, #fffbeb);
|
|
1477
|
+
color: var(--color-warning-text, #92400e);
|
|
1478
|
+
}
|
|
1479
|
+
.fds-badge--danger {
|
|
1480
|
+
background: var(--color-error-bg, #fef2f2);
|
|
1481
|
+
color: var(--color-destructive, #eb2d2d);
|
|
1482
|
+
}
|
|
1483
|
+
|
|
1484
|
+
/* src/components/Tag/tag.css */
|
|
1485
|
+
.fds-tag {
|
|
1486
|
+
box-sizing: border-box;
|
|
1487
|
+
display: inline-flex;
|
|
1488
|
+
align-items: center;
|
|
1489
|
+
gap: 6px;
|
|
1490
|
+
padding: 4px 10px;
|
|
1491
|
+
background: var(--color-surface-subtle, #fafafa);
|
|
1492
|
+
border: 1px solid var(--color-border, #e5e5e5);
|
|
1493
|
+
border-radius: var(--radius-md, 6px);
|
|
1494
|
+
font-family: var(--font-body, "Rethink Sans", system-ui, sans-serif);
|
|
1495
|
+
font-size: var(--font-size-text-sm, 14px);
|
|
1496
|
+
line-height: 20px;
|
|
1497
|
+
color: var(--color-text-secondary, #525252);
|
|
1498
|
+
white-space: nowrap;
|
|
1499
|
+
}
|
|
1500
|
+
.fds-dot {
|
|
1501
|
+
display: inline-block;
|
|
1502
|
+
flex-shrink: 0;
|
|
1503
|
+
width: 6px;
|
|
1504
|
+
height: 6px;
|
|
1505
|
+
border-radius: var(--radius-full, 9999px);
|
|
1506
|
+
}
|
|
1507
|
+
.fds-dot--neutral {
|
|
1508
|
+
background: var(--color-text-tertiary, #737373);
|
|
1509
|
+
}
|
|
1510
|
+
.fds-dot--info {
|
|
1511
|
+
background: var(--color-info-strong, #2563eb);
|
|
1512
|
+
}
|
|
1513
|
+
.fds-dot--success {
|
|
1514
|
+
background: var(--color-success, #059669);
|
|
1515
|
+
}
|
|
1516
|
+
.fds-dot--warning {
|
|
1517
|
+
background: var(--color-warning, #ca8a04);
|
|
1518
|
+
}
|
|
1519
|
+
.fds-dot--danger {
|
|
1520
|
+
background: var(--color-destructive, #eb2d2d);
|
|
1521
|
+
}
|
|
1522
|
+
|
|
1523
|
+
/* src/components/MultiSelect/multi-select.css */
|
|
1524
|
+
.fds-multiselect {
|
|
1525
|
+
position: relative;
|
|
1526
|
+
display: inline-block;
|
|
1527
|
+
}
|
|
1528
|
+
.fds-multiselect__trigger {
|
|
1529
|
+
box-sizing: border-box;
|
|
1530
|
+
display: inline-flex;
|
|
1531
|
+
align-items: center;
|
|
1532
|
+
gap: var(--spacing-2, 8px);
|
|
1533
|
+
min-height: 44px;
|
|
1534
|
+
padding: 10px 14px;
|
|
1535
|
+
background: var(--color-surface-raised, #ffffff);
|
|
1536
|
+
border: 1px solid var(--color-border-strong, #d4d4d4);
|
|
1537
|
+
border-radius: var(--radius-lg, 8px);
|
|
1538
|
+
box-shadow: var(--shadow-xs, 0 1px 2px rgba(0, 0, 0, 0.04));
|
|
1539
|
+
font-family: var(--font-body, "Rethink Sans", system-ui, sans-serif);
|
|
1540
|
+
font-size: var(--font-size-text-md, 16px);
|
|
1541
|
+
line-height: 24px;
|
|
1542
|
+
font-weight: var(--font-weight-medium, 500);
|
|
1543
|
+
color: var(--color-text, #171717);
|
|
1544
|
+
cursor: pointer;
|
|
1545
|
+
white-space: nowrap;
|
|
1546
|
+
transition: border-color var(--duration-instant, 80ms) ease, box-shadow var(--duration-instant, 80ms) ease;
|
|
1547
|
+
}
|
|
1548
|
+
.fds-multiselect__trigger:focus-visible,
|
|
1549
|
+
.fds-multiselect__trigger--open {
|
|
1550
|
+
outline: none;
|
|
1551
|
+
border-color: var(--color-accent, #ea580c);
|
|
1552
|
+
box-shadow: inset 0 0 0 1px var(--color-accent, #ea580c);
|
|
1553
|
+
}
|
|
1554
|
+
.fds-multiselect__trigger:disabled {
|
|
1555
|
+
background: var(--color-surface-subtle, #fafafa);
|
|
1556
|
+
color: var(--color-text-muted, #a3a3a3);
|
|
1557
|
+
cursor: not-allowed;
|
|
1558
|
+
}
|
|
1559
|
+
.fds-multiselect__count {
|
|
1560
|
+
padding: 2px 6px;
|
|
1561
|
+
border: 1px solid var(--color-border-light, #f5f5f5);
|
|
1562
|
+
border-radius: var(--radius-sm, 4px);
|
|
1563
|
+
font-size: var(--font-size-text-xs, 12px);
|
|
1564
|
+
line-height: 18px;
|
|
1565
|
+
color: var(--color-text-tertiary, #737373);
|
|
1566
|
+
}
|
|
1567
|
+
.fds-multiselect__chevron {
|
|
1568
|
+
display: inline-flex;
|
|
1569
|
+
margin-left: var(--spacing-4, 16px);
|
|
1570
|
+
color: var(--color-text-tertiary, #737373);
|
|
1571
|
+
transition: transform var(--duration-instant, 80ms) ease;
|
|
1572
|
+
}
|
|
1573
|
+
.fds-multiselect__chevron--open {
|
|
1574
|
+
transform: rotate(180deg);
|
|
1575
|
+
}
|
|
1576
|
+
.fds-multiselect__popover {
|
|
1577
|
+
position: absolute;
|
|
1578
|
+
top: calc(100% + 8px);
|
|
1579
|
+
left: 0;
|
|
1580
|
+
z-index: 50;
|
|
1581
|
+
min-width: max(100%, 280px);
|
|
1582
|
+
background: var(--color-surface-raised, #ffffff);
|
|
1583
|
+
border: 1px solid var(--color-border, #e5e5e5);
|
|
1584
|
+
border-radius: var(--radius-lg, 8px);
|
|
1585
|
+
box-shadow: 0 12px 16px -4px rgba(0, 0, 0, 0.08), 0 4px 6px -2px rgba(0, 0, 0, 0.03);
|
|
1586
|
+
overflow: hidden;
|
|
1587
|
+
}
|
|
1588
|
+
.fds-multiselect__list {
|
|
1589
|
+
padding: 4px 0;
|
|
1590
|
+
}
|
|
1591
|
+
.fds-multiselect__list:focus {
|
|
1592
|
+
outline: none;
|
|
1593
|
+
}
|
|
1594
|
+
.fds-multiselect__option {
|
|
1595
|
+
display: flex;
|
|
1596
|
+
align-items: center;
|
|
1597
|
+
gap: var(--spacing-2, 8px);
|
|
1598
|
+
padding: 10px 14px;
|
|
1599
|
+
cursor: pointer;
|
|
1600
|
+
}
|
|
1601
|
+
.fds-multiselect__option--active {
|
|
1602
|
+
background: var(--color-surface-subtle, #fafafa);
|
|
1603
|
+
}
|
|
1604
|
+
.fds-multiselect__option--disabled {
|
|
1605
|
+
opacity: 0.5;
|
|
1606
|
+
cursor: not-allowed;
|
|
1607
|
+
}
|
|
1608
|
+
.fds-multiselect__box {
|
|
1609
|
+
box-sizing: border-box;
|
|
1610
|
+
display: inline-grid;
|
|
1611
|
+
place-items: center;
|
|
1612
|
+
flex-shrink: 0;
|
|
1613
|
+
width: 16px;
|
|
1614
|
+
height: 16px;
|
|
1615
|
+
border: 1px solid var(--color-border-strong, #d4d4d4);
|
|
1616
|
+
border-radius: var(--radius-sm, 4px);
|
|
1617
|
+
color: var(--color-text, #171717);
|
|
1618
|
+
}
|
|
1619
|
+
.fds-multiselect__box--checked {
|
|
1620
|
+
border-color: var(--color-text-secondary, #525252);
|
|
1621
|
+
}
|
|
1622
|
+
.fds-multiselect__optLabel {
|
|
1623
|
+
flex: 1 1 auto;
|
|
1624
|
+
min-width: 0;
|
|
1625
|
+
overflow: hidden;
|
|
1626
|
+
text-overflow: ellipsis;
|
|
1627
|
+
white-space: nowrap;
|
|
1628
|
+
font-family: var(--font-body, "Rethink Sans", system-ui, sans-serif);
|
|
1629
|
+
font-size: var(--font-size-text-md, 16px);
|
|
1630
|
+
line-height: 24px;
|
|
1631
|
+
font-weight: var(--font-weight-medium, 500);
|
|
1632
|
+
color: var(--color-text, #171717);
|
|
1633
|
+
}
|
|
1634
|
+
.fds-multiselect__optCount {
|
|
1635
|
+
flex-shrink: 0;
|
|
1636
|
+
margin-left: var(--spacing-2, 8px);
|
|
1637
|
+
font-family: var(--font-body, "Rethink Sans", system-ui, sans-serif);
|
|
1638
|
+
font-size: var(--font-size-text-xs, 12px);
|
|
1639
|
+
line-height: 18px;
|
|
1640
|
+
color: var(--color-text-secondary, #525252);
|
|
1641
|
+
}
|
|
1642
|
+
.fds-multiselect__footer {
|
|
1643
|
+
display: flex;
|
|
1644
|
+
justify-content: space-between;
|
|
1645
|
+
align-items: center;
|
|
1646
|
+
height: 40px;
|
|
1647
|
+
padding: 0 16px;
|
|
1648
|
+
border-top: 1px solid var(--color-border, #e5e5e5);
|
|
1649
|
+
}
|
|
1650
|
+
.fds-multiselect__action {
|
|
1651
|
+
padding: 0;
|
|
1652
|
+
background: none;
|
|
1653
|
+
border: 0;
|
|
1654
|
+
font-family: var(--font-body, "Rethink Sans", system-ui, sans-serif);
|
|
1655
|
+
font-size: var(--font-size-text-xs, 12px);
|
|
1656
|
+
line-height: 18px;
|
|
1657
|
+
font-weight: var(--font-weight-medium, 500);
|
|
1658
|
+
color: var(--color-text-tertiary, #737373);
|
|
1659
|
+
cursor: pointer;
|
|
1660
|
+
}
|
|
1661
|
+
.fds-multiselect__action:hover {
|
|
1662
|
+
color: var(--color-text, #171717);
|
|
1663
|
+
}
|
|
1664
|
+
.fds-multiselect__action:focus-visible {
|
|
1665
|
+
outline: 2px solid var(--color-focus, #ea580c);
|
|
1666
|
+
outline-offset: 2px;
|
|
1667
|
+
border-radius: var(--radius-xs, 2px);
|
|
1668
|
+
}
|
|
1669
|
+
|
|
1670
|
+
/* src/components/SearchInput/search-input.css */
|
|
1671
|
+
.fds-search {
|
|
1672
|
+
position: relative;
|
|
1673
|
+
display: flex;
|
|
1674
|
+
align-items: center;
|
|
1675
|
+
width: 100%;
|
|
1676
|
+
}
|
|
1677
|
+
.fds-search__icon {
|
|
1678
|
+
position: absolute;
|
|
1679
|
+
left: 14px;
|
|
1680
|
+
color: var(--color-text-tertiary, #737373);
|
|
1681
|
+
pointer-events: none;
|
|
1682
|
+
}
|
|
1683
|
+
.fds-search__input {
|
|
1684
|
+
box-sizing: border-box;
|
|
1685
|
+
width: 100%;
|
|
1686
|
+
min-height: 44px;
|
|
1687
|
+
padding: 10px 40px 10px 42px;
|
|
1688
|
+
background: var(--color-surface-raised, #ffffff);
|
|
1689
|
+
border: 1px solid var(--color-border-strong, #d4d4d4);
|
|
1690
|
+
border-radius: var(--radius-lg, 8px);
|
|
1691
|
+
box-shadow: var(--shadow-xs, 0 1px 2px rgba(0, 0, 0, 0.04));
|
|
1692
|
+
font-family: var(--font-body, "Rethink Sans", system-ui, sans-serif);
|
|
1693
|
+
font-size: var(--font-size-text-md, 16px);
|
|
1694
|
+
line-height: 24px;
|
|
1695
|
+
font-weight: var(--font-weight-medium, 500);
|
|
1696
|
+
color: var(--color-text, #171717);
|
|
1697
|
+
transition: border-color var(--duration-instant, 80ms) ease, box-shadow var(--duration-instant, 80ms) ease;
|
|
1698
|
+
}
|
|
1699
|
+
.fds-search__input::placeholder {
|
|
1700
|
+
color: var(--color-text-tertiary, #737373);
|
|
1701
|
+
}
|
|
1702
|
+
.fds-search__input:focus {
|
|
1703
|
+
outline: none;
|
|
1704
|
+
border-color: var(--color-accent, #ea580c);
|
|
1705
|
+
box-shadow: inset 0 0 0 1px var(--color-accent, #ea580c);
|
|
1706
|
+
}
|
|
1707
|
+
.fds-search__input::-webkit-search-cancel-button {
|
|
1708
|
+
cursor: pointer;
|
|
1709
|
+
}
|
|
1710
|
+
.fds-search__kbd {
|
|
1711
|
+
position: absolute;
|
|
1712
|
+
right: 12px;
|
|
1713
|
+
padding: 0 6px;
|
|
1714
|
+
border: 1px solid var(--color-border, #e5e5e5);
|
|
1715
|
+
border-radius: var(--radius-sm, 4px);
|
|
1716
|
+
font-family: var(--font-mono, monospace);
|
|
1717
|
+
font-size: var(--font-size-text-xs, 12px);
|
|
1718
|
+
line-height: 18px;
|
|
1719
|
+
color: var(--color-text-tertiary, #737373);
|
|
1720
|
+
pointer-events: none;
|
|
1721
|
+
}
|
|
1722
|
+
|
|
1723
|
+
/* src/components/Pagination/pagination.css */
|
|
1724
|
+
.fds-pagination {
|
|
1725
|
+
display: flex;
|
|
1726
|
+
align-items: center;
|
|
1727
|
+
justify-content: space-between;
|
|
1728
|
+
gap: var(--spacing-4, 16px);
|
|
1729
|
+
font-family: var(--font-body, "Rethink Sans", system-ui, sans-serif);
|
|
1730
|
+
font-size: var(--font-size-text-sm, 14px);
|
|
1731
|
+
line-height: 20px;
|
|
1732
|
+
color: var(--color-text-secondary, #525252);
|
|
1733
|
+
}
|
|
1734
|
+
.fds-pagination--compact {
|
|
1735
|
+
justify-content: center;
|
|
1736
|
+
}
|
|
1737
|
+
.fds-pagination__range {
|
|
1738
|
+
margin: 0;
|
|
1739
|
+
}
|
|
1740
|
+
.fds-pagination__controls {
|
|
1741
|
+
display: flex;
|
|
1742
|
+
align-items: center;
|
|
1743
|
+
gap: var(--spacing-1, 4px);
|
|
1744
|
+
}
|
|
1745
|
+
.fds-pagination__arrow,
|
|
1746
|
+
.fds-pagination__page {
|
|
1747
|
+
box-sizing: border-box;
|
|
1748
|
+
display: inline-grid;
|
|
1749
|
+
place-items: center;
|
|
1750
|
+
min-width: 36px;
|
|
1751
|
+
height: 36px;
|
|
1752
|
+
padding: 0 8px;
|
|
1753
|
+
background: none;
|
|
1754
|
+
border: 1px solid transparent;
|
|
1755
|
+
border-radius: var(--radius-lg, 8px);
|
|
1756
|
+
font: inherit;
|
|
1757
|
+
font-weight: var(--font-weight-medium, 500);
|
|
1758
|
+
color: var(--color-text-secondary, #525252);
|
|
1759
|
+
cursor: pointer;
|
|
1760
|
+
transition: background var(--duration-instant, 80ms) ease;
|
|
1761
|
+
}
|
|
1762
|
+
.fds-pagination__arrow:hover:not(:disabled),
|
|
1763
|
+
.fds-pagination__page:hover {
|
|
1764
|
+
background: var(--color-surface, #f5f5f5);
|
|
1765
|
+
}
|
|
1766
|
+
.fds-pagination__arrow:disabled {
|
|
1767
|
+
color: var(--color-text-muted, #a3a3a3);
|
|
1768
|
+
cursor: not-allowed;
|
|
1769
|
+
}
|
|
1770
|
+
.fds-pagination__arrow:focus-visible,
|
|
1771
|
+
.fds-pagination__page:focus-visible {
|
|
1772
|
+
outline: 2px solid var(--color-focus, #ea580c);
|
|
1773
|
+
outline-offset: 2px;
|
|
1774
|
+
}
|
|
1775
|
+
.fds-pagination__page--current {
|
|
1776
|
+
border-color: var(--color-border, #e5e5e5);
|
|
1777
|
+
background: var(--color-surface-raised, #ffffff);
|
|
1778
|
+
color: var(--color-text, #171717);
|
|
1779
|
+
box-shadow: var(--shadow-xs, 0 1px 2px rgba(0, 0, 0, 0.04));
|
|
1780
|
+
}
|
|
1781
|
+
.fds-pagination__gap {
|
|
1782
|
+
min-width: 24px;
|
|
1783
|
+
text-align: center;
|
|
1784
|
+
color: var(--color-text-muted, #a3a3a3);
|
|
1785
|
+
}
|
|
1786
|
+
.fds-pagination__status {
|
|
1787
|
+
padding: 0 var(--spacing-2, 8px);
|
|
1788
|
+
white-space: nowrap;
|
|
1789
|
+
}
|
|
1790
|
+
|
|
1791
|
+
/* src/components/EmptyState/empty-state.css */
|
|
1792
|
+
.fds-empty {
|
|
1793
|
+
display: flex;
|
|
1794
|
+
flex-direction: column;
|
|
1795
|
+
align-items: center;
|
|
1796
|
+
gap: var(--spacing-8, 32px);
|
|
1797
|
+
padding: 64px 40px;
|
|
1798
|
+
text-align: center;
|
|
1799
|
+
}
|
|
1800
|
+
.fds-empty__illustration {
|
|
1801
|
+
display: grid;
|
|
1802
|
+
place-items: center;
|
|
1803
|
+
min-height: 180px;
|
|
1804
|
+
}
|
|
1805
|
+
.fds-empty__text {
|
|
1806
|
+
display: flex;
|
|
1807
|
+
flex-direction: column;
|
|
1808
|
+
align-items: center;
|
|
1809
|
+
gap: var(--spacing-3, 12px);
|
|
1810
|
+
}
|
|
1811
|
+
.fds-empty__title {
|
|
1812
|
+
margin: 0;
|
|
1813
|
+
font-family: var(--font-display, "Rethink Sans", system-ui, sans-serif);
|
|
1814
|
+
font-size: var(--font-size-display-xs, 24px);
|
|
1815
|
+
line-height: 32px;
|
|
1816
|
+
font-weight: var(--font-weight-medium, 500);
|
|
1817
|
+
letter-spacing: -0.18px;
|
|
1818
|
+
color: var(--color-text, #171717);
|
|
1819
|
+
}
|
|
1820
|
+
.fds-empty__description {
|
|
1821
|
+
margin: 0;
|
|
1822
|
+
max-width: 380px;
|
|
1823
|
+
font-family: var(--font-body, "Rethink Sans", system-ui, sans-serif);
|
|
1824
|
+
font-size: var(--font-size-text-sm, 14px);
|
|
1825
|
+
line-height: 20px;
|
|
1826
|
+
color: var(--color-text-secondary, #525252);
|
|
1827
|
+
}
|
|
1828
|
+
.fds-empty__actions {
|
|
1829
|
+
display: flex;
|
|
1830
|
+
flex-direction: column;
|
|
1831
|
+
align-items: center;
|
|
1832
|
+
gap: var(--spacing-6, 24px);
|
|
1833
|
+
}
|
|
1834
|
+
.fds-empty__footer {
|
|
1835
|
+
display: flex;
|
|
1836
|
+
flex-wrap: wrap;
|
|
1837
|
+
align-items: center;
|
|
1838
|
+
justify-content: center;
|
|
1839
|
+
gap: 10px;
|
|
1840
|
+
font-family: var(--font-body, "Rethink Sans", system-ui, sans-serif);
|
|
1841
|
+
font-size: var(--font-size-text-sm, 14px);
|
|
1842
|
+
line-height: 20px;
|
|
1843
|
+
color: var(--color-text-tertiary, #737373);
|
|
1844
|
+
}
|
|
1845
|
+
.fds-stacked-cards {
|
|
1846
|
+
position: relative;
|
|
1847
|
+
width: 240px;
|
|
1848
|
+
height: 160px;
|
|
1849
|
+
}
|
|
1850
|
+
.fds-stacked-cards__card {
|
|
1851
|
+
box-sizing: border-box;
|
|
1852
|
+
position: absolute;
|
|
1853
|
+
width: 180px;
|
|
1854
|
+
height: 116px;
|
|
1855
|
+
background: var(--color-surface-raised, #ffffff);
|
|
1856
|
+
border: 1px solid var(--color-border, #e5e5e5);
|
|
1857
|
+
border-radius: var(--radius-xl, 12px);
|
|
1858
|
+
}
|
|
1859
|
+
.fds-stacked-cards__card--back {
|
|
1860
|
+
left: 30px;
|
|
1861
|
+
top: 27px;
|
|
1862
|
+
transform: rotate(5deg);
|
|
1863
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.02);
|
|
1864
|
+
}
|
|
1865
|
+
.fds-stacked-cards__card--front {
|
|
1866
|
+
left: 19px;
|
|
1867
|
+
top: 3px;
|
|
1868
|
+
display: flex;
|
|
1869
|
+
align-items: flex-start;
|
|
1870
|
+
justify-content: space-between;
|
|
1871
|
+
padding: 16px;
|
|
1872
|
+
border-width: 1.5px;
|
|
1873
|
+
transform: rotate(-4deg);
|
|
1874
|
+
filter: drop-shadow(0 8px 8px rgba(0, 0, 0, 0.02));
|
|
1875
|
+
}
|
|
1876
|
+
.fds-stacked-cards__lines {
|
|
1877
|
+
display: flex;
|
|
1878
|
+
flex-direction: column;
|
|
1879
|
+
gap: 6px;
|
|
1880
|
+
width: 100px;
|
|
1881
|
+
}
|
|
1882
|
+
.fds-stacked-cards__lines > span {
|
|
1883
|
+
height: 6px;
|
|
1884
|
+
border-radius: 3px;
|
|
1885
|
+
}
|
|
1886
|
+
.fds-stacked-cards__lines > span:nth-child(1) {
|
|
1887
|
+
width: 100%;
|
|
1888
|
+
background: var(--color-border, #e5e5e5);
|
|
1889
|
+
}
|
|
1890
|
+
.fds-stacked-cards__lines > span:nth-child(2) {
|
|
1891
|
+
width: 70px;
|
|
1892
|
+
background: var(--color-surface, #f5f5f5);
|
|
1893
|
+
}
|
|
1894
|
+
.fds-stacked-cards__lines > span:nth-child(3) {
|
|
1895
|
+
width: 45px;
|
|
1896
|
+
background: var(--color-surface-subtle, #fafafa);
|
|
1897
|
+
}
|
|
1898
|
+
.fds-stacked-cards__status {
|
|
1899
|
+
color: var(--color-border, #e5e5e5);
|
|
1900
|
+
}
|
|
1901
|
+
.fds-stacked-cards__statusDot {
|
|
1902
|
+
fill: var(--color-text-tertiary, #737373);
|
|
1903
|
+
}
|
|
1904
|
+
.fds-stacked-cards__badge {
|
|
1905
|
+
position: absolute;
|
|
1906
|
+
left: 145px;
|
|
1907
|
+
top: 75px;
|
|
1908
|
+
display: grid;
|
|
1909
|
+
place-items: center;
|
|
1910
|
+
width: 48px;
|
|
1911
|
+
height: 48px;
|
|
1912
|
+
border-radius: var(--radius-full, 9999px);
|
|
1913
|
+
background: var(--color-primary, #171717);
|
|
1914
|
+
color: var(--color-primary-text, #ffffff);
|
|
1915
|
+
filter: drop-shadow(0 8px 8px rgba(0, 0, 0, 0.13));
|
|
1916
|
+
}
|
|
1917
|
+
|
|
1918
|
+
/* src/components/Skeleton/skeleton.css */
|
|
1919
|
+
.fds-skeleton {
|
|
1920
|
+
display: block;
|
|
1921
|
+
flex-shrink: 0;
|
|
1922
|
+
max-width: 100%;
|
|
1923
|
+
height: 16px;
|
|
1924
|
+
border-radius: var(--radius-sm, 4px);
|
|
1925
|
+
background: var(--color-surface-hover, #ececec);
|
|
1926
|
+
animation: fds-skeleton-pulse 1.4s ease-in-out infinite;
|
|
1927
|
+
}
|
|
1928
|
+
.fds-skeleton--text {
|
|
1929
|
+
width: 100%;
|
|
1930
|
+
height: 1em;
|
|
1931
|
+
border-radius: var(--radius-xs, 2px);
|
|
1932
|
+
}
|
|
1933
|
+
.fds-skeleton--circle {
|
|
1934
|
+
border-radius: var(--radius-full, 9999px);
|
|
1935
|
+
}
|
|
1936
|
+
.fds-skeleton-lines {
|
|
1937
|
+
display: flex;
|
|
1938
|
+
flex-direction: column;
|
|
1939
|
+
gap: 0.5em;
|
|
1940
|
+
width: 100%;
|
|
1941
|
+
}
|
|
1942
|
+
@keyframes fds-skeleton-pulse {
|
|
1943
|
+
0%, 100% {
|
|
1944
|
+
opacity: 1;
|
|
1945
|
+
}
|
|
1946
|
+
50% {
|
|
1947
|
+
opacity: 0.45;
|
|
1948
|
+
}
|
|
1949
|
+
}
|
|
1950
|
+
@media (prefers-reduced-motion: reduce) {
|
|
1951
|
+
.fds-skeleton {
|
|
1952
|
+
animation: none;
|
|
1953
|
+
}
|
|
1954
|
+
}
|
package/dist/index.d.cts
CHANGED
|
@@ -2,6 +2,8 @@ import * as react from 'react';
|
|
|
2
2
|
import { ButtonHTMLAttributes, ReactNode, HTMLAttributes, InputHTMLAttributes } from 'react';
|
|
3
3
|
|
|
4
4
|
type ButtonVariant = 'primary' | 'outlined' | 'text' | 'neutral' | 'link'
|
|
5
|
+
/** High-contrast near-black, for a page's main create action ("New comparison"). */
|
|
6
|
+
| 'dark'
|
|
5
7
|
/** Final confirm of a destructive action ("Delete my account"). */
|
|
6
8
|
| 'danger'
|
|
7
9
|
/** Starts a destructive action ("Delete account", "Remove"). */
|
|
@@ -421,4 +423,143 @@ interface SplitProps extends HTMLAttributes<HTMLDivElement> {
|
|
|
421
423
|
*/
|
|
422
424
|
declare function Split({ aside, children, asideWidth, sticky, collapseBelow, className, style, ...rest }: SplitProps): react.JSX.Element;
|
|
423
425
|
|
|
424
|
-
|
|
426
|
+
/** Semantic colour roles shared by status components (Badge, Tag, MultiSelect dots). */
|
|
427
|
+
type Tone = 'neutral' | 'info' | 'success' | 'warning' | 'danger';
|
|
428
|
+
|
|
429
|
+
interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {
|
|
430
|
+
/** Colour role. @default 'neutral' */
|
|
431
|
+
tone?: Tone;
|
|
432
|
+
/** Leading icon, drawn at 12px. */
|
|
433
|
+
icon?: ReactNode;
|
|
434
|
+
children: ReactNode;
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* Fidel design-system Badge: a tinted pill naming a state ("Checking",
|
|
438
|
+
* "Checked", "Failed to run"). Measured from Figma "✅Project" status-badge
|
|
439
|
+
* (node 231:59799).
|
|
440
|
+
*/
|
|
441
|
+
declare function Badge({ tone, icon, className, children, ...rest }: BadgeProps): react.JSX.Element;
|
|
442
|
+
|
|
443
|
+
interface TagProps extends HTMLAttributes<HTMLSpanElement> {
|
|
444
|
+
/** Colour of the leading dot. Leave out for no dot. */
|
|
445
|
+
dot?: Tone;
|
|
446
|
+
children: ReactNode;
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* Fidel design-system Tag: a quiet bordered label for a category, with an
|
|
450
|
+
* optional coloured dot. Measured from Figma "✅Project" comparison-type chip
|
|
451
|
+
* (node 231:59808).
|
|
452
|
+
*/
|
|
453
|
+
declare function Tag({ dot, className, children, ...rest }: TagProps): react.JSX.Element;
|
|
454
|
+
|
|
455
|
+
interface MultiSelectOption {
|
|
456
|
+
value: string;
|
|
457
|
+
label: string;
|
|
458
|
+
/** Coloured dot before the label. */
|
|
459
|
+
dot?: Tone;
|
|
460
|
+
/** Trailing count, e.g. how many results the option would show. */
|
|
461
|
+
count?: number;
|
|
462
|
+
disabled?: boolean;
|
|
463
|
+
}
|
|
464
|
+
interface MultiSelectProps {
|
|
465
|
+
/** Trigger text, e.g. "Status". Also the list's accessible name. */
|
|
466
|
+
label: string;
|
|
467
|
+
options: MultiSelectOption[];
|
|
468
|
+
/** Selected values. An empty list means nothing is ticked. */
|
|
469
|
+
value: string[];
|
|
470
|
+
onChange: (value: string[]) => void;
|
|
471
|
+
disabled?: boolean;
|
|
472
|
+
selectAllLabel?: string;
|
|
473
|
+
clearLabel?: string;
|
|
474
|
+
id?: string;
|
|
475
|
+
className?: string;
|
|
476
|
+
}
|
|
477
|
+
/**
|
|
478
|
+
* Fidel design-system MultiSelect: a filter menu of checkbox options, each
|
|
479
|
+
* with an optional dot and count, and Select all / Clear in the footer. The
|
|
480
|
+
* trigger shows "n/m" once anything is ticked. Keyboard: Enter/Space/↓ open;
|
|
481
|
+
* ↑/↓/Home/End move; Enter/Space toggle; Esc closes. Measured from Figma
|
|
482
|
+
* "✅Project" filter Select (node 231:60682).
|
|
483
|
+
*/
|
|
484
|
+
declare function MultiSelect({ label, options, value, onChange, disabled, selectAllLabel, clearLabel, id, className, }: MultiSelectProps): react.JSX.Element;
|
|
485
|
+
|
|
486
|
+
interface SearchInputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type'> {
|
|
487
|
+
/** Keyboard hint shown at the end while the field is empty, e.g. "/". */
|
|
488
|
+
shortcut?: string;
|
|
489
|
+
/** Class for the wrapper; `className` goes on the input. */
|
|
490
|
+
containerClassName?: string;
|
|
491
|
+
}
|
|
492
|
+
/**
|
|
493
|
+
* Fidel design-system SearchInput: a 44px search field with a leading
|
|
494
|
+
* magnifier. Measured from Figma "✅Project" toolbar search (node 231:59687).
|
|
495
|
+
*/
|
|
496
|
+
declare const SearchInput: react.ForwardRefExoticComponent<SearchInputProps & react.RefAttributes<HTMLInputElement>>;
|
|
497
|
+
|
|
498
|
+
interface PaginationProps {
|
|
499
|
+
/** Current page, 1-based. */
|
|
500
|
+
page: number;
|
|
501
|
+
pageCount: number;
|
|
502
|
+
onPageChange: (page: number) => void;
|
|
503
|
+
/** With `pageSize`, adds "Showing 1–20 of 45" (full variant only). */
|
|
504
|
+
total?: number;
|
|
505
|
+
pageSize?: number;
|
|
506
|
+
/** full: range text + page numbers. compact: "Page 2 of 3" between arrows. @default 'full' */
|
|
507
|
+
variant?: 'full' | 'compact';
|
|
508
|
+
className?: string;
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* Fidel design-system Pagination. Renders nothing when there is one page.
|
|
512
|
+
*/
|
|
513
|
+
declare function Pagination({ page, pageCount, onPageChange, total, pageSize, variant, className }: PaginationProps): react.JSX.Element | null;
|
|
514
|
+
|
|
515
|
+
interface EmptyStateProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {
|
|
516
|
+
/** Picture above the title, e.g. <StackedCardsIllustration />. */
|
|
517
|
+
illustration?: ReactNode;
|
|
518
|
+
title: ReactNode;
|
|
519
|
+
description?: ReactNode;
|
|
520
|
+
/** Primary action, usually a Button. */
|
|
521
|
+
action?: ReactNode;
|
|
522
|
+
/** Secondary line under the action, e.g. a help link. */
|
|
523
|
+
footer?: ReactNode;
|
|
524
|
+
}
|
|
525
|
+
/**
|
|
526
|
+
* Fidel design-system EmptyState: a centred illustration, title, description,
|
|
527
|
+
* action and footer, for a list or page with nothing in it yet. Measured from
|
|
528
|
+
* Figma "✅Project" Empty State Container (node 231:59661).
|
|
529
|
+
*/
|
|
530
|
+
declare function EmptyState({ illustration, title, description, action, footer, className, ...rest }: EmptyStateProps): react.JSX.Element;
|
|
531
|
+
/**
|
|
532
|
+
* Two tilted cards with a search badge: "nothing found yet". Drawn from the
|
|
533
|
+
* Figma "Stacked Cards" layers (node 80:49887), 240×160.
|
|
534
|
+
*/
|
|
535
|
+
declare function StackedCardsIllustration({ className }: {
|
|
536
|
+
className?: string;
|
|
537
|
+
}): react.JSX.Element;
|
|
538
|
+
|
|
539
|
+
type SkeletonShape = 'rect' | 'text' | 'circle';
|
|
540
|
+
interface SkeletonProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'children'> {
|
|
541
|
+
/** rect: a block. text: line(s) at text height. circle: an avatar or icon. @default 'rect' */
|
|
542
|
+
shape?: SkeletonShape;
|
|
543
|
+
/** CSS width; a number is px. Text defaults to 100%, circle to its height. */
|
|
544
|
+
width?: number | string;
|
|
545
|
+
/** CSS height; a number is px. Text defaults to one line (1em). @default 16 for rect and circle */
|
|
546
|
+
height?: number | string;
|
|
547
|
+
/** Text only: how many lines. The last of several is shorter, as text usually is. @default 1 */
|
|
548
|
+
lines?: number;
|
|
549
|
+
}
|
|
550
|
+
/**
|
|
551
|
+
* Fidel design-system Skeleton: a placeholder shape that pulses while content
|
|
552
|
+
* loads. Pages compose these into the shape of what's coming (rows, cards,
|
|
553
|
+
* headers). Purely visual and hidden from assistive tech; wrap a layout in
|
|
554
|
+
* SkeletonGroup so it's announced once as loading.
|
|
555
|
+
*/
|
|
556
|
+
declare function Skeleton({ shape, width, height, lines, className, style, ...rest }: SkeletonProps): react.JSX.Element;
|
|
557
|
+
interface SkeletonGroupProps extends HTMLAttributes<HTMLDivElement> {
|
|
558
|
+
/** What's loading, for screen readers. @default 'Loading' */
|
|
559
|
+
label?: string;
|
|
560
|
+
children: ReactNode;
|
|
561
|
+
}
|
|
562
|
+
/** Wraps a skeleton layout and announces it once as loading (role="status"). */
|
|
563
|
+
declare function SkeletonGroup({ label, className, children, ...rest }: SkeletonGroupProps): react.JSX.Element;
|
|
564
|
+
|
|
565
|
+
export { AppNav, type AppNavProps, Avatar, type AvatarProps, type AvatarSize, Badge, type BadgeProps, type Breakpoint, Button, type ButtonProps, type ButtonSize, type ButtonVariant, type DiffElement, type DiffPropertyLine, DiffPropertyList, type DiffPropertyListProps, DiffSection, type DiffSectionProps, EmptyState, type EmptyStateProps, MismatchCard, type MismatchCardProps, type MismatchProperty, Modal, type ModalProps, type ModalSize, type ModalTone, MultiSelect, type MultiSelectOption, type MultiSelectProps, Pagination, type PaginationProps, SearchInput, type SearchInputProps, SectionHeader, type SectionHeaderProps, SegmentedControl, type SegmentedControlProps, type SegmentedOption, Select, type SelectOption, type SelectProps, SettingsSection, type SettingsSectionProps, Skeleton, SkeletonGroup, type SkeletonGroupProps, type SkeletonProps, type SkeletonShape, Split, type SplitProps, StackedCardsIllustration, TabNav, type TabNavProps, Tag, type TagProps, Toggle, type ToggleProps, type ToggleSize, type Tone, breakpoints };
|