@netlify/spark-ui 1.2.0 → 1.3.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.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@netlify/spark-ui",
3
3
  "description": "Assets, design tokens, components, and utilities",
4
- "version": "1.2.0",
4
+ "version": "1.3.0",
5
5
  "type": "module",
6
6
  "main": "dist/components/preact/index.js",
7
7
  "types": "dist/components/preact/index.d.ts",
@@ -0,0 +1,69 @@
1
+ ---
2
+ interface Props {
3
+ id?: string;
4
+ href: string;
5
+ text?: string;
6
+ class?: string;
7
+ }
8
+
9
+ const { id, href, text, class: className, ...rest } = Astro.props;
10
+ ---
11
+
12
+ <a id={id} class:list={['n-action-link', className]} href={href} {...rest}>
13
+ <span>{text ? text : <slot />}</span><div class="n-action-link-icon">
14
+ <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" fill="none" viewBox="0 0 14 14">
15
+ <g stroke="currentColor" stroke-linecap="square" stroke-width="1.564" clip-path="url(#a)">
16
+ <path stroke-linejoin="round" d="M3.417 10.556 9.4 4.572"></path>
17
+ <path d="M9.88 9.381V4.093H4.59"></path>
18
+ </g>
19
+ </svg>
20
+ </div>
21
+ </a>
22
+
23
+ <style>
24
+ .n-action-link {
25
+ display: inline-block;
26
+ font-weight: var(--font-weight-medium);
27
+ font-size: var(--font-size-text-md);
28
+ text-wrap: pretty; /** Prevents orphan icon */
29
+ text-decoration: none;
30
+ color: var(--color-text);
31
+
32
+ span {
33
+ text-decoration: underline;
34
+ text-decoration-color: var(--color-link);
35
+ text-underline-offset: 0.1em;
36
+ }
37
+ }
38
+
39
+ .n-action-link-icon {
40
+ display: inline-flex;
41
+ overflow: hidden;
42
+ margin-inline-start: 0.1em;
43
+
44
+ svg {
45
+ color: var(--color-icon);
46
+ transition: translate 0.1s ease-out;
47
+ }
48
+ }
49
+
50
+ @media (any-hover: hover) {
51
+ .n-action-link:where(:hover, :focus-visible) .n-action-link-icon svg {
52
+ --_offset: 100%;
53
+ animation: n-action-link-hover 350ms cubic-bezier(0.85, 0, 0.15, 1) forwards;
54
+ }
55
+
56
+ @keyframes n-action-link-hover {
57
+ 0%,
58
+ 100% {
59
+ translate: 0 0;
60
+ }
61
+ 30% {
62
+ translate: calc(var(--_offset) * 2) calc(var(--_offset) * -2);
63
+ }
64
+ 31% {
65
+ translate: calc(var(--_offset) * -1) var(--_offset);
66
+ }
67
+ }
68
+ }
69
+ </style>
@@ -0,0 +1,120 @@
1
+ ---
2
+ import ActionLink from './ActionLink.astro';
3
+ import Eyebrow from './Eyebrow.astro';
4
+
5
+ interface Props {
6
+ as?: HTMLElement;
7
+ eyebrow?: string;
8
+ paragraph?: string | HTMLElement;
9
+ headline?: string | HTMLElement;
10
+ link?: {
11
+ id?: string;
12
+ href: string;
13
+ text: string;
14
+ };
15
+ isCardClickable?: boolean;
16
+ }
17
+
18
+ const {
19
+ as = 'div',
20
+ eyebrow,
21
+ paragraph,
22
+ headline,
23
+ link,
24
+ isCardClickable,
25
+ class: className,
26
+ ...rest
27
+ } = Astro.props;
28
+
29
+ const Element = as;
30
+ ---
31
+
32
+ <Element class:list={['n-card n-flow', isCardClickable && 'n-card-clickable', className]} {...rest}>
33
+ {
34
+ Astro.slots.has('icon') && (
35
+ <div class="n-card-icon">
36
+ <slot name="icon" />
37
+ </div>
38
+ )
39
+ }
40
+ {
41
+ Astro.slots.has('image') && (
42
+ <div class="n-card-image">
43
+ <slot name="image" />
44
+ </div>
45
+ )
46
+ }
47
+ {eyebrow && <Eyebrow class="n-card-eyebrow">{eyebrow}</Eyebrow>}
48
+ {headline && <div class="n-card-headline" set:html={headline} />}
49
+ {paragraph && <div class="n-card-paragraph" set:html={paragraph} />}
50
+ <slot />
51
+ {
52
+ link && (
53
+ <ActionLink class="n-card-link" id={link.id} href={link.href}>
54
+ {link.text}
55
+ </ActionLink>
56
+ )
57
+ }
58
+ </Element>
59
+
60
+ <style>
61
+ .n-card {
62
+ position: relative;
63
+ padding: var(--space-m);
64
+ background-color: var(--card-bg-color);
65
+ border: 1px solid var(--card-border-color);
66
+ border-radius: var(--radius-m);
67
+ }
68
+
69
+ .n-card-headline {
70
+ --n-flow-space: var(--space-xs);
71
+ font-size: var(--font-size-display-sm);
72
+ font-family: var(--font-family-display);
73
+ font-weight: var(--font-weight-bold);
74
+ line-height: var(--line-height-heading);
75
+ }
76
+
77
+ .n-card-paragraph {
78
+ line-height: var(--line-height-text);
79
+ }
80
+
81
+ .n-card-eyebrow {
82
+ --n-flow-space: var(--space-l);
83
+ }
84
+
85
+ .n-card-paragraph:nth-last-child(2) {
86
+ margin-block-end: auto;
87
+ }
88
+
89
+ .n-card-link {
90
+ --n-flow-space: var(--space-l);
91
+ align-self: flex-start;
92
+ }
93
+
94
+ .n-card-image :global(img, picture) {
95
+ width: 100%;
96
+ height: auto;
97
+ border-radius: var(--radius-s);
98
+ object-fit: cover;
99
+ }
100
+
101
+ /** Clickable card */
102
+ .n-card-clickable {
103
+ transition: border-color 100ms cubic-bezier(0.25, 1, 0.5, 1);
104
+
105
+ &:hover {
106
+ border-color: var(--card-border-color-hover);
107
+ transition-duration: 200ms;
108
+ }
109
+ }
110
+
111
+ .n-card-clickable .n-card-link {
112
+ position: static;
113
+
114
+ &::after {
115
+ content: '';
116
+ position: absolute;
117
+ inset: 0;
118
+ }
119
+ }
120
+ </style>
@@ -0,0 +1,19 @@
1
+ ---
2
+ const { as = 'div', class: className, ...rest } = Astro.props;
3
+
4
+ const Element = as;
5
+ ---
6
+
7
+ <Element class:list={['eyebrow', className]} {...rest}>
8
+ <slot />
9
+ </Element>
10
+
11
+ <style>
12
+ .eyebrow {
13
+ font-size: var(--font-size-text-sm);
14
+ font-family: var(--font-family-mono);
15
+ line-height: var(--line-height-none);
16
+ color: var(--eyebrow-text-color);
17
+ text-transform: uppercase;
18
+ }
19
+ </style>
@@ -1,10 +1,28 @@
1
- .cluster {
1
+ .n-cluster {
2
+ --_gap-default: var(--space-m);
2
3
  display: flex;
3
4
  flex-wrap: wrap;
4
- column-gap: var(--column-gap, var(--gap, var(--space-m)));
5
- row-gap: var(--row-gap, var(--gap, var(--space-m)));
5
+ column-gap: var(--n-cluster-column-gap, var(--n-cluster-gap, var(--_gap-default)));
6
+ row-gap: var(--n-cluster-row-gap, var(--n-cluster-gap, var(--_gap-default)));
6
7
  }
7
8
 
8
- .flow > * + * {
9
- margin-top: var(--flow-space, var(--space-m));
9
+ .n-flow {
10
+ display: flex;
11
+ flex-direction: column;
12
+ justify-content: var(--n-flow-justify, flex-start);
13
+ align-items: var(--n-flow-align, flex-start);
14
+
15
+ > * + * {
16
+ margin-block-start: var(--n-flow-space, var(--space-m));
17
+ }
18
+ }
19
+
20
+ .n-grid {
21
+ display: grid;
22
+ grid-template-columns: repeat(
23
+ var(--n-grid-repeat-count, auto-fill),
24
+ minmax(min(100%, var(--n-grid-column-min-size)), 1fr)
25
+ );
26
+ gap: var(--n-grid-gap, var(--space-m));
27
+ grid-auto-rows: var(--n-grid-auto-rows, auto);
10
28
  }
@@ -24,6 +24,9 @@
24
24
  --button-secondary-bg-color: color(srgb 0.047058823529411764 0.16470588235294117 0.16470588235294117 / 0.09803921568627451);
25
25
  --button-secondary-bg-color-hover: color(srgb 0.047058823529411764 0.16470588235294117 0.16470588235294117 / 0.14901960784313725);
26
26
  --button-secondary-text-color: var(--neutral-800);
27
+ --card-bg-color: var(--neutral-000);
28
+ --card-border-color: var(--neutral-200);
29
+ --card-border-color-hover: var(--neutral-300);
27
30
  --code-bg-color: var(--teal-900);
28
31
  --color-bg: var(--neutral-000);
29
32
  --color-bg-2: var(--neutral-100);
@@ -172,114 +175,6 @@
172
175
  --title-text-color: color(srgb 0.32941176470588235 0.35294117647058826 0.3803921568627451 / 0.7490196078431373);
173
176
  }
174
177
 
175
- @media (prefers-color-scheme: light) {
176
- :root {
177
- --active-switcher-tab-bg-color: color(srgb 0.047058823529411764 0.16470588235294117 0.16470588235294117 / 0.047058823529411764);
178
- --button-outline-bg-color: color(srgb 0 0 0 / 0);
179
- --button-outline-bg-color-hover: color(srgb 0.19607843137254902 0.9019607843137255 0.8862745098039215 / 0.2);
180
- --button-outline-stroke-color: var(--neutral-800);
181
- --button-outline-text-color: var(--neutral-800);
182
- --button-primary-bg-color: var(--teal-200);
183
- --button-primary-bg-color-hover: var(--teal-100);
184
- --button-primary-text-color: var(--neutral-800);
185
- --button-secondary-bg-color: color(srgb 0.047058823529411764 0.16470588235294117 0.16470588235294117 / 0.09803921568627451);
186
- --button-secondary-bg-color-hover: color(srgb 0.047058823529411764 0.16470588235294117 0.16470588235294117 / 0.14901960784313725);
187
- --button-secondary-text-color: var(--neutral-800);
188
- --code-bg-color: var(--teal-900);
189
- --color-bg: var(--neutral-000);
190
- --color-bg-2: var(--neutral-100);
191
- --color-bg-3: var(--neutral-200);
192
- --color-disabled-bg: var(--neutral-200);
193
- --color-disabled-border: var(--neutral-400);
194
- --color-disabled-text: var(--neutral-400);
195
- --color-icon: var(--blue-700);
196
- --color-invalid-bg: var(--red-100);
197
- --color-invalid-border: var(--red-600);
198
- --color-invalid-text: var(--red-600);
199
- --color-link: var(--blue-700);
200
- --color-logo-inactive: color(srgb 0.7019607843137254 0.7019607843137254 0.7019607843137254);
201
- --color-logo-spark: var(--teal-400);
202
- --color-logo-type: var(--teal-800);
203
- --color-stroke: color(srgb 0 0 0 / 0.14901960784313725);
204
- --color-success-bg: var(--green-100);
205
- --color-success-border: var(--green-300);
206
- --color-success-text: var(--green-800);
207
- --color-text: var(--neutral-600);
208
- --color-text-accent: var(--teal-000);
209
- --color-text-weak: var(--neutral-500);
210
- --color-text-weaker: var(--neutral-400);
211
- --color-warning-bg: var(--gold-100);
212
- --color-warning-border: var(--gold-300);
213
- --color-warning-text: var(--gold-800);
214
- --eyebrow-text-color: var(--blue-700);
215
- --heading-text-color: var(--neutral-800);
216
- --neutral-000: color(srgb 1 1 1);
217
- --neutral-100: color(srgb 0.9647058823529412 0.9647058823529412 0.9686274509803922);
218
- --neutral-200: color(srgb 0.9137254901960784 0.9215686274509803 0.9294117647058824);
219
- --neutral-300: color(srgb 0.8196078431372549 0.8352941176470589 0.8549019607843137);
220
- --neutral-400: color(srgb 0.615686274509804 0.6549019607843137 0.6980392156862745);
221
- --neutral-500: color(srgb 0.4666666666666667 0.5019607843137255 0.5372549019607843);
222
- --neutral-600: color(srgb 0.32941176470588235 0.35294117647058826 0.3803921568627451);
223
- --neutral-700: color(srgb 0.20784313725490197 0.22745098039215686 0.24313725490196078);
224
- --neutral-800: color(srgb 0.09411764705882353 0.10196078431372549 0.10980392156862745);
225
- --switcher-tab-bg-color: color(srgb 1 1 1 / 0.047058823529411764);
226
- --title-text-color: color(srgb 0.32941176470588235 0.35294117647058826 0.3803921568627451 / 0.7490196078431373);
227
- }
228
- }
229
-
230
- [data-theme="light"] {
231
- --active-switcher-tab-bg-color: color(srgb 0.047058823529411764 0.16470588235294117 0.16470588235294117 / 0.047058823529411764);
232
- --button-outline-bg-color: color(srgb 0 0 0 / 0);
233
- --button-outline-bg-color-hover: color(srgb 0.19607843137254902 0.9019607843137255 0.8862745098039215 / 0.2);
234
- --button-outline-stroke-color: var(--neutral-800);
235
- --button-outline-text-color: var(--neutral-800);
236
- --button-primary-bg-color: var(--teal-200);
237
- --button-primary-bg-color-hover: var(--teal-100);
238
- --button-primary-text-color: var(--neutral-800);
239
- --button-secondary-bg-color: color(srgb 0.047058823529411764 0.16470588235294117 0.16470588235294117 / 0.09803921568627451);
240
- --button-secondary-bg-color-hover: color(srgb 0.047058823529411764 0.16470588235294117 0.16470588235294117 / 0.14901960784313725);
241
- --button-secondary-text-color: var(--neutral-800);
242
- --code-bg-color: var(--teal-900);
243
- --color-bg: var(--neutral-000);
244
- --color-bg-2: var(--neutral-100);
245
- --color-bg-3: var(--neutral-200);
246
- --color-disabled-bg: var(--neutral-200);
247
- --color-disabled-border: var(--neutral-400);
248
- --color-disabled-text: var(--neutral-400);
249
- --color-icon: var(--blue-700);
250
- --color-invalid-bg: var(--red-100);
251
- --color-invalid-border: var(--red-600);
252
- --color-invalid-text: var(--red-600);
253
- --color-link: var(--blue-700);
254
- --color-logo-inactive: color(srgb 0.7019607843137254 0.7019607843137254 0.7019607843137254);
255
- --color-logo-spark: var(--teal-400);
256
- --color-logo-type: var(--teal-800);
257
- --color-stroke: color(srgb 0 0 0 / 0.14901960784313725);
258
- --color-success-bg: var(--green-100);
259
- --color-success-border: var(--green-300);
260
- --color-success-text: var(--green-800);
261
- --color-text: var(--neutral-600);
262
- --color-text-accent: var(--teal-000);
263
- --color-text-weak: var(--neutral-500);
264
- --color-text-weaker: var(--neutral-400);
265
- --color-warning-bg: var(--gold-100);
266
- --color-warning-border: var(--gold-300);
267
- --color-warning-text: var(--gold-800);
268
- --eyebrow-text-color: var(--blue-700);
269
- --heading-text-color: var(--neutral-800);
270
- --neutral-000: color(srgb 1 1 1);
271
- --neutral-100: color(srgb 0.9647058823529412 0.9647058823529412 0.9686274509803922);
272
- --neutral-200: color(srgb 0.9137254901960784 0.9215686274509803 0.9294117647058824);
273
- --neutral-300: color(srgb 0.8196078431372549 0.8352941176470589 0.8549019607843137);
274
- --neutral-400: color(srgb 0.615686274509804 0.6549019607843137 0.6980392156862745);
275
- --neutral-500: color(srgb 0.4666666666666667 0.5019607843137255 0.5372549019607843);
276
- --neutral-600: color(srgb 0.32941176470588235 0.35294117647058826 0.3803921568627451);
277
- --neutral-700: color(srgb 0.20784313725490197 0.22745098039215686 0.24313725490196078);
278
- --neutral-800: color(srgb 0.09411764705882353 0.10196078431372549 0.10980392156862745);
279
- --switcher-tab-bg-color: color(srgb 1 1 1 / 0.047058823529411764);
280
- --title-text-color: color(srgb 0.32941176470588235 0.35294117647058826 0.3803921568627451 / 0.7490196078431373);
281
- }
282
-
283
178
  @media (prefers-color-scheme: dark) {
284
179
  :root {
285
180
  --active-switcher-tab-bg-color: color(srgb 0.047058823529411764 0.16470588235294117 0.16470588235294117);
@@ -293,6 +188,9 @@
293
188
  --button-secondary-bg-color: color(srgb 1 1 1 / 0.09803921568627451);
294
189
  --button-secondary-bg-color-hover: color(srgb 0.6549019607843137 1 0.9921568627450981 / 0.14901960784313725);
295
190
  --button-secondary-text-color: var(--teal-200);
191
+ --card-bg-color: var(--teal-900);
192
+ --card-border-color: var(--teal-900);
193
+ --card-border-color-hover: var(--teal-800);
296
194
  --code-bg-color: var(--teal-900);
297
195
  --color-bg: var(--neutral-800);
298
196
  --color-bg-2: var(--neutral-700);
@@ -347,6 +245,9 @@
347
245
  --button-secondary-bg-color: color(srgb 1 1 1 / 0.09803921568627451);
348
246
  --button-secondary-bg-color-hover: color(srgb 0.6549019607843137 1 0.9921568627450981 / 0.14901960784313725);
349
247
  --button-secondary-text-color: var(--teal-200);
248
+ --card-bg-color: var(--teal-900);
249
+ --card-border-color: var(--teal-900);
250
+ --card-border-color-hover: var(--teal-800);
350
251
  --code-bg-color: var(--teal-900);
351
252
  --color-bg: var(--neutral-800);
352
253
  --color-bg-2: var(--neutral-700);
@@ -388,3 +289,59 @@
388
289
  --title-text-color: color(srgb 0.8352941176470589 1 0.996078431372549 / 0.7490196078431373);
389
290
  }
390
291
 
292
+ [data-theme="light"] {
293
+ --active-switcher-tab-bg-color: color(srgb 0.047058823529411764 0.16470588235294117 0.16470588235294117 / 0.047058823529411764);
294
+ --button-outline-bg-color: color(srgb 0 0 0 / 0);
295
+ --button-outline-bg-color-hover: color(srgb 0.19607843137254902 0.9019607843137255 0.8862745098039215 / 0.2);
296
+ --button-outline-stroke-color: var(--neutral-800);
297
+ --button-outline-text-color: var(--neutral-800);
298
+ --button-primary-bg-color: var(--teal-200);
299
+ --button-primary-bg-color-hover: var(--teal-100);
300
+ --button-primary-text-color: var(--neutral-800);
301
+ --button-secondary-bg-color: color(srgb 0.047058823529411764 0.16470588235294117 0.16470588235294117 / 0.09803921568627451);
302
+ --button-secondary-bg-color-hover: color(srgb 0.047058823529411764 0.16470588235294117 0.16470588235294117 / 0.14901960784313725);
303
+ --button-secondary-text-color: var(--neutral-800);
304
+ --card-bg-color: var(--neutral-000);
305
+ --card-border-color: var(--neutral-200);
306
+ --card-border-color-hover: var(--neutral-300);
307
+ --code-bg-color: var(--teal-900);
308
+ --color-bg: var(--neutral-000);
309
+ --color-bg-2: var(--neutral-100);
310
+ --color-bg-3: var(--neutral-200);
311
+ --color-disabled-bg: var(--neutral-200);
312
+ --color-disabled-border: var(--neutral-400);
313
+ --color-disabled-text: var(--neutral-400);
314
+ --color-icon: var(--blue-700);
315
+ --color-invalid-bg: var(--red-100);
316
+ --color-invalid-border: var(--red-600);
317
+ --color-invalid-text: var(--red-600);
318
+ --color-link: var(--blue-700);
319
+ --color-logo-inactive: color(srgb 0.7019607843137254 0.7019607843137254 0.7019607843137254);
320
+ --color-logo-spark: var(--teal-400);
321
+ --color-logo-type: var(--teal-800);
322
+ --color-stroke: color(srgb 0 0 0 / 0.14901960784313725);
323
+ --color-success-bg: var(--green-100);
324
+ --color-success-border: var(--green-300);
325
+ --color-success-text: var(--green-800);
326
+ --color-text: var(--neutral-600);
327
+ --color-text-accent: var(--teal-000);
328
+ --color-text-weak: var(--neutral-500);
329
+ --color-text-weaker: var(--neutral-400);
330
+ --color-warning-bg: var(--gold-100);
331
+ --color-warning-border: var(--gold-300);
332
+ --color-warning-text: var(--gold-800);
333
+ --eyebrow-text-color: var(--blue-700);
334
+ --heading-text-color: var(--neutral-800);
335
+ --neutral-000: color(srgb 1 1 1);
336
+ --neutral-100: color(srgb 0.9647058823529412 0.9647058823529412 0.9686274509803922);
337
+ --neutral-200: color(srgb 0.9137254901960784 0.9215686274509803 0.9294117647058824);
338
+ --neutral-300: color(srgb 0.8196078431372549 0.8352941176470589 0.8549019607843137);
339
+ --neutral-400: color(srgb 0.615686274509804 0.6549019607843137 0.6980392156862745);
340
+ --neutral-500: color(srgb 0.4666666666666667 0.5019607843137255 0.5372549019607843);
341
+ --neutral-600: color(srgb 0.32941176470588235 0.35294117647058826 0.3803921568627451);
342
+ --neutral-700: color(srgb 0.20784313725490197 0.22745098039215686 0.24313725490196078);
343
+ --neutral-800: color(srgb 0.09411764705882353 0.10196078431372549 0.10980392156862745);
344
+ --switcher-tab-bg-color: color(srgb 1 1 1 / 0.047058823529411764);
345
+ --title-text-color: color(srgb 0.32941176470588235 0.35294117647058826 0.3803921568627451 / 0.7490196078431373);
346
+ }
347
+
@@ -6,4 +6,4 @@
6
6
  position: absolute;
7
7
  white-space: nowrap;
8
8
  width: 1px;
9
- }
9
+ }