@phcdevworks/spectre-ui 0.4.0 → 1.0.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/dist/index.css CHANGED
@@ -6,15 +6,18 @@
6
6
  --sp-surface-page: #f8fafc;
7
7
  --sp-surface-card: #ffffff;
8
8
  --sp-surface-input: #ffffff;
9
- --sp-surface-overlay: rgba(15,23,42,0.6);
9
+ --sp-surface-overlay: rgba(15, 23, 42, 0.6);
10
+ --sp-surface-hero: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
10
11
  --sp-text-on-page-default: #0f172a;
11
12
  --sp-text-on-page-muted: #475569;
12
- --sp-text-on-page-meta: #94a3b8;
13
+ --sp-text-on-page-subtle: #64748b;
14
+ --sp-text-on-page-meta: #64748b;
13
15
  --sp-text-on-surface-default: #0f172a;
14
- --sp-text-on-surface-muted: #6b7280;
15
- --sp-text-on-surface-meta: #94a3b8;
16
+ --sp-text-on-surface-muted: #475569;
17
+ --sp-text-on-surface-subtle: #64748b;
18
+ --sp-text-on-surface-meta: #64748b;
16
19
  --sp-component-card-text: #0f172a;
17
- --sp-component-card-text-muted: #6b7280;
20
+ --sp-component-card-text-muted: #64748b;
18
21
  --sp-component-input-text: #0f172a;
19
22
  --sp-component-input-placeholder: #94a3b8;
20
23
  --sp-button-text-default: #0f172a;
@@ -31,40 +34,40 @@
31
34
  --sp-badge-danger-text: #b91c1c;
32
35
  --sp-icon-box-bg: #ffffff;
33
36
  --sp-icon-box-border: #e2e8f0;
34
- --sp-icon-box-icon-default: #6c32e6;
37
+ --sp-icon-box-icon-default: #2563eb;
35
38
  --sp-icon-box-icon-success: #16a34a;
36
39
  --sp-icon-box-icon-warning: #d97706;
37
40
  --sp-icon-box-icon-danger: #dc2626;
38
- --sp-color-brand-50: #f5f0ff;
39
- --sp-color-brand-100: #ebe2ff;
40
- --sp-color-brand-200: #d7c6ff;
41
- --sp-color-brand-300: #bfa1ff;
42
- --sp-color-brand-400: #a37aff;
43
- --sp-color-brand-500: #8652ff;
44
- --sp-color-brand-600: #6c32e6;
45
- --sp-color-brand-700: #5626b4;
46
- --sp-color-brand-800: #3d1b7f;
47
- --sp-color-brand-900: #241147;
41
+ --sp-color-brand-50: #eff6ff;
42
+ --sp-color-brand-100: #dbeafe;
43
+ --sp-color-brand-200: #bfdbfe;
44
+ --sp-color-brand-300: #93c5fd;
45
+ --sp-color-brand-400: #60a5fa;
46
+ --sp-color-brand-500: #3b82f6;
47
+ --sp-color-brand-600: #2563eb;
48
+ --sp-color-brand-700: #1d4ed8;
49
+ --sp-color-brand-800: #1e40af;
50
+ --sp-color-brand-900: #1e3a8a;
48
51
  --sp-color-neutral-50: #f8fafc;
49
52
  --sp-color-neutral-100: #f1f5f9;
50
53
  --sp-color-neutral-200: #e2e8f0;
51
- --sp-color-neutral-300: #cbd5f5;
54
+ --sp-color-neutral-300: #cbd5e1;
52
55
  --sp-color-neutral-400: #94a3b8;
53
56
  --sp-color-neutral-500: #64748b;
54
57
  --sp-color-neutral-600: #475569;
55
58
  --sp-color-neutral-700: #334155;
56
59
  --sp-color-neutral-800: #1e293b;
57
60
  --sp-color-neutral-900: #0f172a;
58
- --sp-color-accent-50: #e5fff8;
59
- --sp-color-accent-100: #b8ffed;
60
- --sp-color-accent-200: #89ffe1;
61
- --sp-color-accent-300: #59ffd6;
62
- --sp-color-accent-400: #29ffca;
63
- --sp-color-accent-500: #03e6b3;
64
- --sp-color-accent-600: #00b389;
65
- --sp-color-accent-700: #008060;
66
- --sp-color-accent-800: #004d38;
67
- --sp-color-accent-900: #002a20;
61
+ --sp-color-accent-50: #eff6ff;
62
+ --sp-color-accent-100: #dbeafe;
63
+ --sp-color-accent-200: #ddd6fe;
64
+ --sp-color-accent-300: #93c5fd;
65
+ --sp-color-accent-400: #60a5fa;
66
+ --sp-color-accent-500: #8b5cf6;
67
+ --sp-color-accent-600: #7c3aed;
68
+ --sp-color-accent-700: #6d28d9;
69
+ --sp-color-accent-800: #1e40af;
70
+ --sp-color-accent-900: #1e3a8a;
68
71
  --sp-color-success-50: #f0fdf4;
69
72
  --sp-color-success-100: #dcfce7;
70
73
  --sp-color-success-200: #bbf7d0;
@@ -105,9 +108,26 @@
105
108
  --sp-color-info-700: #1d4ed8;
106
109
  --sp-color-info-800: #1e40af;
107
110
  --sp-color-info-900: #1e3a8a;
108
- --sp-color-focus-primary: #8652ff;
111
+ --sp-color-indigo-500: #667eea;
112
+ --sp-color-indigo-600: #5c67f2;
113
+ --sp-color-violet-600: #764ba2;
114
+ --sp-color-focus-primary: #3b82f6;
109
115
  --sp-color-focus-error: #ef4444;
110
116
  --sp-color-focus-info: #3b82f6;
117
+ --sp-color-white-0: #;
118
+ --sp-color-white-1: f;
119
+ --sp-color-white-2: f;
120
+ --sp-color-white-3: f;
121
+ --sp-color-white-4: f;
122
+ --sp-color-white-5: f;
123
+ --sp-color-white-6: f;
124
+ --sp-color-black-0: #;
125
+ --sp-color-black-1: 0;
126
+ --sp-color-black-2: 0;
127
+ --sp-color-black-3: 0;
128
+ --sp-color-black-4: 0;
129
+ --sp-color-black-5: 0;
130
+ --sp-color-black-6: 0;
111
131
  --sp-space-0: 0rem;
