@wwtdev/bsds-css 0.3.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,189 @@
1
+ :where(button) {
2
+ background-color: inherit;
3
+ border-color: transparent;
4
+ color: inherit;
5
+ font-size: var(--bs-text-base);
6
+ position: relative;
7
+ padding: var(--bs-space-0);
8
+ text-decoration: none;
9
+ }
10
+
11
+ .bs-button {
12
+ --btn-main: var(--bs-blue-400);
13
+ --btn-secondary: var(--bs-blue-300);
14
+ --btn-highlight: var(--bs-blue-100);
15
+ align-items: center;
16
+ background-color: var(--btn-main);
17
+ border: none;
18
+ border-radius: 0.25rem;
19
+ color: var(--bs-white);
20
+ cursor: pointer;
21
+ display: inline-flex;
22
+ font-size: var(--bs-text-md);
23
+ font-weight: 600;
24
+ justify-content: center;
25
+ line-height: 1.5;
26
+ outline: 2px solid transparent;
27
+ padding: var(--bs-space-1) var(--bs-space-4) calc(var(--bs-space-1) * 1.5);
28
+ position: relative;
29
+ text-decoration: none;
30
+ transition: all 100ms ease-in-out;
31
+ vertical-align: middle;
32
+ }
33
+
34
+
35
+ .bs-button:hover {
36
+ background-color: var(--btn-secondary);
37
+ }
38
+
39
+ .bs-button:active {
40
+ background-color: var(--btn-secondary);
41
+ transform: scale(0.97);
42
+ transform-origin: center;
43
+ box-shadow: inset 0px 0px 4px 1px var(--btn-main);
44
+ }
45
+
46
+ /* Button Focus Styles */
47
+ .bs-button::before {
48
+ border-color: transparent;
49
+ border-radius: 0.5rem;
50
+ border-style: solid;
51
+ border-width: 0.125rem;
52
+ content: '';
53
+ height: calc(100% + 0.5rem);
54
+ inset: -0.25rem;
55
+ position: absolute;
56
+ transition: border-color 0.125s ease-in-out;
57
+ width: calc(100% + 0.5rem);
58
+ }
59
+
60
+ .bs-button:focus::before {
61
+ border-color: var(--btn-main);
62
+ }
63
+
64
+ .bs-button:focus-visible::before {
65
+ border-color: var(--btn-main);
66
+ box-shadow: none;
67
+ }
68
+
69
+ .bs-button:focus:not(:focus-visible)::before {
70
+ border-color: transparent;
71
+ box-shadow: none;
72
+ }
73
+
74
+ /* Ghost Buttons */
75
+ .bs-button:where([data-ghost]) {
76
+ --btn-light: var(--bs-blue-10);
77
+ --btn-secondary: var(--bs-blue-10);
78
+ background-color: transparent;
79
+ box-shadow: inset 0 0 0 1px var(--btn-main);
80
+ color: var(--btn-main);
81
+ }
82
+ .bs-button:where([data-ghost])::before {
83
+ border-radius: 0.4375rem;
84
+ }
85
+ .bs-button:where([data-ghost]):hover,
86
+ .bs-button:where([data-ghost]):focus {
87
+ background-color: var(--btn-light);
88
+ }
89
+ .bs-button:where([data-ghost]):active {
90
+ box-shadow:
91
+ inset 0 0 0 1px var(--btn-main),
92
+ inset 0px 0px 4px 1px var(--btn-highlight);
93
+ }
94
+
95
+ /* Button type */
96
+ .bs-button:where([data-variant^='secondary']) {
97
+ --btn-main: var(--bs-plum-400);
98
+ --btn-secondary: var(--bs-plum-300);
99
+ --btn-light: var(--bs-plum-10);
100
+ --btn-highlight: var(--bs-plum-100);
101
+ }
102
+ .dark .bs-button:where([data-variant^='secondary']) {
103
+ --btn-main: var(--bs-plum-200);
104
+ --btn-secondary: var(--bs-plum-300);
105
+ --btn-light: var(--bs-navy-400);
106
+ --btn-highlight: var(--bs-plum-400);
107
+ }
108
+ .bs-button:where([data-variant^='positive']) {
109
+ --btn-main: var(--bs-purple-400);
110
+ --btn-secondary: var(--bs-purple-300);
111
+ --btn-light: var(--bs-purple-10);
112
+ --btn-highlight: var(--bs-purple-100);
113
+ }
114
+ .bs-button:where([data-variant^='warning']) {
115
+ --btn-main: var(--bs-orange-warning);
116
+ --btn-secondary: var(--bs-orange-300);
117
+ --btn-light: var(--bs-orange-10);
118
+ --btn-highlight: var(--bs-orange-100);
119
+ }
120
+ .bs-button:where([data-variant^='negative']) {
121
+ --btn-main: var(--bs-red-400);
122
+ --btn-secondary: var(--bs-red-300);
123
+ --btn-light: var(--bs-red-10);
124
+ --btn-highlight: var(--bs-red-100);
125
+ }
126
+
127
+ /* Text Button */
128
+ .bs-button:where([data-text]) {
129
+ background-color: transparent;
130
+ color: var(--bs-blue-500);
131
+ cursor: pointer;
132
+ font-size: var(--bs-text-md);
133
+ font-weight: 400;
134
+ line-height: 150%;
135
+ }
136
+ .bs-button:where([data-text]):hover {
137
+ background-color: transparent;
138
+ text-decoration: underline;
139
+ }
140
+ .bs-button:where([data-text]):active {
141
+ box-shadow: none;
142
+ }
143
+
144
+ /* Button Size */
145
+ .bs-button:where([data-size^='sm']) {
146
+ font-size: var(--bs-text-sm);
147
+ }
148
+ .bs-button:where([data-text][data-size^='sm']) {
149
+ font-size: var(--bs-text-base);
150
+ }
151
+
152
+ /* Disabled Styling */
153
+ :where(button:disabled),
154
+ .bs-button:where([aria-disabled='true']) /* for links as buttons */ {
155
+ pointer-events: none;
156
+ }
157
+ .bs-button:where(:disabled),
158
+ .bs-button:where([aria-disabled='true']) {
159
+ color: var(--bs-gray-400);
160
+ background-color: var(--bs-gray-200);
161
+ }
162
+
163
+ .bs-button:where([data-ghost]):disabled,
164
+ .bs-button:where([data-ghost])[aria-disabled='true'] {
165
+ box-shadow: inset 0 0 0 1px var(--bs-gray-400);
166
+ }
167
+
168
+ .bs-button:where([data-text]):disabled,
169
+ .bs-button:where([data-text][aria-disabled='true']) {
170
+ background-color: transparent;
171
+ }
172
+
173
+ /* Icon Height */
174
+ .bs-button :where(svg:not([height])) {
175
+ height: var(--bs-text-base);
176
+ }
177
+
178
+ .bs-button:where([data-size^='sm']) :where(svg:not([height])) {
179
+ height: var(--bs-text-xs);
180
+ }
181
+
182
+ /* links as buttons */
183
+ a.bs-button {
184
+ align-items: center;
185
+ display: inline-flex;
186
+ outline: none;
187
+ vertical-align: middle;
188
+ }
189
+
@@ -0,0 +1,154 @@
1
+ /* Containers and Labels for Checkbox/Radio */
2
+ .bs-boolean {
3
+ display: flex;
4
+ align-items: center;
5
+ font-size: var(--bs-text-base);
6
+ font-weight: 400;
7
+ gap: 0.5em;
8
+ line-height: 115%;
9
+ }
10
+
11
+ .bs-boolean:where([data-size='sm']) input {
12
+ width: var(--bs-text-xs);
13
+ height: var(--bs-text-xs);
14
+ }
15
+
16
+ .bs-boolean label {
17
+ font-size: var(--bs-text-base);
18
+ font-weight: 400;
19
+ line-height: 1.5;
20
+ width: auto;
21
+ }
22
+
23
+ .bs-boolean:where([data-size='sm']),
24
+ .bs-boolean:where([data-size='sm']) label {
25
+ font-size: var(--bs-text-xs);
26
+ }
27
+
28
+
29
+ /* Checkbox & Radio Input */
30
+
31
+ :where(input[type^='checkbox'], input[type^='radio']) {
32
+ --box-shadow: var(--bs-ink-base);
33
+
34
+ appearance: none;
35
+ background-color: var(--bg-base);
36
+ box-shadow: inset 0 0 0 0.125rem var(--box-shadow);
37
+ display: grid;
38
+ height: 1rem;
39
+ margin: 0;
40
+ place-content: center;
41
+ position: relative;
42
+ width: 1rem;
43
+ }
44
+
45
+ :where(input[type^='checkbox'], input[type^='radio']):focus {
46
+ box-shadow: inset 0 0 0 0.125rem var(--box-shadow),
47
+ 0 0 0 2px var(--offset-color, var(--bs-bg-base)),
48
+ 0 0 0 4px var(--outline-color, var(--bs-blue-400));
49
+ }
50
+
51
+ :where(input[type^='checkbox']) {
52
+ border-radius: 0.125rem;
53
+ }
54
+
55
+ :where(input[type^='radio']) {
56
+ border-radius: 50%;
57
+ }
58
+
59
+ input:where([type='checkbox'])::before {
60
+ --filled-size: 1rem;
61
+ --check-fill-color: var(--bs-blue-400);
62
+
63
+ content: '';
64
+ border-radius: 0.125rem;
65
+ box-shadow: inset var(--filled-size) var(--filled-size) var(--check-fill-color);
66
+ height: var(--filled-size);
67
+ visibility: hidden;
68
+ width: var(--filled-size);
69
+ }
70
+
71
+ input:where([type^='checkbox'])::after {
72
+ border: solid var(--bs-white);
73
+ border-width: 0 0.125rem 0.125rem 0;
74
+ content: '';
75
+ height: 0.75em;
76
+ left: 50%;
77
+ position: absolute;
78
+ top: 50%;
79
+ transform-origin: center;
80
+ transform: translate(-50%, -60%) rotate(45deg);
81
+ visibility: hidden;
82
+ width: 0.375em;
83
+ }
84
+
85
+ input:where([type='radio'])::before {
86
+ --filled-size: 1rem;
87
+ --radio-fill-color: var(--bs-blue-400);
88
+
89
+ background-color: var(--radio-fill-color);
90
+ border-radius: 50%;
91
+ box-sizing: content-box;
92
+ content: '';
93
+ height: var(--filled-size);
94
+ visibility: hidden;
95
+ width: var(--filled-size);
96
+ }
97
+
98
+ input:where([type='radio'])::after {
99
+ --inner-size: 0.375rem;
100
+ --inner-fill-color: var(--bs-white);
101
+
102
+ background-color: var(--inner-fill-color);
103
+ border-radius: 50%;
104
+ box-sizing: content-box;
105
+ content: '';
106
+ height: var(--inner-size);
107
+ left: 50%;
108
+ position: absolute;
109
+ top: 50%;
110
+ transform: translate(-50%, -50%);
111
+ visibility: hidden;
112
+ width: var(--inner-size);
113
+ }
114
+
115
+ input:where([type='checkbox']:checked, [type='radio']:checked)::before,
116
+ input:where([type='checkbox']:checked, [type='radio']:checked)::after {
117
+ visibility: visible;
118
+ }
119
+
120
+ .bs-boolean:where([data-size='sm']) input::before {
121
+ --filled-size: var(--bs-text-xs);
122
+ }
123
+
124
+ .bs-boolean:where([data-size='sm']) input[type='checkbox']::after {
125
+ height: 0.5625rem;
126
+ width: 0.3125rem;
127
+ }
128
+
129
+ .bs-boolean:where([data-size='sm']) input[type='radio']::after {
130
+ --inner-size: 0.25rem;
131
+ }
132
+
133
+
134
+ /* Disabled State */
135
+
136
+ input:where([type='checkbox'], [type='radio']):disabled {
137
+ --box-shadow: var(--bs-gray-400);
138
+ background-color: transparent;
139
+ }
140
+
141
+ input:where([type='checkbox']):checked:disabled::before {
142
+ --check-fill-color: var(--bs-gray-400);
143
+ }
144
+
145
+ input:where([type='radio']):checked:disabled::before {
146
+ --radio-fill-color: var(--bs-gray-400);
147
+ }
148
+
149
+
150
+ /* Error state */
151
+
152
+ input:where([type^='checkbox'], [type^='radio'])[data-error] {
153
+ --box-shadow: var(--bs-red-400);
154
+ }
@@ -0,0 +1,16 @@
1
+ .bs-character-count {
2
+ color: var(--bs-ink-base);
3
+ font-size: var(--bs-text-xs);
4
+ font-weight: 400;
5
+ text-align: right;
6
+ }
7
+
8
+ :where([disabled], [data-disabled]) + .bs-character-count,
9
+ :where([disabled], [data-disabled]) .bs-character-count,
10
+ .bs-character-count:where([data-disabled]) {
11
+ color: var(--bs-gray-400);
12
+ }
13
+
14
+ .bs-character-count:where([data-error]) {
15
+ color: var(--bs-red-400);
16
+ }
@@ -0,0 +1,114 @@
1
+ :where([data-required]) {
2
+ color: var(--bs-red-400);
3
+ }
4
+
5
+ :where([data-disabled], [data-disabled] [data-required]) {
6
+ color: var(--bs-gray-400);
7
+ }
8
+
9
+ :where(label + input, label > input):not([type^='checkbox'], [type^='radio']),
10
+ :where(label + textarea, label > textarea),
11
+ :where(label + select, label > select) {
12
+ margin-top: 0.25rem;
13
+ }
14
+
15
+ input:not([type^='checkbox'], [type^='radio'], [type^='file'], [type^='range']),
16
+ textarea, select {
17
+ appearance: none;
18
+ background-color: var(--input-bg, var(--bs-bg-base));
19
+ border: 1px solid var(--input-border, var(--bs-violet-300));
20
+ border-radius: 0.25rem;
21
+ color: var(--bs-ink-base);
22
+ font-size: var(--bs-text-base);
23
+ font-weight: 400;
24
+ line-height: var(--bs-leading-base);
25
+ min-height: 40px;
26
+ padding: 0.5rem 0.75rem;
27
+ width: 100%;
28
+ }
29
+
30
+ /* Generally applicable (all input types) */
31
+ :is(input, textarea, select)::placeholder {
32
+ color: var(--bs-violet-200);
33
+ opacity: 1;
34
+ }
35
+
36
+ :is(input, textarea, select):focus {
37
+ box-shadow: 0 0 0 2px var(--offset-color, var(--bs-bg-base)),
38
+ 0 0 0 4px var(--outline-color, var(--bs-blue-400));
39
+ outline: 2px solid transparent;
40
+ }
41
+ :where(.box) :is(input, textarea, select):focus {
42
+ --offset-color: var(--bs-bg-subtle);
43
+ }
44
+ :where(.box[data-invert]) :is(input, textarea, select):focus {
45
+ --offset-color: var(--bs-bg-invert);
46
+ }
47
+
48
+ :is(input, textarea, select):where([required]):focus,
49
+ :is(input, textarea, select):where([data-error]) {
50
+ --outline-color: var(--bs-red-200);
51
+ }
52
+
53
+ :is(input, textarea, select):disabled {
54
+ background-color: var(--bs-gray-200);
55
+ border-color: var(--bs-gray-400);
56
+ color: var(--bs-gray-400);
57
+ }
58
+
59
+ /*
60
+ Removes the built-in 'margin' on bottom of textarea
61
+ see https://bugs.chromium.org/p/chromium/issues/detail?id=89530
62
+ :has not fully supported yet but will work for most
63
+ */
64
+ :has(> textarea:only-child) {
65
+ display: block;
66
+ line-height: 0;
67
+ }
68
+
69
+ /* chrome user agent styling was applying opacity: 0.7 */
70
+ :where(select:disabled) {
71
+ opacity: 1;
72
+ }
73
+
74
+ :is(input, textarea, select):disabled::placeholder,
75
+ :is(input, textarea, select)[disabled]::placeholder {
76
+ color: var(--bs-gray-400);
77
+ opacity: 1;
78
+ }
79
+
80
+ /* Select */
81
+
82
+ select {
83
+ /* URL Encoded SVG dropdown caret so there is something there */
84
+ 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");
85
+ background-position: right 0.75rem center;
86
+ background-repeat: no-repeat;
87
+ background-size: 1em 1em;
88
+ }
89
+ .dark select {
90
+ /* URL Encoded SVG dropdown caret so there is something there */
91
+ 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");
92
+ }
93
+
94
+ .dark select:disabled {
95
+ /* URL Encoded SVG dropdown caret so there is something there */
96
+ 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");
97
+ }
98
+
99
+ /* Errors and Messages */
100
+ :is(input, select, textarea):where([data-error]) {
101
+ --input-border: var(--bs-red-400);
102
+ }
103
+
104
+ /* Fieldset */
105
+ :where(fieldset) {
106
+ border: none;
107
+ margin-left: 0;
108
+ margin-right: 0;
109
+ padding: 0;
110
+ }
111
+ :where(fieldset legend) {
112
+ margin-bottom: 0.25rem;
113
+ padding: 0;
114
+ }
@@ -0,0 +1,15 @@
1
+ .bs-field-details {
2
+ display: flex;
3
+ justify-content: space-between;
4
+ align-items: center;
5
+ padding: 0 0.75rem;
6
+ margin-top: 0.5rem;
7
+ }
8
+
9
+ :where(textarea, bs-textarea) + .bs-field-details {
10
+ margin-top: 0.25rem;
11
+ }
12
+
13
+ .bs-field-details :where(.bs-character-count:first-child) {
14
+ margin-left: auto;
15
+ }
@@ -0,0 +1,10 @@
1
+ .bs-hint {
2
+ color: var(--bs-ink-light);
3
+ font-size: var(--bs-text-xs);
4
+ padding: 0;
5
+ margin: 0;
6
+ list-style: none;
7
+ }
8
+ .bs-hint:where([data-error]) {
9
+ color: var(--bs-red-400);
10
+ }
@@ -0,0 +1,18 @@
1
+ :where(label, legend) {
2
+ --label-color: var(--bs-ink-base);
3
+
4
+ color: var(--label-color);
5
+ display: inline-block;
6
+ font-size: var(--bs-text-sm);
7
+ font-weight: 600;
8
+ line-height: var(--bs-leading-base);
9
+ width: 100%;
10
+ }
11
+
12
+ :where([data-required]) {
13
+ color: var(--bs-red-400);
14
+ }
15
+
16
+ :where(label[data-disabled], [data-disabled] [data-required], [data-disabled] label) {
17
+ --label-color: var(--bs-ink-light);
18
+ }
@@ -0,0 +1,133 @@
1
+ .bs-switch {
2
+ --box-shadow: var(--bs-ink-base);
3
+ --ball-background: var(--bs-white);
4
+ --ball-diameter: 1rem;
5
+ --inner-text-width: 1rem;
6
+ --inner-text-padding: 0.5rem;
7
+ --offset: 0.25rem;
8
+ --switch-background: var(--bs-gray-400);
9
+
10
+ border: none;
11
+ border-radius: 100vw;
12
+ cursor: pointer;
13
+ height: calc(var(--ball-diameter) + var(--offset) * 2);
14
+ position: relative;
15
+ }
16
+
17
+ .bs-switch:where([data-size="sm"]) {
18
+ --ball-diameter: var(--bs-text-xs);
19
+ --inner-text-width: .75rem;
20
+ --inner-text-padding: 0.375rem;
21
+ }
22
+
23
+ :where(.dark) .bs-switch:where(:not([data-disabled])) {
24
+ --switch-background: var(--bs-blue-400);
25
+ }
26
+
27
+ .bs-switch input,
28
+ .bs-switch:where([data-size="sm"]) input {
29
+ cursor: pointer;
30
+ height: 100%;
31
+ opacity: 0;
32
+ position: absolute;
33
+ width: 100%;
34
+ }
35
+
36
+ .bs-switch span {
37
+ align-items: center;
38
+ background-color: var(--switch-background);
39
+ border-radius: 100vw;
40
+ display: inline-flex;
41
+ height: 100%;
42
+ padding: 0 var(--inner-text-padding);
43
+ pointer-events: none;
44
+ position: relative;
45
+ transition: 250ms;
46
+ width: calc(var(--ball-diameter) * 2 + var(--offset) * 2);
47
+ height: calc(var(--ball-diameter) + var(--offset) * 2);
48
+ }
49
+
50
+ /* Toggle "ball" */
51
+ .bs-switch span::before {
52
+ background-color: var(--ball-background);
53
+ border-radius: 50%;
54
+ box-sizing: border-box;
55
+ content: '';
56
+ height: var(--ball-diameter);
57
+ left: var(--offset);
58
+ position: absolute;
59
+ top: 50%;
60
+ transform: translate(0, -50%);
61
+ transition: inherit;
62
+ width: var(--ball-diameter);
63
+ z-index: 2;
64
+ }
65
+
66
+ .bs-switch input:where(:checked) ~ span::before,
67
+ .bs-switch:where([aria-pressed]):where(:not([aria-pressed="false"])) span::before {
68
+ transform: translate(var(--ball-diameter), -50%);
69
+ }
70
+
71
+
72
+ .bs-switch input:where(:checked) ~ span:where([data-inner-on-label][data-inner-off-label])::before,
73
+ .bs-switch:where([aria-pressed]):where(:not([aria-pressed="false"])) span:where([data-inner-on-label][data-inner-off-label])::before {
74
+ transform: translate(calc(var(--ball-diameter) + var(--inner-text-width)), -50%);
75
+ }
76
+
77
+ /* Inner "on/off" text */
78
+
79
+ .bs-switch span:where([data-inner-on-label][data-inner-off-label]) {
80
+ color: white;
81
+ width: calc(var(--ball-diameter) * 2 + var(--offset) * 2 + var(--inner-text-width));
82
+ }
83
+
84
+ .bs-switch span::after {
85
+ align-items: center;
86
+ color: var(--ball-background);
87
+ display: flex;
88
+ height: 100%;
89
+ justify-content: flex-start;
90
+ left: 0;
91
+ padding: var(--inner-text-padding);
92
+ position: absolute;
93
+ text-transform: capitalize;
94
+ top: 0;
95
+ width: 100%;
96
+ }
97
+
98
+ .bs-switch input:where(:not(:checked)) ~ span:where([data-inner-on-label][data-inner-off-label])::after,
99
+ .bs-switch:where([aria-pressed="false"]) span:where([data-inner-on-label][data-inner-off-label])::after {
100
+ content: attr(data-inner-off-label);
101
+ justify-content: flex-end;
102
+ }
103
+
104
+ .bs-switch input:where(:checked) ~ span:where([data-inner-on-label][data-inner-off-label])::after,
105
+ .bs-switch:where([aria-pressed]):where(:not([aria-pressed="false"])) span:where([data-inner-on-label][data-inner-off-label])::after {
106
+ content: attr(data-inner-on-label);
107
+ justify-content: flex-start;
108
+ }
109
+
110
+ /* Focus state */
111
+
112
+ .bs-switch:where(:focus-within) span {
113
+ box-shadow: 0 0 0 2px var(--offset-color, var(--bs-bg-base)),
114
+ 0 0 0 4px var(--outline-color, var(--bs-blue-400));
115
+ outline: 2px solid transparent;
116
+ }
117
+ :where(.box) .bs-switch:where(:focus-within) span {
118
+ --offset-color: var(--bs-bg-subtle);
119
+ }
120
+ :where(.box[data-invert]) .bs-switch:where(:focus-within) span {
121
+ --offset-color: var(--bs-bg-invert);
122
+ }
123
+
124
+ /* Disabled state */
125
+
126
+ .bs-switch:where([data-disabled]) {
127
+ --ball-background: var(--bs-gray-400);
128
+ --switch-background: var(--bs-gray-200);
129
+ }
130
+
131
+ .bs-switch input:where(:disabled) {
132
+ cursor: default;
133
+ }