@wwtdev/bsds-css 2.28.0 → 3.0.0-rc.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/README.md +4 -4
  2. package/dist/wwt-bsds-preset.js +196 -68
  3. package/dist/wwt-bsds.css +2189 -1471
  4. package/dist/wwt-bsds.min.css +1 -1
  5. package/package.json +7 -11
  6. package/dist/components/_accordions.scss +0 -122
  7. package/dist/components/_alert.scss +0 -143
  8. package/dist/components/_badge.scss +0 -95
  9. package/dist/components/_banner.scss +0 -68
  10. package/dist/components/_buttons.scss +0 -289
  11. package/dist/components/_chart.scss +0 -169
  12. package/dist/components/_circle-buttons.scss +0 -231
  13. package/dist/components/_dropdown-options.scss +0 -236
  14. package/dist/components/_dropdown.scss +0 -189
  15. package/dist/components/_empty-state.scss +0 -99
  16. package/dist/components/_filter-buttons.scss +0 -116
  17. package/dist/components/_flyout.scss +0 -75
  18. package/dist/components/_form-booleans.scss +0 -182
  19. package/dist/components/_form-character-count.scss +0 -21
  20. package/dist/components/_form-container.scss +0 -111
  21. package/dist/components/_form-elements.scss +0 -40
  22. package/dist/components/_form-field-details.scss +0 -19
  23. package/dist/components/_form-hints.scss +0 -22
  24. package/dist/components/_form-input-composite.scss +0 -312
  25. package/dist/components/_form-input-phone.scss +0 -21
  26. package/dist/components/_form-input-search.scss +0 -74
  27. package/dist/components/_form-labels.scss +0 -40
  28. package/dist/components/_form-switches.scss +0 -154
  29. package/dist/components/_form-text-fields.scss +0 -205
  30. package/dist/components/_horizontal-navigation-mobile.scss +0 -238
  31. package/dist/components/_horizontal-navigation.scss +0 -220
  32. package/dist/components/_inline-tabs.scss +0 -86
  33. package/dist/components/_loader.scss +0 -105
  34. package/dist/components/_modal.scss +0 -185
  35. package/dist/components/_overlay.scss +0 -34
  36. package/dist/components/_pagination.scss +0 -85
  37. package/dist/components/_pills.scss +0 -224
  38. package/dist/components/_profile-details.scss +0 -44
  39. package/dist/components/_profile-img.scss +0 -73
  40. package/dist/components/_profile-layout.scss +0 -29
  41. package/dist/components/_spinner.scss +0 -95
  42. package/dist/components/_tab-list.scss +0 -151
  43. package/dist/components/_table.scss +0 -331
  44. package/dist/components/_tables.scss +0 -84
  45. package/dist/components/_timeline.scss +0 -122
  46. package/dist/components/_toast.scss +0 -149
  47. package/dist/components/_toaster.scss +0 -27
  48. package/dist/components/_tooltip.scss +0 -179
  49. package/dist/components/_vertical-navigation.scss +0 -280
  50. package/dist/components/accordions.css +0 -118
  51. package/dist/components/alert.css +0 -139
  52. package/dist/components/badge.css +0 -91
  53. package/dist/components/banner.css +0 -64
  54. package/dist/components/buttons.css +0 -285
  55. package/dist/components/chart.css +0 -165
  56. package/dist/components/circle-buttons.css +0 -227
  57. package/dist/components/dropdown-options.css +0 -232
  58. package/dist/components/dropdown.css +0 -185
  59. package/dist/components/empty-state.css +0 -95
  60. package/dist/components/filter-buttons.css +0 -112
  61. package/dist/components/flyout.css +0 -71
  62. package/dist/components/form-booleans.css +0 -178
  63. package/dist/components/form-character-count.css +0 -17
  64. package/dist/components/form-container.css +0 -108
  65. package/dist/components/form-elements.css +0 -36
  66. package/dist/components/form-field-details.css +0 -15
  67. package/dist/components/form-hints.css +0 -18
  68. package/dist/components/form-input-composite.css +0 -308
  69. package/dist/components/form-input-phone.css +0 -17
  70. package/dist/components/form-input-search.css +0 -70
  71. package/dist/components/form-labels.css +0 -36
  72. package/dist/components/form-switches.css +0 -150
  73. package/dist/components/form-text-fields.css +0 -201
  74. package/dist/components/horizontal-navigation-mobile.css +0 -234
  75. package/dist/components/horizontal-navigation.css +0 -216
  76. package/dist/components/inline-tabs.css +0 -83
  77. package/dist/components/loader.css +0 -101
  78. package/dist/components/modal.css +0 -181
  79. package/dist/components/overlay.css +0 -30
  80. package/dist/components/pagination.css +0 -81
  81. package/dist/components/pills.css +0 -220
  82. package/dist/components/profile-details.css +0 -40
  83. package/dist/components/profile-img.css +0 -69
  84. package/dist/components/profile-layout.css +0 -25
  85. package/dist/components/spinner.css +0 -91
  86. package/dist/components/tab-list.css +0 -147
  87. package/dist/components/table.css +0 -327
  88. package/dist/components/tables.css +0 -80
  89. package/dist/components/timeline.css +0 -118
  90. package/dist/components/toast.css +0 -145
  91. package/dist/components/toaster.css +0 -23
  92. package/dist/components/tooltip.css +0 -175
  93. package/dist/components/vertical-navigation.css +0 -276
  94. package/dist/wwt-bsds-wc-base.css +0 -1129
