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