@phcdevworks/spectre-ui 0.4.1 → 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,17 +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-subtle: #94a3b8;
13
- --sp-text-on-page-meta: #94a3b8;
13
+ --sp-text-on-page-subtle: #64748b;
14
+ --sp-text-on-page-meta: #64748b;
14
15
  --sp-text-on-surface-default: #0f172a;
15
- --sp-text-on-surface-muted: #6b7280;
16
- --sp-text-on-surface-subtle: #94a3b8;
17
- --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;
18
19
  --sp-component-card-text: #0f172a;
19
- --sp-component-card-text-muted: #6b7280;
20
+ --sp-component-card-text-muted: #64748b;
20
21
  --sp-component-input-text: #0f172a;
21
22
  --sp-component-input-placeholder: #94a3b8;
22
23
  --sp-button-text-default: #0f172a;
@@ -33,40 +34,40 @@
33
34
  --sp-badge-danger-text: #b91c1c;
34
35
  --sp-icon-box-bg: #ffffff;
35
36
  --sp-icon-box-border: #e2e8f0;
36
- --sp-icon-box-icon-default: #6c32e6;
37
+ --sp-icon-box-icon-default: #2563eb;
37
38
  --sp-icon-box-icon-success: #16a34a;
38
39
  --sp-icon-box-icon-warning: #d97706;
39
40
  --sp-icon-box-icon-danger: #dc2626;
40
- --sp-color-brand-50: #f5f0ff;
41
- --sp-color-brand-100: #ebe2ff;
42
- --sp-color-brand-200: #d7c6ff;
43
- --sp-color-brand-300: #bfa1ff;
44
- --sp-color-brand-400: #a37aff;
45
- --sp-color-brand-500: #8652ff;
46
- --sp-color-brand-600: #6c32e6;
47
- --sp-color-brand-700: #5626b4;
48
- --sp-color-brand-800: #3d1b7f;
49
- --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;
50
51
  --sp-color-neutral-50: #f8fafc;
51
52
  --sp-color-neutral-100: #f1f5f9;
52
53
  --sp-color-neutral-200: #e2e8f0;
53
- --sp-color-neutral-300: #cbd5f5;
54
+ --sp-color-neutral-300: #cbd5e1;
54
55
  --sp-color-neutral-400: #94a3b8;
55
56
  --sp-color-neutral-500: #64748b;
56
57
  --sp-color-neutral-600: #475569;
57
58
  --sp-color-neutral-700: #334155;
58
59
  --sp-color-neutral-800: #1e293b;
59
60
  --sp-color-neutral-900: #0f172a;
60
- --sp-color-accent-50: #e5fff8;
61
- --sp-color-accent-100: #b8ffed;
62
- --sp-color-accent-200: #89ffe1;
63
- --sp-color-accent-300: #59ffd6;
64
- --sp-color-accent-400: #29ffca;
65
- --sp-color-accent-500: #03e6b3;
66
- --sp-color-accent-600: #00b389;
67
- --sp-color-accent-700: #008060;
68
- --sp-color-accent-800: #004d38;
69
- --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;
70
71
  --sp-color-success-50: #f0fdf4;
71
72
  --sp-color-success-100: #dcfce7;
72
73
  --sp-color-success-200: #bbf7d0;
@@ -107,9 +108,26 @@
107
108
  --sp-color-info-700: #1d4ed8;
108
109
  --sp-color-info-800: #1e40af;
109
110
  --sp-color-info-900: #1e3a8a;
110
- --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;
111
115
  --sp-color-focus-error: #ef4444;
112
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;
113
131
  --sp-space-0: 0rem;
114
132
  --sp-space-4: 0.25rem;
115
133
  --sp-space-8: 0.5rem;
@@ -141,9 +159,9 @@
141
159
  --sp-radius-md: 4px;
142
160
  --sp-radius-lg: 8px;
143
161
  --sp-radius-pill: 999px;