112
132
  --sp-space-4: 0.25rem;
113
133
  --sp-space-8: 0.5rem;
@@ -139,9 +159,9 @@
139
159
  --sp-radius-md: 4px;
140
160
  --sp-radius-lg: 8px;
141
161
  --sp-radius-pill: 999px;
142
- --sp-font-family-sans: 'Inter', 'Helvetica Neue', Arial, sans-serif;
143
- --sp-font-family-serif: 'Spectre Serif', 'Georgia', serif;
144
- --sp-font-family-mono: 'JetBrains Mono', 'SFMono-Regular', Consolas, monospace;
162
+ --sp-font-family-sans: system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif;
163
+ --sp-font-family-serif: 'Times New Roman', Times, serif;
164
+ --sp-font-family-mono: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
145
165
  --sp-font-xs-size: 0.75rem;
146
166
  --sp-font-xs-line-height: 1.25rem;
147
167
  --sp-font-xs-weight: 400;
@@ -163,9 +183,12 @@
163
183
  --sp-font-xs-letter-spacing: 0.02em;
164
184
  --sp-text-on-page-default: #0f172a;
165
185
  --sp-text-on-page-muted: #475569;
186
+ --sp-text-on-page-subtle: #64748b;
187
+ --sp-text-on-page-meta: #64748b;
166
188
  --sp-text-on-surface-default: #0f172a;
167
- --sp-text-on-surface-muted: #6b7280;
168
- --sp-text-on-surface-meta: #94a3b8;
189
+ --sp-text-on-surface-muted: #475569;
190
+ --sp-text-on-surface-subtle: #64748b;
191
+ --sp-text-on-surface-meta: #64748b;
169
192
  --sp-badge-neutral-bg: #f1f5f9;
170
193
  --sp-badge-neutral-text: #334155;
171
194
  --sp-badge-info-bg: #dbeafe;
@@ -178,14 +201,14 @@
178
201
  --sp-badge-danger-text: #b91c1c;
179
202
  --sp-icon-box-bg: #ffffff;
180
203
  --sp-icon-box-border: #e2e8f0;
181
- --sp-icon-box-icon-default: #6c32e6;
204
+ --sp-icon-box-icon-default: #2563eb;
182
205
  --sp-icon-box-icon-success: #16a34a;
183
206
  --sp-icon-box-icon-warning: #d97706;
184
207
  --sp-icon-box-icon-danger: #dc2626;
185
208
  --sp-shadow-none: none;
186
- --sp-shadow-sm: 0 1px 2px 0 rgba(15, 23, 42, 0.08);
187
- --sp-shadow-md: 0 3px 8px -1px rgba(15, 23, 42, 0.1);
188
- --sp-shadow-lg: 0 8px 20px -4px rgba(15, 23, 42, 0.18);
209
+ --sp-shadow-sm: 0 1px 2px 0 rgba(30, 41, 59, 0.06);
210
+ --sp-shadow-md: 0 2px 6px -1px rgba(30, 41, 59, 0.08);
211
+ --sp-shadow-lg: 0 6px 16px -4px rgba(30, 41, 59, 0.12);
189
212
  --sp-breakpoint-sm: 640px;
190
213
  --sp-breakpoint-md: 768px;
191
214
  --sp-breakpoint-lg: 1024px;
@@ -209,7 +232,7 @@
209
232
  --sp-easing-in: cubic-bezier(0.4, 0, 1, 1);
210
233
  --sp-easing-out: cubic-bezier(0, 0, 0.2, 1);
211
234
  --sp-easing-inout: cubic-bezier(0.4, 0, 0.2, 1);
212
- --sp-easing-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
235
+ --sp-easing-spring: cubic-bezier(0.4, 0, 0.2, 1);
213
236
  --sp-opacity-disabled: 0.38;
214
237
  --sp-opacity-hover: 0.92;
215
238
  --sp-opacity-active: 0.84;
@@ -221,45 +244,58 @@
221
244
  --sp-focus-ring-style: solid;
222
245
  --sp-min-touch-target: 44px;
223
246
  --sp-min-text-size: 16px;
224
- --sp-button-primary-bg: #8652ff;
225
- --sp-button-primary-bghover: #6c32e6;
226
- --sp-button-primary-bgactive: #5626b4;
227
- --sp-button-primary-bgdisabled: #cbd5f5;
247
+ --sp-button-primary-bg: #2563eb;
248
+ --sp-button-primary-bghover: #1d4ed8;
249
+ --sp-button-primary-bgactive: #1e40af;
250
+ --sp-button-primary-bgdisabled: #e2e8f0;
228
251
  --sp-button-primary-text: #ffffff;
229
252
  --sp-button-primary-textdisabled: #94a3b8;
230
253
  --sp-button-secondary-bg: #ffffff;
231
- --sp-button-secondary-bghover: #f1f5f9;
232
- --sp-button-secondary-bgactive: #e2e8f0;
254
+ --sp-button-secondary-bghover: #f8fafc;
255
+ --sp-button-secondary-bgactive: #f1f5f9;
233
256
  --sp-button-secondary-bgdisabled: #f8fafc;
234
- --sp-button-secondary-text: #8652ff;
257
+ --sp-button-secondary-text: #2563eb;
235
258
  --sp-button-secondary-textdisabled: #94a3b8;
236
- --sp-button-secondary-border: #8652ff;
237
- --sp-button-secondary-borderdisabled: #cbd5f5;
259
+ --sp-button-secondary-border: #2563eb;
260
+ --sp-button-secondary-borderdisabled: #e2e8f0;
238
261
  --sp-button-ghost-bg: transparent;
239
- --sp-button-ghost-bghover: #f5f0ff;
240
- --sp-button-ghost-bgactive: #ebe2ff;
262
+ --sp-button-ghost-bghover: #eff6ff;
263
+ --sp-button-ghost-bgactive: #dbeafe;
241
264
  --sp-button-ghost-bgdisabled: transparent;
242
- --sp-button-ghost-text: #8652ff;
265
+ --sp-button-ghost-text: #2563eb;
243
266
  --sp-button-ghost-textdisabled: #94a3b8;
244
- --sp-button-danger-bg: #ef4444;
245
- --sp-button-danger-bghover: #dc2626;
246
- --sp-button-danger-bgactive: #b91c1c;
267
+ --sp-button-danger-bg: #dc2626;
268
+ --sp-button-danger-bghover: #b91c1c;
269
+ --sp-button-danger-bgactive: #991b1b;
247
270
  --sp-button-danger-bgdisabled: #fecaca;
