@syscore/ui-library 1.25.0 → 2.0.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.
Files changed (30) hide show
  1. package/client/components/ui/app-bar.tsx +299 -0
  2. package/client/components/ui/banner.tsx +108 -0
  3. package/client/components/ui/bottom-navigation.tsx +223 -0
  4. package/client/components/ui/card.tsx +108 -26
  5. package/client/components/ui/date-picker.tsx +188 -0
  6. package/client/components/ui/empty-state.tsx +197 -0
  7. package/client/components/ui/file-upload.tsx +214 -0
  8. package/client/components/ui/footer.tsx +179 -0
  9. package/client/components/ui/layout.tsx +381 -0
  10. package/client/components/ui/sidebar.tsx +11 -5
  11. package/client/components/ui/stepper.tsx +148 -0
  12. package/client/components/ui/system-bar.tsx +119 -0
  13. package/client/components/ui/timeline.tsx +181 -0
  14. package/client/global.css +2304 -41
  15. package/client/ui/AppBar/app-bar.stories.tsx +280 -0
  16. package/client/ui/Banner/banner.stories.tsx +238 -0
  17. package/client/ui/BottomNavigation/bottom-navigation.stories.tsx +285 -0
  18. package/client/ui/Card.stories.tsx +285 -168
  19. package/client/ui/DatePicker/DatePicker.stories.tsx +293 -0
  20. package/client/ui/EmptyState/empty-state.stories.tsx +251 -0
  21. package/client/ui/FileUpload/FileUpload.stories.tsx +218 -0
  22. package/client/ui/Footer/footer.stories.tsx +194 -0
  23. package/client/ui/Layout.stories.tsx +1481 -0
  24. package/client/ui/Stepper/Stepper.stories.tsx +344 -0
  25. package/client/ui/SystemBar/system-bar.stories.tsx +179 -0
  26. package/client/ui/Timeline/timeline.stories.tsx +404 -0
  27. package/dist/index.cjs.js +1 -1
  28. package/dist/index.d.ts +219 -0
  29. package/dist/index.es.js +1504 -99
  30. package/package.json +1 -1
package/client/global.css CHANGED
@@ -1311,21 +1311,319 @@ body {
1311
1311
  }
1312
1312
  }
1313
1313
 