144
- --sp-font-family-sans: 'Inter', 'Helvetica Neue', Arial, sans-serif;
145
- --sp-font-family-serif: 'Spectre Serif', 'Georgia', serif;
146
- --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;
147
165
  --sp-font-xs-size: 0.75rem;
148
166
  --sp-font-xs-line-height: 1.25rem;
149
167
  --sp-font-xs-weight: 400;
@@ -165,12 +183,12 @@
165
183
  --sp-font-xs-letter-spacing: 0.02em;
166
184
  --sp-text-on-page-default: #0f172a;
167
185
  --sp-text-on-page-muted: #475569;
168
- --sp-text-on-page-subtle: #94a3b8;
169
- --sp-text-on-page-meta: #94a3b8;
186
+ --sp-text-on-page-subtle: #64748b;
187
+ --sp-text-on-page-meta: #64748b;
170
188
  --sp-text-on-surface-default: #0f172a;
171
- --sp-text-on-surface-muted: #6b7280;
172
- --sp-text-on-surface-subtle: #94a3b8;
173
- --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;
174
192
  --sp-badge-neutral-bg: #f1f5f9;
175
193
  --sp-badge-neutral-text: #334155;
176
194
  --sp-badge-info-bg: #dbeafe;
@@ -183,14 +201,14 @@
183
201
  --sp-badge-danger-text: #b91c1c;
184
202
  --sp-icon-box-bg: #ffffff;
185
203
  --sp-icon-box-border: #e2e8f0;
186
- --sp-icon-box-icon-default: #6c32e6;
204
+ --sp-icon-box-icon-default: #2563eb;
187
205
  --sp-icon-box-icon-success: #16a34a;
188
206
  --sp-icon-box-icon-warning: #d97706;
189
207
  --sp-icon-box-icon-danger: #dc2626;
190
208
  --sp-shadow-none: none;
191
- --sp-shadow-sm: 0 1px 2px 0 rgba(15, 23, 42, 0.08);
192
- --sp-shadow-md: 0 3px 8px -1px rgba(15, 23, 42, 0.1);
193
- --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);
194
212
  --sp-breakpoint-sm: 640px;
195
213
  --sp-breakpoint-md: 768px;
196
214
  --sp-breakpoint-lg: 1024px;
@@ -214,7 +232,7 @@
214
232
  --sp-easing-in: cubic-bezier(0.4, 0, 1, 1);
215
233
  --sp-easing-out: cubic-bezier(0, 0, 0.2, 1);
216
234
  --sp-easing-inout: cubic-bezier(0.4, 0, 0.2, 1);
217
- --sp-easing-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
235
+ --sp-easing-spring: cubic-bezier(0.4, 0, 0.2, 1);
218
236
  --sp-opacity-disabled: 0.38;
219
237
  --sp-opacity-hover: 0.92;
220
238
  --sp-opacity-active: 0.84;
@@ -226,45 +244,58 @@
226
244
  --sp-focus-ring-style: solid;
227
245
  --sp-min-touch-target: 44px;
228
246
  --sp-min-text-size: 16px;
229
- --sp-button-primary-bg: #8652ff;
230
- --sp-button-primary-bghover: #6c32e6;
231
- --sp-button-primary-bgactive: #5626b4;
232
- --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;
233
251
  --sp-button-primary-text: #ffffff;
234
252
  --sp-button-primary-textdisabled: #94a3b8;
235
253
  --sp-button-secondary-bg: #ffffff;
236
- --sp-button-secondary-bghover: #f1f5f9;
237
- --sp-button-secondary-bgactive: #e2e8f0;
254
+ --sp-button-secondary-bghover: #f8fafc;
255
+ --sp-button-secondary-bgactive: #f1f5f9;
238
256
  --sp-button-secondary-bgdisabled: #f8fafc;
239
- --sp-button-secondary-text: #8652ff;
257
+ --sp-button-secondary-text: #2563eb;
240
258
  --sp-button-secondary-textdisabled: #94a3b8;
