@wwtdev/bsds-css 2.19.0 → 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.
package/dist/wwt-bsds.css CHANGED
@@ -1684,157 +1684,824 @@ a:where(.bs-link):where(:focus:not(:focus-visible)) {
1684
1684
  --banner-padding: var(--banner-padding-dt);
1685
1685
  }
1686
1686
  }
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);
1736
+ position: relative;
1737
+ text-decoration: none;
1738
+ transition: all 100ms ease-in-out;
1739
+ vertical-align: middle;
1740
+ }
1741
+ .bs-button:where(:not(:disabled):not([aria-disabled="true"]):hover) {
1742
+ background-color: var(--btn-secondary);
1743
+ }
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);
1749
+ }
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);
1762
+ }
1763
+ .bs-button:where(:focus:not(:disabled):not([aria-disabled="true"]))::before {
1764
+ border-color: var(--btn-main);
1765
+ }
1766
+ .bs-button:where(:focus-visible:not(:disabled):not([aria-disabled="true"]))::before {
1767
+ border-color: var(--btn-main);
1768
+ box-shadow: none;
1769
+ }
1770
+ .bs-button:where(:focus:not(:focus-visible):not(:disabled):not([aria-disabled="true"]))::before {
1771
+ border-color: transparent;
1772
+ box-shadow: none;
1773
+ }
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);
1781
+ }
1782
+ .bs-button:where([data-ghost]:not([data-ghost="false"]))::before {
1783
+ border-radius: 0.4375rem;
1784
+ }
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);
1788
+ }
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);
1793
+ }
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);
1801
+ }
1802
+ .dark .bs-button:where([data-variant^='secondary']) {
1803
+ --btn-highlight: var(--bs-plum-400);
1804
+ --btn-light: var(--bs-navy-400);
1805
+ }
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
+ }
1687
1946
  .bs-chart {
1688
1947
  display: block;
1689
- height: 100%;
1690
- width: 100%;
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);
2056
+ --legend-border-color: var(--bs-gray-light);
2057
+ --legend-clip-path: border-box;
2058
+ --legend-flexalign: start;
2059
+ --legend-flexdir: column;
2060
+ --legend-flexwrap: nowrap;
2061
+ --legend-item-width: 100%;
2062
+ --legend-max-height: 17.1875rem;
2063
+ --legend-overflow-y: auto;
2064
+ --legend-padding-block: .75rem;
2065
+ --legend-padding-inline: .75rem;
2066
+ }
2067
+ .bs-chart:where([data-layout="chart-left"]) {
2068
+ --chart-gridareas: "chart legend";
2069
+ --chart-gridcols: auto minmax(150px, auto);
2070
+ }
2071
+ .bs-chart:where([data-layout="chart-right"]) {
2072
+ --chart-gridareas: "legend chart";
2073
+ --chart-gridcols: minmax(150px, auto) auto;
2074
+ }
2075
+ .bs-chart-table {
2076
+ border: 0;
2077
+ clip: rect(0 0 0 0);
2078
+ height: 1px;
2079
+ margin: 0;
2080
+ overflow: hidden;
2081
+ padding: 0;
2082
+ position: absolute;
2083
+ white-space: nowrap;
2084
+ width: 1px;
2085
+ }
2086
+ /*
2087
+ uncomment to make visible when testing
2088
+ .bs-chart-table {
2089
+ clip: none;
2090
+ overflow: auto;
2091
+ height: auto;
2092
+ position: relative;
2093
+ width: auto;
2094
+ }
2095
+
2096
+ */
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);
1691
2262
  }
1692
- .bs-chart :where(figure) {
1693
- -moz-column-gap: 2.5rem;
1694
- column-gap: 2.5rem;
1695
- display: grid;
1696
- font-size: .875rem;
1697
- grid-template-areas: var(--chart-gridareas, "chart" "legend");
1698
- grid-template-columns: var(--chart-gridcols, 100%);
1699
- grid-template-rows: var(--chart-gridrows, minmax(0px, auto) minmax(0px, min-content));
1700
- height: 100%;
1701
- margin-block: unset;
1702
- margin-inline: unset;
1703
- position: relative;
1704
- width: 100%;
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);
1705
2267
  }
1706
- .bs-chart :where(figure > :first-child) {
1707
- grid-area: chart;
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);
1708
2272
  }
1709
- .bs-chart :where(figure > :last-child) {
1710
- grid-area: legend;
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);
1711
2277
  }
1712
- .bs-chart :where(figure > div) {
1713
- min-width: 100%;
1714
- width: 100%;
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);
1715
2282
  }
1716
- .bs-chart :where(canvas) {
1717
- width: 100%;
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);
1718
2288
  }
1719
- /* --------- Legend Styles --------- */
1720
- .bs-chart :where(figcaption) {
1721
- background-color: var(--legend-bg-color, transparent);
1722
- border-radius: .5rem;
1723
- border: 1px solid var(--legend-border-color, transparent);
1724
- clip-path: var(--legend-clip-path, none);
1725
- max-height: var(--legend-max-height, 100%);
1726
- overflow-y: var(--legend-overflow-y, hidden);
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);
1727
2292
  }
1728
- .bs-chart :where(figcaption[data-hidden="true"]) {
1729
- border: 0;
1730
- clip: rect(0 0 0 0);
1731
- height: 1px;
1732
- margin: 0;
1733
- overflow: hidden;
1734
- padding: 0;
1735
- position: absolute;
1736
- white-space: nowrap;
1737
- width: 1px;
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;
1738
2297
  }
1739
- .bs-chart :where(ul) {
1740
- align-items: var(--legend-flexalign, center);
2298
+ /* Option list */
2299
+ .bs-dropdown-options {
1741
2300
  display: flex;
1742
- -moz-column-gap: 2.5rem;
1743
- column-gap: 2.5rem;
1744
- flex-direction: var(--legend-flexdir, row);
1745
- flex-wrap: var(--legend-flexwrap, wrap);
1746
- padding-block: var(--legend-padding-block, .25rem);
1747
- /* cjs-legend-padding is set dynamically by chart.js for bar charts */
1748
- padding-inline: var(--legend-padding-inline, var(--cjs-legend-padding-inline, 2.5rem));
1749
- row-gap: .75rem;
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;
1750
2311
  }
1751
- .bs-chart :where(li, li:focus, li:active, li:focus-visible) {
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) {
1752
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;
1753
2351
  cursor: pointer;
1754
- display: flex;
1755
- flex-direction: row;
1756
- outline: 0;
1757
- position: relative;
1758
- width: var(--legend-item-width, auto);
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;
1759
2358
  }
1760
- .bs-chart :where(li)::after {
1761
- border: solid var(--focus-color, transparent) 2px;
1762
- border-radius: 0.25rem;
1763
- content: '';
1764
- display: block;
1765
- inset: -.25rem;
1766
- position: absolute;
2359
+ /* Variant: 2-col */
2360
+ .bs-dropdown-options :where(li[data-variant~="2-col"]) {
2361
+ grid-template-columns: min-content 1fr;
1767
2362
  }
1768
- .bs-chart :where(li:focus-visible) {
1769
- --focus-color: var(--bs-blue-base);
2363
+ /* Variant: 3-col */
2364
+ .bs-dropdown-options :where(li[data-variant~="3-col"]) {
2365
+ grid-template-columns: min-content min-content 1fr;
1770
2366
  }
1771
- .bs-chart :where(li span) {
1772
- background: var(--legend-item-box-fill);
1773
- border-color: var(--legend-item-box-stroke);
1774
- border-radius: var(--legend-item-swatch-radius, 3px);
1775
- display: inline-block;
1776
- height: var(--bs-text-f-md);
1777
- margin-right: 10px;
1778
- width: var(--bs-text-f-md);
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;
1779
2460
  }
1780
- .bs-chart :where(li p) {
1781
- color: var(--legend-item-text-color);
1782
- font-size: var(--bs-text-f-md);
1783
- margin: 0;
1784
- padding: 0;
1785
- -webkit-text-decoration: var(--legend-item-text-decoration);
1786
- text-decoration: var(--legend-item-text-decoration);
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);
1787
2465
  }
1788
- /* --------- Chart Layout Variants --------- */
1789
- /*
1790
- For now, per design team instructions, these are NOT responsive as we're only to expose these
1791
- variants for a very specific, single use-case that involves horizontal scroll...
1792
- If we want to make these responsive in the future, can wrap in media query.
1793
- */
1794
- .bs-chart:where([data-layout="chart-right"], [data-layout="chart-left"]) {
1795
- --chart-gridrows: minmax(0px, auto);
1796
- --legend-bg-color: var(--bs-bg-base);
1797
- --legend-border-color: var(--bs-gray-light);
1798
- --legend-clip-path: border-box;
1799
- --legend-flexalign: start;
1800
- --legend-flexdir: column;
1801
- --legend-flexwrap: nowrap;
1802
- --legend-item-width: 100%;
1803
- --legend-max-height: 17.1875rem;
1804
- --legend-overflow-y: auto;
1805
- --legend-padding-block: .75rem;
1806
- --legend-padding-inline: .75rem;
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);
1807
2472
  }
1808
- .bs-chart:where([data-layout="chart-left"]) {
1809
- --chart-gridareas: "chart legend";
1810
- --chart-gridcols: auto minmax(150px, auto);
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;
1811
2477
  }
1812
- .bs-chart:where([data-layout="chart-right"]) {
1813
- --chart-gridareas: "legend chart";
1814
- --chart-gridcols: minmax(150px, auto) auto;
2478
+ .bs-dropdown:where([data-no-mobile="true"]) :where(.bs-dropdown-options) :where(li[role="separator"]) {
2479
+ padding-right: 0.625rem;
1815
2480
  }
1816
- .bs-chart-table {
1817
- border: 0;
1818
- clip: rect(0 0 0 0);
1819
- height: 1px;
1820
- margin: 0;
1821
- overflow: hidden;
1822
- padding: 0;
1823
- position: absolute;
1824
- white-space: nowrap;
1825
- width: 1px;
2481
+ .bs-dropdown:where([data-no-mobile="true"]) :where(.bs-dropdown-options:focus-visible) :where(li[data-active]) {
2482
+ padding-left: 0.625rem;
1826
2483
  }
1827
- /*
1828
- uncomment to make visible when testing
1829
- .bs-chart-table {
1830
- clip: none;
1831
- overflow: auto;
1832
- height: auto;
1833
- position: relative;
1834
- width: auto;
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;
1835
2486
  }
2487
+ @media (min-width: 1166px) {
2488
+ .bs-dropdown-options :where(li) {
2489
+ padding-left: 0.5rem;
2490
+ padding-right: 0.75rem;
2491
+ }
1836
2492
 
1837
- */
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
+ }
1838
2505
  /* Parent */
1839
2506
  .bs-dropdown-parent {
1840
2507
  display: inline-block;
@@ -1928,360 +2595,492 @@ uncomment to make visible when testing
1928
2595
  --dropdown-wscreen-bottom: calc(100% + 0.5rem);
1929
2596
  --dropdown-wscreen-top: auto;
1930
2597
  }
1931
- /* data-center */
1932
- .bs-dropdown-parent:where([data-center]:not([data-center="false"])) :where(.bs-dropdown) {
1933
- --dropdown-transform: translate(-50%, 0);
1934
- --dropdown-wscreen-left: 50%;
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;
2742
+ }
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);
2751
+ }
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;
2772
+ }
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;
1935
2787
  }
1936
- /* Overrides mobile style when not min-width 1166 */
1937
- .bs-dropdown:where([data-no-mobile="true"]) {
1938
- --dropdown-bottom: var(--dropdown-wscreen-bottom, auto);
1939
- --dropdown-left: var(--dropdown-wscreen-left, initial);
1940
- --dropdown-right: var(--dropdown-wscreen-right, initial);
1941
- --dropdown-top: var(--dropdown-wscreen-top, calc(100% + 0.5rem));
1942
- --dropdown-width: var(--dropdown-wscreen-width, initial);
1943
- --dropdown-transform: initial;
1944
-
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%;
1945
2794
  position: absolute;
2795
+ transform: scale(1.25);
2796
+ width: 100%;
1946
2797
  }
1947
- .bs-dropdown:where([data-no-mobile="true"]) > :where(header) {
1948
- 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);
1949
2807
  }