@@ -1,308 +0,0 @@
1
- /* 0 0 1 for width to allow e.g. tailwind override */
2
- :is(div, *):where(.bs-input-addon) {
3
- width: 100%;
4
- }
5
-
6
- .bs-input-addon {
7
- --input-border: var(--bs-border-input);
8
- align-items: center;
9
- background-color: var(--input-bg, var(--bs-bg-base));
10
- border-radius: .25rem;
11
- color: var(--bs-ink-base);
12
- display: flex;
13
- height: var(--input-addon-height, 2.5rem);
14
- overflow: hidden;
15
- padding: 0;
16
- pointer-events: none;
17
- position: relative;
18
- }
19
-
20
- :where(.dark) .bs-input-addon {
21
- background-color: var(--input-bg, transparent);
22
- }
23
-
24
- .bs-input-addon * {
25
- background-color: transparent;
26
- }
27
-
28
- /* Fix issue in Windows, where <select> options would be invisible, due to background-color: transparent */
29
- .bs-input-addon :where(.bs-select, select) {
30
- background-color: var(--input-bg, var(--bs-bg-base));
31
- }
32
-
33
- /**
34
- Implement an outer 'border' via pseudo-element instead of
35
- on main element to avoid content shifting, double-stroke effect,
36
- and issues with box-sizing
37
- */
38
- .bs-input-addon::after,
39
- .bs-input-addon::before,
40
- .bs-input-addon ::after,
41
- .bs-input-addon ::before {
42
- pointer-events: none;
43
- }
44
-
45
- .bs-input-addon::after,
46
- .bs-input-addon::before {
47
- content: '';
48
- height: 100%;
49
- left: 0;
50
- position: absolute;
51
- top: 0;
52
- width: 100%;
53
- }
54
-
55
- .bs-input-addon::after {
56
- border-color: var(--input-border);
57
- border-radius: .25rem;
58
- border-style: solid;
59
- border-width: var(--input-border-width, 1px);
60
- }
61
-
62
- .bs-input-addon :where(.bs-input-addon)::after {
63
- border-color: var(--input-addon-nested-border);
64
- border-style: solid;
65
- border-width: var(--input-border-width, 1px);
66
- }
67
-
68
- .bs-input-addon > * {
69
- flex-grow: 0;
70
- flex-shrink: 0;
71
- position: relative;
72
- }
73
-
74
- .bs-input-addon > :where([data-part="main"], .bs-input-addon, bs-input, .bs-input),
75
- .bs-input-addon > :where([data-autowidth]:not([data-autowidth="false"]), .bs-input-addon, bs-input, .bs-input) {
76
- flex-grow: 1;
77
- flex-shrink: 1;
78
- }
79
-
80
- .bs-input-addon > :where([data-part="main"]) > :where(input, select),
81
- .bs-input-addon > :where([data-autowidth]:not([data-autowidth="false"])) > :where(input, select) {
82
- width: 100%;
83
- }
84
-
85
- .bs-input-addon > *:where(:not(.bs-input-addon)) {
86
- align-items: center;
87
- border-width: 0px;
88
- display: flex;
89
- height: 100%;
90
- overflow: hidden;
91
- pointer-events: auto;
92
- }
93
-
94
- /* Remove (hide) children's borders, outlines */
95
- .bs-input-addon > *,
96
- .bs-input-addon :where(input, select),
97
- .bs-input-addon :is(bs-input, bs-select) :where(input, select),
98
- .bs-input-addon :is(input, select):where(.bs-input, .bs-select),
99
- .bs-input-addon :where(.bs-input-addon) {
100
- --input-border: transparent;
101
- --input-border-width: 0px;
102
- }
103
-
104
- .bs-input-addon {
105
- --input-addon-nested-border: transparent;
106
- }
107
-
108
- .bs-input-addon :where(:focus-within) :where(input, select, button),
109
- .bs-input-addon :where(:focus-within) :is(bs-input, bs-select) :where(input, select),
110
- .bs-input-addon :where(:focus-within) :is(input, select, button):where(.bs-input, .bs-select),
111
- .bs-input-addon :where(input, select, button):where(:focus, :focus-within, :focus-visible),
112
- .bs-input-addon :is(input, select):where(.bs-input, .bs-select):where(:focus, :focus-within, :focus-visible),
113
- .bs-input-addon :is(bs-input, bs-select) :where(input, select):where(:focus, :focus-within, :focus-visible) {
114
- --input-border: transparent;
115
- box-shadow: none;
116
- outline: none;
117
- }
118
-
119
- /* -------- Inner-bordered styles -------- */
120
- /** Inner borders should be straight; shown only if variant: "inner-bordered" */
121
-
122
- .bs-input-addon:where([data-variant="inner-bordered"]) {
123
- --input-addon-nested-border: var(--bs-violet-200);
124
- }
125
-
126
- .bs-input-addon > :where(.bs-input-addon:not(:last-child, :focus-within, [data-part="right"])),
127
- .bs-input-addon > :where(:not(:last-child, :focus-within, [data-part="right"]))::after {
128
- border-top-right-radius: 0;
129
- border-bottom-right-radius: 0;
130
- }
131
-
132
- .bs-input-addon > :where(.bs-input-addon:not(:first-child, :focus-within, [data-part="left"])),
133
- .bs-input-addon > :where(:not(:first-child, :focus-within, [data-part="left"]))::after {
134
- border-top-left-radius: 0;
135
- border-bottom-left-radius: 0;
136
- }
137
-
138
- .bs-input-addon:where([data-variant="inner-bordered"]) > :where(:not(:focus, :focus-within))::after {
139
- border-left-width: 0px;
140
- border-right-width: 1px;
141
- border-right-color: var(--input-addon-nested-border);
142
- }
143
-
144
- .bs-input-addon:where([data-variant="inner-bordered"]) > :where(:not(.bs-input-addon, :focus, :focus-within))::after {
145
- content: '';
146
- height: 100%;
147
- left: 0;
148
- position: absolute;
149
- top: 0;
150
- width: 100%;
151
- }
152
-
153
- .bs-input-addon:where([data-variant="inner-bordered"]) > :where(.bs-input-addon)::after {
154
- border-radius: 0px;
155
- }
156
-
157
- /* -------- Auto Padding for Children, Auto Sizing Icons -------- */
158
- /* Opt in for now, for backwards compatibility */
159
- .bs-input-addon:where([data-autopad="true"], [data-variant="combobox"]) > *:where(:not(.bs-input-addon)) {
160
- padding-inline: 0;
161
- }
162
-
163
- .bs-input-addon:where([data-autopad="true"], [data-variant="combobox"]) > :where([data-part="left"]:not(.bs-input-addon)),
164
- .bs-input-addon:where([data-autopad="true"], [data-variant="combobox"]) > :where(:first-child:not(.bs-input-addon)) {
165
- padding-inline: 0.75rem 0.5rem;
166
- }
167
-
168
- .bs-input-addon:where([data-autopad="true"], [data-variant="combobox"]) > :where([data-part="right"]:not(.bs-input-addon)),
169
- .bs-input-addon:where([data-autopad="true"], [data-variant="combobox"]) > :where(:last-child:not(.bs-input-addon)) {
170
- padding-inline: 0.5rem 0.75rem;
171
- }
172
-
173
- .bs-input-addon:where([data-autopad="true"][data-multifocus]) > *:where(:not(.bs-input-addon)) {
174
- padding-inline: 0.75rem;
175
- }
176
-
177
- .bs-input-addon:where([data-autosize-icons="true"], [data-variant="combobox"]) > :where(:not([data-autowidth], [data-part="main"], .bs-input-addon)) {
178
- height: 100%;
179
- min-width: min-content;
180
- }
181
-
182
- .bs-input-addon:where([data-autosize-icons="true"], [data-variant="combobox"]) :where(svg) {
183
- height: auto;
184
- max-height: 100%;
185
- width: 1rem;
186
- }
187
-
188
- /* -------- Focus styles -------- */
189
- .bs-input-addon {
190
- --focus-border: var(--bs-blue-base);
191
- }
192
-
193
- .bs-input-addon:where(:not([data-multifocus]):focus-within),
194
- .bs-input-addon:where([data-multifocus="false"]:focus-within),
195
- .bs-input-addon:where([data-multifocus]:not([data-multifocus="false"])) :where(input, select):where(:focus, :focus-within, :focus-visible),
196
- .bs-input-addon:where([data-multifocus]:not([data-multifocus="false"])) :is(input, select):where(.bs-input, .bs-select):where(:focus, :focus-within, :focus-visible),
197
- .bs-input-addon:where([data-multifocus]:not([data-multifocus="false"])) :is(bs-input, bs-select) :where(input, select):where(:focus, :focus-within, :focus-visible) {
198
- --input-border: var(--focus-border);
199
- position: relative;
200
- z-index: 1;
201
- }
202
-
203
- .bs-input-addon :where(.bs-input-addon:focus-within) {
204
- --input-addon-nested-border: var(--focus-border);
205
- z-index: 1;
206
- }
207
-
208
- .bs-input-addon :where(.bs-input-addon:focus-within)::after {
209
- z-index: 1;
210
- }
211
-
212
- .bs-input-addon:where([data-multifocus]:not([data-multifocus="false"])) > :where(:not(.bs-input-addon)) > :is(input, select, button):where(:focus),
213
- .bs-input-addon:where([data-multifocus]:not([data-multifocus="false"])) > :is(input, select):where(.bs-input, .bs-select):where(:focus),
214
- .bs-input-addon:where([data-multifocus]:not([data-multifocus="false"])) > :is(bs-input, bs-select) :where(input:focus, select:focus),
215
- .bs-input-addon:where([data-multifocus]:not([data-multifocus="false"])) > :where(input:focus, select:focus, button:focus) {
216
- border-radius: .25rem;
217
- box-shadow: var(--focus-border) 0px 0px 0px 1px inset;
218
- z-index: 1;
219
- }
220
-
221
- .bs-input-addon:where(:not([data-multifocus]):focus-within)::after,
222
- .bs-input-addon:where([data-multifocus="false"]:focus-within)::after {
223
- border-width: 1px;
224
- border-radius: .25rem;
225
- }
226
-
227
- .bs-input-addon:where(:focus-within) :where(:not(:focus, :focus-within))::after,
228
- .bs-input-addon:where(:focus-within) :where(:not(:focus, :focus-within)) {
229
- border-color: transparent;
230
- }
231
-
232
- /* Straight-lined ::before border to fill the gap below the rounded ::after border */
233
- .bs-input-addon:where([data-multifocus]:not([data-multifocus="false"])) :where(:focus-within)::before {
234
- border-bottom-width: 1px;
235
- border-color: var(--bs-violet-300);
236
- border-radius: 0;
237
- border-top-width: 1px;
238
- z-index: 1;
239
- }
240
-
241
- /* -------- Disabled styles -------- */
242
- .bs-input-addon:where([data-disabled]:not([data-disabled="false"])),
243
- .bs-input-addon:where([data-disabled]:not([data-disabled="false"])) .bs-button {
244
- --input-bg: var(--bs-bg-disabled);
245
- --input-border: var(--bs-ink-disabled);
246
- --input-addon-nested-border: var(--bs-ink-disabled);
247
- color: var(--bs-ink-disabled);
248
- }
249
- .bs-input-addon:where([data-disabled]:not([data-disabled="false"])) * {
250
- pointer-events: none;
251
- }
252
- .bs-input-addon:where([data-disabled]:not([data-disabled="false"]))::after,
253
- .bs-input-addon:where([data-disabled]:not([data-disabled="false"]))::before,
254
- .bs-input-addon:where([data-disabled]:not([data-disabled="false"])):where([data-variant="inner-bordered"]) {
255
- --input-border-width: 0;
256
- }
257
-
258
- .bs-input-addon:where([data-disabled]:not([data-disabled="false"])):where([data-variant="inner-bordered"]) > :where(:not(:focus, :focus-within))::after {
259
- border-right-width: 0;
260
- }
261
-
262
- /* -------- Error styles -------- */
263
- .bs-input-addon:where([data-error]:not([data-error="false"])),
264
- .bs-input-addon:where([data-error]:not([data-error="false"])) :where(.bs-input-addon) {
265
- --focus-border: var(--bs-ink-red);
266
- --input-border: var(--bs-ink-red);
267
- }
268
-
269
- .bs-input-addon:where([data-error]:not([data-error="false"]),[data-disabled]:not([data-disabled="false"])) > *::before,
270
- .bs-input-addon:where(.bs-input-addon[data-error]:not([data-error="false"]) .bs-input-addon, .bs-input-addon[data-disabled]:not([data-disabled="false"]) .bs-input-addon) > *::before {
271
- border-color: var(--input-border);
272
- }
273
-
274
- /* -------- Label margin -------- */
275
- :where(label, .bs-label, bs-label) + .bs-input-addon {
276
- margin-top: 0.25rem;
277
- }
278
-
279
- /* ----------------- Variant: Combobox Input ----------------- */
280
- /*
281
- Combobox variant also shares styles with data-autopad="true" &
282
- data-autosize-icons="true" - see above
283
- */
284
- .bs-input-addon:where([data-variant="combobox"]) {
285
- --input-addon-nested-border: transparent;
286
- }
287
-
288
- .bs-input-addon:where([data-variant="combobox"]) :where(button svg) {
289
- transform: var(--icon-btn-transform, none);
290
- transition: var(--bs-trans-rotate180);
291
- }
292
-
293
- .bs-input-addon:where([data-variant="combobox"]) :where(button[data-open="true"]) {
294
- --icon-btn-transform: rotate(180deg);
295
- }
296
-
297
- .bs-input-addon:where([data-variant="combobox"][data-disabled="true"]) > :where(button) {
298
- opacity: 0;
299
- }
300
-
301
- .bs-input-addon:where([data-variant="combobox"]) > :where(button) {
302
- border-radius: .25rem;
303
- outline: 1px solid transparent;
304
- }
305
-
306
- .bs-input-addon:where([data-variant="combobox"]) > :where(button:focus-visible) {
307
- outline: 1px solid var(--focus-border);
308
- }
@@ -1,17 +0,0 @@
1
- .bs-input-phone :where(.bs-input-addon) > button {
2
- align-items: center;
3
- column-gap: .5rem;
4
- cursor: pointer;
5
- display: grid;
6
- grid-template-columns: 1.25rem auto .75rem;
7
- min-width: 6rem;
8
- padding: 0 1rem;
9
- }
10
-
11
- .bs-input-phone .bs-input-addon:where([data-disabled]:not([data-disabled="false"])) :where(button) :where(span) {
12
- filter: grayscale(1);
13
- }
14
-
15
- .bs-input-phone ul:where(.bs-dropdown-options) {
16
- min-width: 7.5rem;
17
- }
@@ -1,70 +0,0 @@
1
- :where(.bs-input-search) {
2
- display: inline-block;
3
- width: 100%;
4
- }
5
-
6
- .bs-input-search :where(.bs-icon svg) {
7
- box-sizing: content-box;
8
- }
9
-
10
- .bs-input-search :where([data-component="bs-icon-search"]) {
11
- --icon-size: var(--search-icon-size, 1.75rem);
12
- padding: var(--search-icon-padding, 0 0 0 .75rem);
13
- }
14
-
15
- /* Clear Button */
16
- .bs-input-search button {
17
- align-items: center;
18
- background-color: transparent;
19
- cursor: pointer;
20
- display: flex;
21
- height: 100%;
22
- padding-left: 0.75rem;
23
- padding-right: 0.75rem;
24
- transition: transform 100ms ease-in-out;
25
- }
26
-
27
- .bs-input-search button:where(:active) {
28
- transform: scale(0.97);
29
- transform-origin: center;
30
- box-shadow: inset 0px 0px 4px 1px var(--bs-blue-base);
31
- }
32
-
33
- .bs-input-search button:where(:focus) {
34
- border-radius: .25rem;
35
- box-shadow: var(--focus-border) 0px 0px 0px 1px inset;
36
- z-index: 1;
37
- }
38
-
39
-
40
- /* Filter variant */
41
-
42
- .bs-input-search:where([data-variant="filter"]) {
43
- --focus-border: transparent;
44
- --input-border: transparent;
45
- --input-addon-height: 1.5rem;
46
- --input-caret: var(--bs-blue-base);
47
- --input-padding-block: 0 0.125rem;
48
- --input-padding-inline: 0.5rem;
49
- --input-placeholder: var(--bs-ink-light);
50
- --input-text-size: var(--bs-text-sm);
51
- --search-icon-size: 1rem;
52
- --search-icon-padding: 0;
53
- }
54
-
55
- /* Filter variant: persist placeholder text color (`ink-light`) in dark mode */
56
- :where(.dark) .bs-input-search:where([data-variant="filter"]) :is(input.bs-input)::placeholder {
57
- --input-placeholder: var(--bs-ink-light);
58
- }
59
-
60
- /* Filter variant: cancels out base hover state styles */
61
- .bs-input-addon:where([data-variant="filter"]):hover {
62
- --input-bg: var(--bs-bg-base);
63
- }
64
-
65
- /* -------- Disabled styles -------- */
66
- .bs-input-addon:where([data-variant="filter"][data-disabled="true"]),
67
- .bs-input-addon:where([data-variant="filter"][data-disabled="true"]) :is(.bs-button, .bs-input) {
68
- --input-bg: var(--bs-bg-base);
69
- --input-border: transparent;
70
- }
@@ -1,36 +0,0 @@
1
- :where(label, legend),
2
- label:where(.bs-label) {
3
- display: inline-block;
4
- position: relative;
5
- width: 100%;
6
- }
7
-
8
- .bs-label,
9
- :where(label, legend) {
10
- --label-color: var(--bs-ink-base);
11
- color: var(--label-color);
12
- font-size: var(--bs-text-sm);
13
- font-weight: 600;
14
- line-height: var(--bs-leading-base);
15
- }
16
-
17
- /* Required asterisk */
18
- :where(label, legend) :where([data-required]:not([data-required="false"])),
19
- .bs-label :where([data-required="true"]) {
20
- color: var(--label-asterisk-color, var(--bs-ink-red));
21
- }
22
-
23
- /* Disabled state */
24
- :where(label[data-disabled]:not([data-disabled="false"])),
25
- :where(label[data-disabled]:not([data-disabled="false"])) *,
26
- .bs-label:where([data-disabled="true"]),
27
- .bs-label:where([data-disabled="true"]) * {
28
- --label-asterisk-color: transparent;
29
- --label-color: var(--bs-ink-disabled);
30
- }
31
-
32
- .bs-label:where(:has(+ input), :has(+ .bs-input-addon), :has(+ :not(label) .bs-input-addon))::after {
33
- content: '';
34
- inset: 0 0 -.25rem 0;
35
- position: absolute;
36
- }
@@ -1,150 +0,0 @@
1
- .bs-switch {
2
- --box-shadow: var(--bs-ink-base);
3
- --ball-background: var(--bs-white);
4
- --ball-diameter: 1rem;
5
- --inner-text-line-height: 1;
6
- --inner-text-size: var(--bs-text-sm);
7
- --inner-text-width: 1rem;
8
- --inner-text-padding: 0.5rem;
9
- --offset: 0.25rem;
10
- --offset-double: .5rem;
11
- --switch-background: var(--bs-gray-400);
12
- --switch-height: 1.5rem;
13
- --switch-width: 2.5rem;
14
-
15
- border: none;
16
- border-radius: 100vw;
17
- cursor: pointer;
18
- height: var(--switch-height);
19
- position: relative;
20
- }
21
-
22
- .bs-switch:where([data-size="sm"]) {
23
- --ball-diameter: .625rem;
24
- --inner-text-line-height: 1.6666;
25
- --inner-text-size: var(--bs-text-xs);
26
- --inner-text-width: .75rem;
27
- --inner-text-padding: 0.375rem;
28
- --offset: 0.1875rem;
29
- --offset-double: .375rem;
30
- --switch-height: 1rem;
31
- --switch-width: 1.875rem;
32
- }
33
-
34
- .bs-switch input,
35
- .bs-switch:where([data-size="sm"]) input {
36
- cursor: pointer;
37
- height: 100%;
38
- opacity: 0;
39
- position: absolute;
40
- width: 100%;
41
- }
42
-
43
- .bs-switch span {
44
- align-items: center;
45
- background-color: var(--switch-background);
46
- border-radius: 100vw;
47
- display: inline-block;
48
- font-size: var(--inner-text-size);
49
- height: 100%;
50
- padding: 0 var(--inner-text-padding);
51
- pointer-events: none;
52
- position: relative;
53
- transition: 250ms;
54
- width: var(--switch-width);
55
- }
56
-
57
- .bs-switch :where(input:checked) ~ :where(span),
58
- .bs-switch:where([aria-pressed]:not([aria-pressed="false"])) :where(span) {
59
- --switch-background: var(--bs-blue-base);
60
- }
61
-
62
- /* Toggle "ball" */
63
- .bs-switch :where(span)::before {
64
- background-color: var(--ball-background);
65
- border-radius: 50%;
66
- box-sizing: border-box;
67
- content: '';
68
- height: var(--ball-diameter);
69
- left: var(--offset);
70
- position: absolute;
71
- top: 50%;
72
- transform: translate(0, -50%);
73
- transition: inherit;
74
- width: var(--ball-diameter);
75
- }
76
-
77
- .bs-switch :where(input:checked) ~ :where(span)::before,
78
- .bs-switch:where([aria-pressed]:not([aria-pressed="false"])) :where(span)::before {
79
- transform: translate(calc(var(--switch-width) - var(--offset-double) - var(--ball-diameter)), -50%);
80
- }
81
-
82
- .bs-switch :where(input:checked) ~ :where(span[data-inner-on-label][data-inner-off-label])::before,
83
- .bs-switch:where([aria-pressed]:not([aria-pressed="false"])) :where(span[data-inner-on-label][data-inner-off-label])::before {
84
- transform: translate(calc(var(--switch-width) - var(--offset-double) - var(--ball-diameter)), -50%);
85
- }
86
-
87
-
88
- /* Inner "on/off" text */
89
- .bs-switch :where(span)::after {
90
- align-items: center;
91
- color: var(--ball-background);
92
- content: var(--inner-label-text);
93
- display: flex;
94
- height: 100%;
95
- justify-content: var(--inner-label-position, flex-start);
96
- left: 0;
97
- line-height: var(--inner-text-line-height);
98
- padding: var(--inner-text-padding);
99
- position: absolute;
100
- text-transform: capitalize;
101
- top: 0;
102
- width: 100%;
103
- }
104
-
105
- .bs-switch :where([data-inner-on-label][data-inner-off-label]) {
106
- --switch-width: 3.5rem;
107
- }
108
-
109
- .bs-switch:where([data-size="sm"]) :where([data-inner-on-label][data-inner-off-label]) {
110
- --switch-width: 2.625rem;
111
- }
112
-
113
- .bs-switch :where(input:not(:checked)) ~ :where([data-inner-on-label][data-inner-off-label])::after,
114
- .bs-switch:where([aria-pressed="false"]) :where([data-inner-on-label][data-inner-off-label])::after {
115
- --inner-label-position: flex-end;
116
- --inner-label-text: attr(data-inner-off-label);
117
- }
118
-
119
- .bs-switch :where(input:checked) ~ :where([data-inner-on-label][data-inner-off-label])::after,
120
- .bs-switch:where([aria-pressed]:not([aria-pressed="false"])) :where([data-inner-on-label][data-inner-off-label])::after {
121
- --inner-label-text: attr(data-inner-on-label);
122
- }
123
-
124
- /* Focus state */
125
-
126
- .bs-switch :where(input:focus-visible) + :where(span),
127
- .bs-switch:where(:focus-visible) :where(button span) {
128
- box-shadow: 0 0 0 2px var(--offset-color, var(--bs-bg-base)),
129
- 0 0 0 4px var(--outline-color, var(--bs-blue-base));
130
- outline: 2px solid transparent;
131
- }
132
- :where(.box) .bs-switch :where(input:focus-visible) + :where(span),
133
- :where(.box) .bs-switch:where(:focus-visible) :where(button span) {
134
- --offset-color: var(--bs-bg-medium);
135
- }
136
- :where(.box[data-invert]) .bs-switch :where(input:focus-visible) + :where(span),
137
- :where(.box[data-invert]) .bs-switch:where(:focus-visible) :where(button span) {
138
- --offset-color: var(--bs-bg-invert-to-base);
139
- }
140
-
141
- /* Disabled state */
142
- .bs-switch:where([data-disabled]:not([data-disabled="false"]), :disabled, [disabled]),
143
- .bs-switch:where([data-disabled]:not([data-disabled="false"]), :disabled, [disabled]) :is(input ~ span, button span) {
144
- --ball-background: var(--bs-ink-disabled);
145
- --switch-background: var(--bs-bg-disabled);
146
- }
147
-
148
- .bs-switch input:where(:disabled) {
149
- cursor: default;
150
- }