@shift-css/core 0.4.0 → 0.5.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,184 @@
1
+ dialog[s-modal]:not([open]) {
2
+ display: none;
3
+ }
4
+
5
+ :where(dialog[s-modal]) {
6
+ --_modal-bg: var(--s-surface-raised);
7
+ --_modal-border: var(--s-border-muted);
8
+ --_modal-radius: var(--s-radius-xl);
9
+ --_modal-shadow: var(--s-shadow-2xl);
10
+ --_modal-padding: var(--s-space-4);
11
+ --_modal-max-width: 32rem;
12
+ width: min(var(--_modal-max-width), calc(100vw - var(--s-space-4) * 2));
13
+ max-height: calc(100vh - var(--s-space-4) * 2);
14
+ max-width: var(--_modal-max-width);
15
+ background-color: var(--_modal-bg);
16
+ border-radius: var(--_modal-radius);
17
+ box-shadow: var(--_modal-shadow);
18
+ border: none;
19
+ margin: auto;
20
+ padding: 0;
21
+
22
+ &[open] {
23
+ flex-direction: column;
24
+ display: flex;
25
+ }
26
+
27
+ color: var(--s-text-primary);
28
+ }
29
+
30
+ dialog[s-modal][open] {
31
+ animation: s-modal-scale-in var(--s-duration-200) var(--s-ease-out);
32
+ }
33
+
34
+ dialog[s-modal]:focus-visible {
35
+ outline: 2px solid var(--s-focus-ring);
36
+ outline-offset: 2px;
37
+ }
38
+
39
+ @keyframes s-modal-scale-in {
40
+ from {
41
+ opacity: 0;
42
+ transform: scale(.95)translateY(-10px);
43
+ }
44
+
45
+ to {
46
+ opacity: 1;
47
+ transform: scale(1)translateY(0);
48
+ }
49
+ }
50
+
51
+ dialog[s-modal]::backdrop {
52
+ backdrop-filter: blur(4px);
53
+ animation: s-modal-backdrop-in var(--s-duration-200) var(--s-ease-out);
54
+ background: oklch(0% 0 0 / .5);
55
+ }
56
+
57
+ @keyframes s-modal-backdrop-in {
58
+ from {
59
+ opacity: 0;
60
+ }
61
+
62
+ to {
63
+ opacity: 1;
64
+ }
65
+ }
66
+
67
+ dialog[s-modal][s-size="sm"] {
68
+ --_modal-max-width: 25rem;
69
+ }
70
+
71
+ dialog[s-modal][s-size="lg"] {
72
+ --_modal-max-width: 43.75rem;
73
+ }
74
+
75
+ dialog[s-modal][s-size="full"] {
76
+ --_modal-max-width: 100vw;
77
+ --_modal-radius: 0;
78
+ width: 100vw;
79
+ height: 100vh;
80
+ max-height: 100vh;
81
+ }
82
+
83
+ dialog[s-modal][s-position="top"] {
84
+ margin-top: var(--s-space-8);
85
+ margin-bottom: auto;
86
+ }
87
+
88
+ dialog[s-modal][s-position="bottom"] {
89
+ margin-top: auto;
90
+ margin-bottom: var(--s-space-8);
91
+ }
92
+
93
+ dialog[s-modal][s-position="left"] {
94
+ margin-left: var(--s-space-8);
95
+ margin-right: auto;
96
+ }
97
+
98
+ dialog[s-modal][s-position="right"] {
99
+ margin-left: auto;
100
+ margin-right: var(--s-space-8);
101
+ }
102
+
103
+ :where([s-modal-header]) {
104
+ justify-content: space-between;
105
+ align-items: center;
106
+ gap: var(--s-space-4);
107
+ padding: var(--_modal-padding, var(--s-space-4));
108
+ border-bottom: 1px solid var(--s-border-muted);
109
+ display: flex;
110
+
111
+ & > h1, & > h2, & > h3 {
112
+ font-size: var(--s-text-lg);
113
+ font-weight: var(--s-font-semibold);
114
+ color: inherit;
115
+ margin: 0;
116
+ line-height: 1.25;
117
+ }
118
+ }
119
+
120
+ :where([s-modal-body]) {
121
+ padding: var(--_modal-padding, var(--s-space-4));
122
+ overscroll-behavior: contain;
123
+ flex: 1;
124
+ overflow-y: auto;
125
+ }
126
+
127
+ :where([s-modal-footer]) {
128
+ justify-content: flex-end;
129
+ align-items: center;
130
+ gap: var(--s-space-3);
131
+ padding: var(--_modal-padding, var(--s-space-4));
132
+ border-top: 1px solid var(--s-border-muted);
133
+ display: flex;
134
+ }
135
+
136
+ :where([s-modal-close]) {
137
+ cursor: pointer;
138
+ border-radius: var(--s-radius-full);
139
+ min-width: 2.75rem;
140
+ min-height: 2.75rem;
141
+ font-size: var(--s-text-xl);
142
+ color: var(--s-text-secondary);
143
+ transition: background-color var(--s-duration-150) var(--s-ease-out), color var(--s-duration-150) var(--s-ease-out);
144
+ background: none;
145
+ border: none;
146
+ justify-content: center;
147
+ align-items: center;
148
+ padding: 0;
149
+ line-height: 1;
150
+ display: inline-flex;
151
+
152
+ &:hover {
153
+ background-color: var(--s-surface-sunken);
154
+ color: var(--s-text-primary);
155
+ }
156
+
157
+ &:focus-visible {
158
+ outline: 2px solid var(--s-focus-ring);
159
+ outline-offset: 2px;
160
+ }
161
+
162
+ &:active {
163
+ background-color: var(--s-border-default);
164
+ }
165
+ }
166
+
167
+ @media (forced-colors: active) {
168
+ dialog[s-modal] {
169
+ border: 2px solid canvastext;
170
+ }
171
+
172
+ dialog[s-modal]::backdrop {
173
+ backdrop-filter: none;
174
+ background: #000000bf;
175
+ }
176
+
177
+ [s-modal-header], [s-modal-footer] {
178
+ border-color: canvastext;
179
+ }
180
+
181
+ [s-modal-close] {
182
+ border: 1px solid buttontext;
183
+ }
184
+ }
@@ -0,0 +1,263 @@
1
+ :where([s-prose]) {
2
+ --_prose-body: var(--s-text-base);
3
+ --_prose-body-weight: var(--s-font-normal);
4
+ --_prose-leading: var(--s-leading-relaxed);
5
+ --_prose-link-color: var(--s-primary-600);
6
+ --_prose-link-hover: var(--s-primary-700);
7
+ --_prose-code-bg: var(--s-neutral-100);
8
+ --_prose-code-color: var(--s-danger-600);
9
+ --_prose-pre-bg: var(--s-neutral-900);
10
+ --_prose-pre-color: var(--s-neutral-100);
11
+ --_prose-border-color: var(--s-border-default);
12
+ --_prose-quote-border: var(--s-primary-500);
13
+ font-size: var(--_prose-body);
14
+ font-weight: var(--_prose-body-weight);
15
+ line-height: var(--_prose-leading);
16
+ color: var(--s-text-primary);
17
+ max-width: 65ch;
18
+ }
19
+
20
+ [s-prose="full"] {
21
+ max-width: none;
22
+ }
23
+
24
+ :where([s-prose]) :where(h1, h2, h3, h4, h5, h6) {
25
+ color: var(--s-text-primary);
26
+ font-weight: var(--s-font-bold);
27
+ line-height: var(--s-leading-tight);
28
+ margin-top: 1.5em;
29
+ margin-bottom: .5em;
30
+ }
31
+
32
+ :where([s-prose]) :where(h1) {
33
+ font-size: var(--s-text-4xl);
34
+ margin-top: 0;
35
+ }
36
+
37
+ :where([s-prose]) :where(h2) {
38
+ font-size: var(--s-text-3xl);
39
+ border-bottom: 1px solid var(--_prose-border-color);
40
+ padding-bottom: .25em;
41
+ }
42
+
43
+ :where([s-prose]) :where(h3) {
44
+ font-size: var(--s-text-2xl);
45
+ }
46
+
47
+ :where([s-prose]) :where(h4) {
48
+ font-size: var(--s-text-xl);
49
+ }
50
+
51
+ :where([s-prose]) :where(h5) {
52
+ font-size: var(--s-text-lg);
53
+ }
54
+
55
+ :where([s-prose]) :where(h6) {
56
+ font-size: var(--s-text-base);
57
+ color: var(--s-text-secondary);
58
+ }
59
+
60
+ :where([s-prose]) :where(p) {
61
+ margin-bottom: 1.25em;
62
+ }
63
+
64
+ :where([s-prose]) :where(strong, b) {
65
+ font-weight: var(--s-font-semibold);
66
+ color: var(--s-text-primary);
67
+ }
68
+
69
+ :where([s-prose]) :where(em, i) {
70
+ font-style: italic;
71
+ }
72
+
73
+ :where([s-prose]) :where(small) {
74
+ font-size: var(--s-text-sm);
75
+ }
76
+
77
+ :where([s-prose]) :where(a) {
78
+ color: var(--_prose-link-color);
79
+ text-underline-offset: 2px;
80
+ transition: color var(--s-duration-150) var(--s-ease-out);
81
+ text-decoration: underline 1px;
82
+
83
+ &:hover {
84
+ color: var(--_prose-link-hover);
85
+ }
86
+ }
87
+
88
+ :where([s-prose]) :where(ul, ol) {
89
+ margin-bottom: 1.25em;
90
+ padding-left: 1.5em;
91
+ }
92
+
93
+ :where([s-prose]) :where(ul) {
94
+ list-style-type: disc;
95
+ }
96
+
97
+ :where([s-prose]) :where(ol) {
98
+ list-style-type: decimal;
99
+ }
100
+
101
+ :where([s-prose]) :where(li) {
102
+ margin-bottom: .5em;
103
+
104
+ &::marker {
105
+ color: var(--s-text-tertiary);
106
+ }
107
+ }
108
+
109
+ :where([s-prose]) :where(li > ul, li > ol) {
110
+ margin-top: .5em;
111
+ margin-bottom: 0;
112
+ }
113
+
114
+ :where([s-prose]) :where(dl) {
115
+ margin-bottom: 1.25em;
116
+ }
117
+
118
+ :where([s-prose]) :where(dt) {
119
+ font-weight: var(--s-font-semibold);
120
+ margin-top: 1em;
121
+ }
122
+
123
+ :where([s-prose]) :where(dd) {
124
+ margin-bottom: .5em;
125
+ margin-left: 1.5em;
126
+ }
127
+
128
+ :where([s-prose]) :where(blockquote) {
129
+ border-left: 4px solid var(--_prose-quote-border);
130
+ background-color: var(--s-surface-sunken);
131
+ border-radius: 0 var(--s-radius-md) var(--s-radius-md) 0;
132
+ color: var(--s-text-secondary);
133
+ margin: 1.5em 0;
134
+ padding: .5em 1em;
135
+ font-style: italic;
136
+
137
+ & p:last-child {
138
+ margin-bottom: 0;
139
+ }
140
+ }
141
+
142
+ :where([s-prose]) :where(code) {
143
+ font-family: var(--s-font-mono);
144
+ background-color: var(--_prose-code-bg);
145
+ color: var(--_prose-code-color);
146
+ border-radius: var(--s-radius-sm);
147
+ padding: .125em .375em;
148
+ font-size: .875em;
149
+ }
150
+
151
+ :where([s-prose]) :where(pre) {
152
+ background-color: var(--_prose-pre-bg);
153
+ color: var(--_prose-pre-color);
154
+ border-radius: var(--s-radius-lg);
155
+ font-size: var(--s-text-sm);
156
+ line-height: var(--s-leading-normal);
157
+ margin: 1.5em 0;
158
+ padding: 1em;
159
+ overflow-x: auto;
160
+
161
+ & code {
162
+ color: inherit;
163
+ font-size: inherit;
164
+ background: none;
165
+ border-radius: 0;
166
+ padding: 0;
167
+ }
168
+ }
169
+
170
+ :where([s-prose]) :where(kbd) {
171
+ font-family: var(--s-font-mono);
172
+ background-color: var(--s-neutral-200);
173
+ color: var(--s-text-primary);
174
+ border-radius: var(--s-radius-sm);
175
+ border: 1px solid var(--s-neutral-300);
176
+ box-shadow: 0 1px 0 var(--s-neutral-400);
177
+ padding: .125em .375em;
178
+ font-size: .875em;
179
+ }
180
+
181
+ :where([s-prose]) :where(hr) {
182
+ border: none;
183
+ border-top: 1px solid var(--_prose-border-color);
184
+ margin: 2em 0;
185
+ }
186
+
187
+ :where([s-prose]) :where(img) {
188
+ border-radius: var(--s-radius-lg);
189
+ max-width: 100%;
190
+ height: auto;
191
+ }
192
+
193
+ :where([s-prose]) :where(figure) {
194
+ margin: 1.5em 0;
195
+ }
196
+
197
+ :where([s-prose]) :where(figcaption) {
198
+ font-size: var(--s-text-sm);
199
+ color: var(--s-text-secondary);
200
+ text-align: center;
201
+ margin-top: .75em;
202
+ }
203
+
204
+ :where([s-prose]) :where(table) {
205
+ border-collapse: collapse;
206
+ width: 100%;
207
+ font-size: var(--s-text-sm);
208
+ margin: 1.5em 0;
209
+ }
210
+
211
+ :where([s-prose]) :where(thead) {
212
+ border-bottom: 2px solid var(--_prose-border-color);
213
+ }
214
+
215
+ :where([s-prose]) :where(th) {
216
+ font-weight: var(--s-font-semibold);
217
+ text-align: left;
218
+ background-color: var(--s-surface-sunken);
219
+ padding: .75em 1em;
220
+ }
221
+
222
+ :where([s-prose]) :where(td) {
223
+ border-bottom: 1px solid var(--_prose-border-color);
224
+ padding: .75em 1em;
225
+ }
226
+
227
+ :where([s-prose]) :where(tbody tr:hover) {
228
+ background-color: var(--s-surface-sunken);
229
+ }
230
+
231
+ [s-prose][s-size="sm"] {
232
+ --_prose-body: var(--s-text-sm);
233
+ }
234
+
235
+ [s-prose][s-size="lg"] {
236
+ --_prose-body: var(--s-text-lg);
237
+ }
238
+
239
+ @media (prefers-color-scheme: dark) {
240
+ :where([s-prose]) {
241
+ --_prose-link-color: var(--s-primary-400);
242
+ --_prose-link-hover: var(--s-primary-300);
243
+ --_prose-code-bg: var(--s-neutral-800);
244
+ --_prose-code-color: var(--s-danger-400);
245
+ --_prose-pre-bg: var(--s-neutral-950);
246
+ --_prose-pre-color: var(--s-neutral-200);
247
+ }
248
+
249
+ :where([s-prose]) :where(kbd) {
250
+ background-color: var(--s-neutral-700);
251
+ border-color: var(--s-neutral-600);
252
+ box-shadow: 0 1px 0 var(--s-neutral-500);
253
+ }
254
+ }
255
+
256
+ :root[style*="color-scheme: dark"] :where([s-prose]), :root[style*="color-scheme:dark"] :where([s-prose]) {
257
+ --_prose-link-color: var(--s-primary-400);
258
+ --_prose-link-hover: var(--s-primary-300);
259
+ --_prose-code-bg: var(--s-neutral-800);
260
+ --_prose-code-color: var(--s-danger-400);
261
+ --_prose-pre-bg: var(--s-neutral-950);
262
+ --_prose-pre-color: var(--s-neutral-200);
263
+ }
@@ -0,0 +1,86 @@
1
+ :where([s-skip-link]) {
2
+ --_skip-bg: var(--s-primary-600);
3
+ --_skip-color: white;
4
+ --_skip-radius: var(--s-radius-md);
5
+ --_skip-shadow: var(--s-shadow-lg);
6
+ --_skip-z: 9999;
7
+ z-index: var(--_skip-z);
8
+ align-items: center;
9
+ gap: var(--s-space-2);
10
+ padding: var(--s-space-3) var(--s-space-6);
11
+ background-color: var(--_skip-bg);
12
+ color: var(--_skip-color);
13
+ font-size: var(--s-text-sm);
14
+ font-weight: var(--s-font-semibold);
15
+ border-radius: var(--_skip-radius);
16
+ box-shadow: var(--_skip-shadow);
17
+ white-space: nowrap;
18
+ transition: top var(--s-duration-200) var(--s-ease-out), opacity var(--s-duration-200) var(--s-ease-out);
19
+ opacity: 0;
20
+ text-decoration: none;
21
+ display: inline-flex;
22
+ position: fixed;
23
+ top: -100%;
24
+ left: 50%;
25
+ transform: translateX(-50%);
26
+ }
27
+
28
+ [s-skip-link]:focus, [s-skip-link]:focus-visible {
29
+ top: var(--s-space-4);
30
+ opacity: 1;
31
+ box-shadow: var(--_skip-shadow), 0 0 0 3px white, 0 0 0 5px var(--_skip-bg);
32
+ outline: none;
33
+ }
34
+
35
+ [s-skip-link-group] {
36
+ z-index: 9999;
37
+ align-items: center;
38
+ gap: var(--s-space-2);
39
+ padding: var(--s-space-2);
40
+ flex-direction: column;
41
+ display: flex;
42
+ position: fixed;
43
+ top: 0;
44
+ left: 50%;
45
+ transform: translateX(-50%);
46
+ }
47
+
48
+ [s-skip-link-group] [s-skip-link] {
49
+ position: relative;
50
+ top: -200%;
51
+ left: 0;
52
+ transform: none;
53
+ }
54
+
55
+ [s-skip-link-group] [s-skip-link]:focus, [s-skip-link-group] [s-skip-link]:focus-visible {
56
+ top: 0;
57
+ }
58
+
59
+ [s-skip-link="secondary"] {
60
+ --_skip-bg: var(--s-neutral-800);
61
+ }
62
+
63
+ [s-skip-link="contrast"] {
64
+ --_skip-bg: var(--s-neutral-950);
65
+ --_skip-color: var(--s-neutral-50);
66
+ }
67
+
68
+ @media (prefers-reduced-motion: reduce) {
69
+ [s-skip-link] {
70
+ transition: none;
71
+ }
72
+ }
73
+
74
+ @media (prefers-color-scheme: dark) {
75
+ :where([s-skip-link]:not([s-skip-link="secondary"]):not([s-skip-link="contrast"])) {
76
+ --_skip-bg: var(--s-primary-500);
77
+ }
78
+
79
+ [s-skip-link]:focus, [s-skip-link]:focus-visible {
80
+ box-shadow: var(--_skip-shadow), 0 0 0 3px var(--s-neutral-900), 0 0 0 5px var(--_skip-bg);
81
+ }
82
+ }
83
+
84
+ :root[style*="color-scheme: dark"] :where([s-skip-link]:not([s-skip-link="secondary"]):not([s-skip-link="contrast"])), :root[style*="color-scheme:dark"] :where([s-skip-link]:not([s-skip-link="secondary"]):not([s-skip-link="contrast"])) {
85
+ --_skip-bg: var(--s-primary-500);
86
+ }
@@ -0,0 +1,118 @@
1
+ :where([s-surface]) {
2
+ --_surface-bg: var(--s-surface-base);
3
+ --_surface-padding: var(--s-space-4);
4
+ --_surface-radius: var(--s-radius-lg);
5
+ background-color: var(--_surface-bg);
6
+ padding: var(--_surface-padding);
7
+ border-radius: var(--_surface-radius);
8
+ color: var(--s-text-primary);
9
+ container-type: inline-size;
10
+
11
+ @supports (color: oklch(from red l c h)) {
12
+ color: oklch(from var(--_surface-bg) clamp(.15, calc((.55 - l) * 1000 + .15), .95) 0 0);
13
+ }
14
+
15
+ @supports (color: contrast-color(red)) {
16
+ color: contrast-color(var(--_surface-bg));
17
+ }
18
+ }
19
+
20
+ [s-surface="flat"] {
21
+ --_surface-bg: var(--s-surface-base);
22
+ }
23
+
24
+ [s-surface="sunken"] {
25
+ --_surface-bg: var(--s-surface-sunken);
26
+ box-shadow: var(--s-shadow-inner);
27
+ }
28
+
29
+ [s-surface="raised"] {
30
+ --_surface-bg: var(--s-surface-raised);
31
+ box-shadow: var(--s-shadow-md);
32
+ }
33
+
34
+ [s-surface="floating"] {
35
+ --_surface-bg: var(--s-surface-raised);
36
+ box-shadow: var(--s-shadow-xl);
37
+ }
38
+
39
+ [s-surface][s-bordered] {
40
+ border: 1px solid var(--s-border-default);
41
+ }
42
+
43
+ [s-surface][s-interactive] {
44
+ cursor: pointer;
45
+ transition: transform var(--s-duration-150) var(--s-ease-out), box-shadow var(--s-duration-150) var(--s-ease-out);
46
+
47
+ &:hover {
48
+ box-shadow: var(--s-shadow-lg);
49
+ transform: translateY(-2px);
50
+ }
51
+
52
+ &:active {
53
+ box-shadow: var(--s-shadow-sm);
54
+ transform: translateY(0);
55
+ }
56
+
57
+ &:focus-visible {
58
+ outline: 2px solid var(--s-focus-ring);
59
+ outline-offset: 2px;
60
+ }
61
+ }
62
+
63
+ [s-surface="primary"] {
64
+ --_surface-bg: var(--s-primary-700);
65
+ background-color: #06a;
66
+ background-color: var(--_surface-bg);
67
+ color: #fff;
68
+ }
69
+
70
+ [s-surface="secondary"] {
71
+ --_surface-bg: var(--s-secondary-700);
72
+ background-color: #64a;
73
+ background-color: var(--_surface-bg);
74
+ color: #fff;
75
+ }
76
+
77
+ [s-surface="accent"] {
78
+ --_surface-bg: var(--s-accent-700);
79
+ background-color: #a46;
80
+ background-color: var(--_surface-bg);
81
+ color: #fff;
82
+ }
83
+
84
+ [s-surface="success"] {
85
+ --_surface-bg: var(--s-state-success-bg);
86
+ background-color: #d4edda;
87
+ background-color: var(--_surface-bg);
88
+ border-left: 4px solid var(--s-state-success);
89
+ color: #1a1a1a;
90
+ }
91
+
92
+ [s-surface="warning"] {
93
+ --_surface-bg: var(--s-state-warning-bg);
94
+ background-color: #fff3cd;
95
+ background-color: var(--_surface-bg);
96
+ border-left: 4px solid var(--s-state-warning);
97
+ color: #1a1a1a;
98
+ }
99
+
100
+ [s-surface="danger"] {
101
+ --_surface-bg: var(--s-state-danger-bg);
102
+ background-color: #f8d7da;
103
+ background-color: var(--_surface-bg);
104
+ border-left: 4px solid var(--s-state-danger);
105
+ color: #1a1a1a;
106
+ }
107
+
108
+ @container (width <= 20rem) {
109
+ :where([s-surface]) {
110
+ --_surface-padding: var(--s-space-3);
111
+ }
112
+ }
113
+
114
+ @container (width >= 40rem) {
115
+ :where([s-surface]) {
116
+ --_surface-padding: var(--s-space-6);
117
+ }
118
+ }