248
271
  --sp-button-danger-text: #ffffff;
249
272
  --sp-button-danger-textdisabled: #94a3b8;
250
- --sp-button-success-bg: #22c55e;
251
- --sp-button-success-bghover: #16a34a;
252
- --sp-button-success-bgactive: #15803d;
273
+ --sp-button-success-bg: #15803d;
274
+ --sp-button-success-bghover: #166534;
275
+ --sp-button-success-bgactive: #14532d;
253
276
  --sp-button-success-bgdisabled: #bbf7d0;
254
277
  --sp-button-success-text: #ffffff;
255
278
  --sp-button-success-textdisabled: #94a3b8;
279
+ --sp-button-cta-bg: #f59e0b;
280
+ --sp-button-cta-bghover: #d97706;
281
+ --sp-button-cta-bgactive: #b45309;
282
+ --sp-button-cta-bgdisabled: #fde68a;
283
+ --sp-button-cta-text: #0f172a;
284
+ --sp-button-cta-textdisabled: #94a3b8;
285
+ --sp-button-cta-shadow: 0 4px 14px 0 rgba(245, 158, 11, 0.39);
286
+ --sp-button-accent-bg: #7c3aed;
287
+ --sp-button-accent-bghover: #6d28d9;
288
+ --sp-button-accent-bgactive: #1e40af;
289
+ --sp-button-accent-bgdisabled: #ddd6fe;
290
+ --sp-button-accent-text: #ffffff;
291
+ --sp-button-accent-textdisabled: #94a3b8;
256
292
  --sp-form-default-bg: #ffffff;
257
- --sp-form-default-border: #cbd5f5;
293
+ --sp-form-default-border: #cbd5e1;
258
294
  --sp-form-default-text: #0f172a;
259
295
  --sp-form-default-placeholder: #94a3b8;
260
- --sp-form-hover-border: #8652ff;
261
- --sp-form-focus-border: #8652ff;
262
- --sp-form-focus-ring: #8652ff;
296
+ --sp-form-hover-border: #3b82f6;
297
+ --sp-form-focus-border: #3b82f6;
298
+ --sp-form-focus-ring: #3b82f6;
263
299
  --sp-form-valid-border: #22c55e;
264
300
  --sp-form-valid-bg: #f0fdf4;
265
301
  --sp-form-valid-text: #15803d;
@@ -284,13 +320,13 @@
284
320
  --sp-animation-scalein-duration: 200ms;
285
321
  --sp-animation-scalein-easing: cubic-bezier(0.34, 1.56, 0.64, 1);
286
322
  --sp-animation-scalein-keyframes: scale-in;
287
- --sp-animation-bounce-duration: 500ms;
288
- --sp-animation-bounce-easing: cubic-bezier(0.34, 1.56, 0.64, 1);
323
+ --sp-animation-bounce-duration: 300ms;
324
+ --sp-animation-bounce-easing: cubic-bezier(0.4, 0, 0.2, 1);
289
325
  --sp-animation-bounce-keyframes: bounce;
290
- --sp-animation-shake-duration: 400ms;
326
+ --sp-animation-shake-duration: 250ms;
291
327
  --sp-animation-shake-easing: cubic-bezier(0.4, 0, 0.2, 1);
292
328
  --sp-animation-shake-keyframes: shake;
293
- --sp-animation-pulse-duration: 1500ms;
329
+ --sp-animation-pulse-duration: 1200ms;
294
330
  --sp-animation-pulse-easing: cubic-bezier(0.4, 0, 0.2, 1);
295
331
  --sp-animation-pulse-keyframes: pulse;
296
332
  }
@@ -299,14 +335,17 @@
299
335
  --sp-surface-card: #1e293b;
300
336
  --sp-surface-input: #334155;
301
337
  --sp-surface-overlay: #1e293b;
338
+ --sp-surface-hero: linear-gradient(135deg, #1e3a8a 0%, #6d28d9 100%);
302
339
  --sp-text-on-page-default: #f8fafc;
303
- --sp-text-on-page-muted: #cbd5f5;
340
+ --sp-text-on-page-muted: #cbd5e1;
341
+ --sp-text-on-page-subtle: #94a3b8;
304
342
  --sp-text-on-page-meta: #94a3b8;
305
343
  --sp-text-on-surface-default: #f1f5f9;
306
- --sp-text-on-surface-muted: #cbd5f5;
344
+ --sp-text-on-surface-muted: #cbd5e1;
345
+ --sp-text-on-surface-subtle: #94a3b8;
307
346
  --sp-text-on-surface-meta: #94a3b8;
308
347
  --sp-component-card-text: #f1f5f9;
309
- --sp-component-card-text-muted: #cbd5f5;
348
+ --sp-component-card-text-muted: #cbd5e1;
310
349
  --sp-component-input-text: #f1f5f9;
311
350
  --sp-component-input-placeholder: #94a3b8;
312
351
  --sp-button-text-default: #f1f5f9;
@@ -323,7 +362,7 @@
323
362
  --sp-badge-danger-text: #fee2e2;
324
363
  --sp-icon-box-bg: #1e293b;
325
364
  --sp-icon-box-border: #334155;
326
- --sp-icon-box-icon-default: #a37aff;
365
+ --sp-icon-box-icon-default: #93c5fd;
327
366
  --sp-icon-box-icon-success: #4ade80;
328
367
  --sp-icon-box-icon-warning: #fbbf24;
329
368
  --sp-icon-box-icon-danger: #f87171;
@@ -344,9 +383,9 @@
344
383
 
345
384
  body {
346
385
  min-height: 100vh;
347
- font-family: var(--sp-font-family-sans, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif);
348
- font-size: var(--sp-font-md-size, 1rem);
349
- line-height: var(--sp-font-md-line-height, 1.5);
386
+ font-family: var(--sp-font-family-sans);
387
+ font-size: var(--sp-font-md-size);
388
+ line-height: var(--sp-font-md-line-height);
350
389
  color: var(--sp-text-on-page-default);
351
390
  background-color: var(--sp-surface-page);
352
391
  }
@@ -375,7 +414,7 @@
375
414
  }
376
415
 
377
416
  a {
378
- color: var(--sp-color-brand-600, inherit);
417
+ color: var(--sp-color-brand-600);
379
418
  text-decoration: none;
380
419
  }