241
- --sp-button-secondary-border: #8652ff;
242
- --sp-button-secondary-borderdisabled: #cbd5f5;
259
+ --sp-button-secondary-border: #2563eb;
260
+ --sp-button-secondary-borderdisabled: #e2e8f0;
243
261
  --sp-button-ghost-bg: transparent;
244
- --sp-button-ghost-bghover: #f5f0ff;
245
- --sp-button-ghost-bgactive: #ebe2ff;
262
+ --sp-button-ghost-bghover: #eff6ff;
263
+ --sp-button-ghost-bgactive: #dbeafe;
246
264
  --sp-button-ghost-bgdisabled: transparent;
247
- --sp-button-ghost-text: #8652ff;
265
+ --sp-button-ghost-text: #2563eb;
248
266
  --sp-button-ghost-textdisabled: #94a3b8;
249
- --sp-button-danger-bg: #ef4444;
250
- --sp-button-danger-bghover: #dc2626;
251
- --sp-button-danger-bgactive: #b91c1c;
267
+ --sp-button-danger-bg: #dc2626;
268
+ --sp-button-danger-bghover: #b91c1c;
269
+ --sp-button-danger-bgactive: #991b1b;
252
270
  --sp-button-danger-bgdisabled: #fecaca;
253
271
  --sp-button-danger-text: #ffffff;
254
272
  --sp-button-danger-textdisabled: #94a3b8;
255
- --sp-button-success-bg: #22c55e;
256
- --sp-button-success-bghover: #16a34a;
257
- --sp-button-success-bgactive: #15803d;
273
+ --sp-button-success-bg: #15803d;
274
+ --sp-button-success-bghover: #166534;
275
+ --sp-button-success-bgactive: #14532d;
258
276
  --sp-button-success-bgdisabled: #bbf7d0;
259
277
  --sp-button-success-text: #ffffff;
260
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;
261
292
  --sp-form-default-bg: #ffffff;
262
- --sp-form-default-border: #cbd5f5;
293
+ --sp-form-default-border: #cbd5e1;
263
294
  --sp-form-default-text: #0f172a;
264
295
  --sp-form-default-placeholder: #94a3b8;
265
- --sp-form-hover-border: #8652ff;
266
- --sp-form-focus-border: #8652ff;
267
- --sp-form-focus-ring: #8652ff;
296
+ --sp-form-hover-border: #3b82f6;
297
+ --sp-form-focus-border: #3b82f6;
298
+ --sp-form-focus-ring: #3b82f6;
268
299
  --sp-form-valid-border: #22c55e;
269
300
  --sp-form-valid-bg: #f0fdf4;
270
301
  --sp-form-valid-text: #15803d;
@@ -289,13 +320,13 @@
289
320
  --sp-animation-scalein-duration: 200ms;
290
321
  --sp-animation-scalein-easing: cubic-bezier(0.34, 1.56, 0.64, 1);
291
322
  --sp-animation-scalein-keyframes: scale-in;
292
- --sp-animation-bounce-duration: 500ms;
293
- --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);
294
325
  --sp-animation-bounce-keyframes: bounce;
295
- --sp-animation-shake-duration: 400ms;
326
+ --sp-animation-shake-duration: 250ms;
296
327
  --sp-animation-shake-easing: cubic-bezier(0.4, 0, 0.2, 1);
297
328
  --sp-animation-shake-keyframes: shake;
298
- --sp-animation-pulse-duration: 1500ms;
329
+ --sp-animation-pulse-duration: 1200ms;
299
330
  --sp-animation-pulse-easing: cubic-bezier(0.4, 0, 0.2, 1);
300
331
  --sp-animation-pulse-keyframes: pulse;
301
332
  }
@@ -304,16 +335,17 @@
304
335
  --sp-surface-card: #1e293b;
305
336
  --sp-surface-input: #334155;
306
337
  --sp-surface-overlay: #1e293b;