1314
+ /* ============================================================
1315
+ Layout Primitives — Stack, Grid, Container, Section
1316
+ ============================================================ */
1317
+
1318
+ /* Stack */
1319
+ .stack {
1320
+ display: flex;
1321
+ flex-direction: column;
1322
+ }
1323
+
1324
+ .stack--horizontal {
1325
+ flex-direction: row;
1326
+ }
1327
+
1328
+ .stack--wrap {
1329
+ flex-wrap: wrap;
1330
+ }
1331
+
1332
+ .stack--align-start { align-items: flex-start; }
1333
+ .stack--align-center { align-items: center; }
1334
+ .stack--align-end { align-items: flex-end; }
1335
+ .stack--align-stretch { align-items: stretch; }
1336
+ .stack--align-baseline { align-items: baseline; }
1337
+
1338
+ .stack--justify-start { justify-content: flex-start; }
1339
+ .stack--justify-center { justify-content: center; }
1340
+ .stack--justify-end { justify-content: flex-end; }
1341
+ .stack--justify-between { justify-content: space-between; }
1342
+ .stack--justify-around { justify-content: space-around; }
1343
+ .stack--justify-evenly { justify-content: space-evenly; }
1344
+
1345
+ /* Grid */
1346
+ .grid-layout {
1347
+ display: grid;
1348
+ }
1349
+
1350
+ .grid-layout--cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); }
1351
+ .grid-layout--cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
1352
+ .grid-layout--cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
1353
+ .grid-layout--cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
1354
+ .grid-layout--cols-6 { grid-template-columns: repeat(6, minmax(0, 1fr)); }
1355
+ .grid-layout--cols-12 { grid-template-columns: repeat(12, minmax(0, 1fr)); }
1356
+
1357
+ @media (min-width: 640px) {
1358
+ .grid-layout--sm-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); }
1359
+ .grid-layout--sm-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
1360
+ .grid-layout--sm-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
1361
+ .grid-layout--sm-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
1362
+ .grid-layout--sm-cols-6 { grid-template-columns: repeat(6, minmax(0, 1fr)); }
1363
+ .grid-layout--sm-cols-12 { grid-template-columns: repeat(12, minmax(0, 1fr)); }
1364
+ }
1365
+
1366
+ @media (min-width: 768px) {
1367
+ .grid-layout--md-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); }
1368
+ .grid-layout--md-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
1369
+ .grid-layout--md-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
1370
+ .grid-layout--md-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
1371
+ .grid-layout--md-cols-6 { grid-template-columns: repeat(6, minmax(0, 1fr)); }
1372
+ .grid-layout--md-cols-12 { grid-template-columns: repeat(12, minmax(0, 1fr)); }
1373
+ }
1374
+
1375
+ @media (min-width: 1024px) {
1376
+ .grid-layout--lg-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); }
1377
+ .grid-layout--lg-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
1378
+ .grid-layout--lg-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
1379
+ .grid-layout--lg-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
1380
+ .grid-layout--lg-cols-6 { grid-template-columns: repeat(6, minmax(0, 1fr)); }
1381
+ .grid-layout--lg-cols-12 { grid-template-columns: repeat(12, minmax(0, 1fr)); }
1382
+ }
1383
+
1384
+ /* Container */
1385
+ .container-layout {
1386
+ width: 100%;
1387
+ }
1388
+
1389
+ .container-layout--center {
1390
+ margin-left: auto;
1391
+ margin-right: auto;
1392
+ }
1393
+
1394
+ .container-layout--padded {
1395
+ padding-left: 1rem;
1396
+ padding-right: 1rem;
1397
+ }
1398
+
1399
+ @media (min-width: 640px) {
1400
+ .container-layout--padded {
1401
+ padding-left: 1.5rem;
1402
+ padding-right: 1.5rem;
1403
+ }
1404
+ }
1405
+
1406
+ @media (min-width: 1024px) {
1407
+ .container-layout--padded {
1408
+ padding-left: 2rem;
1409
+ padding-right: 2rem;
1410
+ }
1411
+ }
1412
+
1413
+ .container-layout--sm { max-width: 640px; }
1414
+ .container-layout--md { max-width: 768px; }
1415
+ .container-layout--lg { max-width: 1024px; }
1416
+ .container-layout--xl { max-width: 1280px; }
1417
+ .container-layout--2xl { max-width: 1536px; }
1418
+ .container-layout--full { max-width: 100%; }
1419
+
1420
+ /* Section */
1421
+ .section-layout {
1422
+ width: 100%;
1423
+ }
1424
+
1425
+ .section-layout--sm { padding-top: 2rem; padding-bottom: 2rem; }
1426
+ .section-layout--md { padding-top: 3rem; padding-bottom: 3rem; }
1427
+ .section-layout--lg { padding-top: 4rem; padding-bottom: 4rem; }
1428
+ .section-layout--xl { padding-top: 6rem; padding-bottom: 6rem; }
1429
+
1430
+ @media (min-width: 768px) {
1431
+ .section-layout--sm { padding-top: 3rem; padding-bottom: 3rem; }
1432
+ .section-layout--md { padding-top: 4rem; padding-bottom: 4rem; }
1433
+ .section-layout--lg { padding-top: 6rem; padding-bottom: 6rem; }
1434
+ .section-layout--xl { padding-top: 8rem; padding-bottom: 8rem; }
1435
+ }
1436
+
1437
+ /* Columns */
1438
+ .columns-layout {
1439
+ display: grid;
1440
+ }
1441
+
1442
+ @media (max-width: 639px) {
1443
+ .columns-layout--collapse-sm { grid-template-columns: 1fr !important; }
1444
+ }
1445
+ @media (max-width: 767px) {
1446
+ .columns-layout--collapse-md { grid-template-columns: 1fr !important; }
1447
+ }
1448
+ @media (max-width: 1023px) {
1449
+ .columns-layout--collapse-lg { grid-template-columns: 1fr !important; }
1450
+ }
1451
+
1452
+ /* AppShell */
1453
+ .app-shell {
1454
+ --app-shell-header-height: 4rem;
1455
+ --app-shell-sidebar-width: 17.5rem;
1456
+ display: grid;
1457
+ min-height: 100vh;
1458
+ grid-template-rows: var(--app-shell-header-height) 1fr;
1459
+ grid-template-columns: var(--app-shell-sidebar-width) 1fr;
1460
+ grid-template-areas:
1461
+ "header header"
1462
+ "sidebar main";
1463
+ }
1464
+
1465
+ .app-shell-header {
1466
+ grid-area: header;
1467
+ position: sticky;
1468
+ top: 0;
1469
+ z-index: 40;
1470
+ background-color: hsl(var(--background));
1471
+ border-bottom: 1px solid var(--color-gray-100, #eff1f2);
1472
+ display: flex;
1473
+ align-items: center;
1474
+ padding: 0 1.5rem;
1475
+ }
1476
+
1477
+ .app-shell-sidebar {
1478
+ grid-area: sidebar;
1479
+ position: sticky;
1480
+ top: var(--app-shell-header-height);
1481
+ height: calc(100vh - var(--app-shell-header-height));
1482
+ overflow-y: auto;
1483
+ border-right: 1px solid var(--color-gray-100, #eff1f2);
1484
+ background-color: hsl(var(--background));
1485
+ }
1486
+
1487
+ .app-shell-main {
1488
+ grid-area: main;
1489
+ overflow-y: auto;
1490
+ min-height: 0;
1491
+ }
1492
+
1493
+ .app-shell-footer {
1494
+ grid-area: footer;
1495
+ border-top: 1px solid var(--color-gray-100, #eff1f2);
1496
+ }
1497
+
1498
+ /* Show / Hide — responsive visibility */
1499
+ .show-above-sm { display: none; }
1500
+ @media (min-width: 640px) { .show-above-sm { display: revert; } }
1501
+
1502
+ .show-above-md { display: none; }
1503
+ @media (min-width: 768px) { .show-above-md { display: revert; } }
1504
+
1505
+ .show-above-lg { display: none; }
1506
+ @media (min-width: 1024px) { .show-above-lg { display: revert; } }
1507
+
1508
+ .show-above-xl { display: none; }
1509
+ @media (min-width: 1280px) { .show-above-xl { display: revert; } }
1510
+
1511
+ .show-below-sm { display: revert; }
1512
+ @media (min-width: 640px) { .show-below-sm { display: none; } }
1513
+
1514
+ .show-below-md { display: revert; }
1515
+ @media (min-width: 768px) { .show-below-md { display: none; } }
1516
+
1517
+ .show-below-lg { display: revert; }
1518
+ @media (min-width: 1024px) { .show-below-lg { display: none; } }
1519
+
1520
+ .show-below-xl { display: revert; }
1521
+ @media (min-width: 1280px) { .show-below-xl { display: none; } }
1522
+
1523
+ .hide-above-sm { display: revert; }
1524
+ @media (min-width: 640px) { .hide-above-sm { display: none; } }
1525
+
1526
+ .hide-above-md { display: revert; }
1527
+ @media (min-width: 768px) { .hide-above-md { display: none; } }
1528
+
1529
+ .hide-above-lg { display: revert; }
1530
+ @media (min-width: 1024px) { .hide-above-lg { display: none; } }
1531
+
1532
+ .hide-above-xl { display: revert; }
1533
+ @media (min-width: 1280px) { .hide-above-xl { display: none; } }
1534
+
1535
+ .hide-below-sm { display: none; }
1536
+ @media (min-width: 640px) { .hide-below-sm { display: revert; } }
1537
+
1538
+ .hide-below-md { display: none; }
1539
+ @media (min-width: 768px) { .hide-below-md { display: revert; } }
1540
+
1541
+ .hide-below-lg { display: none; }
1542
+ @media (min-width: 1024px) { .hide-below-lg { display: revert; } }
1543
+
1544
+ .hide-below-xl { display: none; }
1545
+ @media (min-width: 1280px) { .hide-below-xl { display: revert; } }
1546
+
1547
+ /* Positioned */
1548
+ .positioned--relative { position: relative; }
1549
+ .positioned--absolute { position: absolute; }
1550
+ .positioned--fixed { position: fixed; }
1551
+ .positioned--sticky { position: sticky; }
1552
+
1553
+ /* ============================================================ */
1554
+
1314
1555
  /* Card Styles */
1315
1556
  .card {
1316
1557
  border-radius: var(--radius-lg, 12px);
1317
- border: 1px solid var(--color-gray-100, #eff1f2);
1318
- background-color: var(--color-cyan-50, #fafeff);
1319
1558
  padding: 1.5rem;
1320
1559
  display: flex;
1321
1560
  flex-direction: column;
1322
1561
  gap: 1.5rem;
1562
+ position: relative;
1563
+ overflow: hidden;
1564
+ }
1565
+
1566
+ /* Card Variants */
1567
+ .card--default {
1568
+ border: 1px solid var(--color-gray-100, #eff1f2);
1569
+ background-color: var(--color-cyan-50, #fafeff);
1570
+ }
1571
+
1572
+ .card--outlined {
1573
+ border: 1px solid var(--color-gray-200, #dedfe3);
1574
+ background-color: var(--color-white, #fff);
1575
+ }
1576
+
1577
+ .card--elevated {
1578
+ border: none;
1579
+ background-color: var(--color-white, #fff);
1580
+ box-shadow: var(--shadow-md, 0 4px 6px -1px rgba(16, 24, 40, 0.1), 0 2px 4px -2px rgba(16, 24, 40, 0.1));
1581
+ }
1582
+
1583
+ .card--filled {
1584
+ border: none;
1585
+ background-color: var(--color-gray-900, #171820);
1586
+ color: var(--color-white, #fff);
1587
+ }
1588
+
1589
+ .card--filled .card-title,
1590
+ .card--filled .card-description,
1591
+ .card--filled .card-content,
1592
+ .card--filled .card-footer {
1593
+ color: var(--color-white, #fff);
1594
+ }
1595
+
1596
+ .card--filled .card-description,
1597
+ .card--filled .card-footer {
1598
+ color: var(--color-gray-300, #cbcdd2);
1599
+ }
1600
+
1601
+ .card--interactive {
1602
+ border: 1px solid var(--color-gray-100, #eff1f2);
1603
+ background-color: var(--color-white, #fff);
1604
+ cursor: pointer;
1605
+ transition:
1606
+ transform 200ms ease-in-out,
1607
+ border-color 200ms ease-in-out,
1608
+ box-shadow 200ms ease-in-out;
1609
+ will-change: transform;
1610
+ }
1611
+
1612
+ .card--interactive:hover {
1613
+ transform: scale(1.02);
1614
+ border-color: var(--color-gray-200, #dedfe3);
1615
+ box-shadow: var(--shadow-sm, 0 1px 3px 0 rgba(16, 24, 40, 0.1));
1616
+ }
1617
+
1618
+ .card--interactive:active {
1619
+ transform: scale(0.99);
1323
1620
  }
1324
1621
 
1622
+ /* Card Sub-components */
1325
1623
  .card-header {
1326
1624
  display: flex;
1327
1625
  flex-direction: column;
1328
- gap: 1.5rem;
1626
+ gap: 0.5rem;
1329
1627
  }
1330
1628
 
1331
1629
  .card-title {
@@ -1333,7 +1631,7 @@ body {
1333
1631
  }
1334
1632
 
1335
1633
  .card-description {
1336
- color: var(--color-gray-800, #282a31);
1634
+ color: var(--color-gray-600, #52545d);
1337
1635
  }
1338
1636
 
1339
1637
  .card-content {
@@ -1346,20 +1644,111 @@ body {
1346
1644
  color: var(--color-gray-800, #282a31);
1347
1645
  }
1348
1646
 
1349
- .card-with-icon {
1350
- border: 1px solid var(--color-gray-100, #eff1f2);
1351
- background-color: var(--color-white, #fff);
1352
- padding: 1.5rem;
1353
- gap: 1.5rem;
1354
- transition:
1355
- transform 200ms ease-in-out,
1356
- border-color 200ms ease-in-out;
1357
- will-change: transform;
1647
+ /* Card Media */
1648
+ .card-media {
1649
+ margin: -1.5rem -1.5rem 0 -1.5rem;
1650
+ overflow: hidden;
1358
1651
  }
1359
1652
 
1360
- .card-with-icon:hover {
1361
- transform: scale(1.02);
1362
- border-color: var(--color-gray-200, #dedfe3);
1653
+ .card-media__img {
1654
+ width: 100%;
1655
+ height: 100%;
1656
+ object-fit: cover;
1657
+ display: block;
1658
+ }
1659
+
1660
+ /* Card Badge */
1661
+ .card-badge {
1662
+ position: absolute;
1663
+ top: 1rem;
1664
+ right: 1rem;
1665
+ display: inline-flex;
1666
+ align-items: center;
1667
+ padding: 0.25rem 0.625rem;
1668
+ border-radius: 999px;
1669
+ font-size: 0.75rem;
1670
+ font-weight: 600;
1671
+ line-height: 1.25;
1672
+ }
1673
+
1674
+ .card-badge--default {
1675
+ background-color: var(--color-gray-100, #eff1f2);
1676
+ color: var(--color-gray-700, #3e4049);
1677
+ }
1678
+
1679
+ .card-badge--success {
1680
+ background-color: #dcfce7;
1681
+ color: #166534;
1682
+ }
1683
+
1684
+ .card-badge--warning {
1685
+ background-color: #fef9c3;
1686
+ color: #854d0e;
1687
+ }
1688
+
1689
+ .card-badge--error {
1690
+ background-color: #fee2e2;
1691
+ color: #991b1b;
1692
+ }
1693
+
1694
+ .card-badge--info {
1695
+ background-color: var(--color-cyan-100, #d6f4fb);
1696
+ color: var(--color-cyan-800, #0f748a);
1697
+ }
1698
+
1699
+ /* Card Actions */
1700
+ .card-actions {
1701
+ display: flex;
1702
+ align-items: center;
1703
+ gap: 0.75rem;
1704
+ padding-top: 0.5rem;
1705
+ border-top: 1px solid var(--color-gray-100, #eff1f2);
1706
+ margin-top: auto;
1707
+ }
1708
+
1709
+ /* Card Metric */
1710
+ .card-metric {
1711
+ display: flex;
1712
+ flex-direction: column;
1713
+ gap: 0.25rem;
1714
+ }
1715
+
1716
+ .card-metric__value {
1717
+ font-size: 2.25rem;
1718
+ font-weight: 700;
1719
+ line-height: 1;
1720
+ color: var(--color-gray-900, #171820);
1721
+ }
1722
+
1723
+ .card-metric__label {
1724
+ font-size: 0.875rem;
1725
+ color: var(--color-gray-500, #71747d);
1726
+ }
1727
+
1728
+ .card-metric__trend {
1729
+ display: inline-flex;
1730
+ align-items: center;
1731
+ gap: 0.25rem;
1732
+ font-size: 0.75rem;
1733
+ font-weight: 600;
1734
+ margin-top: 0.25rem;
1735
+ }
1736
+
1737
+ .card-metric__trend--up {
1738
+ color: #16a34a;
1739
+ }
1740
+
1741
+ .card-metric__trend--down {
1742
+ color: #dc2626;
1743
+ }
1744
+
1745
+ .card-metric__trend--neutral {
1746
+ color: var(--color-gray-500, #71747d);
1747
+ }
1748
+
1749
+ /* Card With Icon */
1750
+ .card-with-icon {
1751
+ gap: 1.5rem;
1363
1752
  }
1364
1753
 
1365
1754
  .card-with-icon__header {
@@ -1654,42 +2043,165 @@ body {
1654
2043
  line-height: 1.625;
1655
2044
  }
1656
2045
 
1657
- /* Avatar Styles */
1658
- .avatar {
2046
+ /* Banner Styles */
2047
+ .banner {
1659
2048
  position: relative;
2049
+ width: 100%;
1660
2050
  display: flex;
1661
- height: 2.5rem;
1662
- width: 2.5rem;
1663
- flex-shrink: 0;
1664
- overflow: hidden;
1665
- border-radius: 9999px;
2051
+ align-items: center;
2052
+ gap: 0.75rem;
2053
+ padding: 0.75rem 1rem;
2054
+ font-size: 0.875rem;
2055
+ line-height: 1.25rem;
1666
2056
  }
1667
2057
 
1668
- .avatar-image {
1669
- aspect-ratio: 1 / 1;
1670
- height: 100%;
1671
- width: 100%;
2058
+ .banner--sticky {
2059
+ position: sticky;
2060
+ top: 0;
2061
+ z-index: 40;
1672
2062
  }
1673
2063
 
1674
- .avatar-fallback {
2064
+ .banner-content {
2065
+ flex: 1;
1675
2066
  display: flex;
1676
- height: 100%;
1677
- width: 100%;
1678
2067
  align-items: center;
1679
- justify-content: center;
1680
- border-radius: 9999px;
1681
- background-color: hsl(var(--muted));
2068
+ gap: 0.75rem;
2069
+ flex-wrap: wrap;
1682
2070
  }
1683
2071
 
1684
- /* Tag Styles */
1685
- .status-tag {
1686
- display: inline-flex;
2072
+ .banner-icon {
2073
+ display: flex;
1687
2074
  align-items: center;
1688
- padding: 8px;
1689
- border-radius: calc(var(--radius-sm, 6px));
1690
- width: fit-content;
1691
- cursor: pointer;
1692
- transition: all 0.2s ease-in-out;
2075
+ flex-shrink: 0;
2076
+ }
2077
+
2078
+ .banner-icon svg {
2079
+ width: 1rem;
2080
+ height: 1rem;
2081
+ }
2082
+
2083
+ .banner-text {
2084
+ display: flex;
2085
+ flex-direction: column;
2086
+ gap: 0.125rem;
2087
+ flex: 1;
2088
+ }
2089
+
2090
+ .banner-title {
2091
+ font-weight: 600;
2092
+ margin: 0;
2093
+ }
2094
+
2095
+ .banner-description {
2096
+ margin: 0;
2097
+ opacity: 0.9;
2098
+ }
2099
+
2100
+ .banner-action {
2101
+ display: inline-flex;
2102
+ align-items: center;
2103
+ padding: 0.25rem 0.75rem;
2104
+ border-radius: var(--radius-sm, 6px);
2105
+ font-size: 0.8125rem;
2106
+ font-weight: 500;
2107
+ border: 1px solid currentColor;
2108
+ background: transparent;
2109
+ cursor: pointer;
2110
+ white-space: nowrap;
2111
+ transition: opacity 0.15s ease;
2112
+ }
2113
+
2114
+ .banner-action:hover {
2115
+ opacity: 0.8;
2116
+ }
2117
+
2118
+ .banner-close {
2119
+ display: flex;
2120
+ align-items: center;
2121
+ justify-content: center;
2122
+ flex-shrink: 0;
2123
+ width: 1.5rem;
2124
+ height: 1.5rem;
2125
+ border: none;
2126
+ background: transparent;
2127
+ cursor: pointer;
2128
+ border-radius: var(--radius-sm, 4px);
2129
+ opacity: 0.7;
2130
+ transition: opacity 0.15s ease;
2131
+ color: inherit;
2132
+ padding: 0;
2133
+ }
2134
+
2135
+ .banner-close:hover {
2136
+ opacity: 1;
2137
+ }
2138
+
2139
+ /* Banner Variants */
2140
+ .banner--default {
2141
+ background-color: hsl(var(--foreground));
2142
+ color: hsl(var(--background));
2143
+ }
2144
+
2145
+ .banner--info {
2146
+ background-color: hsl(var(--primary) / 0.12);
2147
+ color: hsl(var(--primary));
2148
+ border-left: 3px solid hsl(var(--primary));
2149
+ }
2150
+
2151
+ .banner--success {
2152
+ background-color: hsl(142 71% 45% / 0.12);
2153
+ color: hsl(142 71% 29%);
2154
+ border-left: 3px solid hsl(142 71% 45%);
2155
+ }
2156
+
2157
+ .banner--warning {
2158
+ background-color: hsl(38 92% 50% / 0.12);
2159
+ color: hsl(38 92% 30%);
2160
+ border-left: 3px solid hsl(38 92% 50%);
2161
+ }
2162
+
2163
+ .banner--destructive {
2164
+ background-color: hsl(var(--destructive) / 0.12);
2165
+ color: hsl(var(--destructive));
2166
+ border-left: 3px solid hsl(var(--destructive));
2167
+ }
2168
+
2169
+ /* Avatar Styles */
2170
+ .avatar {
2171
+ position: relative;
2172
+ display: flex;
2173
+ height: 2.5rem;
2174
+ width: 2.5rem;
2175
+ flex-shrink: 0;
2176
+ overflow: hidden;
2177
+ border-radius: 9999px;
2178
+ }
2179
+
2180
+ .avatar-image {
2181
+ aspect-ratio: 1 / 1;
2182
+ height: 100%;
2183
+ width: 100%;
2184
+ }
2185
+
2186
+ .avatar-fallback {
2187
+ display: flex;
2188
+ height: 100%;
2189
+ width: 100%;
2190
+ align-items: center;
2191
+ justify-content: center;
2192
+ border-radius: 9999px;
2193
+ background-color: hsl(var(--muted));
2194
+ }
2195
+
2196
+ /* Tag Styles */
2197
+ .status-tag {
2198
+ display: inline-flex;
2199
+ align-items: center;
2200
+ padding: 8px;
2201
+ border-radius: calc(var(--radius-sm, 6px));
2202
+ width: fit-content;
2203
+ cursor: pointer;
2204
+ transition: all 0.2s ease-in-out;
1693
2205
  }
1694
2206
 
1695
2207
  .status-tag:focus-visible {
@@ -7647,3 +8159,1754 @@ body {
7647
8159
  .navigation-account__icon--dark {
7648
8160
  color: var(--color-bronze-100, #fbf8f3);
7649
8161
  }
8162
+
8163
+ /* File Upload Styles */
8164
+ .file-upload {
8165
+ display: flex;
8166
+ flex-direction: column;
8167
+ gap: 0.75rem;
8168
+ width: 100%;
8169
+ }
8170
+
8171
+ .file-upload-zone {
8172
+ display: flex;
8173
+ align-items: center;
8174
+ justify-content: center;
8175
+ width: 100%;
8176
+ border: 1.5px dashed var(--color-gray-200, #d5d9dc);
8177
+ border-radius: 0.75rem;
8178
+ background-color: var(--color-gray-50, #f7f8f9);
8179
+ cursor: pointer;
8180
+ transition: border-color 0.15s ease, background-color 0.15s ease;
8181
+ outline: none;
8182
+ padding: 2rem 1.5rem;
8183
+ }
8184
+
8185
+ .file-upload-zone:hover:not(.file-upload-zone--disabled),
8186
+ .file-upload-zone:focus-visible:not(.file-upload-zone--disabled) {
8187
+ border-color: var(--color-cyan-400, #22d3ee);
8188
+ background-color: var(--color-cyan-50, #fafeff);
8189
+ }
8190
+
8191
+ .file-upload-zone--dragging {
8192
+ border-color: var(--color-cyan-400, #22d3ee);
8193
+ background-color: var(--color-cyan-50, #fafeff);
8194
+ }
8195
+
8196
+ .file-upload-zone--compact {
8197
+ padding: 1rem 1.5rem;
8198
+ border-radius: 0.5rem;
8199
+ }
8200
+
8201
+ .file-upload-zone--disabled {
8202
+ cursor: not-allowed;
8203
+ opacity: 0.5;
8204
+ background-color: var(--color-gray-100, #eff1f2);
8205
+ }
8206
+
8207
+ .file-upload-input {
8208
+ display: none;
8209
+ }
8210
+
8211
+ /* Default variant inner layout */
8212
+ .file-upload-default-inner {
8213
+ display: flex;
8214
+ flex-direction: column;
8215
+ align-items: center;
8216
+ gap: 0.75rem;
8217
+ text-align: center;
8218
+ }
8219
+
8220
+ .file-upload-icon-circle {
8221
+ display: flex;
8222
+ align-items: center;
8223
+ justify-content: center;
8224
+ width: 2.5rem;
8225
+ height: 2.5rem;
8226
+ border-radius: 9999px;
8227
+ background-color: var(--color-cyan-100, #cffafe);
8228
+ color: var(--color-cyan-600, #0891b2);
8229
+ font-size: 1.125rem;
8230
+ }
8231
+
8232
+ .file-upload-zone-body {
8233
+ display: flex;
8234
+ flex-direction: column;
8235
+ gap: 0.25rem;
8236
+ align-items: center;
8237
+ }
8238
+
8239
+ /* Compact variant inner layout */
8240
+ .file-upload-compact-inner {
8241
+ display: flex;
8242
+ flex-direction: row;
8243
+ align-items: center;
8244
+ gap: 0.5rem;
8245
+ flex-wrap: wrap;
8246
+ }
8247
+
8248
+ .file-upload-icon {
8249
+ font-size: 1rem;
8250
+ color: var(--color-gray-400, #9ba6af);
8251
+ }
8252
+
8253
+ .file-upload-zone-text {
8254
+ font-size: 0.875rem;
8255
+ color: var(--color-gray-600, #5c6a74);
8256
+ line-height: 1.4;
8257
+ }
8258
+
8259
+ .file-upload-zone-link {
8260
+ color: var(--color-cyan-600, #0891b2);
8261
+ font-weight: 500;
8262
+ text-decoration: underline;
8263
+ text-underline-offset: 2px;
8264
+ }
8265
+
8266
+ .file-upload-hint {
8267
+ font-size: 0.75rem;
8268
+ color: var(--color-gray-400, #9ba6af);
8269
+ }
8270
+
8271
+ /* File list */
8272
+ .file-upload-list {
8273
+ display: flex;
8274
+ flex-direction: column;
8275
+ gap: 0.5rem;
8276
+ list-style: none;
8277
+ margin: 0;
8278
+ padding: 0;
8279
+ }
8280
+
8281
+ .file-upload-item {
8282
+ display: flex;
8283
+ align-items: center;
8284
+ gap: 0.75rem;
8285
+ padding: 0.625rem 0.875rem;
8286
+ border-radius: 0.5rem;
8287
+ border: 1px solid var(--color-gray-100, #eff1f2);
8288
+ background-color: var(--color-white, #fff);
8289
+ }
8290
+
8291
+ .file-upload-item--error {
8292
+ border-color: var(--color-red-200, #fecaca);
8293
+ background-color: var(--color-red-50, #fef2f2);
8294
+ }
8295
+
8296
+ .file-upload-item-icon {
8297
+ font-size: 1.25rem;
8298
+ flex-shrink: 0;
8299
+ line-height: 1;
8300
+ }
8301
+
8302
+ .file-upload-item-info {
8303
+ display: flex;
8304
+ flex-direction: column;
8305
+ gap: 0.125rem;
8306
+ flex: 1;
8307
+ min-width: 0;
8308
+ }
8309
+
8310
+ .file-upload-item-name {
8311
+ font-size: 0.875rem;
8312
+ font-weight: 500;
8313
+ color: var(--color-gray-800, #2d3c46);
8314
+ white-space: nowrap;
8315
+ overflow: hidden;
8316
+ text-overflow: ellipsis;
8317
+ }
8318
+
8319
+ .file-upload-item-size {
8320
+ font-size: 0.75rem;
8321
+ color: var(--color-gray-400, #9ba6af);
8322
+ }
8323
+
8324
+ .file-upload-item-error {
8325
+ font-size: 0.75rem;
8326
+ color: var(--color-red-500, #ef4444);
8327
+ }
8328
+
8329
+ .file-upload-item-remove {
8330
+ flex-shrink: 0;
8331
+ display: flex;
8332
+ align-items: center;
8333
+ justify-content: center;
8334
+ width: 1.5rem;
8335
+ height: 1.5rem;
8336
+ border-radius: 9999px;
8337
+ border: none;
8338
+ background: transparent;
8339
+ color: var(--color-gray-400, #9ba6af);
8340
+ font-size: 0.75rem;
8341
+ cursor: pointer;
8342
+ transition: background-color 0.15s ease, color 0.15s ease;
8343
+ line-height: 1;
8344
+ }
8345
+
8346
+ .file-upload-item-remove:hover {
8347
+ background-color: var(--color-gray-100, #eff1f2);
8348
+ color: var(--color-gray-700, #3f5260);
8349
+ }
8350
+
8351
+ /* DatePicker Styles */
8352
+ .date-picker-trigger {
8353
+ display: flex;
8354
+ align-items: center;
8355
+ gap: 0.5rem;
8356
+ width: 100%;
8357
+ height: 3rem;
8358
+ padding: 0 1rem;
8359
+ border: 1px solid var(--color-gray-200, #d5d9dc);
8360
+ border-radius: 0.5rem;
8361
+ background-color: var(--color-white, #fff);
8362
+ font-size: 0.875rem;
8363
+ color: var(--color-gray-800, #2d3c46);
8364
+ cursor: pointer;
8365
+ text-align: left;
8366
+ transition: border-color 0.15s ease, box-shadow 0.15s ease;
8367
+ outline: none;
8368
+ }
8369
+
8370
+ .date-picker-trigger:hover:not(.date-picker-trigger--disabled) {
8371
+ border-color: var(--color-gray-400, #9ba6af);
8372
+ }
8373
+
8374
+ .date-picker-trigger:focus-visible:not(.date-picker-trigger--disabled) {
8375
+ border-color: var(--color-cyan-400, #22d3ee);
8376
+ box-shadow: 0 0 0 3px rgba(34, 211, 238, 0.15);
8377
+ }
8378
+
8379
+ .date-picker-trigger--placeholder .date-picker-value {
8380
+ color: var(--color-gray-400, #9ba6af);
8381
+ }
8382
+
8383
+ .date-picker-trigger--disabled {
8384
+ cursor: not-allowed;
8385
+ opacity: 0.5;
8386
+ background-color: var(--color-gray-50, #f7f8f9);
8387
+ }
8388
+
8389
+ .date-picker-icon {
8390
+ display: flex;
8391
+ align-items: center;
8392
+ flex-shrink: 0;
8393
+ color: var(--color-gray-400, #9ba6af);
8394
+ }
8395
+
8396
+ .date-picker-value {
8397
+ flex: 1;
8398
+ overflow: hidden;
8399
+ white-space: nowrap;
8400
+ text-overflow: ellipsis;
8401
+ }
8402
+
8403
+ .date-picker-chevron {
8404
+ display: flex;
8405
+ align-items: center;
8406
+ flex-shrink: 0;
8407
+ color: var(--color-gray-400, #9ba6af);
8408
+ margin-left: auto;
8409
+ }
8410
+
8411
+ .date-picker-popover {
8412
+ padding: 0;
8413
+ width: auto;
8414
+ }
8415
+
8416
+ /* Stepper Styles */
8417
+ .stepper {
8418
+ display: flex;
8419
+ width: 100%;
8420
+ }
8421
+
8422
+ .stepper--horizontal {
8423
+ flex-direction: row;
8424
+ align-items: flex-start;
8425
+ }
8426
+
8427
+ .stepper--vertical {
8428
+ flex-direction: column;
8429
+ }
8430
+
8431
+ /* Size tokens */
8432
+ .stepper--sm { --stepper-indicator-size: 1.5rem; --stepper-font-size: 0.75rem; }
8433
+ .stepper--md { --stepper-indicator-size: 2rem; --stepper-font-size: 0.875rem; }
8434
+ .stepper--lg { --stepper-indicator-size: 2.5rem; --stepper-font-size: 1rem; }
8435
+
8436
+ /* ---------------------------------------------------------------------------
8437
+ Stepper Item
8438
+ --------------------------------------------------------------------------- */
8439
+ .stepper-item {
8440
+ display: flex;
8441
+ position: relative;
8442
+ }
8443
+
8444
+ /* Horizontal: each item is a column (indicator on top, label below) */
8445
+ .stepper--horizontal .stepper-item {
8446
+ flex-direction: column;
8447
+ align-items: center;
8448
+ flex: 1;
8449
+ }
8450
+
8451
+ /* Vertical: each item is a row (indicator on left, label on right) */
8452
+ .stepper--vertical .stepper-item {
8453
+ flex-direction: row;
8454
+ align-items: flex-start;
8455
+ gap: 0.75rem;
8456
+ }
8457
+
8458
+ /* ---------------------------------------------------------------------------
8459
+ Indicator Row (holds the circle + connector line)
8460
+ --------------------------------------------------------------------------- */
8461
+ .stepper-indicator-row {
8462
+ display: flex;
8463
+ align-items: center;
8464
+ width: 100%;
8465
+ position: relative;
8466
+ }
8467
+
8468
+ .stepper--vertical .stepper-indicator-row {
8469
+ flex-direction: column;
8470
+ align-items: center;
8471
+ width: auto;
8472
+ }
8473
+
8474
+ /* ---------------------------------------------------------------------------
8475
+ Indicator (the circle)
8476
+ --------------------------------------------------------------------------- */
8477
+ .stepper-indicator {
8478
+ display: flex;
8479
+ align-items: center;
8480
+ justify-content: center;
8481
+ flex-shrink: 0;
8482
+ width: var(--stepper-indicator-size);
8483
+ height: var(--stepper-indicator-size);
8484
+ border-radius: 9999px;
8485
+ border: 2px solid transparent;
8486
+ font-size: var(--stepper-font-size);
8487
+ font-weight: 600;
8488
+ transition: background-color 0.2s ease, border-color 0.2s ease, color 0.2s ease;
8489
+ cursor: default;
8490
+ background: none;
8491
+ padding: 0;
8492
+ line-height: 1;
8493
+ z-index: 1;
8494
+ }
8495
+
8496
+ /* Complete */
8497
+ .stepper-indicator--complete.stepper-indicator--default {
8498
+ background-color: var(--color-cyan-600, #0891b2);
8499
+ border-color: var(--color-cyan-600, #0891b2);
8500
+ color: #fff;
8501
+ }
8502
+ .stepper-indicator--complete.stepper-indicator--outlined {
8503
+ background-color: transparent;
8504
+ border-color: var(--color-cyan-600, #0891b2);
8505
+ color: var(--color-cyan-600, #0891b2);
8506
+ }
8507
+
8508
+ /* Current */
8509
+ .stepper-indicator--current.stepper-indicator--default {
8510
+ background-color: var(--color-cyan-600, #0891b2);
8511
+ border-color: var(--color-cyan-600, #0891b2);
8512
+ color: #fff;
8513
+ }
8514
+ .stepper-indicator--current.stepper-indicator--outlined {
8515
+ background-color: transparent;
8516
+ border-color: var(--color-cyan-600, #0891b2);
8517
+ color: var(--color-cyan-600, #0891b2);
8518
+ }
8519
+
8520
+ /* Upcoming */
8521
+ .stepper-indicator--upcoming.stepper-indicator--default {
8522
+ background-color: var(--color-gray-100, #eff1f2);
8523
+ border-color: var(--color-gray-200, #d5d9dc);
8524
+ color: var(--color-gray-400, #9ba6af);
8525
+ }
8526
+ .stepper-indicator--upcoming.stepper-indicator--outlined {
8527
+ background-color: transparent;
8528
+ border-color: var(--color-gray-300, #bec6cb);
8529
+ color: var(--color-gray-400, #9ba6af);
8530
+ }
8531
+
8532
+ .stepper-indicator--clickable {
8533
+ cursor: pointer;
8534
+ }
8535
+ .stepper-indicator--clickable:hover {
8536
+ opacity: 0.8;
8537
+ }
8538
+
8539
+ .stepper-indicator-number {
8540
+ line-height: 1;
8541
+ }
8542
+
8543
+ /* ---------------------------------------------------------------------------
8544
+ Connector line
8545
+ --------------------------------------------------------------------------- */
8546
+ .stepper-connector {
8547
+ background-color: var(--color-gray-200, #d5d9dc);
8548
+ transition: background-color 0.2s ease;
8549
+ }
8550
+
8551
+ .stepper-connector--complete {
8552
+ background-color: var(--color-cyan-600, #0891b2);
8553
+ }
8554
+
8555
+ /* Horizontal connector */
8556
+ .stepper-connector--horizontal {
8557
+ flex: 1;
8558
+ height: 2px;
8559
+ margin: 0 0.5rem;
8560
+ }
8561
+
8562
+ /* Vertical connector */
8563
+ .stepper-connector--vertical {
8564
+ width: 2px;
8565
+ flex: 1;
8566
+ min-height: 2rem;
8567
+ margin: 0.25rem 0;
8568
+ }
8569
+
8570
+ /* ---------------------------------------------------------------------------
8571
+ Label
8572
+ --------------------------------------------------------------------------- */
8573
+ .stepper-label {
8574
+ display: flex;
8575
+ flex-direction: column;
8576
+ gap: 0.125rem;
8577
+ }
8578
+
8579
+ .stepper--horizontal .stepper-label {
8580
+ align-items: center;
8581
+ text-align: center;
8582
+ margin-top: 0.5rem;
8583
+ padding: 0 0.25rem;
8584
+ }
8585
+
8586
+ .stepper--vertical .stepper-label {
8587
+ padding-bottom: 1.5rem;
8588
+ }
8589
+
8590
+ .stepper-title {
8591
+ font-size: var(--stepper-font-size);
8592
+ font-weight: 600;
8593
+ line-height: 1.4;
8594
+ transition: color 0.15s ease;
8595
+ }
8596
+
8597
+ .stepper-title--complete { color: var(--color-gray-700, #3f5260); }
8598
+ .stepper-title--current { color: var(--color-gray-900, #1a282f); }
8599
+ .stepper-title--upcoming { color: var(--color-gray-400, #9ba6af); }
8600
+
8601
+ .stepper-description {
8602
+ font-size: calc(var(--stepper-font-size) - 0.0625rem);
8603
+ line-height: 1.4;
8604
+ }
8605
+
8606
+ .stepper-description--complete { color: var(--color-gray-400, #9ba6af); }
8607
+ .stepper-description--current { color: var(--color-gray-500, #6b7a84); }
8608
+ .stepper-description--upcoming { color: var(--color-gray-300, #bec6cb); }
8609
+
8610
+ /* ─── AppBar ──────────────────────────────────────────────────────────────── */
8611
+
8612
+ .app-bar {
8613
+ display: flex;
8614
+ align-items: center;
8615
+ width: 100%;
8616
+ top: 0;
8617
+ left: 0;
8618
+ right: 0;
8619
+ z-index: var(--z-app-bar, 100);
8620
+ background-color: var(--app-bar-bg, var(--color-surface, #ffffff));
8621
+ color: var(--app-bar-color, var(--color-on-surface, #1a1a1a));
8622
+ border-bottom: 1px solid var(--app-bar-border, var(--color-border, #e5e7eb));
8623
+ padding-inline: var(--app-bar-px, 0.75rem);
8624
+ gap: var(--app-bar-gap, 0.25rem);
8625
+ overflow: hidden; /* keeps image layer clipped to bar bounds */
8626
+ transition:
8627
+ box-shadow 200ms ease,
8628
+ height 200ms ease,
8629
+ background-color 200ms ease;
8630
+ }
8631
+
8632
+ /* ─── Position variants ──────────────────────────────────────────────────── */
8633
+
8634
+ .app-bar--fixed { position: fixed; }
8635
+ .app-bar--sticky { position: sticky; }
8636
+ .app-bar--relative { position: relative; }
8637
+ .app-bar--static { position: static; }
8638
+
8639
+ /* ─── Color variants ─────────────────────────────────────────────────────── */
8640
+
8641
+ .app-bar--primary {
8642
+ background-color: var(--color-primary, #2563eb);
8643
+ color: var(--color-on-primary, #ffffff);
8644
+ border-bottom-color: transparent;
8645
+ }
8646
+
8647
+ .app-bar--primary .app-bar-nav-icon,
8648
+ .app-bar--primary .app-bar-action-btn {
8649
+ color: var(--color-on-primary, #ffffff);
8650
+ }
8651
+
8652
+ .app-bar--transparent {
8653
+ background-color: transparent;
8654
+ border-bottom-color: transparent;
8655
+ }
8656
+
8657
+ /* ─── Density ────────────────────────────────────────────────────────────── */
8658
+
8659
+ .app-bar--comfortable {
8660
+ padding-inline: var(--app-bar-px-comfortable, 0.75rem);
8661
+ }
8662
+
8663
+ .app-bar--compact {
8664
+ padding-inline: var(--app-bar-px-compact, 0.5rem);
8665
+ }
8666
+
8667
+ .app-bar--compact .app-bar-title {
8668
+ font-size: var(--app-bar-title-size-compact, 1rem);
8669
+ }
8670
+
8671
+ /* ─── Prominent ──────────────────────────────────────────────────────────── */
8672
+ /*
8673
+ Prominent bars are taller (128px via inline style).
8674
+ The inner wrapper uses a column layout so the top row holds
8675
+ the nav/actions and the title flows to the bottom.
8676
+ */
8677
+
8678
+ .app-bar--prominent {
8679
+ align-items: stretch;
8680
+ padding-inline: 0;
8681
+ }
8682
+
8683
+ .app-bar-prominent-inner {
8684
+ display: flex;
8685
+ flex-direction: column;
8686
+ justify-content: space-between;
8687
+ width: 100%;
8688
+ padding-block: 0.25rem 0.75rem;
8689
+ padding-inline: var(--app-bar-px, 0.75rem);
8690
+ position: relative;
8691
+ z-index: 1;
8692
+ }
8693
+
8694
+ /* Top row: prepend + append sit at the top of the prominent bar */
8695
+ .app-bar--prominent .app-bar-prepend {
8696
+ align-self: flex-start;
8697
+ }
8698
+
8699
+ .app-bar--prominent .app-bar-append {
8700
+ align-self: flex-start;
8701
+ /* keep append pinned to the right inside the top row */
8702
+ margin-inline-start: auto;
8703
+ }
8704
+
8705
+ /* Title flows to the bottom of the prominent bar */
8706
+ .app-bar--prominent .app-bar-title {
8707
+ font-size: var(--app-bar-title-size-prominent, 1.25rem);
8708
+ font-weight: var(--app-bar-title-weight-prominent, 600);
8709
+ padding-inline-start: 0.25rem;
8710
+ align-self: flex-end;
8711
+ width: 100%;
8712
+ }
8713
+
8714
+ /*
8715
+ The prominent bar's top row (prepend + append) needs to be a flex row.
8716
+ We achieve this by making the first flex layer of prominent-inner a row,
8717
+ then the title breaks to the bottom via flex-wrap or an explicit row wrapper.
8718
+ Since children are prepend / title / append we use a top-row wrapper approach
8719
+ via CSS: wrap the first row items and push title to the bottom.
8720
+ */
8721
+ .app-bar-prominent-inner {
8722
+ /* Use a 2-row grid: top row auto, bottom row fills remaining */
8723
+ display: grid;
8724
+ grid-template-rows: auto 1fr;
8725
+ grid-template-columns: 1fr;
8726
+ height: 100%;
8727
+ }
8728
+
8729
+ .app-bar-prominent-top {
8730
+ display: flex;
8731
+ align-items: center;
8732
+ width: 100%;
8733
+ }
8734
+
8735
+ .app-bar-prominent-bottom {
8736
+ display: flex;
8737
+ align-items: flex-end;
8738
+ width: 100%;
8739
+ padding-bottom: 0.25rem;
8740
+ }
8741
+
8742
+ /* ─── Elevation ──────────────────────────────────────────────────────────── */
8743
+
8744
+ .app-bar--elevated {
8745
+ border-bottom-color: transparent;
8746
+ box-shadow: var(
8747
+ --app-bar-shadow,
8748
+ 0 1px 3px 0 rgb(0 0 0 / 0.1),
8749
+ 0 1px 2px -1px rgb(0 0 0 / 0.1)
8750
+ );
8751
+ }
8752
+
8753
+ /* ─── Flat ───────────────────────────────────────────────────────────────── */
8754
+
8755
+ .app-bar--flat {
8756
+ border-bottom-color: transparent;
8757
+ box-shadow: none;
8758
+ }
8759
+
8760
+ /* ─── Rounded ────────────────────────────────────────────────────────────── */
8761
+
8762
+ .app-bar--rounded {
8763
+ border-radius: var(--app-bar-radius, 0.75rem);
8764
+ margin: var(--app-bar-rounded-margin, 0.5rem);
8765
+ width: calc(100% - var(--app-bar-rounded-margin, 0.5rem) * 2);
8766
+ }
8767
+
8768
+ /* ─── Collapse ───────────────────────────────────────────────────────────── */
8769
+
8770
+ .app-bar--collapse .app-bar-title,
8771
+ .app-bar--collapse .app-bar-content,
8772
+ .app-bar--collapse .app-bar-append {
8773
+ opacity: 0;
8774
+ pointer-events: none;
8775
+ width: 0;
8776
+ overflow: hidden;
8777
+ transition: opacity 200ms ease, width 200ms ease;
8778
+ }
8779
+
8780
+ /* ─── Image ──────────────────────────────────────────────────────────────── */
8781
+
8782
+ .app-bar--image {
8783
+ /* When an image is set, ensure text stays readable */
8784
+ color: var(--color-on-primary, #ffffff);
8785
+ border-bottom-color: transparent;
8786
+ }
8787
+
8788
+ .app-bar--image .app-bar-nav-icon,
8789
+ .app-bar--image .app-bar-action-btn {
8790
+ color: var(--color-on-primary, #ffffff);
8791
+ }
8792
+
8793
+ /* The image sits behind all content via absolute positioning */
8794
+ .app-bar-image-layer {
8795
+ position: absolute;
8796
+ inset: 0;
8797
+ background-size: cover;
8798
+ background-position: center;
8799
+ z-index: 0;
8800
+ }
8801
+
8802
+ /* Optional gradient overlay on top of the image */
8803
+ .app-bar-image-overlay {
8804
+ position: absolute;
8805
+ inset: 0;
8806
+ }
8807
+
8808
+ /*
8809
+ All direct children of .app-bar need z-index: 1 when an image is present
8810
+ so they render above the image layer.
8811
+ */
8812
+ .app-bar--image > .app-bar-prepend,
8813
+ .app-bar--image > .app-bar-title,
8814
+ .app-bar--image > .app-bar-content,
8815
+ .app-bar--image > .app-bar-append {
8816
+ position: relative;
8817
+ z-index: 1;
8818
+ }
8819
+
8820
+ /* ─── Prepend slot ───────────────────────────────────────────────────────── */
8821
+
8822
+ .app-bar-prepend {
8823
+ display: flex;
8824
+ align-items: center;
8825
+ flex-shrink: 0;
8826
+ gap: 0.25rem;
8827
+ }
8828
+
8829
+ /* ─── Nav Icon button ────────────────────────────────────────────────────── */
8830
+
8831
+ .app-bar-nav-icon {
8832
+ display: inline-flex;
8833
+ align-items: center;
8834
+ justify-content: center;
8835
+ width: 2.5rem;
8836
+ height: 2.5rem;
8837
+ border-radius: var(--radius-full, 9999px);
8838
+ border: none;
8839
+ background: transparent;
8840
+ color: inherit;
8841
+ cursor: pointer;
8842
+ transition: background-color 150ms ease;
8843
+ flex-shrink: 0;
8844
+ }
8845
+
8846
+ .app-bar-nav-icon:hover {
8847
+ background-color: var(--color-muted, rgba(0, 0, 0, 0.06));
8848
+ }
8849
+
8850
+ .app-bar-nav-icon:focus-visible {
8851
+ outline: 2px solid var(--color-primary, #2563eb);
8852
+ outline-offset: 2px;
8853
+ }
8854
+
8855
+ /* ─── Title ──────────────────────────────────────────────────────────────── */
8856
+
8857
+ .app-bar-title {
8858
+ flex: 1;
8859
+ font-size: var(--app-bar-title-size, 1.125rem);
8860
+ font-weight: var(--app-bar-title-weight, 600);
8861
+ line-height: 1.25;
8862
+ white-space: nowrap;
8863
+ overflow: hidden;
8864
+ text-overflow: ellipsis;
8865
+ transition: opacity 200ms ease, width 200ms ease;
8866
+ }
8867
+
8868
+ /* ─── Content ────────────────────────────────────────────────────────────── */
8869
+
8870
+ .app-bar-content {
8871
+ flex: 1;
8872
+ display: flex;
8873
+ align-items: center;
8874
+ min-width: 0;
8875
+ transition: opacity 200ms ease, width 200ms ease;
8876
+ }
8877
+
8878
+ /* ─── Append slot ────────────────────────────────────────────────────────── */
8879
+
8880
+ .app-bar-append {
8881
+ display: flex;
8882
+ align-items: center;
8883
+ flex-shrink: 0;
8884
+ gap: 0.25rem;
8885
+ margin-inline-start: auto;
8886
+ transition: opacity 200ms ease, width 200ms ease;
8887
+ }
8888
+
8889
+ /* ─── Action button ──────────────────────────────────────────────────────── */
8890
+
8891
+ .app-bar-action-btn {
8892
+ display: inline-flex;
8893
+ align-items: center;
8894
+ justify-content: center;
8895
+ width: 2.5rem;
8896
+ height: 2.5rem;
8897
+ border-radius: var(--radius-full, 9999px);
8898
+ border: none;
8899
+ background: transparent;
8900
+ color: inherit;
8901
+ cursor: pointer;
8902
+ transition: background-color 150ms ease;
8903
+ flex-shrink: 0;
8904
+ }
8905
+
8906
+ .app-bar-action-btn:hover {
8907
+ background-color: var(--color-muted, rgba(0, 0, 0, 0.06));
8908
+ }
8909
+
8910
+ .app-bar-action-btn:focus-visible {
8911
+ outline: 2px solid var(--color-primary, #2563eb);
8912
+ outline-offset: 2px;
8913
+ }
8914
+
8915
+ /* ─── Search input ───────────────────────────────────────────────────────── */
8916
+
8917
+ .app-bar-search {
8918
+ position: relative;
8919
+ display: flex;
8920
+ align-items: center;
8921
+ width: 100%;
8922
+ max-width: 28rem;
8923
+ }
8924
+
8925
+ .app-bar-search-icon {
8926
+ position: absolute;
8927
+ left: 0.75rem;
8928
+ color: var(--color-muted-foreground, #9ca3af);
8929
+ pointer-events: none;
8930
+ flex-shrink: 0;
8931
+ }
8932
+
8933
+ .app-bar-search-input {
8934
+ width: 100%;
8935
+ height: 2.25rem;
8936
+ padding-inline: 2.25rem 0.75rem;
8937
+ border-radius: var(--radius-md, 0.5rem);
8938
+ border: 1px solid var(--color-border, #e5e7eb);
8939
+ background: var(--color-muted-bg, rgba(0, 0, 0, 0.04));
8940
+ font-size: 0.875rem;
8941
+ color: inherit;
8942
+ outline: none;
8943
+ transition: border-color 150ms ease, background-color 150ms ease;
8944
+ }
8945
+
8946
+ .app-bar-search-input::placeholder {
8947
+ color: var(--color-muted-foreground, #9ca3af);
8948
+ }
8949
+
8950
+ .app-bar-search-input:focus {
8951
+ border-color: var(--color-primary, #2563eb);
8952
+ background: var(--color-surface, #ffffff);
8953
+ }
8954
+
8955
+ /* ─── BottomNavigation ───────────────────────────────────────────────────── */
8956
+
8957
+ .bottom-nav {
8958
+ position: absolute;
8959
+ bottom: 0;
8960
+ left: 0;
8961
+ right: 0;
8962
+ width: 100%;
8963
+ background-color: var(--bottom-nav-bg, var(--color-surface, #ffffff));
8964
+ border-top: 1px solid var(--bottom-nav-border, var(--color-border, #e5e7eb));
8965
+ z-index: var(--z-bottom-nav, 100);
8966
+ transform: translateY(0);
8967
+ transition: transform 250ms ease, background-color 200ms ease;
8968
+ }
8969
+
8970
+ .bottom-nav--hidden {
8971
+ transform: translateY(100%);
8972
+ }
8973
+
8974
+ .bottom-nav--elevated {
8975
+ box-shadow:
8976
+ 0 -1px 3px 0 rgb(0 0 0 / 0.08),
8977
+ 0 -1px 8px 0 rgb(0 0 0 / 0.06);
8978
+ border-top-color: transparent;
8979
+ }
8980
+
8981
+ /* ─── Group ──────────────────────────────────────────────────────────────── */
8982
+
8983
+ .bottom-nav-group {
8984
+ display: flex;
8985
+ align-items: stretch;
8986
+ height: var(--bottom-nav-height, 56px);
8987
+ width: 100%;
8988
+ }
8989
+
8990
+ /* ─── Item (button) ──────────────────────────────────────────────────────── */
8991
+
8992
+ .bottom-nav-item {
8993
+ display: inline-flex;
8994
+ flex-direction: column;
8995
+ align-items: center;
8996
+ justify-content: center;
8997
+ gap: 0.125rem;
8998
+ min-width: 80px;
8999
+ padding-inline: 0.75rem;
9000
+ border: none;
9001
+ background: transparent;
9002
+ color: var(--bottom-nav-item-color, var(--color-gray-500, #71747d));
9003
+ cursor: pointer;
9004
+ font-size: 0.6875rem; /* 11px label */
9005
+ font-weight: 500;
9006
+ line-height: 1.2;
9007
+ text-align: center;
9008
+ transition:
9009
+ color 150ms ease,
9010
+ background-color 150ms ease;
9011
+ position: relative;
9012
+ overflow: hidden;
9013
+ -webkit-tap-highlight-color: transparent;
9014
+ }
9015
+
9016
+ /* Ripple placeholder on click */
9017
+ .bottom-nav-item::after {
9018
+ content: "";
9019
+ position: absolute;
9020
+ inset: 0;
9021
+ background: currentColor;
9022
+ opacity: 0;
9023
+ transition: opacity 200ms ease;
9024
+ border-radius: inherit;
9025
+ pointer-events: none;
9026
+ }
9027
+
9028
+ .bottom-nav-item:hover::after {
9029
+ opacity: 0.06;
9030
+ }
9031
+
9032
+ .bottom-nav-item:active::after {
9033
+ opacity: 0.12;
9034
+ }
9035
+
9036
+ /* Active state — color driven by CSS variable set via inline style */
9037
+ .bottom-nav-item--active {
9038
+ color: var(--bottom-nav-active-color, var(--color-primary, #2563eb));
9039
+ }
9040
+
9041
+ /* Icon inside item — inherits color */
9042
+ .bottom-nav-item svg {
9043
+ flex-shrink: 0;
9044
+ transition: color 150ms ease;
9045
+ }
9046
+
9047
+ /* Label inside item */
9048
+ .bottom-nav-item span {
9049
+ display: block;
9050
+ transition: opacity 150ms ease, max-height 150ms ease;
9051
+ }
9052
+
9053
+ /* ─── Grow ───────────────────────────────────────────────────────────────── */
9054
+ /* Each item fills available space, capped at 168px per MD spec */
9055
+
9056
+ .bottom-nav--grow .bottom-nav-group {
9057
+ justify-content: stretch;
9058
+ }
9059
+
9060
+ .bottom-nav-item--grow {
9061
+ flex: 1;
9062
+ max-width: 168px;
9063
+ }
9064
+
9065
+ /* ─── Horizontal ─────────────────────────────────────────────────────────── */
9066
+ /* Icon and label sit side-by-side */
9067
+
9068
+ .bottom-nav-item--horizontal {
9069
+ flex-direction: row;
9070
+ gap: 0.375rem;
9071
+ font-size: 0.8125rem; /* slightly larger for inline layout */
9072
+ }
9073
+
9074
+ /* ─── Shift ──────────────────────────────────────────────────────────────── */
9075
+ /* Inactive items: icon only (label hidden). Active item: icon + label. */
9076
+
9077
+ .bottom-nav-item--shift span {
9078
+ max-height: 0;
9079
+ opacity: 0;
9080
+ overflow: hidden;
9081
+ pointer-events: none;
9082
+ }
9083
+
9084
+ .bottom-nav-item--shift.bottom-nav-item--active span {
9085
+ max-height: 2rem;
9086
+ opacity: 1;
9087
+ pointer-events: auto;
9088
+ }
9089
+
9090
+ /* Inactive icons in shift mode are slightly smaller */
9091
+ .bottom-nav-item--shift:not(.bottom-nav-item--active) svg {
9092
+ transform: scale(0.85);
9093
+ transition: transform 150ms ease, color 150ms ease;
9094
+ }
9095
+
9096
+ .bottom-nav-item--shift.bottom-nav-item--active svg {
9097
+ transform: scale(1);
9098
+ }
9099
+
9100
+ /* ─── Footer ─────────────────────────────────────────────────────────────── */
9101
+
9102
+ .footer {
9103
+ width: 100%;
9104
+ background-color: var(--footer-bg, var(--color-surface, #ffffff));
9105
+ color: var(--footer-color, var(--color-on-surface, #1a1a1a));
9106
+ padding: var(--footer-padding, 1rem 1.5rem);
9107
+ display: flex;
9108
+ flex-direction: column;
9109
+ gap: var(--footer-gap, 0.75rem);
9110
+ }
9111
+
9112
+ /* ─── Variants ───────────────────────────────────────────────────────────── */
9113
+
9114
+ .footer--bordered {
9115
+ border-top: 1px solid var(--footer-border-color, var(--color-border, #e5e7eb));
9116
+ }
9117
+
9118
+ .footer--rounded {
9119
+ border-radius: var(--footer-radius, 0.75rem);
9120
+ }
9121
+
9122
+ .footer--elevated {
9123
+ box-shadow:
9124
+ 0 -1px 3px 0 rgb(0 0 0 / 0.06),
9125
+ 0 -1px 8px 0 rgb(0 0 0 / 0.04);
9126
+ }
9127
+
9128
+ /* ─── Color-specific overrides ───────────────────────────────────────────── */
9129
+
9130
+ /* Indigo footer — text should contrast against the light indigo bg */
9131
+ .footer--indigo {
9132
+ color: var(--color-gray-800, #2d2f36);
9133
+ text-align: center;
9134
+ align-items: center;
9135
+ }
9136
+
9137
+ /* Teal footer — white text on dark teal bg */
9138
+ .footer--teal {
9139
+ color: #ffffff;
9140
+ }
9141
+
9142
+ /* ─── FooterRow ──────────────────────────────────────────────────────────── */
9143
+
9144
+ .footer-row {
9145
+ display: flex;
9146
+ align-items: center;
9147
+ flex-wrap: wrap;
9148
+ gap: 0.5rem;
9149
+ }
9150
+
9151
+ .footer-row--center {
9152
+ justify-content: center;
9153
+ }
9154
+
9155
+ .footer-row--space-between {
9156
+ justify-content: space-between;
9157
+ }
9158
+
9159
+ .footer-row--padded {
9160
+ padding: 0.5rem 0;
9161
+ }
9162
+
9163
+ .footer-row--gap {
9164
+ gap: 0.25rem;
9165
+ }
9166
+
9167
+ /* ─── FooterLinks ────────────────────────────────────────────────────────── */
9168
+
9169
+ .footer-links {
9170
+ display: flex;
9171
+ align-items: center;
9172
+ justify-content: center;
9173
+ flex-wrap: wrap;
9174
+ gap: 0.25rem;
9175
+ }
9176
+
9177
+ /* ─── FooterLink ─────────────────────────────────────────────────────────── */
9178
+
9179
+ .footer-link {
9180
+ display: inline-flex;
9181
+ align-items: center;
9182
+ justify-content: center;
9183
+ padding: 0.375rem 0.875rem;
9184
+ border-radius: 9999px;
9185
+ font-size: 0.875rem;
9186
+ font-weight: 500;
9187
+ color: var(--footer-link-color, var(--color-gray-600, #52545d));
9188
+ text-decoration: none;
9189
+ transition: background-color 150ms ease, color 150ms ease;
9190
+ }
9191
+
9192
+ .footer-link:hover {
9193
+ background-color: var(--color-gray-100, #eff1f2);
9194
+ color: var(--color-gray-800, #2d2f36);
9195
+ }
9196
+
9197
+ .footer-link:focus-visible {
9198
+ outline: 2px solid var(--color-primary, #2563eb);
9199
+ outline-offset: 2px;
9200
+ }
9201
+
9202
+ /* ─── FooterIconButton ───────────────────────────────────────────────────── */
9203
+
9204
+ .footer-icon-btn {
9205
+ display: inline-flex;
9206
+ align-items: center;
9207
+ justify-content: center;
9208
+ width: 2.25rem;
9209
+ height: 2.25rem;
9210
+ border-radius: 9999px;
9211
+ border: none;
9212
+ background: transparent;
9213
+ color: inherit;
9214
+ cursor: pointer;
9215
+ transition: background-color 150ms ease;
9216
+ flex-shrink: 0;
9217
+ }
9218
+
9219
+ .footer-icon-btn:hover {
9220
+ background-color: rgba(0, 0, 0, 0.08);
9221
+ }
9222
+
9223
+ .footer-icon-btn:focus-visible {
9224
+ outline: 2px solid currentColor;
9225
+ outline-offset: 2px;
9226
+ }
9227
+
9228
+ .footer-icon-btn--small {
9229
+ width: 1.875rem;
9230
+ height: 1.875rem;
9231
+ }
9232
+
9233
+ /* Plain variant — no hover background, slightly muted */
9234
+ .footer-icon-btn--plain {
9235
+ opacity: 0.85;
9236
+ }
9237
+
9238
+ .footer-icon-btn--plain:hover {
9239
+ opacity: 1;
9240
+ background-color: rgba(255, 255, 255, 0.12);
9241
+ }
9242
+
9243
+ /* ─── FooterDivider ──────────────────────────────────────────────────────── */
9244
+
9245
+ .footer-divider {
9246
+ border: none;
9247
+ border-top: 1px solid var(--footer-divider-color, var(--color-border, #e5e7eb));
9248
+ width: 100%;
9249
+ margin: 0.25rem 0;
9250
+ align-self: center;
9251
+ }
9252
+
9253
+ .footer-divider--thick {
9254
+ border-top-width: 2px;
9255
+ }
9256
+
9257
+ /* ─── FooterCopyright ────────────────────────────────────────────────────── */
9258
+
9259
+ .footer-copyright {
9260
+ font-size: 0.875rem;
9261
+ color: var(--footer-copyright-color, var(--color-gray-500, #71747d));
9262
+ text-align: center;
9263
+ width: 100%;
9264
+ }
9265
+
9266
+ /* ─── FooterBand ─────────────────────────────────────────────────────────── */
9267
+ /* Full-width bottom accent band — used in the teal footer variant */
9268
+
9269
+ .footer-band {
9270
+ width: 100%;
9271
+ background-color: rgba(0, 0, 0, 0.15);
9272
+ border-radius: var(--footer-band-radius, 0.5rem);
9273
+ padding: 0.625rem 1rem;
9274
+ text-align: center;
9275
+ }
9276
+
9277
+ .footer-band .footer-copyright {
9278
+ color: inherit;
9279
+ opacity: 0.9;
9280
+ }
9281
+
9282
+ /* ─── FooterBodyText ─────────────────────────────────────────────────────── */
9283
+
9284
+ .footer-body-text {
9285
+ font-size: 0.8125rem;
9286
+ line-height: 1.6;
9287
+ opacity: 0.7;
9288
+ text-align: center;
9289
+ max-width: 64ch;
9290
+ margin: 0 auto;
9291
+ }
9292
+
9293
+ /* ─── FooterTagline ──────────────────────────────────────────────────────── */
9294
+
9295
+ .footer-tagline {
9296
+ font-size: 0.9375rem;
9297
+ font-weight: 600;
9298
+ }
9299
+
9300
+ /* ─── SystemBar ──────────────────────────────────────────────────────────── */
9301
+
9302
+ .system-bar {
9303
+ display: flex;
9304
+ align-items: center;
9305
+ width: 100%;
9306
+ padding-inline: 0.5rem;
9307
+ gap: 0.375rem;
9308
+ background-color: var(--system-bar-bg, var(--color-gray-800, #2d2f36));
9309
+ color: var(--system-bar-color, var(--color-white, #ffffff));
9310
+ font-size: 0.6875rem; /* 11px — tight status bar text */
9311
+ font-weight: 500;
9312
+ letter-spacing: 0.01em;
9313
+ user-select: none;
9314
+ position: relative;
9315
+ z-index: var(--z-system-bar, 110); /* sits above app-bar */
9316
+ }
9317
+
9318
+ /* When a custom color is set, force white text for legibility */
9319
+ .system-bar--colored {
9320
+ color: #ffffff;
9321
+ }
9322
+
9323
+ /* ─── Window variant ─────────────────────────────────────────────────────── */
9324
+
9325
+ .system-bar--window {
9326
+ background-color: var(--system-bar-window-bg, var(--color-gray-100, #eff1f2));
9327
+ color: var(--system-bar-window-color, var(--color-gray-700, #3d3f47));
9328
+ padding-inline: 0.625rem;
9329
+ font-size: 0.8125rem;
9330
+ gap: 0.25rem;
9331
+ border-bottom: 1px solid var(--color-border, #e5e7eb);
9332
+ }
9333
+
9334
+ /* ─── Icon wrapper ───────────────────────────────────────────────────────── */
9335
+
9336
+ .system-bar-icon {
9337
+ display: inline-flex;
9338
+ align-items: center;
9339
+ justify-content: center;
9340
+ flex-shrink: 0;
9341
+ line-height: 1;
9342
+ }
9343
+
9344
+ .system-bar-icon svg {
9345
+ display: block;
9346
+ }
9347
+
9348
+ /* ─── Spacer ─────────────────────────────────────────────────────────────── */
9349
+
9350
+ .system-bar-spacer {
9351
+ flex: 1;
9352
+ }
9353
+
9354
+ /* ─── Clock / time text ──────────────────────────────────────────────────── */
9355
+
9356
+ .system-bar-time {
9357
+ font-size: 0.6875rem;
9358
+ font-weight: 600;
9359
+ letter-spacing: 0.02em;
9360
+ white-space: nowrap;
9361
+ flex-shrink: 0;
9362
+ }
9363
+
9364
+ /* ─── Label (window mode) ────────────────────────────────────────────────── */
9365
+
9366
+ .system-bar-label {
9367
+ font-size: 0.8125rem;
9368
+ white-space: nowrap;
9369
+ overflow: hidden;
9370
+ text-overflow: ellipsis;
9371
+ }
9372
+
9373
+ /* ─── Window action buttons ──────────────────────────────────────────────── */
9374
+
9375
+ .system-bar-action {
9376
+ display: inline-flex;
9377
+ align-items: center;
9378
+ justify-content: center;
9379
+ width: 1.75rem;
9380
+ height: 1.75rem;
9381
+ border-radius: var(--radius-sm, 0.25rem);
9382
+ border: none;
9383
+ background: transparent;
9384
+ color: inherit;
9385
+ cursor: pointer;
9386
+ flex-shrink: 0;
9387
+ transition: background-color 120ms ease;
9388
+ }
9389
+
9390
+ .system-bar-action:hover {
9391
+ background-color: var(--color-gray-200, #dedfe3);
9392
+ }
9393
+
9394
+ .system-bar-action:focus-visible {
9395
+ outline: 2px solid var(--color-primary, #2563eb);
9396
+ outline-offset: -2px;
9397
+ }
9398
+
9399
+ /* Close button gets a red hover */
9400
+ .system-bar-action--close:hover {
9401
+ background-color: #ef4444;
9402
+ color: #ffffff;
9403
+ }
9404
+
9405
+ /* ─── EmptyState ─────────────────────────────────────────────────────────── */
9406
+
9407
+ .empty-state {
9408
+ display: flex;
9409
+ flex-direction: column;
9410
+ align-items: center;
9411
+ justify-content: center;
9412
+ text-align: center;
9413
+ padding: var(--empty-state-padding, 3rem 1.5rem);
9414
+ gap: var(--empty-state-gap, 0.5rem);
9415
+ width: 100%;
9416
+ max-width: var(--empty-state-max-width, 560px);
9417
+ margin-inline: auto;
9418
+ }
9419
+
9420
+ /* ─── Media ──────────────────────────────────────────────────────────────── */
9421
+
9422
+ .empty-state-media {
9423
+ display: flex;
9424
+ align-items: center;
9425
+ justify-content: center;
9426
+ margin-bottom: 0.75rem;
9427
+ }
9428
+
9429
+ .empty-state-image {
9430
+ max-width: 100%;
9431
+ max-height: var(--empty-state-image-max-height, 240px);
9432
+ object-fit: contain;
9433
+ border-radius: var(--radius-md, 0.5rem);
9434
+ }
9435
+
9436
+ .empty-state-icon {
9437
+ display: inline-flex;
9438
+ align-items: center;
9439
+ justify-content: center;
9440
+ color: var(--empty-state-icon-color, var(--color-gray-400, #9ca3af));
9441
+ }
9442
+
9443
+ /* ─── Headline ───────────────────────────────────────────────────────────── */
9444
+
9445
+ .empty-state-headline {
9446
+ font-size: var(--empty-state-headline-size, 2.5rem);
9447
+ font-weight: var(--empty-state-headline-weight, 300);
9448
+ line-height: 1.15;
9449
+ color: var(--empty-state-headline-color, var(--color-gray-600, #52545d));
9450
+ letter-spacing: -0.01em;
9451
+ }
9452
+
9453
+ /* ─── Title ──────────────────────────────────────────────────────────────── */
9454
+
9455
+ .empty-state-title {
9456
+ font-size: var(--empty-state-title-size, 1.125rem);
9457
+ font-weight: var(--empty-state-title-weight, 600);
9458
+ line-height: 1.3;
9459
+ color: var(--empty-state-title-color, var(--color-gray-800, #2d2f36));
9460
+ }
9461
+
9462
+ /* ─── Subtitle ───────────────────────────────────────────────────────────── */
9463
+
9464
+ .empty-state-subtitle {
9465
+ font-size: 0.9375rem;
9466
+ font-weight: 500;
9467
+ color: var(--color-gray-600, #52545d);
9468
+ }
9469
+
9470
+ /* ─── Body text ──────────────────────────────────────────────────────────── */
9471
+
9472
+ .empty-state-text {
9473
+ font-size: var(--empty-state-text-size, 0.875rem);
9474
+ line-height: 1.6;
9475
+ color: var(--empty-state-text-color, var(--color-gray-500, #71747d));
9476
+ max-width: 48ch;
9477
+ }
9478
+
9479
+ /* ─── Default slot ───────────────────────────────────────────────────────── */
9480
+
9481
+ .empty-state-default {
9482
+ width: 100%;
9483
+ margin-top: 0.5rem;
9484
+ }
9485
+
9486
+ /* ─── Actions ────────────────────────────────────────────────────────────── */
9487
+
9488
+ .empty-state-actions {
9489
+ display: flex;
9490
+ align-items: center;
9491
+ justify-content: center;
9492
+ flex-wrap: wrap;
9493
+ gap: 0.75rem;
9494
+ margin-top: 0.75rem;
9495
+ }
9496
+
9497
+ /* ─── Action button ──────────────────────────────────────────────────────── */
9498
+
9499
+ .empty-state-action-btn {
9500
+ display: inline-flex;
9501
+ align-items: center;
9502
+ justify-content: center;
9503
+ height: 2.25rem;
9504
+ padding-inline: 1.25rem;
9505
+ border-radius: var(--radius-md, 0.5rem);
9506
+ border: 1px solid var(--color-border, #e5e7eb);
9507
+ background-color: var(--color-white, #ffffff);
9508
+ color: var(--color-gray-700, #3d3f47);
9509
+ font-size: 0.875rem;
9510
+ font-weight: 600;
9511
+ cursor: pointer;
9512
+ transition: background-color 150ms ease, border-color 150ms ease;
9513
+ white-space: nowrap;
9514
+ }
9515
+
9516
+ .empty-state-action-btn:hover {
9517
+ background-color: var(--color-gray-50, #f9f9fa);
9518
+ border-color: var(--color-gray-300, #cbcdd2);
9519
+ }
9520
+
9521
+ .empty-state-action-btn:focus-visible {
9522
+ outline: 2px solid var(--color-primary, #2563eb);
9523
+ outline-offset: 2px;
9524
+ }
9525
+
9526
+ /* Primary variant */
9527
+ .empty-state-action-btn--primary {
9528
+ background-color: var(--color-primary, #2563eb);
9529
+ color: var(--color-white, #ffffff);
9530
+ border-color: transparent;
9531
+ }
9532
+
9533
+ .empty-state-action-btn--primary:hover {
9534
+ background-color: var(--color-blue-700, #286495);
9535
+ border-color: transparent;
9536
+ }
9537
+
9538
+ /* Outline variant */
9539
+ .empty-state-action-btn--outline {
9540
+ background-color: transparent;
9541
+ border-color: var(--color-gray-300, #cbcdd2);
9542
+ color: var(--color-gray-700, #3d3f47);
9543
+ }
9544
+
9545
+ .empty-state-action-btn--outline:hover {
9546
+ background-color: var(--color-gray-50, #f9f9fa);
9547
+ }
9548
+
9549
+ /* ─── SlotDefault card grid helper ───────────────────────────────────────── */
9550
+
9551
+ .empty-state-card {
9552
+ border: 1px solid var(--color-border, #e5e7eb);
9553
+ border-radius: var(--radius-md, 0.5rem);
9554
+ padding: 1rem;
9555
+ text-align: left;
9556
+ background-color: var(--color-surface, #ffffff);
9557
+ transition: box-shadow 150ms ease;
9558
+ }
9559
+
9560
+ .empty-state-card:hover {
9561
+ box-shadow:
9562
+ 0 1px 3px 0 rgb(0 0 0 / 0.08),
9563
+ 0 1px 8px 0 rgb(0 0 0 / 0.06);
9564
+ }
9565
+
9566
+ .empty-state-card-title {
9567
+ font-size: 0.9375rem;
9568
+ font-weight: 600;
9569
+ color: var(--color-gray-800, #2d2f36);
9570
+ margin-bottom: 0.25rem;
9571
+ }
9572
+
9573
+ .empty-state-card-desc {
9574
+ font-size: 0.8125rem;
9575
+ color: var(--color-gray-500, #71747d);
9576
+ line-height: 1.5;
9577
+ }
9578
+
9579
+ /* ─── Timeline ───────────────────────────────────────────────────────────── */
9580
+
9581
+ .timeline {
9582
+ display: flex;
9583
+ flex-direction: column;
9584
+ position: relative;
9585
+ padding-block: 0.5rem;
9586
+ }
9587
+
9588
+ /* ─── Horizontal direction ───────────────────────────────────────────────── */
9589
+
9590
+ .timeline--horizontal {
9591
+ flex-direction: row;
9592
+ align-items: flex-start;
9593
+ overflow-x: auto;
9594
+ }
9595
+
9596
+ .timeline--horizontal .timeline-item {
9597
+ flex-direction: column;
9598
+ align-items: center;
9599
+ flex: 1;
9600
+ min-width: 160px;
9601
+ }
9602
+
9603
+ .timeline--horizontal .timeline-item-stem {
9604
+ flex-direction: row;
9605
+ width: 100%;
9606
+ height: auto;
9607
+ align-items: center;
9608
+ }
9609
+
9610
+ .timeline--horizontal .timeline-item-stem-line {
9611
+ flex: 1;
9612
+ width: auto;
9613
+ height: 2px;
9614
+ }
9615
+
9616
+ .timeline--horizontal .timeline-item-opposite {
9617
+ order: -1; /* above the stem in horizontal mode */
9618
+ text-align: center;
9619
+ padding-block: 0 0.5rem;
9620
+ width: 100%;
9621
+ }
9622
+
9623
+ .timeline--horizontal .timeline-item-body {
9624
+ text-align: center;
9625
+ padding-top: 0.5rem;
9626
+ width: 100%;
9627
+ }
9628
+
9629
+ /* ─── Compact density ────────────────────────────────────────────────────── */
9630
+
9631
+ .timeline--compact .timeline-item {
9632
+ margin-bottom: 0.5rem;
9633
+ }
9634
+
9635
+ /* ─── Timeline Item ──────────────────────────────────────────────────────── */
9636
+
9637
+ .timeline-item {
9638
+ display: flex;
9639
+ align-items: center; /* overridden by --align-start */
9640
+ gap: 0.75rem;
9641
+ margin-bottom: 1rem;
9642
+ position: relative;
9643
+ }
9644
+
9645
+ /* Align-start: content aligns to top of dot */
9646
+ .timeline-item--align-start {
9647
+ align-items: flex-start;
9648
+ }
9649
+
9650
+ /* ─── Side: alternate (default) ──────────────────────────────────────────── */
9651
+ /*
9652
+ In "alternate" mode odd items: opposite left, stem center, body right.
9653
+ Even items flip. We achieve this by controlling the order of the three
9654
+ columns inside each .timeline-item.
9655
+ */
9656
+
9657
+ .timeline--side-alternate .timeline-item:nth-child(even) .timeline-item-opposite {
9658
+ order: 2;
9659
+ text-align: left;
9660
+ }
9661
+
9662
+ .timeline--side-alternate .timeline-item:nth-child(even) .timeline-item-stem {
9663
+ order: 1;
9664
+ }
9665
+
9666
+ .timeline--side-alternate .timeline-item:nth-child(even) .timeline-item-body {
9667
+ order: 0;
9668
+ text-align: right;
9669
+ }
9670
+
9671
+ /* ─── Side: end — all content on the right ───────────────────────────────── */
9672
+
9673
+ .timeline--side-end .timeline-item-opposite {
9674
+ display: none;
9675
+ }
9676
+
9677
+ /* ─── Side: start — all content on the left ─────────────────────────────── */
9678
+
9679
+ .timeline--side-start .timeline-item-opposite {
9680
+ display: none;
9681
+ }
9682
+
9683
+ .timeline--side-start .timeline-item-body {
9684
+ order: -1;
9685
+ }
9686
+
9687
+ /* ─── Opposite slot ──────────────────────────────────────────────────────── */
9688
+
9689
+ .timeline-item-opposite {
9690
+ flex: 1;
9691
+ text-align: right;
9692
+ font-size: 0.875rem;
9693
+ color: var(--color-gray-500, #71747d);
9694
+ min-width: 0;
9695
+ }
9696
+
9697
+ /* ─── Stem column (line + dot) ───────────────────────────────────────────── */
9698
+
9699
+ .timeline-item-stem {
9700
+ display: flex;
9701
+ flex-direction: column;
9702
+ align-items: center;
9703
+ flex-shrink: 0;
9704
+ align-self: stretch;
9705
+ }
9706
+
9707
+ .timeline-item-stem-line {
9708
+ width: 2px;
9709
+ background-color: var(--timeline-line-color, var(--color-gray-200, #dedfe3));
9710
+ flex: 1;
9711
+ min-height: 8px;
9712
+ }
9713
+
9714
+ /* Hide the "before" line on the very first item */
9715
+ .timeline-item:first-child .timeline-item-stem-line--before {
9716
+ visibility: hidden;
9717
+ }
9718
+
9719
+ /* Hide the "after" line on the very last item */
9720
+ .timeline-item:last-child .timeline-item-stem-line--after {
9721
+ visibility: hidden;
9722
+ }
9723
+
9724
+ /* ─── Dot ────────────────────────────────────────────────────────────────── */
9725
+
9726
+ .timeline-item-dot {
9727
+ display: flex;
9728
+ align-items: center;
9729
+ justify-content: center;
9730
+ border-radius: 50%;
9731
+ background-color: var(--color-surface, #ffffff);
9732
+ border: 2px solid var(--color-gray-300, #cbcdd2);
9733
+ flex-shrink: 0;
9734
+ position: relative;
9735
+ z-index: 1;
9736
+ transition: background-color 150ms ease, border-color 150ms ease;
9737
+ overflow: hidden; /* keeps avatar images clipped to circle */
9738
+ }
9739
+
9740
+ /* Size variants — dot diameter */
9741
+ .timeline-item--size-x-small .timeline-item-dot { width: 12px; height: 12px; }
9742
+ .timeline-item--size-small .timeline-item-dot { width: 16px; height: 16px; }
9743
+ .timeline-item--size-default .timeline-item-dot { width: 24px; height: 24px; }
9744
+ .timeline-item--size-large .timeline-item-dot { width: 32px; height: 32px; }
9745
+ .timeline-item--size-x-large .timeline-item-dot { width: 40px; height: 40px; }
9746
+
9747
+ /* fillDot — solid background instead of ring */
9748
+ .timeline-item--fill-dot .timeline-item-dot {
9749
+ border-color: transparent;
9750
+ }
9751
+
9752
+ /* When dotColor is set via inline style it automatically fills */
9753
+ .timeline-item-dot[style] {
9754
+ border-color: transparent;
9755
+ }
9756
+
9757
+ /* ─── Dot icon ───────────────────────────────────────────────────────────── */
9758
+
9759
+ .timeline-item-dot-icon {
9760
+ display: flex;
9761
+ align-items: center;
9762
+ justify-content: center;
9763
+ color: var(--timeline-icon-color, #ffffff);
9764
+ font-size: 0.625rem;
9765
+ font-weight: 700;
9766
+ width: 100%;
9767
+ height: 100%;
9768
+ line-height: 1;
9769
+ }
9770
+
9771
+ /* ─── Body ───────────────────────────────────────────────────────────────── */
9772
+
9773
+ .timeline-item-body {
9774
+ flex: 1;
9775
+ min-width: 0;
9776
+ padding-block: 0.25rem;
9777
+ font-size: 0.875rem;
9778
+ }
9779
+
9780
+ /* ─── hideDot ────────────────────────────────────────────────────────────── */
9781
+
9782
+ .timeline-item--hide-dot .timeline-item-dot {
9783
+ display: none;
9784
+ }
9785
+
9786
+ .timeline-item--hide-dot .timeline-item-stem-line {
9787
+ visibility: hidden;
9788
+ }
9789
+
9790
+ /* ─── Story helpers (used in .stories.tsx only) ──────────────────────────── */
9791
+
9792
+ .timeline-story-card {
9793
+ border: 1px solid var(--color-border, #e5e7eb);
9794
+ border-radius: var(--radius-md, 0.5rem);
9795
+ padding: 0.875rem 1rem;
9796
+ background: var(--color-surface, #ffffff);
9797
+ }
9798
+
9799
+ .timeline-story-card strong {
9800
+ display: block;
9801
+ font-size: 1rem;
9802
+ margin-bottom: 0.25rem;
9803
+ }
9804
+
9805
+ .timeline-story-card p {
9806
+ font-size: 0.875rem;
9807
+ color: var(--color-gray-500, #71747d);
9808
+ margin: 0;
9809
+ line-height: 1.5;
9810
+ }
9811
+
9812
+ .timeline-story-sub {
9813
+ font-size: 0.8125rem;
9814
+ color: var(--color-gray-500, #71747d);
9815
+ margin-top: 0.125rem;
9816
+ }
9817
+
9818
+ .timeline-story-opposite {
9819
+ font-size: 0.875rem;
9820
+ color: var(--color-gray-500, #71747d);
9821
+ font-style: italic;
9822
+ }
9823
+
9824
+ .timeline-story-btn {
9825
+ margin-top: 0.75rem;
9826
+ display: inline-flex;
9827
+ align-items: center;
9828
+ height: 2rem;
9829
+ padding-inline: 1rem;
9830
+ border-radius: var(--radius-md, 0.5rem);
9831
+ border: 1px solid var(--color-gray-300, #cbcdd2);
9832
+ background: transparent;
9833
+ font-size: 0.875rem;
9834
+ font-weight: 500;
9835
+ cursor: pointer;
9836
+ transition: background-color 150ms ease;
9837
+ }
9838
+
9839
+ .timeline-story-btn:hover {
9840
+ background-color: var(--color-gray-50, #f9f9fa);
9841
+ }
9842
+
9843
+ .timeline-alert {
9844
+ padding: 0.75rem 1rem;
9845
+ border-radius: var(--radius-md, 0.5rem);
9846
+ font-size: 0.875rem;
9847
+ line-height: 1.5;
9848
+ }
9849
+
9850
+ .timeline-alert--info {
9851
+ background-color: #eff6ff;
9852
+ border: 1px solid #bfdbfe;
9853
+ color: #1d4ed8;
9854
+ }
9855
+
9856
+ .timeline-alert--error {
9857
+ background-color: #fef2f2;
9858
+ border: 1px solid #fecaca;
9859
+ color: #b91c1c;
9860
+ }
9861
+
9862
+ .timeline-alert p {
9863
+ margin: 0.25rem 0 0;
9864
+ }
9865
+
9866
+ /* Chip used in OrderActivity story */
9867
+ .timeline-chip {
9868
+ display: inline-flex;
9869
+ align-items: center;
9870
+ padding: 0.125rem 0.5rem;
9871
+ border-radius: 9999px;
9872
+ background-color: #7c3aed;
9873
+ color: #ffffff;
9874
+ font-size: 0.625rem;
9875
+ font-weight: 700;
9876
+ letter-spacing: 0.04em;
9877
+ vertical-align: middle;
9878
+ margin-right: 0.25rem;
9879
+ }
9880
+
9881
+ /* Comment input + button */
9882
+ .timeline-comment-input {
9883
+ flex: 1;
9884
+ height: 2.25rem;
9885
+ padding-inline: 0.75rem;
9886
+ border: 1px solid var(--color-border, #e5e7eb);
9887
+ border-radius: var(--radius-md, 0.5rem);
9888
+ font-size: 0.875rem;
9889
+ outline: none;
9890
+ transition: border-color 150ms ease;
9891
+ }
9892
+
9893
+ .timeline-comment-input:focus {
9894
+ border-color: var(--color-primary, #2563eb);
9895
+ }
9896
+
9897
+ .timeline-comment-btn {
9898
+ height: 2.25rem;
9899
+ padding-inline: 0.875rem;
9900
+ border: none;
9901
+ background: transparent;
9902
+ font-size: 0.875rem;
9903
+ font-weight: 600;
9904
+ color: var(--color-primary, #2563eb);
9905
+ cursor: pointer;
9906
+ border-radius: var(--radius-md, 0.5rem);
9907
+ transition: background-color 150ms ease;
9908
+ }
9909
+
9910
+ .timeline-comment-btn:hover {
9911
+ background-color: var(--color-blue-50, #fbfdfe);
9912
+ }