381
420
 
@@ -384,19 +423,21 @@
384
423
  }
385
424
 
386
425
  :focus-visible {
387
- outline: var(--sp-focus-ring-width, 2px) solid var(--sp-color-focus-primary,
388
- var(--sp-color-brand-600, currentColor));
389
- outline-offset: var(--sp-focus-ring-offset, 2px);
426
+ outline: var(--sp-focus-ring-width) solid var(--sp-color-focus-primary);
427
+ outline-offset: var(--sp-focus-ring-offset);
390
428
  }
391
429
 
392
430
  ::selection {
393
- background-color: var(--sp-color-brand-100, #ebe2ff);
431
+ background-color: var(--sp-color-brand-100);
394
432
  color: inherit;
395
433
  }
396
434
  }
397
435
  @layer components {
398
436
 
399
437
  :root {
438
+ /* structural border width — swap to token when spectre-tokens ships sp-border-width-base */
439
+ --sp-component-border-width: 1px;
440
+
400
441
  /* button roles */
401
442
  --sp-component-button-border-base: var(--sp-component-button-ghost-bg);
402
443
  --sp-component-button-shadow: var(--sp-shadow-sm);
@@ -432,6 +473,19 @@
432
473
  --sp-component-button-success-bg-disabled: var(--sp-button-success-bgdisabled);
433
474
  --sp-component-button-success-text: var(--sp-button-success-text);
434
475
  --sp-component-button-success-text-disabled: var(--sp-button-success-textdisabled);
476
+ --sp-component-button-cta-bg: var(--sp-color-accent-600);
477
+ --sp-component-button-cta-bg-hover: var(--sp-color-accent-700);
478
+ --sp-component-button-cta-bg-active: var(--sp-color-accent-800);
479
+ --sp-component-button-cta-bg-disabled: var(--sp-color-accent-200);
480
+ --sp-component-button-cta-text: var(--sp-color-neutral-50);
481
+ --sp-component-button-cta-text-disabled: var(--sp-color-neutral-400);
482
+ --sp-component-button-cta-shadow: 0 4px 14px 0 var(--sp-color-accent-500) / 0.39;
483
+ --sp-component-button-accent-bg: var(--sp-button-accent-bg);
484
+ --sp-component-button-accent-bg-hover: var(--sp-button-accent-bghover);
485
+ --sp-component-button-accent-bg-active: var(--sp-button-accent-bgactive);
486
+ --sp-component-button-accent-bg-disabled: var(--sp-button-accent-bgdisabled);
487
+ --sp-component-button-accent-text: var(--sp-button-accent-text);
488
+ --sp-component-button-accent-text-disabled: var(--sp-button-accent-textdisabled);
435
489
 
436
490
  /* card roles */
437
491
  --sp-component-card-bg: var(--sp-surface-card);
@@ -450,22 +504,21 @@
450
504
  --sp-component-card-ghost-border: var(--sp-component-card-ghost-bg);
451
505
 
452
506
  /* input roles */
453
- --sp-component-input-role-border: var(--sp-color-neutral-300);
454
- --sp-component-input-role-bg: var(--sp-surface-input);
455
- --sp-component-input-role-text: var(--sp-component-input-text);
456
- --sp-component-input-role-placeholder: var(--sp-component-input-placeholder);
457
- --sp-component-input-role-border-focus: var(--sp-color-focus-primary);
458
- --sp-component-input-role-ring: var(--sp-color-focus-primary);
459
- --sp-component-input-role-border-error: var(--sp-color-error-500);
460
- --sp-component-input-role-bg-error: var(--sp-color-error-50);
461
- --sp-component-input-role-text-error: var(--sp-color-error-700);
462
- --sp-component-input-role-border-success: var(--sp-color-success-500);
463
- --sp-component-input-role-bg-success: var(--sp-color-success-50);
464
- --sp-component-input-role-text-success: var(--sp-color-success-700);
465
- --sp-component-input-role-bg-disabled: var(--sp-surface-input);
466
- --sp-component-input-role-text-disabled: var(--sp-text-on-surface-meta);
467
- /* Important: border-disabled should fall back to a BORDER token, not a surface token */
468
- --sp-component-input-role-border-disabled: var(--sp-color-neutral-200);
507
+ --sp-component-input-role-border: var(--sp-form-default-border);
508
+ --sp-component-input-role-bg: var(--sp-form-default-bg);
509
+ --sp-component-input-role-text: var(--sp-form-default-text);
510
+ --sp-component-input-role-placeholder: var(--sp-form-default-placeholder);
511
+ --sp-component-input-role-border-focus: var(--sp-form-focus-border);
512
+ --sp-component-input-role-ring: var(--sp-form-focus-ring);
513
+ --sp-component-input-role-border-error: var(--sp-form-invalid-border);
514
+ --sp-component-input-role-bg-error: var(--sp-form-invalid-bg);
515
+ --sp-component-input-role-text-error: var(--sp-form-invalid-text);
516
+ --sp-component-input-role-border-success: var(--sp-form-valid-border);
517
+ --sp-component-input-role-bg-success: var(--sp-form-valid-bg);
518
+ --sp-component-input-role-text-success: var(--sp-form-valid-text);
519
+ --sp-component-input-role-bg-disabled: var(--sp-form-disabled-bg);
520
+ --sp-component-input-role-text-disabled: var(--sp-form-disabled-text);
521
+ --sp-component-input-role-border-disabled: var(--sp-form-disabled-border);
469
522
 
470
523
  /* badge roles */
471
524
  --sp-component-badge-font: var(--sp-font-family-sans);
@@ -474,12 +527,29 @@
474
527
  --sp-component-badge-radius: var(--sp-radius-pill);
475
528
  --sp-component-badge-primary-bg: var(--sp-button-primary-bg);
476
529
  --sp-component-badge-primary-text: var(--sp-button-text-on-primary);
530
+ --sp-component-badge-secondary-bg: var(--sp-button-secondary-bg);
531
+ --sp-component-badge-secondary-text: var(--sp-button-secondary-text);
532
+ --sp-component-badge-secondary-border: var(--sp-button-secondary-border);
477
533
  --sp-component-badge-success-bg: var(--sp-badge-success-bg);
478
534
  --sp-component-badge-success-text: var(--sp-badge-success-text);
479
535
  --sp-component-badge-warning-bg: var(--sp-badge-warning-bg);
480
536
  --sp-component-badge-warning-text: var(--sp-badge-warning-text);
481
537
  --sp-component-badge-danger-bg: var(--sp-badge-danger-bg);
482
538
  --sp-component-badge-danger-text: var(--sp-badge-danger-text);
539
+ --sp-component-badge-neutral-bg: var(--sp-badge-neutral-bg);
540
+ --sp-component-badge-neutral-text: var(--sp-badge-neutral-text);
541
+ --sp-component-badge-info-bg: var(--sp-badge-info-bg);
542
+ --sp-component-badge-info-text: var(--sp-badge-info-text);
543
+
544
+ /* badge hover states — missing from core token exports, mapped to semantic logic */
545
+ --sp-component-badge-primary-bg-hover: var(--sp-button-primary-bghover);
546
+ --sp-component-badge-secondary-bg-hover: var(--sp-button-secondary-bghover);
547
+ --sp-component-badge-success-bg-hover: var(--sp-color-success-200);
548
+ --sp-component-badge-warning-bg-hover: var(--sp-color-warning-200);
549
+ --sp-component-badge-danger-bg-hover: var(--sp-color-error-200);
550
+ --sp-component-badge-neutral-bg-hover: var(--sp-color-neutral-200);
551
+ --sp-component-badge-info-bg-hover: var(--sp-color-info-200);
552
+
483
553
  --sp-component-badge-padding-x-sm: var(--sp-space-8);
484
554
  --sp-component-badge-padding-x-md: var(--sp-space-12);
485
555
  --sp-component-badge-padding-x-lg: var(--sp-space-16);
@@ -502,6 +572,44 @@
502
572
  --sp-component-iconbox-danger-text: var(--sp-icon-box-icon-danger);
503
573
  --sp-component-iconbox-info-bg: var(--sp-color-info-50);
504
574
  --sp-component-iconbox-info-text: var(--sp-badge-info-text);
575
+
576
+ /* testimonial roles */
577
+ --sp-component-testimonial-bg: var(--sp-surface-card);
578
+ --sp-component-testimonial-border: var(--sp-color-neutral-200);
579
+ --sp-component-testimonial-text: var(--sp-text-on-surface-muted);
580
+ --sp-component-testimonial-author-name: var(--sp-text-on-surface-default);
581
+ --sp-component-testimonial-author-title: var(--sp-text-on-surface-subtle);
582
+ --sp-component-testimonial-quote-mark: var(--sp-color-neutral-300);
583
+
584
+ /* pricing card roles */
585
+ --sp-component-pricing-card-bg: var(--sp-surface-card);
586
+ --sp-component-pricing-card-border: var(--sp-color-neutral-200);
587
+ --sp-component-pricing-card-featured-bg: var(--sp-color-neutral-900);
588
+ --sp-component-pricing-card-featured-text: var(--sp-color-neutral-50);
589
+ --sp-component-pricing-card-featured-badge-bg: var(--sp-color-warning-500);
590
+ --sp-component-pricing-card-featured-badge-text: var(--sp-color-neutral-900);
591
+ --sp-component-pricing-card-price: var(--sp-text-on-surface-default);
592
+ --sp-component-pricing-card-featured-price: var(--sp-color-neutral-50);
593
+ --sp-component-pricing-card-price-description: var(--sp-text-on-surface-subtle);
594
+
595
+ /* rating roles */
596
+ --sp-component-rating-star-filled: var(--sp-color-warning-500);
597
+ --sp-component-rating-star-empty: var(--sp-color-neutral-200);
598
+ --sp-component-rating-text: var(--sp-text-on-surface-subtle);
599
+ }
600
+
601
+ /* dark mode overrides for complex component tokens not yet exported by spectre-tokens v2.x */
602
+ :root[data-spectre-theme="dark"] {
603
+ --sp-component-testimonial-border: var(--sp-color-neutral-700);
604
+ --sp-component-testimonial-quote-mark: var(--sp-color-neutral-600);
605
+ --sp-component-pricing-card-border: var(--sp-color-neutral-700);
606
+ --sp-component-rating-star-empty: var(--sp-color-neutral-700);
607
+
608
+ --sp-component-badge-success-bg-hover: var(--sp-color-success-700);
609
+ --sp-component-badge-warning-bg-hover: var(--sp-color-warning-700);
610
+ --sp-component-badge-danger-bg-hover: var(--sp-color-error-700);
611
+ --sp-component-badge-neutral-bg-hover: var(--sp-color-neutral-600);
612
+ --sp-component-badge-info-bg-hover: var(--sp-color-info-700);
505
613
  }
506
614
 
507
615
  /* BUTTONS -------------------------------------------------------------- */
@@ -512,7 +620,7 @@
512
620
  gap: var(--sp-space-4);
513
621
  padding: var(--sp-space-4) var(--sp-space-16);
514
622
  border-radius: var(--sp-radius-md);
515
- border: 1px solid var(--sp-component-button-border-base);
623
+ border: var(--sp-component-border-width) solid var(--sp-component-button-border-base);
516
624
  font-family: var(--sp-font-family-sans);
517
625
  font-size: var(--sp-font-md-size);
518
626
  line-height: 1;
@@ -545,6 +653,10 @@
545
653
  width: 100%;
546
654
  }