1950
- @media (min-width: 1166px) {
1951
- .bs-dropdown-backdrop {
1952
- display: none;
1953
- }
1954
-
1955
- .bs-dropdown {
1956
- --dropdown-bottom: var(--dropdown-wscreen-bottom, auto);
1957
- --dropdown-left: var(--dropdown-wscreen-left, initial);
1958
- --dropdown-right: var(--dropdown-wscreen-right, initial);
1959
- --dropdown-top: var(--dropdown-wscreen-top, calc(100% + 0.5rem));
1960
- --dropdown-width: var(--dropdown-wscreen-width, initial);
1961
- --dropdown-transform: initial;
1962
-
1963
- position: absolute;
1964
- }
2808
+ .bs-filter-button:where([data-size="sm"],[data-size="xs"]) {
1965
2809
 
1966
- /* Hide the header */
1967
- .bs-dropdown > :where(header) {
1968
- display: none;
1969
- }
1970
- }
1971
- /* Vue Transition Styles - Only used in Vue component */
1972
- .bs-dropdown:where(.bs-dropdown-enter-from),
1973
- .bs-dropdown:where(.bs-dropdown-leave-to) {
1974
- opacity: 0;
1975
- transform: var(--dropdown-transform);
1976
- }
1977
- .bs-dropdown:where(.bs-dropdown-enter-to),
1978
- .bs-dropdown:where(.bs-dropdown-leave-from) {
1979
- opacity: 1;
1980
- transform: translate(0, 0);
1981
- }
1982
- .bs-dropdown :where(.mobile-select-button-container) {
1983
- display: none;
1984
- overflow: hidden;
2810
+ --filterbtn-text-size: var(--bs-text-sm);
2811
+ --filterbtn-caret-size: .75rem;
1985
2812
  }
1986
- @media (max-width: 1166px) {
1987
- .bs-dropdown :where(.mobile-select-button-container) {
1988
- display: flex;
1989
- }
2813
+ .bs-filter-button:where([data-size="sm"]) {
2814
+ --filterbtn-text-size: var(--bs-text-sm);
1990
2815
  }
1991
- .bs-dropdown :where(.mobile-select-button) {
1992
- margin: .875rem;
1993
- width: 100%;
2816
+ .bs-filter-button:where([data-size="xs"]) {
2817
+ --filterbtn-text-size: var(--bs-text-xs);
2818
+ --filterbtn-weight: 600;
1994
2819
  }
1995
- /* Option list */
1996
- .bs-dropdown-options {
1997
- display: flex;
1998
- flex-direction: column;
1999
- gap: 0.5rem;
2000
- list-style: none;
2001
- margin-bottom: 0.25rem;
2002
- margin-top: 0.25rem;
2003
- max-height: var(--options-height-max, 20rem);/* constrain scrollable to options section */
2004
- overflow-y: auto;
2005
- padding-block: 0.5rem;
2006
- padding-left: 0;
2007
- position: relative;
2820
+ /* Hover state */
2821
+ .bs-filter-button:hover {
2822
+ --filterbtn-color: var(--bs-blue-base);
2008
2823
  }
2009
- .bs-dropdown-options:focus-visible {
2824
+ /* Focus state */
2825
+ .bs-filter-button:where(:focus-visible) {
2010
2826
  outline: none;
2827
+ --filterbtn-focus-color: var(--bs-blue-base);
2011
2828
  }
2012
- /* Stabilize scrollbar gutter for Firefox (https://bugzilla.mozilla.org/show_bug.cgi?id=764076) */
2013
- @media (min-width: 1166px) {
2014
- /* 5th or 8th child triggers overflow-y (depending on variant) */
2015
- :where([data-width="content"]) > .bs-dropdown-options:where(:has([data-variant*="description"]:nth-child(5))),
2016
- :where([data-width="content"]) > .bs-dropdown-options:where(:has(li:not([data-variant*="description"]):nth-child(8))) {
2017
- scrollbar-gutter: stable;
2018
- }
2019
-
2020
- /* Fallback for older Firefox+ only if we're not setting data-overflow values */
2021
- @supports not selector(:has(*)) {
2022
- :where([data-width="content"]) > .bs-dropdown-options {
2023
- scrollbar-gutter: stable;
2024
- }
2025
- }
2026
-
2027
- /* Also allow this for js solutions if :has not available via data-overflow */
2028
- /* Reset scrollbar gutter when data-overflow is used */
2029
- :where([data-width="content"]) > .bs-dropdown-options:where([data-overflow]) {
2030
- scrollbar-gutter: auto;
2031
- }
2032
-
2033
- :where([data-width="content"]) > .bs-dropdown-options:where([data-overflow="true"]) {
2034
- scrollbar-gutter: stable;
2035
- }
2829
+ /* Filter open state */
2830
+ .bs-filter-button:where([aria-expanded="true"],[data-open="true"]) {
2831
+ --filterbtn-caret-transform: rotate(180deg);
2036
2832
  }
2037
- /* Option list item */
2038
- .bs-dropdown-options :where(li) {
2039
- align-items: center;
2040
- border-bottom: 2px solid transparent;
2041
- border-left: 4px solid transparent;
2042
- border-radius: 3px;
2043
- border-right: 2px solid transparent;
2044
- border-top: 2px solid transparent;
2045
- color: var(--bs-ink-base);
2046
- -moz-column-gap: 0.5rem;
2047
- column-gap: 0.5rem;
2048
- cursor: pointer;
2049
- display: grid;
2050
- padding-block: 0.25rem;
2051
- padding-inline: 1.25rem;
2052
- row-gap: 0.125rem;
2053
- word-break: break-word;
2054
- word-wrap: break-word;
2833
+ /* Badge non-standard color */
2834
+ .bs-filter-button :where(.bs-badge) {
2835
+ --badge-bg: var(--bs-ink-blue);
2055
2836
  }
2056
- /* Variant: 2-col */
2057
- .bs-dropdown-options :where(li[data-variant~="2-col"]) {
2058
- grid-template-columns: min-content 1fr;
2837
+ :where(.dark) .bs-filter-button :where(.bs-badge) {
2838
+ --badge-bg: var(--bs-blue-medium);
2059
2839
  }
2060
- /* Variant: 3-col */
2061
- .bs-dropdown-options :where(li[data-variant~="3-col"]) {
2062
- grid-template-columns: min-content min-content 1fr;
2840
+ .bs-filter-button:hover :where(.bs-badge) {
2841
+ --badge-bg: var(--filterbtn-color);
2063
2842
  }
2064
- /* Variant: description */
2065
- .bs-dropdown-options :where(li:not([data-variant*="-col"])[data-variant~="description"] > :nth-child(2)),
2066
- .bs-dropdown-options :where(li[data-variant~="2-col"][data-variant~="description"] > :nth-child(3)),
2067
- .bs-dropdown-options :where(li[data-variant~="3-col"][data-variant~="description"] > :nth-child(4)) {
2068
- color: var(--bs-ink-light);
2069
- font-size: var(--bs-text-xs);
2070
- min-height: 1.125rem;
2071
- line-height: 1.125rem;
2843
+ /* Disabled state */
2844
+ .bs-filter-button:where(:disabled) {
2845
+ --filterbtn-color: var(--bs-ink-disabled);
2846
+ cursor: default;
2072
2847
  }
2073
- /* Variant: 2-col description */
2074
- .bs-dropdown-options :where(li[data-variant~="2-col"][data-variant~="description"] > :nth-child(3)) {
2075
- 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);
2076
2851
  }
2077
- /* Variant: 3-col description */
2078
- .bs-dropdown-options :where(li[data-variant~="3-col"][data-variant~="description"] > :nth-child(4)) {
2079
- 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;
2080
2869
  }
2081
- /* Hover or data-selected */
2082
- .bs-dropdown-options :where(li:not([role="separator"]):hover),
2083
- .bs-dropdown-options :where(li[data-selected]) {
2084
- background-color: var(--bs-bg-medium-to-light);
2085
- border-left: 4px solid var(--bs-ink-blue);
2086
- color: var(--bs-ink-blue);
2087
- outline: none;
2870
+ .bs-flyout:where([data-absolute="true"]) {
2871
+ position: absolute;
2088
2872
  }
2089
- /* Variant: negative */
2090
- .bs-dropdown-options :where(li[data-variant~="negative"]:hover),
2091
- .bs-dropdown-options :where(li[data-variant~="negative"][data-selected]),
2092
- .bs-dropdown-options :where(li[data-variant~="negative"][data-selected]:hover) {
2093
- /* 25% alpha version of --bs-red-400 */
2094
- background-color: rgba(248, 169, 170, 0.25);
2095
- border-left: 4px solid var(--bs-ink-red);
2096
- 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%);
2097
2878
  }
2098
- /* Hover or data-selected for 2-col/3-col/description variants */
2099
- .bs-dropdown-options :where(li:not([data-variant*="-col"])[data-variant~="description"]:hover > :nth-child(2)),
2100
- .bs-dropdown-options :where(li[data-variant~="2-col"][data-variant~="description"]:hover > :nth-child(3)),
2101
- .bs-dropdown-options :where(li[data-variant~="3-col"][data-variant~="description"]:hover > :nth-child(4)),
2102
- .bs-dropdown-options :where(li:not([data-variant*="-col"])[data-variant~="description"][data-selected] > :nth-child(2)),
2103
- .bs-dropdown-options :where(li[data-variant~="2-col"][data-variant~="description"][data-selected] > :nth-child(3)),
2104
- .bs-dropdown-options :where(li[data-variant~="3-col"][data-variant~="description"][data-selected] > :nth-child(4)) {
2105
- color: var(--bs-ink-blue);
2879
+ .bs-flyout:where([data-size="lg"]) {
2880
+ width: 535px;
2106
2881
  }
2107
- /* Hover or data-selected for negative + 2-col/3-col/description variants */
2108
- .bs-dropdown-options :where(li[data-variant~="negative"]:not([data-variant*="-col"])[data-variant~="description"]:hover > :nth-child(2)),
2109
- .bs-dropdown-options :where(li[data-variant~="negative"][data-variant~="2-col"][data-variant~="description"]:hover > :nth-child(3)),
2110
- .bs-dropdown-options :where(li[data-variant~="negative"][data-variant~="3-col"][data-variant~="description"]:hover > :nth-child(4)),
2111
- .bs-dropdown-options :where(li[data-variant~="negative"]:not([data-variant*="-col"])[data-variant~="description"][data-selected] > :nth-child(2)),
2112
- .bs-dropdown-options :where(li[data-variant~="negative"][data-variant~="2-col"][data-variant~="description"][data-selected] > :nth-child(3)),
2113
- .bs-dropdown-options :where(li[data-variant~="negative"][data-variant~="3-col"][data-variant~="description"][data-selected] > :nth-child(4)) {
2114
- 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;
2115
2889
  }
2116
- /* List option keyboard navigation focus */
2117
- .bs-dropdown-options:where(:focus-visible) :where(li[data-active]) {
2118
- --focus-border-color: var(--bs-blue-base);
2119
- border: 2px solid var(--focus-border-color);
2120
- outline: none;
2121
- padding-left: 1.375rem;
2890
+ .bs-flyout :where(.bs-flyout-close-container) {
2891
+ display: flex;
2892
+ justify-content: flex-end;
2122
2893
  }
2123
- /* Navigation focus on a selected element should preserve 4px left border */
2124
- .bs-dropdown-options:where(:focus-visible) :where(li[data-selected][data-active]) {
2125
- border-left: 4px solid var(--focus-border-color);
2126
- padding-left: 1.25rem;
2894
+ .bs-flyout :where(.bs-flyout-close-container button) {
2895
+ cursor: pointer;
2896
+ outline-offset: 2px;
2897
+ padding: 2px;
2127
2898
  }
2128
- /* data-variant="negative" list option keyboard navigation focus */
2129
- .bs-dropdown-options:where(:focus-visible) :where(li[data-variant~="negative"][data-active]) {
2130
- --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%);
2131
2904
  }
2132
- /* Multi-select divider */
2133
- .bs-dropdown-options :where(li[role="separator"]) {
2134
- cursor: default;
2135
- padding-block: 0.125rem;
2136
- 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%);
2137
2908
  }
2138
- /* Multi-select divider line */
2139
- .bs-dropdown-options :where(hr) {
2140
- background-color: var(--bs-navy-light);
2141
- height: .0625rem;
2142
- margin-block: 0;
2143
- 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);
2144
2913
  }
2145
- /* Disable hover styles */
2146
- .bs-dropdown-options :where(li[data-no-hover]:hover) {
2147
- background-color: transparent;
2148
- border-left-color: transparent;
2149
- color: var(--bs-ink-base);
2150
- 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%;
2151
2921
  }
2152
- /* Style label to look like other options */
2153
- .bs-dropdown-options :where(li label) {
2154
- cursor: pointer;
2155
- 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);
2156
2928
  font-weight: 400;
2929
+ line-height: 1.5;
2930
+ width: auto;
2157
2931
  }
2158
- /* Don't change option color when checkbox is present */
2159
- .bs-dropdown-options :where(li[data-variant~="checkbox"]):hover,
2160
- .bs-dropdown-options :where(li[data-variant~="checkbox"][data-selected]) {
2161
- 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;
2162
2935
  }
2163
- /* Don't change description color when checkbox is present */
2164
- .bs-dropdown-options :where(li[data-variant~="checkbox"][data-variant~="2-col"][data-variant~="description"]):hover > :nth-child(3),
2165
- .bs-dropdown-options :where(li[data-variant~="checkbox"][data-variant~="2-col"][data-variant~="description"][data-selected]) > :nth-child(3),
2166
- .bs-dropdown-options :where(li[data-variant~="checkbox"][data-variant~="3-col"][data-variant~="description"]):hover > :nth-child(4),
2167
- .bs-dropdown-options :where(li[data-variant~="checkbox"][data-variant~="3-col"][data-variant~="description"][data-selected]) > :nth-child(4) {
2168
- color: var(--bs-ink-light);
2936
+ .bs-boolean input + label {
2937
+ padding-inline: 0.5em 0;
2169
2938
  }
2170
- /* Overrides mobile style when not min-width 1166 */
2171
- .bs-dropdown:where([data-no-mobile="true"]) :where(.bs-dropdown-options) :where(li) {
2172
- padding-left: 0.5rem;
2173
- 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);
2174
2942
  }
2175
- .bs-dropdown:where([data-no-mobile="true"]) :where(.bs-dropdown-options) :where(li[role="separator"]) {
2176
- 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;
2177
2957
  }
2178
- .bs-dropdown:where([data-no-mobile="true"]) :where(.bs-dropdown-options:focus-visible) :where(li[data-active]) {
2179
- 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;
2180
2964
  }
2181
- .bs-dropdown:where([data-no-mobile="true"]) :where(.bs-dropdown-options:focus-visible) :where(li[data-selected][data-active]) {
2182
- padding-left: 0.5rem;
2965
+ :where(input[type='checkbox']),
2966
+ :is(.bs-boolean :where([type='checkbox']), .bs-checkbox) {
2967
+ border-radius: 0.125rem;
2183
2968
  }
2184
- @media (min-width: 1166px) {
2185
- .bs-dropdown-options :where(li) {
2186
- padding-left: 0.5rem;
2187
- padding-right: 0.75rem;
2188
- }
2189
-
2190
- .bs-dropdown-options :where(li[role="separator"]) {
2191
- padding-right: 0.625rem;
2192
- }
2193
-
2194
- .bs-dropdown-options:where(:focus-visible) :where(li[data-active]) {
2195
- padding-left: 0.625rem;
2196
- }
2197
-
2198
- .bs-dropdown-options:where(:focus-visible) :where(li[data-selected][data-active]) {
2199
- padding-left: 0.5rem;
2200
- }
2969
+ :where(input[type='radio']),
2970
+ .bs-boolean :where([type='radio']) {
2971
+ border-radius: 50%;
2201
2972
  }
2202
- .bs-empty-state {
2203
- --bs-empty-state-description-color: var(--bs-ink-light);
2204
- --bs-empty-state-icon-color: var(--bs-violet-300);
2205
- --bs-empty-state-title-color: var(--bs-ink-base);
2206
- --col-gap: var(--bs-space-6);
2207
- --cta-spacing: var(--bs-space-4);
2208
- --description-font-size: var(--bs-text-base);
2209
- --description-line-height: var(--bs-leading-base);
2210
- --description-weight: var(--bs-font-normal);
2211
- --icon-size: 3rem;
2212
- --title-font-size: var(--bs-text-lg);
2213
- --title-line-height: 130%;
2214
- --title-spacing: 0.5rem;
2215
- --title-weight: var(--bs-font-normal);
2216
-
2217
- align-items: center;
2218
- -moz-column-gap: var(--col-gap);
2219
- column-gap: var(--col-gap);
2220
- display: grid;
2221
- 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);
2222
2983
  }
2223
- .bs-empty-state :where(.bs-empty-state-icon) {
2224
- align-self: start;
2225
- height: auto;
2226
- max-width: var(--icon-size);
2227
- 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);
2228
2997
  }
2229
- .bs-empty-state :where(.bs-empty-state-icon path) {
2230
- 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);
2231
3006
  }
2232
- .bs-empty-state :where(.bs-empty-state-title) {
2233
- color: var(--bs-empty-state-title-color);
2234
- font-size: var(--title-font-size);
2235
- font-weight: var(--title-weight);
2236
- line-height: var(--title-line-height);
2237
- padding-block-end: var(--title-spacing);
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);
2238
3018
  }
2239
- .bs-empty-state :where(.bs-empty-state-description) {
2240
- color: var(--bs-empty-state-description-color);
2241
- font-size: var(--description-font-size);
2242
- font-weight: var(--description-weight);
2243
- line-height: var(--description-line-height);
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);
2244
3032
  }
2245
- .bs-empty-state :where(a) {
2246
- color: var(--bs-ink-blue);
2247
- text-decoration: underline;
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;
3041
+ }
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;
2248
3051
  }
2249
- .bs-empty-state :where(a:hover) {
2250
- 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;
2251
3061
  }
2252
- /* Call to Actions */
2253
- .bs-empty-state
2254
- :where(
2255
- .bs-empty-state-description + *,
2256
- .bs-empty-state-title + *:not(.bs-empty-state-description)
2257
- ) {
2258
- 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);
2259
3069
  }
2260
- /* Sizing */
2261
- .bs-empty-state:where([data-size^='xs']) {
2262
- --col-gap: var(--bs-space-4);
2263
- --cta-spacing: var(--bs-space-2);
2264
- --icon-size: 1.5rem;
2265
- --title-color: var(--bs-ink-light);
2266
- --title-font-size: var(--bs-text-md);
2267
- --title-line-height: var(--bs-leading-base);
2268
- --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;
2269
3076
  }
2270
- .bs-empty-state:where([data-size^='sm']) {
2271
- --description-font-size: var(--bs-text-sm);
2272
- --icon-size: 2rem;
2273
- --title-font-size: var(--bs-text-md);
2274
- --title-line-height: var(--bs-leading-base);
2275
- --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;
2276
3081
  }
2277
- .bs-empty-state:where([data-size^='lg']) {
2278
- --col-gap: var(--bs-space-8);
2279
- --cta-spacing: var(--bs-space-6);
2280
- --description-font-size: var(--bs-text-md);
2281
- --icon-size: 4rem;
2282
- --title-font-size: var(--bs-text-xl);
2283
- --title-line-height: 110%;
2284
- --title-weight: var(--bs-font-bold);
3082
+ .bs-character-count:where([data-error="true"]) {
3083
+ color: var(--bs-ink-red);
2285
3084
  }
2286
3085
  /* Generally applicable (all input types) */
2287
3086
  :where([data-required]:not([data-required="false"])) {
@@ -2315,190 +3114,34 @@ uncomment to make visible when testing
2315
3114
  margin-bottom: 0.25rem;
2316
3115
  padding: 0;
2317
3116
  }
2318
- :where(label + input, label > input):where(:not([type='checkbox'], [type='radio'])),
2319
- :where(label + textarea, label > textarea),
2320
- :where(label + select, label > select) {
2321
- margin-top: 0.25rem;
2322
- }
2323
- /*
2324
- Custom properties:
2325
- --input-bg (background color)
2326
- --input-border (border color)
2327
- --input-border-width (border width)
2328
- --input-caret (caret color)
2329
- --input-padding-block (padding block)
2330
- --input-padding-inline (padding inline)
2331
- --input-placeholder (placeholder color)
2332
- --input-text-size (font size)
2333
- */
2334
- input:where(:not([type='checkbox'], [type='radio'], [type='file'], [type='range'])),
2335
- textarea,
2336
- select,
2337
- :is(.bs-input, .bs-select, .bs-textarea) {
2338
- -webkit-appearance: none;
2339
- -moz-appearance: none;
2340
- appearance: none;
2341
- background-color: var(--input-bg, var(--bs-bg-base));
2342
- border-color: var(--input-border, var(--bs-border-input));
2343
- border-radius: 0.25rem;
2344
- border-style: solid;
2345
- border-width: var(--input-border-width, 1px);
2346
- caret-color: var(--input-caret, var(--bs-blue-base));
2347
- color: var(--bs-ink-base);
2348
- font-size: var(--input-text-size, var(--bs-text-base));
2349
- font-weight: 400;
2350
- height: 2.5rem;
2351
- line-height: var(--bs-leading-base);
2352
- padding-block: var(--input-padding-block, 0.0625rem);
2353
- padding-inline: var(--input-padding-inline, 0.75rem);
2354
- }
2355
- :where(.dark) input:where(:not([type='checkbox'], [type='radio'], [type='file'], [type='range'])),
2356
- :where(.dark) textarea,
2357
- :where(.dark) select,
2358
- :where(.dark) :is(.bs-input, .bs-select, .bs-textarea) {
2359
- --input-bg: transparent;
2360
- }
2361
- input:where(:not([type='checkbox'], [type='radio'], [type='file'], [type='range'])),
2362
- textarea,
2363
- select,
2364
- :is(.bs-input, .bs-select, .bs-textarea) {
2365
- width: 100%;
2366
- }
2367
- input:where([type='text'], [type='email'], [type='url']),
2368
- select,
2369
- .bs-input:where([type='text'], [type='email'], [type='url']),
2370
- :is(.bs-input, .bs-select, .bs-textarea) {
2371
- text-overflow: ellipsis;
2372
- }
2373
- .bs-textarea,
2374
- textarea {
2375
- height: auto;
2376
- padding-block: 0.5rem;
2377
- resize: vertical;
2378
- }
2379
- :is(input, textarea, select)::-moz-placeholder, :is(.bs-input, .bs-select, .bs-textarea)::-moz-placeholder {
2380
- color: var(--input-placeholder, var(--bs-violet-100));
2381
- }
2382
- :is(input, textarea, select)::placeholder,
2383
- :is(.bs-input, .bs-select, .bs-textarea)::placeholder,
2384
- :is(.bs-input, .bs-select, .bs-textarea):where([data-placeholder="true"]) {
2385
- color: var(--input-placeholder, var(--bs-violet-100));
2386
- }
2387
- :where(.dark) :is(input, textarea, select)::-moz-placeholder, :where(.dark) :is(.bs-input, .bs-select, .bs-textarea)::-moz-placeholder {
2388
- --input-placeholder: var(--bs-violet-200);
2389
- }
2390
- :where(.dark) :is(input, textarea, select)::placeholder,
2391
- :where(.dark) :is(.bs-input, .bs-select, .bs-textarea)::placeholder,
2392
- :where(.dark) :is(.bs-input, .bs-select, .bs-textarea):where([data-placeholder="true"]) {
2393
- --input-placeholder: var(--bs-violet-200);
2394
- }
2395
- :is(input, textarea, select):where(:focus-visible)::-moz-placeholder, :is(.bs-input, .bs-select, .bs-textarea):where(:focus-visible)::-moz-placeholder {
2396
- opacity: 0;
2397
- }
2398
- :is(input, textarea, select):where(:focus-visible)::placeholder,
2399
- :is(.bs-input, .bs-select, .bs-textarea):where(:focus-visible)::placeholder {
2400
- opacity: 0;
2401
- }
2402
- /* FOCUS state */
2403
- :is(input:where(:not([type='checkbox'], [type='radio'])), textarea, select):where(:focus-visible),
2404
- :is(.bs-input, .bs-select, .bs-textarea):where(:focus-visible),
2405
- :is(select, .bs-select):where(:focus) {
2406
- --input-border: var(--bs-blue-base);
2407
- outline-style: none;
2408
- outline-width: 0px;
2409
- }
2410
- /* DISABLED state */
2411
- :is(input:where(:not([type='checkbox'],[type='radio'])), textarea, select):where(:disabled),
2412
- :is(.bs-input, .bs-select, .bs-textarea):where(:disabled) {
2413
- --input-border: var(--bs-ink-disabled);
2414
- --input-bg: var(--bs-bg-disabled);
2415
- color: var(--bs-ink-disabled);
2416
- }
2417
- /* Text inputs should not have a border when disabled */
2418
- :is(input:where(:not([type]),[type="text"],[type="number"],[type="email"],[type="password"],[type="url"])):where(:disabled),
2419
- textarea:where(:disabled),
2420
- select:where(:disabled),
2421
- :is(.bs-input, .bs-select, .bs-textarea):where(:disabled) {
2422
- --input-border-width: 0px;
2423
- }
2424
- /* Errors and Messages */
2425
- :is(input, select, textarea):where([data-error]:not([data-error="false"])),
2426
- :is(.bs-input, .bs-select, .bs-textarea):where([data-error="true"]) {
2427
- --input-border: var(--bs-ink-red);
2428
- }
2429
- /*
2430
- Removes the built-in 'margin' on bottom of textarea
2431
- see https://bugs.chromium.org/p/chromium/issues/detail?id=89530
2432
- */
2433
- :has(> textarea:only-child),
2434
- :has(> .bs-textarea:only-child) {
2435
- display: block;
2436
- line-height: 0;
2437
- }
2438
- /* chrome user agent styling was applying opacity: 0.7 */
2439
- :where(select:disabled) {
2440
- opacity: 1;
2441
- }
2442
- :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 {
2443
- opacity: 0;
2444
- }
2445
- :is(input, textarea, select):disabled::placeholder,
2446
- :is(input, textarea, select)[disabled]::placeholder,
2447
- :is(.bs-input, .bs-textarea, .bs-select):disabled::placeholder,
2448
- :is(.bs-input, .bs-textarea, .bs-select)[disabled]::placeholder {
2449
- opacity: 0;
2450
- }
2451
- /* Select */
2452
- select,
2453
- .bs-select {
2454
- /* URL Encoded SVG dropdown caret so there is something there */
2455
- 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");
2456
- background-position: right 0.75rem center;
2457
- background-repeat: no-repeat;
2458
- background-size: 1em 1em;
2459
- padding-right: var(--bs-space-9);
2460
- }
2461
- select[multiple],
2462
- .bs-select[multiple] {
2463
- background-image: none;
2464
- height: auto;
2465
- }
2466
- :where(.dark) select,
2467
- :where(.dark) .bs-select {
2468
- /* URL Encoded SVG dropdown caret so there is something there */
2469
- 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");
2470
- }
2471
- :where(.dark) select:where(:disabled),
2472
- :where(.dark) .bs-select:where(:disabled) {
2473
- /* URL Encoded SVG dropdown caret so there is something there */
2474
- 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");
2475
- }
2476
- /* Allows for styling a button to look like a select input */
2477
- :where(button).bs-select {
2478
- align-items: center;
2479
- /* Remove this for buttons since they will have the caret added */
2480
- background-image: none;
2481
- cursor: pointer;
3117
+ .bs-field-details {
2482
3118
  display: flex;
2483
- 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;
2484
3123
  }
2485
- :where(.dark) :where(button).bs-select,
2486
- :where(.dark) :where(button).bs-select:where(:disabled) {
2487
- background-image: none;
3124
+ :where(textarea, bs-textarea) + .bs-field-details {
3125
+ margin-top: 0.25rem;
2488
3126
  }
2489
- :where(button).bs-select :where(*:first-child) {
2490
- flex-grow: 1;
2491
- text-align: left;
3127
+ .bs-field-details :where(.bs-character-count:first-child) {
3128
+ margin-left: auto;
2492
3129
  }
2493
- :where(button).bs-select :where(.bs-icon) {
2494
- color: var(--bs-ink-base);
2495
- transform: none;
2496
- transition-duration: 200ms;
2497
- transition-property: transform;
2498
- 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;
2499
3139
  }
2500
- :where(button).bs-select:where([data-open="true"]) :where(.bs-icon) {
2501
- 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);
2502
3145
  }
2503
3146
  /* 0 0 1 for width to allow e.g. tailwind override */
2504
3147
  :is(div, *):where(.bs-input-addon) {
@@ -2833,189 +3476,37 @@ data-autosize-icons="true" - see above
2833
3476
  --input-bg: var(--bs-bg-base);
2834
3477
  --input-border: transparent;
2835
3478
  }
2836
- .bs-field-details {
2837
- display: flex;
2838
- justify-content: space-between;
2839
- align-items: flex-start;
2840
- gap: var(--bs-space-2);
2841
- margin-top: 0.5rem;
2842
- }
2843
- :where(textarea, bs-textarea) + .bs-field-details {
2844
- margin-top: 0.25rem;
2845
- }
2846
- .bs-field-details :where(.bs-character-count:first-child) {
2847
- margin-left: auto;
2848
- }
2849
- .bs-character-count {
2850
- color: var(--bs-ink-base);
2851
- font-size: var(--bs-text-xs);
2852
- font-weight: 400;
2853
- text-align: right;
2854
- white-space: nowrap;
2855
- }
2856
- :where(:disabled, [data-disabled="true"]) + .bs-character-count,
2857
- :where(:disabled, [data-disabled="true"]) .bs-character-count,
2858
- .bs-character-count:where([data-disabled="true"]) {
2859
- visibility: hidden;
2860
- }
2861
- .bs-character-count:where([data-error="true"]) {
2862
- color: var(--bs-ink-red);
2863
- }
2864
- /* Containers and Labels for Checkbox/Radio */
2865
- .bs-boolean {
2866
- display: inline-flex;
2867
- align-items: center;
2868
- font-size: var(--bs-text-base);
2869
- font-weight: 400;
2870
- line-height: 115%;
2871
- }
2872
- .bs-boolean:where([data-size='sm']) input {
2873
- height: .75rem;
2874
- width: .75rem;
2875
- }
2876
- .bs-boolean label {
2877
- font-size: var(--bs-text-base);
2878
- font-weight: 400;
2879
- line-height: 1.5;
2880
- width: auto;
2881
- }
2882
- /* not using gap on .bs-boolean due to dead click zone */
2883
- .bs-boolean label {
2884
- padding-inline-end: 0.5em;
2885
- }
2886
- .bs-boolean input + label {
2887
- padding-inline: 0.5em 0;
2888
- }
2889
- .bs-boolean:where([data-size='sm']),
2890
- .bs-boolean:where([data-size='sm']) label {
2891
- font-size: var(--bs-text-xs);
2892
- }
2893
- /* Checkbox & Radio Input */
2894
- :where(input[type='checkbox'], input[type='radio']),
2895
- :is(.bs-boolean :where(input), .bs-checkbox) { /* .bs-checkbox added to accommodate 'fake' cbs */
2896
- -webkit-appearance: none;
2897
- -moz-appearance: none;
2898
- appearance: none;
2899
- box-shadow: inset 0 0 0 0.125rem var(--box-shadow, var(--bs-ink-base));
2900
- cursor: pointer;
2901
- display: grid;
2902
- height: 1rem;
2903
- margin: 0;
2904
- place-content: center;
3479
+ :where(label, legend),
3480
+ label:where(.bs-label) {
3481
+ display: inline-block;
2905
3482
  position: relative;
2906
- width: 1rem;
2907
- }
2908
- :where(input[type='checkbox'], input[type='radio']):focus-visible,
2909
- :is(.bs-boolean :where(input), .bs-checkbox):focus-visible {
2910
- box-shadow: inset 0 0 0 0.125rem var(--box-shadow, var(--bs-ink-base)),
2911
- 0 0 0 2px var(--offset-color, var(--bs-bg-base)),
2912
- 0 0 0 4px var(--outline-color, var(--bs-blue-base));
2913
- outline: 2px solid transparent;
2914
- }
2915
- :where(input[type='checkbox']),
2916
- :is(.bs-boolean :where([type='checkbox']), .bs-checkbox) {
2917
- border-radius: 0.125rem;
2918
- }
2919
- :where(input[type='radio']),
2920
- .bs-boolean :where([type='radio']) {
2921
- border-radius: 50%;
2922
- }
2923
- /* Checkbox's checkbox, checkmark. Checkmark is hidden unless checked/indeterminate. */
2924
- input:where([type='checkbox'])::before,
2925
- :is(.bs-boolean :where([type="checkbox"]), .bs-checkbox)::before {
2926
- --cb-filled-size: var(--filled-size, 1rem);
2927
- content: '';
2928
- border-radius: 0.125rem;
2929
- box-shadow: inset var(--cb-filled-size) var(--cb-filled-size) var(--fill-bg-color, var(--bs-blue-base));
2930
- height: var(--cb-filled-size);
2931
- visibility: hidden;
2932
- width: var(--cb-filled-size);
3483
+ width: 100%;
2933
3484
  }
2934
- input:where([type='checkbox'])::after,
2935
- :is(.bs-boolean :where([type="checkbox"]), .bs-checkbox)::after {
2936
- border: solid var(--bs-bg-base);
2937
- border-width: 0 0.125rem 0.125rem 0;
2938
- content: '';
2939
- height: var(--inner-check-height, 0.75em);
2940
- left: 50%;
2941
- position: absolute;
2942
- top: 50%;
2943
- transform-origin: center;
2944
- transform: translate(-50%, -60%) rotate(45deg);
2945
- visibility: hidden;
2946
- width: var(--inner-check-width, 0.375em);
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);
2947
3492
  }
2948
- input:where([type='checkbox']):where(:indeterminate)::after,
2949
- .bs-boolean :where([type="checkbox"]):where(:indeterminate)::after,
2950
- .bs-checkbox:where([data-indeterminate="true"], :indeterminate)::after {
2951
- border: none;
2952
- background-color: var(--bs-bg-base);
2953
- height: var(--inner-dash-height, 0.125rem);
2954
- transform: translate(-50%, -0.0625rem) rotate(0deg);
2955
- width: var(--inner-dash-width, 0.625em);
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));
2956
3497
  }
2957
- /* Radio outer circle, Radio dot. Dot is hidden unless checked. */
2958
- input:where([type='radio'])::before,
2959
- .bs-boolean :where([type="radio"])::before {
2960
- --radio-filled-size: var(--filled-size, 1rem);
2961
- background-color: var(--fill-bg-color, var(--bs-blue-base));
2962
- border-radius: 50%;
2963
- box-sizing: content-box;
2964
- content: '';
2965
- height: var(--radio-filled-size);
2966
- visibility: hidden;
2967
- width: var(--radio-filled-size);
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);
2968
3505
  }
2969
- input:where([type='radio'])::after,
2970
- .bs-boolean :where([type="radio"])::after {
2971
- background-color: var(--bs-bg-base);
2972
- border-radius: 50%;
2973
- box-sizing: content-box;
3506
+ .bs-label:where(:has(+ input), :has(+ .bs-input-addon), :has(+ :not(label) .bs-input-addon))::after {
2974
3507
  content: '';
2975
- height: var(--inner-dot-size, 0.375rem);
2976
- left: 50%;
3508
+ inset: 0 0 -.25rem 0;
2977
3509
  position: absolute;
2978
- top: 50%;
2979
- transform: translate(-50%, -50%);
2980
- visibility: hidden;
2981
- width: var(--inner-dot-size, 0.375rem);
2982
- }
2983
- /* Show checkmark, indeterminate mark, or radio dot */
2984
- .bs-checkbox:where([data-indeterminate="true"], [data-checked="true"], :checked, :indeterminate)::before,
2985
- .bs-checkbox:where([data-indeterminate="true"], [data-checked="true"], :checked, :indeterminate)::after,
2986
- input:where([type='checkbox']:checked, [type='checkbox']:indeterminate, [type='radio']:checked)::before,
2987
- input:where([type='checkbox']:checked, [type='checkbox']:indeterminate, [type='radio']:checked)::after,
2988
- .bs-boolean :where([type='checkbox']:checked, [type='checkbox']:indeterminate, [type='radio']:checked)::before,
2989
- .bs-boolean :where([type='checkbox']:checked, [type='checkbox']:indeterminate, [type='radio']:checked)::after {
2990
- visibility: visible;
2991
- }
2992
- /* ---------- Sizes ----------- */
2993
- .bs-boolean:where([data-size="sm"]),
2994
- .bs-checkbox:where([data-size="sm"]) {
2995
- --filled-size: 0.75rem;
2996
- --inner-check-height: 0.5625rem;
2997
- --inner-check-width: 0.3125rem;
2998
- --inner-dash-height: 0.125rem;
2999
- --inner-dash-width: .75em;
3000
- --inner-dot-size: 0.25rem;
3001
- }
3002
- /* ---------- Disabled State ----------- */
3003
- :where(input[type="checkbox"], input[type="radio"]):disabled,
3004
- .bs-boolean:where([data-disabled="true"]),
3005
- .bs-checkbox:where([data-disabled="true"]) {
3006
- --box-shadow: var(--bs-ink-disabled);
3007
- --fill-bg-color: var(--bs-ink-disabled);
3008
- background-color: transparent;
3009
- cursor: default;
3010
- pointer-events: none;
3011
- }
3012
- /* ---------- Error state ----------- */
3013
- input:where([type='checkbox'], [type='radio'])[data-error]:where(:not([data-error="false"])),
3014
- .bs-boolean :where(input[data-error="true"]), /* deprecate this one in favor of next line */
3015
- .bs-boolean:where([data-error="true"]),
3016
- .bs-checkbox:where([data-error="true"]) {
3017
- --box-shadow: var(--bs-red-base);
3018
- --outline-color: var(--bs-red-base);
3019
3510
  }
3020
3511
  .bs-switch {
3021
3512
  --box-shadow: var(--bs-ink-base);
@@ -3134,692 +3625,643 @@ input:where([type='checkbox'], [type='radio'])[data-error]:where(:not([data-erro
3134
3625
  0 0 0 4px var(--outline-color, var(--bs-blue-base));
3135
3626
  outline: 2px solid transparent;
3136
3627
  }
3137
- :where(.box) .bs-switch :where(input:focus-visible) + :where(span),
3138
- :where(.box) .bs-switch:where(:focus-visible) :where(button span) {
3139
- --offset-color: var(--bs-bg-medium);
3140
- }
3141
- :where(.box[data-invert]) .bs-switch :where(input:focus-visible) + :where(span),
3142
- :where(.box[data-invert]) .bs-switch:where(:focus-visible) :where(button span) {
3143
- --offset-color: var(--bs-bg-invert-to-base);
3144
- }
3145
- /* Disabled state */
3146
- .bs-switch:where([data-disabled]:not([data-disabled="false"]), :disabled, [disabled]),
3147
- .bs-switch:where([data-disabled]:not([data-disabled="false"]), :disabled, [disabled]) :is(input ~ span, button span) {
3148
- --ball-background: var(--bs-ink-disabled);
3149
- --switch-background: var(--bs-bg-disabled);
3150
- }
3151
- .bs-switch input:where(:disabled) {
3152
- cursor: default;
3153
- }
3154
- .bs-hint {
3155
- --hint-color: var(--bs-ink-light);
3156
- color: var(--hint-color);
3157
- font-size: var(--bs-text-xs);
3158
- list-style: none;
3159
- margin: 0;
3160
- min-width: 0;
3161
- overflow-wrap: break-word;
3162
- padding: 0;
3163
- }
3164
- .bs-hint:where([data-error]:not([data-error="false"])) {
3165
- --hint-color: var(--bs-ink-red);
3166
- }
3167
- :where(:disabled, [data-disabled="true"]) .bs-hint {
3168
- --hint-color: var(--bs-ink-disabled);
3169
- }
3170
- :where(label, legend),
3171
- label:where(.bs-label) {
3172
- display: inline-block;
3173
- position: relative;
3174
- width: 100%;
3175
- }
3176
- .bs-label,
3177
- :where(label, legend) {
3178
- --label-color: var(--bs-ink-base);
3179
- color: var(--label-color);
3180
- font-size: var(--bs-text-sm);
3181
- font-weight: 600;
3182
- line-height: var(--bs-leading-base);
3183
- }
3184
- /* Required asterisk */
3185
- :where(label, legend) :where([data-required]:not([data-required="false"])),
3186
- .bs-label :where([data-required="true"]) {
3187
- color: var(--label-asterisk-color, var(--bs-ink-red));
3628
+ :where(.box) .bs-switch :where(input:focus-visible) + :where(span),
3629
+ :where(.box) .bs-switch:where(:focus-visible) :where(button span) {
3630
+ --offset-color: var(--bs-bg-medium);
3631
+ }
3632
+ :where(.box[data-invert]) .bs-switch :where(input:focus-visible) + :where(span),
3633
+ :where(.box[data-invert]) .bs-switch:where(:focus-visible) :where(button span) {
3634
+ --offset-color: var(--bs-bg-invert-to-base);
3188
3635
  }
3189
3636
  /* Disabled state */
3190
- :where(label[data-disabled]:not([data-disabled="false"])),
3191
- :where(label[data-disabled]:not([data-disabled="false"])) *,
3192
- .bs-label:where([data-disabled="true"]),
3193
- .bs-label:where([data-disabled="true"]) * {
3194
- --label-asterisk-color: transparent;
3195
- --label-color: var(--bs-ink-disabled);
3637
+ .bs-switch:where([data-disabled]:not([data-disabled="false"]), :disabled, [disabled]),
3638
+ .bs-switch:where([data-disabled]:not([data-disabled="false"]), :disabled, [disabled]) :is(input ~ span, button span) {
3639
+ --ball-background: var(--bs-ink-disabled);
3640
+ --switch-background: var(--bs-bg-disabled);
3196
3641
  }
3197
- .bs-label:where(:has(+ input), :has(+ .bs-input-addon), :has(+ :not(label) .bs-input-addon))::after {
3198
- content: '';
3199
- inset: 0 0 -.25rem 0;
3200
- position: absolute;
3642
+ .bs-switch input:where(:disabled) {
3643
+ cursor: default;
3644
+ }
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;
3201
3649
  }
3202
3650
  /*
3203
- --btn-main: (this is doing too much.. look into backwards-compatible way to break this up)
3204
- background color (base)
3205
- focus ring color
3206
-
3207
- background colors:
3208
- --btn-secondary: background color (active, hover)
3209
- --btn-light: background color (ghost hover, ghost focus)
3210
-
3211
- border / box-shadow:
3212
- --btn-ghost-ink: the box shadow color for ghost buttons is synced to ink
3213
- --btn-highlight: box shadow color (w/ --btn-main) (active)
3214
-
3215
- padding:
3216
- --btn-padding: padding (changes by size, and on text btns)
3217
-
3218
- text color:
3219
- --btn-ink: text color
3220
- --btn-ghost-ink: text color (ghost)
3221
-
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)
3222
3660
  */
3223
- .bs-button {
3224
- --btn-focus-inset: -0.25rem;
3225
- --btn-focus-pseudo-width: calc(100% + 0.5rem);
3226
- --btn-ghost-ink: var(--bs-ink-blue);
3227
- --btn-highlight: var(--bs-blue-100);
3228
- --btn-ink: var(--bs-white);
3229
- --btn-main: var(--bs-blue-400);
3230
- --btn-padding: .25rem .75rem;
3231
- --btn-secondary: var(--bs-blue-medium);
3232
- --btn-text-size: var(--bs-text-md);
3233
- --btn-weight: 600;
3234
- --btn-height: 2.5rem;
3235
- align-items: center;
3236
- background-color: var(--btn-main);
3237
- border: none;
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));
3238
3670
  border-radius: 0.25rem;
3239
- color: var(--btn-ink);
3240
- -moz-column-gap: var(--bs-space-2);
3241
- column-gap: var(--bs-space-2);
3242
- cursor: pointer;
3243
- display: inline-flex;
3244
- font-size: var(--btn-text-size);
3245
- font-weight: var(--btn-weight);
3246
- height: var(--btn-height);
3247
- justify-content: center;
3248
- line-height: 1.5;
3249
- outline: 2px solid transparent;
3250
- padding: var(--btn-padding);
3251
- position: relative;
3252
- text-decoration: none;
3253
- transition: all 100ms ease-in-out;
3254
- vertical-align: middle;
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;
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);
3255
3681
  }
3256
- .bs-button:where(:not(:disabled):not([aria-disabled="true"]):hover) {
3257
- background-color: var(--btn-secondary);
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;
3258
3687
  }
3259
- .bs-button:where(:not(:disabled):not([aria-disabled="true"]):active) {
3260
- background-color: var(--btn-secondary);
3261
- box-shadow: inset 0px 0px 4px 1px var(--btn-main);
3262
- transform-origin: center;
3263
- transform: scale(0.97);
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%;
3264
3693
  }
3265
- /* ------------ Focus Styles ------------ */
3266
- .bs-button::before {
3267
- border-color: transparent;
3268
- border-radius: 0.5rem;
3269
- border-style: solid;
3270
- border-width: 0.125rem;
3271
- content: '';
3272
- height: calc(100% + 0.5rem);
3273
- inset: var(--btn-focus-inset);
3274
- position: absolute;
3275
- transition: border-color 0.125s ease-in-out;
3276
- width: var(--btn-focus-pseudo-width);
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;
3277
3699
  }
3278
- .bs-button:where(:focus:not(:disabled):not([aria-disabled="true"]))::before {
3279
- border-color: var(--btn-main);
3700
+ .bs-textarea,
3701
+ textarea {
3702
+ height: auto;
3703
+ padding-block: 0.5rem;
3704
+ resize: vertical;
3280
3705
  }
3281
- .bs-button:where(:focus-visible:not(:disabled):not([aria-disabled="true"]))::before {
3282
- border-color: var(--btn-main);
3283
- box-shadow: none;
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));
3284
3708
  }
3285
- .bs-button:where(:focus:not(:focus-visible):not(:disabled):not([aria-disabled="true"]))::before {
3286
- border-color: transparent;
3287
- box-shadow: none;
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));
3288
3713
  }
3289
- /* ------------ Ghost Buttons ------------ */
3290
- .bs-button:where([data-ghost]:not([data-ghost="false"])) {
3291
- --btn-ink: var(--btn-ghost-ink);
3292
- --btn-light: var(--bs-blue-10);
3293
- --btn-secondary: var(--bs-blue-10);
3294
- background-color: transparent;
3295
- box-shadow: inset 0 0 0 1px var(--btn-ghost-ink);
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);
3296
3716
  }
3297
- .bs-button:where([data-ghost]:not([data-ghost="false"]))::before {
3298
- border-radius: 0.4375rem;
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);
3299
3721
  }
3300
- .bs-button:where([data-ghost]:not([data-ghost="false"]):not(:disabled):not([aria-disabled="true"]):hover),
3301
- .bs-button:where([data-ghost]:not([data-ghost="false"]):not(:disabled):not([aria-disabled="true"]):focus) {
3302
- background-color: var(--btn-light);
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;
3303
3724
  }
3304
- .bs-button:where([data-ghost]:not([data-ghost="false"]):not(:disabled):not([aria-disabled="true"]):active) {
3305
- box-shadow:
3306
- inset 0 0 0 1px var(--btn-main),
3307
- inset 0px 0px 4px 1px var(--btn-highlight);
3725
+ :is(input, textarea, select):where(:focus-visible)::placeholder,
3726
+ :is(.bs-input, .bs-select, .bs-textarea):where(:focus-visible)::placeholder {
3727
+ opacity: 0;
3308
3728
  }
3309
- /* ------------ VARIANTS ------------ */
3310
- .bs-button:where([data-variant^='secondary']) {
3311
- --btn-ghost-ink: var(--bs-ink-plum);
3312
- --btn-highlight: var(--bs-plum-100);
3313
- --btn-light: var(--bs-plum-10);
3314
- --btn-main: var(--bs-plum-base);
3315
- --btn-secondary: var(--bs-plum-medium);
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;
3316
3736
  }
3317
- .dark .bs-button:where([data-variant^='secondary']) {
3318
- --btn-highlight: var(--bs-plum-400);
3319
- --btn-light: var(--bs-navy-400);
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);
3320
3743
  }
3321
- .bs-button:where([data-variant^='positive']) {
3322
- --btn-ghost-ink: var(--bs-ink-purple);
3323
- --btn-highlight: var(--bs-purple-100);
3324
- --btn-light: var(--bs-purple-10);
3325
- --btn-main: var(--bs-purple-400);
3326
- --btn-secondary: var(--bs-purple-medium);
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;
3327
3750
  }
3328
- .bs-button:where([data-variant^='warning']) {
3329
- --btn-ghost-ink: var(--bs-ink-orange);
3330
- --btn-highlight: var(--bs-orange-100);
3331
- --btn-light: var(--bs-orange-10);
3332
- --btn-main: var(--bs-orange-warning);
3333
- --btn-secondary: var(--bs-orange-base);
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);
3755
+ }
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;
3764
+ }
3765
+ /* chrome user agent styling was applying opacity: 0.7 */
3766
+ :where(select:disabled) {
3767
+ opacity: 1;
3768
+ }
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;
3771
+ }
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;
3334
3777
  }
