@wwtdev/bsds-css 2.18.1 → 2.20.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 (31) hide show
  1. package/dist/components/_accordions.scss +20 -11
  2. package/dist/components/_alert.scss +128 -0
  3. package/dist/components/_banner.scss +25 -11
  4. package/dist/components/_circle-buttons.scss +6 -0
  5. package/dist/components/_dropdown.scss +7 -0
  6. package/dist/components/_form-field-details.scss +0 -1
  7. package/dist/components/_form-input-composite.scss +24 -13
  8. package/dist/components/_form-input-phone.scss +5 -0
  9. package/dist/components/_form-text-fields.scss +21 -19
  10. package/dist/components/_horizontal-navigation-mobile.scss +194 -0
  11. package/dist/components/_horizontal-navigation.scss +213 -0
  12. package/dist/components/_modal.scss +1 -1
  13. package/dist/components/_vertical-navigation.scss +231 -0
  14. package/dist/components/accordions.css +20 -11
  15. package/dist/components/alert.css +124 -0
  16. package/dist/components/banner.css +24 -10
  17. package/dist/components/circle-buttons.css +6 -0
  18. package/dist/components/dropdown.css +7 -0
  19. package/dist/components/form-field-details.css +0 -1
  20. package/dist/components/form-input-composite.css +24 -13
  21. package/dist/components/form-input-phone.css +5 -0
  22. package/dist/components/form-text-fields.css +21 -19
  23. package/dist/components/horizontal-navigation-mobile.css +190 -0
  24. package/dist/components/horizontal-navigation.css +209 -0
  25. package/dist/components/modal.css +1 -1
  26. package/dist/components/vertical-navigation.css +227 -0
  27. package/dist/wwt-bsds-preset.js +2 -1
  28. package/dist/wwt-bsds-wc-base.css +2 -0
  29. package/dist/wwt-bsds.css +2259 -1547
  30. package/dist/wwt-bsds.min.css +1 -1
  31. package/package.json +1 -1
