@wwtdev/bsds-css 2.1.3 → 2.1.4

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.
@@ -141,6 +141,7 @@
141
141
  }
142
142
  .bs-button:where([data-text]:not([data-text="false"])):active {
143
143
  box-shadow: none;
144
+ transform: none;
144
145
  }
145
146
 
146
147
  /* ------------ Button Sizes, Media-based Text Sizing -------------- */
@@ -1,16 +1,14 @@
1
1
  @mixin dropdown-options() {
2
2
  /* Option list */
3
3
  .bs-dropdown-options {
4
+ display: flex;
5
+ flex-direction: column;
6
+ gap: 0.5rem;
4
7
  list-style: none;
5
- margin-bottom: 0.25rem;
6
- margin-top: 0.25rem;
8
+ margin-block: 0.25rem;
7
9
  max-height: var(--options-height-max, 20rem);/* constrain scrollable to options section */
8
10
  overflow-y: auto;
9
- padding: 0;
10
- }
11
-
12
- .bs-dropdown-options :where(li:first-child) {
13
- margin-top: 0.5rem;
11
+ padding-block: 0.5rem;
14
12
  }
15
13
 
16
14
  /* Option list item */
@@ -25,11 +23,8 @@
25
23
  column-gap: 0.5rem;
26
24
  cursor: pointer;
27
25
  display: grid;
28
- margin-bottom: 0.5rem;
29
- padding-bottom: 0.25rem;
30
- padding-left: 1.25rem;
31
- padding-right: 1.375rem;
32
- padding-top: 0.25rem;
26
+ padding-block: 0.25rem;
27
+ padding-inline: 1.25rem;
33
28
  row-gap: 0.125rem;
34
29
  word-break: break-word;
35
30
  word-wrap: break-word;
@@ -41,7 +36,7 @@
41
36
  }
42
37
 
43
38
  /* Variant: description */