547
655
 
656
+ .sp-btn--pill {
657
+ border-radius: var(--sp-radius-pill);
658
+ }
659
+
548
660
  .sp-btn--icon {
549
661
  padding-inline: var(--sp-space-12);
550
662
  padding-block: var(--sp-space-4);
@@ -569,16 +681,8 @@
569
681
  line-height: var(--sp-font-lg-line-height);
570
682
  }
571
683
 
572
- /* Generic forced-state helpers (safe, variant rules still set actual colors) */
573
- .sp-btn.sp-btn--hover,
574
- .sp-btn.is-hover {
575
- /* no-op here; variant sections below define the actual hover colors */
576
- }
684
+ /* Generic forced-state helpers (actual colors defined in variant sections below) */
577
685
 
578
- .sp-btn.sp-btn--active,
579
- .sp-btn.is-active {
580
- /* no-op here; variant sections below define the actual active colors */
581
- }
582
686
 
583
687
  /* primary */
584
688
  .sp-btn--primary {
@@ -704,6 +808,56 @@
704
808
  color: var(--sp-component-button-success-text-disabled);
705
809
  }
706
810
 
811
+ /* cta */
812
+ .sp-btn--cta {
813
+ background-color: var(--sp-component-button-cta-bg);
814
+ color: var(--sp-component-button-cta-text);
815
+ box-shadow: var(--sp-component-button-cta-shadow);
816
+ }
817
+
818
+ .sp-btn--cta.sp-btn--hover,
819
+ .sp-btn--cta.is-hover,
820
+ .sp-btn--cta:hover {
821
+ background-color: var(--sp-component-button-cta-bg-hover);
822
+ }
823
+
824
+ .sp-btn--cta.sp-btn--active,
825
+ .sp-btn--cta.is-active,
826
+ .sp-btn--cta:active {
827
+ background-color: var(--sp-component-button-cta-bg-active);
828
+ }
829
+
830
+ .sp-btn--cta.sp-btn--disabled,
831
+ .sp-btn--cta:disabled {
832
+ background-color: var(--sp-component-button-cta-bg-disabled);
833
+ color: var(--sp-component-button-cta-text-disabled);
834
+ box-shadow: none;
835
+ }
836
+
837
+ /* accent */
838
+ .sp-btn--accent {
839
+ background-color: var(--sp-component-button-accent-bg);
840
+ color: var(--sp-component-button-accent-text);
841
+ }
842
+
843
+ .sp-btn--accent.sp-btn--hover,
844
+ .sp-btn--accent.is-hover,
845
+ .sp-btn--accent:hover {
846
+ background-color: var(--sp-component-button-accent-bg-hover);
847
+ }
848
+
849
+ .sp-btn--accent.sp-btn--active,
850
+ .sp-btn--accent.is-active,
851
+ .sp-btn--accent:active {
852
+ background-color: var(--sp-component-button-accent-bg-active);
853
+ }
854
+
855
+ .sp-btn--accent.sp-btn--disabled,
856
+ .sp-btn--accent:disabled {
857
+ background-color: var(--sp-component-button-accent-bg-disabled);
858
+ color: var(--sp-component-button-accent-text-disabled);
859
+ }
860
+
707
861
  /* INPUTS --------------------------------------------------------------- */