338
+ --sp-surface-hero: linear-gradient(135deg, #1e3a8a 0%, #6d28d9 100%);
307
339
  --sp-text-on-page-default: #f8fafc;
308
- --sp-text-on-page-muted: #cbd5f5;
340
+ --sp-text-on-page-muted: #cbd5e1;
309
341
  --sp-text-on-page-subtle: #94a3b8;
310
342
  --sp-text-on-page-meta: #94a3b8;
311
343
  --sp-text-on-surface-default: #f1f5f9;
312
- --sp-text-on-surface-muted: #cbd5f5;
344
+ --sp-text-on-surface-muted: #cbd5e1;
313
345
  --sp-text-on-surface-subtle: #94a3b8;
314
346
  --sp-text-on-surface-meta: #94a3b8;
315
347
  --sp-component-card-text: #f1f5f9;
316
- --sp-component-card-text-muted: #cbd5f5;
348
+ --sp-component-card-text-muted: #cbd5e1;
317
349
  --sp-component-input-text: #f1f5f9;
318
350
  --sp-component-input-placeholder: #94a3b8;
319
351
  --sp-button-text-default: #f1f5f9;
@@ -330,7 +362,7 @@
330
362
  --sp-badge-danger-text: #fee2e2;
331
363
  --sp-icon-box-bg: #1e293b;
332
364
  --sp-icon-box-border: #334155;
333
- --sp-icon-box-icon-default: #a37aff;
365
+ --sp-icon-box-icon-default: #93c5fd;
334
366
  --sp-icon-box-icon-success: #4ade80;
335
367
  --sp-icon-box-icon-warning: #fbbf24;
336
368
  --sp-icon-box-icon-danger: #f87171;
@@ -403,6 +435,9 @@
403
435
  @layer components {
404
436
 
405
437
  :root {
438
+ /* structural border width — swap to token when spectre-tokens ships sp-border-width-base */
439
+ --sp-component-border-width: 1px;
440
+
406
441
  /* button roles */
407
442
  --sp-component-button-border-base: var(--sp-component-button-ghost-bg);
408
443
  --sp-component-button-shadow: var(--sp-shadow-sm);
@@ -438,6 +473,19 @@
438
473
  --sp-component-button-success-bg-disabled: var(--sp-button-success-bgdisabled);
439
474
  --sp-component-button-success-text: var(--sp-button-success-text);
440
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);
441
489
 
442
490
  /* card roles */
443
491
  --sp-component-card-bg: var(--sp-surface-card);
@@ -479,12 +527,29 @@
479
527
  --sp-component-badge-radius: var(--sp-radius-pill);
480
528
  --sp-component-badge-primary-bg: var(--sp-button-primary-bg);
481
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);
482
533
  --sp-component-badge-success-bg: var(--sp-badge-success-bg);
483
534
  --sp-component-badge-success-text: var(--sp-badge-success-text);
484
535
  --sp-component-badge-warning-bg: var(--sp-badge-warning-bg);
485
536
  --sp-component-badge-warning-text: var(--sp-badge-warning-text);
486
537
  --sp-component-badge-danger-bg: var(--sp-badge-danger-bg);
487
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
+
488
553
  --sp-component-badge-padding-x-sm: var(--sp-space-8);
489
554
  --sp-component-badge-padding-x-md: var(--sp-space-12);
490
555
  --sp-component-badge-padding-x-lg: var(--sp-space-16);
@@ -507,6 +572,44 @@
507
572
  --sp-component-iconbox-danger-text: var(--sp-icon-box-icon-danger);
508
573
  --sp-component-iconbox-info-bg: var(--sp-color-info-50);
509
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);
510
613
  }
511
614
 
512
615
  /* BUTTONS -------------------------------------------------------------- */
@@ -517,7 +620,7 @@
517
620
  gap: var(--sp-space-4);
518
621
  padding: var(--sp-space-4) var(--sp-space-16);
519
622
  border-radius: var(--sp-radius-md);
520
- border: 1px solid var(--sp-component-button-border-base);
623
+ border: var(--sp-component-border-width) solid var(--sp-component-button-border-base);
521
624
  font-family: var(--sp-font-family-sans);