44
- .bs-dropdown-options :where(li:not([data-variant~="2-col"])[data-variant~="description"] :nth-child(2)) {
39
+ .bs-dropdown-options :where(li:not([data-variant~="2-col"])[data-variant~="description"] > :nth-child(2)) {
45
40
  color: var(--bs-ink-light);
46
41
  font-size: var(--bs-text-xs);
47
42
  min-height: 1.125rem;
@@ -49,7 +44,7 @@
49
44
  }
50
45
 
51
46
  /* Variant: 2-col description */
52
- .bs-dropdown-options :where(li[data-variant~="2-col"][data-variant~="description"] :nth-child(3)) {
47
+ .bs-dropdown-options :where(li[data-variant~="2-col"][data-variant~="description"] > :nth-child(3)) {
53
48
  color: var(--bs-ink-light);
54
49
  font-size: var(--bs-text-xs);
55
50
  grid-column-start: 2;
@@ -58,7 +53,7 @@
58
53
  }
59
54
 
60
55
  /* Hover or data-selected */
61
- .bs-dropdown-options :where(li:hover),
56
+ .bs-dropdown-options :where(li:not([role="separator"]):hover),
62
57
  .bs-dropdown-options :where(li[data-selected]) {
63
58
  background-color: var(--bs-bg-medium);
64
59
  border-left: 4px solid var(--bs-blue-base);
@@ -77,18 +72,18 @@
77
72
  }
78
73
 
79
74
  /* Hover or data-selected for 2-col/description variants */
80
- .bs-dropdown-options :where(li:not([data-variant~="2-col"])[data-variant~="description"]:hover :nth-child(2)),
81
- .bs-dropdown-options :where(li[data-variant~="2-col"][data-variant~="description"]:hover :nth-child(3)),
82
- .bs-dropdown-options :where(li:not([data-variant~="2-col"])[data-variant~="description"][data-selected] :nth-child(2)),
83
- .bs-dropdown-options :where(li[data-variant~="2-col"][data-variant~="description"][data-selected] :nth-child(3)) {
75
+ .bs-dropdown-options :where(li:not([data-variant~="2-col"])[data-variant~="description"]:hover > :nth-child(2)),
76
+ .bs-dropdown-options :where(li[data-variant~="2-col"][data-variant~="description"]:hover > :nth-child(3)),
77
+ .bs-dropdown-options :where(li:not([data-variant~="2-col"])[data-variant~="description"][data-selected] > :nth-child(2)),
78
+ .bs-dropdown-options :where(li[data-variant~="2-col"][data-variant~="description"][data-selected] > :nth-child(3)) {
84
79
  color: var(--bs-blue-base);
85
80
  }
86
81
 
87
82
  /* Hover or data-selected for negative + 2-col/description variants */
88
- .bs-dropdown-options :where(li[data-variant~="negative"]:not([data-variant~="2-col"])[data-variant~="description"]:hover :nth-child(2)),
89
- .bs-dropdown-options :where(li[data-variant~="negative"][data-variant~="2-col"][data-variant~="description"]:hover :nth-child(3)),
90
- .bs-dropdown-options :where(li[data-variant~="negative"]:not([data-variant~="2-col"])[data-variant~="description"][data-selected] :nth-child(2)),
91
- .bs-dropdown-options :where(li[data-variant~="negative"][data-variant~="2-col"][data-variant~="description"][data-selected] :nth-child(3)) {
83
+ .bs-dropdown-options :where(li[data-variant~="negative"]:not([data-variant~="2-col"])[data-variant~="description"]:hover > :nth-child(2)),
84
+ .bs-dropdown-options :where(li[data-variant~="negative"][data-variant~="2-col"][data-variant~="description"]:hover > :nth-child(3)),
85
+ .bs-dropdown-options :where(li[data-variant~="negative"]:not([data-variant~="2-col"])[data-variant~="description"][data-selected] > :nth-child(2)),
86
+ .bs-dropdown-options :where(li[data-variant~="negative"][data-variant~="2-col"][data-variant~="description"][data-selected] > :nth-child(3)) {
92
87
  color: var(--bs-red-500);
93
88
  }
94
89
 
@@ -121,11 +116,37 @@
121
116
  --focus-border-color: var(--bs-red-200);
122
117
  }
123
118
 
119
+ /* Multi-select divider */
120
+ .bs-dropdown-options :where(li[role="separator"]) {
121
+ cursor: default;
122
+ padding-block: 0.125rem;
123
+ padding-right: 1.375rem;
124
+ }
125
+
126
+ .bs-dropdown-options :where(hr) {
127
+ background-color: var(--bs-navy-light);
128
+ height: .0625rem;
129
+ margin-block: 0;
130
+ margin-inline: 0;
131
+ }
132
+
124
133
  @media (min-width: 752px) {
125
134
  .bs-dropdown-options :where(li) {
126
135
  padding-left: 0.5rem;
127
136
  padding-right: 0.75rem;
128
137
  }
138
+
139
+ .bs-dropdown-options :where(li[role="separator"]) {
140
+ padding-right: 0.625rem;
141
+ }
142
+
143
+ .bs-dropdown-options :where(li:focus-visible) {
144
+ padding-left: 0.625rem;
145
+ }
146
+
147
+ .bs-dropdown-options :where(li[data-selected]:focus-visible) {
148
+ padding-left: 0.5rem;
149
+ }
129
150
  }
130
151
 
131
152
  }
@@ -197,9 +197,9 @@ and issues with box-sizing
197
197
  /* -------- Disabled styles -------- */
198
198
  .bs-input-addon:where([data-disabled]:not([data-disabled="false"])),
199
199
  .bs-input-addon:where([data-disabled]:not([data-disabled="false"])) .bs-button {
200
- --input-bg: var(--bs-gray-200);
201
- --input-border: var(--bs-gray-400);
202
- color: var(--bs-gray-400);
200
+ --input-bg: var(--bs-bg-disabled);
201
+ --input-border: var(--bs-ink-disabled);
202
+ color: var(--bs-ink-disabled);
203
203
  }
204
204
  .bs-input-addon:where([data-disabled]:not([data-disabled="false"])) * {
205
205
  pointer-events: none;
@@ -8,22 +8,24 @@ label:where(.bs-label) {
8
8
  .bs-label,
9
9
  :where(label, legend) {
10
10
  --label-color: var(--bs-ink-base);
11
-
12
11
  color: var(--label-color);
13
12
  font-size: var(--bs-text-sm);
14
13
  font-weight: 600;
15
14
  line-height: var(--bs-leading-base);
16
15
  }
17
16
 
18
- :where([data-required]:not([data-required="false"])),
17
+ /* Required asterisk */
18
+ :where(label, legend) :where([data-required]:not([data-required="false"])),
19
19
  .bs-label :where([data-required="true"]) {
20
- --label-color: var(--bs-ink-red);
20
+ color: var(--label-asterisk-color, var(--bs-ink-red));
21
21
  }
22
22
 
23
+ /* Disabled state */
23
24
  :where(label[data-disabled]:not([data-disabled="false"])),
24
25
  :where(label[data-disabled]:not([data-disabled="false"])) *,
25
26
  .bs-label:where([data-disabled="true"]),
26
27
  .bs-label:where([data-disabled="true"]) * {
28
+ --label-asterisk-color: transparent;
27
29
  --label-color: var(--bs-ink-disabled);
28
30
  }
29
31
 
@@ -55,13 +55,13 @@
55
55
  width: var(--switch-width);
56
56
  }
57
57
 
58
- .bs-switch input:where(:checked) ~ span,
59
- .bs-switch:where([aria-pressed]):where(:not([aria-pressed="false"])) span {
58
+ .bs-switch :where(input:checked) ~ :where(span),
59
+ .bs-switch:where([aria-pressed]:not([aria-pressed="false"])) :where(span) {
60
60
  --switch-background: var(--bs-blue-base);
61
61
  }
62
62
 
63
63
  /* Toggle "ball" */
64
- .bs-switch span::before {
64
+ .bs-switch :where(span)::before {
65
65
  background-color: var(--ball-background);
66
66
  border-radius: 50%;
67
67
  box-sizing: border-box;
@@ -76,34 +76,25 @@
76
76
  z-index: 2;
77
77
  }
78
78
 
79
- .bs-switch input:where(:checked) ~ span::before,
80
- .bs-switch:where([aria-pressed]):where(:not([aria-pressed="false"])) span::before {
79
+ .bs-switch :where(input:checked) ~ :where(span)::before,
80
+ .bs-switch:where([aria-pressed]:not([aria-pressed="false"])) :where(span)::before {
81
81
  transform: translate(calc(var(--switch-width) - var(--offset-double) - var(--ball-diameter)), -50%);
82
82
  }
83
83
 
84
- .bs-switch input:where(:checked) ~ span:where([data-inner-on-label][data-inner-off-label])::before,
85
- .bs-switch:where([aria-pressed]):where(:not([aria-pressed="false"])) span:where([data-inner-on-label][data-inner-off-label])::before {
84
+ .bs-switch :where(input:checked) ~ :where(span[data-inner-on-label][data-inner-off-label])::before,
85
+ .bs-switch:where([aria-pressed]:not([aria-pressed="false"])) :where(span[data-inner-on-label][data-inner-off-label])::before {
86
86
  transform: translate(calc(var(--switch-width) - var(--offset-double) - var(--ball-diameter)), -50%);
87
87
  }
88
88
 
89
89
 
90
90
  /* Inner "on/off" text */
91
-
92
- .bs-switch span:where([data-inner-on-label][data-inner-off-label]) {
93
- color: white;
94
- --switch-width: 3.5rem;
95
- }
96
-
97
- .bs-switch:where([data-size="sm"]) span:where([data-inner-on-label][data-inner-off-label]) {
98
- --switch-width: 2.625rem;
99
- }
100
-
101
- .bs-switch span::after {
91
+ .bs-switch :where(span)::after {
102
92
  align-items: center;
103
93
  color: var(--ball-background);
94
+ content: var(--inner-label-text);
104
95
  display: flex;
105
96
  height: 100%;
106
- justify-content: flex-start;
97
+ justify-content: var(--inner-label-position, flex-start);
107
98
  left: 0;
108
99
  line-height: var(--inner-text-line-height);
109
100
  padding: var(--inner-text-padding);
@@ -113,35 +104,45 @@
113
104
  width: 100%;
114
105
  }
115
106
 
116
- .bs-switch input:where(:not(:checked)) ~ span:where([data-inner-on-label][data-inner-off-label])::after,
117
- .bs-switch:where([aria-pressed="false"]) span:where([data-inner-on-label][data-inner-off-label])::after {
118
- content: attr(data-inner-off-label);
119
- justify-content: flex-end;
107
+ .bs-switch :where([data-inner-on-label][data-inner-off-label]) {
108
+ --switch-width: 3.5rem;
109
+ }
110
+
111
+ .bs-switch:where([data-size="sm"]) :where([data-inner-on-label][data-inner-off-label]) {
112
+ --switch-width: 2.625rem;
120
113
  }
121
114
 
122
- .bs-switch input:where(:checked) ~ span:where([data-inner-on-label][data-inner-off-label])::after,
123
- .bs-switch:where([aria-pressed]):where(:not([aria-pressed="false"])) span:where([data-inner-on-label][data-inner-off-label])::after {
124
- content: attr(data-inner-on-label);
125
- justify-content: flex-start;
115
+ .bs-switch :where(input:not(:checked)) ~ :where([data-inner-on-label][data-inner-off-label])::after,
116
+ .bs-switch:where([aria-pressed="false"]) :where([data-inner-on-label][data-inner-off-label])::after {
117
+ --inner-label-position: flex-end;
118
+ --inner-label-text: attr(data-inner-off-label);
119
+ }
120
+
121
+ .bs-switch :where(input:checked) ~ :where([data-inner-on-label][data-inner-off-label])::after,
122
+ .bs-switch:where([aria-pressed]:not([aria-pressed="false"])) :where([data-inner-on-label][data-inner-off-label])::after {
123
+ --inner-label-text: attr(data-inner-on-label);
126
124
  }
127
125
 
128
126
  /* Focus state */
129
127
 
130
- .bs-switch :where(input:focus-visible) + span {
128
+ .bs-switch :where(input:focus-visible) + :where(span),
129
+ .bs-switch:where(:focus-visible) :where(button span) {
131
130
  box-shadow: 0 0 0 2px var(--offset-color, var(--bs-bg-base)),
132
131
  0 0 0 4px var(--outline-color, var(--bs-blue-base));
133
132
  outline: 2px solid transparent;
134
133
  }
135
- :where(.box) .bs-switch :where(input:focus-visible) + span {
134
+ :where(.box) .bs-switch :where(input:focus-visible) + :where(span),
135
+ :where(.box) .bs-switch:where(:focus-visible) :where(button span) {
136
136
  --offset-color: var(--bs-bg-medium);
137
137
  }
138
- :where(.box[data-invert]) .bs-switch :where(input:focus-visible) + span {
138
+ :where(.box[data-invert]) .bs-switch :where(input:focus-visible) + :where(span),
139
+ :where(.box[data-invert]) .bs-switch:where(:focus-visible) :where(button span) {
139
140
  --offset-color: var(--bs-bg-invert-base);
140
141
  }
141
142
 
142
143
  /* Disabled state */
143
-
144
- .bs-switch:where([data-disabled]:not([data-disabled="false"])) {
144
+ .bs-switch:where([data-disabled]:not([data-disabled="false"]), :disabled, [disabled]),
145
+ .bs-switch:where([data-disabled]:not([data-disabled="false"]), :disabled, [disabled]) :is(input ~ span, button span) {
145
146
  --ball-background: var(--bs-ink-disabled);
146
147
  --switch-background: var(--bs-bg-disabled);
147
148
  }
@@ -116,8 +116,7 @@ see https://bugs.chromium.org/p/chromium/issues/detail?id=89530
116
116
  :is(input, textarea, select)[disabled]::placeholder,
117
117
  :is(.bs-input, .bs-textarea, .bs-select):disabled::placeholder,
118
118
  :is(.bs-input, .bs-textarea, .bs-select)[disabled]::placeholder {
119
- color: var(--bs-ink-disabled);
120
- opacity: 1;
119
+ opacity: 0;
121
120
  }
122
121
 
123
122
  /* Select */
@@ -22,7 +22,18 @@
22
22
  opacity: 1;
23
23
  }
24
24
 
25
- .bs-modal :where(.close-button-container) {
25
+ .bs-modal :where(.modal-header) {
26
+ align-items: center;
27
+ display: flex;
28
+ justify-content: space-between;
29
+ margin-bottom: 1.5rem;
30
+ }
31
+
32
+ .bs-modal :where(.modal-title) {
33
+ flex-grow: 1;
34
+ }
35
+
36
+ .bs-modal :where(.only-close-button-modal-header) {
26
37
  display: flex;
27
38
  justify-content: flex-end;
28
39
  margin-bottom: 1.5rem;
@@ -140,6 +140,7 @@
140
140
  }
141
141
  .bs-button:where([data-text]:not([data-text="false"])):active {
142
142
  box-shadow: none;
143
+ transform: none;
143
144
  }
144
145
 
145
146
  /* ------------ Button Sizes, Media-based Text Sizing -------------- */
@@ -1,15 +1,13 @@
1
1
  /* Option list */
2
2
  .bs-dropdown-options {
3
+ display: flex;
4
+ flex-direction: column;
5
+ gap: 0.5rem;
3
6
  list-style: none;
4
- margin-bottom: 0.25rem;
5
- margin-top: 0.25rem;
7
+ margin-block: 0.25rem;
6
8
  max-height: var(--options-height-max, 20rem);/* constrain scrollable to options section */
7
9
  overflow-y: auto;
8
- padding: 0;
9
- }
10
-
11
- .bs-dropdown-options :where(li:first-child) {
12
- margin-top: 0.5rem;
10
+ padding-block: 0.5rem;
13
11
  }
14
12
 
15
13
  /* Option list item */
@@ -24,11 +22,8 @@
24
22
  column-gap: 0.5rem;
25
23
  cursor: pointer;
26
24
  display: grid;
27
- margin-bottom: 0.5rem;
28
- padding-bottom: 0.25rem;
29
- padding-left: 1.25rem;
30
- padding-right: 1.375rem;
31
- padding-top: 0.25rem;
25
+ padding-block: 0.25rem;
26
+ padding-inline: 1.25rem;
32
27
  row-gap: 0.125rem;
33
28
  word-break: break-word;
34
29
  word-wrap: break-word;
@@ -40,7 +35,7 @@
40
35
  }
41
36
 
42
37
  /* Variant: description */
43
- .bs-dropdown-options :where(li:not([data-variant~="2-col"])[data-variant~="description"] :nth-child(2)) {
38
+ .bs-dropdown-options :where(li:not([data-variant~="2-col"])[data-variant~="description"] > :nth-child(2)) {
44
39
  color: var(--bs-ink-light);
45
40
  font-size: var(--bs-text-xs);
46
41
  min-height: 1.125rem;
@@ -48,7 +43,7 @@
48
43
  }
49
44
 
50
45
  /* Variant: 2-col description */
51
- .bs-dropdown-options :where(li[data-variant~="2-col"][data-variant~="description"] :nth-child(3)) {
46
+ .bs-dropdown-options :where(li[data-variant~="2-col"][data-variant~="description"] > :nth-child(3)) {
52
47
  color: var(--bs-ink-light);
53
48
  font-size: var(--bs-text-xs);
54
49
  grid-column-start: 2;
@@ -57,7 +52,7 @@
57
52
  }
58
53
 
59
54
  /* Hover or data-selected */
60
- .bs-dropdown-options :where(li:hover),
55
+ .bs-dropdown-options :where(li:not([role="separator"]):hover),
61
56
  .bs-dropdown-options :where(li[data-selected]) {
62
57
  background-color: var(--bs-bg-medium);
63
58
  border-left: 4px solid var(--bs-blue-base);
@@ -76,18 +71,18 @@
76
71
  }
77
72
 
78
73
  /* Hover or data-selected for 2-col/description variants */
79
- .bs-dropdown-options :where(li:not([data-variant~="2-col"])[data-variant~="description"]:hover :nth-child(2)),
80
- .bs-dropdown-options :where(li[data-variant~="2-col"][data-variant~="description"]:hover :nth-child(3)),
81
- .bs-dropdown-options :where(li:not([data-variant~="2-col"])[data-variant~="description"][data-selected] :nth-child(2)),
82
- .bs-dropdown-options :where(li[data-variant~="2-col"][data-variant~="description"][data-selected] :nth-child(3)) {
74
+ .bs-dropdown-options :where(li:not([data-variant~="2-col"])[data-variant~="description"]:hover > :nth-child(2)),
75
+ .bs-dropdown-options :where(li[data-variant~="2-col"][data-variant~="description"]:hover > :nth-child(3)),
76
+ .bs-dropdown-options :where(li:not([data-variant~="2-col"])[data-variant~="description"][data-selected] > :nth-child(2)),
77
+ .bs-dropdown-options :where(li[data-variant~="2-col"][data-variant~="description"][data-selected] > :nth-child(3)) {
83
78
  color: var(--bs-blue-base);
84
79
  }
85
80
 
86
81
  /* Hover or data-selected for negative + 2-col/description variants */
87
- .bs-dropdown-options :where(li[data-variant~="negative"]:not([data-variant~="2-col"])[data-variant~="description"]:hover :nth-child(2)),
88
- .bs-dropdown-options :where(li[data-variant~="negative"][data-variant~="2-col"][data-variant~="description"]:hover :nth-child(3)),
89
- .bs-dropdown-options :where(li[data-variant~="negative"]:not([data-variant~="2-col"])[data-variant~="description"][data-selected] :nth-child(2)),
90
- .bs-dropdown-options :where(li[data-variant~="negative"][data-variant~="2-col"][data-variant~="description"][data-selected] :nth-child(3)) {
82
+ .bs-dropdown-options :where(li[data-variant~="negative"]:not([data-variant~="2-col"])[data-variant~="description"]:hover > :nth-child(2)),
83
+ .bs-dropdown-options :where(li[data-variant~="negative"][data-variant~="2-col"][data-variant~="description"]:hover > :nth-child(3)),
84
+ .bs-dropdown-options :where(li[data-variant~="negative"]:not([data-variant~="2-col"])[data-variant~="description"][data-selected] > :nth-child(2)),
85
+ .bs-dropdown-options :where(li[data-variant~="negative"][data-variant~="2-col"][data-variant~="description"][data-selected] > :nth-child(3)) {
91
86
  color: var(--bs-red-500);
92
87
  }
93
88
 
@@ -120,9 +115,35 @@
120
115
  --focus-border-color: var(--bs-red-200);
121
116
  }
122
117
 
118
+ /* Multi-select divider */
119
+ .bs-dropdown-options :where(li[role="separator"]) {
120
+ cursor: default;
121
+ padding-block: 0.125rem;
122
+ padding-right: 1.375rem;
123
+ }
124
+
125
+ .bs-dropdown-options :where(hr) {
126
+ background-color: var(--bs-navy-light);
127
+ height: .0625rem;
128
+ margin-block: 0;
129
+ margin-inline: 0;
130
+ }
131
+
123
132
  @media (min-width: 752px) {
124
133
  .bs-dropdown-options :where(li) {
125
134
  padding-left: 0.5rem;
126
135
  padding-right: 0.75rem;
127
136
  }
137
+
138
+ .bs-dropdown-options :where(li[role="separator"]) {
139
+ padding-right: 0.625rem;
140
+ }
141
+
142
+ .bs-dropdown-options :where(li:focus-visible) {
143
+ padding-left: 0.625rem;
144
+ }
145
+
146
+ .bs-dropdown-options :where(li[data-selected]:focus-visible) {
147
+ padding-left: 0.5rem;
148
+ }
128
149
  }
@@ -196,9 +196,9 @@ and issues with box-sizing
196
196
  /* -------- Disabled styles -------- */
197
197
  .bs-input-addon:where([data-disabled]:not([data-disabled="false"])),
198
198
  .bs-input-addon:where([data-disabled]:not([data-disabled="false"])) .bs-button {
199
- --input-bg: var(--bs-gray-200);
200
- --input-border: var(--bs-gray-400);
201
- color: var(--bs-gray-400);
199
+ --input-bg: var(--bs-bg-disabled);
200
+ --input-border: var(--bs-ink-disabled);
201
+ color: var(--bs-ink-disabled);
202
202
  }
203
203
  .bs-input-addon:where([data-disabled]:not([data-disabled="false"])) * {
204
204
  pointer-events: none;
@@ -7,21 +7,23 @@ label:where(.bs-label) {
7
7
  .bs-label,
8
8
  :where(label, legend) {
9
9
  --label-color: var(--bs-ink-base);
10
-
11
10
  color: var(--label-color);
12
11
  font-size: var(--bs-text-sm);
13
12
  font-weight: 600;
14
13
  line-height: var(--bs-leading-base);
15
14
  }
16
15
 
17
- :where([data-required]:not([data-required="false"])),
16
+ /* Required asterisk */
17
+ :where(label, legend) :where([data-required]:not([data-required="false"])),
18
18
  .bs-label :where([data-required="true"]) {
19
- --label-color: var(--bs-ink-red);
19
+ color: var(--label-asterisk-color, var(--bs-ink-red));
20
20
  }
21
21
 
22
+ /* Disabled state */
22
23
  :where(label[data-disabled]:not([data-disabled="false"])),
23
24
  :where(label[data-disabled]:not([data-disabled="false"])) *,
24
25
  .bs-label:where([data-disabled="true"]),
25
26
  .bs-label:where([data-disabled="true"]) * {
27
+ --label-asterisk-color: transparent;
26
28
  --label-color: var(--bs-ink-disabled);
27
29
  }
@@ -54,13 +54,13 @@
54
54
  width: var(--switch-width);
55
55
  }
56
56
 
57
- .bs-switch input:where(:checked) ~ span,
58
- .bs-switch:where([aria-pressed]):where(:not([aria-pressed="false"])) span {
57
+ .bs-switch :where(input:checked) ~ :where(span),
58
+ .bs-switch:where([aria-pressed]:not([aria-pressed="false"])) :where(span) {
59
59
  --switch-background: var(--bs-blue-base);
60
60
  }
61
61
 
62
62
  /* Toggle "ball" */
63
- .bs-switch span::before {
63
+ .bs-switch :where(span)::before {
64
64
  background-color: var(--ball-background);
65
65
  border-radius: 50%;
66
66
  box-sizing: border-box;
@@ -75,34 +75,25 @@
75
75
  z-index: 2;
76
76
  }
77
77
 
78
- .bs-switch input:where(:checked) ~ span::before,
79
- .bs-switch:where([aria-pressed]):where(:not([aria-pressed="false"])) span::before {
78
+ .bs-switch :where(input:checked) ~ :where(span)::before,
79
+ .bs-switch:where([aria-pressed]:not([aria-pressed="false"])) :where(span)::before {
80
80
  transform: translate(calc(var(--switch-width) - var(--offset-double) - var(--ball-diameter)), -50%);
81
81
  }
82
82
 
83
- .bs-switch input:where(:checked) ~ span:where([data-inner-on-label][data-inner-off-label])::before,
84
- .bs-switch:where([aria-pressed]):where(:not([aria-pressed="false"])) span:where([data-inner-on-label][data-inner-off-label])::before {
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
85
  transform: translate(calc(var(--switch-width) - var(--offset-double) - var(--ball-diameter)), -50%);
86
86
  }
87
87
 
88
88
 
89
89
  /* Inner "on/off" text */
90
-
91
- .bs-switch span:where([data-inner-on-label][data-inner-off-label]) {
92
- color: white;
93
- --switch-width: 3.5rem;
94
- }
95
-
96
- .bs-switch:where([data-size="sm"]) span:where([data-inner-on-label][data-inner-off-label]) {
97
- --switch-width: 2.625rem;
98
- }
99
-
100
- .bs-switch span::after {
90
+ .bs-switch :where(span)::after {
101
91
  align-items: center;
102
92
  color: var(--ball-background);
93
+ content: var(--inner-label-text);
103
94
  display: flex;
104
95
  height: 100%;
105
- justify-content: flex-start;
96
+ justify-content: var(--inner-label-position, flex-start);
106
97
  left: 0;
107
98
  line-height: var(--inner-text-line-height);
108
99
  padding: var(--inner-text-padding);
@@ -112,35 +103,45 @@
112
103
  width: 100%;
113
104
  }
114
105
 
115
- .bs-switch input:where(:not(:checked)) ~ span:where([data-inner-on-label][data-inner-off-label])::after,
116
- .bs-switch:where([aria-pressed="false"]) span:where([data-inner-on-label][data-inner-off-label])::after {
117
- content: attr(data-inner-off-label);
118
- justify-content: flex-end;
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;
119
112
  }
120
113
 
121
- .bs-switch input:where(:checked) ~ span:where([data-inner-on-label][data-inner-off-label])::after,
122
- .bs-switch:where([aria-pressed]):where(:not([aria-pressed="false"])) span:where([data-inner-on-label][data-inner-off-label])::after {
123
- content: attr(data-inner-on-label);
124
- justify-content: flex-start;
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);
125
123
  }
126
124
 
127
125
  /* Focus state */
128
126
 
129
- .bs-switch :where(input:focus-visible) + span {
127
+ .bs-switch :where(input:focus-visible) + :where(span),
128
+ .bs-switch:where(:focus-visible) :where(button span) {
130
129
  box-shadow: 0 0 0 2px var(--offset-color, var(--bs-bg-base)),
131
130
  0 0 0 4px var(--outline-color, var(--bs-blue-base));
132
131
  outline: 2px solid transparent;
133
132
  }
134
- :where(.box) .bs-switch :where(input:focus-visible) + span {
133
+ :where(.box) .bs-switch :where(input:focus-visible) + :where(span),
134
+ :where(.box) .bs-switch:where(:focus-visible) :where(button span) {
135
135
  --offset-color: var(--bs-bg-medium);
136
136
  }
137
- :where(.box[data-invert]) .bs-switch :where(input:focus-visible) + span {
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) {
138
139
  --offset-color: var(--bs-bg-invert-base);
139
140
  }
140
141
 
141
142
  /* Disabled state */
142
-
143
- .bs-switch:where([data-disabled]:not([data-disabled="false"])) {
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) {
144
145
  --ball-background: var(--bs-ink-disabled);
145
146
  --switch-background: var(--bs-bg-disabled);
146
147
  }
@@ -115,8 +115,7 @@ see https://bugs.chromium.org/p/chromium/issues/detail?id=89530
115
115
  :is(input, textarea, select)[disabled]::placeholder,
116
116
  :is(.bs-input, .bs-textarea, .bs-select):disabled::placeholder,
117
117
  :is(.bs-input, .bs-textarea, .bs-select)[disabled]::placeholder {
118
- color: var(--bs-ink-disabled);
119
- opacity: 1;
118
+ opacity: 0;
120
119
  }
121
120
 
122
121
  /* Select */
@@ -21,7 +21,18 @@
21
21
  opacity: 1;
22
22
  }
23
23
 
24
- .bs-modal :where(.close-button-container) {
24
+ .bs-modal :where(.modal-header) {
25
+ align-items: center;
26
+ display: flex;
27
+ justify-content: space-between;
28
+ margin-bottom: 1.5rem;
29
+ }
30
+
31
+ .bs-modal :where(.modal-title) {
32
+ flex-grow: 1;
33
+ }
34
+
35
+ .bs-modal :where(.only-close-button-modal-header) {
25
36
  display: flex;
26
37
  justify-content: flex-end;
27
38
  margin-bottom: 1.5rem;