@coopdigital/styles 0.37.0 → 0.39.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.
@@ -1,16 +1,23 @@
1
- @use "../breakpoints.scss" as *;
1
+ // To go in checkbox.scss and radio.scss - needs splitting up
2
2
 
3
- input[type="checkbox"],
4
- .coop-checkbox {
3
+ // Alternatively, could use .coop-field-inline to target both
4
+ // radio/checkbox together, and just keep specific stuff in the
5
+ // component css files. But that introduces a weird mental model, I
6
+ // think. Duplicated selectors and rules will be compressed when the
7
+ // full css file is gzipped and served IRL.
8
+
9
+ input[type="checkbox"] {
5
10
  cursor: pointer;
6
11
 
7
12
  position: relative;
8
13
 
9
14
  display: inline;
15
+ align-self: flex-start;
10
16
 
11
- width: var(--size);
12
- height: var(--size);
13
- min-height: var(--size);
17
+ width: var(--field-size);
18
+ min-width: var(--field-size);
19
+ height: var(--field-size);
20
+ min-height: var(--field-size);
14
21
  margin: 0;
15
22
 
16
23
  appearance: none;
@@ -18,215 +25,69 @@ input[type="checkbox"],
18
25
  outline: 0;
19
26
  }
20
27
 
21
- .coop-checkbox-wrapper {
22
- --font-size: var(--text-size-18);
23
- --size: var(--spacing-32);
24
- --gap: var(--spacing-12);
25
-
26
- --control-inner-offset: calc(var(--size) / 4);
27
- --control-outer-offset: 0;
28
-
29
- --hint-offset: 0;
30
-
31
- position: relative;
32
-
33
- .coop-checkbox-input-wrapper {
34
- display: flex;
35
- flex-wrap: wrap;
36
- align-items: center;
37
- }
38
-
39
- label {
40
- cursor: pointer;
41
-
42
- width: 100%;
43
- max-width: calc(100% - var(--size));
44
- margin: 0;
45
- padding-left: var(--spacing-12);
46
-
47
- &::before {
48
- content: "";
49
-
50
- position: absolute;
51
- top: var(--control-outer-offset);
52
- left: var(--control-outer-offset);
53
-
54
- display: block;
55
-
56
- width: var(--size);
57
- height: var(--size);
58
- padding: 4px;
59
- border: 2px solid var(--color-black);
60
- border-radius: var(--ui-border-radius-sm);
61
- }
28
+ input[type="checkbox"] + div label {
29
+ min-height: var(--field-size);
62
30
 
63
- &::after {
64
- content: "";
31
+ &::before {
32
+ content: "";
65
33
 
66
- position: absolute;
67
- top: calc(var(--size) / 5);
68
- left: 0;
69
- transform: scale(0.6) rotate(-45deg);
34
+ position: absolute;
35
+ top: 0;
36
+ left: 0;
70
37
 
71
- width: var(--size);
72
- height: calc(var(--size) / 2);
73
- border: solid;
74
- border-width: 0 0 calc(var(--size) / 4) calc(var(--size) / 4);
75
- border-top-color: transparent;
38
+ display: block;
76
39
 
77
- opacity: 0;
78
- }
79
- }
80
-
81
- &:has(:checked) label::after {
82
- opacity: 1;
83
- animation: coop-checkbox-pop 0.2s ease-out forwards;
84
- }
85
-
86
- &:has(:indeterminate) label::after {
87
- top: calc(var(--size) / 4);
88
- transform: scale(0.5);
89
-
90
- height: calc(var(--size) / 2);
91
- border: 0;
40
+ width: var(--field-size);
41
+ height: var(--field-size);
42
+ padding: 4px;
43
+ border: 2px solid;
44
+ border-color: var(--field-border);
92
45
  border-radius: var(--ui-border-radius-sm);
93
-
94
- opacity: 1;
95
- background: var(--color-mid-grey);
96
46
  }
97
47
 
98
- &:has(:focus-visible) label::before {
99
- outline: 2px solid var(--color-focus);
100
- outline-offset: 3px;
101
- }
102
-
103
- // &:has(input[data-error]) {
104
- // label::before {
105
- // border: 2px solid var(--color-error-red);
106
- // }
107
- // }
108
-
109
- .coop-field-hint {
110
- flex: 0 0 100%;
111
- width: 100%;
112
- margin: var(--hint-offset) 0 0 0;
113
- padding-left: calc(var(--size) + var(--spacing-12));
114
- }
115
- }
116
-
117
- .coop-checkbox-group {
118
- .coop-checkbox-group-options {
119
- display: flex;
120
- flex-direction: column;
121
- gap: var(--spacing-8);
122
- }
48
+ &::after {
49
+ content: "";
123
50
 
124
- .coop-form-item .coop-checkbox-wrapper {
125
- margin-top: calc(var(--size) / 4);
126
- }
127
-
128
- &[data-orientation="horizontal"] {
129
- .coop-form-item {
130
- width: unset;
131
- }
51
+ position: absolute;
52
+ top: calc(var(--field-size) / 5);
53
+ left: 0;
54
+ transform: scale(0.6) rotate(-45deg);
132
55
 
133
- .coop-checkbox-group-options {
134
- flex-flow: row wrap;
135
- align-items: flex-start;
136
- }
56
+ width: var(--field-size);
57
+ height: calc(var(--field-size) / 2);
58
+ border: solid;
59
+ border-width: 0 0 calc(var(--field-size) / 4) calc(var(--field-size) / 4);
60
+ border-top-color: transparent;
137
61
 
138
- .coop-form-item .coop-checkbox-wrapper {
139
- margin-right: var(--size);
140
- }
62
+ opacity: 0;
141
63
  }
142
64
  }
143
65
 
144
- /* stylelint-disable no-descending-specificity */
145
- .coop-checkbox-wrapper:has(input[data-size="sm"]),
146
- .coop-checkbox-group[data-size="sm"] .coop-checkbox-wrapper {
147
- --size: var(--spacing-24);
148
- --font-size: var(--text-size-16);
66
+ input[type="checkbox"]:checked + div label::after {
67
+ opacity: 1;
68
+ animation: coop-checkbox-pop 0.2s ease-out forwards;
149
69
  }
150
70
 
151
- .coop-checkbox-wrapper:has(input[data-size="lg"]),
152
- .coop-checkbox-group[data-size="lg"] .coop-checkbox-wrapper {
153
- --size: var(--spacing-40);
154
- --font-size: var(--text-size-20);
155
- --hint-offset: -4px;
156
- }
157
-
158
- .coop-checkbox-wrapper:has([data-variant="boxed"]),
159
- .coop-checkbox-group[data-variant="boxed"] .coop-checkbox-wrapper {
160
- --border-color: var(--color-mid-dark-grey);
161
- --border-width: 2px;
162
- --control-inner-offset: calc(var(--size) / 4 + var(--spacing-16));
163
- --control-outer-offset: var(--spacing-16);
164
- --min-width: 160px;
71
+ input[type="checkbox"]:indeterminate + div label::after {
72
+ top: calc(var(--field-size) / 4);
73
+ transform: scale(0.5);
165
74
 
166
- min-width: var(--min-width);
167
- padding: var(--spacing-16);
75
+ height: calc(var(--field-size) / 2);
76
+ border: 0;
168
77
  border-radius: var(--ui-border-radius-sm);
169
- box-shadow: inset 0 0 0 var(--border-width) var(--border-color);
170
-
171
- label {
172
- display: flex;
173
- align-items: center;
174
- justify-content: space-between;
175
-
176
- &::after {
177
- top: calc(var(--size) / 1.5);
178
- left: calc(var(--size) / 2);
179
- }
180
-
181
- span::after {
182
- content: "";
183
-
184
- position: absolute;
185
- top: 0;
186
- left: 0;
187
-
188
- width: 100%;
189
- height: 100%;
190
- }
191
- }
192
-
193
- &:has(:checked),
194
- &:hover {
195
- --border-color: var(--color-text-black);
196
- --border-width: 4px;
197
- }
198
-
199
- &:has(:focus-visible) label::before {
200
- outline: 0;
201
- }
202
-
203
- &:has(:focus-visible) {
204
- outline: 2px solid var(--color-focus);
205
- outline-offset: 4px;
206
- }
207
-
208
- &:has(:disabled) {
209
- --border-color: var(--color-mid-light-grey);
210
- --border-width: 2px;
211
- }
212
78
 
213
- @media (min-width: $mq-medium) {
214
- --min-width: 320px;
215
- }
79
+ opacity: 1;
80
+ background: var(--color-mid-grey);
216
81
  }
217
82
 
218
- .coop-checkbox:disabled,
219
- input[type="checkbox"]:disabled {
220
- & + label::before {
221
- border-color: var(--color-mid-light-grey);
222
- }
83
+ input[type="checkbox"]:not(:disabled) + div label {
84
+ cursor: pointer;
85
+ }
223
86
 
224
- & + label .coop-tag {
225
- color: var(--color-white);
226
- background-color: var(--color-mid-light-grey);
227
- }
87
+ input[type="checkbox"]:focus-visible + div label::before {
88
+ outline: 2px solid var(--color-focus);
89
+ outline-offset: 3px;
228
90
  }
229
- /* stylelint-enable no-descending-specificity */
230
91
 
231
92
  @keyframes coop-checkbox-pop {
232
93
  0% {
@@ -23,7 +23,7 @@
23
23
  }
24
24
 
25
25
  &[open] {
26
- box-shadow: 0 0 0 var(--spacing-6) var(--background-color);
26
+ box-shadow: 0 0 0 var(--spacing-6) var(--bg);
27
27
 
28
28
  .coop-expandable--icon {
29
29
  transform: rotate(180deg);
@@ -1,6 +1,8 @@
1
1
  .coop-flourish {
2
2
  position: absolute;
3
- top: 100%;
3
+ z-index: -1;
4
+ top: calc(105% + 2px - 0.25em);
4
5
  right: 0;
5
- width: 100%;
6
+
7
+ max-width: 100%;
6
8
  }
@@ -16,8 +16,8 @@
16
16
 
17
17
  font-size: var(--font-size); // [data-pill-size="md"]
18
18
  line-height: var(--type-line-height-default);
19
- color: var(--color-text-default);
20
19
  text-decoration: none;
20
+ white-space: nowrap;
21
21
 
22
22
  .coop-pill--badge {
23
23
  position: absolute;
@@ -31,7 +31,6 @@
31
31
  font-size: var(--font-size-badge);
32
32
  font-weight: 600;
33
33
  line-height: var(--type-line-height);
34
- color: var(--color-white);
35
34
  text-transform: uppercase;
36
35
  }
37
36
 
@@ -1,16 +1,15 @@
1
- @use "../breakpoints.scss" as *;
2
-
3
- input[type="radio"],
4
- .coop-radio-button {
1
+ input[type="radio"] {
5
2
  cursor: pointer;
6
3
 
7
4
  position: relative;
8
5
 
9
6
  display: inline;
7
+ align-self: flex-start;
10
8
 
11
- width: var(--size);
12
- height: var(--size);
13
- min-height: var(--size);
9
+ width: var(--field-size);
10
+ min-width: var(--field-size);
11
+ height: var(--field-size);
12
+ min-height: var(--field-size);
14
13
  margin: 0;
15
14
 
16
15
  appearance: none;
@@ -18,189 +17,55 @@ input[type="radio"],
18
17
  outline: 0;
19
18
  }
20
19
 
21
- .coop-radio-button-wrapper {
22
- --font-size: var(--text-size-18);
23
- --size: var(--spacing-32);
24
- --gap: var(--spacing-12);
25
-
26
- --control-inner-offset: calc(var(--size) / 4);
27
- --control-outer-offset: 0;
28
-
29
- --hint-offset: 0;
30
-
31
- position: relative;
32
-
33
- .coop-radio-button-input-wrapper {
34
- display: flex;
35
- flex-wrap: wrap;
36
- align-items: center;
37
- }
38
-
39
- label {
40
- cursor: pointer;
41
-
42
- width: 100%;
43
- max-width: calc(100% - var(--size));
44
- margin: 0;
45
- padding-left: var(--spacing-12);
46
-
47
- &::before {
48
- content: "";
20
+ input[type="radio"] + div label {
21
+ min-height: var(--field-size);
49
22
 
50
- position: absolute;
51
- top: var(--control-outer-offset);
52
- left: var(--control-outer-offset);
23
+ &::before {
24
+ content: "";
53
25
 
54
- display: block;
55
-
56
- width: var(--size);
57
- height: var(--size);
58
- padding: 4px;
59
- border: 2px solid var(--color-black);
60
- border-radius: 50%;
61
- }
62
-
63
- &::after {
64
- content: "";
65
-
66
- position: absolute;
67
- top: var(--control-inner-offset);
68
- left: var(--control-inner-offset);
69
-
70
- width: calc(var(--size) / 2);
71
- height: calc(var(--size) / 2);
72
- border-radius: 50%;
73
-
74
- opacity: 0;
75
- background: var(--color-black);
76
- }
77
- }
78
-
79
- &:has(:checked) label::after {
80
- opacity: 1;
81
- animation: coop-radio-pop 0.2s ease-out forwards;
82
- }
83
-
84
- &:has(:focus-visible) label::before {
85
- outline: 2px solid var(--color-focus);
86
- outline-offset: 3px;
87
- }
26
+ position: absolute;
27
+ top: 0;
28
+ left: 0;
88
29
 
89
- .coop-field-hint {
90
- flex: 0 0 100%;
91
- width: 100%;
92
- margin: var(--hint-offset) 0 0 0;
93
- padding-left: calc(var(--size) + var(--spacing-12));
94
- }
95
- }
30
+ display: block;
96
31
 
97
- .coop-radio-button-group {
98
- .coop-radio-button-group-options {
99
- display: flex;
100
- flex-direction: column;
101
- gap: var(--spacing-8);
32
+ width: var(--field-size);
33
+ height: var(--field-size);
34
+ padding: 4px;
35
+ border: 2px solid;
36
+ border-color: var(--field-border);
37
+ border-radius: 50%;
102
38
  }
103
39
 
104
- .coop-form-item .coop-radio-button-wrapper {
105
- margin-top: calc(var(--size) / 4);
106
- }
40
+ &::after {
41
+ content: "";
107
42
 
108
- &[data-orientation="horizontal"] {
109
- .coop-form-item {
110
- width: unset;
111
- }
43
+ position: absolute;
44
+ top: calc(var(--field-size) / 4);
45
+ left: calc(var(--field-size) / 4);
112
46
 
113
- .coop-radio-button-group-options {
114
- flex-flow: row wrap;
115
- align-items: flex-start;
116
- }
47
+ width: calc(var(--field-size) / 2);
48
+ height: calc(var(--field-size) / 2);
49
+ border-radius: 50%;
117
50
 
118
- .coop-form-item .coop-radio-button-wrapper {
119
- margin-right: var(--size);
120
- }
51
+ opacity: 0;
52
+ background: var(--color-black);
121
53
  }
122
54
  }
123
55
 
124
- /* stylelint-disable no-descending-specificity */
125
- .coop-radio-button-wrapper:has(input[data-size="sm"]),
126
- .coop-radio-button-group[data-size="sm"] .coop-radio-button-wrapper {
127
- --size: var(--spacing-24);
128
- --font-size: var(--text-size-16);
129
- }
130
-
131
- .coop-radio-button-wrapper:has(input[data-size="lg"]),
132
- .coop-radio-button-group[data-size="lg"] .coop-radio-button-wrapper {
133
- --size: var(--spacing-40);
134
- --font-size: var(--text-size-20);
135
- --hint-offset: -4px;
56
+ input[type="radio"]:checked + div label::after {
57
+ opacity: 1;
58
+ animation: coop-radio-pop 0.2s ease-out forwards;
136
59
  }
137
60
 
138
- .coop-radio-button-group[data-variant="boxed"] .coop-radio-button-wrapper {
139
- --border-color: var(--color-mid-dark-grey);
140
- --border-width: 2px;
141
- --control-inner-offset: calc(var(--size) / 4 + var(--spacing-16));
142
- --control-outer-offset: var(--spacing-16);
143
- --min-width: 160px;
144
-
145
- min-width: var(--min-width);
146
- padding: var(--spacing-16);
147
- border-radius: var(--ui-border-radius-sm);
148
- box-shadow: inset 0 0 0 var(--border-width) var(--border-color);
149
-
150
- label {
151
- display: flex;
152
- align-items: center;
153
- justify-content: space-between;
154
-
155
- span::after {
156
- content: "";
157
-
158
- position: absolute;
159
- top: 0;
160
- left: 0;
161
-
162
- width: 100%;
163
- height: 100%;
164
- }
165
- }
166
-
167
- &:has(:checked),
168
- &:hover {
169
- --border-color: var(--color-text-black);
170
- --border-width: 4px;
171
- }
172
-
173
- &:has(:focus-visible) label::before {
174
- outline: 0;
175
- }
176
-
177
- &:has(:focus-visible) {
178
- outline: 2px solid var(--color-focus);
179
- outline-offset: 4px;
180
- }
181
-
182
- &:has(:disabled) {
183
- --border-color: var(--color-mid-light-grey);
184
- --border-width: 2px;
185
- }
186
-
187
- @media (min-width: $mq-medium) {
188
- --min-width: 320px;
189
- }
61
+ input[type="radio"]:not(:disabled) + div label {
62
+ cursor: pointer;
190
63
  }
191
64
 
192
- .coop-radio-button:disabled,
193
- input[type="radio"]:disabled {
194
- & + label::before {
195
- border-color: var(--color-mid-light-grey);
196
- }
197
-
198
- & + label .coop-tag {
199
- color: var(--color-white);
200
- background-color: var(--color-mid-light-grey);
201
- }
65
+ input[type="radio"]:focus-visible + div label::before {
66
+ outline: 2px solid var(--color-focus);
67
+ outline-offset: 3px;
202
68
  }
203
- /* stylelint-enable no-descending-specificity */
204
69
 
205
70
  @keyframes coop-radio-pop {
206
71
  0% {
@@ -4,12 +4,21 @@
4
4
  $ghost-variants: ("green", "blue");
5
5
 
6
6
  --border-color: var(--color-grey-neutral-cool);
7
+ --field-size: var(--spacing-32);
7
8
 
8
9
  display: flex;
9
10
  flex-direction: column;
10
11
  gap: 0.5rem;
11
12
  width: 100%;
12
13
 
14
+ &[data-size="sm"] {
15
+ --field-size: var(--spacing-24);
16
+ }
17
+
18
+ &[data-size="lg"] {
19
+ --field-size: var(--spacing-40);
20
+ }
21
+
13
22
  &--inner {
14
23
  display: inline-flex;
15
24
  align-items: stretch;
@@ -71,12 +80,6 @@
71
80
  }
72
81
  }
73
82
 
74
- // @media (min-width: $mq-medium) {
75
- // button {
76
- // --padding: 0 var(--spacing-12);
77
- // }
78
- // }
79
-
80
83
  @each $variant in $ghost-variants {
81
84
  &[data-variant="#{$variant}-ghost"] {
82
85
  --border-color: var(--color-#{$variant});
@@ -53,13 +53,15 @@ input[type="tel"],
53
53
  }
54
54
 
55
55
  .coop-text-input-wrapper {
56
- --font-size: var(--text-size-18);
57
- --height: var(--spacing-48);
58
- --padding: 0 var(--spacing-12);
56
+ --padding: 0 calc(var(--field-size) / 2 - 4px);
57
+ --height: calc(var(--field-size) + var(--spacing-16));
59
58
 
60
59
  display: flex;
60
+
61
+ width: 100%;
61
62
  height: var(--height);
62
- border-color: var(--color-mid-dark-grey);
63
+ border-color: var(--field-border);
64
+
63
65
  font-size: var(--font-size);
64
66
 
65
67
  .coop-text-input,
@@ -76,17 +78,6 @@ input[type="tel"],
76
78
  transition: border-color 0.2s ease-out;
77
79
  }
78
80
 
79
- &:has([data-size="sm"]) {
80
- --height: var(--spacing-40);
81
- --font-size: var(--text-size-16);
82
- }
83
-
84
- &:has([data-size="lg"]) {
85
- --height: var(--spacing-56);
86
- --font-size: var(--text-size-20);
87
- --padding: 0 var(--spacing-16);
88
- }
89
-
90
81
  &:has(:disabled) {
91
82
  border-color: var(--color-mid-light-grey);
92
83
  border-width: 0;
@@ -110,11 +101,6 @@ input[type="tel"],
110
101
  transition: none;
111
102
  }
112
103
 
113
- &:has(input[data-error]),
114
- &:has(input:invalid) {
115
- border-color: var(--color-error-red);
116
- }
117
-
118
104
  &:has(.coop-text-input--prefix) .coop-text-input {
119
105
  border-left: 0;
120
106
  border-top-left-radius: 0;