@jrgermain/stylesheet 0.0.3

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,137 @@
1
+ @use "./text";
2
+ @use "../utils";
3
+
4
+ details {
5
+ width: 100%;
6
+ background-color: var(--color-body-alt);
7
+ padding-block: 0;
8
+ padding-inline: var(--space-xs);
9
+ border-radius: var(--radius-m);
10
+ border: var(--border-s) solid var(--color-outline);
11
+ box-shadow: var(--shadow-s);
12
+
13
+ @media (prefers-reduced-motion: no-preference) {
14
+ transition: 150ms padding ease;
15
+ }
16
+
17
+ summary {
18
+ font-family: var(--font-family-heading);
19
+ font-size: var(--font-size-m);
20
+ font-weight: var(--font-weight-bold);
21
+ line-height: 1;
22
+ cursor: pointer;
23
+ border-block-end: var(--border-s) dashed transparent;
24
+ padding: var(--space-xs);
25
+ padding-inline-start: calc(var(--space-xs) + 1em);
26
+ margin-block: 0;
27
+ margin-inline: calc(-1 * var(--space-xs));
28
+ transition-duration: 150ms;
29
+ transition-property: color, border-color;
30
+ transition-timing-function: ease;
31
+ position: relative;
32
+ list-style: none; // Hides ::marker pseudo element in favor of ::before (better cross browser consistency)
33
+ color: var(--color-body-text);
34
+ user-select: none;
35
+
36
+ @media (prefers-reduced-motion: no-preference) {
37
+ transition-property: color, border-color, padding, margin;
38
+ }
39
+
40
+ &:is(:hover, .hover) {
41
+ color: var(--color-brand-4) !important;
42
+ }
43
+
44
+ &:is(:active, .active) {
45
+ color: var(--color-brand-2) !important;
46
+ }
47
+
48
+ // Hides ::-webkit-details-marker pseudo element in favor of ::before (better cross browser consistency)
49
+ &::-webkit-details-marker {
50
+ display: none;
51
+ }
52
+
53
+ // Replacement marker element
54
+ &::before {
55
+ content: #{utils.svg-to-data-url(
56
+ '<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="none" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9l6 6l6-6"/></svg>'
57
+ )};
58
+ display: inline-block;
59
+ position: absolute;
60
+ inset-block: 0;
61
+ inset-inline-start: calc(var(--space-xs) / 2);
62
+ margin: auto;
63
+ width: 1em;
64
+ height: 1em;
65
+ rotate: -90deg;
66
+ transition: rotate 200ms ease;
67
+ }
68
+
69
+ &:dir(rtl)::before {
70
+ rotate: 90deg;
71
+ }
72
+
73
+ @media (prefers-reduced-motion) {
74
+ transition-property: color, border-color;
75
+
76
+ &::before {
77
+ transition: none;
78
+ }
79
+ }
80
+
81
+ @media (prefers-color-scheme: dark) {
82
+ &:is(:hover, .hover) {
83
+ color: var(--color-brand-2) !important;
84
+ }
85
+
86
+ &:is(:active, .active) {
87
+ color: var(--color-brand-4) !important;
88
+ }
89
+
90
+ &::before {
91
+ content: #{utils.svg-to-data-url(
92
+ '<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="none" stroke="white" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9l6 6l6-6"/></svg>'
93
+ )};
94
+ }
95
+ }
96
+ }
97
+
98
+ &[open] {
99
+ padding-block-end: var(--space-xs);
100
+
101
+ summary {
102
+ color: var(--color-brand-3);
103
+ border-block-end-color: var(--color-outline);
104
+ margin-block-end: var(--space-xs);
105
+
106
+ &::before {
107
+ rotate: 0deg;
108
+ }
109
+ }
110
+ }
111
+ }
112
+
113
+ .accordion {
114
+ width: 100%;
115
+
116
+ > details {
117
+ & + details {
118
+ border-block-start: 0;
119
+ }
120
+
121
+ &:not(:first-of-type) {
122
+ border-start-start-radius: 0;
123
+ border-start-end-radius: 0;
124
+ }
125
+
126
+ &:not(:last-of-type) {
127
+ border-end-start-radius: 0;
128
+ border-end-end-radius: 0;
129
+ }
130
+ }
131
+ }
132
+
133
+ details.no-width,
134
+ .accordion.no-width,
135
+ .accordion.no-width > details {
136
+ width: initial;
137
+ }
@@ -0,0 +1,240 @@
1
+ @use "./text";
2
+ @use "../utils";
3
+
4
+ dialog,
5
+ dialog::backdrop {
6
+ --dialog-starting-opacity: 0.25;
7
+ --dialog-starting-transform: translateY(8px);
8
+ --dialog-open-opacity: 1;
9
+ --dialog-open-transform: translate(0);
10
+ --dialog-ending-opacity: 0;
11
+ --dialog-ending-transform: translateY(-4px) scale(0.97);
12
+ --dialog-backdrop-starting-opacity: 0;
13
+ --dialog-backdrop-open-opacity: 0.75;
14
+ --dialog-backdrop-ending-opacity: 0;
15
+ --dialog-backdrop-color: var(--color-gray-2);
16
+
17
+ @media (prefers-reduced-motion) {
18
+ --dialog-starting-transform: translate(0);
19
+ --dialog-ending-transform: translate(0);
20
+ }
21
+
22
+ @media (prefers-color-scheme: dark) {
23
+ --dialog-backdrop-color: var(--color-gray-8);
24
+ --dialog-backdrop-open-opacity: 0.85;
25
+ }
26
+ }
27
+
28
+ dialog {
29
+ box-shadow: var(--shadow-xl);
30
+ border: var(--border-s) solid var(--color-outline);
31
+ border-radius: var(--radius-l);
32
+ background-color: var(--color-body-alt);
33
+ color: var(--color-body-text);
34
+ padding: 0;
35
+ flex-direction: column;
36
+ gap: 0;
37
+
38
+ &::backdrop {
39
+ background-color: var(--dialog-backdrop-color);
40
+ }
41
+
42
+ &.drawer {
43
+ --dialog-starting-opacity: 0.5;
44
+
45
+ position: fixed;
46
+ inset: 0;
47
+ border-radius: 0;
48
+ margin: 0;
49
+ border: 0;
50
+ overflow: auto;
51
+
52
+ &.left {
53
+ right: auto;
54
+
55
+ @media (prefers-reduced-motion: no-preference) {
56
+ --dialog-starting-transform: translateX(-16px);
57
+ --dialog-ending-transform: translateX(-16px);
58
+ }
59
+ }
60
+
61
+ &.top {
62
+ bottom: auto;
63
+
64
+ @media (prefers-reduced-motion: no-preference) {
65
+ --dialog-starting-transform: translateY(-16px);
66
+ --dialog-ending-transform: translateY(-16px);
67
+ }
68
+ }
69
+
70
+ &.right {
71
+ left: auto;
72
+
73
+ @media (prefers-reduced-motion: no-preference) {
74
+ --dialog-starting-transform: translateX(16px);
75
+ --dialog-ending-transform: translateX(16px);
76
+ }
77
+ }
78
+
79
+ &.bottom {
80
+ top: auto;
81
+
82
+ @media (prefers-reduced-motion: no-preference) {
83
+ --dialog-starting-transform: translateY(16px);
84
+ --dialog-ending-transform: translateY(16px);
85
+ }
86
+ }
87
+
88
+ &.top,
89
+ &.bottom {
90
+ width: 100dvw;
91
+ max-width: unset;
92
+ height: auto;
93
+ max-height: 100dvh;
94
+ min-height: min(100dvh, 250px);
95
+
96
+ &.small {
97
+ max-height: min(100dvh, 300px);
98
+ }
99
+
100
+ &.medium {
101
+ max-height: min(100dvh, 450px);
102
+ }
103
+
104
+ &.large {
105
+ max-height: min(100dvh, 600px);
106
+ }
107
+ }
108
+
109
+ &.left,
110
+ &.right {
111
+ height: 100dvh;
112
+ max-height: unset;
113
+ width: auto;
114
+ min-width: min(100dvw, 300px);
115
+ max-width: 100dvw;
116
+
117
+ &.small {
118
+ max-width: min(100dvw, 350px);
119
+ }
120
+
121
+ &.medium {
122
+ max-width: min(100dvw, 450px);
123
+ }
124
+
125
+ &.large {
126
+ max-width: min(100dvw, 700px);
127
+ }
128
+ }
129
+ }
130
+
131
+ &:not(.drawer) {
132
+ --dialog-width: 9999px;
133
+
134
+ max-height: calc(100svh - 4 * var(--space-body));
135
+ max-width: min(calc(100svw - 4 * var(--space-body)), var(--dialog-width));
136
+
137
+ &.small {
138
+ --dialog-width: 400px;
139
+ }
140
+
141
+ &.medium {
142
+ --dialog-width: 650px;
143
+ }
144
+
145
+ &.large {
146
+ --dialog-width: 900px;
147
+ }
148
+ }
149
+
150
+ &[open] {
151
+ display: flex;
152
+ }
153
+ }
154
+
155
+ .dialog-header {
156
+ font-family: var(--font-family-heading);
157
+ font-size: var(--font-size-m);
158
+ font-weight: var(--font-weight-bold);
159
+ line-height: 1;
160
+ padding: var(--space-m);
161
+ padding-block-end: var(--space-xs);
162
+ flex-shrink: 0;
163
+ display: flex;
164
+ align-items: center;
165
+ justify-content: space-between;
166
+ color: var(--color-brand-3);
167
+ margin: 0;
168
+
169
+ h1,
170
+ h2,
171
+ h3,
172
+ h4,
173
+ h5,
174
+ h6 {
175
+ color: inherit;
176
+ font-size: inherit;
177
+ font-weight: inherit;
178
+ margin: 0;
179
+ }
180
+
181
+ :is(button, .button).close {
182
+ color: inherit;
183
+ margin: -0.5rem;
184
+ margin-inline-start: var(--space-3xs);
185
+
186
+ &::after {
187
+ content: "";
188
+ width: 1.2em;
189
+ height: 1.2em;
190
+ mask-image: #{utils.svg-to-data-url(
191
+ '<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 256 256"><path fill="black" d="M208.49 191.51a12 12 0 0 1-17 17L128 145l-63.51 63.49a12 12 0 0 1-17-17L111 128L47.51 64.49a12 12 0 0 1 17-17L128 111l63.51-63.52a12 12 0 0 1 17 17L145 128Z"/></svg>'
192
+ )};
193
+ mask-size: contain;
194
+ mask-repeat: no-repeat;
195
+ background-color: currentcolor;
196
+ }
197
+ }
198
+ }
199
+
200
+ .dialog-body {
201
+ padding: var(--space-m);
202
+ padding-block-start: var(--space-xs);
203
+ flex-shrink: 1;
204
+ display: block;
205
+ overflow: auto;
206
+ margin: 0;
207
+ }
208
+
209
+ .dialog-footer {
210
+ padding: var(--space-xs);
211
+ flex-shrink: 0;
212
+ display: flex;
213
+ gap: var(--space-2xs);
214
+ justify-content: flex-end;
215
+ background-color: var(--color-body);
216
+ border-block-start: var(--border-s) solid var(--color-outline);
217
+ margin: 0;
218
+
219
+ @media screen and (width <= 500px) {
220
+ flex-direction: column;
221
+ width: 100%;
222
+ justify-content: stretch;
223
+ }
224
+
225
+ :is(
226
+ button,
227
+ .button,
228
+ input[type="button"],
229
+ input[type="submit"],
230
+ input[type="reset"]
231
+ ):not(.small, .medium, .large) {
232
+ font-size: 0.9rem;
233
+ }
234
+ }
235
+
236
+ @supports (transition-behavior: allow-discrete) and (overlay: none) {
237
+ dialog {
238
+ animation: unset;
239
+ }
240
+ }
@@ -0,0 +1,301 @@
1
+ @use "../utils";
2
+
3
+ .field {
4
+ --field-gap: var(--space-2xs);
5
+ --field-padding: var(--space-2xs);
6
+ --field-radius: var(--radius-m);
7
+
8
+ display: inline-flex;
9
+ flex-direction: column;
10
+ line-height: 1;
11
+ gap: var(--field-gap);
12
+ color: var(--color-body-text);
13
+ font-weight: var(--font-weight-semibold);
14
+ transition-duration: 200ms;
15
+ transition-property: color, box-shadow;
16
+ transition-timing-function: ease;
17
+ font-size: var(--font-size-m);
18
+
19
+ &.compact,
20
+ :is(form, .form, fieldset).compact & {
21
+ --field-gap: calc(0.9 * var(--space-2xs));
22
+ --field-padding: calc(0.75 * var(--space-2xs));
23
+ --field-radius: var(--radius-s);
24
+
25
+ font-size: calc(0.9 * var(--font-size-m));
26
+ }
27
+
28
+ &:focus-within {
29
+ color: var(--color-brand-5);
30
+ }
31
+
32
+ &:has(:user-invalid, &[aria-invalid="true"]) {
33
+ color: var(--color-red-5);
34
+
35
+ .error-message {
36
+ opacity: 1;
37
+ }
38
+ }
39
+
40
+ &:has([readonly]):focus-within {
41
+ color: var(--color-gray-5);
42
+ }
43
+
44
+ &:user-invalid {
45
+ color: var(--color-red-5);
46
+ }
47
+
48
+ input:not(
49
+ [type="button"],
50
+ [type="checkbox"],
51
+ [type="file"],
52
+ [type="hidden"],
53
+ [type="image"],
54
+ [type="radio"],
55
+ [type="range"],
56
+ [type="reset"],
57
+ [type="submit"]
58
+ ),
59
+ select,
60
+ textarea {
61
+ color: var(--color-body-text);
62
+ background-color: white;
63
+ border: var(--border-s) solid var(--color-outline);
64
+ font-size: 0.9em;
65
+ padding: var(--field-padding);
66
+ border-radius: var(--field-radius);
67
+ transition-duration: 200ms;
68
+ transition-property: color, box-shadow, border-color;
69
+ transition-timing-function: ease;
70
+ font-family: var(--font-family-ui);
71
+
72
+ @media (prefers-color-scheme: dark) {
73
+ background-color: black;
74
+ }
75
+
76
+ &:focus {
77
+ outline: 0;
78
+ border-color: var(--color-brand-5);
79
+ box-shadow:
80
+ 0 0 0 0.1em var(--color-brand-5),
81
+ 0 0 0 calc(0.2em + var(--border-s)) var(--color-brand-transparent);
82
+ }
83
+
84
+ &:disabled {
85
+ opacity: 0.7;
86
+ cursor: not-allowed;
87
+ }
88
+
89
+ // Not using :read-only because it matches additional elements (e.g., every color input)
90
+ &[readonly] {
91
+ cursor: not-allowed;
92
+ border-style: dashed;
93
+
94
+ &:focus {
95
+ outline: 0;
96
+ border-style: solid;
97
+ border-color: var(--color-gray-5);
98
+ box-shadow:
99
+ 0 0 0 0.1em var(--color-gray-5),
100
+ 0 0 0 calc(0.2em + var(--border-s)) var(--color-gray-transparent);
101
+ }
102
+ }
103
+
104
+ &:user-invalid,
105
+ &[aria-invalid="true"] {
106
+ border-color: var(--color-red-5);
107
+ box-shadow: 0 0 0 0.1em var(--color-red-5);
108
+
109
+ &:focus {
110
+ outline: 0;
111
+ border-color: var(--color-red-5);
112
+ box-shadow:
113
+ 0 0 0 0.1em var(--color-red-5),
114
+ 0 0 0 calc(0.2em + var(--border-s)) var(--color-red-transparent);
115
+ }
116
+ }
117
+ }
118
+
119
+ input[type="color"] {
120
+ inline-size: auto;
121
+ block-size: auto;
122
+ cursor: pointer;
123
+
124
+ &::-webkit-color-swatch-wrapper {
125
+ padding: 0;
126
+ }
127
+
128
+ &::-webkit-color-swatch {
129
+ border: 0;
130
+ block-size: 1em;
131
+ inline-size: 1.62em;
132
+ border-radius: var(--radius-s);
133
+ }
134
+
135
+ &::-moz-color-swatch {
136
+ border: 0;
137
+ block-size: 1em;
138
+ inline-size: 1.62em;
139
+ border-radius: var(--radius-s);
140
+ }
141
+ }
142
+
143
+ select {
144
+ background-image: #{utils.svg-to-data-url(
145
+ '<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="none" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" d="m6 9l6 6l6-6"/></svg>'
146
+ )};
147
+ background-position: center right 0.25em;
148
+ background-size: auto 75%;
149
+ background-repeat: no-repeat;
150
+ cursor: pointer;
151
+ appearance: none;
152
+ padding-inline-end: calc(2 * var(--space-2xs) + 1em);
153
+
154
+ @media (prefers-color-scheme: dark) {
155
+ background-image: #{utils.svg-to-data-url(
156
+ '<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="none" stroke="white" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" d="m6 9l6 6l6-6"/></svg>'
157
+ )};
158
+ }
159
+
160
+ &:dir(rtl) {
161
+ background-position: center left 0.25em;
162
+ }
163
+ }
164
+
165
+ .help-text {
166
+ font-size: 0.9em;
167
+ color: var(--color-body-text-alt);
168
+ font-weight: var(--font-weight-normal);
169
+ margin: -0.25em 0 0;
170
+ position: relative;
171
+ }
172
+
173
+ .error-message {
174
+ transition: opacity 200ms ease;
175
+ opacity: 0;
176
+ font-size: 0.9em;
177
+ border: 0;
178
+ padding: 0;
179
+ margin: 0;
180
+ font-weight: var(--font-weight-semibold);
181
+ display: flex;
182
+ align-items: center;
183
+ gap: 2px;
184
+
185
+ &::before {
186
+ content: "";
187
+ mask-image: #{utils.svg-to-data-url(
188
+ '<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 256 256"><path fill="#888888" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m37.66 130.34a8 8 0 0 1-11.32 11.32L128 139.31l-26.34 26.35a8 8 0 0 1-11.32-11.32L116.69 128l-26.35-26.34a8 8 0 0 1 11.32-11.32L128 116.69l26.34-26.35a8 8 0 0 1 11.32 11.32L139.31 128Z"/></svg>'
189
+ )};
190
+ mask-size: contain;
191
+ mask-repeat: no-repeat;
192
+ mask-position: center;
193
+ background-color: currentcolor;
194
+ display: inline-block;
195
+ height: 1.2em;
196
+ width: 1.2em;
197
+ }
198
+ }
199
+
200
+ .input-group {
201
+ display: flex;
202
+ flex-direction: row;
203
+ align-items: stretch;
204
+
205
+ > * {
206
+ border-radius: 0 !important;
207
+ z-index: 1;
208
+ }
209
+
210
+ > :first-child {
211
+ border-start-start-radius: var(--field-radius) !important;
212
+ border-end-start-radius: var(--field-radius) !important;
213
+ }
214
+
215
+ > :last-child {
216
+ border-end-end-radius: var(--field-radius) !important;
217
+ border-start-end-radius: var(--field-radius) !important;
218
+ }
219
+
220
+ > :focus-visible {
221
+ z-index: 2;
222
+ }
223
+
224
+ > :is(.prefix, .suffix, .action) {
225
+ user-select: none;
226
+ -webkit-user-drag: none;
227
+ display: flex;
228
+ font-weight: var(--font-weight-normal);
229
+ color: var(--color-gray-3);
230
+ background-color: var(--color-gray-9);
231
+ border: var(--border-s) solid var(--color-outline);
232
+ padding: var(--space-3xs) var(--space-xs);
233
+ align-items: center;
234
+ justify-content: center;
235
+ font-size: 0.9em;
236
+
237
+ :is(img, svg) {
238
+ height: 1.15em;
239
+ width: auto;
240
+ }
241
+ }
242
+
243
+ > .prefix {
244
+ border-inline-end: 0;
245
+ }
246
+
247
+ > .suffix {
248
+ border-inline-start: 0;
249
+ }
250
+
251
+ > .action {
252
+ cursor: pointer;
253
+ color: var(--color-brand-3);
254
+ border-inline-start: 0;
255
+ transition-property: box-shadow, background-color;
256
+ transition-timing-function: ease;
257
+ transition-duration: 200ms;
258
+
259
+ &:hover {
260
+ background-color: var(--color-gray-8);
261
+ }
262
+
263
+ &:active {
264
+ background-color: var(--color-gray-7);
265
+ }
266
+
267
+ &:focus-visible {
268
+ border-color: var(--color-brand-5);
269
+ border-inline-start-width: var(--border-s);
270
+ border-inline-start-style: solid;
271
+ box-shadow:
272
+ 0 0 0 0.1em var(--color-brand-5),
273
+ 0 0 0 calc(0.2em + var(--border-s)) var(--color-brand-transparent);
274
+ outline: 0;
275
+ }
276
+ }
277
+
278
+ > :is(input, select, textarea) {
279
+ width: 100%;
280
+
281
+ &:has(~ .action:focus-visible) {
282
+ border-inline-end-width: 0;
283
+ }
284
+ }
285
+ }
286
+ }
287
+
288
+ fieldset {
289
+ border: var(--border-s) solid var(--color-outline);
290
+ border-radius: var(--radius-l);
291
+
292
+ legend {
293
+ color: var(--color-body-text);
294
+ font-weight: var(--font-weight-semibold);
295
+ }
296
+ }
297
+
298
+ input[type="checkbox"],
299
+ input[type="radio"] {
300
+ accent-color: var(--color-brand-5);
301
+ }
@@ -0,0 +1,23 @@
1
+ hr,
2
+ .hr {
3
+ background-color: var(--color-outline);
4
+ border: 0;
5
+ outline: 0;
6
+ width: 100%;
7
+ height: var(--border-s);
8
+ display: block;
9
+ margin: var(--space-xs) 0;
10
+ print-color-adjust: exact;
11
+
12
+ &.invisible {
13
+ visibility: hidden;
14
+ }
15
+
16
+ &.vertical {
17
+ display: inline-block;
18
+ width: var(--border-s);
19
+ height: 100%;
20
+ min-height: 1em;
21
+ margin: 0 var(--space-xs);
22
+ }
23
+ }