@stackoverflow/stacks 3.0.0-beta.13 → 3.0.0-beta.14

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.
@@ -1,161 +1,243 @@
1
1
  .s-checkbox,
2
2
  .s-radio {
3
- --_ch-baw: var(--su-static1);
4
- --_ch-bc: var(--bc-dark);
5
- --_ch-bg: var(--white);
6
- --_ch-bg-image: unset;
3
+ --_ch-ai: center;
4
+ --_ch-fc: unset;
5
+ --_ch-after-fc: unset;
6
+ --_ch-cursor: pointer;
7
+ --_ch-label-fc: var(--_ch-fc);
8
+ --_ch-gap: var(--su8);
9
+
10
+ // inputs
11
+ --_ch-input-baw: var(--su-static1);
12
+ --_ch-input-bc: var(--black-350);
13
+ --_ch-input-bg: var(--white);
14
+ --_ch-input-bg-image: unset;
15
+ --_ch-input-br: var(--su-static1);
16
+ --_ch-input-cursor: pointer;
17
+ --_ch-input-h: calc(var(--su-static12) + var(--su-static2)); // 14px
18
+
19
+ @media (forced-colors: active) { // This is for Windows High Contrast Mode
20
+ &:checked,
21
+ &:indeterminate {
22
+ --_ch-input-bg: ButtonText !important;
23
+ }
24
+ }
7
25
 
8
- // CONTEXTUAL STYLES
9
26
  fieldset[disabled] &,
10
- &[disabled] {
11
- cursor: not-allowed;
12
- opacity: var(--_o-disabled-static);
27
+ &:has(> input[disabled]) {
28
+ --_ch-fc: var(--black-300);
29
+ --_ch-input-bc: var(--black-300);
30
+ --_ch-input-cursor: not-allowed;
13
31
  }
14
32
 
15
- .s-check-control & {
16
- &[disabled] + .s-label {
17
- &:extend(.is-disabled .s-label);
18
- }
33
+ &:has(> input[disabled]:checked) {
34
+ --_ch-input-bc: var(--theme-secondary-300);
19
35
  }
20
36
 
21
- .s-check-group & {
22
- margin-top: calc(var(--su2) + var(--su1)); // 3px
23
- }
37
+ // MODIFIERS
38
+ &&__checkmark {
39
+ --_ch-fc: var(--theme-secondary);
40
+ --_ch-gap: var(--su4);
41
+ --_ch-after-fc: unset;
42
+
43
+ // CONTEXTUAL STYLES
44
+ &:has(> input:focus-visible) {
45
+ .focus-styles(true, false);
46
+ }
24
47
 
25
- input& {
26
- flex-shrink: 0;
27
- }
48
+ &:has(> input:checked) {
49
+ --_ch-after-fc: var(--_ch-fc);
50
+ }
28
51
 
29
- // INTERACTION
30
- &:focus {
31
- .focus-styles();
32
- }
52
+ &:has(> input[disabled]) {
53
+ --_ch-cursor: not-allowed;
54
+ }
33
55
 
34
- background-color: var(--_ch-bg);
35
- border: var(--_ch-baw) solid var(--_ch-bc);
36
-
37
- appearance: none;
38
- cursor: pointer;
39
- font-size: inherit;
40
- height: 1em;
41
- margin: 0; // A guard against Core's default margins
42
- outline: 0;
43
- vertical-align: middle;
44
- width: 1em;
45
- }
56
+ &:has(> input:checked[disabled]) {
57
+ --_ch-fc: var(--theme-secondary-300);
58
+ }
46
59
 
47
- .s-checkbox {
48
- // Less variables for check svg fill color
49
- @ch-bg-image-fill: .set-white()[default];
50
- @ch-bg-image-fill-dark: .set-white-dark()[default];
51
- @ch-bg-image-fill-esc: escape("@{ch-bg-image-fill}"); // color escaped for URL usage
52
- @ch-bg-image-fill-dark-esc: escape("@{ch-bg-image-fill-dark}"); // color escaped for URL usage
60
+ // CHILD ELEMENTS
61
+ input,
62
+ &:after {
63
+ height: var(--su16);
64
+ margin-left: 100%;
65
+ width: var(--su16);
66
+ }
53
67
 
54
- // CONTEXTUAL STYLES
55
- .dark-mode({
56
- &:checked {
57
- --_ch-bg-image: url("data:image/svg+xml;,%3Csvg width='11' height='11' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M10 3.41L8.59 2 4 6.59 2.41 5 1 6.41l3 3z' fill='@{ch-bg-image-fill-dark-esc}'/%3E%3C/svg%3E");
68
+ &:after {
69
+ background-color: var(--_ch-after-fc);
70
+ content: "";
71
+ flex-shrink: 0;
72
+ margin-left: auto;
73
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='m14 3.88-.44.44-7.34 7.35-.44.44-.44-.44-2.9-2.9L2 8.34l.89-.88.44.44 2.45 2.45 6.9-6.9.44-.44z'/%3E%3C/svg%3E"); // check16
74
+ mask-size: contain;
75
+ mask-repeat: no-repeat;
58
76
  }
59
- &:indeterminate {
60
- --_ch-bg-image: url("data:image/svg+xml;,%3Csvg width='11' height='11' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M2 4.5 h7 v2 h-7 z' fill='@{ch-bg-image-fill-dark-esc}'/%3E%3C/svg%3E");
77
+
78
+ input {
79
+ appearance: none;
80
+ opacity: 0;
81
+ position: absolute;
82
+ right: 0;
83
+ z-index: -1;
61
84
  }
62
- });
63
85
 
64
- .highcontrast-dark-mode({
65
- &:checked, &:indeterminate {
66
- --_ch-bc: var(--black) !important;
67
- --_ch-bg: var(--black);
86
+ .s-description {
87
+ margin: var(--su2) 0 0;
88
+ padding: 0;
68
89
  }
69
- });
70
90
 
71
- @media (forced-colors: active) {
72
- &:checked,
73
- &:indeterminate {
74
- --_ch-bg: ButtonText !important;
91
+ .s-label {
92
+ flex-grow: 1;
75
93
  }
76
- }
77
94
 
78
- // STATES
79
- &:checked, &:indeterminate {
80
- --_ch-bc: var(--theme-secondary) !important;
81
- --_ch-bg: var(--theme-secondary);
82
- }
95
+ border-radius: var(--br-md);
96
+ color: var(--_ch-fc);
97
+ cursor: var(--_ch-cursor);
83
98
 
84
- &:checked {
85
- --_ch-bg-image: url("data:image/svg+xml;,%3Csvg width='11' height='11' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M10 3.41L8.59 2 4 6.59 2.41 5 1 6.41l3 3z' fill='@{ch-bg-image-fill-esc}'/%3E%3C/svg%3E");
99
+ width: 100%;
86
100
  }
87
101
 
88
- &:indeterminate {
89
- --_ch-bg-image: url("data:image/svg+xml;,%3Csvg width='11' height='11' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M2 4.5 h7 v2 h-7 z' fill='@{ch-bg-image-fill-esc}'/%3E%3C/svg%3E");
102
+ // CHILD ELEMENTS
103
+ &:has(> input[disabled]) {
104
+ .s-label {
105
+ --_ch-label-fc: var(--black-300);
106
+ }
90
107
  }
91
108
 
92
- background-image: var(--_ch-bg-image);
109
+ &:not(> input[disabled]) {
110
+ &:has(input:checked),
111
+ &:has(input:indeterminate) {
112
+ .s-label {
113
+ --_ch-label-fc: var(--black-600);
114
+ }
115
+ }
116
+ }
93
117
 
94
- background-position: center center;
95
- background-repeat: no-repeat;
96
- background-size: contain;
97
- border-radius: var(--br-md);
98
- }
118
+ &:has(> .s-label .s-description),
119
+ &:has(> .s-label .s-input-message) {
120
+ --_ch-ai: flex-start;
99
121
 
100
- .s-radio {
101
-
102
- // CONTEXTUAL STYLES
103
- .highcontrast-dark-mode({
104
- &:checked {
105
- --_ch-bc: var(--black);
106
- outline: var(--su-static1) solid var(--black);
122
+ input {
123
+ margin-top: var(--su2);
107
124
  }
108
- });
109
-
110
- // STATES
111
- &:checked {
112
- --_ch-baw: 0.30769231em;
113
- --_ch-bc: var(--theme-secondary);
114
- --_ch-bg: var(--white);
115
125
  }
116
126
 
117
- border-radius: var(--br-circle);
118
- }
127
+ // Validation states
128
+ &:has(> input:not(:checked)) {
129
+ &.has-error {
130
+ --_ch-input-bc: var(--red-400);
131
+ }
132
+ &.has-success {
133
+ --_ch-input-bc: var(--green-400);
134
+ }
135
+ &.has-warning {
136
+ --_ch-input-bc: var(--yellow-400);
137
+ }
138
+ }
119
139
 
120
- .s-checkbox,
121
- .s-radio:not(:checked) {
122
- .validation-states(ch);
123
- }
140
+ input {
141
+ &:focus-visible {
142
+ .focus-styles();
143
+ }
124
144
 
125
- .s-check-control { // TODO would _love_ to use .s-check instead, with no class on the input itself
126
- --_cc-ai: center;
145
+ &:not(:checked) {
146
+ .validation-states(ch-input);
147
+ }
127
148
 
128
- // CONTEXTUAL STYLES
129
- .s-check-group & {
130
- --_cc-ai: flex-start; // manually align the checkboxes and radios to the top of the group
149
+ appearance: none;
150
+ background-color: var(--_ch-input-bg);
151
+ border: var(--_ch-input-baw) solid var(--_ch-input-bc);
152
+ border-radius: var(--_ch-input-br);
153
+ cursor: var(--_ch-input-cursor);
154
+ height: var(--_ch-input-h);
155
+
156
+ aspect-ratio: 1 / 1;
157
+ flex-shrink: 0;
158
+ font-size: inherit;
159
+ margin: 0; // A guard against Core's default margins
160
+ outline: 0;
161
+ vertical-align: middle;
131
162
  }
132
163
 
133
- // CHILD ELEMENTS
164
+
134
165
  .s-label {
166
+ color: var(--_ch-label-fc);
167
+ font-size: var(--fs-body1);
135
168
  font-weight: normal;
136
169
  }
137
170
 
138
- align-items: var(--_cc-ai);
171
+ align-items: var(--_ch-ai);
139
172
  display: flex;
140
- gap: var(--su8);
173
+ gap: var(--_ch-gap);
141
174
  }
142
175
 
143
- .s-check-group {
144
- --_cg-fd: column;
176
+ .s-checkbox{
177
+ // Less variables for check svg fill color
178
+ @ch-bg-image-fill: .set-white()[default];
179
+ @ch-bg-image-fill-dark: .set-white-dark()[default];
180
+ @ch-bg-image-fill-esc: escape("@{ch-bg-image-fill}"); // color escaped for URL usage
181
+ @ch-bg-image-fill-dark-esc: escape("@{ch-bg-image-fill-dark}"); // color escaped for URL usage
145
182
 
146
- // MODIFIERS
147
- &&__horizontal {
148
- --_cg-fd: row;
149
- }
183
+ // CONTEXTUAL STYLES
184
+ .dark-mode({
185
+ input {
186
+ &:checked {
187
+ --_ch-input-bg-image: url("data:image/svg+xml;,%3Csvg width='11' height='11' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M10 3.41L8.59 2 4 6.59 2.41 5 1 6.41l3 3z' fill='@{ch-bg-image-fill-dark-esc}'/%3E%3C/svg%3E");
188
+ }
189
+ &:indeterminate {
190
+ --_ch-input-bg-image: url("data:image/svg+xml;,%3Csvg width='11' height='11' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M2 4.5 h7 v2 h-7 z' fill='@{ch-bg-image-fill-dark-esc}'/%3E%3C/svg%3E");
191
+ }
192
+ }
193
+ });
150
194
 
151
195
  // CHILD ELEMENTS
152
- // TODO HACK? <legend> isn't respecting gap...
153
- legend.s-label {
154
- margin-bottom: var(--su8);
155
- }
196
+ input {
197
+ fieldset[disabled] &,
198
+ &[disabled] {
199
+ &:checked, &:indeterminate {
200
+ --_ch-input-bc: var(--theme-secondary-300);
201
+ --_ch-input-bg: var(--theme-secondary-300);
202
+ }
203
+ }
156
204
 
157
- flex-direction: var(--_cg-fd);
205
+ &:checked, &:indeterminate {
206
+ --_ch-input-bc: var(--theme-secondary);
207
+ --_ch-input-bg: var(--theme-secondary);
208
+ }
158
209
 
159
- display: flex;
160
- gap: var(--su8);
210
+ &:checked {
211
+ --_ch-input-bg-image: url("data:image/svg+xml;,%3Csvg width='11' height='11' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M10 3.41L8.59 2 4 6.59 2.41 5 1 6.41l3 3z' fill='@{ch-bg-image-fill-esc}'/%3E%3C/svg%3E");
212
+ }
213
+
214
+ &:indeterminate {
215
+ --_ch-input-bg-image: url("data:image/svg+xml;,%3Csvg width='11' height='11' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M2 4.5 h7 v2 h-7 z' fill='@{ch-bg-image-fill-esc}'/%3E%3C/svg%3E");
216
+ }
217
+
218
+ background-image: var(--_ch-input-bg-image);
219
+
220
+ background-position: center center;
221
+ background-repeat: no-repeat;
222
+ background-size: contain;
223
+ }
161
224
  }
225
+
226
+ .s-radio {
227
+ input {
228
+ fieldset[disabled] &,
229
+ &[disabled] {
230
+ &:checked {
231
+ --_ch-input-bc: var(--theme-secondary-300);
232
+ }
233
+ }
234
+
235
+ --_ch-input-br: var(--br-circle);
236
+
237
+ &:checked {
238
+ --_ch-input-baw: calc(var(--_ch-input-h) / 3); // 14px / 3 = ~4.67px
239
+ --_ch-input-bc: var(--theme-secondary);
240
+ --_ch-input-bg: var(--white);
241
+ }
242
+ }
243
+ }
@@ -1,9 +1,23 @@
1
1
  .s-description {
2
+ --_de-fc: var(--black-400);
3
+
2
4
  .is-disabled & {
3
5
  opacity: var(--_o-disabled-static);
4
6
  }
5
7
 
6
- color: var(--fc-light);
8
+ .has-error & {
9
+ --_de-fc: var(--red-400);
10
+ }
11
+
12
+ .has-success & {
13
+ --_de-fc: var(--green-400);
14
+ }
15
+
16
+ .has-warning & {
17
+ --_de-fc: var(--yellow-400);
18
+ }
19
+
20
+ color: var(--_de-fc);
7
21
  font-size: var(--fs-caption);
8
22
  padding: 0 var(--su2); // Helps the label visually line up with inputs
9
23
  }
@@ -1,15 +1,26 @@
1
1
  .s-empty-state {
2
2
  // CHILD ELEMENTS
3
3
  p {
4
- strong {
5
- color: var(--fc-dark);
6
- }
4
+ color: var(--black-400);
5
+ margin-bottom: var(--su32);
6
+ }
7
+
8
+ &--title {
9
+ font-weight: 600;
10
+ font-size: var(--fs-body3);
11
+ margin-bottom: var(--su8);
12
+ color: var(--black-400);
13
+ }
14
+
15
+ .svg-spot {
16
+ margin-bottom: var(--su24);
17
+ }
7
18
 
8
- font-size: var(--fs-body1);
9
- margin-bottom: var(--su12);
19
+ // Remove margin from <p> if there are no buttons
20
+ &:last-child {
21
+ margin-bottom: 0;
10
22
  }
11
23
 
12
- color: var(--fc-light);
13
24
  text-align: center;
14
25
  margin-left: auto;
15
26
  margin-right: auto;
@@ -0,0 +1,25 @@
1
+ .s-form-group {
2
+ --_fg-fd: column;
3
+ --_fg-gap: var(--su8);
4
+
5
+ // CONTEXTUAL STYLES
6
+ &.s-menu {
7
+ --_fg-gap: 0;
8
+ }
9
+
10
+ // MODIFIERS
11
+ &&__horizontal {
12
+ --_fg-fd: row;
13
+ }
14
+
15
+ // CHILD ELEMENTS
16
+ legend.s-label {
17
+ margin-bottom: var(--su8);
18
+ }
19
+
20
+
21
+ flex-direction: var(--_fg-fd);
22
+
23
+ display: flex;
24
+ gap: var(--_fg-gap);
25
+ }
@@ -2,13 +2,17 @@
2
2
  .s-textarea,
3
3
  //The :has selector here allows us to use these vars for sibling icons in textarea components (See .s-textarea -> ~ .s-input-icon)
4
4
  :has(> .s-textarea) {
5
+ --_in-ai: unset;
5
6
  --_in-bc: var(--black-300);
6
7
  --_in-bg: var(--white);
7
8
  --_in-br: var(--br-md);
8
9
  --_in-bw: var(--su-static1);
9
10
  --_in-c: unset;
11
+ --_in-d: unset;
10
12
  --_in-fc: var(--black-600);
11
13
  --_in-fs: var(--fs-body1);
14
+ --_in-fw: unset;
15
+ --_in-g: unset;
12
16
  --_in-lh: var(--lh-base);
13
17
  --_in-px: calc(var(--su12) - var(--su1)); // 11px
14
18
  --_in-py: var(--su8);
@@ -81,11 +85,15 @@
81
85
  }
82
86
 
83
87
  @scrollbar-styles();
88
+ align-items: var(--_in-ai);
84
89
  background-color: var(--_in-bg);
85
90
  border: var(--_in-bw) solid var(--_in-bc);
86
91
  color: var(--_in-fc);
87
92
  cursor: var(--_in-c);
93
+ display: var(--_in-d);
94
+ flex-wrap: var(--_in-fw);
88
95
  font-size: var(--_in-fs);
96
+ gap: var(--_in-g);
89
97
  line-height: var(--_in-lh);
90
98
  padding: var(--_in-py) var(--_in-px) var(--_in-py) var(--_in-pl, var(--_in-px));
91
99
 
@@ -95,15 +103,6 @@
95
103
  width: 100%;
96
104
  }
97
105
 
98
- //Nested inputs (E.g. Tag selection control) need a flex layout.
99
- .s-input:has(> input.s-input) {
100
- display: flex;
101
- align-items: center;
102
- input.s-input {
103
- flex: 1 1 0;
104
- }
105
- }
106
-
107
106
  .s-input {
108
107
  .input-states({
109
108
  padding-right: var(--su32);
@@ -116,14 +115,16 @@
116
115
  --_in-px: 0;
117
116
 
118
117
  box-shadow: none;
118
+ flex: 1 1 0;
119
119
  margin: calc(var(--_in-py) * -1) 0;
120
120
  }
121
121
 
122
122
  &:has(&) {
123
+ --_in-ai: center;
124
+ --_in-d: flex;
125
+ --_in-fw: nowrap;
123
126
  --_in-px: var(--_in-py);
124
-
125
- flex-wrap: wrap;
126
- gap: var(--su8);
127
+ --_in-g: var(--su8);
127
128
  }
128
129
  }
129
130
 
@@ -2,7 +2,6 @@
2
2
  --_me-action-bg: unset;
3
3
  --_me-action-fc: var(--black-500);
4
4
  --_me-item-p: var(--su8);
5
- --_me-after-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='m14 3.88-.44.44-7.34 7.35-.44.44-.44-.44-2.9-2.9L2 8.34l.89-.88.44.44 2.45 2.45 6.9-6.9.44-.44z'/%3E%3C/svg%3E"); // check16
6
5
 
7
6
  // CHILD ELEMENTS
8
7
  & &--divider {
@@ -21,20 +20,19 @@
21
20
  --_me-item-p: 0;
22
21
  }
23
22
 
24
- &.s-check-control {
23
+ &.s-checkbox,
24
+ &.s-radio {
25
25
  --_me-item-p: var(--su6) var(--su8);
26
26
 
27
- .s-radio,
28
- .s-checkbox {
27
+ input {
29
28
  margin-top: var(--su4);
30
29
  }
31
30
 
32
31
  align-items: flex-start;
33
32
  }
34
33
 
35
- &:not(.s-check-control) {
36
- .s-radio,
37
- .s-checkbox {
34
+ &:not(.s-checkbox):not(.s-radio) {
35
+ input {
38
36
  height: 0;
39
37
  pointer-events: none;
40
38
  position: absolute;
@@ -73,21 +71,6 @@
73
71
  }
74
72
  }
75
73
 
76
- &.is-selected,
77
- &:has(input:checked) {
78
- &:after {
79
- background-color: var(--_me-action-fc);
80
- content: "";
81
- height: var(--su16);
82
- margin-left: auto;
83
- width: var(--su16);
84
- mask-image: var(--_me-after-mask);
85
- mask-size: contain;
86
- mask-repeat: no-repeat;
87
- }
88
-
89
- }
90
-
91
74
  background-color: var(--_me-action-bg);
92
75
  color: var(--_me-action-fc);
93
76
 
@@ -202,10 +202,6 @@
202
202
  }
203
203
 
204
204
  td {
205
- .s-checkbox {
206
- display: block;
207
- }
208
-
209
205
  &.s-table--bulk {
210
206
  --_ta-td-w: calc(var(--su32) - var(--su2)); // 30px
211
207
  }
@@ -249,10 +245,6 @@
249
245
  }
250
246
 
251
247
  th {
252
- .s-checkbox {
253
- display: block;
254
- }
255
-
256
248
  &.s-table--bulk {
257
249
  --_ta-th-w: calc(var(--su32) - var(--su2)); // 30px
258
250
  }