522
625
  font-size: var(--sp-font-md-size);
523
626
  line-height: 1;
@@ -550,6 +653,10 @@
550
653
  width: 100%;
551
654
  }
552
655
 
656
+ .sp-btn--pill {
657
+ border-radius: var(--sp-radius-pill);
658
+ }
659
+
553
660
  .sp-btn--icon {
554
661
  padding-inline: var(--sp-space-12);
555
662
  padding-block: var(--sp-space-4);
@@ -574,16 +681,8 @@
574
681
  line-height: var(--sp-font-lg-line-height);
575
682
  }
576
683
 
577
- /* Generic forced-state helpers (safe, variant rules still set actual colors) */
578
- .sp-btn.sp-btn--hover,
579
- .sp-btn.is-hover {
580
- /* no-op here; variant sections below define the actual hover colors */
581
- }
684
+ /* Generic forced-state helpers (actual colors defined in variant sections below) */
582
685
 
583
- .sp-btn.sp-btn--active,
584
- .sp-btn.is-active {
585
- /* no-op here; variant sections below define the actual active colors */
586
- }
587
686
 
588
687
  /* primary */
589
688
  .sp-btn--primary {
@@ -709,6 +808,56 @@
709
808
  color: var(--sp-component-button-success-text-disabled);
710
809
  }
711
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
+
712
861
  /* INPUTS --------------------------------------------------------------- */
713
862
 
714
863
  .sp-input-wrapper {
@@ -742,7 +891,7 @@
742
891
  appearance: none;
743
892
  padding: var(--sp-space-4) var(--sp-space-16);
744
893
  border-radius: var(--sp-radius-md);
745
- border: 1px solid var(--sp-component-input-role-border);
894
+ border: var(--sp-component-border-width) solid var(--sp-component-input-role-border);
746
895
  background-color: var(--sp-component-input-role-bg);
747
896
  color: var(--sp-component-input-role-text);
748
897
  font-family: var(--sp-font-family-sans);
@@ -783,7 +932,7 @@
783
932
  .sp-input:focus,
784
933
  .sp-input--focus {
785
934
  border-color: var(--sp-component-input-role-border-focus);
786
- 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);
787
936
  outline: none;
788
937
  }
789
938
 
@@ -824,7 +973,7 @@
824
973
  border-radius: var(--sp-radius-lg);
825
974
  padding: var(--sp-space-24);
826
975
  box-shadow: var(--sp-component-card-shadow);
827
- border: 1px solid var(--sp-component-card-border-base);
976
+ border: var(--sp-component-border-width) solid var(--sp-component-card-border-base);
828
977
  }
829
978
 
830
979
  .sp-card p {
@@ -875,7 +1024,7 @@
875
1024
  .sp-card--interactive:hover,
876
1025
  .sp-card--interactive:focus-visible,
877
1026
  .sp-card--interactive:focus-within {
878
- transform: translateY(-1px);
1027
+ transform: translateY(calc(var(--sp-component-border-width) * -1));
879
1028
  box-shadow: var(--sp-component-card-shadow-elevated);
880
1029
  }
881
1030
 
@@ -892,7 +1041,7 @@
892
1041
  padding: var(--sp-component-badge-padding-y-md) var(--sp-component-badge-padding-x-md);
893
1042
  font-size: var(--sp-font-sm-size);
894
1043
  line-height: var(--sp-font-sm-line-height);
895
- border: 1px solid transparent;
1044
+ border: var(--sp-component-border-width) solid transparent;
896
1045
  white-space: nowrap;
897
1046
  }
898
1047
 
@@ -919,21 +1068,70 @@
919
1068
  color: var(--sp-component-badge-primary-text);
920
1069
  }
921
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
+
922
1085
  .sp-badge--success {
923
1086
  background-color: var(--sp-component-badge-success-bg);
924
1087
  color: var(--sp-component-badge-success-text);
925
1088
  }