package/dist/wwt-bsds.css CHANGED
@@ -366,6 +366,7 @@ button {
366
366
  --bs-border-base: var(--bs-gray-200);
367
367
  --bs-border-medium: var(--bs-gray-150);
368
368
  --bs-border-light: var(--bs-gray-100);
369
+ --bs-border-input: rgba(99, 66, 145, 0.75); /* --bs-violet-300 at .75 opacity */
369
370
 
370
371
  /* Spacing */
371
372
  --bs-content-top: 4rem;
@@ -451,6 +452,7 @@ button {
451
452
  --bs-border-base: rgba(163, 164, 183, 0.7); /* --bs-gray-300 at .7 opacity */
452
453
  --bs-border-medium: var(--bs-gray-400);
453
454
  --bs-border-light: rgba(78, 79, 95, 0.5); /* --bs-gray-400 at .5 opacity */
455
+ --bs-border-input: var(--bs-violet-200);
454
456
 
455
457
  --bs-shadow-base: rgba(0, 0, 0, 0.06);
456
458
  --bs-shadow-invert: rgba(10, 11, 25, 0.60);
@@ -904,15 +906,24 @@ a:where(.bs-link):where(:focus:not(:focus-visible)) {
904
906
  .bs-bg-light-to-base {
905
907
  background-color: var(--bs-bg-light-to-base);
906
908
  }
909
+ .bs-bg-light-to-medium {
910
+ background-color: var(--bs-bg-light-to-medium);
911
+ }
907
912
  .bs-bg-medium {
908
913
  background-color: var(--bs-bg-medium);
909
914
  }
910
915
  .bs-bg-medium-to-light {
911
916
  background-color: var(--bs-bg-medium-to-light);
912
917
  }
918
+ .bs-bg-medium-to-base {
919
+ background-color: var(--bs-bg-medium-to-base);
920
+ }
913
921
  .bs-bg-disabled {
914
922
  background-color: var(--bs-bg-disabled);
915
923
  }
924
+ .bs-bg-invert-to-light {
925
+ background-color: var(--bs-bg-invert-to-light);
926
+ }
916
927
  .bs-bg-invert-to-medium {
917
928
  background-color: var(--bs-bg-invert-to-medium);
918
929
  }
@@ -934,6 +945,9 @@ a:where(.bs-link):where(:focus:not(:focus-visible)) {
934
945
  .bs-border-dark {
935
946
  border-color: var(--bs-border-dark);
936
947
  }
948
+ .bs-border-input {
949
+ border-color: var(--bs-border-input);
950
+ }
937
951
  .bs-border-atom-ai {
938
952
  /* border-image (which is needed for the border gradient) cannot be combined with border-radius 🤷‍♂️ */
939
953
  /* this uses the background-clip property, which is compatible */
@@ -1348,7 +1362,8 @@ a:where(.bs-link):where(:focus:not(:focus-visible)) {
1348
1362
  }
1349
1363
  }
1350
1364
  /* Accordion Panel (Icon, Title, Caret) */
1351
- .bs-accordion :where(header button) {
1365
+ .bs-accordion :where(.bs-accordion-toggle),
1366
+ .bs-accordion > :where(header) > :where(button) {
1352
1367
  align-items: center;
1353
1368
  background-color: var(--bs-bg-base);
1354
1369
  border: 0px solid transparent;
@@ -1368,40 +1383,48 @@ a:where(.bs-link):where(:focus:not(:focus-visible)) {
1368
1383
  text-decoration: none;
1369
1384
  width: 100%;
1370
1385
  }
1371
- .bs-accordion :where(header button:focus-visible) {
1386
+ .bs-accordion :where(.bs-accordion-toggle:focus-visible),
1387
+ .bs-accordion > :where(header) > :where(button:focus-visible) {
1372
1388
  --accordion-outline-color: var(--bs-blue-base);
1373
1389
  }
1374
- .bs-accordion :where(header button) > * {
1390
+ .bs-accordion :where(.bs-accordion-toggle) > *,
1391
+ .bs-accordion > :where(header) > :where(button) > * {
1375
1392
  font-size: inherit;
1376
1393
  font-weight: inherit;
1377
1394
  line-height: inherit;
1378
1395
  }
1379
- .bs-accordion :where(header button) > :where(span) {
1396
+ .bs-accordion :where(.bs-accordion-toggle) > *,
1397
+ .bs-accordion > :where(header) > :where(button) > * {
1380
1398
  grid-area: main;
1381
1399
  margin-right: var(--bs-space-2);
1382
1400
  text-align: left;
1383
1401
  }
1384
- .bs-accordion :where(header button) > :where(span) {
1402
+ .bs-accordion :where(.bs-accordion-toggle) > *,
1403
+ .bs-accordion > :where(header) > :where(button) > * {
1385
1404
  vertical-align: middle;
1386
1405
  }
1387
1406
  @media (min-width: 957px) {
1388
- .bs-accordion :where(header button) > :where(span) {
1407
+ .bs-accordion :where(.bs-accordion-toggle) > * ,
1408
+ .bs-accordion > :where(header) > :where(button) > * {
1389
1409
  margin-right: var(--bs-space-3);
1390
1410
  }
1391
1411
  }
1392
- .bs-accordion :where(header button) :where([data-position]) {
1412
+ .bs-accordion :where(.bs-accordion-toggle) :where([data-position]),
1413
+ .bs-accordion > :where(header) > :where(button) :where([data-position]) {
1393
1414
  width: var(--accordion-text-size);
1394
1415
  }
1395
- .bs-accordion :where(header button) > :where([data-position="start"]) {
1416
+ .bs-accordion :where(.bs-accordion-toggle) > :where([data-position="start"]),
1417
+ .bs-accordion > :where(header) > :where(button) > :where([data-position="start"]) {
1396
1418
  grid-area: start;
1397
1419
  margin-right: var(--bs-space-2);
1398
1420
  }
1399
- .bs-accordion :where(header button) > :where([data-position="end"]) {
1421
+ .bs-accordion :where(.bs-accordion-toggle) > :where([data-position="end"]),
1422
+ .bs-accordion > :where(header) > :where(button) > :where([data-position="end"]) {
1400
1423
  grid-area: end;
1401
1424
  transform: rotate(0);
1402
1425
  transition: var(--bs-trans-rotate180);
1403
1426
  }
1404
- .bs-accordion :where(header[data-open]:not([data-open="false"])) :where([data-position="end"]) {
1427
+ .bs-accordion > :where(header[data-open]:not([data-open="false"])) :where([data-position="end"]) {
1405
1428
  transform: rotate(180deg);
1406
1429
  }
1407
1430
  /* Accordion Content (the collapsible / expandible part) */
@@ -1424,6 +1447,113 @@ a:where(.bs-link):where(:focus:not(:focus-visible)) {
1424
1447
  :where(.bs-accordion[data-stacked]:not([data-stacked="false"])) + .bs-accordion:where([data-stacked]:not([data-stacked="false"])) {
1425
1448
  border-block-start-color: transparent;
1426
1449
  }
1450
+ .bs-alert {
1451
+ /* bs-blue-100 @ 10% */
1452
+ background-color: #99cff71a;
1453
+ border-radius: 8px;
1454
+ border: 2px solid var(--bs-ink-blue);
1455
+ -moz-column-gap: 0.75rem;
1456
+ column-gap: 0.75rem;
1457
+ display: grid;
1458
+ grid-template-columns: 1.25rem 1fr 1rem;
1459
+ grid-template-areas: "icon title close"
1460
+ ". description ."
1461
+ ". action .";
1462
+ padding: 1rem;
1463
+ }
1464
+ @media (min-width: 752px) {
1465
+ .bs-alert {
1466
+ padding: 1.5rem;
1467
+ }
1468
+ }
1469
+ .bs-alert:where([data-horizontal="true"]) {
1470
+ grid-template-columns: 1.25rem 1fr 1rem;
1471
+ grid-template-areas: "icon title close"
1472
+ ". action .";
1473
+ }
1474
+ @media (min-width: 752px) {
1475
+ .bs-alert:where([data-horizontal="true"]) {
1476
+ grid-template-areas: "icon title action close";
1477
+ grid-template-columns: 1.25rem max-content 1fr 1rem;
1478
+ }
1479
+ }
1480
+ .bs-alert :where(.bs-alert-icon) {
1481
+ align-self: center;
1482
+ color: var(--bs-ink-blue);
1483
+ grid-area: icon;
1484
+ height: 1.25rem;
1485
+ width: 1.25rem;
1486
+ }
1487
+ .bs-alert :where(.bs-alert-title) {
1488
+ font-size: 1.125rem;
1489
+ grid-area: title;
1490
+ }
1491
+ @media (min-width: 752px) {
1492
+ .bs-alert :where(.bs-alert-title) {
1493
+ font-size: 1.25rem;
1494
+ }
1495
+ }
1496
+ .bs-alert :where(.bs-alert-description) {
1497
+ font-size: 0.875rem;
1498
+ grid-area: description;
1499
+ margin-top: 0.5rem;
1500
+ }
1501
+ @media (min-width: 752px) {
1502
+ .bs-alert :where(.bs-alert-description) {
1503
+ font-size: 1rem;
1504
+ }
1505
+ }
1506
+ .bs-alert:where([data-horizontal="true"]) :where(.bs-alert-description) {
1507
+ display: none;
1508
+ }
1509
+ .bs-alert :where(.bs-alert-close) {
1510
+ align-self: center;
1511
+ background-color: transparent;
1512
+ cursor: pointer;
1513
+ grid-area: close;
1514
+ height: 1rem;
1515
+ width: 1rem;
1516
+ }
1517
+ .bs-alert :where(.bs-alert-action) {
1518
+ grid-area: action;
1519
+ margin-top: 1rem;
1520
+ }
1521
+ @media (min-width: 752px) {
1522
+ .bs-alert:where([data-horizontal="true"]) :where(.bs-alert-action) {
1523
+ margin-top: 0;
1524
+ }
1525
+ }
1526
+ /* COLOR VARIANTS */
1527
+ .bs-alert:where([data-variant="success"]) {
1528
+ /* bs-purple-100 @ 10% */
1529
+ background-color: #e0c5ef1a;
1530
+ border-color: var(--bs-ink-purple);
1531
+ }
1532
+ .bs-alert:where([data-variant="success"]) :where(.bs-alert-icon) {
1533
+ color: var(--bs-ink-purple);
1534
+ }
1535
+ .bs-alert:where([data-variant="warning"]) {
1536
+ /* bs-orange-100 @ 10% */
1537
+ background-color: #f3c4a81a;
1538
+ border-color: var(--bs-ink-orange);
1539
+ }
1540
+ .bs-alert:where([data-variant="warning"]) :where(.bs-alert-icon) {
1541
+ color: var(--bs-ink-orange);
1542
+ }
1543
+ .bs-alert:where([data-variant="negative"]) {
1544
+ /* bs-red-100 @ 10% */
1545
+ background-color: #f8a9aa1a;
1546
+ border-color: var(--bs-ink-red);
1547
+ }
1548
+ .bs-alert:where([data-variant="negative"]) :where(.bs-alert-icon) {
1549
+ color: var(--bs-ink-red);
1550
+ }
1551
+ /* DARK MODE SPECIAL CASE */
1552
+ .dark .bs-alert :where(.bs-alert-action) {
1553
+ --btn-border-color-focused: var(--bs-text-base);
1554
+ --btn-text-color: var(--bs-text-base);
1555
+ --btn-text-color-hovered: var(--bs-text-base);
1556
+ }
1427
1557
  .bs-badge {
1428
1558
  --badge-bg: var(--bs-red-400);
1429
1559
  --badge-text: var(--bs-white);
@@ -1500,15 +1630,20 @@ a:where(.bs-link):where(:focus:not(:focus-visible)) {
1500
1630
  margin: 0;
1501
1631
  top: unset;
1502
1632
  }
1633
+ :where(.bs-banner) {
1634
+ --banner-bg: var(--bs-royal-400);
1635
+ --banner-icon-display: none;
1636
+ --banner-padding: var(--banner-padding-m);
1637
+ --banner-padding-m: 1rem 1.5rem;
1638
+ --banner-padding-dt: .5rem 2.25rem;
1639
+ }
1503
1640
  .bs-banner {
1504
- background-color: var(--bs-royal-400);
1505
- color: var(--bs-gray-100);
1641
+ background-color: var(--banner-bg);
1642
+ color: var(--bs-ink-white);
1506
1643
  display: flex;
1507
1644
  justify-content: center;
1508
- padding-bottom: 1rem;
1509
- padding-left: 1.25rem;
1510
- padding-right: 1.25rem;
1511
- padding-top: 1rem;
1645
+ min-height: 3rem;
1646
+ padding: var(--banner-padding);
1512
1647
  }
1513
1648
  .bs-banner:where([data-dismissed]:not([data-dismissed="false"])) {
1514
1649
  display: none;
@@ -1522,7 +1657,7 @@ a:where(.bs-link):where(:focus:not(:focus-visible)) {
1522
1657
  }
1523
1658
  .bs-banner :where(.bs-banner-content .bs-banner-warning-icon) {
1524
1659
  /* Do not display icon on smaller screens */
1525
- display: none;
1660
+ display: var(--banner-icon-display);
1526
1661
  margin-right: 0.625rem;
1527
1662
  }
1528
1663
  .bs-banner :where(.bs-banner-content p) {
@@ -1530,129 +1665,394 @@ a:where(.bs-link):where(:focus:not(:focus-visible)) {
1530
1665
  padding-right: 1.25rem;
1531
1666
  }
1532
1667
  .bs-banner :where(.bs-banner-content p a) {
1533
- color: var(--bs-blue-lightest);
1534
1668
  text-decoration: underline;
1535
1669
  }
1670
+ .bs-banner :where(a:hover) {
1671
+ color: rgba(255, 255, 255, 0.8);
1672
+ }
1536
1673
  .bs-banner :where(.bs-banner-content button) {
1537
1674
  background-color: inherit;
1538
1675
  color: inherit;
1539
1676
  cursor: pointer;
1540
1677
  }
1678
+ .bs-banner:where([data-variant="negative"]) {
1679
+ --banner-bg: var(--bs-red-300);
1680
+ }
1541
1681
  @media (min-width: 957px) {
1542
- .bs-banner :where(.bs-banner-content .bs-banner-warning-icon) {
1543
- display: inline-flex;
1682
+ .bs-banner {
1683
+ --banner-icon-display: inline-flex;
1684
+ --banner-padding: var(--banner-padding-dt);
1544
1685
  }
1545
1686
  }
1546
- .bs-chart {
1547
- display: block;
1548
- height: 100%;
1549
- width: 100%;
1550
- }
1551
- .bs-chart :where(figure) {
1552
- -moz-column-gap: 2.5rem;
1553
- column-gap: 2.5rem;
1554
- display: grid;
1555
- font-size: .875rem;
1556
- grid-template-areas: var(--chart-gridareas, "chart" "legend");
1557
- grid-template-columns: var(--chart-gridcols, 100%);
1558
- grid-template-rows: var(--chart-gridrows, minmax(0px, auto) minmax(0px, min-content));
1559
- height: 100%;
1560
- margin-block: unset;
1561
- margin-inline: unset;
1687
+ /*
1688
+ --btn-main: (this is doing too much.. look into backwards-compatible way to break this up)
1689
+ background color (base)
1690
+ focus ring color
1691
+
1692
+ background colors:
1693
+ --btn-secondary: background color (active, hover)
1694
+ --btn-light: background color (ghost hover, ghost focus)
1695
+
1696
+ border / box-shadow:
1697
+ --btn-ghost-ink: the box shadow color for ghost buttons is synced to ink
1698
+ --btn-highlight: box shadow color (w/ --btn-main) (active)
1699
+
1700
+ padding:
1701
+ --btn-padding: padding (changes by size, and on text btns)
1702
+
1703
+ text color:
1704
+ --btn-ink: text color
1705
+ --btn-ghost-ink: text color (ghost)
1706
+
1707
+ */
1708
+ .bs-button {
1709
+ --btn-focus-inset: -0.25rem;
1710
+ --btn-focus-pseudo-width: calc(100% + 0.5rem);
1711
+ --btn-ghost-ink: var(--bs-ink-blue);
1712
+ --btn-highlight: var(--bs-blue-100);
1713
+ --btn-ink: var(--bs-white);
1714
+ --btn-main: var(--bs-blue-400);
1715
+ --btn-padding: .25rem .75rem;
1716
+ --btn-secondary: var(--bs-blue-medium);
1717
+ --btn-text-size: var(--bs-text-md);
1718
+ --btn-weight: 600;
1719
+ --btn-height: 2.5rem;
1720
+ align-items: center;
1721
+ background-color: var(--btn-main);
1722
+ border: none;
1723
+ border-radius: 0.25rem;
1724
+ color: var(--btn-ink);
1725
+ -moz-column-gap: var(--bs-space-2);
1726
+ column-gap: var(--bs-space-2);
1727
+ cursor: pointer;
1728
+ display: inline-flex;
1729
+ font-size: var(--btn-text-size);
1730
+ font-weight: var(--btn-weight);
1731
+ height: var(--btn-height);
1732
+ justify-content: center;
1733
+ line-height: 1.5;
1734
+ outline: 2px solid transparent;
1735
+ padding: var(--btn-padding);
1562
1736
  position: relative;
1563
- width: 100%;
1737
+ text-decoration: none;
1738
+ transition: all 100ms ease-in-out;
1739
+ vertical-align: middle;
1564
1740
  }
1565
- .bs-chart :where(figure > :first-child) {
1566
- grid-area: chart;
1741
+ .bs-button:where(:not(:disabled):not([aria-disabled="true"]):hover) {
1742
+ background-color: var(--btn-secondary);
1567
1743
  }
1568
- .bs-chart :where(figure > :last-child) {
1569
- grid-area: legend;
1744
+ .bs-button:where(:not(:disabled):not([aria-disabled="true"]):active) {
1745
+ background-color: var(--btn-secondary);
1746
+ box-shadow: inset 0px 0px 4px 1px var(--btn-main);
1747
+ transform-origin: center;
1748
+ transform: scale(0.97);
1570
1749
  }
1571
- .bs-chart :where(figure > div) {
1572
- min-width: 100%;
1573
- width: 100%;
1750
+ /* ------------ Focus Styles ------------ */
1751
+ .bs-button::before {
1752
+ border-color: transparent;
1753
+ border-radius: 0.5rem;
1754
+ border-style: solid;
1755
+ border-width: 0.125rem;
1756
+ content: '';
1757
+ height: calc(100% + 0.5rem);
1758
+ inset: var(--btn-focus-inset);
1759
+ position: absolute;
1760
+ transition: border-color 0.125s ease-in-out;
1761
+ width: var(--btn-focus-pseudo-width);
1574
1762
  }
1575
- .bs-chart :where(canvas) {
1576
- width: 100%;
1763
+ .bs-button:where(:focus:not(:disabled):not([aria-disabled="true"]))::before {
1764
+ border-color: var(--btn-main);
1577
1765
  }
1578
- /* --------- Legend Styles --------- */
1579
- .bs-chart :where(figcaption) {
1580
- background-color: var(--legend-bg-color, transparent);
1581
- border-radius: .5rem;
1582
- border: 1px solid var(--legend-border-color, transparent);
1583
- clip-path: var(--legend-clip-path, none);
1584
- max-height: var(--legend-max-height, 100%);
1585
- overflow-y: var(--legend-overflow-y, hidden);
1766
+ .bs-button:where(:focus-visible:not(:disabled):not([aria-disabled="true"]))::before {
1767
+ border-color: var(--btn-main);
1768
+ box-shadow: none;
1586
1769
  }
1587
- .bs-chart :where(figcaption[data-hidden="true"]) {
1588
- border: 0;
1589
- clip: rect(0 0 0 0);
1590
- height: 1px;
1591
- margin: 0;
1592
- overflow: hidden;
1593
- padding: 0;
1594
- position: absolute;
1595
- white-space: nowrap;
1596
- width: 1px;
1770
+ .bs-button:where(:focus:not(:focus-visible):not(:disabled):not([aria-disabled="true"]))::before {
1771
+ border-color: transparent;
1772
+ box-shadow: none;
1597
1773
  }
1598
- .bs-chart :where(ul) {
1599
- align-items: var(--legend-flexalign, center);
1600
- display: flex;
1601
- -moz-column-gap: 2.5rem;
1602
- column-gap: 2.5rem;
1603
- flex-direction: var(--legend-flexdir, row);
1604
- flex-wrap: var(--legend-flexwrap, wrap);
1605
- padding-block: var(--legend-padding-block, .25rem);
1606
- /* cjs-legend-padding is set dynamically by chart.js for bar charts */
1607
- padding-inline: var(--legend-padding-inline, var(--cjs-legend-padding-inline, 2.5rem));
1608
- row-gap: .75rem;
1774
+ /* ------------ Ghost Buttons ------------ */
1775
+ .bs-button:where([data-ghost]:not([data-ghost="false"])) {
1776
+ --btn-ink: var(--btn-ghost-ink);
1777
+ --btn-light: var(--bs-blue-10);
1778
+ --btn-secondary: var(--bs-blue-10);
1779
+ background-color: transparent;
1780
+ box-shadow: inset 0 0 0 1px var(--btn-ghost-ink);
1609
1781
  }
1610
- .bs-chart :where(li, li:focus, li:active, li:focus-visible) {
1611
- align-items: center;
1612
- cursor: pointer;
1613
- display: flex;
1614
- flex-direction: row;
1615
- outline: 0;
1616
- position: relative;
1617
- width: var(--legend-item-width, auto);
1782
+ .bs-button:where([data-ghost]:not([data-ghost="false"]))::before {
1783
+ border-radius: 0.4375rem;
1618
1784
  }
1619
- .bs-chart :where(li)::after {
1620
- border: solid var(--focus-color, transparent) 2px;
1621
- border-radius: 0.25rem;
1622
- content: '';
1623
- display: block;
1624
- inset: -.25rem;
1625
- position: absolute;
1785
+ .bs-button:where([data-ghost]:not([data-ghost="false"]):not(:disabled):not([aria-disabled="true"]):hover),
1786
+ .bs-button:where([data-ghost]:not([data-ghost="false"]):not(:disabled):not([aria-disabled="true"]):focus) {
1787
+ background-color: var(--btn-light);
1626
1788
  }
1627
- .bs-chart :where(li:focus-visible) {
1628
- --focus-color: var(--bs-blue-base);
1789
+ .bs-button:where([data-ghost]:not([data-ghost="false"]):not(:disabled):not([aria-disabled="true"]):active) {
1790
+ box-shadow:
1791
+ inset 0 0 0 1px var(--btn-main),
1792
+ inset 0px 0px 4px 1px var(--btn-highlight);
1629
1793
  }
1630
- .bs-chart :where(li span) {
1631
- background: var(--legend-item-box-fill);
1632
- border-color: var(--legend-item-box-stroke);
1633
- border-radius: var(--legend-item-swatch-radius, 3px);
1634
- display: inline-block;
1635
- height: var(--bs-text-f-md);
1636
- margin-right: 10px;
1637
- width: var(--bs-text-f-md);
1794
+ /* ------------ VARIANTS ------------ */
1795
+ .bs-button:where([data-variant^='secondary']) {
1796
+ --btn-ghost-ink: var(--bs-ink-plum);
1797
+ --btn-highlight: var(--bs-plum-100);
1798
+ --btn-light: var(--bs-plum-10);
1799
+ --btn-main: var(--bs-plum-base);
1800
+ --btn-secondary: var(--bs-plum-medium);
1638
1801
  }
1639
- .bs-chart :where(li p) {
1640
- color: var(--legend-item-text-color);
1641
- font-size: var(--bs-text-f-md);
1642
- margin: 0;
1643
- padding: 0;
1644
- -webkit-text-decoration: var(--legend-item-text-decoration);
1645
- text-decoration: var(--legend-item-text-decoration);
1802
+ .dark .bs-button:where([data-variant^='secondary']) {
1803
+ --btn-highlight: var(--bs-plum-400);
1804
+ --btn-light: var(--bs-navy-400);
1646
1805
  }
1647
- /* --------- Chart Layout Variants --------- */
1648
- /*
1649
- For now, per design team instructions, these are NOT responsive as we're only to expose these
1650
- variants for a very specific, single use-case that involves horizontal scroll...
1651
- If we want to make these responsive in the future, can wrap in media query.
1652
- */
1653
- .bs-chart:where([data-layout="chart-right"], [data-layout="chart-left"]) {
1654
- --chart-gridrows: minmax(0px, auto);
1655
- --legend-bg-color: var(--bs-bg-base);
1806
+ .bs-button:where([data-variant^='positive']) {
1807
+ --btn-ghost-ink: var(--bs-ink-purple);
1808
+ --btn-highlight: var(--bs-purple-100);
1809
+ --btn-light: var(--bs-purple-10);
1810
+ --btn-main: var(--bs-purple-400);
1811
+ --btn-secondary: var(--bs-purple-medium);
1812
+ }
1813
+ .bs-button:where([data-variant^='warning']) {
1814
+ --btn-ghost-ink: var(--bs-ink-orange);
1815
+ --btn-highlight: var(--bs-orange-100);
1816
+ --btn-light: var(--bs-orange-10);
1817
+ --btn-main: var(--bs-orange-warning);
1818
+ --btn-secondary: var(--bs-orange-base);
1819
+ }
1820
+ .bs-button:where([data-variant^='negative']) {
1821
+ --btn-ghost-ink: var(--bs-ink-red);
1822
+ --btn-highlight: var(--bs-red-100);
1823
+ --btn-light: var(--bs-red-10);
1824
+ --btn-main: var(--bs-red-400);
1825
+ --btn-secondary: var(--bs-red-medium);
1826
+ }
1827
+ /* pink variant */
1828
+ .bs-button:where([data-variant^='pink']) {
1829
+ --btn-ghost-ink: var(--bs-ink-pink);
1830
+ --btn-highlight: var(--bs-pink-400);
1831
+ --btn-light: var(--bs-pink-10);
1832
+ --btn-main: var(--bs-pink-400);
1833
+ --btn-secondary: var(--bs-pink-300);
1834
+ }
1835
+ /* royal blue variant */
1836
+ .bs-button:where([data-variant^='royal']) {
1837
+ --btn-ghost-ink: var(--bs-ink-royal);
1838
+ --btn-highlight: var(--bs-royal-400);
1839
+ --btn-light: var(--bs-royal-10);
1840
+ --btn-main: var(--bs-royal-400);
1841
+ --btn-secondary: var(--bs-royal-300);
1842
+ }
1843
+ /* white variant - for dark backgrounds + ghost btn or text btn only */
1844
+ .bs-button:where([data-variant^='white'][data-ghost]:not([data-ghost="false"])) {
1845
+ --btn-ghost-ink: var(--bs-ink-white);
1846
+ --btn-highlight: var(--bs-ink-white);
1847
+ --btn-light: var(--bs-white-10);
1848
+ --btn-main: var(--bs-ink-white);
1849
+ }
1850
+ /* ------------ Text Button ------------ */
1851
+ .bs-button:where([data-text]:not([data-text="false"])) {
1852
+ --btn-focus-inset: -0.25rem -0.5rem;
1853
+ --btn-focus-pseudo-width: calc(100% + 1rem); /* text btns don't have side padding, but we do want focus outline to look padded */
1854
+ --btn-height: auto;
1855
+ --btn-ink: var(--bs-ink-blue);
1856
+ --btn-padding: 0;
1857
+ --btn-secondary: transparent;
1858
+ --btn-text-size: var(--bs-text-md);
1859
+ --btn-weight: 400;
1860
+ background-color: transparent;
1861
+ cursor: pointer;
1862
+ line-height: 150%;
1863
+ }
1864
+ .bs-button:where([data-text]:not([data-text="false"]):not(:disabled):not([aria-disabled="true"]):hover) {
1865
+ --btn-ink: var(--bs-blue-base);
1866
+ background-color: transparent;
1867
+ text-decoration: underline;
1868
+ }
1869
+ .bs-button:where([data-text]:not([data-text="false"]):not(:disabled):not([aria-disabled="true"]):hover):has(svg) {
1870
+ text-decoration: none;
1871
+ }
1872
+ .bs-button:where([data-text]:not([data-text="false"]):not(:disabled):not([aria-disabled="true"]):active) {
1873
+ box-shadow: none;
1874
+ transform: none;
1875
+ }
1876
+ .bs-button:where([data-variant^='negative'][data-text]:not([data-text="false"])),
1877
+ .bs-button:where([data-variant^='negative'][data-text]:not([data-text="false"]):not(:disabled):not([aria-disabled="true"]):hover) {
1878
+ --btn-ink: var(--bs-ink-red);
1879
+ }
1880
+ .bs-button:where([data-variant^='white'][data-text]:not([data-text="false"])),
1881
+ .bs-button:where([data-variant^='white'][data-text]:not([data-text="false"]):not(:disabled):not([aria-disabled="true"]):hover) {
1882
+ --btn-ink: var(--bs-ink-white);
1883
+ --btn-main: var(--bs-ink-white);
1884
+ }
1885
+ /* ------------ Button Sizes, Media-based Text Sizing -------------- */
1886
+ /* Std button: Mobile text size, DT text size */
1887
+ .bs-button {
1888
+ --btn-text-size: 1rem;
1889
+ }
1890
+ @media (min-width: 1166px) {
1891
+ .bs-button {
1892
+ --btn-text-size: 1.125rem;
1893
+ }
1894
+ }
1895
+ .bs-button:where([data-size^='sm']) {
1896
+ --btn-height: 1.75rem;
1897
+ --btn-padding: .25rem .75rem .375rem;
1898
+ /* Std button size="sm" text size is same across all media sizes */
1899
+ --btn-text-size: var(--bs-text-sm);
1900
+ }
1901
+ /* Text buttons: For now, text size not dependent on media size */
1902
+ .bs-button:where([data-text]:not([data-text="false"])) {
1903
+ --btn-height: auto;
1904
+ --btn-padding: 0;
1905
+ --btn-text-size: var(--bs-text-md);
1906
+ }
1907
+ .bs-button:where([data-size^='sm'][data-text]:not([data-text="false"])) {
1908
+ --btn-text-size: var(--bs-text-base);
1909
+ }
1910
+ /* Size XS & XXS only applies to text buttons */
1911
+ .bs-button:where([data-size^='xs'][data-text]:not([data-text="false"])) {
1912
+ --btn-text-size: var(--bs-text-sm);
1913
+ }
1914
+ .bs-button:where([data-size^='xxs'][data-text]:not([data-text="false"])) {
1915
+ --btn-text-size: var(--bs-text-xs);
1916
+ --btn-weight: 600;
1917
+ }
1918
+ /* ------------ Disabled Styling ------------ */
1919
+ :where(button:disabled),
1920
+ .bs-button:where(:disabled),
1921
+ .bs-button:where([aria-disabled="true"]) /* for links as buttons */ {
1922
+ pointer-events: none;
1923
+ }
1924
+ .bs-button:where(:disabled),
1925
+ .bs-button:where([aria-disabled="true"]) {
1926
+ --btn-ink: var(--bs-ink-disabled);
1927
+ --btn-main: var(--bs-bg-disabled);
1928
+ box-shadow: none;
1929
+ transform: none;
1930
+ }
1931
+ .bs-button:where([data-ghost]:not([data-ghost="false"])):disabled,
1932
+ .bs-button:where([data-ghost]:not([data-ghost="false"]))[aria-disabled="true"] {
1933
+ --btn-ghost-ink: var(--bs-ink-disabled);
1934
+ }
1935
+ .bs-button:where([data-text]:not([data-text="false"])):disabled,
1936
+ .bs-button:where([data-text]:not([data-text="false"]))[aria-disabled="true"] {
1937
+ --btn-main: transparent;
1938
+ }
1939
+ /* ------------ links as buttons ------------ */
1940
+ a.bs-button {
1941
+ align-items: center;
1942
+ display: inline-flex;
1943
+ outline: none;
1944
+ vertical-align: middle;
1945
+ }
1946
+ .bs-chart {
1947
+ display: block;
1948
+ height: 100%;
1949
+ width: 100%;
1950
+ }
1951
+ .bs-chart :where(figure) {
1952
+ -moz-column-gap: 2.5rem;
1953
+ column-gap: 2.5rem;
1954
+ display: grid;
1955
+ font-size: .875rem;
1956
+ grid-template-areas: var(--chart-gridareas, "chart" "legend");
1957
+ grid-template-columns: var(--chart-gridcols, 100%);
1958
+ grid-template-rows: var(--chart-gridrows, minmax(0px, auto) minmax(0px, min-content));
1959
+ height: 100%;
1960
+ margin-block: unset;
1961
+ margin-inline: unset;
1962
+ position: relative;
1963
+ width: 100%;
1964
+ }
1965
+ .bs-chart :where(figure > :first-child) {
1966
+ grid-area: chart;
1967
+ }
1968
+ .bs-chart :where(figure > :last-child) {
1969
+ grid-area: legend;
1970
+ }
1971
+ .bs-chart :where(figure > div) {
1972
+ min-width: 100%;
1973
+ width: 100%;
1974
+ }
1975
+ .bs-chart :where(canvas) {
1976
+ width: 100%;
1977
+ }
1978
+ /* --------- Legend Styles --------- */
1979
+ .bs-chart :where(figcaption) {
1980
+ background-color: var(--legend-bg-color, transparent);
1981
+ border-radius: .5rem;
1982
+ border: 1px solid var(--legend-border-color, transparent);
1983
+ clip-path: var(--legend-clip-path, none);
1984
+ max-height: var(--legend-max-height, 100%);
1985
+ overflow-y: var(--legend-overflow-y, hidden);
1986
+ }
1987
+ .bs-chart :where(figcaption[data-hidden="true"]) {
1988
+ border: 0;
1989
+ clip: rect(0 0 0 0);
1990
+ height: 1px;
1991
+ margin: 0;
1992
+ overflow: hidden;
1993
+ padding: 0;
1994
+ position: absolute;
1995
+ white-space: nowrap;
1996
+ width: 1px;
1997
+ }
1998
+ .bs-chart :where(ul) {
1999
+ align-items: var(--legend-flexalign, center);
2000
+ display: flex;
2001
+ -moz-column-gap: 2.5rem;
2002
+ column-gap: 2.5rem;
2003
+ flex-direction: var(--legend-flexdir, row);
2004
+ flex-wrap: var(--legend-flexwrap, wrap);
2005
+ padding-block: var(--legend-padding-block, .25rem);
2006
+ /* cjs-legend-padding is set dynamically by chart.js for bar charts */
2007
+ padding-inline: var(--legend-padding-inline, var(--cjs-legend-padding-inline, 2.5rem));
2008
+ row-gap: .75rem;
2009
+ }
2010
+ .bs-chart :where(li, li:focus, li:active, li:focus-visible) {
2011
+ align-items: center;
2012
+ cursor: pointer;
2013
+ display: flex;
2014
+ flex-direction: row;
2015
+ outline: 0;
2016
+ position: relative;
2017
+ width: var(--legend-item-width, auto);
2018
+ }
2019
+ .bs-chart :where(li)::after {
2020
+ border: solid var(--focus-color, transparent) 2px;
2021
+ border-radius: 0.25rem;
2022
+ content: '';
2023
+ display: block;
2024
+ inset: -.25rem;
2025
+ position: absolute;
2026
+ }
2027
+ .bs-chart :where(li:focus-visible) {
2028
+ --focus-color: var(--bs-blue-base);
2029
+ }
2030
+ .bs-chart :where(li span) {
2031
+ background: var(--legend-item-box-fill);
2032
+ border-color: var(--legend-item-box-stroke);
2033
+ border-radius: var(--legend-item-swatch-radius, 3px);
2034
+ display: inline-block;
2035
+ height: var(--bs-text-f-md);
2036
+ margin-right: 10px;
2037
+ width: var(--bs-text-f-md);
2038
+ }
2039
+ .bs-chart :where(li p) {
2040
+ color: var(--legend-item-text-color);
2041
+ font-size: var(--bs-text-f-md);
2042
+ margin: 0;
2043
+ padding: 0;
2044
+ -webkit-text-decoration: var(--legend-item-text-decoration);
2045
+ text-decoration: var(--legend-item-text-decoration);
2046
+ }
2047
+ /* --------- Chart Layout Variants --------- */
2048
+ /*
2049
+ For now, per design team instructions, these are NOT responsive as we're only to expose these
2050
+ variants for a very specific, single use-case that involves horizontal scroll...
2051
+ If we want to make these responsive in the future, can wrap in media query.
2052
+ */
2053
+ .bs-chart:where([data-layout="chart-right"], [data-layout="chart-left"]) {
2054
+ --chart-gridrows: minmax(0px, auto);
2055
+ --legend-bg-color: var(--bs-bg-base);
1656
2056
  --legend-border-color: var(--bs-gray-light);
1657
2057
  --legend-clip-path: border-box;
1658
2058
  --legend-flexalign: start;
@@ -1694,12 +2094,420 @@ uncomment to make visible when testing
1694
2094
  }
1695
2095
 
1696
2096
  */
1697
- /* Parent */
1698
- .bs-dropdown-parent {
1699
- display: inline-block;
1700
- position: relative;
1701
- }
1702
- /* Backdrop for mobile bottom sheet */
2097
+ /*
2098
+ Properties : Defaults // Description
2099
+ ====================================
2100
+ --btn-icon-bg-color: var(--btn-main); // icon bg color (base state)
2101
+ --btn-icon-padding: .75rem; // padding around icon svg
2102
+ --btn-icon-size: 1.5rem; // svg width and height
2103
+ --btn-icon-stroke-color: var(--bs-white);
2104
+ --btn-main: var(--bs-blue-base); // many things... should probably break this up
2105
+ --btn-text-color: var(--bs-ink-base);
2106
+ --btn-text-size: var(--bs-text-md);
2107
+
2108
+ --btn-border-color: transparent; // focus state outline color - transparent base state, --btn-main base focus state
2109
+ --btn-border-color-focused: var(--btn-main); // focus state ring color set on variants
2110
+ --btn-secondary: var(--bs-blue-medium); // hover state icon bg
2111
+ --btn-shadow-color-active: var(--btn-main); // active state shadow color (icon bg)
2112
+ --btn-text-color-hovered: var(--bs-ink-base); // hover state text color
2113
+ */
2114
+ :where(.bs-circle-button) {
2115
+ --btn-border-color-focused: var(--btn-main);
2116
+ --btn-border-color: transparent;
2117
+ --btn-focus-inset: -0.25rem;
2118
+ --btn-gap: .5rem;
2119
+ --btn-icon-bg-color: var(--btn-main);
2120
+ --btn-icon-padding: .75rem;
2121
+ --btn-icon-size: 1.5rem;
2122
+ --btn-icon-stroke-color: var(--bs-white);
2123
+ --btn-main: var(--bs-blue-base);
2124
+ --btn-secondary: var(--bs-blue-medium);
2125
+ --btn-shadow-color-active: var(--btn-main);
2126
+ --btn-text-color-hovered: var(--bs-ink-base);
2127
+ --btn-text-color: var(--bs-ink-base);
2128
+ --btn-text-size: 1.125rem;
2129
+ --btn-text-weight: 400;
2130
+ }
2131
+ .bs-circle-button {
2132
+ align-items: center;
2133
+ background-color: transparent;
2134
+ color: var(--btn-text-color);
2135
+ cursor: pointer;
2136
+ display: inline-flex;
2137
+ font-size: var(--btn-text-size);
2138
+ font-weight: var(--btn-text-weight);
2139
+ gap: var(--btn-gap);
2140
+ outline: none;
2141
+ position: relative;
2142
+ vertical-align: middle;
2143
+ }
2144
+ a.bs-circle-button {
2145
+ align-items: center;
2146
+ display: inline-flex;
2147
+ outline: none;
2148
+ text-decoration: none;
2149
+ }
2150
+ .bs-circle-button :where(.bs-circle-button-icon) {
2151
+ align-items: center;
2152
+ background-color: var(--btn-icon-bg-color);
2153
+ border: none;
2154
+ border-radius: 50%;
2155
+ color: var(--btn-icon-stroke-color);
2156
+ display: inline-flex;
2157
+ justify-content: center;
2158
+ outline: 2px solid transparent;
2159
+ padding: var(--btn-icon-padding);
2160
+ position: relative;
2161
+ transition: all 100ms ease-in-out;
2162
+ }
2163
+ .bs-circle-button :where(.bs-circle-button-icon)::before {
2164
+ border-color: var(--btn-border-color);
2165
+ border-radius: 50%;
2166
+ border-style: solid;
2167
+ border-width: 0.125rem;
2168
+ content: '';
2169
+ inset: var(--btn-focus-inset);
2170
+ position: absolute;
2171
+ transition: border-color 125ms ease-in-out, transform 100ms ease-in-out;
2172
+ }
2173
+ .bs-circle-button :where(.bs-circle-button-icon) :where(.bs-icon) {
2174
+ --icon-size: var(--btn-icon-size);
2175
+ }
2176
+ /* non-bs-icon svgs */
2177
+ .bs-circle-button :where(.bs-circle-button-icon) > :where(svg) {
2178
+ height: var(--btn-icon-size);
2179
+ width: var(--btn-icon-size);
2180
+ }
2181
+ /* Icon Buttons with Text */
2182
+ .bs-circle-button:where([data-text]:not([data-text="false"])) {
2183
+ --btn-text-size: var(--bs-text-md);
2184
+ --btn-icon-size: 0.75rem;
2185
+ --btn-icon-padding: 0.375rem;
2186
+ }
2187
+ /* Ghost Buttons */
2188
+ .bs-circle-button:where([data-ghost]:not([data-ghost="false"])) {
2189
+ --btn-icon-bg-color: transparent;
2190
+ --btn-icon-stroke-color: var(--btn-main);
2191
+ --btn-light: var(--bs-blue-10);
2192
+ --btn-secondary: var(--bs-blue-10);
2193
+ }
2194
+ /* Active, Hover, Focus states */
2195
+ .bs-circle-button:active, .bs-circle-button:hover {
2196
+ --btn-icon-bg-color: var(--btn-secondary);
2197
+ --btn-text-color: var(--btn-text-color-hovered);
2198
+ }
2199
+ .bs-circle-button:active :where(.bs-circle-button-icon) {
2200
+ box-shadow: inset 0px 0px 4px 1px var(--btn-shadow-color-active);
2201
+ transform-origin: center;
2202
+ transform: scale(0.97);
2203
+ }
2204
+ .bs-circle-button:where([data-direction="right"]):hover :where(.bs-circle-button-icon),
2205
+ .bs-circle-button:where([data-direction="right"]):hover::before {
2206
+ transform: translateX(.25rem);
2207
+ }
2208
+ .bs-circle-button:where([data-direction="left"]):hover :where(.bs-circle-button-icon),
2209
+ .bs-circle-button:where([data-direction="left"]):hover::before {
2210
+ transform: translateX(-.25rem);
2211
+ }
2212
+ .bs-circle-button:where([data-ghost]:not([data-ghost="false"])):hover {
2213
+ --btn-icon-bg-color: var(--btn-light);
2214
+ }
2215
+ .bs-circle-button:where(:focus-visible) {
2216
+ --btn-border-color: var(--btn-border-color-focused);
2217
+ }
2218
+ /* Disabled State */
2219
+ .bs-circle-button:where(:disabled, [aria-disabled]:not([aria-disabled="false"])) /* for links as buttons */ {
2220
+ --btn-icon-stroke-color: var(--bs-ink-disabled);
2221
+ --btn-text-color: var(--bs-ink-disabled);
2222
+ pointer-events: none;
2223
+ }
2224
+ .bs-circle-button:where(:disabled, [aria-disabled]:not([aria-disabled="false"])) {
2225
+ --btn-icon-bg-color: var(--bs-bg-disabled);
2226
+ }
2227
+ /* Button Size */
2228
+ .bs-circle-button:where([data-size^='sm']) {
2229
+ --btn-icon-padding: .375rem;
2230
+ --btn-icon-size: .75rem;
2231
+ --btn-text-size: .875rem;
2232
+ }
2233
+ .bs-circle-button:where([data-size^='sm'][data-text]:not([data-text="false"])) {
2234
+ --btn-icon-padding: .3125rem;
2235
+ --btn-icon-size: .625rem;
2236
+ --btn-text-size: 1rem;
2237
+ }
2238
+ .bs-circle-button:where([data-size='xs'][data-text]:not([data-text="false"])) {
2239
+ --btn-icon-padding: .25rem;
2240
+ --btn-icon-size: .5rem;
2241
+ --btn-text-size: .875rem;
2242
+ }
2243
+ /* Color Variants */
2244
+ .bs-circle-button:where([data-variant^="color"]) {
2245
+ --btn-gap: .5rem;
2246
+ --btn-icon-bg-color: transparent;
2247
+ --btn-icon-padding: 0;
2248
+ --btn-icon-size: .75rem; /* stays the same for all sizes */
2249
+ --btn-icon-stroke-color: var(--btn-text-color);
2250
+ --btn-secondary: transparent;
2251
+ --btn-shadow-color-active: transparent;
2252
+ }
2253
+ .bs-circle-button:where([data-variant="color-blue"]) {
2254
+ --btn-border-color-focused: var(--bs-ink-blue);
2255
+ --btn-text-color: var(--bs-ink-blue);
2256
+ --btn-text-color-hovered: var(--bs-blue-base);
2257
+ }
2258
+ .bs-circle-button:where([data-variant="color-royal"]) {
2259
+ --btn-border-color-focused: var(--bs-ink-royal);
2260
+ --btn-text-color: var(--bs-ink-royal);
2261
+ --btn-text-color-hovered: var(--bs-royal-medium);
2262
+ }
2263
+ .bs-circle-button:where([data-variant="color-purple"]) {
2264
+ --btn-border-color-focused: var(--bs-purple-400);
2265
+ --btn-text-color: var(--bs-ink-purple);
2266
+ --btn-text-color-hovered: var(--bs-purple-medium);
2267
+ }
2268
+ .bs-circle-button:where([data-variant="color-pink"]) {
2269
+ --btn-border-color-focused: var(--bs-pink-400);
2270
+ --btn-text-color: var(--bs-ink-pink);
2271
+ --btn-text-color-hovered: var(--bs-pink-base);
2272
+ }
2273
+ .bs-circle-button:where([data-variant="color-orange"]) {
2274
+ --btn-border-color-focused: var(--bs-ink-orange);
2275
+ --btn-text-color: var(--bs-ink-orange);
2276
+ --btn-text-color-hovered: var(--bs-orange-base);
2277
+ }
2278
+ .bs-circle-button:where([data-variant="color-red"]) {
2279
+ --btn-border-color-focused: var(--bs-ink-red);
2280
+ --btn-text-color: var(--bs-ink-red);
2281
+ --btn-text-color-hovered: var(--bs-red-base);
2282
+ }
2283
+ .bs-circle-button:where([data-variant="color-white"]) {
2284
+ --btn-border-color-focused: var(--bs-ink-white);
2285
+ --btn-text-color: var(--bs-ink-white);
2286
+ /* 80% of --bs-white */
2287
+ --btn-text-color-hovered: rgba(255, 255, 255, 0.8);
2288
+ }
2289
+ .bs-circle-button:where([data-variant^="color"]):where(:disabled, [aria-disabled]:not([aria-disabled="false"])) {
2290
+ --btn-icon-bg-color: transparent;
2291
+ --btn-text-color: var(--bs-ink-disabled);
2292
+ }
2293
+ /* size XXS only supported for color variants */
2294
+ .bs-circle-button:where([data-variant^="color"]):where([data-size='xxs'][data-text]:not([data-text="false"])) {
2295
+ --btn-text-size: .75rem;
2296
+ --btn-text-weight: 600;
2297
+ }
2298
+ /* Option list */
2299
+ .bs-dropdown-options {
2300
+ display: flex;
2301
+ flex-direction: column;
2302
+ gap: 0.5rem;
2303
+ list-style: none;
2304
+ margin-bottom: 0.25rem;
2305
+ margin-top: 0.25rem;
2306
+ max-height: var(--options-height-max, 20rem);/* constrain scrollable to options section */
2307
+ overflow-y: auto;
2308
+ padding-block: 0.5rem;
2309
+ padding-left: 0;
2310
+ position: relative;
2311
+ }
2312
+ .bs-dropdown-options:focus-visible {
2313
+ outline: none;
2314
+ }
2315
+ /* Stabilize scrollbar gutter for Firefox (https://bugzilla.mozilla.org/show_bug.cgi?id=764076) */
2316
+ @media (min-width: 1166px) {
2317
+ /* 5th or 8th child triggers overflow-y (depending on variant) */
2318
+ :where([data-width="content"]) > .bs-dropdown-options:where(:has([data-variant*="description"]:nth-child(5))),
2319
+ :where([data-width="content"]) > .bs-dropdown-options:where(:has(li:not([data-variant*="description"]):nth-child(8))) {
2320
+ scrollbar-gutter: stable;
2321
+ }
2322
+
2323
+ /* Fallback for older Firefox+ only if we're not setting data-overflow values */
2324
+ @supports not selector(:has(*)) {
2325
+ :where([data-width="content"]) > .bs-dropdown-options {
2326
+ scrollbar-gutter: stable;
2327
+ }
2328
+ }
2329
+
2330
+ /* Also allow this for js solutions if :has not available via data-overflow */
2331
+ /* Reset scrollbar gutter when data-overflow is used */
2332
+ :where([data-width="content"]) > .bs-dropdown-options:where([data-overflow]) {
2333
+ scrollbar-gutter: auto;
2334
+ }
2335
+
2336
+ :where([data-width="content"]) > .bs-dropdown-options:where([data-overflow="true"]) {
2337
+ scrollbar-gutter: stable;
2338
+ }
2339
+ }
2340
+ /* Option list item */
2341
+ .bs-dropdown-options :where(li) {
2342
+ align-items: center;
2343
+ border-bottom: 2px solid transparent;
2344
+ border-left: 4px solid transparent;
2345
+ border-radius: 3px;
2346
+ border-right: 2px solid transparent;
2347
+ border-top: 2px solid transparent;
2348
+ color: var(--bs-ink-base);
2349
+ -moz-column-gap: 0.5rem;
2350
+ column-gap: 0.5rem;
2351
+ cursor: pointer;
2352
+ display: grid;
2353
+ padding-block: 0.25rem;
2354
+ padding-inline: 1.25rem;
2355
+ row-gap: 0.125rem;
2356
+ word-break: break-word;
2357
+ word-wrap: break-word;
2358
+ }
2359
+ /* Variant: 2-col */
2360
+ .bs-dropdown-options :where(li[data-variant~="2-col"]) {
2361
+ grid-template-columns: min-content 1fr;
2362
+ }
2363
+ /* Variant: 3-col */
2364
+ .bs-dropdown-options :where(li[data-variant~="3-col"]) {
2365
+ grid-template-columns: min-content min-content 1fr;
2366
+ }
2367
+ /* Variant: description */
2368
+ .bs-dropdown-options :where(li:not([data-variant*="-col"])[data-variant~="description"] > :nth-child(2)),
2369
+ .bs-dropdown-options :where(li[data-variant~="2-col"][data-variant~="description"] > :nth-child(3)),
2370
+ .bs-dropdown-options :where(li[data-variant~="3-col"][data-variant~="description"] > :nth-child(4)) {
2371
+ color: var(--bs-ink-light);
2372
+ font-size: var(--bs-text-xs);
2373
+ min-height: 1.125rem;
2374
+ line-height: 1.125rem;
2375
+ }
2376
+ /* Variant: 2-col description */
2377
+ .bs-dropdown-options :where(li[data-variant~="2-col"][data-variant~="description"] > :nth-child(3)) {
2378
+ grid-column-start: 2;
2379
+ }
2380
+ /* Variant: 3-col description */
2381
+ .bs-dropdown-options :where(li[data-variant~="3-col"][data-variant~="description"] > :nth-child(4)) {
2382
+ grid-column-start: 3;
2383
+ }
2384
+ /* Hover or data-selected */
2385
+ .bs-dropdown-options :where(li:not([role="separator"]):hover),
2386
+ .bs-dropdown-options :where(li[data-selected]) {
2387
+ background-color: var(--bs-bg-medium-to-light);
2388
+ border-left: 4px solid var(--bs-ink-blue);
2389
+ color: var(--bs-ink-blue);
2390
+ outline: none;
2391
+ }
2392
+ /* Variant: negative */
2393
+ .bs-dropdown-options :where(li[data-variant~="negative"]:hover),
2394
+ .bs-dropdown-options :where(li[data-variant~="negative"][data-selected]),
2395
+ .bs-dropdown-options :where(li[data-variant~="negative"][data-selected]:hover) {
2396
+ /* 25% alpha version of --bs-red-400 */
2397
+ background-color: rgba(248, 169, 170, 0.25);
2398
+ border-left: 4px solid var(--bs-ink-red);
2399
+ color: var(--bs-ink-red);
2400
+ }
2401
+ /* Hover or data-selected for 2-col/3-col/description variants */
2402
+ .bs-dropdown-options :where(li:not([data-variant*="-col"])[data-variant~="description"]:hover > :nth-child(2)),
2403
+ .bs-dropdown-options :where(li[data-variant~="2-col"][data-variant~="description"]:hover > :nth-child(3)),
2404
+ .bs-dropdown-options :where(li[data-variant~="3-col"][data-variant~="description"]:hover > :nth-child(4)),
2405
+ .bs-dropdown-options :where(li:not([data-variant*="-col"])[data-variant~="description"][data-selected] > :nth-child(2)),
2406
+ .bs-dropdown-options :where(li[data-variant~="2-col"][data-variant~="description"][data-selected] > :nth-child(3)),
2407
+ .bs-dropdown-options :where(li[data-variant~="3-col"][data-variant~="description"][data-selected] > :nth-child(4)) {
2408
+ color: var(--bs-ink-blue);
2409
+ }
2410
+ /* Hover or data-selected for negative + 2-col/3-col/description variants */
2411
+ .bs-dropdown-options :where(li[data-variant~="negative"]:not([data-variant*="-col"])[data-variant~="description"]:hover > :nth-child(2)),
2412
+ .bs-dropdown-options :where(li[data-variant~="negative"][data-variant~="2-col"][data-variant~="description"]:hover > :nth-child(3)),
2413
+ .bs-dropdown-options :where(li[data-variant~="negative"][data-variant~="3-col"][data-variant~="description"]:hover > :nth-child(4)),
2414
+ .bs-dropdown-options :where(li[data-variant~="negative"]:not([data-variant*="-col"])[data-variant~="description"][data-selected] > :nth-child(2)),
2415
+ .bs-dropdown-options :where(li[data-variant~="negative"][data-variant~="2-col"][data-variant~="description"][data-selected] > :nth-child(3)),
2416
+ .bs-dropdown-options :where(li[data-variant~="negative"][data-variant~="3-col"][data-variant~="description"][data-selected] > :nth-child(4)) {
2417
+ color: var(--bs-ink-red);
2418
+ }
2419
+ /* List option keyboard navigation focus */
2420
+ .bs-dropdown-options:where(:focus-visible) :where(li[data-active]) {
2421
+ --focus-border-color: var(--bs-blue-base);
2422
+ border: 2px solid var(--focus-border-color);
2423
+ outline: none;
2424
+ padding-left: 1.375rem;
2425
+ }
2426
+ /* Navigation focus on a selected element should preserve 4px left border */
2427
+ .bs-dropdown-options:where(:focus-visible) :where(li[data-selected][data-active]) {
2428
+ border-left: 4px solid var(--focus-border-color);
2429
+ padding-left: 1.25rem;
2430
+ }
2431
+ /* data-variant="negative" list option keyboard navigation focus */
2432
+ .bs-dropdown-options:where(:focus-visible) :where(li[data-variant~="negative"][data-active]) {
2433
+ --focus-border-color: var(--bs-red-200);
2434
+ }
2435
+ /* Multi-select divider */
2436
+ .bs-dropdown-options :where(li[role="separator"]) {
2437
+ cursor: default;
2438
+ padding-block: 0.125rem;
2439
+ padding-right: 1.375rem;
2440
+ }
2441
+ /* Multi-select divider line */
2442
+ .bs-dropdown-options :where(hr) {
2443
+ background-color: var(--bs-navy-light);
2444
+ height: .0625rem;
2445
+ margin-block: 0;
2446
+ margin-inline: 0;
2447
+ }
2448
+ /* Disable hover styles */
2449
+ .bs-dropdown-options :where(li[data-no-hover]:hover) {
2450
+ background-color: transparent;
2451
+ border-left-color: transparent;
2452
+ color: var(--bs-ink-base);
2453
+ cursor: default;
2454
+ }
2455
+ /* Style label to look like other options */
2456
+ .bs-dropdown-options :where(li label) {
2457
+ cursor: pointer;
2458
+ font-size: 1rem;
2459
+ font-weight: 400;
2460
+ }
2461
+ /* Don't change option color when checkbox is present */
2462
+ .bs-dropdown-options :where(li[data-variant~="checkbox"]):hover,
2463
+ .bs-dropdown-options :where(li[data-variant~="checkbox"][data-selected]) {
2464
+ color: var(--bs-ink-base);
2465
+ }
2466
+ /* Don't change description color when checkbox is present */
2467
+ .bs-dropdown-options :where(li[data-variant~="checkbox"][data-variant~="2-col"][data-variant~="description"]):hover > :nth-child(3),
2468
+ .bs-dropdown-options :where(li[data-variant~="checkbox"][data-variant~="2-col"][data-variant~="description"][data-selected]) > :nth-child(3),
2469
+ .bs-dropdown-options :where(li[data-variant~="checkbox"][data-variant~="3-col"][data-variant~="description"]):hover > :nth-child(4),
2470
+ .bs-dropdown-options :where(li[data-variant~="checkbox"][data-variant~="3-col"][data-variant~="description"][data-selected]) > :nth-child(4) {
2471
+ color: var(--bs-ink-light);
2472
+ }
2473
+ /* Overrides mobile style when not min-width 1166 */
2474
+ .bs-dropdown:where([data-no-mobile="true"]) :where(.bs-dropdown-options) :where(li) {
2475
+ padding-left: 0.5rem;
2476
+ padding-right: 0.75rem;
2477
+ }
2478
+ .bs-dropdown:where([data-no-mobile="true"]) :where(.bs-dropdown-options) :where(li[role="separator"]) {
2479
+ padding-right: 0.625rem;
2480
+ }
2481
+ .bs-dropdown:where([data-no-mobile="true"]) :where(.bs-dropdown-options:focus-visible) :where(li[data-active]) {
2482
+ padding-left: 0.625rem;
2483
+ }
2484
+ .bs-dropdown:where([data-no-mobile="true"]) :where(.bs-dropdown-options:focus-visible) :where(li[data-selected][data-active]) {
2485
+ padding-left: 0.5rem;
2486
+ }
2487
+ @media (min-width: 1166px) {
2488
+ .bs-dropdown-options :where(li) {
2489
+ padding-left: 0.5rem;
2490
+ padding-right: 0.75rem;
2491
+ }
2492
+
2493
+ .bs-dropdown-options :where(li[role="separator"]) {
2494
+ padding-right: 0.625rem;
2495
+ }
2496
+
2497
+ .bs-dropdown-options:where(:focus-visible) :where(li[data-active]) {
2498
+ padding-left: 0.625rem;
2499
+ }
2500
+
2501
+ .bs-dropdown-options:where(:focus-visible) :where(li[data-selected][data-active]) {
2502
+ padding-left: 0.5rem;
2503
+ }
2504
+ }
2505
+ /* Parent */
2506
+ .bs-dropdown-parent {
2507
+ display: inline-block;
2508
+ position: relative;
2509
+ }
2510
+ /* Backdrop for mobile bottom sheet */
1703
2511
  .bs-dropdown-backdrop {
1704
2512
  -webkit-backdrop-filter: blur(4px);
1705
2513
  backdrop-filter: blur(4px);
@@ -1775,372 +2583,504 @@ uncomment to make visible when testing
1775
2583
  .bs-dropdown:where([data-width="lg"]) {
1776
2584
  --dropdown-wscreen-width: 40rem;
1777
2585
  }
1778
- .bs-dropdown:where([data-width="content"]) {
1779
- --dropdown-wscreen-width: max-content;
2586
+ .bs-dropdown:where([data-width="content"]) {
2587
+ --dropdown-wscreen-width: max-content;
2588
+ }
2589
+ .bs-dropdown-parent:where([data-width="toggle"]) :where(.bs-dropdown),
2590
+ .bs-dropdown-parent:where([data-width="anchor"]) :where(.bs-dropdown) {
2591
+ --dropdown-wscreen-width: 100%;
2592
+ }
2593
+ /* data-top */
2594
+ .bs-dropdown:where([data-top]:not([data-top="false"])) {
2595
+ --dropdown-wscreen-bottom: calc(100% + 0.5rem);
2596
+ --dropdown-wscreen-top: auto;
2597
+ }
2598
+ /* data-center */
2599
+ .bs-dropdown-parent:where([data-center]:not([data-center="false"])) :where(.bs-dropdown) {
2600
+ --dropdown-transform: translate(-50%, 0);
2601
+ --dropdown-wscreen-left: 50%;
2602
+ }
2603
+ /* data-right */
2604
+ .bs-dropdown-parent:where([data-right]:not([data-right="false"])) :where(.bs-dropdown) {
2605
+ --dropdown-transform: translate(0, 0);
2606
+ --dropdown-wscreen-left: auto;
2607
+ --dropdown-wscreen-right: 0;
2608
+ }
2609
+ /* Overrides mobile style when not min-width 1166 */
2610
+ .bs-dropdown:where([data-no-mobile="true"]) {
2611
+ --dropdown-bottom: var(--dropdown-wscreen-bottom, auto);
2612
+ --dropdown-left: var(--dropdown-wscreen-left, initial);
2613
+ --dropdown-right: var(--dropdown-wscreen-right, initial);
2614
+ --dropdown-top: var(--dropdown-wscreen-top, calc(100% + 0.5rem));
2615
+ --dropdown-width: var(--dropdown-wscreen-width, initial);
2616
+ --dropdown-transform: initial;
2617
+
2618
+ position: absolute;
2619
+ }
2620
+ .bs-dropdown:where([data-no-mobile="true"]) > :where(header) {
2621
+ display: none;
2622
+ }
2623
+ @media (min-width: 1166px) {
2624
+ .bs-dropdown-backdrop {
2625
+ display: none;
2626
+ }
2627
+
2628
+ .bs-dropdown {
2629
+ --dropdown-bottom: var(--dropdown-wscreen-bottom, auto);
2630
+ --dropdown-left: var(--dropdown-wscreen-left, initial);
2631
+ --dropdown-right: var(--dropdown-wscreen-right, initial);
2632
+ --dropdown-top: var(--dropdown-wscreen-top, calc(100% + 0.5rem));
2633
+ --dropdown-width: var(--dropdown-wscreen-width, initial);
2634
+ --dropdown-transform: initial;
2635
+
2636
+ position: absolute;
2637
+ }
2638
+
2639
+ /* Hide the header */
2640
+ .bs-dropdown > :where(header) {
2641
+ display: none;
2642
+ }
2643
+ }
2644
+ /* Vue Transition Styles - Only used in Vue component */
2645
+ .bs-dropdown:where(.bs-dropdown-enter-from),
2646
+ .bs-dropdown:where(.bs-dropdown-leave-to) {
2647
+ opacity: 0;
2648
+ transform: var(--dropdown-transform);
2649
+ }
2650
+ .bs-dropdown:where(.bs-dropdown-enter-to),
2651
+ .bs-dropdown:where(.bs-dropdown-leave-from) {
2652
+ opacity: 1;
2653
+ transform: translate(0, 0);
2654
+ }
2655
+ .bs-dropdown :where(.mobile-select-button-container) {
2656
+ display: none;
2657
+ overflow: hidden;
2658
+ }
2659
+ @media (max-width: 1166px) {
2660
+ .bs-dropdown :where(.mobile-select-button-container) {
2661
+ display: flex;
2662
+ }
2663
+ }
2664
+ .bs-dropdown :where(.mobile-select-button) {
2665
+ margin: .875rem;
2666
+ width: 100%;
2667
+ }
2668
+ .bs-empty-state {
2669
+ --bs-empty-state-description-color: var(--bs-ink-light);
2670
+ --bs-empty-state-icon-color: var(--bs-violet-300);
2671
+ --bs-empty-state-title-color: var(--bs-ink-base);
2672
+ --col-gap: var(--bs-space-6);
2673
+ --cta-spacing: var(--bs-space-4);
2674
+ --description-font-size: var(--bs-text-base);
2675
+ --description-line-height: var(--bs-leading-base);
2676
+ --description-weight: var(--bs-font-normal);
2677
+ --icon-size: 3rem;
2678
+ --title-font-size: var(--bs-text-lg);
2679
+ --title-line-height: 130%;
2680
+ --title-spacing: 0.5rem;
2681
+ --title-weight: var(--bs-font-normal);
2682
+
2683
+ align-items: center;
2684
+ -moz-column-gap: var(--col-gap);
2685
+ column-gap: var(--col-gap);
2686
+ display: grid;
2687
+ grid-template-columns: auto 1fr;
2688
+ }
2689
+ .bs-empty-state :where(.bs-empty-state-icon) {
2690
+ align-self: start;
2691
+ height: auto;
2692
+ max-width: var(--icon-size);
2693
+ width: 100%;
2694
+ }
2695
+ .bs-empty-state :where(.bs-empty-state-icon path) {
2696
+ fill: var(--bs-empty-state-icon-color);
2697
+ }
2698
+ .bs-empty-state :where(.bs-empty-state-title) {
2699
+ color: var(--bs-empty-state-title-color);
2700
+ font-size: var(--title-font-size);
2701
+ font-weight: var(--title-weight);
2702
+ line-height: var(--title-line-height);
2703
+ padding-block-end: var(--title-spacing);
2704
+ }
2705
+ .bs-empty-state :where(.bs-empty-state-description) {
2706
+ color: var(--bs-empty-state-description-color);
2707
+ font-size: var(--description-font-size);
2708
+ font-weight: var(--description-weight);
2709
+ line-height: var(--description-line-height);
2710
+ }
2711
+ .bs-empty-state :where(a) {
2712
+ color: var(--bs-ink-blue);
2713
+ text-decoration: underline;
2714
+ }
2715
+ .bs-empty-state :where(a:hover) {
2716
+ cursor: pointer;
2717
+ }
2718
+ /* Call to Actions */
2719
+ .bs-empty-state
2720
+ :where(
2721
+ .bs-empty-state-description + *,
2722
+ .bs-empty-state-title + *:not(.bs-empty-state-description)
2723
+ ) {
2724
+ margin-block-start: var(--cta-spacing, var(--bs-space-4));
2725
+ }
2726
+ /* Sizing */
2727
+ .bs-empty-state:where([data-size^='xs']) {
2728
+ --col-gap: var(--bs-space-4);
2729
+ --cta-spacing: var(--bs-space-2);
2730
+ --icon-size: 1.5rem;
2731
+ --title-color: var(--bs-ink-light);
2732
+ --title-font-size: var(--bs-text-md);
2733
+ --title-line-height: var(--bs-leading-base);
2734
+ --title-spacing: 0;
2735
+ }
2736
+ .bs-empty-state:where([data-size^='sm']) {
2737
+ --description-font-size: var(--bs-text-sm);
2738
+ --icon-size: 2rem;
2739
+ --title-font-size: var(--bs-text-md);
2740
+ --title-line-height: var(--bs-leading-base);
2741
+ --title-spacing: 0.125rem;
1780
2742
  }
1781
- .bs-dropdown-parent:where([data-width="toggle"]) :where(.bs-dropdown),
1782
- .bs-dropdown-parent:where([data-width="anchor"]) :where(.bs-dropdown) {
1783
- --dropdown-wscreen-width: 100%;
2743
+ .bs-empty-state:where([data-size^='lg']) {
2744
+ --col-gap: var(--bs-space-8);
2745
+ --cta-spacing: var(--bs-space-6);
2746
+ --description-font-size: var(--bs-text-md);
2747
+ --icon-size: 4rem;
2748
+ --title-font-size: var(--bs-text-xl);
2749
+ --title-line-height: 110%;
2750
+ --title-weight: var(--bs-font-bold);
1784
2751
  }
1785
- /* data-top */
1786
- .bs-dropdown:where([data-top]:not([data-top="false"])) {
1787
- --dropdown-wscreen-bottom: calc(100% + 0.5rem);
1788
- --dropdown-wscreen-top: auto;
2752
+ /*
2753
+ custom properties:
2754
+ --filterbtn-caret-size
2755
+ --filterbtn-caret-transform
2756
+ --filterbtn-color
2757
+ --filterbtn-focus-color
2758
+ --filterbtn-height
2759
+ --filterbtn-text-size
2760
+ --filterbtn-weight
2761
+ */
2762
+ button:where(.bs-filter-button) {
2763
+ --filterbtn-caret-size: 1rem;
2764
+ --filterbtn-caret-transform: rotate(0deg);
2765
+ --filterbtn-color: var(--bs-ink-blue);
2766
+ --filterbtn-focus-color: transparent;
2767
+ --filterbtn-height: 1.5rem;
2768
+ --filterbtn-text-size: var(--bs-text-base);
2769
+ --filterbtn-weight: 400;
2770
+ flex-shrink: 0;
2771
+ position: relative;
1789
2772
  }
1790
- /* data-center */
1791
- .bs-dropdown-parent:where([data-center]:not([data-center="false"])) :where(.bs-dropdown) {
1792
- --dropdown-transform: translate(-50%, 0);
1793
- --dropdown-wscreen-left: 50%;
2773
+ .bs-filter-button {
2774
+ align-items: center;
2775
+ color: var(--filterbtn-color);
2776
+ -moz-column-gap: 0.5rem;
2777
+ column-gap: 0.5rem;
2778
+ cursor: pointer;
2779
+ display: inline-flex;
2780
+ font-size: var(--filterbtn-text-size);
2781
+ font-weight: var(--filterbtn-weight);
2782
+ height: var(--filterbtn-height);
2783
+ line-height: 1.5;
2784
+ transition: outline-color 100ms ease-in-out;
2785
+ width: -moz-max-content;
2786
+ width: max-content;
1794
2787
  }
1795
- /* Overrides mobile style when not min-width 1166 */
1796
- .bs-dropdown:where([data-no-mobile="true"]) {
1797
- --dropdown-bottom: var(--dropdown-wscreen-bottom, auto);
1798
- --dropdown-left: var(--dropdown-wscreen-left, initial);
1799
- --dropdown-right: var(--dropdown-wscreen-right, initial);
1800
- --dropdown-top: var(--dropdown-wscreen-top, calc(100% + 0.5rem));
1801
- --dropdown-width: var(--dropdown-wscreen-width, initial);
1802
- --dropdown-transform: initial;
1803
-
2788
+ .bs-filter-button::after {
2789
+ border: solid var(--filterbtn-focus-color) 2px;
2790
+ border-radius: 0.25rem;
2791
+ content: '';
2792
+ display: block;
2793
+ height: 100%;
1804
2794
  position: absolute;
2795
+ transform: scale(1.25);
2796
+ width: 100%;
1805
2797
  }
1806
- .bs-dropdown:where([data-no-mobile="true"]) > :where(header) {
1807
- display: none;
2798
+ .bs-filter-button :where(.bs-icon),
2799
+ .bs-filter-button :where(span:has(svg:only-child)) {
2800
+ display: block;
2801
+ height: var(--filterbtn-caret-size);
2802
+ line-height: 1;
2803
+ transform: var(--filterbtn-caret-transform);
2804
+ transform-origin: center;
2805
+ transition: var(--bs-trans-rotate180);
2806
+ width: var(--filterbtn-caret-size);
1808
2807
  }
1809
- @media (min-width: 1166px) {
1810
- .bs-dropdown-backdrop {
1811
- display: none;
1812
- }
1813
-
1814
- .bs-dropdown {
1815
- --dropdown-bottom: var(--dropdown-wscreen-bottom, auto);
1816
- --dropdown-left: var(--dropdown-wscreen-left, initial);
1817
- --dropdown-right: var(--dropdown-wscreen-right, initial);
1818
- --dropdown-top: var(--dropdown-wscreen-top, calc(100% + 0.5rem));
1819
- --dropdown-width: var(--dropdown-wscreen-width, initial);
1820
- --dropdown-transform: initial;
1821
-
1822
- position: absolute;
1823
- }
2808
+ .bs-filter-button:where([data-size="sm"],[data-size="xs"]) {
1824
2809
 
1825
- /* Hide the header */
1826
- .bs-dropdown > :where(header) {
1827
- display: none;
1828
- }
1829
- }
1830
- /* Vue Transition Styles - Only used in Vue component */
1831
- .bs-dropdown:where(.bs-dropdown-enter-from),
1832
- .bs-dropdown:where(.bs-dropdown-leave-to) {
1833
- opacity: 0;
1834
- transform: var(--dropdown-transform);
1835
- }
1836
- .bs-dropdown:where(.bs-dropdown-enter-to),
1837
- .bs-dropdown:where(.bs-dropdown-leave-from) {
1838
- opacity: 1;
1839
- transform: translate(0, 0);
1840
- }
1841
- .bs-dropdown :where(.mobile-select-button-container) {
1842
- display: none;
1843
- overflow: hidden;
2810
+ --filterbtn-text-size: var(--bs-text-sm);
2811
+ --filterbtn-caret-size: .75rem;
1844
2812
  }
1845
- @media (max-width: 1166px) {
1846
- .bs-dropdown :where(.mobile-select-button-container) {
1847
- display: flex;
1848
- }
2813
+ .bs-filter-button:where([data-size="sm"]) {
2814
+ --filterbtn-text-size: var(--bs-text-sm);
1849
2815
  }
1850
- .bs-dropdown :where(.mobile-select-button) {
1851
- margin: .875rem;
1852
- width: 100%;
2816
+ .bs-filter-button:where([data-size="xs"]) {
2817
+ --filterbtn-text-size: var(--bs-text-xs);
2818
+ --filterbtn-weight: 600;
1853
2819
  }
1854
- /* Option list */
1855
- .bs-dropdown-options {
1856
- display: flex;
1857
- flex-direction: column;
1858
- gap: 0.5rem;
1859
- list-style: none;
1860
- margin-bottom: 0.25rem;
1861
- margin-top: 0.25rem;
1862
- max-height: var(--options-height-max, 20rem);/* constrain scrollable to options section */
1863
- overflow-y: auto;
1864
- padding-block: 0.5rem;
1865
- padding-left: 0;
1866
- position: relative;
2820
+ /* Hover state */
2821
+ .bs-filter-button:hover {
2822
+ --filterbtn-color: var(--bs-blue-base);
1867
2823
  }
1868
- .bs-dropdown-options:focus-visible {
2824
+ /* Focus state */
2825
+ .bs-filter-button:where(:focus-visible) {
1869
2826
  outline: none;
2827
+ --filterbtn-focus-color: var(--bs-blue-base);
1870
2828
  }
1871
- /* Stabilize scrollbar gutter for Firefox (https://bugzilla.mozilla.org/show_bug.cgi?id=764076) */
1872
- @media (min-width: 1166px) {
1873
- /* 5th or 8th child triggers overflow-y (depending on variant) */
1874
- :where([data-width="content"]) > .bs-dropdown-options:where(:has([data-variant*="description"]:nth-child(5))),
1875
- :where([data-width="content"]) > .bs-dropdown-options:where(:has(li:not([data-variant*="description"]):nth-child(8))) {
1876
- scrollbar-gutter: stable;
1877
- }
1878
-
1879
- /* Fallback for older Firefox+ only if we're not setting data-overflow values */
1880
- @supports not selector(:has(*)) {
1881
- :where([data-width="content"]) > .bs-dropdown-options {
1882
- scrollbar-gutter: stable;
1883
- }
1884
- }
1885
-
1886
- /* Also allow this for js solutions if :has not available via data-overflow */
1887
- /* Reset scrollbar gutter when data-overflow is used */
1888
- :where([data-width="content"]) > .bs-dropdown-options:where([data-overflow]) {
1889
- scrollbar-gutter: auto;
1890
- }
1891
-
1892
- :where([data-width="content"]) > .bs-dropdown-options:where([data-overflow="true"]) {
1893
- scrollbar-gutter: stable;
1894
- }
2829
+ /* Filter open state */
2830
+ .bs-filter-button:where([aria-expanded="true"],[data-open="true"]) {
2831
+ --filterbtn-caret-transform: rotate(180deg);
1895
2832
  }
1896
- /* Option list item */
1897
- .bs-dropdown-options :where(li) {
1898
- align-items: center;
1899
- border-bottom: 2px solid transparent;
1900
- border-left: 4px solid transparent;
1901
- border-radius: 3px;
1902
- border-right: 2px solid transparent;
1903
- border-top: 2px solid transparent;
1904
- color: var(--bs-ink-base);
1905
- -moz-column-gap: 0.5rem;
1906
- column-gap: 0.5rem;
1907
- cursor: pointer;
1908
- display: grid;
1909
- padding-block: 0.25rem;
1910
- padding-inline: 1.25rem;
1911
- row-gap: 0.125rem;
1912
- word-break: break-word;
1913
- word-wrap: break-word;
2833
+ /* Badge non-standard color */
2834
+ .bs-filter-button :where(.bs-badge) {
2835
+ --badge-bg: var(--bs-ink-blue);
1914
2836
  }
1915
- /* Variant: 2-col */
1916
- .bs-dropdown-options :where(li[data-variant~="2-col"]) {
1917
- grid-template-columns: min-content 1fr;
2837
+ :where(.dark) .bs-filter-button :where(.bs-badge) {
2838
+ --badge-bg: var(--bs-blue-medium);
1918
2839
  }
1919
- /* Variant: 3-col */
1920
- .bs-dropdown-options :where(li[data-variant~="3-col"]) {
1921
- grid-template-columns: min-content min-content 1fr;
2840
+ .bs-filter-button:hover :where(.bs-badge) {
2841
+ --badge-bg: var(--filterbtn-color);
1922
2842
  }
1923
- /* Variant: description */
1924
- .bs-dropdown-options :where(li:not([data-variant*="-col"])[data-variant~="description"] > :nth-child(2)),
1925
- .bs-dropdown-options :where(li[data-variant~="2-col"][data-variant~="description"] > :nth-child(3)),
1926
- .bs-dropdown-options :where(li[data-variant~="3-col"][data-variant~="description"] > :nth-child(4)) {
1927
- color: var(--bs-ink-light);
1928
- font-size: var(--bs-text-xs);
1929
- min-height: 1.125rem;
1930
- line-height: 1.125rem;
2843
+ /* Disabled state */
2844
+ .bs-filter-button:where(:disabled) {
2845
+ --filterbtn-color: var(--bs-ink-disabled);
2846
+ cursor: default;
1931
2847
  }
1932
- /* Variant: 2-col description */
1933
- .bs-dropdown-options :where(li[data-variant~="2-col"][data-variant~="description"] > :nth-child(3)) {
1934
- grid-column-start: 2;
2848
+ .bs-filter-button:where(:disabled) :where(.bs-badge) {
2849
+ --badge-bg: var(--bs-bg-disabled);
2850
+ --badge-text: var(--bs-ink-disabled);
1935
2851
  }
1936
- /* Variant: 3-col description */
1937
- .bs-dropdown-options :where(li[data-variant~="3-col"][data-variant~="description"] > :nth-child(4)) {
1938
- grid-column-start: 3;
2852
+ .bs-flyout {
2853
+ background-color: var(--bs-bg-base-to-light);
2854
+ box-shadow: var(--bs-shadow-drawerRight);
2855
+ height: 100%;
2856
+ left: 0;
2857
+ margin: 0;
2858
+ max-width: 100vw;
2859
+ opacity: 0;
2860
+ padding: 1.5rem;
2861
+ position: fixed;
2862
+ top: 0;
2863
+ transform: translateX(-100%);
2864
+ transition-duration: 300ms;
2865
+ transition-property: opacity, transform;
2866
+ transition-timing-function: ease;
2867
+ width: 360px;
2868
+ z-index: 1000;
1939
2869
  }
1940
- /* Hover or data-selected */
1941
- .bs-dropdown-options :where(li:not([role="separator"]):hover),
1942
- .bs-dropdown-options :where(li[data-selected]) {
1943
- background-color: var(--bs-bg-medium-to-light);
1944
- border-left: 4px solid var(--bs-ink-blue);
1945
- color: var(--bs-ink-blue);
1946
- outline: none;
2870
+ .bs-flyout:where([data-absolute="true"]) {
2871
+ position: absolute;
1947
2872
  }
1948
- /* Variant: negative */
1949
- .bs-dropdown-options :where(li[data-variant~="negative"]:hover),
1950
- .bs-dropdown-options :where(li[data-variant~="negative"][data-selected]),
1951
- .bs-dropdown-options :where(li[data-variant~="negative"][data-selected]:hover) {
1952
- /* 25% alpha version of --bs-red-400 */
1953
- background-color: rgba(248, 169, 170, 0.25);
1954
- border-left: 4px solid var(--bs-ink-red);
1955
- color: var(--bs-ink-red);
2873
+ .bs-flyout:where([data-position="right"]) {
2874
+ box-shadow: var(--bs-shadow-drawerLeft);
2875
+ left: auto;
2876
+ right: 0;
2877
+ transform: translateX(100%);
1956
2878
  }
1957
- /* Hover or data-selected for 2-col/3-col/description variants */
1958
- .bs-dropdown-options :where(li:not([data-variant*="-col"])[data-variant~="description"]:hover > :nth-child(2)),
1959
- .bs-dropdown-options :where(li[data-variant~="2-col"][data-variant~="description"]:hover > :nth-child(3)),
1960
- .bs-dropdown-options :where(li[data-variant~="3-col"][data-variant~="description"]:hover > :nth-child(4)),
1961
- .bs-dropdown-options :where(li:not([data-variant*="-col"])[data-variant~="description"][data-selected] > :nth-child(2)),
1962
- .bs-dropdown-options :where(li[data-variant~="2-col"][data-variant~="description"][data-selected] > :nth-child(3)),
1963
- .bs-dropdown-options :where(li[data-variant~="3-col"][data-variant~="description"][data-selected] > :nth-child(4)) {
1964
- color: var(--bs-ink-blue);
2879
+ .bs-flyout:where([data-size="lg"]) {
2880
+ width: 535px;
1965
2881
  }
1966
- /* Hover or data-selected for negative + 2-col/3-col/description variants */
1967
- .bs-dropdown-options :where(li[data-variant~="negative"]:not([data-variant*="-col"])[data-variant~="description"]:hover > :nth-child(2)),
1968
- .bs-dropdown-options :where(li[data-variant~="negative"][data-variant~="2-col"][data-variant~="description"]:hover > :nth-child(3)),
1969
- .bs-dropdown-options :where(li[data-variant~="negative"][data-variant~="3-col"][data-variant~="description"]:hover > :nth-child(4)),
1970
- .bs-dropdown-options :where(li[data-variant~="negative"]:not([data-variant*="-col"])[data-variant~="description"][data-selected] > :nth-child(2)),
1971
- .bs-dropdown-options :where(li[data-variant~="negative"][data-variant~="2-col"][data-variant~="description"][data-selected] > :nth-child(3)),
1972
- .bs-dropdown-options :where(li[data-variant~="negative"][data-variant~="3-col"][data-variant~="description"][data-selected] > :nth-child(4)) {
1973
- color: var(--bs-ink-red);
2882
+ .bs-flyout:where([data-shown="true"]) {
2883
+ opacity: 1;
2884
+ /*
2885
+ Needs to be "none" instead of "0" so as not to interfere with calculating
2886
+ "containing block" for absolute and fixed positioned elements (see https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block)
2887
+ */
2888
+ transform: none;
1974
2889
  }
1975
- /* List option keyboard navigation focus */
1976
- .bs-dropdown-options:where(:focus-visible) :where(li[data-active]) {
1977
- --focus-border-color: var(--bs-blue-base);
1978
- border: 2px solid var(--focus-border-color);
1979
- outline: none;
1980
- padding-left: 1.375rem;
2890
+ .bs-flyout :where(.bs-flyout-close-container) {
2891
+ display: flex;
2892
+ justify-content: flex-end;
1981
2893
  }
1982
- /* Navigation focus on a selected element should preserve 4px left border */
1983
- .bs-dropdown-options:where(:focus-visible) :where(li[data-selected][data-active]) {
1984
- border-left: 4px solid var(--focus-border-color);
1985
- padding-left: 1.25rem;
2894
+ .bs-flyout :where(.bs-flyout-close-container button) {
2895
+ cursor: pointer;
2896
+ outline-offset: 2px;
2897
+ padding: 2px;
1986
2898
  }
1987
- /* data-variant="negative" list option keyboard navigation focus */
1988
- .bs-dropdown-options:where(:focus-visible) :where(li[data-variant~="negative"][data-active]) {
1989
- --focus-border-color: var(--bs-red-200);
2899
+ /* Vue Transition Styles - Only used in Vue component */
2900
+ .bs-flyout:where(.bs-flyout-enter-from),
2901
+ .bs-flyout:where(.bs-flyout-leave-to) {
2902
+ opacity: 0;
2903
+ transform: translateX(-100%);
1990
2904
  }
1991
- /* Multi-select divider */
1992
- .bs-dropdown-options :where(li[role="separator"]) {
1993
- cursor: default;
1994
- padding-block: 0.125rem;
1995
- padding-right: 1.375rem;
2905
+ .bs-flyout:where([data-position="right"].bs-flyout-enter-from),
2906
+ .bs-flyout:where([data-position="right"].bs-flyout-leave-to) {
2907
+ transform: translateX(100%);
1996
2908
  }
1997
- /* Multi-select divider line */
1998
- .bs-dropdown-options :where(hr) {
1999
- background-color: var(--bs-navy-light);
2000
- height: .0625rem;
2001
- margin-block: 0;
2002
- margin-inline: 0;
2909
+ .bs-flyout:where(.bs-flyout-enter-to),
2910
+ .bs-flyout:where(.bs-flyout-leave-from) {
2911
+ opacity: 1;
2912
+ transform: translateX(0);
2003
2913
  }
2004
- /* Disable hover styles */
2005
- .bs-dropdown-options :where(li[data-no-hover]:hover) {
2006
- background-color: transparent;
2007
- border-left-color: transparent;
2008
- color: var(--bs-ink-base);
2009
- cursor: default;
2914
+ /* Containers and Labels for Checkbox/Radio */
2915
+ .bs-boolean {
2916
+ display: inline-flex;
2917
+ align-items: center;
2918
+ font-size: var(--bs-text-base);
2919
+ font-weight: 400;
2920
+ line-height: 115%;
2010
2921
  }
2011
- /* Style label to look like other options */
2012
- .bs-dropdown-options :where(li label) {
2013
- cursor: pointer;
2014
- font-size: 1rem;
2922
+ .bs-boolean:where([data-size='sm']) input {
2923
+ height: .75rem;
2924
+ width: .75rem;
2925
+ }
2926
+ .bs-boolean label {
2927
+ font-size: var(--bs-text-base);
2015
2928
  font-weight: 400;
2929
+ line-height: 1.5;
2930
+ width: auto;
2016
2931
  }
2017
- /* Don't change option color when checkbox is present */
2018
- .bs-dropdown-options :where(li[data-variant~="checkbox"]):hover,
2019
- .bs-dropdown-options :where(li[data-variant~="checkbox"][data-selected]) {
2020
- color: var(--bs-ink-base);
2932
+ /* not using gap on .bs-boolean due to dead click zone */
2933
+ .bs-boolean label {
2934
+ padding-inline-end: 0.5em;
2021
2935
  }
2022
- /* Don't change description color when checkbox is present */
2023
- .bs-dropdown-options :where(li[data-variant~="checkbox"][data-variant~="2-col"][data-variant~="description"]):hover > :nth-child(3),
2024
- .bs-dropdown-options :where(li[data-variant~="checkbox"][data-variant~="2-col"][data-variant~="description"][data-selected]) > :nth-child(3),
2025
- .bs-dropdown-options :where(li[data-variant~="checkbox"][data-variant~="3-col"][data-variant~="description"]):hover > :nth-child(4),
2026
- .bs-dropdown-options :where(li[data-variant~="checkbox"][data-variant~="3-col"][data-variant~="description"][data-selected]) > :nth-child(4) {
2027
- color: var(--bs-ink-light);
2936
+ .bs-boolean input + label {
2937
+ padding-inline: 0.5em 0;
2028
2938
  }
2029
- /* Overrides mobile style when not min-width 1166 */
2030
- .bs-dropdown:where([data-no-mobile="true"]) :where(.bs-dropdown-options) :where(li) {
2031
- padding-left: 0.5rem;
2032
- padding-right: 0.75rem;
2939
+ .bs-boolean:where([data-size='sm']),
2940
+ .bs-boolean:where([data-size='sm']) label {
2941
+ font-size: var(--bs-text-xs);
2033
2942
  }
2034
- .bs-dropdown:where([data-no-mobile="true"]) :where(.bs-dropdown-options) :where(li[role="separator"]) {
2035
- padding-right: 0.625rem;
2943
+ /* Checkbox & Radio Input */
2944
+ :where(input[type='checkbox'], input[type='radio']),
2945
+ :is(.bs-boolean :where(input), .bs-checkbox) { /* .bs-checkbox added to accommodate 'fake' cbs */
2946
+ -webkit-appearance: none;
2947
+ -moz-appearance: none;
2948
+ appearance: none;
2949
+ box-shadow: inset 0 0 0 0.125rem var(--box-shadow, var(--bs-ink-base));
2950
+ cursor: pointer;
2951
+ display: grid;
2952
+ height: 1rem;
2953
+ margin: 0;
2954
+ place-content: center;
2955
+ position: relative;
2956
+ width: 1rem;
2036
2957
  }
2037
- .bs-dropdown:where([data-no-mobile="true"]) :where(.bs-dropdown-options:focus-visible) :where(li[data-active]) {
2038
- padding-left: 0.625rem;
2958
+ :where(input[type='checkbox'], input[type='radio']):focus-visible,
2959
+ :is(.bs-boolean :where(input), .bs-checkbox):focus-visible {
2960
+ box-shadow: inset 0 0 0 0.125rem var(--box-shadow, var(--bs-ink-base)),
2961
+ 0 0 0 2px var(--offset-color, var(--bs-bg-base)),
2962
+ 0 0 0 4px var(--outline-color, var(--bs-blue-base));
2963
+ outline: 2px solid transparent;
2039
2964
  }
2040
- .bs-dropdown:where([data-no-mobile="true"]) :where(.bs-dropdown-options:focus-visible) :where(li[data-selected][data-active]) {
2041
- padding-left: 0.5rem;
2965
+ :where(input[type='checkbox']),
2966
+ :is(.bs-boolean :where([type='checkbox']), .bs-checkbox) {
2967
+ border-radius: 0.125rem;
2042
2968
  }
2043
- @media (min-width: 1166px) {
2044
- .bs-dropdown-options :where(li) {
2045
- padding-left: 0.5rem;
2046
- padding-right: 0.75rem;
2047
- }
2048
-
2049
- .bs-dropdown-options :where(li[role="separator"]) {
2050
- padding-right: 0.625rem;
2051
- }
2052
-
2053
- .bs-dropdown-options:where(:focus-visible) :where(li[data-active]) {
2054
- padding-left: 0.625rem;
2055
- }
2056
-
2057
- .bs-dropdown-options:where(:focus-visible) :where(li[data-selected][data-active]) {
2058
- padding-left: 0.5rem;
2059
- }
2969
+ :where(input[type='radio']),
2970
+ .bs-boolean :where([type='radio']) {
2971
+ border-radius: 50%;
2060
2972
  }
2061
- .bs-empty-state {
2062
- --bs-empty-state-description-color: var(--bs-ink-light);
2063
- --bs-empty-state-icon-color: var(--bs-violet-300);
2064
- --bs-empty-state-title-color: var(--bs-ink-base);
2065
- --col-gap: var(--bs-space-6);
2066
- --cta-spacing: var(--bs-space-4);
2067
- --description-font-size: var(--bs-text-base);
2068
- --description-line-height: var(--bs-leading-base);
2069
- --description-weight: var(--bs-font-normal);
2070
- --icon-size: 3rem;
2071
- --title-font-size: var(--bs-text-lg);
2072
- --title-line-height: 130%;
2073
- --title-spacing: 0.5rem;
2074
- --title-weight: var(--bs-font-normal);
2075
-
2076
- align-items: center;
2077
- -moz-column-gap: var(--col-gap);
2078
- column-gap: var(--col-gap);
2079
- display: grid;
2080
- grid-template-columns: auto 1fr;
2973
+ /* Checkbox's checkbox, checkmark. Checkmark is hidden unless checked/indeterminate. */
2974
+ input:where([type='checkbox'])::before,
2975
+ :is(.bs-boolean :where([type="checkbox"]), .bs-checkbox)::before {
2976
+ --cb-filled-size: var(--filled-size, 1rem);
2977
+ content: '';
2978
+ border-radius: 0.125rem;
2979
+ box-shadow: inset var(--cb-filled-size) var(--cb-filled-size) var(--fill-bg-color, var(--bs-blue-base));
2980
+ height: var(--cb-filled-size);
2981
+ visibility: hidden;
2982
+ width: var(--cb-filled-size);
2081
2983
  }
2082
- .bs-empty-state :where(.bs-empty-state-icon) {
2083
- align-self: start;
2084
- height: auto;
2085
- max-width: var(--icon-size);
2086
- width: 100%;
2984
+ input:where([type='checkbox'])::after,
2985
+ :is(.bs-boolean :where([type="checkbox"]), .bs-checkbox)::after {
2986
+ border: solid var(--bs-bg-base);
2987
+ border-width: 0 0.125rem 0.125rem 0;
2988
+ content: '';
2989
+ height: var(--inner-check-height, 0.75em);
2990
+ left: 50%;
2991
+ position: absolute;
2992
+ top: 50%;
2993
+ transform-origin: center;
2994
+ transform: translate(-50%, -60%) rotate(45deg);
2995
+ visibility: hidden;
2996
+ width: var(--inner-check-width, 0.375em);
2087
2997
  }
2088
- .bs-empty-state :where(.bs-empty-state-icon path) {
2089
- fill: var(--bs-empty-state-icon-color);
2998
+ input:where([type='checkbox']):where(:indeterminate)::after,
2999
+ .bs-boolean :where([type="checkbox"]):where(:indeterminate)::after,
3000
+ .bs-checkbox:where([data-indeterminate="true"], :indeterminate)::after {
3001
+ border: none;
3002
+ background-color: var(--bs-bg-base);
3003
+ height: var(--inner-dash-height, 0.125rem);
3004
+ transform: translate(-50%, -0.0625rem) rotate(0deg);
3005
+ width: var(--inner-dash-width, 0.625em);
3006
+ }
3007
+ /* Radio outer circle, Radio dot. Dot is hidden unless checked. */
3008
+ input:where([type='radio'])::before,
3009
+ .bs-boolean :where([type="radio"])::before {
3010
+ --radio-filled-size: var(--filled-size, 1rem);
3011
+ background-color: var(--fill-bg-color, var(--bs-blue-base));
3012
+ border-radius: 50%;
3013
+ box-sizing: content-box;
3014
+ content: '';
3015
+ height: var(--radio-filled-size);
3016
+ visibility: hidden;
3017
+ width: var(--radio-filled-size);
2090
3018
  }
2091
- .bs-empty-state :where(.bs-empty-state-title) {
2092
- color: var(--bs-empty-state-title-color);
2093
- font-size: var(--title-font-size);
2094
- font-weight: var(--title-weight);
2095
- line-height: var(--title-line-height);
2096
- padding-block-end: var(--title-spacing);
3019
+ input:where([type='radio'])::after,
3020
+ .bs-boolean :where([type="radio"])::after {
3021
+ background-color: var(--bs-bg-base);
3022
+ border-radius: 50%;
3023
+ box-sizing: content-box;
3024
+ content: '';
3025
+ height: var(--inner-dot-size, 0.375rem);
3026
+ left: 50%;
3027
+ position: absolute;
3028
+ top: 50%;
3029
+ transform: translate(-50%, -50%);
3030
+ visibility: hidden;
3031
+ width: var(--inner-dot-size, 0.375rem);
2097
3032
  }
2098
- .bs-empty-state :where(.bs-empty-state-description) {
2099
- color: var(--bs-empty-state-description-color);
2100
- font-size: var(--description-font-size);
2101
- font-weight: var(--description-weight);
2102
- line-height: var(--description-line-height);
3033
+ /* Show checkmark, indeterminate mark, or radio dot */
3034
+ .bs-checkbox:where([data-indeterminate="true"], [data-checked="true"], :checked, :indeterminate)::before,
3035
+ .bs-checkbox:where([data-indeterminate="true"], [data-checked="true"], :checked, :indeterminate)::after,
3036
+ input:where([type='checkbox']:checked, [type='checkbox']:indeterminate, [type='radio']:checked)::before,
3037
+ input:where([type='checkbox']:checked, [type='checkbox']:indeterminate, [type='radio']:checked)::after,
3038
+ .bs-boolean :where([type='checkbox']:checked, [type='checkbox']:indeterminate, [type='radio']:checked)::before,
3039
+ .bs-boolean :where([type='checkbox']:checked, [type='checkbox']:indeterminate, [type='radio']:checked)::after {
3040
+ visibility: visible;
2103
3041
  }
2104
- .bs-empty-state :where(a) {
2105
- color: var(--bs-ink-blue);
2106
- text-decoration: underline;
3042
+ /* ---------- Sizes ----------- */
3043
+ .bs-boolean:where([data-size="sm"]),
3044
+ .bs-checkbox:where([data-size="sm"]) {
3045
+ --filled-size: 0.75rem;
3046
+ --inner-check-height: 0.5625rem;
3047
+ --inner-check-width: 0.3125rem;
3048
+ --inner-dash-height: 0.125rem;
3049
+ --inner-dash-width: .75em;
3050
+ --inner-dot-size: 0.25rem;
2107
3051
  }
2108
- .bs-empty-state :where(a:hover) {
2109
- cursor: pointer;
3052
+ /* ---------- Disabled State ----------- */
3053
+ :where(input[type="checkbox"], input[type="radio"]):disabled,
3054
+ .bs-boolean:where([data-disabled="true"]),
3055
+ .bs-checkbox:where([data-disabled="true"]) {
3056
+ --box-shadow: var(--bs-ink-disabled);
3057
+ --fill-bg-color: var(--bs-ink-disabled);
3058
+ background-color: transparent;
3059
+ cursor: default;
3060
+ pointer-events: none;
2110
3061
  }
2111
- /* Call to Actions */
2112
- .bs-empty-state
2113
- :where(
2114
- .bs-empty-state-description + *,
2115
- .bs-empty-state-title + *:not(.bs-empty-state-description)
2116
- ) {
2117
- margin-block-start: var(--cta-spacing, var(--bs-space-4));
3062
+ /* ---------- Error state ----------- */
3063
+ input:where([type='checkbox'], [type='radio'])[data-error]:where(:not([data-error="false"])),
3064
+ .bs-boolean :where(input[data-error="true"]), /* deprecate this one in favor of next line */
3065
+ .bs-boolean:where([data-error="true"]),
3066
+ .bs-checkbox:where([data-error="true"]) {
3067
+ --box-shadow: var(--bs-red-base);
3068
+ --outline-color: var(--bs-red-base);
2118
3069
  }
2119
- /* Sizing */
2120
- .bs-empty-state:where([data-size^='xs']) {
2121
- --col-gap: var(--bs-space-4);
2122
- --cta-spacing: var(--bs-space-2);
2123
- --icon-size: 1.5rem;
2124
- --title-color: var(--bs-ink-light);
2125
- --title-font-size: var(--bs-text-md);
2126
- --title-line-height: var(--bs-leading-base);
2127
- --title-spacing: 0;
3070
+ .bs-character-count {
3071
+ color: var(--bs-ink-base);
3072
+ font-size: var(--bs-text-xs);
3073
+ font-weight: 400;
3074
+ text-align: right;
3075
+ white-space: nowrap;
2128
3076
  }
2129
- .bs-empty-state:where([data-size^='sm']) {
2130
- --description-font-size: var(--bs-text-sm);
2131
- --icon-size: 2rem;
2132
- --title-font-size: var(--bs-text-md);
2133
- --title-line-height: var(--bs-leading-base);
2134
- --title-spacing: 0.125rem;
3077
+ :where(:disabled, [data-disabled="true"]) + .bs-character-count,
3078
+ :where(:disabled, [data-disabled="true"]) .bs-character-count,
3079
+ .bs-character-count:where([data-disabled="true"]) {
3080
+ visibility: hidden;
2135
3081
  }
2136
- .bs-empty-state:where([data-size^='lg']) {
2137
- --col-gap: var(--bs-space-8);
2138
- --cta-spacing: var(--bs-space-6);
2139
- --description-font-size: var(--bs-text-md);
2140
- --icon-size: 4rem;
2141
- --title-font-size: var(--bs-text-xl);
2142
- --title-line-height: 110%;
2143
- --title-weight: var(--bs-font-bold);
3082
+ .bs-character-count:where([data-error="true"]) {
3083
+ color: var(--bs-ink-red);
2144
3084
  }
2145
3085
  /* Generally applicable (all input types) */
2146
3086
  :where([data-required]:not([data-required="false"])) {
@@ -2169,197 +3109,48 @@ uncomment to make visible when testing
2169
3109
  margin-left: 0;
2170
3110
  margin-right: 0;
2171
3111
  padding: 0;
2172
- }
2173
- :where(fieldset legend) {
2174
- margin-bottom: 0.25rem;
2175
- padding: 0;
2176
- }
2177
- :where(label + input, label > input):where(:not([type='checkbox'], [type='radio'])),
2178
- :where(label + textarea, label > textarea),
2179
- :where(label + select, label > select) {
2180
- margin-top: 0.25rem;
2181
- }
2182
- /*
2183
- Custom properties:
2184
- --input-bg (background color)
2185
- --input-border (border color)
2186
- --input-border-width (border width)
2187
- --input-caret (caret color)
2188
- --input-padding-block (padding block)
2189
- --input-padding-inline (padding inline)
2190
- --input-placeholder (placeholder color)
2191
- --input-text-size (font size)
2192
- */
2193
- input:where(:not([type='checkbox'], [type='radio'], [type='file'], [type='range'])),
2194
- textarea,
2195
- select,
2196
- :is(.bs-input, .bs-select, .bs-textarea) {
2197
- -webkit-appearance: none;
2198
- -moz-appearance: none;
2199
- appearance: none;
2200
- background-color: var(--input-bg, transparent);
2201
- border-color: var(--input-border, var(--bs-violet-medium));
2202
- border-radius: 0.25rem;
2203
- border-style: solid;
2204
- border-width: var(--input-border-width, 1px);
2205
- caret-color: var(--input-caret, var(--bs-blue-base));
2206
- color: var(--bs-ink-base);
2207
- font-size: var(--input-text-size, var(--bs-text-base));
2208
- font-weight: 400;
2209
- height: 2.5rem;
2210
- line-height: var(--bs-leading-base);
2211
- padding-block: var(--input-padding-block, 0.0625rem);
2212
- padding-inline: var(--input-padding-inline, 0.75rem);
2213
- }
2214
- input:where(:not([type='checkbox'], [type='radio'], [type='file'], [type='range'])),
2215
- textarea,
2216
- select,
2217
- :is(.bs-input, .bs-select, .bs-textarea) {
2218
- width: 100%;
2219
- }
2220
- input:where([type='text'], [type='email'], [type='url']),
2221
- select,
2222
- .bs-input:where([type='text'], [type='email'], [type='url']),
2223
- :is(.bs-input, .bs-select, .bs-textarea) {
2224
- text-overflow: ellipsis;
2225
- }
2226
- .bs-textarea,
2227
- textarea {
2228
- height: auto;
2229
- padding-block: 0.5rem;
2230
- resize: vertical;
2231
- }
2232
- :is(input, textarea, select)::-moz-placeholder, :is(.bs-input, .bs-select, .bs-textarea)::-moz-placeholder {
2233
- color: var(--input-placeholder, var(--bs-violet-lightest));
2234
- }
2235
- :is(input, textarea, select)::placeholder,
2236
- :is(.bs-input, .bs-select, .bs-textarea)::placeholder,
2237
- :is(.bs-input, .bs-select, .bs-textarea):where([data-placeholder="true"]) {
2238
- color: var(--input-placeholder, var(--bs-violet-lightest));
2239
- }
2240
- :is(input, textarea, select):where(:focus-visible)::-moz-placeholder, :is(.bs-input, .bs-select, .bs-textarea):where(:focus-visible)::-moz-placeholder {
2241
- opacity: 0;
2242
- }
2243
- :is(input, textarea, select):where(:focus-visible)::placeholder,
2244
- :is(.bs-input, .bs-select, .bs-textarea):where(:focus-visible)::placeholder {
2245
- opacity: 0;
2246
- }
2247
- /* FOCUS state */
2248
- :is(input:where(:not([type='checkbox'], [type='radio'])), textarea, select):where(:focus-visible),
2249
- :is(.bs-input, .bs-select, .bs-textarea):where(:focus-visible),
2250
- :is(select, .bs-select):where(:focus) {
2251
- --input-border: var(--bs-blue-base);
2252
- outline-style: none;
2253
- outline-width: 0px;
2254
- }
2255
- /* HOVER state */
2256
- :is(input:where(:not([type='checkbox'], [type='radio'])), textarea, select):where(:hover),
2257
- :is(.bs-input, .bs-select, .bs-textarea):where(:hover) {
2258
- --input-bg: var(--bs-bg-input-hover);
2259
- }
2260
- /* DISABLED state */
2261
- :is(input:where(:not([type='checkbox'],[type='radio'])), textarea, select):where(:disabled),
2262
- :is(.bs-input, .bs-select, .bs-textarea):where(:disabled) {
2263
- --input-border: var(--bs-ink-disabled);
2264
- --input-bg: var(--bs-bg-disabled);
2265
- color: var(--bs-ink-disabled);
2266
- }
2267
- /* Text inputs should not have a border when disabled */
2268
- :is(input:where(:not([type]),[type="text"],[type="number"],[type="email"],[type="password"],[type="url"])):where(:disabled) {
2269
- --input-border-width: 0px;
2270
- }
2271
- /* Errors and Messages */
2272
- :is(input, select, textarea):where([data-error]:not([data-error="false"])),
2273
- :is(.bs-input, .bs-select, .bs-textarea):where([data-error="true"]) {
2274
- --input-border: var(--bs-ink-red);
2275
- }
2276
- /*
2277
- Removes the built-in 'margin' on bottom of textarea
2278
- see https://bugs.chromium.org/p/chromium/issues/detail?id=89530
2279
- */
2280
- :has(> textarea:only-child),
2281
- :has(> .bs-textarea:only-child) {
2282
- display: block;
2283
- line-height: 0;
2284
- }
2285
- /* chrome user agent styling was applying opacity: 0.7 */
2286
- :where(select:disabled) {
2287
- opacity: 1;
2288
- }
2289
- :is(input, textarea, select):disabled::-moz-placeholder, :is(input, textarea, select)[disabled]::-moz-placeholder, :is(.bs-input, .bs-textarea, .bs-select):disabled::-moz-placeholder, :is(.bs-input, .bs-textarea, .bs-select)[disabled]::-moz-placeholder {
2290
- opacity: 0;
2291
- }
2292
- :is(input, textarea, select):disabled::placeholder,
2293
- :is(input, textarea, select)[disabled]::placeholder,
2294
- :is(.bs-input, .bs-textarea, .bs-select):disabled::placeholder,
2295
- :is(.bs-input, .bs-textarea, .bs-select)[disabled]::placeholder {
2296
- opacity: 0;
2297
- }
2298
- /* Select */
2299
- select,
2300
- .bs-select {
2301
- /* URL Encoded SVG dropdown caret so there is something there */
2302
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3E%3Cpath fill='%230A0B19' d='M8.048 13.375a.745.745 0 0 1-.526-.217L0 5.686l1.053-1.061 6.995 6.95 6.897-6.85 1.053 1.06-7.423 7.373a.745.745 0 0 1-.527.217Z'/%3E%3C/svg%3E");
2303
- background-position: right 0.75rem center;
2304
- background-repeat: no-repeat;
2305
- background-size: 1em 1em;
2306
- padding-right: var(--bs-space-9);
2307
- }
2308
- select[multiple],
2309
- .bs-select[multiple] {
2310
- background-image: none;
2311
- height: auto;
2312
- }
2313
- :where(.dark) select,
2314
- :where(.dark) .bs-select {
2315
- --input-bg: var(--bs-bg-base);
2316
- /* URL Encoded SVG dropdown caret so there is something there */
2317
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3E%3Cpath fill='%23ffffff' d='M8.048 13.375a.745.745 0 0 1-.526-.217L0 5.686l1.053-1.061 6.995 6.95 6.897-6.85 1.053 1.06-7.423 7.373a.745.745 0 0 1-.527.217Z'/%3E%3C/svg%3E");
2318
- }
2319
- :where(.dark .box) select,
2320
- :where(.dark .box) .bs-select {
2321
- --input-bg: var(--bg-color, var(--bs-bg-subtle));
2322
- }
2323
- :where(.dark) select:where(:disabled),
2324
- :where(.dark) .bs-select:where(:disabled) {
2325
- /* URL Encoded SVG dropdown caret so there is something there */
2326
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3E%3Cpath fill='%23555775' d='M8.048 13.375a.745.745 0 0 1-.526-.217L0 5.686l1.053-1.061 6.995 6.95 6.897-6.85 1.053 1.06-7.423 7.373a.745.745 0 0 1-.527.217Z'/%3E%3C/svg%3E");
2327
- }
2328
- /* Allows for styling a button to look like a select input */
2329
- :where(button).bs-select {
2330
- align-items: center;
2331
- /* Remove this for buttons since they will have the caret added */
2332
- background-image: none;
2333
- cursor: pointer;
3112
+ }
3113
+ :where(fieldset legend) {
3114
+ margin-bottom: 0.25rem;
3115
+ padding: 0;
3116
+ }
3117
+ .bs-field-details {
2334
3118
  display: flex;
2335
- padding-right: var(--input-padding-inline, 0.75rem);
3119
+ justify-content: space-between;
3120
+ align-items: flex-start;
3121
+ gap: var(--bs-space-2);
3122
+ margin-top: 0.5rem;
2336
3123
  }
2337
- :where(.dark) :where(button).bs-select,
2338
- :where(.dark) :where(button).bs-select:where(:disabled) {
2339
- background-image: none;
3124
+ :where(textarea, bs-textarea) + .bs-field-details {
3125
+ margin-top: 0.25rem;
2340
3126
  }
2341
- :where(button).bs-select :where(*:first-child) {
2342
- flex-grow: 1;
2343
- text-align: left;
3127
+ .bs-field-details :where(.bs-character-count:first-child) {
3128
+ margin-left: auto;
2344
3129
  }
2345
- :where(button).bs-select :where(.bs-icon) {
2346
- color: var(--bs-ink-base);
2347
- transform: none;
2348
- transition-duration: 200ms;
2349
- transition-property: transform;
2350
- transition-timing-function: ease-in-out;
3130
+ .bs-hint {
3131
+ --hint-color: var(--bs-ink-light);
3132
+ color: var(--hint-color);
3133
+ font-size: var(--bs-text-xs);
3134
+ list-style: none;
3135
+ margin: 0;
3136
+ min-width: 0;
3137
+ overflow-wrap: break-word;
3138
+ padding: 0;
2351
3139
  }
2352
- :where(button).bs-select:where([data-open="true"]) :where(.bs-icon) {
2353
- transform: rotate(180deg);
3140
+ .bs-hint:where([data-error]:not([data-error="false"])) {
3141
+ --hint-color: var(--bs-ink-red);
3142
+ }
3143
+ :where(:disabled, [data-disabled="true"]) .bs-hint {
3144
+ --hint-color: var(--bs-ink-disabled);
2354
3145
  }
2355
3146
  /* 0 0 1 for width to allow e.g. tailwind override */
2356
3147
  :is(div, *):where(.bs-input-addon) {
2357
3148
  width: 100%;
2358
3149
  }
2359
3150
  .bs-input-addon {
2360
- --input-border: var(--bs-violet-300);
3151
+ --input-border: var(--bs-border-input);
2361
3152
  align-items: center;
2362
- background-color: var(--input-bg, transparent);
3153
+ background-color: var(--input-bg, var(--bs-bg-base));
2363
3154
  border-radius: .25rem;
2364
3155
  color: var(--bs-ink-base);
2365
3156
  display: flex;
@@ -2369,12 +3160,15 @@ select[multiple],
2369
3160
  pointer-events: none;
2370
3161
  position: relative;
2371
3162
  }
3163
+ :where(.dark) .bs-input-addon {
3164
+ background-color: var(--input-bg, transparent);
3165
+ }
2372
3166
  .bs-input-addon * {
2373
3167
  background-color: transparent;
2374
3168
  }
2375
3169
  /* Fix issue in Windows, where <select> options would be invisible, due to background-color: transparent */
2376
3170
  .bs-input-addon :where(.bs-select, select) {
2377
- background-color: var(--bs-bg-base);
3171
+ background-color: var(--input-bg, var(--bs-bg-base));
2378
3172
  }
2379
3173
  /**
2380
3174
  Implement an outer 'border' via pseudo-element instead of
@@ -2397,11 +3191,15 @@ and issues with box-sizing
2397
3191
  width: 100%;
2398
3192
  }
2399
3193
  .bs-input-addon::after {
3194
+ border-color: var(--input-border);
2400
3195
  border-radius: .25rem;
2401
- border: 1px solid var(--input-border);
3196
+ border-style: solid;
3197
+ border-width: var(--input-border-width, 1px);
2402
3198
  }
2403
3199
  .bs-input-addon :where(.bs-input-addon)::after {
2404
- border: 1px solid var(--input-addon-nested-border);
3200
+ border-color: var(--input-addon-nested-border);
3201
+ border-style: solid;
3202
+ border-width: var(--input-border-width, 1px);
2405
3203
  }
2406
3204
  .bs-input-addon > * {
2407
3205
  flex-grow: 0;
@@ -2450,7 +3248,7 @@ and issues with box-sizing
2450
3248
  /* -------- Inner-bordered styles -------- */
2451
3249
  /** Inner borders should be straight; shown only if variant: "inner-bordered" */
2452
3250
  .bs-input-addon:where([data-variant="inner-bordered"]) {
2453
- --input-addon-nested-border: var(--bs-violet-lightest);
3251
+ --input-addon-nested-border: var(--bs-violet-200);
2454
3252
  }
2455
3253
  .bs-input-addon > :where(.bs-input-addon:not(:last-child, :focus-within, [data-part="right"])),
2456
3254
  .bs-input-addon > :where(:not(:last-child, :focus-within, [data-part="right"]))::after {
@@ -2504,12 +3302,6 @@ and issues with box-sizing
2504
3302
  max-height: 100%;
2505
3303
  width: 1rem;
2506
3304
  }
2507
- /* -------- Hover styles -------- */
2508
- .bs-input-addon:hover,
2509
- :where(label):hover + .bs-input-addon,
2510
- :where(label):hover + * .bs-input-addon:where(:not(label .bs-input-addon, label + .bs-input-addon)) {
2511
- --input-bg: var(--bs-bg-input-hover);
2512
- }
2513
3305
  /* -------- Focus styles -------- */
2514
3306
  .bs-input-addon {
2515
3307
  --focus-border: var(--bs-blue-base);
@@ -2566,6 +3358,14 @@ and issues with box-sizing
2566
3358
  .bs-input-addon:where([data-disabled]:not([data-disabled="false"])) * {
2567
3359
  pointer-events: none;
2568
3360
  }
3361
+ .bs-input-addon:where([data-disabled]:not([data-disabled="false"]))::after,
3362
+ .bs-input-addon:where([data-disabled]:not([data-disabled="false"]))::before,
3363
+ .bs-input-addon:where([data-disabled]:not([data-disabled="false"])):where([data-variant="inner-bordered"]) {
3364
+ --input-border-width: 0;
3365
+ }
3366
+ .bs-input-addon:where([data-disabled]:not([data-disabled="false"])):where([data-variant="inner-bordered"]) > :where(:not(:focus, :focus-within))::after {
3367
+ border-right-width: 0;
3368
+ }
2569
3369
  /* -------- Error styles -------- */
2570
3370
  .bs-input-addon:where([data-error]:not([data-error="false"])),
2571
3371
  .bs-input-addon:where([data-error]:not([data-error="false"])) :where(.bs-input-addon) {
@@ -2615,6 +3415,9 @@ data-autosize-icons="true" - see above
2615
3415
  min-width: 6rem;
2616
3416
  padding: 0 1rem;
2617
3417
  }
3418
+ .bs-input-phone .bs-input-addon:where([data-disabled]:not([data-disabled="false"])) :where(button) :where(span) {
3419
+ filter: grayscale(1);
3420
+ }
2618
3421
  .bs-input-phone ul:where(.bs-dropdown-options) {
2619
3422
  min-width: 7.5rem;
2620
3423
  }
@@ -2673,190 +3476,37 @@ data-autosize-icons="true" - see above
2673
3476
  --input-bg: var(--bs-bg-base);
2674
3477
  --input-border: transparent;
2675
3478
  }
2676
- .bs-field-details {
2677
- display: flex;
2678
- justify-content: space-between;
2679
- align-items: flex-start;
2680
- gap: var(--bs-space-2);
2681
- padding: 0 0.75rem;
2682
- margin-top: 0.5rem;
2683
- }
2684
- :where(textarea, bs-textarea) + .bs-field-details {
2685
- margin-top: 0.25rem;
2686
- }
2687
- .bs-field-details :where(.bs-character-count:first-child) {
2688
- margin-left: auto;
2689
- }
2690
- .bs-character-count {
2691
- color: var(--bs-ink-base);
2692
- font-size: var(--bs-text-xs);
2693
- font-weight: 400;
2694
- text-align: right;
2695
- white-space: nowrap;
2696
- }
2697
- :where(:disabled, [data-disabled="true"]) + .bs-character-count,
2698
- :where(:disabled, [data-disabled="true"]) .bs-character-count,
2699
- .bs-character-count:where([data-disabled="true"]) {
2700
- visibility: hidden;
2701
- }
2702
- .bs-character-count:where([data-error="true"]) {
2703
- color: var(--bs-ink-red);
2704
- }
2705
- /* Containers and Labels for Checkbox/Radio */
2706
- .bs-boolean {
2707
- display: inline-flex;
2708
- align-items: center;
2709
- font-size: var(--bs-text-base);
2710
- font-weight: 400;
2711
- line-height: 115%;
2712
- }
2713
- .bs-boolean:where([data-size='sm']) input {
2714
- height: .75rem;
2715
- width: .75rem;
2716
- }
2717
- .bs-boolean label {
2718
- font-size: var(--bs-text-base);
2719
- font-weight: 400;
2720
- line-height: 1.5;
2721
- width: auto;
2722
- }
2723
- /* not using gap on .bs-boolean due to dead click zone */
2724
- .bs-boolean label {
2725
- padding-inline-end: 0.5em;
2726
- }
2727
- .bs-boolean input + label {
2728
- padding-inline: 0.5em 0;
2729
- }
2730
- .bs-boolean:where([data-size='sm']),
2731
- .bs-boolean:where([data-size='sm']) label {
2732
- font-size: var(--bs-text-xs);
2733
- }
2734
- /* Checkbox & Radio Input */
2735
- :where(input[type='checkbox'], input[type='radio']),
2736
- :is(.bs-boolean :where(input), .bs-checkbox) { /* .bs-checkbox added to accommodate 'fake' cbs */
2737
- -webkit-appearance: none;
2738
- -moz-appearance: none;
2739
- appearance: none;
2740
- box-shadow: inset 0 0 0 0.125rem var(--box-shadow, var(--bs-ink-base));
2741
- cursor: pointer;
2742
- display: grid;
2743
- height: 1rem;
2744
- margin: 0;
2745
- place-content: center;
3479
+ :where(label, legend),
3480
+ label:where(.bs-label) {
3481
+ display: inline-block;
2746
3482
  position: relative;
2747
- width: 1rem;
2748
- }
2749
- :where(input[type='checkbox'], input[type='radio']):focus-visible,
2750
- :is(.bs-boolean :where(input), .bs-checkbox):focus-visible {
2751
- box-shadow: inset 0 0 0 0.125rem var(--box-shadow, var(--bs-ink-base)),
2752
- 0 0 0 2px var(--offset-color, var(--bs-bg-base)),
2753
- 0 0 0 4px var(--outline-color, var(--bs-blue-base));
2754
- outline: 2px solid transparent;
2755
- }
2756
- :where(input[type='checkbox']),
2757
- :is(.bs-boolean :where([type='checkbox']), .bs-checkbox) {
2758
- border-radius: 0.125rem;
2759
- }
2760
- :where(input[type='radio']),
2761
- .bs-boolean :where([type='radio']) {
2762
- border-radius: 50%;
2763
- }
2764
- /* Checkbox's checkbox, checkmark. Checkmark is hidden unless checked/indeterminate. */
2765
- input:where([type='checkbox'])::before,
2766
- :is(.bs-boolean :where([type="checkbox"]), .bs-checkbox)::before {
2767
- --cb-filled-size: var(--filled-size, 1rem);
2768
- content: '';
2769
- border-radius: 0.125rem;
2770
- box-shadow: inset var(--cb-filled-size) var(--cb-filled-size) var(--fill-bg-color, var(--bs-blue-base));
2771
- height: var(--cb-filled-size);
2772
- visibility: hidden;
2773
- width: var(--cb-filled-size);
2774
- }
2775
- input:where([type='checkbox'])::after,
2776
- :is(.bs-boolean :where([type="checkbox"]), .bs-checkbox)::after {
2777
- border: solid var(--bs-bg-base);
2778
- border-width: 0 0.125rem 0.125rem 0;
2779
- content: '';
2780
- height: var(--inner-check-height, 0.75em);
2781
- left: 50%;
2782
- position: absolute;
2783
- top: 50%;
2784
- transform-origin: center;
2785
- transform: translate(-50%, -60%) rotate(45deg);
2786
- visibility: hidden;
2787
- width: var(--inner-check-width, 0.375em);
2788
- }
2789
- input:where([type='checkbox']):where(:indeterminate)::after,
2790
- .bs-boolean :where([type="checkbox"]):where(:indeterminate)::after,
2791
- .bs-checkbox:where([data-indeterminate="true"], :indeterminate)::after {
2792
- border: none;
2793
- background-color: var(--bs-bg-base);
2794
- height: var(--inner-dash-height, 0.125rem);
2795
- transform: translate(-50%, -0.0625rem) rotate(0deg);
2796
- width: var(--inner-dash-width, 0.625em);
2797
- }
2798
- /* Radio outer circle, Radio dot. Dot is hidden unless checked. */
2799
- input:where([type='radio'])::before,
2800
- .bs-boolean :where([type="radio"])::before {
2801
- --radio-filled-size: var(--filled-size, 1rem);
2802
- background-color: var(--fill-bg-color, var(--bs-blue-base));
2803
- border-radius: 50%;
2804
- box-sizing: content-box;
2805
- content: '';
2806
- height: var(--radio-filled-size);
2807
- visibility: hidden;
2808
- width: var(--radio-filled-size);
2809
- }
2810
- input:where([type='radio'])::after,
2811
- .bs-boolean :where([type="radio"])::after {
2812
- background-color: var(--bs-bg-base);
2813
- border-radius: 50%;
2814
- box-sizing: content-box;
2815
- content: '';
2816
- height: var(--inner-dot-size, 0.375rem);
2817
- left: 50%;
2818
- position: absolute;
2819
- top: 50%;
2820
- transform: translate(-50%, -50%);
2821
- visibility: hidden;
2822
- width: var(--inner-dot-size, 0.375rem);
2823
- }
2824
- /* Show checkmark, indeterminate mark, or radio dot */
2825
- .bs-checkbox:where([data-indeterminate="true"], [data-checked="true"], :checked, :indeterminate)::before,
2826
- .bs-checkbox:where([data-indeterminate="true"], [data-checked="true"], :checked, :indeterminate)::after,
2827
- input:where([type='checkbox']:checked, [type='checkbox']:indeterminate, [type='radio']:checked)::before,
2828
- input:where([type='checkbox']:checked, [type='checkbox']:indeterminate, [type='radio']:checked)::after,
2829
- .bs-boolean :where([type='checkbox']:checked, [type='checkbox']:indeterminate, [type='radio']:checked)::before,
2830
- .bs-boolean :where([type='checkbox']:checked, [type='checkbox']:indeterminate, [type='radio']:checked)::after {
2831
- visibility: visible;
3483
+ width: 100%;
2832
3484
  }
2833
- /* ---------- Sizes ----------- */
2834
- .bs-boolean:where([data-size="sm"]),
2835
- .bs-checkbox:where([data-size="sm"]) {
2836
- --filled-size: 0.75rem;
2837
- --inner-check-height: 0.5625rem;
2838
- --inner-check-width: 0.3125rem;
2839
- --inner-dash-height: 0.125rem;
2840
- --inner-dash-width: .75em;
2841
- --inner-dot-size: 0.25rem;
3485
+ .bs-label,
3486
+ :where(label, legend) {
3487
+ --label-color: var(--bs-ink-base);
3488
+ color: var(--label-color);
3489
+ font-size: var(--bs-text-sm);
3490
+ font-weight: 600;
3491
+ line-height: var(--bs-leading-base);
2842
3492
  }
2843
- /* ---------- Disabled State ----------- */
2844
- :where(input[type="checkbox"], input[type="radio"]):disabled,
2845
- .bs-boolean:where([data-disabled="true"]),
2846
- .bs-checkbox:where([data-disabled="true"]) {
2847
- --box-shadow: var(--bs-ink-disabled);
2848
- --fill-bg-color: var(--bs-ink-disabled);
2849
- background-color: transparent;
2850
- cursor: default;
2851
- pointer-events: none;
3493
+ /* Required asterisk */
3494
+ :where(label, legend) :where([data-required]:not([data-required="false"])),
3495
+ .bs-label :where([data-required="true"]) {
3496
+ color: var(--label-asterisk-color, var(--bs-ink-red));
2852
3497
  }
2853
- /* ---------- Error state ----------- */
2854
- input:where([type='checkbox'], [type='radio'])[data-error]:where(:not([data-error="false"])),
2855
- .bs-boolean :where(input[data-error="true"]), /* deprecate this one in favor of next line */
2856
- .bs-boolean:where([data-error="true"]),
2857
- .bs-checkbox:where([data-error="true"]) {
2858
- --box-shadow: var(--bs-red-base);
2859
- --outline-color: var(--bs-red-base);
3498
+ /* Disabled state */
3499
+ :where(label[data-disabled]:not([data-disabled="false"])),
3500
+ :where(label[data-disabled]:not([data-disabled="false"])) *,
3501
+ .bs-label:where([data-disabled="true"]),
3502
+ .bs-label:where([data-disabled="true"]) * {
3503
+ --label-asterisk-color: transparent;
3504
+ --label-color: var(--bs-ink-disabled);
3505
+ }
3506
+ .bs-label:where(:has(+ input), :has(+ .bs-input-addon), :has(+ :not(label) .bs-input-addon))::after {
3507
+ content: '';
3508
+ inset: 0 0 -.25rem 0;
3509
+ position: absolute;
2860
3510
  }
2861
3511
  .bs-switch {
2862
3512
  --box-shadow: var(--bs-ink-base);
@@ -2992,670 +3642,626 @@ input:where([type='checkbox'], [type='radio'])[data-error]:where(:not([data-erro
2992
3642
  .bs-switch input:where(:disabled) {
2993
3643
  cursor: default;
2994
3644
  }
2995
- .bs-hint {
2996
- --hint-color: var(--bs-ink-light);
2997
- color: var(--hint-color);
2998
- font-size: var(--bs-text-xs);
2999
- list-style: none;
3000
- margin: 0;
3001
- min-width: 0;
3002
- overflow-wrap: break-word;
3003
- padding: 0;
3004
- }
3005
- .bs-hint:where([data-error]:not([data-error="false"])) {
3006
- --hint-color: var(--bs-ink-red);
3007
- }
3008
- :where(:disabled, [data-disabled="true"]) .bs-hint {
3009
- --hint-color: var(--bs-ink-disabled);
3010
- }
3011
- :where(label, legend),
3012
- label:where(.bs-label) {
3013
- display: inline-block;
3014
- position: relative;
3015
- width: 100%;
3645
+ :where(label + input, label > input):where(:not([type='checkbox'], [type='radio'])),
3646
+ :where(label + textarea, label > textarea),
3647
+ :where(label + select, label > select) {
3648
+ margin-top: 0.25rem;
3016
3649
  }
3017
- .bs-label,
3018
- :where(label, legend) {
3019
- --label-color: var(--bs-ink-base);
3020
- color: var(--label-color);
3021
- font-size: var(--bs-text-sm);
3022
- font-weight: 600;
3650
+ /*
3651
+ Custom properties:
3652
+ --input-bg (background color)
3653
+ --input-border (border color)
3654
+ --input-border-width (border width)
3655
+ --input-caret (caret color)
3656
+ --input-padding-block (padding block)
3657
+ --input-padding-inline (padding inline)
3658
+ --input-placeholder (placeholder color)
3659
+ --input-text-size (font size)
3660
+ */
3661
+ input:where(:not([type='checkbox'], [type='radio'], [type='file'], [type='range'])),
3662
+ textarea,
3663
+ select,
3664
+ :is(.bs-input, .bs-select, .bs-textarea) {
3665
+ -webkit-appearance: none;
3666
+ -moz-appearance: none;
3667
+ appearance: none;
3668
+ background-color: var(--input-bg, var(--bs-bg-base));
3669
+ border-color: var(--input-border, var(--bs-border-input));
3670
+ border-radius: 0.25rem;
3671
+ border-style: solid;
3672
+ border-width: var(--input-border-width, 1px);
3673
+ caret-color: var(--input-caret, var(--bs-blue-base));
3674
+ color: var(--bs-ink-base);
3675
+ font-size: var(--input-text-size, var(--bs-text-base));
3676
+ font-weight: 400;
3677
+ height: 2.5rem;
3023
3678
  line-height: var(--bs-leading-base);
3679
+ padding-block: var(--input-padding-block, 0.0625rem);
3680
+ padding-inline: var(--input-padding-inline, 0.75rem);
3024
3681
  }
3025
- /* Required asterisk */
3026
- :where(label, legend) :where([data-required]:not([data-required="false"])),
3027
- .bs-label :where([data-required="true"]) {
3028
- color: var(--label-asterisk-color, var(--bs-ink-red));
3682
+ :where(.dark) input:where(:not([type='checkbox'], [type='radio'], [type='file'], [type='range'])),
3683
+ :where(.dark) textarea,
3684
+ :where(.dark) select,
3685
+ :where(.dark) :is(.bs-input, .bs-select, .bs-textarea) {
3686
+ --input-bg: transparent;
3029
3687
  }
3030
- /* Disabled state */
3031
- :where(label[data-disabled]:not([data-disabled="false"])),
3032
- :where(label[data-disabled]:not([data-disabled="false"])) *,
3033
- .bs-label:where([data-disabled="true"]),
3034
- .bs-label:where([data-disabled="true"]) * {
3035
- --label-asterisk-color: transparent;
3036
- --label-color: var(--bs-ink-disabled);
3688
+ input:where(:not([type='checkbox'], [type='radio'], [type='file'], [type='range'])),
3689
+ textarea,
3690
+ select,
3691
+ :is(.bs-input, .bs-select, .bs-textarea) {
3692
+ width: 100%;
3037
3693
  }
3038
- .bs-label:where(:has(+ input), :has(+ .bs-input-addon), :has(+ :not(label) .bs-input-addon))::after {
3039
- content: '';
3040
- inset: 0 0 -.25rem 0;
3041
- position: absolute;
3694
+ input:where([type='text'], [type='email'], [type='url']),
3695
+ select,
3696
+ .bs-input:where([type='text'], [type='email'], [type='url']),
3697
+ :is(.bs-input, .bs-select, .bs-textarea) {
3698
+ text-overflow: ellipsis;
3042
3699
  }
3043
- /*
3044
- --btn-main: (this is doing too much.. look into backwards-compatible way to break this up)
3045
- background color (base)
3046
- focus ring color
3047
-
3048
- background colors:
3049
- --btn-secondary: background color (active, hover)
3050
- --btn-light: background color (ghost hover, ghost focus)
3051
-
3052
- border / box-shadow:
3053
- --btn-ghost-ink: the box shadow color for ghost buttons is synced to ink
3054
- --btn-highlight: box shadow color (w/ --btn-main) (active)
3055
-
3056
- padding:
3057
- --btn-padding: padding (changes by size, and on text btns)
3058
-
3059
- text color:
3060
- --btn-ink: text color
3061
- --btn-ghost-ink: text color (ghost)
3062
-
3063
- */
3064
- .bs-button {
3065
- --btn-focus-inset: -0.25rem;
3066
- --btn-focus-pseudo-width: calc(100% + 0.5rem);
3067
- --btn-ghost-ink: var(--bs-ink-blue);
3068
- --btn-highlight: var(--bs-blue-100);
3069
- --btn-ink: var(--bs-white);
3070
- --btn-main: var(--bs-blue-400);
3071
- --btn-padding: .25rem .75rem;
3072
- --btn-secondary: var(--bs-blue-medium);
3073
- --btn-text-size: var(--bs-text-md);
3074
- --btn-weight: 600;
3075
- --btn-height: 2.5rem;
3076
- align-items: center;
3077
- background-color: var(--btn-main);
3078
- border: none;
3079
- border-radius: 0.25rem;
3080
- color: var(--btn-ink);
3081
- -moz-column-gap: var(--bs-space-2);
3082
- column-gap: var(--bs-space-2);
3083
- cursor: pointer;
3084
- display: inline-flex;
3085
- font-size: var(--btn-text-size);
3086
- font-weight: var(--btn-weight);
3087
- height: var(--btn-height);
3088
- justify-content: center;
3089
- line-height: 1.5;
3090
- outline: 2px solid transparent;
3091
- padding: var(--btn-padding);
3092
- position: relative;
3093
- text-decoration: none;
3094
- transition: all 100ms ease-in-out;
3095
- vertical-align: middle;
3700
+ .bs-textarea,
3701
+ textarea {
3702
+ height: auto;
3703
+ padding-block: 0.5rem;
3704
+ resize: vertical;
3096
3705
  }
3097
- .bs-button:where(:not(:disabled):not([aria-disabled="true"]):hover) {
3098
- background-color: var(--btn-secondary);
3706
+ :is(input, textarea, select)::-moz-placeholder, :is(.bs-input, .bs-select, .bs-textarea)::-moz-placeholder {
3707
+ color: var(--input-placeholder, var(--bs-violet-100));
3099
3708
  }
3100
- .bs-button:where(:not(:disabled):not([aria-disabled="true"]):active) {
3101
- background-color: var(--btn-secondary);
3102
- box-shadow: inset 0px 0px 4px 1px var(--btn-main);
3103
- transform-origin: center;
3104
- transform: scale(0.97);
3709
+ :is(input, textarea, select)::placeholder,
3710
+ :is(.bs-input, .bs-select, .bs-textarea)::placeholder,
3711
+ :is(.bs-input, .bs-select, .bs-textarea):where([data-placeholder="true"]) {
3712
+ color: var(--input-placeholder, var(--bs-violet-100));
3105
3713
  }
3106
- /* ------------ Focus Styles ------------ */
3107
- .bs-button::before {
3108
- border-color: transparent;
3109
- border-radius: 0.5rem;
3110
- border-style: solid;
3111
- border-width: 0.125rem;
3112
- content: '';
3113
- height: calc(100% + 0.5rem);
3114
- inset: var(--btn-focus-inset);
3115
- position: absolute;
3116
- transition: border-color 0.125s ease-in-out;
3117
- width: var(--btn-focus-pseudo-width);
3714
+ :where(.dark) :is(input, textarea, select)::-moz-placeholder, :where(.dark) :is(.bs-input, .bs-select, .bs-textarea)::-moz-placeholder {
3715
+ --input-placeholder: var(--bs-violet-200);
3118
3716
  }
3119
- .bs-button:where(:focus:not(:disabled):not([aria-disabled="true"]))::before {
3120
- border-color: var(--btn-main);
3717
+ :where(.dark) :is(input, textarea, select)::placeholder,
3718
+ :where(.dark) :is(.bs-input, .bs-select, .bs-textarea)::placeholder,
3719
+ :where(.dark) :is(.bs-input, .bs-select, .bs-textarea):where([data-placeholder="true"]) {
3720
+ --input-placeholder: var(--bs-violet-200);
3121
3721
  }
3122
- .bs-button:where(:focus-visible:not(:disabled):not([aria-disabled="true"]))::before {
3123
- border-color: var(--btn-main);
3124
- box-shadow: none;
3722
+ :is(input, textarea, select):where(:focus-visible)::-moz-placeholder, :is(.bs-input, .bs-select, .bs-textarea):where(:focus-visible)::-moz-placeholder {
3723
+ opacity: 0;
3125
3724
  }
3126
- .bs-button:where(:focus:not(:focus-visible):not(:disabled):not([aria-disabled="true"]))::before {
3127
- border-color: transparent;
3128
- box-shadow: none;
3725
+ :is(input, textarea, select):where(:focus-visible)::placeholder,
3726
+ :is(.bs-input, .bs-select, .bs-textarea):where(:focus-visible)::placeholder {
3727
+ opacity: 0;
3129
3728
  }
3130
- /* ------------ Ghost Buttons ------------ */
3131
- .bs-button:where([data-ghost]:not([data-ghost="false"])) {
3132
- --btn-ink: var(--btn-ghost-ink);
3133
- --btn-light: var(--bs-blue-10);
3134
- --btn-secondary: var(--bs-blue-10);
3135
- background-color: transparent;
3136
- box-shadow: inset 0 0 0 1px var(--btn-ghost-ink);
3729
+ /* FOCUS state */
3730
+ :is(input:where(:not([type='checkbox'], [type='radio'])), textarea, select):where(:focus-visible),
3731
+ :is(.bs-input, .bs-select, .bs-textarea):where(:focus-visible),
3732
+ :is(select, .bs-select):where(:focus) {
3733
+ --input-border: var(--bs-blue-base);
3734
+ outline-style: none;
3735
+ outline-width: 0px;
3137
3736
  }
3138
- .bs-button:where([data-ghost]:not([data-ghost="false"]))::before {
3139
- border-radius: 0.4375rem;
3737
+ /* DISABLED state */
3738
+ :is(input:where(:not([type='checkbox'],[type='radio'])), textarea, select):where(:disabled),
3739
+ :is(.bs-input, .bs-select, .bs-textarea):where(:disabled) {
3740
+ --input-border: var(--bs-ink-disabled);
3741
+ --input-bg: var(--bs-bg-disabled);
3742
+ color: var(--bs-ink-disabled);
3140
3743
  }
3141
- .bs-button:where([data-ghost]:not([data-ghost="false"]):not(:disabled):not([aria-disabled="true"]):hover),
3142
- .bs-button:where([data-ghost]:not([data-ghost="false"]):not(:disabled):not([aria-disabled="true"]):focus) {
3143
- background-color: var(--btn-light);
3744
+ /* Text inputs should not have a border when disabled */
3745
+ :is(input:where(:not([type]),[type="text"],[type="number"],[type="email"],[type="password"],[type="url"])):where(:disabled),
3746
+ textarea:where(:disabled),
3747
+ select:where(:disabled),
3748
+ :is(.bs-input, .bs-select, .bs-textarea):where(:disabled) {
3749
+ --input-border-width: 0px;
3144
3750
  }
3145
- .bs-button:where([data-ghost]:not([data-ghost="false"]):not(:disabled):not([aria-disabled="true"]):active) {
3146
- box-shadow:
3147
- inset 0 0 0 1px var(--btn-main),
3148
- inset 0px 0px 4px 1px var(--btn-highlight);
3751
+ /* Errors and Messages */
3752
+ :is(input, select, textarea):where([data-error]:not([data-error="false"])),
3753
+ :is(.bs-input, .bs-select, .bs-textarea):where([data-error="true"]) {
3754
+ --input-border: var(--bs-ink-red);
3149
3755
  }
3150
- /* ------------ VARIANTS ------------ */
3151
- .bs-button:where([data-variant^='secondary']) {
3152
- --btn-ghost-ink: var(--bs-ink-plum);
3153
- --btn-highlight: var(--bs-plum-100);
3154
- --btn-light: var(--bs-plum-10);
3155
- --btn-main: var(--bs-plum-base);
3156
- --btn-secondary: var(--bs-plum-medium);
3756
+ /*
3757
+ Removes the built-in 'margin' on bottom of textarea
3758
+ see https://bugs.chromium.org/p/chromium/issues/detail?id=89530
3759
+ */
3760
+ :has(> textarea:only-child),
3761
+ :has(> .bs-textarea:only-child) {
3762
+ display: block;
3763
+ line-height: 0;
3157
3764
  }
3158
- .dark .bs-button:where([data-variant^='secondary']) {
3159
- --btn-highlight: var(--bs-plum-400);
3160
- --btn-light: var(--bs-navy-400);
3765
+ /* chrome user agent styling was applying opacity: 0.7 */
3766
+ :where(select:disabled) {
3767
+ opacity: 1;
3161
3768
  }
3162
- .bs-button:where([data-variant^='positive']) {
3163
- --btn-ghost-ink: var(--bs-ink-purple);
3164
- --btn-highlight: var(--bs-purple-100);
3165
- --btn-light: var(--bs-purple-10);
3166
- --btn-main: var(--bs-purple-400);
3167
- --btn-secondary: var(--bs-purple-medium);
3769
+ :is(input, textarea, select):disabled::-moz-placeholder, :is(input, textarea, select)[disabled]::-moz-placeholder, :is(.bs-input, .bs-textarea, .bs-select):disabled::-moz-placeholder, :is(.bs-input, .bs-textarea, .bs-select)[disabled]::-moz-placeholder {
3770
+ opacity: 0;
3168
3771
  }
3169
- .bs-button:where([data-variant^='warning']) {
3170
- --btn-ghost-ink: var(--bs-ink-orange);
3171
- --btn-highlight: var(--bs-orange-100);
3172
- --btn-light: var(--bs-orange-10);
3173
- --btn-main: var(--bs-orange-warning);
3174
- --btn-secondary: var(--bs-orange-base);
3772
+ :is(input, textarea, select):disabled::placeholder,
3773
+ :is(input, textarea, select)[disabled]::placeholder,
3774
+ :is(.bs-input, .bs-textarea, .bs-select):disabled::placeholder,
3775
+ :is(.bs-input, .bs-textarea, .bs-select)[disabled]::placeholder {
3776
+ opacity: 0;
3175
3777
  }
3176
- .bs-button:where([data-variant^='negative']) {
3177
- --btn-ghost-ink: var(--bs-ink-red);
3178
- --btn-highlight: var(--bs-red-100);
3179
- --btn-light: var(--bs-red-10);
3180
- --btn-main: var(--bs-red-400);
3181
- --btn-secondary: var(--bs-red-medium);
3778
+ /* Select */
3779
+ select,
3780
+ .bs-select {
3781
+ /* URL Encoded SVG dropdown caret so there is something there */
3782
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3E%3Cpath fill='%230A0B19' d='M8.048 13.375a.745.745 0 0 1-.526-.217L0 5.686l1.053-1.061 6.995 6.95 6.897-6.85 1.053 1.06-7.423 7.373a.745.745 0 0 1-.527.217Z'/%3E%3C/svg%3E");
3783
+ background-position: right 0.75rem center;
3784
+ background-repeat: no-repeat;
3785
+ background-size: 1em 1em;
3786
+ padding-right: var(--bs-space-9);
3182
3787
  }
3183
- /* pink variant */
3184
- .bs-button:where([data-variant^='pink']) {
3185
- --btn-ghost-ink: var(--bs-ink-pink);
3186
- --btn-highlight: var(--bs-pink-400);
3187
- --btn-light: var(--bs-pink-10);
3188
- --btn-main: var(--bs-pink-400);
3189
- --btn-secondary: var(--bs-pink-300);
3788
+ select[multiple],
3789
+ .bs-select[multiple] {
3790
+ background-image: none;
3791
+ height: auto;
3190
3792
  }
3191
- /* royal blue variant */
3192
- .bs-button:where([data-variant^='royal']) {
3193
- --btn-ghost-ink: var(--bs-ink-royal);
3194
- --btn-highlight: var(--bs-royal-400);
3195
- --btn-light: var(--bs-royal-10);
3196
- --btn-main: var(--bs-royal-400);
3197
- --btn-secondary: var(--bs-royal-300);
3793
+ :where(.dark) select,
3794
+ :where(.dark) .bs-select {
3795
+ /* URL Encoded SVG dropdown caret so there is something there */
3796
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3E%3Cpath fill='%23ffffff' d='M8.048 13.375a.745.745 0 0 1-.526-.217L0 5.686l1.053-1.061 6.995 6.95 6.897-6.85 1.053 1.06-7.423 7.373a.745.745 0 0 1-.527.217Z'/%3E%3C/svg%3E");
3198
3797
  }
3199
- /* white variant - for dark backgrounds + ghost btn or text btn only */
3200
- .bs-button:where([data-variant^='white'][data-ghost]:not([data-ghost="false"])) {
3201
- --btn-ghost-ink: var(--bs-ink-white);
3202
- --btn-highlight: var(--bs-ink-white);
3203
- --btn-light: var(--bs-white-10);
3204
- --btn-main: var(--bs-ink-white);
3798
+ :where(.dark) select:where(:disabled),
3799
+ :where(.dark) .bs-select:where(:disabled) {
3800
+ /* URL Encoded SVG dropdown caret so there is something there */
3801
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3E%3Cpath fill='%23555775' d='M8.048 13.375a.745.745 0 0 1-.526-.217L0 5.686l1.053-1.061 6.995 6.95 6.897-6.85 1.053 1.06-7.423 7.373a.745.745 0 0 1-.527.217Z'/%3E%3C/svg%3E");
3205
3802
  }
3206
- /* ------------ Text Button ------------ */
3207
- .bs-button:where([data-text]:not([data-text="false"])) {
3208
- --btn-focus-inset: -0.25rem -0.5rem;
3209
- --btn-focus-pseudo-width: calc(100% + 1rem); /* text btns don't have side padding, but we do want focus outline to look padded */
3210
- --btn-height: auto;
3211
- --btn-ink: var(--bs-ink-blue);
3212
- --btn-padding: 0;
3213
- --btn-secondary: transparent;
3214
- --btn-text-size: var(--bs-text-md);
3215
- --btn-weight: 400;
3216
- background-color: transparent;
3803
+ /* Allows for styling a button to look like a select input */
3804
+ :where(button).bs-select {
3805
+ align-items: center;
3806
+ /* Remove this for buttons since they will have the caret added */
3807
+ background-image: none;
3217
3808
  cursor: pointer;
3218
- line-height: 150%;
3809
+ display: flex;
3810
+ padding-right: var(--input-padding-inline, 0.75rem);
3219
3811
  }
3220
- .bs-button:where([data-text]:not([data-text="false"]):not(:disabled):not([aria-disabled="true"]):hover) {
3221
- --btn-ink: var(--bs-blue-base);
3222
- background-color: transparent;
3223
- text-decoration: underline;
3812
+ :where(.dark) :where(button).bs-select,
3813
+ :where(.dark) :where(button).bs-select:where(:disabled) {
3814
+ background-image: none;
3224
3815
  }
3225
- .bs-button:where([data-text]:not([data-text="false"]):not(:disabled):not([aria-disabled="true"]):hover):has(svg) {
3226
- text-decoration: none;
3816
+ :where(button).bs-select :where(*:first-child) {
3817
+ flex-grow: 1;
3818
+ text-align: left;
3227
3819
  }
3228
- .bs-button:where([data-text]:not([data-text="false"]):not(:disabled):not([aria-disabled="true"]):active) {
3229
- box-shadow: none;
3820
+ :where(button).bs-select :where(.bs-icon) {
3821
+ color: var(--bs-ink-base);
3230
3822
  transform: none;
3823
+ transition-duration: 200ms;
3824
+ transition-property: transform;
3825
+ transition-timing-function: ease-in-out;
3231
3826
  }
3232
- .bs-button:where([data-variant^='negative'][data-text]:not([data-text="false"])),
3233
- .bs-button:where([data-variant^='negative'][data-text]:not([data-text="false"]):not(:disabled):not([aria-disabled="true"]):hover) {
3234
- --btn-ink: var(--bs-ink-red);
3235
- }
3236
- .bs-button:where([data-variant^='white'][data-text]:not([data-text="false"])),
3237
- .bs-button:where([data-variant^='white'][data-text]:not([data-text="false"]):not(:disabled):not([aria-disabled="true"]):hover) {
3238
- --btn-ink: var(--bs-ink-white);
3239
- --btn-main: var(--bs-ink-white);
3827
+ :where(button).bs-select:where([data-open="true"]) :where(.bs-icon) {
3828
+ transform: rotate(180deg);
3240
3829
  }
3241
- /* ------------ Button Sizes, Media-based Text Sizing -------------- */
3242
- /* Std button: Mobile text size, DT text size */
3243
- .bs-button {
3244
- --btn-text-size: 1rem;
3830
+ .bs-horizontal-nav {
3831
+ --bg-color: var(--bs-bg-light);
3832
+ --top-offset: 48px;
3833
+ align-items: center;
3834
+ background-color: var(--bg-color);
3835
+ bottom: auto;
3836
+ display: none;
3837
+ height: 48px;
3838
+ left: 0;
3839
+ position: fixed;
3840
+ right: 0;
3841
+ top: var(--top-offset);
3842
+ z-index: 1001;
3245
3843
  }
3246
- @media (min-width: 1166px) {
3247
- .bs-button {
3248
- --btn-text-size: 1.125rem;
3844
+ @media (min-width: 752px) {
3845
+ .bs-horizontal-nav {
3846
+ display: flex;
3249
3847
  }
3250
3848
  }
3251
- .bs-button:where([data-size^='sm']) {
3252
- --btn-height: 1.75rem;
3253
- --btn-padding: .25rem .75rem .375rem;
3254
- /* Std button size="sm" text size is same across all media sizes */
3255
- --btn-text-size: var(--bs-text-sm);
3256
- }
3257
- /* Text buttons: For now, text size not dependent on media size */
3258
- .bs-button:where([data-text]:not([data-text="false"])) {
3259
- --btn-height: auto;
3260
- --btn-padding: 0;
3261
- --btn-text-size: var(--bs-text-md);
3849
+ .bs-horizontal-nav :where(nav) {
3850
+ align-items: center;
3851
+ display: flex;
3852
+ justify-content: space-between;
3853
+ margin-left: auto;
3854
+ margin-right: auto;
3855
+ max-width: calc(85.5rem + 2.25rem + 2.25rem); /* 1368px + 2.25rem x2 padding */
3856
+ padding-left: 2.25rem;
3857
+ padding-right: 2.25rem;
3858
+ width: 100%;
3262
3859
  }
3263
- .bs-button:where([data-size^='sm'][data-text]:not([data-text="false"])) {
3264
- --btn-text-size: var(--bs-text-base);
3860
+ /* ===== Nav List ===== */
3861
+ .bs-horizontal-nav :where(nav > ul),
3862
+ .bs-horizontal-nav :where(nav > .bs-horizontal-nav-external-links > ul) {
3863
+ align-items: center;
3864
+ display: flex;
3865
+ flex-direction: row;
3866
+ gap: 1.5rem;
3867
+ list-style: none;
3868
+ width: 100%;
3265
3869
  }
3266
- /* Size XS & XXS only applies to text buttons */
3267
- .bs-button:where([data-size^='xs'][data-text]:not([data-text="false"])) {
3268
- --btn-text-size: var(--bs-text-sm);
3870
+ /* ===== Optional Title ===== */
3871
+ .bs-horizontal-nav :where(.bs-horizontal-nav-title) {
3872
+ border-right: 1px solid var(--bs-border-base);
3873
+ padding-right: 1.5rem;
3874
+ width: auto;
3269
3875
  }
3270
- .bs-button:where([data-size^='xxs'][data-text]:not([data-text="false"])) {
3271
- --btn-text-size: var(--bs-text-xs);
3272
- --btn-weight: 600;
3876
+ .bs-horizontal-nav :where(.bs-horizontal-nav-title > a) {
3877
+ cursor: pointer;
3878
+ display: inline;
3879
+ padding-bottom: 0;
3880
+ padding-left: 0;
3881
+ padding-right: 0;
3882
+ padding-top: 0;
3883
+ width: auto;
3273
3884
  }
3274
- /* ------------ Disabled Styling ------------ */
3275
- :where(button:disabled),
3276
- .bs-button:where(:disabled),
3277
- .bs-button:where([aria-disabled="true"]) /* for links as buttons */ {
3278
- pointer-events: none;
3885
+ /* ===== Nav Items ===== */
3886
+ .bs-horizontal-nav :where(nav > ul > li),
3887
+ .bs-horizontal-nav :where(nav > .bs-horizontal-nav-external-links > ul > li) {
3888
+ border-bottom: none;
3889
+ display: list-item;
3890
+ margin-left: 0;
3891
+ width: auto;
3279
3892
  }
3280
- .bs-button:where(:disabled),
3281
- .bs-button:where([aria-disabled="true"]) {
3282
- --btn-ink: var(--bs-ink-disabled);
3283
- --btn-main: var(--bs-bg-disabled);
3284
- box-shadow: none;
3285
- transform: none;
3893
+ .bs-horizontal-nav :where(nav > ul > li:not(.bs-horizontal-nav-title) > a),
3894
+ .bs-horizontal-nav :where(nav > .bs-horizontal-nav-external-links > ul > li > a) {
3895
+ align-items: center;
3896
+ border-radius: 4px;
3897
+ color: var(--bs-ink-light);
3898
+ cursor: pointer;
3899
+ display: flex;
3900
+ font-weight: 400;
3901
+ gap: 0.5rem;
3902
+ height: 100%;
3903
+ padding-bottom: 0.5rem;
3904
+ padding-left: 0;
3905
+ padding-right: 0;
3906
+ padding-top: 0.5rem;
3907
+ width: 100%;
3286
3908
  }
3287
- .bs-button:where([data-ghost]:not([data-ghost="false"])):disabled,
3288
- .bs-button:where([data-ghost]:not([data-ghost="false"]))[aria-disabled="true"] {
3289
- --btn-ghost-ink: var(--bs-ink-disabled);
3909
+ .bs-horizontal-nav :where(nav > ul > li:not(.bs-horizontal-nav-title) > a:hover),
3910
+ .bs-horizontal-nav :where(nav > .bs-horizontal-nav-external-links > ul > li > a:hover) {
3911
+ color: var(--bs-ink-blue);
3290
3912
  }
3291
- .bs-button:where([data-text]:not([data-text="false"])):disabled,
3292
- .bs-button:where([data-text]:not([data-text="false"]))[aria-disabled="true"] {
3293
- --btn-main: transparent;
3913
+ .bs-horizontal-nav :where(nav > ul > li > a[data-active="true"]),
3914
+ .bs-horizontal-nav :where(nav > .bs-horizontal-nav-external-links > ul > li > a[data-active="true"]) {
3915
+ color: var(--bs-ink-base);
3916
+ font-weight: 600;
3294
3917
  }
3295
- /* ------------ links as buttons ------------ */
3296
- a.bs-button {
3297
- align-items: center;
3298
- display: inline-flex;
3299
- outline: none;
3300
- vertical-align: middle;
3918
+ .bs-horizontal-nav :where(nav > ul > li > a[data-active="true"]:hover),
3919
+ .bs-horizontal-nav :where(nav > .bs-horizontal-nav-external-links > ul > li > a[data-active="true"]:hover) {
3920
+ color: var(--bs-ink-blue);
3301
3921
  }
3302
- /*
3303
- Properties : Defaults // Description
3304
- ====================================
3305
- --btn-icon-bg-color: var(--btn-main); // icon bg color (base state)
3306
- --btn-icon-padding: .75rem; // padding around icon svg
3307
- --btn-icon-size: 1.5rem; // svg width and height
3308
- --btn-icon-stroke-color: var(--bs-white);
3309
- --btn-main: var(--bs-blue-base); // many things... should probably break this up
3310
- --btn-text-color: var(--bs-ink-base);
3311
- --btn-text-size: var(--bs-text-md);
3312
-
3313
- --btn-border-color: transparent; // focus state outline color - transparent base state, --btn-main base focus state
3314
- --btn-border-color-focused: var(--btn-main); // focus state ring color set on variants
3315
- --btn-secondary: var(--bs-blue-medium); // hover state icon bg
3316
- --btn-shadow-color-active: var(--btn-main); // active state shadow color (icon bg)
3317
- --btn-text-color-hovered: var(--bs-ink-base); // hover state text color
3318
- */
3319
- :where(.bs-circle-button) {
3320
- --btn-border-color-focused: var(--btn-main);
3321
- --btn-border-color: transparent;
3322
- --btn-focus-inset: -0.25rem;
3323
- --btn-gap: .5rem;
3324
- --btn-icon-bg-color: var(--btn-main);
3325
- --btn-icon-padding: .75rem;
3326
- --btn-icon-size: 1.5rem;
3327
- --btn-icon-stroke-color: var(--bs-white);
3328
- --btn-main: var(--bs-blue-base);
3329
- --btn-secondary: var(--bs-blue-medium);
3330
- --btn-shadow-color-active: var(--btn-main);
3331
- --btn-text-color-hovered: var(--bs-ink-base);
3332
- --btn-text-color: var(--bs-ink-base);
3333
- --btn-text-size: 1.125rem;
3334
- --btn-text-weight: 400;
3922
+ .bs-horizontal-nav :where(.bs-horizontal-nav-first-link-icon) {
3923
+ color: var(--bs-ink-blue);
3924
+ height: 1rem;
3925
+ width: 1rem;
3335
3926
  }
3336
- .bs-circle-button {
3927
+ /* ===== Nested Nav Items ===== */
3928
+ .bs-horizontal-nav :where(.bs-horizontal-nav-nested-toggle) {
3337
3929
  align-items: center;
3338
- background-color: transparent;
3339
- color: var(--btn-text-color);
3340
3930
  cursor: pointer;
3341
- display: inline-flex;
3342
- font-size: var(--btn-text-size);
3343
- font-weight: var(--btn-text-weight);
3344
- gap: var(--btn-gap);
3345
- outline: none;
3346
- position: relative;
3347
- vertical-align: middle;
3931
+ display: flex;
3932
+ gap: 0.5rem;
3933
+ line-height: 1.5;
3934
+ padding-bottom: 0.5rem;
3935
+ padding-top: 0.5rem;
3936
+ }
3937
+ .bs-horizontal-nav :where(.bs-horizontal-nav-nested-toggle:hover) {
3938
+ color: var(--bs-ink-blue);
3939
+ }
3940
+ .bs-horizontal-nav :where(.bs-horizontal-nav-nested-toggle[data-active="true"]) {
3941
+ color: var(--bs-ink-base);
3942
+ font-weight: 600;
3943
+ }
3944
+ .bs-horizontal-nav :where(.bs-horizontal-nav-nested-toggle[data-active="true"]:hover) {
3945
+ color: var(--bs-ink-blue);
3946
+ }
3947
+ .bs-horizontal-nav :where(.bs-horizontal-nav-nested-toggle-caret) {
3948
+ height: 0.75rem;
3949
+ transform: none;
3950
+ transition-duration: 0.2s;
3951
+ transition-property: transform;
3952
+ transition-timing-function: ease-in-out;
3953
+ width: 0.75rem;
3954
+ }
3955
+ .bs-horizontal-nav :where(.bs-horizontal-nav-nested-toggle:hover ~ .bs-horizontal-nav-caret) {
3956
+ color: var(--bs-ink-blue);
3957
+ }
3958
+ .bs-horizontal-nav :where(.bs-horizontal-nav-nested-toggle[data-expanded="true"]) {
3959
+ color: var(--bs-ink-blue);
3960
+ font-weight: 600;
3348
3961
  }
3349
- a.bs-circle-button {
3350
- align-items: center;
3351
- display: inline-flex;
3352
- outline: none;
3353
- text-decoration: none;
3962
+ .bs-horizontal-nav :where(.bs-horizontal-nav-nested-toggle[data-expanded="true"] .bs-horizontal-nav-nested-toggle-caret) {
3963
+ transform: rotate(180deg);
3354
3964
  }
3355
- .bs-circle-button :where(.bs-circle-button-icon) {
3356
- align-items: center;
3357
- background-color: var(--btn-icon-bg-color);
3358
- border: none;
3359
- border-radius: 50%;
3360
- color: var(--btn-icon-stroke-color);
3361
- display: inline-flex;
3362
- justify-content: center;
3363
- outline: 2px solid transparent;
3364
- padding: var(--btn-icon-padding);
3365
- position: relative;
3366
- transition: all 100ms ease-in-out;
3965
+ .bs-horizontal-nav :where(.bs-horizontal-nav-nested-menu) {
3966
+ --dropdown-top: 100%;
3967
+ border-radius: 8px;
3968
+ padding: 1.5rem;
3969
+ width: 10.5rem;
3367
3970
  }
3368
- .bs-circle-button :where(.bs-circle-button-icon)::before {
3369
- border-color: var(--btn-border-color);
3370
- border-radius: 50%;
3371
- border-style: solid;
3372
- border-width: 0.125rem;
3373
- content: '';
3374
- inset: var(--btn-focus-inset);
3375
- position: absolute;
3376
- transition: border-color 125ms ease-in-out, transform 100ms ease-in-out;
3971
+ .bs-horizontal-nav :where(.bs-horizontal-nav-nested-menu > ul) {
3972
+ list-style: none;
3377
3973
  }
3378
- .bs-circle-button :where(.bs-circle-button-icon) :where(.bs-icon) {
3379
- --icon-size: var(--btn-icon-size);
3974
+ .bs-horizontal-nav :where(.bs-horizontal-nav-nested-menu > ul > li) {
3975
+ margin-left: 0;
3380
3976
  }
3381
- /* non-bs-icon svgs */
3382
- .bs-circle-button :where(.bs-circle-button-icon) > :where(svg) {
3383
- height: var(--btn-icon-size);
3384
- width: var(--btn-icon-size);
3977
+ .bs-horizontal-nav :where(.bs-horizontal-nav-nested-menu > ul > li > a) {
3978
+ font-size: 0.875rem;
3385
3979
  }
3386
- /* Icon Buttons with Text */
3387
- .bs-circle-button:where([data-text]:not([data-text="false"])) {
3388
- --btn-text-size: var(--bs-text-md);
3389
- --btn-icon-size: 0.75rem;
3390
- --btn-icon-padding: 0.375rem;
3980
+ .bs-horizontal-nav :where(.bs-horizontal-nav-nested-menu > ul > li > a:hover) {
3981
+ color: var(--bs-ink-blue);
3982
+ text-decoration: underline;
3391
3983
  }
3392
- /* Ghost Buttons */
3393
- .bs-circle-button:where([data-ghost]:not([data-ghost="false"])) {
3394
- --btn-icon-bg-color: transparent;
3395
- --btn-icon-stroke-color: var(--btn-main);
3396
- --btn-light: var(--bs-blue-10);
3397
- --btn-secondary: var(--bs-blue-10);
3984
+ .bs-horizontal-nav :where(.bs-horizontal-nav-nested-menu > ul > li > a[data-active="true"]) {
3985
+ color: var(--bs-ink-base);
3986
+ font-weight: 600;
3398
3987
  }
3399
- /* Active, Hover, Focus states */
3400
- .bs-circle-button:active, .bs-circle-button:hover {
3401
- --btn-icon-bg-color: var(--btn-secondary);
3402
- --btn-text-color: var(--btn-text-color-hovered);
3988
+ .bs-horizontal-nav :where(.bs-horizontal-nav-nested-menu > ul > li > a[data-active="true"]:hover) {
3989
+ color: var(--bs-ink-blue);
3403
3990
  }
3404
- .bs-circle-button:active :where(.bs-circle-button-icon) {
3405
- box-shadow: inset 0px 0px 4px 1px var(--btn-shadow-color-active);
3406
- transform-origin: center;
3407
- transform: scale(0.97);
3991
+ /* ===== External Links ===== */
3992
+ .bs-horizontal-nav :where(.bs-horizontal-nav-external-link-icon) {
3993
+ height: 1rem;
3994
+ width: 1rem;
3408
3995
  }
3409
- .bs-circle-button:where([data-direction="right"]):hover :where(.bs-circle-button-icon),
3410
- .bs-circle-button:where([data-direction="right"]):hover::before {
3411
- transform: translateX(.25rem);
3996
+ /* ===== Slotted Items ===== */
3997
+ .bs-horizontal-nav :where(.bs-horizontal-nav-slotted-items) {
3998
+ margin-left: auto;
3412
3999
  }
3413
- .bs-circle-button:where([data-direction="left"]):hover :where(.bs-circle-button-icon),
3414
- .bs-circle-button:where([data-direction="left"]):hover::before {
3415
- transform: translateX(-.25rem);
4000
+ .bs-horizontal-nav :where(.bs-horizontal-nav-external-links ~ .bs-horizontal-nav-slotted-items) {
4001
+ margin-left: 1.5rem;
3416
4002
  }
3417
- .bs-circle-button:where([data-ghost]:not([data-ghost="false"])):hover {
3418
- --btn-icon-bg-color: var(--btn-light);
4003
+ /* ===== Component-specific ===== */
4004
+ .bs-horizontal-nav :where(.bs-horizontal-nav-nested-menu-override) {
4005
+ --dropdown-top: 0;
4006
+ padding: 1.5rem;
4007
+ width: 10.5rem;
3419
4008
  }
3420
- .bs-circle-button:where(:focus-visible) {
3421
- --btn-border-color: var(--btn-border-color-focused);
4009
+ .bs-horizontal-nav-mobile {
4010
+ --bg-color: var(--bs-bg-light);
4011
+ --top-offset: 48px;
4012
+ -ms-overflow-style: none; /* Internet Explorer 10+ */
4013
+ background-color: var(--bg-color);
4014
+ display: flex;
4015
+ flex-direction: column;
4016
+ height: auto;
4017
+ left: 0;
4018
+ max-height: calc(100vh - var(--top-offset));
4019
+ overflow: scroll;
4020
+ position: fixed;
4021
+ right: 0;
4022
+ scrollbar-width: none; /* Firefox */
4023
+ top: var(--top-offset);
4024
+ z-index: 1001;
3422
4025
  }
3423
- /* Disabled State */
3424
- .bs-circle-button:where(:disabled, [aria-disabled]:not([aria-disabled="false"])) /* for links as buttons */ {
3425
- --btn-icon-stroke-color: var(--bs-ink-disabled);
3426
- --btn-text-color: var(--bs-ink-disabled);
3427
- pointer-events: none;
4026
+ .bs-horizontal-nav-mobile:where([data-shown="true"]) {
4027
+ height: 100vh;
3428
4028
  }
3429
- .bs-circle-button:where(:disabled, [aria-disabled]:not([aria-disabled="false"])) {
3430
- --btn-icon-bg-color: var(--bs-bg-disabled);
4029
+ @media (min-width: 752px) {
4030
+ .bs-horizontal-nav-mobile {
4031
+ display: none;
4032
+ }
3431
4033
  }
3432
- /* Button Size */
3433
- .bs-circle-button:where([data-size^='sm']) {
3434
- --btn-icon-padding: .375rem;
3435
- --btn-icon-size: .75rem;
3436
- --btn-text-size: .875rem;
4034
+ /* ===== Nav List ===== */
4035
+ .bs-horizontal-nav-mobile :where(ul) {
4036
+ display: none;
4037
+ flex-direction: column;
4038
+ list-style: none;
3437
4039
  }
3438
- .bs-circle-button:where([data-size^='sm'][data-text]:not([data-text="false"])) {
3439
- --btn-icon-padding: .3125rem;
3440
- --btn-icon-size: .625rem;
3441
- --btn-text-size: 1rem;
4040
+ .bs-horizontal-nav-mobile:where([data-shown="true"]) :where(ul) {
4041
+ display: flex;
3442
4042
  }
3443
- .bs-circle-button:where([data-size='xs'][data-text]:not([data-text="false"])) {
3444
- --btn-icon-padding: .25rem;
3445
- --btn-icon-size: .5rem;
3446
- --btn-text-size: .875rem;
4043
+ /* ===== Toggle ===== */
4044
+ .bs-horizontal-nav-mobile :where(.bs-horizontal-nav-mobile-toggle) {
4045
+ align-items: center;
4046
+ color: var(--bs-ink-light);
4047
+ cursor: pointer;
4048
+ display: flex;
4049
+ height: 48px;
4050
+ justify-content: space-between;
4051
+ padding-bottom: 0.5rem;
4052
+ padding-left: 2.25rem;
4053
+ padding-right: 2.25rem;
4054
+ padding-top: 0.5rem;
4055
+ width: 100%;
3447
4056
  }
3448
- /* Color Variants */
3449
- .bs-circle-button:where([data-variant^="color"]) {
3450
- --btn-gap: .5rem;
3451
- --btn-icon-bg-color: transparent;
3452
- --btn-icon-padding: 0;
3453
- --btn-icon-size: .75rem; /* stays the same for all sizes */
3454
- --btn-icon-stroke-color: var(--btn-text-color);
3455
- --btn-secondary: transparent;
3456
- --btn-shadow-color-active: transparent;
4057
+ .bs-horizontal-nav-mobile :where(.bs-horizontal-nav-mobile-toggle-title) {
4058
+ align-items: center;
4059
+ display: flex;
4060
+ gap: 0.5rem;
3457
4061
  }
3458
- .bs-circle-button:where([data-variant="color-blue"]) {
3459
- --btn-border-color-focused: var(--bs-ink-blue);
3460
- --btn-text-color: var(--bs-ink-blue);
3461
- --btn-text-color-hovered: var(--bs-blue-base);
4062
+ .bs-horizontal-nav-mobile :where(.bs-horizontal-nav-mobile-toggle-title-icon) {
4063
+ color: var(--bs-ink-blue);
4064
+ height: 1rem;
4065
+ width: 1rem;
3462
4066
  }
3463
- .bs-circle-button:where([data-variant="color-royal"]) {
3464
- --btn-border-color-focused: var(--bs-ink-royal);
3465
- --btn-text-color: var(--bs-ink-royal);
3466
- --btn-text-color-hovered: var(--bs-royal-medium);
4067
+ .bs-horizontal-nav-mobile :where(.bs-horizontal-nav-mobile-toggle-caret) {
4068
+ height: 0.75rem;
4069
+ transform: none;
4070
+ transition-duration: 0.2s;
4071
+ transition-property: transform;
4072
+ transition-timing-function: ease-in-out;
4073
+ width: 0.75rem;
3467
4074
  }
3468
- .bs-circle-button:where([data-variant="color-purple"]) {
3469
- --btn-border-color-focused: var(--bs-purple-400);
3470
- --btn-text-color: var(--bs-ink-purple);
3471
- --btn-text-color-hovered: var(--bs-purple-medium);
4075
+ .bs-horizontal-nav-mobile:where([data-shown="true"]) :where(.bs-horizontal-nav-mobile-toggle-caret) {
4076
+ transform: rotate(180deg);
3472
4077
  }
3473
- .bs-circle-button:where([data-variant="color-pink"]) {
3474
- --btn-border-color-focused: var(--bs-pink-400);
3475
- --btn-text-color: var(--bs-ink-pink);
3476
- --btn-text-color-hovered: var(--bs-pink-base);
4078
+ /* ===== Nav Items ===== */
4079
+ .bs-horizontal-nav-mobile :where(ul > li) {
4080
+ border-top: 1px solid var(--bs-border-base);
3477
4081
  }
3478
- .bs-circle-button:where([data-variant="color-red"]) {
3479
- --btn-border-color-focused: var(--bs-ink-red);
3480
- --btn-text-color: var(--bs-ink-red);
3481
- --btn-text-color-hovered: var(--bs-red-base);
4082
+ .bs-horizontal-nav-mobile :where(ul:not(.bs-horizontal-nav-mobile-nested-menu) > li:last-child) {
4083
+ border-bottom: 1px solid var(--bs-border-base);
3482
4084
  }
3483
- .bs-circle-button:where([data-variant="color-white"]) {
3484
- --btn-border-color-focused: var(--bs-ink-white);
3485
- --btn-text-color: var(--bs-ink-white);
3486
- /* 80% of --bs-white */
3487
- --btn-text-color-hovered: rgba(255, 255, 255, 0.8);
4085
+ .bs-horizontal-nav-mobile :where(ul > li > a) {
4086
+ color: var(--bs-ink-light);
4087
+ cursor: pointer;
4088
+ display: flex;
4089
+ font-weight: 400;
4090
+ padding-bottom: 0.75rem;
4091
+ padding-left: 2.25rem;
4092
+ padding-right: 2.25rem;
4093
+ padding-top: 0.75rem;
3488
4094
  }
3489
- .bs-circle-button:where([data-variant^="color"]):where(:disabled, [aria-disabled]:not([aria-disabled="false"])) {
3490
- --btn-icon-bg-color: transparent;
3491
- --btn-text-color: var(--bs-ink-disabled);
4095
+ .bs-horizontal-nav-mobile :where(ul > li > a:hover) {
4096
+ color: var(--bs-ink-blue);
3492
4097
  }
3493
- /* size XXS only supported for color variants */
3494
- .bs-circle-button:where([data-variant^="color"]):where([data-size='xxs'][data-text]:not([data-text="false"])) {
3495
- --btn-text-size: .75rem;
3496
- --btn-text-weight: 600;
4098
+ .bs-horizontal-nav-mobile :where(ul > li > a[data-active="true"]) {
4099
+ color: var(--bs-ink-base);
4100
+ font-weight: 600;
3497
4101
  }
3498
- /*
3499
- custom properties:
3500
- --filterbtn-caret-size
3501
- --filterbtn-caret-transform
3502
- --filterbtn-color
3503
- --filterbtn-focus-color
3504
- --filterbtn-height
3505
- --filterbtn-text-size
3506
- --filterbtn-weight
3507
- */
3508
- button:where(.bs-filter-button) {
3509
- --filterbtn-caret-size: 1rem;
3510
- --filterbtn-caret-transform: rotate(0deg);
3511
- --filterbtn-color: var(--bs-ink-blue);
3512
- --filterbtn-focus-color: transparent;
3513
- --filterbtn-height: 1.5rem;
3514
- --filterbtn-text-size: var(--bs-text-base);
3515
- --filterbtn-weight: 400;
3516
- flex-shrink: 0;
3517
- position: relative;
4102
+ .bs-horizontal-nav-mobile :where(ul > li > a[data-active="true"]:hover) {
4103
+ color: var(--bs-ink-blue);
3518
4104
  }
3519
- .bs-filter-button {
4105
+ /* ===== Nested Nav Items ===== */
4106
+ .bs-horizontal-nav-mobile :where(.bs-horizontal-nav-mobile-nested-toggle) {
3520
4107
  align-items: center;
3521
- color: var(--filterbtn-color);
3522
- -moz-column-gap: 0.5rem;
3523
- column-gap: 0.5rem;
4108
+ color: var(--bs-ink-light);
3524
4109
  cursor: pointer;
3525
- display: inline-flex;
3526
- font-size: var(--filterbtn-text-size);
3527
- font-weight: var(--filterbtn-weight);
3528
- height: var(--filterbtn-height);
3529
- line-height: 1.5;
3530
- transition: outline-color 100ms ease-in-out;
3531
- width: -moz-max-content;
3532
- width: max-content;
3533
- }
3534
- .bs-filter-button::after {
3535
- border: solid var(--filterbtn-focus-color) 2px;
3536
- border-radius: 0.25rem;
3537
- content: '';
3538
- display: block;
3539
- height: 100%;
3540
- position: absolute;
3541
- transform: scale(1.25);
4110
+ display: flex;
4111
+ justify-content: space-between;
4112
+ padding-bottom: 0.75rem;
4113
+ padding-left: 2.25rem;
4114
+ padding-right: 2.25rem;
4115
+ padding-top: 0.75rem;
3542
4116
  width: 100%;
3543
4117
  }
3544
- .bs-filter-button :where(.bs-icon),
3545
- .bs-filter-button :where(span:has(svg:only-child)) {
4118
+ .bs-horizontal-nav-mobile :where(ul li .bs-horizontal-nav-mobile-nested-toggle[data-active="true"]) {
4119
+ font-weight: 600;
4120
+ }
4121
+ .bs-horizontal-nav-mobile :where(ul li[data-expanded="true"] .bs-horizontal-nav-mobile-nested-toggle) {
4122
+ background-color: var(--bs-bg-medium);
4123
+ color: var(--bs-ink-blue);
4124
+ font-weight: 600;
4125
+ }
4126
+ .bs-horizontal-nav-mobile :where(.bs-horizontal-nav-mobile-nested-toggle:hover) {
4127
+ color: var(--bs-ink-blue);
4128
+ }
4129
+ .bs-horizontal-nav-mobile :where(.bs-horizontal-nav-mobile-nested-toggle-caret) {
4130
+ height: 0.75rem;
4131
+ transform: none;
4132
+ transition-duration: 0.2s;
4133
+ transition-property: transform;
4134
+ transition-timing-function: ease-in-out;
4135
+ width: 0.75rem;
4136
+ }
4137
+ .bs-horizontal-nav-mobile :where(ul li[data-expanded="true"] .bs-horizontal-nav-mobile-nested-toggle-caret) {
4138
+ transform: rotate(180deg);
4139
+ }
4140
+ .bs-horizontal-nav-mobile :where(.bs-horizontal-nav-mobile-nested-menu) {
4141
+ background-color: var(--bs-bg-medium);
4142
+ display: none;
4143
+ }
4144
+ .bs-horizontal-nav-mobile :where(ul li[data-expanded="true"] .bs-horizontal-nav-mobile-nested-menu) {
3546
4145
  display: block;
3547
- height: var(--filterbtn-caret-size);
3548
- line-height: 1;
3549
- transform: var(--filterbtn-caret-transform);
3550
- transform-origin: center;
3551
- transition: var(--bs-trans-rotate180);
3552
- width: var(--filterbtn-caret-size);
3553
4146
  }
3554
- .bs-filter-button:where([data-size="sm"],[data-size="xs"]) {
3555
-
3556
- --filterbtn-text-size: var(--bs-text-sm);
3557
- --filterbtn-caret-size: .75rem;
4147
+ .bs-horizontal-nav-mobile :where(.bs-horizontal-nav-mobile-nested-menu > li) {
4148
+ border-top: none;
3558
4149
  }
3559
- .bs-filter-button:where([data-size="sm"]) {
3560
- --filterbtn-text-size: var(--bs-text-sm);
4150
+ /* ===== External Links ===== */
4151
+ .bs-horizontal-nav-mobile :where(.bs-horizontal-nav-mobile-external-link) {
4152
+ align-items: center;
4153
+ display: flex;
4154
+ gap: 0.5rem;
3561
4155
  }
3562
- .bs-filter-button:where([data-size="xs"]) {
3563
- --filterbtn-text-size: var(--bs-text-xs);
3564
- --filterbtn-weight: 600;
4156
+ .bs-horizontal-nav-mobile :where(.bs-horizontal-nav-mobile-external-link-icon) {
4157
+ height: 1rem;
4158
+ width: 1rem;
3565
4159
  }
3566
- /* Hover state */
3567
- .bs-filter-button:hover {
3568
- --filterbtn-color: var(--bs-blue-base);
4160
+ /* ===== Slotted Items ===== */
4161
+ .bs-horizontal-nav-mobile :where(.bs-horizontal-nav-mobile-slotted-items) {
4162
+ display: none;
4163
+ padding-bottom: 0.75rem;
4164
+ padding-left: 2.25rem;
4165
+ padding-right: 2.25rem;
4166
+ padding-top: 0.75rem;
3569
4167
  }
3570
- /* Focus state */
3571
- .bs-filter-button:where(:focus-visible) {
3572
- outline: none;
3573
- --filterbtn-focus-color: var(--bs-blue-base);
4168
+ .bs-horizontal-nav-mobile:where([data-shown="true"]) :where(.bs-horizontal-nav-mobile-slotted-items) {
4169
+ display: block;
3574
4170
  }
3575
- /* Filter open state */
3576
- .bs-filter-button:where([aria-expanded="true"],[data-open="true"]) {
3577
- --filterbtn-caret-transform: rotate(180deg);
4171
+ .bs-loader {
4172
+ --loader-dot-bg: var(--bs-blue-500);
4173
+ --loader-dot-size: .75rem;
4174
+ --loader-dot-top: calc(50% - var(--loader-dot-size)/2);
4175
+ --loader-dot-translate: 1.75rem; /* i.e., calc(var(--loader-width)/2 - var(--loader-dot-size)/2); */
4176
+ --loader-height: 3rem;
4177
+ --loader-width: 4rem; /* approx 6 * dot size */
4178
+ display: block;
4179
+ height: var(--loader-height);
4180
+ margin-inline-start: auto;
4181
+ margin-inline-end: auto;
4182
+ position: relative;
4183
+ width: var(--loader-width);
3578
4184
  }
3579
- /* Badge non-standard color */
3580
- .bs-filter-button :where(.bs-badge) {
3581
- --badge-bg: var(--bs-ink-blue);
4185
+ .bs-loader:where([data-size="xs"]) {
4186
+ --loader-dot-size: .3rem;
4187
+ --loader-dot-translate: .75rem;
4188
+ --loader-height: .3rem;
4189
+ --loader-width: 1.8rem;
3582
4190
  }
3583
- :where(.dark) .bs-filter-button :where(.bs-badge) {
3584
- --badge-bg: var(--bs-blue-medium);
4191
+ .bs-loader:where([data-size="sm"]) {
4192
+ --loader-dot-size: .5rem;
4193
+ --loader-dot-translate: 1.125rem;
4194
+ --loader-height: .5rem;
4195
+ --loader-width: 3rem;
3585
4196
  }
3586
- .bs-filter-button:hover :where(.bs-badge) {
3587
- --badge-bg: var(--filterbtn-color);
4197
+ .bs-loader:where([data-size="lg"]) {
4198
+ --loader-dot-size: 1rem;
4199
+ --loader-dot-translate: 2.375rem;
4200
+ --loader-height: 4rem;
4201
+ --loader-width: 6rem;
3588
4202
  }
3589
- /* Disabled state */
3590
- .bs-filter-button:where(:disabled) {
3591
- --filterbtn-color: var(--bs-ink-disabled);
3592
- cursor: default;
4203
+ /* ----- loader dots ----- */
4204
+ .bs-loader > :where(*:not(.visually-hidden)) {
4205
+ background-color: var(--loader-dot-bg);
4206
+ border-radius: 50%;
4207
+ display: block;
4208
+ height: var(--loader-dot-size);
4209
+ position: absolute;
4210
+ top: var(--loader-dot-top);
4211
+ width: var(--loader-dot-size);
3593
4212
  }
3594
- .bs-filter-button:where(:disabled) :where(.bs-badge) {
3595
- --badge-bg: var(--bs-bg-disabled);
3596
- --badge-text: var(--bs-ink-disabled);
4213
+ .bs-loader > :where(*:not(.visually-hidden)) {
4214
+ animation-timing-function: cubic-bezier(0, 1, 1, 0);
3597
4215
  }
3598
- .bs-flyout {
3599
- background-color: var(--bs-bg-base-to-light);
3600
- box-shadow: var(--bs-shadow-drawerRight);
3601
- height: 100%;
3602
- left: 0;
3603
- margin: 0;
3604
- max-width: 100vw;
3605
- opacity: 0;
3606
- padding: 1.5rem;
3607
- position: fixed;
3608
- top: 0;
3609
- transform: translateX(-100%);
3610
- transition-duration: 300ms;
3611
- transition-property: opacity, transform;
3612
- transition-timing-function: ease;
3613
- width: 360px;
3614
- z-index: 1000;
4216
+ .bs-loader > :where(*:nth-child(1)) {
4217
+ animation: loading-1 0.6s infinite;
4218
+ left: 0%;
3615
4219
  }
3616
- .bs-flyout:where([data-absolute="true"]) {
3617
- position: absolute;
4220
+ .bs-loader > :where(*:nth-child(2)) {
4221
+ animation: loading-2 0.6s infinite;
4222
+ left: 0%;
3618
4223
  }
3619
- .bs-flyout:where([data-position="right"]) {
3620
- box-shadow: var(--bs-shadow-drawerLeft);
3621
- left: auto;
3622
- right: 0;
3623
- transform: translateX(100%);
4224
+ .bs-loader > :where(*:nth-child(3)) {
4225
+ animation: loading-2 0.6s infinite;
4226
+ left: 40%;
3624
4227
  }
3625
- .bs-flyout:where([data-size="lg"]) {
3626
- width: 535px;
4228
+ .bs-loader > :where(*:nth-child(4)) {
4229
+ animation: loading-3 0.6s infinite;
4230
+ left: 80%;
3627
4231
  }
3628
- .bs-flyout:where([data-shown="true"]) {
3629
- opacity: 1;
3630
- /*
3631
- Needs to be "none" instead of "0" so as not to interfere with calculating
3632
- "containing block" for absolute and fixed positioned elements (see https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block)
3633
- */
3634
- transform: none;
4232
+ /* ----- color variants ----- */
4233
+ .bs-loader:where([data-variant="black"]) {
4234
+ --loader-dot-bg: var(--bs-black);
3635
4235
  }
3636
- .bs-flyout :where(.bs-flyout-close-container) {
3637
- display: flex;
3638
- justify-content: flex-end;
4236
+ .bs-loader:where([data-variant="gray"]) {
4237
+ --loader-dot-bg: var(--bs-gray-400);
3639
4238
  }
3640
- .bs-flyout :where(.bs-flyout-close-container button) {
3641
- cursor: pointer;
3642
- outline-offset: 2px;
3643
- padding: 2px;
4239
+ .bs-loader:where([data-variant="white"]) {
4240
+ --loader-dot-bg: var(--bs-white);
3644
4241
  }
3645
- /* Vue Transition Styles - Only used in Vue component */
3646
- .bs-flyout:where(.bs-flyout-enter-from),
3647
- .bs-flyout:where(.bs-flyout-leave-to) {
3648
- opacity: 0;
3649
- transform: translateX(-100%);
4242
+ @keyframes loading-1 {
4243
+ 0% {
4244
+ transform: scale(0);
4245
+ }
4246
+ 100% {
4247
+ transform: scale(1);
4248
+ }
3650
4249
  }
3651
- .bs-flyout:where([data-position="right"].bs-flyout-enter-from),
3652
- .bs-flyout:where([data-position="right"].bs-flyout-leave-to) {
3653
- transform: translateX(100%);
4250
+ @keyframes loading-2 {
4251
+ 0% {
4252
+ transform: translate(0, 0);
4253
+ }
4254
+ 100% {
4255
+ transform: translate(var(--loader-dot-translate), 0);
4256
+ }
3654
4257
  }
3655
- .bs-flyout:where(.bs-flyout-enter-to),
3656
- .bs-flyout:where(.bs-flyout-leave-from) {
3657
- opacity: 1;
3658
- transform: translateX(0);
4258
+ @keyframes loading-3 {
4259
+ 0% {
4260
+ transform: scale(1);
4261
+ }
4262
+ 100% {
4263
+ transform: scale(0);
4264
+ }
3659
4265
  }
3660
4266
  .bs-modal {
3661
4267
  background-color: var(--bs-bg-base-to-medium);
@@ -3681,7 +4287,7 @@ button:where(.bs-filter-button) {
3681
4287
  }
3682
4288
  @media (min-width: 752px) {
3683
4289
  .bs-modal {
3684
- max-height: 40.625rem;
4290
+ max-height: min(calc(100vh - 3rem), 40.625rem);
3685
4291
  width: 35rem;
3686
4292
  }
3687
4293
  }
@@ -3773,154 +4379,59 @@ button:where(.bs-filter-button) {
3773
4379
  .bs-pagination:where([data-variant="results"]) {
3774
4380
  gap: 1rem;
3775
4381
  }
3776
- .bs-pagination :where(button) {
3777
- align-items: center;
3778
- border-radius: 4px;
3779
- cursor: pointer;
3780
- display: flex;
3781
- min-height: 1.5rem;
3782
- justify-content: center;
3783
- outline: 2px solid transparent;
3784
- min-width: 1.5rem;
3785
- }
3786
- .bs-pagination button:where(:focus),
3787
- .bs-pagination button:where(:focus-visible) {
3788
- outline: 2px solid var(--bs-blue-base);
3789
- }
3790
- .bs-pagination button:where(:focus:not(:focus-visible)) {
3791
- outline: 2px solid transparent;
3792
- }
3793
- .bs-pagination button:where(:disabled) {
3794
- color: var(--bs-ink-disabled);
3795
- }
3796
- .bs-pagination button:where([data-selected]:not([data-selected="false"])) {
3797
- background-color: var(--bs-blue-base);
3798
- color: var(--bs-gray-50);
3799
- }
3800
- .bs-pagination:where([data-fixed]:not([data-fixed="false"])) {
3801
- background-color: var(--bs-bg-base-elevated);
3802
- bottom: 0;
3803
- left: 0;
3804
- padding: 1rem;
3805
- position: fixed;
3806
- width: 100%;
3807
- }
3808
- .bs-pagination :where(.bs-pagination-page-numbers) {
3809
- display: flex;
3810
- gap: 1rem;
3811
- }
3812
- .bs-pagination :where(.bs-pagination-carets) {
3813
- display: flex;
3814
- gap: 1.5rem;
3815
- }
3816
- .bs-pagination :where(.bs-pagination-word-caret) {
3817
- align-items: center;
3818
- gap: 0.5rem;
3819
- width: auto;
3820
- }
3821
- .bs-pagination :where(.bs-pagination-results-numbers) {
3822
- display: flex;
3823
- gap: 0.5rem;
3824
- }
3825
- .bs-pagination :where(.bs-pagination-results-numbers) button {
3826
- padding-left: 2px;
3827
- padding-right: 2px;
3828
- width: auto;
3829
- }
3830
- .bs-loader {
3831
- --loader-dot-bg: var(--bs-blue-500);
3832
- --loader-dot-size: .75rem;
3833
- --loader-dot-top: calc(50% - var(--loader-dot-size)/2);
3834
- --loader-dot-translate: 1.75rem; /* i.e., calc(var(--loader-width)/2 - var(--loader-dot-size)/2); */
3835
- --loader-height: 3rem;
3836
- --loader-width: 4rem; /* approx 6 * dot size */
3837
- display: block;
3838
- height: var(--loader-height);
3839
- margin-inline-start: auto;
3840
- margin-inline-end: auto;
3841
- position: relative;
3842
- width: var(--loader-width);
3843
- }
3844
- .bs-loader:where([data-size="xs"]) {
3845
- --loader-dot-size: .3rem;
3846
- --loader-dot-translate: .75rem;
3847
- --loader-height: .3rem;
3848
- --loader-width: 1.8rem;
3849
- }
3850
- .bs-loader:where([data-size="sm"]) {
3851
- --loader-dot-size: .5rem;
3852
- --loader-dot-translate: 1.125rem;
3853
- --loader-height: .5rem;
3854
- --loader-width: 3rem;
3855
- }
3856
- .bs-loader:where([data-size="lg"]) {
3857
- --loader-dot-size: 1rem;
3858
- --loader-dot-translate: 2.375rem;
3859
- --loader-height: 4rem;
3860
- --loader-width: 6rem;
3861
- }
3862
- /* ----- loader dots ----- */
3863
- .bs-loader > :where(*:not(.visually-hidden)) {
3864
- background-color: var(--loader-dot-bg);
3865
- border-radius: 50%;
3866
- display: block;
3867
- height: var(--loader-dot-size);
3868
- position: absolute;
3869
- top: var(--loader-dot-top);
3870
- width: var(--loader-dot-size);
3871
- }
3872
- .bs-loader > :where(*:not(.visually-hidden)) {
3873
- animation-timing-function: cubic-bezier(0, 1, 1, 0);
3874
- }
3875
- .bs-loader > :where(*:nth-child(1)) {
3876
- animation: loading-1 0.6s infinite;
3877
- left: 0%;
4382
+ .bs-pagination :where(button) {
4383
+ align-items: center;
4384
+ border-radius: 4px;
4385
+ cursor: pointer;
4386
+ display: flex;
4387
+ min-height: 1.5rem;
4388
+ justify-content: center;
4389
+ outline: 2px solid transparent;
4390
+ min-width: 1.5rem;
3878
4391
  }
3879
- .bs-loader > :where(*:nth-child(2)) {
3880
- animation: loading-2 0.6s infinite;
3881
- left: 0%;
4392
+ .bs-pagination button:where(:focus),
4393
+ .bs-pagination button:where(:focus-visible) {
4394
+ outline: 2px solid var(--bs-blue-base);
3882
4395
  }
3883
- .bs-loader > :where(*:nth-child(3)) {
3884
- animation: loading-2 0.6s infinite;
3885
- left: 40%;
4396
+ .bs-pagination button:where(:focus:not(:focus-visible)) {
4397
+ outline: 2px solid transparent;
3886
4398
  }
3887
- .bs-loader > :where(*:nth-child(4)) {
3888
- animation: loading-3 0.6s infinite;
3889
- left: 80%;
4399
+ .bs-pagination button:where(:disabled) {
4400
+ color: var(--bs-ink-disabled);
3890
4401
  }
3891
- /* ----- color variants ----- */
3892
- .bs-loader:where([data-variant="black"]) {
3893
- --loader-dot-bg: var(--bs-black);
4402
+ .bs-pagination button:where([data-selected]:not([data-selected="false"])) {
4403
+ background-color: var(--bs-blue-base);
4404
+ color: var(--bs-gray-50);
3894
4405
  }
3895
- .bs-loader:where([data-variant="gray"]) {
3896
- --loader-dot-bg: var(--bs-gray-400);
4406
+ .bs-pagination:where([data-fixed]:not([data-fixed="false"])) {
4407
+ background-color: var(--bs-bg-base-elevated);
4408
+ bottom: 0;
4409
+ left: 0;
4410
+ padding: 1rem;
4411
+ position: fixed;
4412
+ width: 100%;
3897
4413
  }
3898
- .bs-loader:where([data-variant="white"]) {
3899
- --loader-dot-bg: var(--bs-white);
4414
+ .bs-pagination :where(.bs-pagination-page-numbers) {
4415
+ display: flex;
4416
+ gap: 1rem;
3900
4417
  }
3901
- @keyframes loading-1 {
3902
- 0% {
3903
- transform: scale(0);
3904
- }
3905
- 100% {
3906
- transform: scale(1);
3907
- }
4418
+ .bs-pagination :where(.bs-pagination-carets) {
4419
+ display: flex;
4420
+ gap: 1.5rem;
3908
4421
  }
3909
- @keyframes loading-2 {
3910
- 0% {
3911
- transform: translate(0, 0);
3912
- }
3913
- 100% {
3914
- transform: translate(var(--loader-dot-translate), 0);
3915
- }
4422
+ .bs-pagination :where(.bs-pagination-word-caret) {
4423
+ align-items: center;
4424
+ gap: 0.5rem;
4425
+ width: auto;
3916
4426
  }
3917
- @keyframes loading-3 {
3918
- 0% {
3919
- transform: scale(1);
3920
- }
3921
- 100% {
3922
- transform: scale(0);
3923
- }
4427
+ .bs-pagination :where(.bs-pagination-results-numbers) {
4428
+ display: flex;
4429
+ gap: 0.5rem;
4430
+ }
4431
+ .bs-pagination :where(.bs-pagination-results-numbers) button {
4432
+ padding-left: 2px;
4433
+ padding-right: 2px;
4434
+ width: auto;
3924
4435
  }
3925
4436
  .bs-pill {
3926
4437
  --pill-background: var(--bs-bg-medium);
@@ -4125,6 +4636,44 @@ button:where(.bs-filter-button) {
4125
4636
  .bs-pill:where([data-variant^="filter"])[data-active="false"]:is(:disabled, [aria-disabled="true"]) {
4126
4637
  --pill-border: var(--bs-gray-400);
4127
4638
  }
4639
+ .bs-profile-details {
4640
+ color: var(--bs-ink-light);
4641
+ font-size: var(--bs-text-sm);
4642
+ line-height: 1.3;
4643
+ }
4644
+ .bs-profile-details > :where(*) {
4645
+ display: block;
4646
+ }
4647
+ .bs-profile-details > :where(.bs-profile-name) {
4648
+ color: var(--profile-name-color, var(--bs-ink-base));
4649
+ -webkit-text-decoration: var(--profile-name-decoration, none);
4650
+ text-decoration: var(--profile-name-decoration, none);
4651
+ }
4652
+ /* Action button aka Follow toggle. */
4653
+ .bs-profile-details > :where(button:first-child) {
4654
+ color: var(--profile-action-color, var(--bs-orange-warning));
4655
+ font-size: inherit;
4656
+ }
4657
+ .bs-profile-details > :where(button:first-child:hover) {
4658
+ text-decoration: underline;
4659
+ }
4660
+ /* Remove the profile name underline when hovering on the action button. */
4661
+ .bs-profile-details:has(:where(button:first-child:hover)) {
4662
+ --profile-name-decoration: none;
4663
+ }
4664
+ /* Action button and optional meta details w/ icon */
4665
+ .bs-profile-details > :where([data-icon]) {
4666
+ align-items: center;
4667
+ -moz-column-gap: 0.5rem;
4668
+ column-gap: 0.5rem;
4669
+ cursor: pointer;
4670
+ display: flex;
4671
+ font-size: inherit;
4672
+ }
4673
+ .bs-profile-details .bs-icon {
4674
+ height: .75rem;
4675
+ width: .75rem;
4676
+ }
4128
4677
  .bs-profile-img,
4129
4678
  .bs-profile-img:where([data-img-size^='sm']) {
4130
4679
  --profile-size: 2rem;
@@ -4192,44 +4741,6 @@ button:where(.bs-filter-button) {
4192
4741
  --profile-size: 5.75rem;
4193
4742
  --profile-text: var(--bs-text-2xl);
4194
4743
  }
4195
- .bs-profile-details {
4196
- color: var(--bs-ink-light);
4197
- font-size: var(--bs-text-sm);
4198
- line-height: 1.3;
4199
- }
4200
- .bs-profile-details > :where(*) {
4201
- display: block;
4202
- }
4203
- .bs-profile-details > :where(.bs-profile-name) {
4204
- color: var(--profile-name-color, var(--bs-ink-base));
4205
- -webkit-text-decoration: var(--profile-name-decoration, none);
4206
- text-decoration: var(--profile-name-decoration, none);
4207
- }
4208
- /* Action button aka Follow toggle. */
4209
- .bs-profile-details > :where(button:first-child) {
4210
- color: var(--profile-action-color, var(--bs-orange-warning));
4211
- font-size: inherit;
4212
- }
4213
- .bs-profile-details > :where(button:first-child:hover) {
4214
- text-decoration: underline;
4215
- }
4216
- /* Remove the profile name underline when hovering on the action button. */
4217
- .bs-profile-details:has(:where(button:first-child:hover)) {
4218
- --profile-name-decoration: none;
4219
- }
4220
- /* Action button and optional meta details w/ icon */
4221
- .bs-profile-details > :where([data-icon]) {
4222
- align-items: center;
4223
- -moz-column-gap: 0.5rem;
4224
- column-gap: 0.5rem;
4225
- cursor: pointer;
4226
- display: flex;
4227
- font-size: inherit;
4228
- }
4229
- .bs-profile-details .bs-icon {
4230
- height: .75rem;
4231
- width: .75rem;
4232
- }
4233
4744
  /* Profile with User Details */
4234
4745
  .bs-profile:where([data-layout]),
4235
4746
  .bs-profile:where([data-layout^='vertical']) {
@@ -5160,3 +5671,204 @@ This must go last to properly override the other classes
5160
5671
  opacity: 0;
5161
5672
  transform: translateY(-50%) scale(0.5);
5162
5673
  }
5674
+ .bs-vertical-nav {
5675
+ --active-color: rgba(255, 255, 255, 0.25);
5676
+ --bg-color: var(--bs-navy-base);
5677
+ --border-color: var(--bs-border-dark);
5678
+ --top-offset: 48px;
5679
+ --width: auto;
5680
+ -ms-overflow-style: none; /* Internet Explorer 10+ */
5681
+ background-color: var(--bg-color);
5682
+ color: var(--bs-white);
5683
+ display: none;
5684
+ flex-direction: column;
5685
+ height: 100vh;
5686
+ left: 0;
5687
+ max-height: calc(100vh - var(--top-offset));
5688
+ overflow: scroll;
5689
+ padding-bottom: 1.5rem;
5690
+ padding-left: 1.5rem;
5691
+ padding-right: 1.5rem;
5692
+ padding-top: 1.5rem;
5693
+ position: fixed;
5694
+ right: 0;
5695
+ scrollbar-width: none; /* Firefox */
5696
+ top: var(--top-offset);
5697
+ transition-duration: 0.2s;
5698
+ transition-property: max-height, transform;
5699
+ transition-timing-function: ease;
5700
+ width: var(--width);
5701
+ z-index: 1001;
5702
+ }
5703
+ .bs-vertical-nav:where([data-mobile-shown="true"]) {
5704
+ display: flex;
5705
+ }
5706
+ .dark .bs-vertical-nav {
5707
+ --active-color: rgba(255, 255, 255, 0.25);
5708
+ --bg-color: var(--bs-bg-base);
5709
+ --border-color: var(--bs-border-dark);
5710
+ border-right: 1px solid var(--bs-border-medium);
5711
+ }
5712
+ @media (min-width: 752px) {
5713
+ .bs-vertical-nav {
5714
+ --width: 9.875rem;
5715
+ border-right: 1px solid var(--bg-color);
5716
+ display: flex;
5717
+ padding-bottom: 1rem;
5718
+ padding-left: 0.5rem;
5719
+ padding-right: 0.5rem;
5720
+ padding-top: 1rem;
5721
+ right: auto;
5722
+ }
5723
+
5724
+ .bs-vertical-nav:where([data-narrow="true"]) {
5725
+ --width: 4.5rem;
5726
+ }
5727
+ }
5728
+ .bs-vertical-nav::-webkit-scrollbar {
5729
+ display: none; /* Safari and Chrome */
5730
+ }
5731
+ .bs-vertical-nav:where([data-y-expand="true"]) {
5732
+ transform: translateY(calc(-1 * var(--top-offset)));
5733
+ max-height: 100vh;
5734
+ }
5735
+ /* ===== Sections ===== */
5736
+ .bs-vertical-nav :where(.bs-vertical-nav-section) {
5737
+ border-top: 2px solid var(--border-color);
5738
+ margin-top: 0.5rem;
5739
+ padding-top: 0.5rem;
5740
+ }
5741
+ @media (min-width: 752px) {
5742
+ .bs-vertical-nav :where(.bs-vertical-nav-section) {
5743
+ margin-top: 0.25rem;
5744
+ }
5745
+ }
5746
+ /* Don't show border if the very first item is a section */
5747
+ .bs-vertical-nav :where(ul li:first-child) {
5748
+ border-top: none;
5749
+ margin-top: 0;
5750
+ padding-top: 0;
5751
+ }
5752
+ .bs-vertical-nav :where(.bs-vertical-nav-section-toggle) {
5753
+ align-items: center;
5754
+ cursor: pointer;
5755
+ display: flex;
5756
+ font-size: 0.75rem;
5757
+ font-weight: 600;
5758
+ justify-content: space-between;
5759
+ padding-bottom: 0.5rem;
5760
+ padding-left: 0.75rem;
5761
+ padding-right: 0.5rem;
5762
+ padding-top: 0.5rem;
5763
+ width: 100%;
5764
+ }
5765
+ .bs-vertical-nav :where(.bs-vertical-nav-section-toggle-caret) {
5766
+ height: 0.75rem;
5767
+ transform: none;
5768
+ transition-duration: 0.2s;
5769
+ transition-property: transform;
5770
+ transition-timing-function: ease-in-out;
5771
+ width: 0.75rem;
5772
+ }
5773
+ .bs-vertical-nav :where(.bs-vertical-nav-section[data-collapsed="true"] .bs-vertical-nav-section-toggle-caret) {
5774
+ transform: rotate(180deg);
5775
+ }
5776
+ /* ===== Nav List ===== */
5777
+ .bs-vertical-nav :where(ul) {
5778
+ display: flex;
5779
+ flex-direction: column;
5780
+ gap: 0;
5781
+ list-style: none;
5782
+ margin-top: 0;
5783
+ padding-left: 0;
5784
+ }
5785
+ @media (min-width: 752px) {
5786
+ .bs-vertical-nav :where(ul) {
5787
+ gap: 0.25rem;
5788
+ }
5789
+ }
5790
+ /* ===== Nav List Items / Links */
5791
+ .bs-vertical-nav :where(ul li a) {
5792
+ align-items: center;
5793
+ border-radius: 4px;
5794
+ cursor: pointer;
5795
+ display: flex;
5796
+ font-size: 1rem;
5797
+ font-weight: 400;
5798
+ gap: 0.5rem;
5799
+ height: 100%;
5800
+ padding-bottom: 0.75rem;
5801
+ padding-left: 0.75rem;
5802
+ padding-right: 0.75rem;
5803
+ padding-top: 0.75rem;
5804
+ width: 100%;
5805
+ }
5806
+ @media (min-width: 752px) {
5807
+ .bs-vertical-nav :where(ul li a) {
5808
+ font-size: 0.875rem;
5809
+ padding-bottom: 0.5rem;
5810
+ padding-top: 0.5rem;
5811
+ }
5812
+
5813
+ .bs-vertical-nav:where([data-narrow="true"]) :where(ul li a) {
5814
+ flex-direction: column;
5815
+ font-size: 0.6875rem;
5816
+ gap: 0.25rem;
5817
+ line-height: 110%;
5818
+ padding-bottom: 0.75rem;
5819
+ padding-left: 0.25rem;
5820
+ padding-right: 0.25rem;
5821
+ padding-top: 0.75rem;
5822
+ text-align: center;
5823
+ }
5824
+ }
5825
+ .bs-vertical-nav :where(ul li a:hover) {
5826
+ font-weight: 600;
5827
+ }
5828
+ .bs-vertical-nav :where(ul li a[data-active="true"]) {
5829
+ background-color: var(--active-color);
5830
+ font-weight: 600;
5831
+ }
5832
+ .bs-vertical-nav :where(.bs-vertical-nav-link-icon) {
5833
+ height: 1rem;
5834
+ width: 1rem;
5835
+ }
5836
+ @media (min-width: 752px) {
5837
+ .bs-vertical-nav :where(.bs-vertical-nav-link-icon) {
5838
+ height: 0.875rem;
5839
+ width: 0.875rem;
5840
+ }
5841
+
5842
+ .bs-vertical-nav:where([data-narrow="true"]) :where(.bs-vertical-nav-link-icon) {
5843
+ height: 1rem;
5844
+ width: 1rem;
5845
+ }
5846
+ }
5847
+ /* ===== External Links ===== */
5848
+ .bs-vertical-nav :where(.bs-vertical-nav-external-links) {
5849
+ margin-top: auto;
5850
+ padding-top: 2.25rem;
5851
+ }
5852
+ .bs-vertical-nav:where([data-narrow="true"]) :where(.bs-vertical-nav-external-links) {
5853
+ display: none;
5854
+ }
5855
+ .bs-vertical-nav :where(.bs-vertical-nav-external-links .bs-vertical-nav-external-link-icon) {
5856
+ height: 1rem;
5857
+ width: 1rem;
5858
+ }
5859
+ @media (min-width: 752px) {
5860
+ .bs-vertical-nav :where(.bs-vertical-nav-external-links .bs-vertical-nav-external-link-icon) {
5861
+ height: 0.875rem;
5862
+ width: 0.875rem;
5863
+ }
5864
+ }
5865
+ /* ===== Slotted Items ===== */
5866
+ .bs-vertical-nav :where(.bs-vertical-nav-slotted-items) {
5867
+ margin-top: auto;
5868
+ }
5869
+ .bs-vertical-nav :where(.bs-vertical-nav-external-links ~ .bs-vertical-nav-slotted-items) {
5870
+ margin-top: 1rem;
5871
+ }
5872
+ .bs-vertical-nav:where([data-narrow="true"]) :where(.bs-vertical-nav-slotted-items) {
5873
+ display: none;
5874
+ }