708
862
 
709
863
  .sp-input-wrapper {
@@ -737,7 +891,7 @@
737
891
  appearance: none;
738
892
  padding: var(--sp-space-4) var(--sp-space-16);
739
893
  border-radius: var(--sp-radius-md);
740
- border: 1px solid var(--sp-component-input-role-border);
894
+ border: var(--sp-component-border-width) solid var(--sp-component-input-role-border);
741
895
  background-color: var(--sp-component-input-role-bg);
742
896
  color: var(--sp-component-input-role-text);
743
897
  font-family: var(--sp-font-family-sans);
@@ -778,7 +932,7 @@
778
932
  .sp-input:focus,
779
933
  .sp-input--focus {
780
934
  border-color: var(--sp-component-input-role-border-focus);
781
- box-shadow: 0 0 0 calc(var(--sp-focus-ring-width) + 1px) var(--sp-component-input-role-ring);
935
+ box-shadow: 0 0 0 calc(var(--sp-focus-ring-width) + var(--sp-component-border-width)) var(--sp-component-input-role-ring);
782
936
  outline: none;
783
937
  }
784
938
 
@@ -819,7 +973,7 @@
819
973
  border-radius: var(--sp-radius-lg);
820
974
  padding: var(--sp-space-24);
821
975
  box-shadow: var(--sp-component-card-shadow);
822
- border: 1px solid var(--sp-component-card-border-base);
976
+ border: var(--sp-component-border-width) solid var(--sp-component-card-border-base);
823
977
  }
824
978
 
825
979
  .sp-card p {
@@ -870,7 +1024,7 @@
870
1024
  .sp-card--interactive:hover,
871
1025
  .sp-card--interactive:focus-visible,
872
1026
  .sp-card--interactive:focus-within {
873
- transform: translateY(-1px);
1027
+ transform: translateY(calc(var(--sp-component-border-width) * -1));
874
1028
  box-shadow: var(--sp-component-card-shadow-elevated);
875
1029
  }
876
1030
 
@@ -887,7 +1041,7 @@
887
1041
  padding: var(--sp-component-badge-padding-y-md) var(--sp-component-badge-padding-x-md);
888
1042
  font-size: var(--sp-font-sm-size);
889
1043
  line-height: var(--sp-font-sm-line-height);
890
- border: 1px solid transparent;
1044
+ border: var(--sp-component-border-width) solid transparent;
891
1045
  white-space: nowrap;
892
1046
  }
893
1047
 
@@ -914,21 +1068,70 @@
914
1068
  color: var(--sp-component-badge-primary-text);
915
1069
  }
916
1070
 
1071
+ .sp-badge--primary.sp-badge--interactive:hover {
1072
+ background-color: var(--sp-component-badge-primary-bg-hover);
1073
+ }
1074
+
1075
+ .sp-badge--secondary {
1076
+ background-color: var(--sp-component-badge-secondary-bg);
1077
+ color: var(--sp-component-badge-secondary-text);
1078
+ border-color: var(--sp-component-badge-secondary-border);
1079
+ }
1080
+
1081
+ .sp-badge--secondary.sp-badge--interactive:hover {
1082
+ background-color: var(--sp-component-badge-secondary-bg-hover);
1083
+ }
1084
+
917
1085
  .sp-badge--success {
918
1086
  background-color: var(--sp-component-badge-success-bg);
919
1087
  color: var(--sp-component-badge-success-text);
920
1088
  }
921
1089
 
1090
+ .sp-badge--success.sp-badge--interactive:hover {
1091
+ background-color: var(--sp-component-badge-success-bg-hover);
1092
+ }
1093
+
922
1094
  .sp-badge--warning {
923
1095
  background-color: var(--sp-component-badge-warning-bg);
924
1096
  color: var(--sp-component-badge-warning-text);
925
1097
  }
926
1098
 
1099
+ .sp-badge--warning.sp-badge--interactive:hover {
1100
+ background-color: var(--sp-component-badge-warning-bg-hover);
1101
+ }
1102
+
927
1103
  .sp-badge--danger {
928
1104
  background-color: var(--sp-component-badge-danger-bg);
929
1105
  color: var(--sp-component-badge-danger-text);
930
1106
  }
931
1107
 
