@ceebee/ui 1.8.0 → 1.10.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/THIRD_PARTY_NOTICES.md +19 -1
- package/dist/client.css +281 -0
- package/dist/client.d.ts +447 -1
- package/dist/client.js +878 -51
- package/dist/styles.css +555 -0
- package/package.json +6 -2
package/dist/styles.css
CHANGED
|
@@ -930,6 +930,21 @@ svg.react-flow__connectionline {
|
|
|
930
930
|
.cb-container--lg { max-width: 76rem; }
|
|
931
931
|
.cb-container--full { max-width: none; }
|
|
932
932
|
|
|
933
|
+
/* Text for a screen reader and no one else. It is in the layout file rather than beside any one
|
|
934
|
+
component because more than one already asked for it: `cb-visually-hidden` was being written in
|
|
935
|
+
markup with no rule behind it, so the text it hides was simply visible. */
|
|
936
|
+
.cb-visually-hidden:not(:focus):not(:active) {
|
|
937
|
+
position: absolute;
|
|
938
|
+
width: 1px;
|
|
939
|
+
height: 1px;
|
|
940
|
+
margin: -1px;
|
|
941
|
+
padding: 0;
|
|
942
|
+
overflow: hidden;
|
|
943
|
+
clip-path: inset(50%);
|
|
944
|
+
white-space: nowrap;
|
|
945
|
+
border: 0;
|
|
946
|
+
}
|
|
947
|
+
|
|
933
948
|
/* foundation/page-container/page-container.css */
|
|
934
949
|
.cb-page-container { display: flex; flex-direction: column; gap: var(--cb-space-4); padding-block: var(--cb-space-5); color: var(--cb-fg); font-family: var(--cb-font-sans); }
|
|
935
950
|
.cb-page-container__breadcrumb { color: var(--cb-fg-muted); font-size: var(--cb-text-sm); }
|
|
@@ -1360,6 +1375,370 @@ svg.react-flow__connectionline {
|
|
|
1360
1375
|
line-height: var(--cb-leading-normal);
|
|
1361
1376
|
}
|
|
1362
1377
|
|
|
1378
|
+
/* data/balance-curve/balance-curve.css */
|
|
1379
|
+
.cb-balance-curve {
|
|
1380
|
+
display: flex;
|
|
1381
|
+
flex-direction: column;
|
|
1382
|
+
gap: var(--cb-space-2);
|
|
1383
|
+
margin: 0;
|
|
1384
|
+
font-family: var(--cb-font-sans);
|
|
1385
|
+
color: var(--cb-fg);
|
|
1386
|
+
}
|
|
1387
|
+
|
|
1388
|
+
.cb-balance-curve__head {
|
|
1389
|
+
display: flex;
|
|
1390
|
+
flex-wrap: wrap;
|
|
1391
|
+
align-items: baseline;
|
|
1392
|
+
justify-content: space-between;
|
|
1393
|
+
gap: var(--cb-space-2);
|
|
1394
|
+
}
|
|
1395
|
+
|
|
1396
|
+
.cb-balance-curve__label {
|
|
1397
|
+
font-size: var(--cb-text-md);
|
|
1398
|
+
font-weight: 600;
|
|
1399
|
+
}
|
|
1400
|
+
|
|
1401
|
+
.cb-balance-curve__threshold {
|
|
1402
|
+
font-size: var(--cb-text-xs);
|
|
1403
|
+
color: var(--cb-fg-muted);
|
|
1404
|
+
}
|
|
1405
|
+
|
|
1406
|
+
.cb-balance-curve__reading {
|
|
1407
|
+
margin: 0;
|
|
1408
|
+
font-size: var(--cb-text-sm);
|
|
1409
|
+
font-variant-numeric: tabular-nums;
|
|
1410
|
+
color: var(--cb-fg-muted);
|
|
1411
|
+
}
|
|
1412
|
+
|
|
1413
|
+
/* The one place a balance chart spends colour weight: the sentence that says it goes under. The plot
|
|
1414
|
+
already carries the same meaning in its shading, so this is reinforcement, not the only signal. */
|
|
1415
|
+
.cb-balance-curve__reading[data-state="below"] {
|
|
1416
|
+
color: var(--cb-tone-danger);
|
|
1417
|
+
font-weight: 600;
|
|
1418
|
+
}
|
|
1419
|
+
|
|
1420
|
+
.cb-balance-curve__reading[data-state="clear"] { color: var(--cb-tone-success); }
|
|
1421
|
+
|
|
1422
|
+
/* data/board/board.css */
|
|
1423
|
+
/* Board — columns of cards a person moves by pointer or by keyboard.
|
|
1424
|
+
Every value is a Token. The drag lift, the gap animation and the drop marker all have a
|
|
1425
|
+
reduced-motion rendering: transform drops, the marker stays, so a move is never invisible. */
|
|
1426
|
+
|
|
1427
|
+
.cb-board {
|
|
1428
|
+
display: flex;
|
|
1429
|
+
flex-direction: column;
|
|
1430
|
+
gap: var(--cb-space-3);
|
|
1431
|
+
font-family: var(--cb-font-sans);
|
|
1432
|
+
}
|
|
1433
|
+
|
|
1434
|
+
.cb-board__surface {
|
|
1435
|
+
display: flex;
|
|
1436
|
+
align-items: flex-start;
|
|
1437
|
+
gap: var(--cb-space-3);
|
|
1438
|
+
overflow-x: auto;
|
|
1439
|
+
padding-bottom: var(--cb-space-2);
|
|
1440
|
+
}
|
|
1441
|
+
|
|
1442
|
+
.cb-board__surface[data-lanes] {
|
|
1443
|
+
overflow-x: visible;
|
|
1444
|
+
}
|
|
1445
|
+
|
|
1446
|
+
/* ── column ── */
|
|
1447
|
+
|
|
1448
|
+
.cb-board__column {
|
|
1449
|
+
flex: 0 0 auto;
|
|
1450
|
+
inline-size: 17rem;
|
|
1451
|
+
max-inline-size: 100%;
|
|
1452
|
+
display: flex;
|
|
1453
|
+
flex-direction: column;
|
|
1454
|
+
gap: var(--cb-space-2);
|
|
1455
|
+
padding: var(--cb-space-3);
|
|
1456
|
+
border: var(--cb-border-width) solid var(--cb-border);
|
|
1457
|
+
border-radius: var(--cb-radius-lg);
|
|
1458
|
+
background: var(--cb-bg-subtle);
|
|
1459
|
+
}
|
|
1460
|
+
|
|
1461
|
+
.cb-board__surface[data-lanes] .cb-board__column {
|
|
1462
|
+
flex: 1 1 auto;
|
|
1463
|
+
inline-size: 100%;
|
|
1464
|
+
}
|
|
1465
|
+
|
|
1466
|
+
/* The column a pointer is over: named by a ring rather than a fill, so a tinted card keeps its tone. */
|
|
1467
|
+
.cb-board__column[data-over] {
|
|
1468
|
+
border-color: var(--cb-tone-brand);
|
|
1469
|
+
background: color-mix(in oklch, var(--cb-tone-brand) 8%, var(--cb-bg-subtle));
|
|
1470
|
+
}
|
|
1471
|
+
|
|
1472
|
+
/* A column that takes no cards says so before a drop is attempted. */
|
|
1473
|
+
.cb-board__column[data-refuses] {
|
|
1474
|
+
background: var(--cb-bg);
|
|
1475
|
+
border-style: dashed;
|
|
1476
|
+
}
|
|
1477
|
+
|
|
1478
|
+
.cb-board__head {
|
|
1479
|
+
display: flex;
|
|
1480
|
+
align-items: center;
|
|
1481
|
+
justify-content: space-between;
|
|
1482
|
+
gap: var(--cb-space-2);
|
|
1483
|
+
}
|
|
1484
|
+
|
|
1485
|
+
.cb-board__name {
|
|
1486
|
+
font-size: var(--cb-text-sm);
|
|
1487
|
+
font-weight: 600;
|
|
1488
|
+
color: var(--cb-fg);
|
|
1489
|
+
}
|
|
1490
|
+
|
|
1491
|
+
.cb-board__count {
|
|
1492
|
+
font-size: var(--cb-text-xs);
|
|
1493
|
+
color: var(--cb-fg-muted);
|
|
1494
|
+
padding: 0 var(--cb-space-2);
|
|
1495
|
+
border-radius: var(--cb-radius-full);
|
|
1496
|
+
background: var(--cb-bg);
|
|
1497
|
+
border: var(--cb-border-width) solid var(--cb-border);
|
|
1498
|
+
}
|
|
1499
|
+
|
|
1500
|
+
/* Over a WIP limit is marked, never blocked — the board reports, the consumer decides. */
|
|
1501
|
+
.cb-board__count[data-over-limit] {
|
|
1502
|
+
color: var(--cb-tone-warning);
|
|
1503
|
+
border-color: var(--cb-tone-warning);
|
|
1504
|
+
}
|
|
1505
|
+
|
|
1506
|
+
.cb-board__over,
|
|
1507
|
+
.cb-board__refusal {
|
|
1508
|
+
margin: 0;
|
|
1509
|
+
font-size: var(--cb-text-xs);
|
|
1510
|
+
color: var(--cb-fg-muted);
|
|
1511
|
+
}
|
|
1512
|
+
|
|
1513
|
+
.cb-board__over { color: var(--cb-tone-warning); }
|
|
1514
|
+
|
|
1515
|
+
/* ── cards ── */
|
|
1516
|
+
|
|
1517
|
+
.cb-board__list {
|
|
1518
|
+
list-style: none;
|
|
1519
|
+
margin: 0;
|
|
1520
|
+
padding: 0;
|
|
1521
|
+
display: flex;
|
|
1522
|
+
flex-direction: column;
|
|
1523
|
+
gap: var(--cb-space-2);
|
|
1524
|
+
min-block-size: var(--cb-space-8);
|
|
1525
|
+
}
|
|
1526
|
+
|
|
1527
|
+
.cb-board__card {
|
|
1528
|
+
display: flex;
|
|
1529
|
+
flex-direction: column;
|
|
1530
|
+
gap: var(--cb-space-1);
|
|
1531
|
+
padding: var(--cb-space-3);
|
|
1532
|
+
border: var(--cb-border-width) solid var(--cb-border);
|
|
1533
|
+
border-radius: var(--cb-radius-md);
|
|
1534
|
+
background: var(--cb-bg);
|
|
1535
|
+
box-shadow: var(--cb-shadow-sm);
|
|
1536
|
+
cursor: grab;
|
|
1537
|
+
transition: box-shadow var(--cb-duration-fast) var(--cb-ease-standard),
|
|
1538
|
+
transform var(--cb-duration-base) var(--cb-ease-standard);
|
|
1539
|
+
}
|
|
1540
|
+
|
|
1541
|
+
.cb-board__card:hover {
|
|
1542
|
+
box-shadow: var(--cb-shadow-md);
|
|
1543
|
+
}
|
|
1544
|
+
|
|
1545
|
+
.cb-board__card:focus-visible {
|
|
1546
|
+
outline: var(--cb-focus-width) solid var(--cb-tone-brand);
|
|
1547
|
+
outline-offset: var(--cb-focus-offset);
|
|
1548
|
+
}
|
|
1549
|
+
|
|
1550
|
+
/* Held by the keyboard: the same lift a pointer drag gives, so both paths look alike. */
|
|
1551
|
+
.cb-board__card[data-held] {
|
|
1552
|
+
box-shadow: var(--cb-shadow-lg);
|
|
1553
|
+
border-color: var(--cb-tone-brand);
|
|
1554
|
+
}
|
|
1555
|
+
|
|
1556
|
+
.cb-board__card[data-dragging] {
|
|
1557
|
+
opacity: 0.4;
|
|
1558
|
+
}
|
|
1559
|
+
|
|
1560
|
+
.cb-board__card[data-disabled] {
|
|
1561
|
+
cursor: not-allowed;
|
|
1562
|
+
color: var(--cb-fg-muted);
|
|
1563
|
+
background: var(--cb-bg-subtle);
|
|
1564
|
+
box-shadow: var(--cb-shadow-none);
|
|
1565
|
+
}
|
|
1566
|
+
|
|
1567
|
+
/* What follows the pointer. It is out of flow, so it carries the lift on its own. */
|
|
1568
|
+
.cb-board__card--lift {
|
|
1569
|
+
cursor: grabbing;
|
|
1570
|
+
box-shadow: var(--cb-shadow-lg);
|
|
1571
|
+
transform: rotate(1.5deg);
|
|
1572
|
+
}
|
|
1573
|
+
|
|
1574
|
+
.cb-board__title {
|
|
1575
|
+
font-size: var(--cb-text-sm);
|
|
1576
|
+
color: var(--cb-fg);
|
|
1577
|
+
line-height: var(--cb-leading-tight);
|
|
1578
|
+
/* A long title clamps rather than stretching its own card and the cards beside it. The full name
|
|
1579
|
+
belongs in a tooltip the consumer supplies around the title. */
|
|
1580
|
+
display: -webkit-box;
|
|
1581
|
+
-webkit-box-orient: vertical;
|
|
1582
|
+
-webkit-line-clamp: 2;
|
|
1583
|
+
overflow: hidden;
|
|
1584
|
+
}
|
|
1585
|
+
|
|
1586
|
+
.cb-board__meta {
|
|
1587
|
+
font-size: var(--cb-text-xs);
|
|
1588
|
+
color: var(--cb-fg-muted);
|
|
1589
|
+
}
|
|
1590
|
+
|
|
1591
|
+
/* Where the held card would land. It is the one affordance that must survive reduced motion. */
|
|
1592
|
+
.cb-board__marker {
|
|
1593
|
+
block-size: var(--cb-space-1);
|
|
1594
|
+
border-radius: var(--cb-radius-full);
|
|
1595
|
+
background: var(--cb-tone-brand);
|
|
1596
|
+
list-style: none;
|
|
1597
|
+
}
|
|
1598
|
+
|
|
1599
|
+
.cb-board__empty {
|
|
1600
|
+
padding: var(--cb-space-4) var(--cb-space-3);
|
|
1601
|
+
border: var(--cb-border-width) dashed var(--cb-border-strong);
|
|
1602
|
+
border-radius: var(--cb-radius-md);
|
|
1603
|
+
text-align: center;
|
|
1604
|
+
font-size: var(--cb-text-xs);
|
|
1605
|
+
color: var(--cb-fg-muted);
|
|
1606
|
+
}
|
|
1607
|
+
|
|
1608
|
+
/* ── lanes: the phone rendering, chosen rather than a squeezed board ── */
|
|
1609
|
+
|
|
1610
|
+
.cb-board__lanes {
|
|
1611
|
+
display: flex;
|
|
1612
|
+
gap: var(--cb-space-1);
|
|
1613
|
+
overflow-x: auto;
|
|
1614
|
+
}
|
|
1615
|
+
|
|
1616
|
+
.cb-board__lane {
|
|
1617
|
+
display: inline-flex;
|
|
1618
|
+
align-items: center;
|
|
1619
|
+
gap: var(--cb-space-2);
|
|
1620
|
+
min-block-size: var(--cb-control-floor);
|
|
1621
|
+
padding: 0 var(--cb-space-3);
|
|
1622
|
+
border: var(--cb-border-width) solid var(--cb-border);
|
|
1623
|
+
border-radius: var(--cb-radius-full);
|
|
1624
|
+
background: var(--cb-bg);
|
|
1625
|
+
color: var(--cb-fg-muted);
|
|
1626
|
+
font: inherit;
|
|
1627
|
+
font-size: var(--cb-text-sm);
|
|
1628
|
+
cursor: pointer;
|
|
1629
|
+
}
|
|
1630
|
+
|
|
1631
|
+
.cb-board__lane[aria-selected='true'] {
|
|
1632
|
+
background: color-mix(in oklch, var(--cb-tone-brand) 12%, var(--cb-bg));
|
|
1633
|
+
border-color: var(--cb-tone-brand);
|
|
1634
|
+
color: var(--cb-fg);
|
|
1635
|
+
}
|
|
1636
|
+
|
|
1637
|
+
.cb-board__lane:focus-visible {
|
|
1638
|
+
outline: var(--cb-focus-width) solid var(--cb-tone-brand);
|
|
1639
|
+
outline-offset: var(--cb-focus-offset);
|
|
1640
|
+
}
|
|
1641
|
+
|
|
1642
|
+
/* ── undo ── */
|
|
1643
|
+
|
|
1644
|
+
.cb-board__undo button {
|
|
1645
|
+
min-block-size: var(--cb-control-floor);
|
|
1646
|
+
padding: 0 var(--cb-space-3);
|
|
1647
|
+
border: var(--cb-border-width) solid var(--cb-border);
|
|
1648
|
+
border-radius: var(--cb-radius-md);
|
|
1649
|
+
background: var(--cb-bg);
|
|
1650
|
+
color: var(--cb-fg-link);
|
|
1651
|
+
font: inherit;
|
|
1652
|
+
font-size: var(--cb-text-sm);
|
|
1653
|
+
cursor: pointer;
|
|
1654
|
+
}
|
|
1655
|
+
|
|
1656
|
+
.cb-board__undo button:focus-visible {
|
|
1657
|
+
outline: var(--cb-focus-width) solid var(--cb-tone-brand);
|
|
1658
|
+
outline-offset: var(--cb-focus-offset);
|
|
1659
|
+
}
|
|
1660
|
+
|
|
1661
|
+
/* The announcement is for a screen reader, not the page. */
|
|
1662
|
+
.cb-board__live {
|
|
1663
|
+
position: absolute;
|
|
1664
|
+
inline-size: 1px;
|
|
1665
|
+
block-size: 1px;
|
|
1666
|
+
margin: -1px;
|
|
1667
|
+
padding: 0;
|
|
1668
|
+
overflow: hidden;
|
|
1669
|
+
clip-path: inset(50%);
|
|
1670
|
+
white-space: nowrap;
|
|
1671
|
+
}
|
|
1672
|
+
|
|
1673
|
+
/* ── skeleton ── */
|
|
1674
|
+
|
|
1675
|
+
.cb-board__ghost,
|
|
1676
|
+
.cb-board__ghost-card {
|
|
1677
|
+
border-radius: var(--cb-radius-md);
|
|
1678
|
+
background: color-mix(in oklch, var(--cb-fg-subtle) 18%, transparent);
|
|
1679
|
+
}
|
|
1680
|
+
|
|
1681
|
+
.cb-board__ghost--name { inline-size: var(--cb-space-8); block-size: var(--cb-space-3); }
|
|
1682
|
+
.cb-board__ghost--count { inline-size: var(--cb-space-4); block-size: var(--cb-space-3); }
|
|
1683
|
+
.cb-board__ghost-card { block-size: var(--cb-space-8); border: 0; box-shadow: var(--cb-shadow-none); }
|
|
1684
|
+
|
|
1685
|
+
/* ── renderings that are not decoration ── */
|
|
1686
|
+
|
|
1687
|
+
@media (prefers-reduced-motion: reduce) {
|
|
1688
|
+
.cb-board__card { transition: none; }
|
|
1689
|
+
/* The lift's tilt is decoration; the shadow that says "this one is moving" stays. */
|
|
1690
|
+
.cb-board__card--lift { transform: none; }
|
|
1691
|
+
}
|
|
1692
|
+
|
|
1693
|
+
.cb-board[data-motion='off'] .cb-board__card { transition: none; }
|
|
1694
|
+
.cb-board[data-motion='off'] .cb-board__card--lift { transform: none; }
|
|
1695
|
+
|
|
1696
|
+
@media (forced-colors: active) {
|
|
1697
|
+
.cb-board__column,
|
|
1698
|
+
.cb-board__card { border-color: CanvasText; }
|
|
1699
|
+
.cb-board__marker { background: Highlight; }
|
|
1700
|
+
.cb-board__card[data-held] { outline: var(--cb-focus-width) solid Highlight; }
|
|
1701
|
+
}
|
|
1702
|
+
|
|
1703
|
+
/* A card that carries its own buttons puts the grab on a handle instead of the card. A card that is
|
|
1704
|
+
itself a control has presentational children, so anything interactive inside it leaves the
|
|
1705
|
+
accessibility tree — the handle is what keeps those buttons reachable. */
|
|
1706
|
+
.cb-board__card[data-handle] {
|
|
1707
|
+
cursor: default;
|
|
1708
|
+
display: grid;
|
|
1709
|
+
grid-template-columns: auto 1fr;
|
|
1710
|
+
grid-template-areas: 'handle title' '. meta';
|
|
1711
|
+
column-gap: var(--cb-space-2);
|
|
1712
|
+
align-items: start;
|
|
1713
|
+
}
|
|
1714
|
+
|
|
1715
|
+
.cb-board__card[data-handle] .cb-board__title { grid-area: title; }
|
|
1716
|
+
.cb-board__card[data-handle] .cb-board__meta { grid-area: meta; }
|
|
1717
|
+
|
|
1718
|
+
.cb-board__handle {
|
|
1719
|
+
grid-area: handle;
|
|
1720
|
+
display: inline-flex;
|
|
1721
|
+
align-items: center;
|
|
1722
|
+
justify-content: center;
|
|
1723
|
+
min-inline-size: var(--cb-space-5);
|
|
1724
|
+
min-block-size: var(--cb-space-5);
|
|
1725
|
+
padding: 0;
|
|
1726
|
+
border: 0;
|
|
1727
|
+
border-radius: var(--cb-radius-sm);
|
|
1728
|
+
background: transparent;
|
|
1729
|
+
color: var(--cb-fg-subtle);
|
|
1730
|
+
font: inherit;
|
|
1731
|
+
line-height: var(--cb-leading-tight);
|
|
1732
|
+
cursor: grab;
|
|
1733
|
+
}
|
|
1734
|
+
|
|
1735
|
+
.cb-board__handle:focus-visible {
|
|
1736
|
+
outline: var(--cb-focus-width) solid var(--cb-tone-brand);
|
|
1737
|
+
outline-offset: var(--cb-focus-offset);
|
|
1738
|
+
}
|
|
1739
|
+
|
|
1740
|
+
.cb-board__handle:disabled { cursor: not-allowed; }
|
|
1741
|
+
|
|
1363
1742
|
/* data/diagram/diagram.css */
|
|
1364
1743
|
/* Diagram and DiagramEditor run on React Flow. Its base stylesheet (bundled before this file) owns layout and
|
|
1365
1744
|
reads its colours from `--xy-*` custom properties; here those are pointed at Tokens, and the node React
|
|
@@ -1821,6 +2200,50 @@ svg.react-flow__connectionline {
|
|
|
1821
2200
|
.cb-pan-zoom-canvas__toolbar { border-color: CanvasText; }
|
|
1822
2201
|
}
|
|
1823
2202
|
|
|
2203
|
+
/* data/progress-curve/progress-curve.css */
|
|
2204
|
+
.cb-progress-curve {
|
|
2205
|
+
display: flex;
|
|
2206
|
+
flex-direction: column;
|
|
2207
|
+
gap: var(--cb-space-2);
|
|
2208
|
+
margin: 0;
|
|
2209
|
+
font-family: var(--cb-font-sans);
|
|
2210
|
+
color: var(--cb-fg);
|
|
2211
|
+
}
|
|
2212
|
+
|
|
2213
|
+
.cb-progress-curve__head {
|
|
2214
|
+
display: flex;
|
|
2215
|
+
flex-wrap: wrap;
|
|
2216
|
+
align-items: baseline;
|
|
2217
|
+
justify-content: space-between;
|
|
2218
|
+
gap: var(--cb-space-2);
|
|
2219
|
+
}
|
|
2220
|
+
|
|
2221
|
+
.cb-progress-curve__label {
|
|
2222
|
+
font-size: var(--cb-text-md);
|
|
2223
|
+
font-weight: 600;
|
|
2224
|
+
}
|
|
2225
|
+
|
|
2226
|
+
/* The legend marks take the colour of the series they name — the same Tokens the canvas is drawn from,
|
|
2227
|
+
so the two renderings cannot drift apart. */
|
|
2228
|
+
.cb-progress-curve .cb-chart-legend__key[data-series="planned"] { color: var(--cb-fg-subtle); }
|
|
2229
|
+
.cb-progress-curve .cb-chart-legend__key[data-series="actual"] { color: var(--cb-tone-brand); }
|
|
2230
|
+
|
|
2231
|
+
.cb-progress-curve__reading {
|
|
2232
|
+
margin: 0;
|
|
2233
|
+
font-size: var(--cb-text-sm);
|
|
2234
|
+
font-variant-numeric: tabular-nums;
|
|
2235
|
+
color: var(--cb-fg-muted);
|
|
2236
|
+
}
|
|
2237
|
+
|
|
2238
|
+
.cb-progress-curve__reading strong {
|
|
2239
|
+
font-size: var(--cb-text-xl);
|
|
2240
|
+
color: var(--cb-fg);
|
|
2241
|
+
}
|
|
2242
|
+
|
|
2243
|
+
.cb-progress-curve__reading[data-state="behind"] { color: var(--cb-tone-danger); }
|
|
2244
|
+
.cb-progress-curve__reading[data-state="ahead"] { color: var(--cb-tone-success); }
|
|
2245
|
+
.cb-progress-curve__on-day { color: var(--cb-fg-subtle); }
|
|
2246
|
+
|
|
1824
2247
|
/* data/sticker-group/sticker-group.css */
|
|
1825
2248
|
.cb-sticker-group {
|
|
1826
2249
|
display: flex;
|
|
@@ -1910,6 +2333,138 @@ svg.react-flow__connectionline {
|
|
|
1910
2333
|
}
|
|
1911
2334
|
}
|
|
1912
2335
|
|
|
2336
|
+
/* data/time-series/time-series.css */
|
|
2337
|
+
.cb-chart {
|
|
2338
|
+
display: flex;
|
|
2339
|
+
flex-direction: column;
|
|
2340
|
+
gap: var(--cb-space-2);
|
|
2341
|
+
font-family: var(--cb-font-sans);
|
|
2342
|
+
color: var(--cb-fg);
|
|
2343
|
+
}
|
|
2344
|
+
|
|
2345
|
+
.cb-chart__canvas {
|
|
2346
|
+
inline-size: 100%;
|
|
2347
|
+
border-radius: var(--cb-radius-md);
|
|
2348
|
+
overflow: hidden;
|
|
2349
|
+
}
|
|
2350
|
+
|
|
2351
|
+
.cb-chart__empty {
|
|
2352
|
+
display: grid;
|
|
2353
|
+
place-items: center;
|
|
2354
|
+
margin: 0;
|
|
2355
|
+
padding: var(--cb-space-4);
|
|
2356
|
+
border: var(--cb-border-width) dashed var(--cb-border);
|
|
2357
|
+
border-radius: var(--cb-radius-md);
|
|
2358
|
+
color: var(--cb-fg-muted);
|
|
2359
|
+
font-size: var(--cb-text-sm);
|
|
2360
|
+
}
|
|
2361
|
+
|
|
2362
|
+
/* The chart's other rendering. Hidden from sight, never from the accessibility tree: a canvas gives a
|
|
2363
|
+
screen reader nothing at all, so this table is the chart as far as one is concerned.
|
|
2364
|
+
|
|
2365
|
+
The geometry is on the wrapper rather than on the table, because a table cannot be shrunk: it
|
|
2366
|
+
refuses to go under its content's width and height whatever is asked of it, so these rules on the
|
|
2367
|
+
table itself left an invisible box the size of the data lying across the plot. */
|
|
2368
|
+
.cb-chart__rows {
|
|
2369
|
+
position: absolute;
|
|
2370
|
+
inline-size: 1px;
|
|
2371
|
+
block-size: 1px;
|
|
2372
|
+
margin: -1px;
|
|
2373
|
+
padding: 0;
|
|
2374
|
+
overflow: hidden;
|
|
2375
|
+
clip-path: inset(50%);
|
|
2376
|
+
white-space: nowrap;
|
|
2377
|
+
border: 0;
|
|
2378
|
+
}
|
|
2379
|
+
|
|
2380
|
+
/* Forced colors: the canvas is replaced by the table rather than sitting there as a bitmap the system
|
|
2381
|
+
cannot recolour. The component stops rendering the canvas at all in this mode, so this rule only has
|
|
2382
|
+
to bring the table back into view. */
|
|
2383
|
+
@media (forced-colors: active) {
|
|
2384
|
+
.cb-chart__rows {
|
|
2385
|
+
position: static;
|
|
2386
|
+
inline-size: 100%;
|
|
2387
|
+
block-size: auto;
|
|
2388
|
+
margin: 0;
|
|
2389
|
+
overflow: visible;
|
|
2390
|
+
clip-path: none;
|
|
2391
|
+
white-space: normal;
|
|
2392
|
+
}
|
|
2393
|
+
|
|
2394
|
+
.cb-chart__table {
|
|
2395
|
+
inline-size: 100%;
|
|
2396
|
+
border-collapse: collapse;
|
|
2397
|
+
font-size: var(--cb-text-sm);
|
|
2398
|
+
font-variant-numeric: tabular-nums;
|
|
2399
|
+
}
|
|
2400
|
+
|
|
2401
|
+
.cb-chart__table caption {
|
|
2402
|
+
text-align: start;
|
|
2403
|
+
padding-block-end: var(--cb-space-1);
|
|
2404
|
+
}
|
|
2405
|
+
|
|
2406
|
+
.cb-chart__table th,
|
|
2407
|
+
.cb-chart__table td {
|
|
2408
|
+
border: var(--cb-border-width) solid;
|
|
2409
|
+
padding: var(--cb-space-1) var(--cb-space-2);
|
|
2410
|
+
text-align: end;
|
|
2411
|
+
}
|
|
2412
|
+
|
|
2413
|
+
.cb-chart__table th[scope="row"],
|
|
2414
|
+
.cb-chart__table th[scope="col"]:first-child {
|
|
2415
|
+
text-align: start;
|
|
2416
|
+
}
|
|
2417
|
+
|
|
2418
|
+
.cb-chart__table tr[data-marked] { font-weight: 700; }
|
|
2419
|
+
}
|
|
2420
|
+
|
|
2421
|
+
.cb-chart--skeleton { gap: var(--cb-space-2); }
|
|
2422
|
+
|
|
2423
|
+
.cb-chart__skeleton-head,
|
|
2424
|
+
.cb-chart__skeleton-plot {
|
|
2425
|
+
display: block;
|
|
2426
|
+
background: var(--cb-bg-subtle);
|
|
2427
|
+
border-radius: var(--cb-radius-sm);
|
|
2428
|
+
}
|
|
2429
|
+
|
|
2430
|
+
.cb-chart__skeleton-head {
|
|
2431
|
+
block-size: var(--cb-text-md);
|
|
2432
|
+
inline-size: calc(var(--cb-space-8) * 3);
|
|
2433
|
+
}
|
|
2434
|
+
|
|
2435
|
+
.cb-chart__skeleton-plot { border-radius: var(--cb-radius-md); }
|
|
2436
|
+
|
|
2437
|
+
/* A legend mark carries the same treatment as the line it names: a reference is thin and dashed, the
|
|
2438
|
+
primary series solid and thick. Colour is never the only difference — dash versus solid survives a
|
|
2439
|
+
monochrome print and every kind of colour blindness. */
|
|
2440
|
+
.cb-chart-legend {
|
|
2441
|
+
display: flex;
|
|
2442
|
+
flex-wrap: wrap;
|
|
2443
|
+
gap: var(--cb-space-3);
|
|
2444
|
+
font-size: var(--cb-text-xs);
|
|
2445
|
+
color: var(--cb-fg-muted);
|
|
2446
|
+
}
|
|
2447
|
+
|
|
2448
|
+
.cb-chart-legend__key {
|
|
2449
|
+
display: inline-flex;
|
|
2450
|
+
align-items: center;
|
|
2451
|
+
gap: var(--cb-space-1);
|
|
2452
|
+
}
|
|
2453
|
+
|
|
2454
|
+
.cb-chart-legend__key::before {
|
|
2455
|
+
content: '';
|
|
2456
|
+
inline-size: var(--cb-space-4);
|
|
2457
|
+
block-size: 0;
|
|
2458
|
+
border-block-start-width: var(--cb-border-width);
|
|
2459
|
+
border-block-start-style: solid;
|
|
2460
|
+
border-color: currentColor;
|
|
2461
|
+
}
|
|
2462
|
+
|
|
2463
|
+
.cb-chart-legend__key[data-emphasis="reference"]::before { border-block-start-style: dashed; }
|
|
2464
|
+
.cb-chart-legend__key[data-emphasis="primary"]::before {
|
|
2465
|
+
border-block-start-width: calc(var(--cb-border-width) * 2);
|
|
2466
|
+
}
|
|
2467
|
+
|
|
1913
2468
|
/* nav/nav.css */
|
|
1914
2469
|
.cb-menu-positioner {
|
|
1915
2470
|
position: absolute;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ceebee/ui",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.10.0",
|
|
4
4
|
"description": "Ceebee's design system: tokens, themed primitives, motion, and onboarding.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -55,9 +55,13 @@
|
|
|
55
55
|
},
|
|
56
56
|
"dependencies": {
|
|
57
57
|
"@ant-design/cssinjs": "2.1.2",
|
|
58
|
+
"@dnd-kit/core": "6.3.1",
|
|
59
|
+
"@dnd-kit/sortable": "10.0.0",
|
|
60
|
+
"@dnd-kit/utilities": "3.2.2",
|
|
58
61
|
"@xyflow/react": "12.11.6",
|
|
59
62
|
"antd": "6.6.1",
|
|
60
|
-
"dayjs": "1.11.18"
|
|
63
|
+
"dayjs": "1.11.18",
|
|
64
|
+
"lightweight-charts": "5.2.1"
|
|
61
65
|
},
|
|
62
66
|
"scripts": {
|
|
63
67
|
"build": "tsup && node ./stamp-client.mjs && node ./build-css.mjs",
|