3335
- .bs-button:where([data-variant^='negative']) {
3336
- --btn-ghost-ink: var(--bs-ink-red);
3337
- --btn-highlight: var(--bs-red-100);
3338
- --btn-light: var(--bs-red-10);
3339
- --btn-main: var(--bs-red-400);
3340
- --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);
3341
3787
  }
3342
- /* pink variant */
3343
- .bs-button:where([data-variant^='pink']) {
3344
- --btn-ghost-ink: var(--bs-ink-pink);
3345
- --btn-highlight: var(--bs-pink-400);
3346
- --btn-light: var(--bs-pink-10);
3347
- --btn-main: var(--bs-pink-400);
3348
- --btn-secondary: var(--bs-pink-300);
3788
+ select[multiple],
3789
+ .bs-select[multiple] {
3790
+ background-image: none;
3791
+ height: auto;
3349
3792
  }
3350
- /* royal blue variant */
3351
- .bs-button:where([data-variant^='royal']) {
3352
- --btn-ghost-ink: var(--bs-ink-royal);
3353
- --btn-highlight: var(--bs-royal-400);
3354
- --btn-light: var(--bs-royal-10);
3355
- --btn-main: var(--bs-royal-400);
3356
- --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");
3357
3797
  }
3358
- /* white variant - for dark backgrounds + ghost btn or text btn only */
3359
- .bs-button:where([data-variant^='white'][data-ghost]:not([data-ghost="false"])) {
3360
- --btn-ghost-ink: var(--bs-ink-white);
3361
- --btn-highlight: var(--bs-ink-white);
3362
- --btn-light: var(--bs-white-10);
3363
- --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");
3364
3802
  }
3365
- /* ------------ Text Button ------------ */
3366
- .bs-button:where([data-text]:not([data-text="false"])) {
3367
- --btn-focus-inset: -0.25rem -0.5rem;
3368
- --btn-focus-pseudo-width: calc(100% + 1rem); /* text btns don't have side padding, but we do want focus outline to look padded */
3369
- --btn-height: auto;
3370
- --btn-ink: var(--bs-ink-blue);
3371
- --btn-padding: 0;
3372
- --btn-secondary: transparent;
3373
- --btn-text-size: var(--bs-text-md);
3374
- --btn-weight: 400;
3375
- 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;
3376
3808
  cursor: pointer;
3377
- line-height: 150%;
3809
+ display: flex;
3810
+ padding-right: var(--input-padding-inline, 0.75rem);
3378
3811
  }
3379
- .bs-button:where([data-text]:not([data-text="false"]):not(:disabled):not([aria-disabled="true"]):hover) {
3380
- --btn-ink: var(--bs-blue-base);
3381
- background-color: transparent;
3382
- text-decoration: underline;
3812
+ :where(.dark) :where(button).bs-select,
3813
+ :where(.dark) :where(button).bs-select:where(:disabled) {
3814
+ background-image: none;
3383
3815
  }
3384
- .bs-button:where([data-text]:not([data-text="false"]):not(:disabled):not([aria-disabled="true"]):hover):has(svg) {
3385
- text-decoration: none;
3816
+ :where(button).bs-select :where(*:first-child) {
3817
+ flex-grow: 1;
3818
+ text-align: left;
3386
3819
  }
3387
- .bs-button:where([data-text]:not([data-text="false"]):not(:disabled):not([aria-disabled="true"]):active) {
3388
- box-shadow: none;
3820
+ :where(button).bs-select :where(.bs-icon) {
3821
+ color: var(--bs-ink-base);
3389
3822
  transform: none;
3823
+ transition-duration: 200ms;
3824
+ transition-property: transform;
3825
+ transition-timing-function: ease-in-out;
3390
3826
  }
3391
- .bs-button:where([data-variant^='negative'][data-text]:not([data-text="false"])),
3392
- .bs-button:where([data-variant^='negative'][data-text]:not([data-text="false"]):not(:disabled):not([aria-disabled="true"]):hover) {
3393
- --btn-ink: var(--bs-ink-red);
3394
- }
3395
- .bs-button:where([data-variant^='white'][data-text]:not([data-text="false"])),
3396
- .bs-button:where([data-variant^='white'][data-text]:not([data-text="false"]):not(:disabled):not([aria-disabled="true"]):hover) {
3397
- --btn-ink: var(--bs-ink-white);
3398
- --btn-main: var(--bs-ink-white);
3827
+ :where(button).bs-select:where([data-open="true"]) :where(.bs-icon) {
3828
+ transform: rotate(180deg);
3399
3829
  }
3400
- /* ------------ Button Sizes, Media-based Text Sizing -------------- */
3401
- /* Std button: Mobile text size, DT text size */
3402
- .bs-button {
3403
- --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;
3404
3843
  }
3405
- @media (min-width: 1166px) {
3406
- .bs-button {
3407
- --btn-text-size: 1.125rem;
3844
+ @media (min-width: 752px) {
3845
+ .bs-horizontal-nav {
3846
+ display: flex;
3408
3847
  }
3409
3848
  }
3410
- .bs-button:where([data-size^='sm']) {
3411
- --btn-height: 1.75rem;
3412
- --btn-padding: .25rem .75rem .375rem;
3413
- /* Std button size="sm" text size is same across all media sizes */
3414
- --btn-text-size: var(--bs-text-sm);
3415
- }
3416
- /* Text buttons: For now, text size not dependent on media size */
3417
- .bs-button:where([data-text]:not([data-text="false"])) {
3418
- --btn-height: auto;
3419
- --btn-padding: 0;
3420
- --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%;
3421
3859
  }
3422
- .bs-button:where([data-size^='sm'][data-text]:not([data-text="false"])) {
3423
- --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%;
3424
3869
  }
3425
- /* Size XS & XXS only applies to text buttons */
3426
- .bs-button:where([data-size^='xs'][data-text]:not([data-text="false"])) {
3427
- --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;
3428
3875
  }
3429
- .bs-button:where([data-size^='xxs'][data-text]:not([data-text="false"])) {
3430
- --btn-text-size: var(--bs-text-xs);
3431
- --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;
3432
3884
  }
3433
- /* ------------ Disabled Styling ------------ */
3434
- :where(button:disabled),
3435
- .bs-button:where(:disabled),
3436
- .bs-button:where([aria-disabled="true"]) /* for links as buttons */ {
3437
- 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;
3438
3892
  }
3439
- .bs-button:where(:disabled),
3440
- .bs-button:where([aria-disabled="true"]) {
3441
- --btn-ink: var(--bs-ink-disabled);
3442
- --btn-main: var(--bs-bg-disabled);
3443
- box-shadow: none;
3444
- 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%;
3445
3908
  }
3446
- .bs-button:where([data-ghost]:not([data-ghost="false"])):disabled,
3447
- .bs-button:where([data-ghost]:not([data-ghost="false"]))[aria-disabled="true"] {
3448
- --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);
3449
3912
  }
3450
- .bs-button:where([data-text]:not([data-text="false"])):disabled,
3451
- .bs-button:where([data-text]:not([data-text="false"]))[aria-disabled="true"] {
3452
- --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;
3453
3917
  }
3454
- /* ------------ links as buttons ------------ */
3455
- a.bs-button {
3456
- align-items: center;
3457
- display: inline-flex;
3458
- outline: none;
3459
- 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);
3460
3921
  }
3461
- /*
3462
- Properties : Defaults // Description
3463
- ====================================
3464
- --btn-icon-bg-color: var(--btn-main); // icon bg color (base state)
3465
- --btn-icon-padding: .75rem; // padding around icon svg
3466
- --btn-icon-size: 1.5rem; // svg width and height
3467
- --btn-icon-stroke-color: var(--bs-white);
3468
- --btn-main: var(--bs-blue-base); // many things... should probably break this up
3469
- --btn-text-color: var(--bs-ink-base);
3470
- --btn-text-size: var(--bs-text-md);
3471
-
3472
- --btn-border-color: transparent; // focus state outline color - transparent base state, --btn-main base focus state
3473
- --btn-border-color-focused: var(--btn-main); // focus state ring color set on variants
3474
- --btn-secondary: var(--bs-blue-medium); // hover state icon bg
3475
- --btn-shadow-color-active: var(--btn-main); // active state shadow color (icon bg)
3476
- --btn-text-color-hovered: var(--bs-ink-base); // hover state text color
3477
- */
3478
- :where(.bs-circle-button) {
3479
- --btn-border-color-focused: var(--btn-main);
3480
- --btn-border-color: transparent;
3481
- --btn-focus-inset: -0.25rem;
3482
- --btn-gap: .5rem;
3483
- --btn-icon-bg-color: var(--btn-main);
3484
- --btn-icon-padding: .75rem;
3485
- --btn-icon-size: 1.5rem;
3486
- --btn-icon-stroke-color: var(--bs-white);
3487
- --btn-main: var(--bs-blue-base);
3488
- --btn-secondary: var(--bs-blue-medium);
3489
- --btn-shadow-color-active: var(--btn-main);
3490
- --btn-text-color-hovered: var(--bs-ink-base);
3491
- --btn-text-color: var(--bs-ink-base);
3492
- --btn-text-size: 1.125rem;
3493
- --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;
3494
3926
  }
3495
- .bs-circle-button {
3927
+ /* ===== Nested Nav Items ===== */
3928
+ .bs-horizontal-nav :where(.bs-horizontal-nav-nested-toggle) {
3496
3929
  align-items: center;
3497
- background-color: transparent;
3498
- color: var(--btn-text-color);
3499
3930
  cursor: pointer;
3500
- display: inline-flex;
3501
- font-size: var(--btn-text-size);
3502
- font-weight: var(--btn-text-weight);
3503
- gap: var(--btn-gap);
3504
- outline: none;
3505
- position: relative;
3506
- 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;
3507
3936
  }
3508
- a.bs-circle-button {
3509
- align-items: center;
3510
- display: inline-flex;
3511
- outline: none;
3512
- text-decoration: none;
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;
3513
3961
  }
3514
- .bs-circle-button :where(.bs-circle-button-icon) {
3515
- align-items: center;
3516
- background-color: var(--btn-icon-bg-color);
3517
- border: none;
3518
- border-radius: 50%;
3519
- color: var(--btn-icon-stroke-color);
3520
- display: inline-flex;
3521
- justify-content: center;
3522
- outline: 2px solid transparent;
3523
- padding: var(--btn-icon-padding);
3524
- position: relative;
3525
- transition: all 100ms ease-in-out;
3962
+ .bs-horizontal-nav :where(.bs-horizontal-nav-nested-toggle[data-expanded="true"] .bs-horizontal-nav-nested-toggle-caret) {
3963
+ transform: rotate(180deg);
3526
3964
  }
3527
- .bs-circle-button :where(.bs-circle-button-icon)::before {
3528
- border-color: var(--btn-border-color);
3529
- border-radius: 50%;
3530
- border-style: solid;
3531
- border-width: 0.125rem;
3532
- content: '';
3533
- inset: var(--btn-focus-inset);
3534
- position: absolute;
3535
- transition: border-color 125ms ease-in-out, transform 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;
3536
3970
  }
3537
- .bs-circle-button :where(.bs-circle-button-icon) :where(.bs-icon) {
3538
- --icon-size: var(--btn-icon-size);
3971
+ .bs-horizontal-nav :where(.bs-horizontal-nav-nested-menu > ul) {
3972
+ list-style: none;
3539
3973
  }
3540
- /* non-bs-icon svgs */
3541
- .bs-circle-button :where(.bs-circle-button-icon) > :where(svg) {
3542
- height: var(--btn-icon-size);
3543
- width: var(--btn-icon-size);
3974
+ .bs-horizontal-nav :where(.bs-horizontal-nav-nested-menu > ul > li) {
3975
+ margin-left: 0;
3544
3976
  }
3545
- /* Icon Buttons with Text */
3546
- .bs-circle-button:where([data-text]:not([data-text="false"])) {
3547
- --btn-text-size: var(--bs-text-md);
3548
- --btn-icon-size: 0.75rem;
3549
- --btn-icon-padding: 0.375rem;
3977
+ .bs-horizontal-nav :where(.bs-horizontal-nav-nested-menu > ul > li > a) {
3978
+ font-size: 0.875rem;
3550
3979
  }
3551
- /* Ghost Buttons */
3552
- .bs-circle-button:where([data-ghost]:not([data-ghost="false"])) {
3553
- --btn-icon-bg-color: transparent;
3554
- --btn-icon-stroke-color: var(--btn-main);
3555
- --btn-light: var(--bs-blue-10);
3556
- --btn-secondary: var(--bs-blue-10);
3980
+ .bs-horizontal-nav :where(.bs-horizontal-nav-nested-menu > ul > li > a:hover) {
3981
+ color: var(--bs-ink-blue);
3982
+ text-decoration: underline;
3557
3983
  }
3558
- /* Active, Hover, Focus states */
3559
- .bs-circle-button:active, .bs-circle-button:hover {
3560
- --btn-icon-bg-color: var(--btn-secondary);
3561
- --btn-text-color: var(--btn-text-color-hovered);
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;
3562
3987
  }
3563
- .bs-circle-button:active :where(.bs-circle-button-icon) {
3564
- box-shadow: inset 0px 0px 4px 1px var(--btn-shadow-color-active);
3565
- transform-origin: center;
3566
- transform: scale(0.97);
3988
+ .bs-horizontal-nav :where(.bs-horizontal-nav-nested-menu > ul > li > a[data-active="true"]:hover) {
3989
+ color: var(--bs-ink-blue);
3567
3990
  }
3568
- .bs-circle-button:where([data-direction="right"]):hover :where(.bs-circle-button-icon),
3569
- .bs-circle-button:where([data-direction="right"]):hover::before {
3570
- transform: translateX(.25rem);
3991
+ /* ===== External Links ===== */
3992
+ .bs-horizontal-nav :where(.bs-horizontal-nav-external-link-icon) {
3993
+ height: 1rem;
3994
+ width: 1rem;
3571
3995
  }
3572
- .bs-circle-button:where([data-direction="left"]):hover :where(.bs-circle-button-icon),
3573
- .bs-circle-button:where([data-direction="left"]):hover::before {
3574
- transform: translateX(-.25rem);
3996
+ /* ===== Slotted Items ===== */
3997
+ .bs-horizontal-nav :where(.bs-horizontal-nav-slotted-items) {
3998
+ margin-left: auto;
3575
3999
  }
3576
- .bs-circle-button:where([data-ghost]:not([data-ghost="false"])):hover {
3577
- --btn-icon-bg-color: var(--btn-light);
4000
+ .bs-horizontal-nav :where(.bs-horizontal-nav-external-links ~ .bs-horizontal-nav-slotted-items) {
4001
+ margin-left: 1.5rem;
3578
4002
  }
3579
- .bs-circle-button:where(:focus-visible) {
3580
- --btn-border-color: var(--btn-border-color-focused);
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;
3581
4008
  }
3582
- /* Disabled State */
3583
- .bs-circle-button:where(:disabled, [aria-disabled]:not([aria-disabled="false"])) /* for links as buttons */ {
3584
- --btn-icon-stroke-color: var(--bs-ink-disabled);
3585
- --btn-text-color: var(--bs-ink-disabled);
3586
- pointer-events: none;
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;
3587
4025
  }
3588
- .bs-circle-button:where(:disabled, [aria-disabled]:not([aria-disabled="false"])) {
3589
- --btn-icon-bg-color: var(--bs-bg-disabled);
4026
+ .bs-horizontal-nav-mobile:where([data-shown="true"]) {
4027
+ height: 100vh;
3590
4028
  }
3591
- /* Button Size */
3592
- .bs-circle-button:where([data-size^='sm']) {
3593
- --btn-icon-padding: .375rem;
3594
- --btn-icon-size: .75rem;
3595
- --btn-text-size: .875rem;
4029
+ @media (min-width: 752px) {
4030
+ .bs-horizontal-nav-mobile {
4031
+ display: none;
4032
+ }
3596
4033
  }
3597
- .bs-circle-button:where([data-size^='sm'][data-text]:not([data-text="false"])) {
3598
- --btn-icon-padding: .3125rem;
3599
- --btn-icon-size: .625rem;
3600
- --btn-text-size: 1rem;
4034
+ /* ===== Nav List ===== */
4035
+ .bs-horizontal-nav-mobile :where(ul) {
4036
+ display: none;
4037
+ flex-direction: column;
4038
+ list-style: none;
3601
4039
  }
3602
- .bs-circle-button:where([data-size='xs'][data-text]:not([data-text="false"])) {
3603
- --btn-icon-padding: .25rem;
3604
- --btn-icon-size: .5rem;
3605
- --btn-text-size: .875rem;
4040
+ .bs-horizontal-nav-mobile:where([data-shown="true"]) :where(ul) {
4041
+ display: flex;
3606
4042
  }
3607
- /* Color Variants */
3608
- .bs-circle-button:where([data-variant^="color"]) {
3609
- --btn-gap: .5rem;
3610
- --btn-icon-bg-color: transparent;
3611
- --btn-icon-padding: 0;
3612
- --btn-icon-size: .75rem; /* stays the same for all sizes */
3613
- --btn-icon-stroke-color: var(--btn-text-color);
3614
- --btn-secondary: transparent;
3615
- --btn-shadow-color-active: transparent;
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%;
3616
4056
  }
3617
- .bs-circle-button:where([data-variant="color-blue"]) {
3618
- --btn-border-color-focused: var(--bs-ink-blue);
3619
- --btn-text-color: var(--bs-ink-blue);
3620
- --btn-text-color-hovered: var(--bs-blue-base);
4057
+ .bs-horizontal-nav-mobile :where(.bs-horizontal-nav-mobile-toggle-title) {
4058
+ align-items: center;
4059
+ display: flex;
4060
+ gap: 0.5rem;
3621
4061
  }
3622
- .bs-circle-button:where([data-variant="color-royal"]) {
3623
- --btn-border-color-focused: var(--bs-ink-royal);
3624
- --btn-text-color: var(--bs-ink-royal);
3625
- --btn-text-color-hovered: var(--bs-royal-medium);
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;
3626
4066
  }
3627
- .bs-circle-button:where([data-variant="color-purple"]) {
3628
- --btn-border-color-focused: var(--bs-purple-400);
3629
- --btn-text-color: var(--bs-ink-purple);
3630
- --btn-text-color-hovered: var(--bs-purple-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;
3631
4074
  }
3632
- .bs-circle-button:where([data-variant="color-pink"]) {
3633
- --btn-border-color-focused: var(--bs-pink-400);
3634
- --btn-text-color: var(--bs-ink-pink);
3635
- --btn-text-color-hovered: var(--bs-pink-base);
4075
+ .bs-horizontal-nav-mobile:where([data-shown="true"]) :where(.bs-horizontal-nav-mobile-toggle-caret) {
4076
+ transform: rotate(180deg);
3636
4077
  }
3637
- .bs-circle-button:where([data-variant="color-orange"]) {
3638
- --btn-border-color-focused: var(--bs-ink-orange);
3639
- --btn-text-color: var(--bs-ink-orange);
3640
- --btn-text-color-hovered: var(--bs-orange-base);
4078
+ /* ===== Nav Items ===== */
4079
+ .bs-horizontal-nav-mobile :where(ul > li) {
4080
+ border-top: 1px solid var(--bs-border-base);
3641
4081
  }
3642
- .bs-circle-button:where([data-variant="color-red"]) {
3643
- --btn-border-color-focused: var(--bs-ink-red);
3644
- --btn-text-color: var(--bs-ink-red);
3645
- --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);
3646
4084
  }
3647
- .bs-circle-button:where([data-variant="color-white"]) {
3648
- --btn-border-color-focused: var(--bs-ink-white);
3649
- --btn-text-color: var(--bs-ink-white);
3650
- /* 80% of --bs-white */
3651
- --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;
3652
4094
  }
3653
- .bs-circle-button:where([data-variant^="color"]):where(:disabled, [aria-disabled]:not([aria-disabled="false"])) {
3654
- --btn-icon-bg-color: transparent;
3655
- --btn-text-color: var(--bs-ink-disabled);
4095
+ .bs-horizontal-nav-mobile :where(ul > li > a:hover) {
4096
+ color: var(--bs-ink-blue);
3656
4097
  }
3657
- /* size XXS only supported for color variants */
3658
- .bs-circle-button:where([data-variant^="color"]):where([data-size='xxs'][data-text]:not([data-text="false"])) {
3659
- --btn-text-size: .75rem;
3660
- --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;
3661
4101
  }
3662
- /*
3663
- custom properties:
3664
- --filterbtn-caret-size
3665
- --filterbtn-caret-transform
3666
- --filterbtn-color
3667
- --filterbtn-focus-color
3668
- --filterbtn-height
3669
- --filterbtn-text-size
3670
- --filterbtn-weight
3671
- */
3672
- button:where(.bs-filter-button) {
3673
- --filterbtn-caret-size: 1rem;
3674
- --filterbtn-caret-transform: rotate(0deg);
3675
- --filterbtn-color: var(--bs-ink-blue);
3676
- --filterbtn-focus-color: transparent;
3677
- --filterbtn-height: 1.5rem;
3678
- --filterbtn-text-size: var(--bs-text-base);
3679
- --filterbtn-weight: 400;
3680
- flex-shrink: 0;
3681
- position: relative;
4102
+ .bs-horizontal-nav-mobile :where(ul > li > a[data-active="true"]:hover) {
4103
+ color: var(--bs-ink-blue);
3682
4104
  }
3683
- .bs-filter-button {
4105
+ /* ===== Nested Nav Items ===== */
4106
+ .bs-horizontal-nav-mobile :where(.bs-horizontal-nav-mobile-nested-toggle) {
3684
4107
  align-items: center;
3685
- color: var(--filterbtn-color);
3686
- -moz-column-gap: 0.5rem;
3687
- column-gap: 0.5rem;
4108
+ color: var(--bs-ink-light);
3688
4109
  cursor: pointer;
3689
- display: inline-flex;
3690
- font-size: var(--filterbtn-text-size);
3691
- font-weight: var(--filterbtn-weight);
3692
- height: var(--filterbtn-height);
3693
- line-height: 1.5;
3694
- transition: outline-color 100ms ease-in-out;
3695
- width: -moz-max-content;
3696
- width: max-content;
3697
- }
3698
- .bs-filter-button::after {
3699
- border: solid var(--filterbtn-focus-color) 2px;
3700
- border-radius: 0.25rem;
3701
- content: '';
3702
- display: block;
3703
- height: 100%;
3704
- position: absolute;
3705
- 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;
3706
4116
  width: 100%;
3707
4117
  }
3708
- .bs-filter-button :where(.bs-icon),
3709
- .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) {
3710
4145
  display: block;
3711
- height: var(--filterbtn-caret-size);
3712
- line-height: 1;
3713
- transform: var(--filterbtn-caret-transform);
3714
- transform-origin: center;
3715
- transition: var(--bs-trans-rotate180);
3716
- width: var(--filterbtn-caret-size);
3717
4146
  }
3718
- .bs-filter-button:where([data-size="sm"],[data-size="xs"]) {
3719
-
3720
- --filterbtn-text-size: var(--bs-text-sm);
3721
- --filterbtn-caret-size: .75rem;
4147
+ .bs-horizontal-nav-mobile :where(.bs-horizontal-nav-mobile-nested-menu > li) {
4148
+ border-top: none;
3722
4149
  }
3723
- .bs-filter-button:where([data-size="sm"]) {
3724
- --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;
3725
4155
  }
3726
- .bs-filter-button:where([data-size="xs"]) {
3727
- --filterbtn-text-size: var(--bs-text-xs);
3728
- --filterbtn-weight: 600;
4156
+ .bs-horizontal-nav-mobile :where(.bs-horizontal-nav-mobile-external-link-icon) {
4157
+ height: 1rem;
4158
+ width: 1rem;
3729
4159
  }
3730
- /* Hover state */
3731
- .bs-filter-button:hover {
3732
- --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;
3733
4167
  }
3734
- /* Focus state */
3735
- .bs-filter-button:where(:focus-visible) {
3736
- outline: none;
3737
- --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;
3738
4170
  }
3739
- /* Filter open state */
3740
- .bs-filter-button:where([aria-expanded="true"],[data-open="true"]) {
3741
- --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);
3742
4184
  }
3743
- /* Badge non-standard color */
3744
- .bs-filter-button :where(.bs-badge) {
3745
- --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;
3746
4190
  }
3747
- :where(.dark) .bs-filter-button :where(.bs-badge) {
3748
- --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;
3749
4196
  }
3750
- .bs-filter-button:hover :where(.bs-badge) {
3751
- --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;
3752
4202
  }
3753
- /* Disabled state */
3754
- .bs-filter-button:where(:disabled) {
3755
- --filterbtn-color: var(--bs-ink-disabled);
3756
- 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);
3757
4212
  }
3758
- .bs-filter-button:where(:disabled) :where(.bs-badge) {
3759
- --badge-bg: var(--bs-bg-disabled);
3760
- --badge-text: var(--bs-ink-disabled);
4213
+ .bs-loader > :where(*:not(.visually-hidden)) {
4214
+ animation-timing-function: cubic-bezier(0, 1, 1, 0);
3761
4215
  }
3762
- .bs-flyout {
3763
- background-color: var(--bs-bg-base-to-light);
3764
- box-shadow: var(--bs-shadow-drawerRight);
3765
- height: 100%;
3766
- left: 0;
3767
- margin: 0;
3768
- max-width: 100vw;
3769
- opacity: 0;
3770
- padding: 1.5rem;
3771
- position: fixed;
3772
- top: 0;
3773
- transform: translateX(-100%);
3774
- transition-duration: 300ms;
3775
- transition-property: opacity, transform;
3776
- transition-timing-function: ease;
3777
- width: 360px;
3778
- z-index: 1000;
4216
+ .bs-loader > :where(*:nth-child(1)) {
4217
+ animation: loading-1 0.6s infinite;
4218
+ left: 0%;
3779
4219
  }
3780
- .bs-flyout:where([data-absolute="true"]) {
3781
- position: absolute;
4220
+ .bs-loader > :where(*:nth-child(2)) {
4221
+ animation: loading-2 0.6s infinite;
4222
+ left: 0%;
3782
4223
  }
3783
- .bs-flyout:where([data-position="right"]) {
3784
- box-shadow: var(--bs-shadow-drawerLeft);
3785
- left: auto;
3786
- right: 0;
3787
- transform: translateX(100%);
4224
+ .bs-loader > :where(*:nth-child(3)) {
4225
+ animation: loading-2 0.6s infinite;
4226
+ left: 40%;
3788
4227
  }
3789
- .bs-flyout:where([data-size="lg"]) {
3790
- width: 535px;
4228
+ .bs-loader > :where(*:nth-child(4)) {
4229
+ animation: loading-3 0.6s infinite;
4230
+ left: 80%;
3791
4231
  }
3792
- .bs-flyout:where([data-shown="true"]) {
3793
- opacity: 1;
3794
- /*
3795
- Needs to be "none" instead of "0" so as not to interfere with calculating
3796
- "containing block" for absolute and fixed positioned elements (see https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block)
3797
- */
3798
- transform: none;
4232
+ /* ----- color variants ----- */
4233
+ .bs-loader:where([data-variant="black"]) {
4234
+ --loader-dot-bg: var(--bs-black);
3799
4235
  }
3800
- .bs-flyout :where(.bs-flyout-close-container) {
3801
- display: flex;
3802
- justify-content: flex-end;
4236
+ .bs-loader:where([data-variant="gray"]) {
4237
+ --loader-dot-bg: var(--bs-gray-400);
3803
4238
  }
3804
- .bs-flyout :where(.bs-flyout-close-container button) {
3805
- cursor: pointer;
3806
- outline-offset: 2px;
3807
- padding: 2px;
4239
+ .bs-loader:where([data-variant="white"]) {
4240
+ --loader-dot-bg: var(--bs-white);
3808
4241
  }
3809
- /* Vue Transition Styles - Only used in Vue component */
3810
- .bs-flyout:where(.bs-flyout-enter-from),
3811
- .bs-flyout:where(.bs-flyout-leave-to) {
3812
- opacity: 0;
3813
- transform: translateX(-100%);
4242
+ @keyframes loading-1 {
4243
+ 0% {
4244
+ transform: scale(0);
4245
+ }
4246
+ 100% {
4247
+ transform: scale(1);
4248
+ }
3814
4249
  }
3815
- .bs-flyout:where([data-position="right"].bs-flyout-enter-from),
3816
- .bs-flyout:where([data-position="right"].bs-flyout-leave-to) {
3817
- 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
+ }
3818
4257
  }
3819
- .bs-flyout:where(.bs-flyout-enter-to),
3820
- .bs-flyout:where(.bs-flyout-leave-from) {
3821
- opacity: 1;
3822
- transform: translateX(0);
4258
+ @keyframes loading-3 {
4259
+ 0% {
4260
+ transform: scale(1);
4261
+ }
4262
+ 100% {
4263
+ transform: scale(0);
4264
+ }
3823
4265
  }
3824
4266
  .bs-modal {
3825
4267
  background-color: var(--bs-bg-base-to-medium);
@@ -3845,7 +4287,7 @@ button:where(.bs-filter-button) {
3845
4287
  }
3846
4288
  @media (min-width: 752px) {
3847
4289
  .bs-modal {
3848
- max-height: 40.625rem;
4290
+ max-height: min(calc(100vh - 3rem), 40.625rem);
3849
4291
  width: 35rem;
3850
4292
  }
3851
4293
  }
@@ -3937,154 +4379,59 @@ button:where(.bs-filter-button) {
3937
4379
  .bs-pagination:where([data-variant="results"]) {
3938
4380
  gap: 1rem;
3939
4381
  }
3940
- .bs-pagination :where(button) {
3941
- align-items: center;
3942
- border-radius: 4px;
3943
- cursor: pointer;
3944
- display: flex;
3945
- min-height: 1.5rem;
3946
- justify-content: center;
3947
- outline: 2px solid transparent;
3948
- min-width: 1.5rem;
3949
- }
3950
- .bs-pagination button:where(:focus),
3951
- .bs-pagination button:where(:focus-visible) {
3952
- outline: 2px solid var(--bs-blue-base);
3953
- }
3954
- .bs-pagination button:where(:focus:not(:focus-visible)) {
3955
- outline: 2px solid transparent;
3956
- }
3957
- .bs-pagination button:where(:disabled) {
3958
- color: var(--bs-ink-disabled);
3959
- }
3960
- .bs-pagination button:where([data-selected]:not([data-selected="false"])) {
3961
- background-color: var(--bs-blue-base);
3962
- color: var(--bs-gray-50);
3963
- }
3964
- .bs-pagination:where([data-fixed]:not([data-fixed="false"])) {
3965
- background-color: var(--bs-bg-base-elevated);
3966
- bottom: 0;
3967
- left: 0;
3968
- padding: 1rem;
3969
- position: fixed;
3970
- width: 100%;
3971
- }
3972
- .bs-pagination :where(.bs-pagination-page-numbers) {
3973
- display: flex;
3974
- gap: 1rem;
3975
- }
3976
- .bs-pagination :where(.bs-pagination-carets) {
3977
- display: flex;
3978
- gap: 1.5rem;
3979
- }
3980
- .bs-pagination :where(.bs-pagination-word-caret) {
3981
- align-items: center;
3982
- gap: 0.5rem;
3983
- width: auto;
3984
- }
3985
- .bs-pagination :where(.bs-pagination-results-numbers) {
3986
- display: flex;
3987
- gap: 0.5rem;
3988
- }
3989
- .bs-pagination :where(.bs-pagination-results-numbers) button {
3990
- padding-left: 2px;
3991
- padding-right: 2px;
3992
- width: auto;
3993
- }
3994
- .bs-loader {
3995
- --loader-dot-bg: var(--bs-blue-500);
3996
- --loader-dot-size: .75rem;
3997
- --loader-dot-top: calc(50% - var(--loader-dot-size)/2);
3998
- --loader-dot-translate: 1.75rem; /* i.e., calc(var(--loader-width)/2 - var(--loader-dot-size)/2); */
3999
- --loader-height: 3rem;
4000
- --loader-width: 4rem; /* approx 6 * dot size */
4001
- display: block;
4002
- height: var(--loader-height);
4003
- margin-inline-start: auto;
4004
- margin-inline-end: auto;
4005
- position: relative;
4006
- width: var(--loader-width);
4007
- }
4008
- .bs-loader:where([data-size="xs"]) {
4009
- --loader-dot-size: .3rem;
4010
- --loader-dot-translate: .75rem;
4011
- --loader-height: .3rem;
4012
- --loader-width: 1.8rem;
4013
- }
4014
- .bs-loader:where([data-size="sm"]) {
4015
- --loader-dot-size: .5rem;
4016
- --loader-dot-translate: 1.125rem;
4017
- --loader-height: .5rem;
4018
- --loader-width: 3rem;
4019
- }
4020
- .bs-loader:where([data-size="lg"]) {
4021
- --loader-dot-size: 1rem;
4022
- --loader-dot-translate: 2.375rem;
4023
- --loader-height: 4rem;
4024
- --loader-width: 6rem;
4025
- }
4026
- /* ----- loader dots ----- */
4027
- .bs-loader > :where(*:not(.visually-hidden)) {
4028
- background-color: var(--loader-dot-bg);
4029
- border-radius: 50%;
4030
- display: block;
4031
- height: var(--loader-dot-size);
4032
- position: absolute;
4033
- top: var(--loader-dot-top);
4034
- width: var(--loader-dot-size);
4035
- }
4036
- .bs-loader > :where(*:not(.visually-hidden)) {
4037
- animation-timing-function: cubic-bezier(0, 1, 1, 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;
4038
4391
  }
4039
- .bs-loader > :where(*:nth-child(1)) {
4040
- animation: loading-1 0.6s infinite;
4041
- left: 0%;
4392
+ .bs-pagination button:where(:focus),
4393
+ .bs-pagination button:where(:focus-visible) {
4394
+ outline: 2px solid var(--bs-blue-base);
4042
4395
  }
4043
- .bs-loader > :where(*:nth-child(2)) {
4044
- animation: loading-2 0.6s infinite;
4045
- left: 0%;
4396
+ .bs-pagination button:where(:focus:not(:focus-visible)) {
4397
+ outline: 2px solid transparent;
4046
4398
  }
4047
- .bs-loader > :where(*:nth-child(3)) {
4048
- animation: loading-2 0.6s infinite;
4049
- left: 40%;
4399
+ .bs-pagination button:where(:disabled) {
4400
+ color: var(--bs-ink-disabled);
4050
4401
  }
4051
- .bs-loader > :where(*:nth-child(4)) {
4052
- animation: loading-3 0.6s infinite;
4053
- left: 80%;
4402
+ .bs-pagination button:where([data-selected]:not([data-selected="false"])) {
4403
+ background-color: var(--bs-blue-base);
4404
+ color: var(--bs-gray-50);
4054
4405
  }
4055
- /* ----- color variants ----- */
4056
- .bs-loader:where([data-variant="black"]) {
4057
- --loader-dot-bg: var(--bs-black);
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%;
4058
4413
  }
4059
- .bs-loader:where([data-variant="gray"]) {
4060
- --loader-dot-bg: var(--bs-gray-400);
4414
+ .bs-pagination :where(.bs-pagination-page-numbers) {
4415
+ display: flex;
4416
+ gap: 1rem;
4061
4417
  }
4062
- .bs-loader:where([data-variant="white"]) {
4063
- --loader-dot-bg: var(--bs-white);
4418
+ .bs-pagination :where(.bs-pagination-carets) {
4419
+ display: flex;
4420
+ gap: 1.5rem;
4064
4421
  }
4065
- @keyframes loading-1 {
4066
- 0% {
4067
- transform: scale(0);
4068
- }
4069
- 100% {
4070
- transform: scale(1);
4071
- }
4422
+ .bs-pagination :where(.bs-pagination-word-caret) {
4423
+ align-items: center;
4424
+ gap: 0.5rem;
4425
+ width: auto;
4072
4426
  }
4073
- @keyframes loading-2 {
4074
- 0% {
4075
- transform: translate(0, 0);
4076
- }
4077
- 100% {
4078
- transform: translate(var(--loader-dot-translate), 0);
4079
- }
4427
+ .bs-pagination :where(.bs-pagination-results-numbers) {
4428
+ display: flex;
4429
+ gap: 0.5rem;
4080
4430
  }
4081
- @keyframes loading-3 {
4082
- 0% {
4083
- transform: scale(1);
4084
- }
4085
- 100% {
4086
- transform: scale(0);
4087
- }
4431
+ .bs-pagination :where(.bs-pagination-results-numbers) button {
4432
+ padding-left: 2px;
4433
+ padding-right: 2px;
4434
+ width: auto;
4088
4435
  }
4089
4436
  .bs-pill {
4090
4437
  --pill-background: var(--bs-bg-medium);
@@ -4289,6 +4636,44 @@ button:where(.bs-filter-button) {
4289
4636
  .bs-pill:where([data-variant^="filter"])[data-active="false"]:is(:disabled, [aria-disabled="true"]) {
4290
4637
  --pill-border: var(--bs-gray-400);
4291
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
+ }
4292
4677
  .bs-profile-img,
4293
4678
  .bs-profile-img:where([data-img-size^='sm']) {
4294
4679
  --profile-size: 2rem;
@@ -4356,44 +4741,6 @@ button:where(.bs-filter-button) {
4356
4741
  --profile-size: 5.75rem;
4357
4742
  --profile-text: var(--bs-text-2xl);
4358
4743
  }
4359
- .bs-profile-details {
4360
- color: var(--bs-ink-light);
4361
- font-size: var(--bs-text-sm);
4362
- line-height: 1.3;
4363
- }
4364
- .bs-profile-details > :where(*) {
4365
- display: block;
4366
- }
4367
- .bs-profile-details > :where(.bs-profile-name) {
4368
- color: var(--profile-name-color, var(--bs-ink-base));
4369
- -webkit-text-decoration: var(--profile-name-decoration, none);
4370
- text-decoration: var(--profile-name-decoration, none);
4371
- }
4372
- /* Action button aka Follow toggle. */
4373
- .bs-profile-details > :where(button:first-child) {
4374
- color: var(--profile-action-color, var(--bs-orange-warning));
4375
- font-size: inherit;
4376
- }
4377
- .bs-profile-details > :where(button:first-child:hover) {
4378
- text-decoration: underline;
4379
- }
4380
- /* Remove the profile name underline when hovering on the action button. */
4381
- .bs-profile-details:has(:where(button:first-child:hover)) {
4382
- --profile-name-decoration: none;
4383
- }
4384
- /* Action button and optional meta details w/ icon */
4385
- .bs-profile-details > :where([data-icon]) {
4386
- align-items: center;
4387
- -moz-column-gap: 0.5rem;
4388
- column-gap: 0.5rem;
4389
- cursor: pointer;
4390
- display: flex;
4391
- font-size: inherit;
4392
- }
4393
- .bs-profile-details .bs-icon {
4394
- height: .75rem;
4395
- width: .75rem;
4396
- }
4397
4744
  /* Profile with User Details */
4398
4745
  .bs-profile:where([data-layout]),
4399
4746
  .bs-profile:where([data-layout^='vertical']) {
@@ -5324,3 +5671,204 @@ This must go last to properly override the other classes
5324
5671
  opacity: 0;
5325
5672
  transform: translateY(-50%) scale(0.5);
5326
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
+ }