1108
+ .sp-badge--danger.sp-badge--interactive:hover {
1109
+ background-color: var(--sp-component-badge-danger-bg-hover);
1110
+ }
1111
+
1112
+ .sp-badge--neutral {
1113
+ background-color: var(--sp-component-badge-neutral-bg);
1114
+ color: var(--sp-component-badge-neutral-text);
1115
+ }
1116
+
1117
+ .sp-badge--neutral.sp-badge--interactive:hover {
1118
+ background-color: var(--sp-component-badge-neutral-bg-hover);
1119
+ }
1120
+
1121
+ .sp-badge--info {
1122
+ background-color: var(--sp-component-badge-info-bg);
1123
+ color: var(--sp-component-badge-info-text);
1124
+ }
1125
+
1126
+ .sp-badge--info.sp-badge--interactive:hover {
1127
+ background-color: var(--sp-component-badge-info-bg-hover);
1128
+ }
1129
+
1130
+ .sp-badge--interactive {
1131
+ cursor: pointer;
1132
+ transition: background-color var(--sp-duration-fast) var(--sp-easing-out);
1133
+ }
1134
+
932
1135
  /* ICON BOXES ----------------------------------------------------------- */
933
1136
 
934
1137
  .sp-iconbox {
@@ -1033,6 +1236,147 @@
1033
1236
  background-color: var(--sp-component-iconbox-info-bg);
1034
1237
  color: var(--sp-component-iconbox-info-text);
1035
1238
  }
1239
+
1240
+ /* TESTIMONIALS --------------------------------------------------------- */
1241
+
1242
+ .sp-testimonial {
1243
+ background-color: var(--sp-component-testimonial-bg);
1244
+ border: var(--sp-component-border-width) solid var(--sp-component-testimonial-border);
1245
+ border-radius: var(--sp-radius-lg);
1246
+ padding: var(--sp-space-32);
1247
+ display: flex;
1248
+ flex-direction: column;
1249
+ gap: var(--sp-space-24);
1250
+ }
1251
+
1252
+ .sp-testimonial-quote {
1253
+ color: var(--sp-component-testimonial-text);
1254
+ font-size: var(--sp-font-lg-size);
1255
+ line-height: var(--sp-font-lg-line-height);
1256
+ font-style: italic;
1257
+ position: relative;
1258
+ }
1259
+
1260
+ .sp-testimonial-quote::before {
1261
+ content: "“";
1262
+ color: var(--sp-component-testimonial-quote-mark);
1263
+ font-size: var(--sp-space-48);
1264
+ position: absolute;
1265
+ top: calc(var(--sp-space-24) * -1);
1266
+ left: calc(var(--sp-space-16) * -1);
1267
+ opacity: var(--sp-opacity-overlay);
1268
+ }
1269
+
1270
+ .sp-testimonial-author {
1271
+ display: flex;
1272
+ align-items: center;
1273
+ gap: var(--sp-space-16);
1274
+ }
1275
+
1276
+ .sp-testimonial-author-info {
1277
+ display: flex;
1278
+ flex-direction: column;
1279
+ }
1280
+
1281
+ .sp-testimonial-author-name {
1282
+ color: var(--sp-component-testimonial-author-name);
1283
+ font-weight: var(--sp-font-xl-weight);
1284
+ font-size: var(--sp-font-md-size);
1285
+ }
1286
+
1287
+ .sp-testimonial-author-title {
1288
+ color: var(--sp-component-testimonial-author-title);
1289
+ font-size: var(--sp-font-sm-size);
1290
+ }
1291
+
1292
+ /* PRICING CARDS -------------------------------------------------------- */
1293
+
1294
+ .sp-pricing-card {
1295
+ background-color: var(--sp-component-pricing-card-bg);
1296
+ border: var(--sp-component-border-width) solid var(--sp-component-pricing-card-border);
1297
+ border-radius: var(--sp-radius-lg);
1298
+ padding: var(--sp-space-32);
1299
+ display: flex;
1300
+ flex-direction: column;
1301
+ gap: var(--sp-space-24);
1302
+ position: relative;
1303
+ transition: transform var(--sp-duration-fast) var(--sp-easing-out);
1304
+ }
1305
+
1306
+ .sp-pricing-card--featured {
1307
+ background-color: var(--sp-component-pricing-card-featured-bg);
1308
+ color: var(--sp-component-pricing-card-featured-text);
1309
+ transform: scale(1.05);
1310
+ z-index: 1;
1311
+ border: none;
1312
+ }
1313
+
1314
+ .sp-pricing-card-badge {
1315
+ position: absolute;
1316
+ top: var(--sp-space-16);
1317
+ right: var(--sp-space-16);
1318
+ background-color: var(--sp-component-pricing-card-featured-badge-bg);
1319
+ color: var(--sp-component-pricing-card-featured-badge-text);
1320
+ padding: var(--sp-space-4) var(--sp-space-12);
1321
+ border-radius: var(--sp-radius-pill);
1322
+ font-size: var(--sp-font-xs-size);
1323
+ font-weight: var(--sp-font-md-weight);
1324
+ }
1325
+
1326
+ .sp-pricing-card-price-container {
1327
+ display: flex;
1328
+ align-items: baseline;
1329
+ gap: var(--sp-space-4);
1330
+ }
1331
+
1332
+ .sp-pricing-card-price {
1333
+ font-size: var(--sp-font-2xl-size);
1334
+ font-weight: var(--sp-font-2xl-weight);
1335
+ color: var(--sp-component-pricing-card-price);
1336
+ }
1337
+
1338
+ .sp-pricing-card--featured .sp-pricing-card-price {
1339
+ color: var(--sp-component-pricing-card-featured-price);
1340
+ }
1341
+
1342
+ .sp-pricing-card-description {
1343
+ color: var(--sp-component-pricing-card-price-description);
1344
+ font-size: var(--sp-font-sm-size);
1345
+ }
1346
+
1347
+ .sp-pricing-card--featured .sp-pricing-card-description {
1348
+ color: var(--sp-component-pricing-card-featured-text);
1349
+ opacity: 0.8;
1350
+ }
1351
+
1352
+ /* RATING --------------------------------------------------------------- */
1353
+
1354
+ .sp-rating {
1355
+ display: inline-flex;
1356
+ align-items: center;
1357
+ gap: var(--sp-space-8);
1358
+ }
1359
+
1360
+ .sp-rating-stars {
1361
+ display: flex;
1362
+ gap: var(--sp-space-4);
1363
+ color: var(--sp-component-rating-star-empty);
1364
+ }
1365
+
1366
+ .sp-rating-star {
1367
+ display: flex;
1368
+ align-items: center;
1369
+ justify-content: center;
1370
+ }
1371
+
1372
+ .sp-rating-star--filled {
1373
+ color: var(--sp-component-rating-star-filled);
1374
+ }
1375
+
1376
+ .sp-rating-text {
1377
+ color: var(--sp-component-rating-text);
1378
+ font-size: var(--sp-font-sm-size);
1379
+ }
1036
1380
  }