926
1089
 
1090
+ .sp-badge--success.sp-badge--interactive:hover {
1091
+ background-color: var(--sp-component-badge-success-bg-hover);
1092
+ }
1093
+
927
1094
  .sp-badge--warning {
928
1095
  background-color: var(--sp-component-badge-warning-bg);
929
1096
  color: var(--sp-component-badge-warning-text);
930
1097
  }
931
1098
 
1099
+ .sp-badge--warning.sp-badge--interactive:hover {
1100
+ background-color: var(--sp-component-badge-warning-bg-hover);
1101
+ }
1102
+
932
1103
  .sp-badge--danger {
933
1104
  background-color: var(--sp-component-badge-danger-bg);
934
1105
  color: var(--sp-component-badge-danger-text);
935
1106
  }
936
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
+
937
1135
  /* ICON BOXES ----------------------------------------------------------- */
938
1136
 
939
1137
  .sp-iconbox {
@@ -1038,6 +1236,147 @@
1038
1236
  background-color: var(--sp-component-iconbox-info-bg);
1039
1237
  color: var(--sp-component-iconbox-info-text);
1040
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
+ }
1041
1380
  }
1042
1381
  @layer utilities {
1043
1382
  .sp-stack {
@@ -1059,7 +1398,7 @@
1059
1398
  margin-right: auto;
1060
1399
  padding-left: var(--sp-layout-container-padding-inline-md);
1061
1400
  padding-right: var(--sp-layout-container-padding-inline-md);
1062
- max-width: 72rem;
1401
+ max-width: calc(var(--sp-space-96) * 12);
1063
1402
  }
1064
1403
 
1065
1404
  .sp-section {
@@ -1108,50 +1447,42 @@
1108
1447
  }
1109
1448
 
1110
1449
  .sp-animate-fade-in {
1111
- animation: var(--sp-animation-fadein-keyframes)
1112
- var(--sp-animation-fadein-duration) var(--sp-animation-fadein-easing);
1450
+ animation: var(--sp-animation-fadein-keyframes) var(--sp-animation-fadein-duration) var(--sp-animation-fadein-easing);
1113
1451
  }
1114
1452
 
1115
1453
  .sp-animate-fade-out {
1116
- animation: var(--sp-animation-fadeout-keyframes)
1117
- var(--sp-animation-fadeout-duration) var(--sp-animation-fadeout-easing);
1454
+ animation: var(--sp-animation-fadeout-keyframes) var(--sp-animation-fadeout-duration) var(--sp-animation-fadeout-easing);
1118
1455
  }
1119
1456
 
1120
1457
  .sp-animate-slide-up {
1121
- animation: var(--sp-animation-slideup-keyframes)
1122
- var(--sp-animation-slideup-duration) var(--sp-animation-slideup-easing);
1458
+ animation: var(--sp-animation-slideup-keyframes) var(--sp-animation-slideup-duration) var(--sp-animation-slideup-easing);
1123
1459
  }
1124
1460
 
1125
1461
  .sp-animate-slide-down {
1126
- animation: var(--sp-animation-slidedown-keyframes)
1127
- var(--sp-animation-slidedown-duration)
1128
- var(--sp-animation-slidedown-easing);
1462
+ animation: var(--sp-animation-slidedown-keyframes) var(--sp-animation-slidedown-duration) var(--sp-animation-slidedown-easing);
1129
1463
  }
1130
1464
 
1131
1465
  .sp-animate-scale-in {
1132
- animation: var(--sp-animation-scalein-keyframes)
1133
- var(--sp-animation-scalein-duration) var(--sp-animation-scalein-easing);
1466
+ animation: var(--sp-animation-scalein-keyframes) var(--sp-animation-scalein-duration) var(--sp-animation-scalein-easing);
1134
1467
  }
1135
1468
 
1136
1469
  .sp-animate-bounce {
1137
- animation: var(--sp-animation-bounce-keyframes)
1138
- var(--sp-animation-bounce-duration) var(--sp-animation-bounce-easing);
1470
+ animation: var(--sp-animation-bounce-keyframes) var(--sp-animation-bounce-duration) var(--sp-animation-bounce-easing);
1139
1471
  }
1140
1472
 
1141
1473
  .sp-animate-shake {
1142
- animation: var(--sp-animation-shake-keyframes)
1143
- var(--sp-animation-shake-duration) var(--sp-animation-shake-easing);
1474
+ animation: var(--sp-animation-shake-keyframes) var(--sp-animation-shake-duration) var(--sp-animation-shake-easing);
1144
1475
  }
1145
1476
 
1146
1477
  .sp-animate-pulse {
1147
- animation: var(--sp-animation-pulse-keyframes)
1148
- var(--sp-animation-pulse-duration) var(--sp-animation-pulse-easing);
1478
+ animation: var(--sp-animation-pulse-keyframes) var(--sp-animation-pulse-duration) var(--sp-animation-pulse-easing);
1149
1479
  }
1150
1480
 
1151
1481
  @keyframes fade-in {
1152
1482
  from {
1153
1483
  opacity: 0;
1154
1484
  }
1485
+
1155
1486
  to {
1156
1487
  opacity: 1;
1157
1488
  }
@@ -1161,6 +1492,7 @@
1161
1492
  from {
1162
1493
  opacity: 1;
1163
1494
  }
1495
+
1164
1496
  to {
1165
1497
  opacity: 0;
1166
1498
  }
@@ -1169,8 +1501,9 @@
1169
1501
  @keyframes slide-up {
1170
1502
  from {
1171
1503
  opacity: 0;
1172
- transform: translateY(0.5rem);
1504
+ transform: translateY(var(--sp-space-8));
1173
1505
  }
1506
+
1174
1507
  to {
1175
1508
  opacity: 1;
1176
1509
  transform: translateY(0);
@@ -1180,8 +1513,9 @@
1180
1513
  @keyframes slide-down {
1181
1514
  from {
1182
1515
  opacity: 0;
1183
- transform: translateY(-0.5rem);
1516
+ transform: translateY(calc(var(--sp-space-8) * -1));
1184
1517
  }
1518
+
1185
1519
  to {
1186
1520
  opacity: 1;
1187
1521
  transform: translateY(0);
@@ -1193,6 +1527,7 @@
1193
1527
  opacity: 0;
1194
1528
  transform: scale(0.95);
1195
1529
  }
1530
+
1196
1531
  to {
1197
1532
  opacity: 1;
1198
1533
  transform: scale(1);
@@ -1200,35 +1535,42 @@
1200
1535
  }
1201
1536
 
1202
1537
  @keyframes bounce {
1538
+
1203
1539
  0%,
1204
1540
  100% {
1205
1541
  transform: translateY(0);
1206
1542
  }
1543
+
1207
1544
  50% {
1208
- transform: translateY(-0.375rem);
1545
+ transform: translateY(calc(var(--sp-space-4) * -1.5));
1209
1546
  }
1210
1547
  }
1211
1548
 
1212
1549
  @keyframes shake {
1550
+
1213
1551
  0%,
1214
1552
  100% {
1215
1553
  transform: translateX(0);
1216
1554
  }
1555
+
1217
1556
  20%,
1218
1557
  60% {
1219
- transform: translateX(-0.375rem);
1558
+ transform: translateX(calc(var(--sp-space-4) * -1.5));
1220
1559
  }
1560
+
1221
1561
  40%,
1222
1562
  80% {
1223
- transform: translateX(0.375rem);
1563
+ transform: translateX(calc(var(--sp-space-4) * 1.5));
1224
1564
  }
1225
1565
  }
1226
1566
 
1227
1567
  @keyframes pulse {
1568
+
1228
1569
  0%,
1229
1570
  100% {
1230
1571
  transform: scale(1);
1231
1572
  }
1573
+
1232
1574
  50% {
1233
1575
  transform: scale(1.04);
1234
1576
  }