1037
1381
  @layer utilities {
1038
1382
  .sp-stack {
@@ -1054,7 +1398,7 @@
1054
1398
  margin-right: auto;
1055
1399
  padding-left: var(--sp-layout-container-padding-inline-md);
1056
1400
  padding-right: var(--sp-layout-container-padding-inline-md);
1057
- max-width: 72rem;
1401
+ max-width: calc(var(--sp-space-96) * 12);
1058
1402
  }
1059
1403
 
1060
1404
  .sp-section {
@@ -1069,4 +1413,166 @@
1069
1413
  .sp-shadow-strong {
1070
1414
  box-shadow: var(--sp-shadow-lg);
1071
1415
  }
1416
+
1417
+ .sp-z-base {
1418
+ z-index: var(--sp-z-index-base);
1419
+ }
1420
+
1421
+ .sp-z-dropdown {
1422
+ z-index: var(--sp-z-index-dropdown);
1423
+ }
1424
+
1425
+ .sp-z-sticky {
1426
+ z-index: var(--sp-z-index-sticky);
1427
+ }
1428
+
1429
+ .sp-z-fixed {
1430
+ z-index: var(--sp-z-index-fixed);
1431
+ }
1432
+
1433
+ .sp-z-overlay {
1434
+ z-index: var(--sp-z-index-overlay);
1435
+ }
1436
+
1437
+ .sp-z-modal {
1438
+ z-index: var(--sp-z-index-modal);
1439
+ }
1440
+
1441
+ .sp-z-popover {
1442
+ z-index: var(--sp-z-index-popover);
1443
+ }
1444
+
1445
+ .sp-z-tooltip {
1446
+ z-index: var(--sp-z-index-tooltip);
1447
+ }
1448
+
1449
+ .sp-animate-fade-in {
1450
+ animation: var(--sp-animation-fadein-keyframes) var(--sp-animation-fadein-duration) var(--sp-animation-fadein-easing);
1451
+ }
1452
+
1453
+ .sp-animate-fade-out {
1454
+ animation: var(--sp-animation-fadeout-keyframes) var(--sp-animation-fadeout-duration) var(--sp-animation-fadeout-easing);
1455
+ }
1456
+
1457
+ .sp-animate-slide-up {
1458
+ animation: var(--sp-animation-slideup-keyframes) var(--sp-animation-slideup-duration) var(--sp-animation-slideup-easing);
1459
+ }
1460
+
1461
+ .sp-animate-slide-down {
1462
+ animation: var(--sp-animation-slidedown-keyframes) var(--sp-animation-slidedown-duration) var(--sp-animation-slidedown-easing);
1463
+ }
1464
+
1465
+ .sp-animate-scale-in {
1466
+ animation: var(--sp-animation-scalein-keyframes) var(--sp-animation-scalein-duration) var(--sp-animation-scalein-easing);
1467
+ }
1468
+
1469
+ .sp-animate-bounce {
1470
+ animation: var(--sp-animation-bounce-keyframes) var(--sp-animation-bounce-duration) var(--sp-animation-bounce-easing);
1471
+ }
1472
+
1473
+ .sp-animate-shake {
1474
+ animation: var(--sp-animation-shake-keyframes) var(--sp-animation-shake-duration) var(--sp-animation-shake-easing);
1475
+ }
1476
+
1477
+ .sp-animate-pulse {
1478
+ animation: var(--sp-animation-pulse-keyframes) var(--sp-animation-pulse-duration) var(--sp-animation-pulse-easing);
1479
+ }
1480
+
1481
+ @keyframes fade-in {
1482
+ from {
1483
+ opacity: 0;
1484
+ }
1485
+
1486
+ to {
1487
+ opacity: 1;
1488
+ }
1489
+ }
1490
+
1491
+ @keyframes fade-out {
1492
+ from {
1493
+ opacity: 1;
1494
+ }
1495
+
1496
+ to {
1497
+ opacity: 0;
1498
+ }
1499
+ }
1500
+
1501
+ @keyframes slide-up {
1502
+ from {
1503
+ opacity: 0;
1504
+ transform: translateY(var(--sp-space-8));
1505
+ }
1506
+
1507
+ to {
1508
+ opacity: 1;
1509
+ transform: translateY(0);
1510
+ }
1511
+ }
1512
+
1513
+ @keyframes slide-down {
1514
+ from {
1515
+ opacity: 0;
1516
+ transform: translateY(calc(var(--sp-space-8) * -1));
1517
+ }
1518
+
1519
+ to {
1520
+ opacity: 1;
1521
+ transform: translateY(0);
1522
+ }
1523
+ }
1524
+
1525
+ @keyframes scale-in {
1526
+ from {
1527
+ opacity: 0;
1528
+ transform: scale(0.95);
1529
+ }
1530
+
1531
+ to {
1532
+ opacity: 1;
1533
+ transform: scale(1);
1534
+ }
1535
+ }
1536
+
1537
+ @keyframes bounce {
1538
+
1539
+ 0%,
1540
+ 100% {
1541
+ transform: translateY(0);
1542
+ }
1543
+
1544
+ 50% {
1545
+ transform: translateY(calc(var(--sp-space-4) * -1.5));
1546
+ }
1547
+ }
1548
+
1549
+ @keyframes shake {
1550
+
1551
+ 0%,
1552
+ 100% {
1553
+ transform: translateX(0);
1554
+ }
1555
+
1556
+ 20%,
1557
+ 60% {
1558
+ transform: translateX(calc(var(--sp-space-4) * -1.5));
1559
+ }
1560
+
1561
+ 40%,
1562
+ 80% {
1563
+ transform: translateX(calc(var(--sp-space-4) * 1.5));
1564
+ }
1565
+ }
1566
+
1567
+ @keyframes pulse {
1568
+
1569
+ 0%,
1570
+ 100% {
1571
+ transform: scale(1);
1572
+ }
1573
+
1574
+ 50% {
1575
+ transform: scale(1.04);
1576
+ }
1577
+ }
1072
1578
  }