@phcdevworks/spectre-ui 1.1.1 → 1.1.2

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.
@@ -1,3 +1,378 @@
1
+ :root {
2
+ --sp-surface-page: #f7f8fb;
3
+ --sp-surface-card: #ffffff;
4
+ --sp-surface-input: #ffffff;
5
+ --sp-surface-overlay: rgba(20, 27, 36, 0.6);
6
+ --sp-surface-hero: linear-gradient(135deg, #5b6ee1 0%, #6f3fd7 100%);
7
+ --sp-text-on-page-default: #141b24;
8
+ --sp-text-on-page-muted: #4b576a;
9
+ --sp-text-on-page-subtle: #657287;
10
+ --sp-text-on-page-meta: #657287;
11
+ --sp-text-on-surface-default: #141b24;
12
+ --sp-text-on-surface-muted: #4b576a;
13
+ --sp-text-on-surface-subtle: #657287;
14
+ --sp-text-on-surface-meta: #657287;
15
+ --sp-component-card-text: #141b24;
16
+ --sp-component-card-text-muted: #657287;
17
+ --sp-component-input-text: #141b24;
18
+ --sp-component-input-placeholder: #657287;
19
+ --sp-button-text-default: #141b24;
20
+ --sp-button-text-on-primary: #ffffff;
21
+ --sp-badge-neutral-bg: #eef1f6;
22
+ --sp-badge-neutral-text: #374253;
23
+ --sp-badge-info-bg: #e0f2fe;
24
+ --sp-badge-info-text: #075985;
25
+ --sp-badge-success-bg: #dcfce7;
26
+ --sp-badge-success-text: #15803d;
27
+ --sp-badge-warning-bg: #fff1c2;
28
+ --sp-badge-warning-text: #8f5200;
29
+ --sp-badge-danger-bg: #fee2e2;
30
+ --sp-badge-danger-text: #b91c1c;
31
+ --sp-icon-box-bg: #ffffff;
32
+ --sp-icon-box-border: #d9dfeb;
33
+ --sp-icon-box-icon-default: #0369a1;
34
+ --sp-icon-box-icon-success: #16a34a;
35
+ --sp-icon-box-icon-warning: #d48806;
36
+ --sp-icon-box-icon-danger: #dc2626;
37
+ --sp-color-brand-50: #eef4ff;
38
+ --sp-color-brand-100: #d9e7ff;
39
+ --sp-color-brand-200: #b9d2ff;
40
+ --sp-color-brand-300: #8ab6ff;
41
+ --sp-color-brand-400: #5a92ff;
42
+ --sp-color-brand-500: #336df4;
43
+ --sp-color-brand-600: #1f57db;
44
+ --sp-color-brand-700: #1946b4;
45
+ --sp-color-brand-800: #173b8f;
46
+ --sp-color-brand-900: #16336f;
47
+ --sp-color-neutral-50: #f7f8fb;
48
+ --sp-color-neutral-100: #eef1f6;
49
+ --sp-color-neutral-200: #d9dfeb;
50
+ --sp-color-neutral-300: #b7c1d4;
51
+ --sp-color-neutral-400: #8a96ad;
52
+ --sp-color-neutral-500: #657287;
53
+ --sp-color-neutral-600: #4b576a;
54
+ --sp-color-neutral-700: #374253;
55
+ --sp-color-neutral-800: #222b38;
56
+ --sp-color-neutral-900: #141b24;
57
+ --sp-color-accent-50: #f6f2ff;
58
+ --sp-color-accent-100: #eee5ff;
59
+ --sp-color-accent-200: #ddccff;
60
+ --sp-color-accent-300: #c3a7ff;
61
+ --sp-color-accent-400: #a279ff;
62
+ --sp-color-accent-500: #854ff7;
63
+ --sp-color-accent-600: #7135dd;
64
+ --sp-color-accent-700: #5d28b8;
65
+ --sp-color-accent-800: #4d2393;
66
+ --sp-color-accent-900: #401f75;
67
+ --sp-color-success-50: #f0fdf4;
68
+ --sp-color-success-100: #dcfce7;
69
+ --sp-color-success-200: #bbf7d0;
70
+ --sp-color-success-300: #86efac;
71
+ --sp-color-success-400: #4ade80;
72
+ --sp-color-success-500: #22c55e;
73
+ --sp-color-success-600: #16a34a;
74
+ --sp-color-success-700: #15803d;
75
+ --sp-color-success-800: #166534;
76
+ --sp-color-success-900: #14532d;
77
+ --sp-color-warning-50: #fffbea;
78
+ --sp-color-warning-100: #fff1c2;
79
+ --sp-color-warning-200: #ffe08a;
80
+ --sp-color-warning-300: #ffd24d;
81
+ --sp-color-warning-400: #ffc21a;
82
+ --sp-color-warning-500: #f5ad00;
83
+ --sp-color-warning-600: #d48806;
84
+ --sp-color-warning-700: #ad6800;
85
+ --sp-color-warning-800: #8f5200;
86
+ --sp-color-warning-900: #734000;
87
+ --sp-color-error-50: #fef2f2;
88
+ --sp-color-error-100: #fee2e2;
89
+ --sp-color-error-200: #fecaca;
90
+ --sp-color-error-300: #fca5a5;
91
+ --sp-color-error-400: #f87171;
92
+ --sp-color-error-500: #ef4444;
93
+ --sp-color-error-600: #dc2626;
94
+ --sp-color-error-700: #b91c1c;
95
+ --sp-color-error-800: #991b1b;
96
+ --sp-color-error-900: #7f1d1d;
97
+ --sp-color-info-50: #f0f9ff;
98
+ --sp-color-info-100: #e0f2fe;
99
+ --sp-color-info-200: #bae6fd;
100
+ --sp-color-info-300: #7dd3fc;
101
+ --sp-color-info-400: #38bdf8;
102
+ --sp-color-info-500: #0ea5e9;
103
+ --sp-color-info-600: #0369a1;
104
+ --sp-color-info-700: #075985;
105
+ --sp-color-info-800: #0c4a6e;
106
+ --sp-color-info-900: #082f49;
107
+ --sp-color-indigo-500: #5b6ee1;
108
+ --sp-color-indigo-600: #4d61db;
109
+ --sp-color-violet-600: #6f3fd7;
110
+ --sp-color-focus-primary: #336df4;
111
+ --sp-color-focus-error: #ef4444;
112
+ --sp-color-focus-info: #0369a1;
113
+ --sp-color-white-0: #;
114
+ --sp-color-white-1: f;
115
+ --sp-color-white-2: f;
116
+ --sp-color-white-3: f;
117
+ --sp-color-white-4: f;
118
+ --sp-color-white-5: f;
119
+ --sp-color-white-6: f;
120
+ --sp-color-black-0: #;
121
+ --sp-color-black-1: 0;
122
+ --sp-color-black-2: 0;
123
+ --sp-color-black-3: 0;
124
+ --sp-color-black-4: 0;
125
+ --sp-color-black-5: 0;
126
+ --sp-color-black-6: 0;
127
+ --sp-space-0: 0rem;
128
+ --sp-space-4: 0.25rem;
129
+ --sp-space-8: 0.5rem;
130
+ --sp-space-12: 0.75rem;
131
+ --sp-space-16: 1rem;
132
+ --sp-space-20: 1.25rem;
133
+ --sp-space-24: 1.5rem;
134
+ --sp-space-32: 2rem;
135
+ --sp-space-40: 2.5rem;
136
+ --sp-space-48: 3rem;
137
+ --sp-space-56: 3.5rem;
138
+ --sp-space-64: 4rem;
139
+ --sp-space-80: 5rem;
140
+ --sp-space-96: 6rem;
141
+ --sp-layout-section-padding-sm: 1.5rem;
142
+ --sp-layout-section-padding-md: 2rem;
143
+ --sp-layout-section-padding-lg: 3rem;
144
+ --sp-layout-section-gap-sm: 1rem;
145
+ --sp-layout-section-gap-md: 1.5rem;
146
+ --sp-layout-section-gap-lg: 2rem;
147
+ --sp-layout-stack-gap-sm: 0.5rem;
148
+ --sp-layout-stack-gap-md: 0.75rem;
149
+ --sp-layout-stack-gap-lg: 1rem;
150
+ --sp-layout-container-padding-inline-sm: 1rem;
151
+ --sp-layout-container-padding-inline-md: 1.5rem;
152
+ --sp-layout-container-padding-inline-lg: 2rem;
153
+ --sp-layout-container-max-width: 72rem;
154
+ --sp-border-width-base: 1px;
155
+ --sp-border-width-thick: 2px;
156
+ --sp-radius-none: 0;
157
+ --sp-radius-sm: 2px;
158
+ --sp-radius-md: 4px;
159
+ --sp-radius-lg: 8px;
160
+ --sp-radius-pill: 999px;
161
+ --sp-font-family-sans: system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif;
162
+ --sp-font-family-serif: 'Times New Roman', Times, serif;
163
+ --sp-font-family-mono: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
164
+ --sp-font-xs-size: 0.75rem;
165
+ --sp-font-xs-line-height: 1.25rem;
166
+ --sp-font-xs-weight: 400;
167
+ --sp-font-sm-size: 0.875rem;
168
+ --sp-font-sm-line-height: 1.5rem;
169
+ --sp-font-sm-weight: 400;
170
+ --sp-font-md-size: 1rem;
171
+ --sp-font-md-line-height: 1.75rem;
172
+ --sp-font-md-weight: 500;
173
+ --sp-font-lg-size: 1.25rem;
174
+ --sp-font-lg-line-height: 2rem;
175
+ --sp-font-lg-weight: 500;
176
+ --sp-font-xl-size: 1.5rem;
177
+ --sp-font-xl-line-height: 2.125rem;
178
+ --sp-font-xl-weight: 600;
179
+ --sp-font-2xl-size: 1.875rem;
180
+ --sp-font-2xl-line-height: 2.5rem;
181
+ --sp-font-2xl-weight: 600;
182
+ --sp-font-xs-letter-spacing: 0.02em;
183
+ --sp-text-on-page-default: #141b24;
184
+ --sp-text-on-page-muted: #4b576a;
185
+ --sp-text-on-page-subtle: #657287;
186
+ --sp-text-on-page-meta: #657287;
187
+ --sp-text-on-surface-default: #141b24;
188
+ --sp-text-on-surface-muted: #4b576a;
189
+ --sp-text-on-surface-subtle: #657287;
190
+ --sp-text-on-surface-meta: #657287;
191
+ --sp-badge-neutral-bg: #eef1f6;
192
+ --sp-badge-neutral-text: #374253;
193
+ --sp-badge-info-bg: #e0f2fe;
194
+ --sp-badge-info-text: #075985;
195
+ --sp-badge-success-bg: #dcfce7;
196
+ --sp-badge-success-text: #166534;
197
+ --sp-badge-warning-bg: #fff1c2;
198
+ --sp-badge-warning-text: #8f5200;
199
+ --sp-badge-danger-bg: #fee2e2;
200
+ --sp-badge-danger-text: #991b1b;
201
+ --sp-icon-box-bg: #ffffff;
202
+ --sp-icon-box-border: #d9dfeb;
203
+ --sp-icon-box-icon-default: #0369a1;
204
+ --sp-icon-box-icon-success: #16a34a;
205
+ --sp-icon-box-icon-warning: #d48806;
206
+ --sp-icon-box-icon-danger: #dc2626;
207
+ --sp-shadow-none: none;
208
+ --sp-shadow-sm: 0 1px 2px 0 rgba(34, 43, 56, 0.06);
209
+ --sp-shadow-md: 0 2px 6px -1px rgba(34, 43, 56, 0.08);
210
+ --sp-shadow-lg: 0 6px 16px -4px rgba(34, 43, 56, 0.12);
211
+ --sp-breakpoint-sm: 640px;
212
+ --sp-breakpoint-md: 768px;
213
+ --sp-breakpoint-lg: 1024px;
214
+ --sp-breakpoint-xl: 1280px;
215
+ --sp-breakpoint-2xl: 1536px;
216
+ --sp-z-index-base: 0;
217
+ --sp-z-index-dropdown: 1000;
218
+ --sp-z-index-sticky: 1100;
219
+ --sp-z-index-fixed: 1200;
220
+ --sp-z-index-overlay: 1300;
221
+ --sp-z-index-modal: 1400;
222
+ --sp-z-index-popover: 1500;
223
+ --sp-z-index-tooltip: 1600;
224
+ --sp-duration-instant: 75ms;
225
+ --sp-duration-fast: 150ms;
226
+ --sp-duration-base: 200ms;
227
+ --sp-duration-moderate: 300ms;
228
+ --sp-duration-slow: 500ms;
229
+ --sp-duration-slower: 700ms;
230
+ --sp-easing-linear: linear;
231
+ --sp-easing-in: cubic-bezier(0.4, 0, 1, 1);
232
+ --sp-easing-out: cubic-bezier(0, 0, 0.2, 1);
233
+ --sp-easing-inout: cubic-bezier(0.4, 0, 0.2, 1);
234
+ --sp-easing-spring: cubic-bezier(0.4, 0, 0.2, 1);
235
+ --sp-opacity-disabled: 0.38;
236
+ --sp-opacity-hover: 0.92;
237
+ --sp-opacity-active: 0.84;
238
+ --sp-opacity-focus: 1;
239
+ --sp-opacity-overlay: 0.5;
240
+ --sp-opacity-tooltip: 0.95;
241
+ --sp-focus-ring-width: 2px;
242
+ --sp-focus-ring-offset: 2px;
243
+ --sp-focus-ring-style: solid;
244
+ --sp-min-touch-target: 44px;
245
+ --sp-min-text-size: 16px;
246
+ --sp-button-primary-bg: #0369a1;
247
+ --sp-button-primary-bghover: #075985;
248
+ --sp-button-primary-bgactive: #0c4a6e;
249
+ --sp-button-primary-bgdisabled: #d9dfeb;
250
+ --sp-button-primary-text: #ffffff;
251
+ --sp-button-primary-textdisabled: #8a96ad;
252
+ --sp-button-primary-focusring: rgba(14, 165, 233, 0.4);
253
+ --sp-button-secondary-bg: #ffffff;
254
+ --sp-button-secondary-bghover: #f7f8fb;
255
+ --sp-button-secondary-bgactive: #eef1f6;
256
+ --sp-button-secondary-bgdisabled: #f7f8fb;
257
+ --sp-button-secondary-text: #075985;
258
+ --sp-button-secondary-textdisabled: #8a96ad;
259
+ --sp-button-secondary-border: #075985;
260
+ --sp-button-secondary-borderdisabled: #d9dfeb;
261
+ --sp-button-secondary-focusring: rgba(14, 165, 233, 0.4);
262
+ --sp-button-ghost-bg: transparent;
263
+ --sp-button-ghost-bghover: #f0f9ff;
264
+ --sp-button-ghost-bgactive: #e0f2fe;
265
+ --sp-button-ghost-bgdisabled: transparent;
266
+ --sp-button-ghost-text: #075985;
267
+ --sp-button-ghost-textdisabled: #8a96ad;
268
+ --sp-button-ghost-focusring: rgba(14, 165, 233, 0.4);
269
+ --sp-button-danger-bg: #dc2626;
270
+ --sp-button-danger-bghover: #b91c1c;
271
+ --sp-button-danger-bgactive: #991b1b;
272
+ --sp-button-danger-bgdisabled: #fecaca;
273
+ --sp-button-danger-text: #ffffff;
274
+ --sp-button-danger-textdisabled: #8a96ad;
275
+ --sp-button-danger-focusring: rgba(239, 68, 68, 0.4);
276
+ --sp-button-success-bg: #15803d;
277
+ --sp-button-success-bghover: #166534;
278
+ --sp-button-success-bgactive: #14532d;
279
+ --sp-button-success-bgdisabled: #bbf7d0;
280
+ --sp-button-success-text: #ffffff;
281
+ --sp-button-success-textdisabled: #8a96ad;
282
+ --sp-button-success-focusring: rgba(34, 197, 94, 0.4);
283
+ --sp-button-cta-bg: #1f57db;
284
+ --sp-button-cta-bghover: #1946b4;
285
+ --sp-button-cta-bgactive: #173b8f;
286
+ --sp-button-cta-bgdisabled: #b9d2ff;
287
+ --sp-button-cta-text: #ffffff;
288
+ --sp-button-cta-textdisabled: #8a96ad;
289
+ --sp-button-cta-shadow: 0 4px 14px 0 rgba(51, 109, 244, 0.39);
290
+ --sp-button-cta-focusring: rgba(51, 109, 244, 0.4);
291
+ --sp-button-accent-bg: #7135dd;
292
+ --sp-button-accent-bghover: #5d28b8;
293
+ --sp-button-accent-bgactive: #4d2393;
294
+ --sp-button-accent-bgdisabled: #ddccff;
295
+ --sp-button-accent-text: #ffffff;
296
+ --sp-button-accent-textdisabled: #8a96ad;
297
+ --sp-button-accent-focusring: rgba(133, 79, 247, 0.4);
298
+ --sp-form-default-bg: #ffffff;
299
+ --sp-form-default-border: #b7c1d4;
300
+ --sp-form-default-text: #141b24;
301
+ --sp-form-default-placeholder: #657287;
302
+ --sp-form-hover-border: #0ea5e9;
303
+ --sp-form-focus-border: #0ea5e9;
304
+ --sp-form-focus-ring: #0ea5e9;
305
+ --sp-form-valid-border: #22c55e;
306
+ --sp-form-valid-bg: #f0fdf4;
307
+ --sp-form-valid-text: #15803d;
308
+ --sp-form-invalid-border: #ef4444;
309
+ --sp-form-invalid-bg: #fef2f2;
310
+ --sp-form-invalid-text: #b91c1c;
311
+ --sp-form-disabled-bg: #f7f8fb;
312
+ --sp-form-disabled-border: #d9dfeb;
313
+ --sp-form-disabled-text: #8a96ad;
314
+ --sp-animation-fadein-duration: 200ms;
315
+ --sp-animation-fadein-easing: cubic-bezier(0, 0, 0.2, 1);
316
+ --sp-animation-fadein-keyframes: fade-in;
317
+ --sp-animation-fadeout-duration: 150ms;
318
+ --sp-animation-fadeout-easing: cubic-bezier(0.4, 0, 1, 1);
319
+ --sp-animation-fadeout-keyframes: fade-out;
320
+ --sp-animation-slideup-duration: 300ms;
321
+ --sp-animation-slideup-easing: cubic-bezier(0, 0, 0.2, 1);
322
+ --sp-animation-slideup-keyframes: slide-up;
323
+ --sp-animation-slidedown-duration: 300ms;
324
+ --sp-animation-slidedown-easing: cubic-bezier(0, 0, 0.2, 1);
325
+ --sp-animation-slidedown-keyframes: slide-down;
326
+ --sp-animation-scalein-duration: 200ms;
327
+ --sp-animation-scalein-easing: cubic-bezier(0.34, 1.56, 0.64, 1);
328
+ --sp-animation-scalein-keyframes: scale-in;
329
+ --sp-animation-bounce-duration: 300ms;
330
+ --sp-animation-bounce-easing: cubic-bezier(0.4, 0, 0.2, 1);
331
+ --sp-animation-bounce-keyframes: bounce;
332
+ --sp-animation-shake-duration: 250ms;
333
+ --sp-animation-shake-easing: cubic-bezier(0.4, 0, 0.2, 1);
334
+ --sp-animation-shake-keyframes: shake;
335
+ --sp-animation-pulse-duration: 1200ms;
336
+ --sp-animation-pulse-easing: cubic-bezier(0.4, 0, 0.2, 1);
337
+ --sp-animation-pulse-keyframes: pulse;
338
+ }
339
+ :root[data-spectre-theme="dark"] {
340
+ --sp-surface-page: #141b24;
341
+ --sp-surface-card: #222b38;
342
+ --sp-surface-input: #374253;
343
+ --sp-surface-overlay: #222b38;
344
+ --sp-surface-hero: linear-gradient(135deg, #401f75 0%, #5d28b8 100%);
345
+ --sp-text-on-page-default: #f7f8fb;
346
+ --sp-text-on-page-muted: #b7c1d4;
347
+ --sp-text-on-page-subtle: #8a96ad;
348
+ --sp-text-on-page-meta: #8a96ad;
349
+ --sp-text-on-surface-default: #eef1f6;
350
+ --sp-text-on-surface-muted: #b7c1d4;
351
+ --sp-text-on-surface-subtle: #8a96ad;
352
+ --sp-text-on-surface-meta: #8a96ad;
353
+ --sp-component-card-text: #eef1f6;
354
+ --sp-component-card-text-muted: #b7c1d4;
355
+ --sp-component-input-text: #eef1f6;
356
+ --sp-component-input-placeholder: #b7c1d4;
357
+ --sp-button-text-default: #eef1f6;
358
+ --sp-button-text-on-primary: #ffffff;
359
+ --sp-badge-neutral-bg: #374253;
360
+ --sp-badge-neutral-text: #eef1f6;
361
+ --sp-badge-info-bg: #0c4a6e;
362
+ --sp-badge-info-text: #e0f2fe;
363
+ --sp-badge-success-bg: #166534;
364
+ --sp-badge-success-text: #dcfce7;
365
+ --sp-badge-warning-bg: #8f5200;
366
+ --sp-badge-warning-text: #fff1c2;
367
+ --sp-badge-danger-bg: #991b1b;
368
+ --sp-badge-danger-text: #fee2e2;
369
+ --sp-icon-box-bg: #222b38;
370
+ --sp-icon-box-border: #374253;
371
+ --sp-icon-box-icon-default: #7dd3fc;
372
+ --sp-icon-box-icon-success: #4ade80;
373
+ --sp-icon-box-icon-warning: #ffc21a;
374
+ --sp-icon-box-icon-danger: #f87171;
375
+ }
1
376
  @layer components {
2
377
 
3
378
  :root {
@@ -39,15 +414,14 @@
39
414
  --sp-component-button-success-bg-disabled: var(--sp-button-success-bgdisabled);
40
415
  --sp-component-button-success-text: var(--sp-button-success-text);
41
416
  --sp-component-button-success-text-disabled: var(--sp-button-success-textdisabled);
42
- /* FLAG: buttons.cta tokens in spectre-tokens v2.x use warning.500 (Gold),
43
- which violates the Aesthetic Audit guardrails. Remaining on accent palette. */
44
- --sp-component-button-cta-bg: var(--sp-color-accent-600);
45
- --sp-component-button-cta-bg-hover: var(--sp-color-accent-700);
46
- --sp-component-button-cta-bg-active: var(--sp-color-accent-800);
47
- --sp-component-button-cta-bg-disabled: var(--sp-color-accent-200);
48
- --sp-component-button-cta-text: var(--sp-color-neutral-50);
49
- --sp-component-button-cta-text-disabled: var(--sp-color-neutral-400);
50
- --sp-component-button-cta-shadow: 0 4px 14px 0 var(--sp-color-accent-500) / 0.39;
417
+ /* CTA button alignment restored to official tokens as they now use the brand palette (Blue). */
418
+ --sp-component-button-cta-bg: var(--sp-button-cta-bg);
419
+ --sp-component-button-cta-bg-hover: var(--sp-button-cta-bghover);
420
+ --sp-component-button-cta-bg-active: var(--sp-button-cta-bgactive);
421
+ --sp-component-button-cta-bg-disabled: var(--sp-button-cta-bgdisabled);
422
+ --sp-component-button-cta-text: var(--sp-button-cta-text);
423
+ --sp-component-button-cta-text-disabled: var(--sp-button-cta-textdisabled);
424
+ --sp-component-button-cta-shadow: var(--sp-button-cta-shadow);
51
425
  --sp-component-button-accent-bg: var(--sp-button-accent-bg);
52
426
  --sp-component-button-accent-bg-hover: var(--sp-button-accent-bghover);
53
427
  --sp-component-button-accent-bg-active: var(--sp-button-accent-bgactive);
@@ -76,6 +450,7 @@
76
450
  --sp-component-input-role-bg: var(--sp-form-default-bg);
77
451
  --sp-component-input-role-text: var(--sp-form-default-text);
78
452
  --sp-component-input-role-placeholder: var(--sp-form-default-placeholder);
453
+ --sp-component-input-role-border-hover: var(--sp-form-hover-border);
79
454
  --sp-component-input-role-border-focus: var(--sp-form-focus-border);
80
455
  --sp-component-input-role-ring: var(--sp-form-focus-ring);
81
456
  --sp-component-input-role-border-error: var(--sp-form-invalid-border);
@@ -109,7 +484,7 @@
109
484
  --sp-component-badge-info-bg: var(--sp-badge-info-bg);
110
485
  --sp-component-badge-info-text: var(--sp-badge-info-text);
111
486
 
112
- /* badge hover states missing from core token exports, mapped to semantic logic */
487
+ /* badge hover states derived from Spectre token semantics */
113
488
  --sp-component-badge-primary-bg-hover: var(--sp-button-primary-bghover);
114
489
  --sp-component-badge-secondary-bg-hover: var(--sp-button-secondary-bghover);
115
490
  --sp-component-badge-success-bg-hover: var(--sp-color-success-200);
@@ -152,10 +527,8 @@
152
527
  /* pricing card roles */
153
528
  --sp-component-pricing-card-bg: var(--sp-surface-card);
154
529
  --sp-component-pricing-card-border: var(--sp-color-neutral-200);
155
- /* FLAG: component.pricingCard.featuredBg in tokens is info.600 (Blue), which clashing
156
- with the warning.500 (Gold) badge. Remaining on neutral-900 to pass Aesthetic Audit. */
157
- --sp-component-pricing-card-featured-bg: var(--sp-color-neutral-900);
158
- --sp-component-pricing-card-featured-text: var(--sp-color-neutral-50);
530
+ --sp-component-pricing-card-featured-bg: var(--sp-color-info-600);
531
+ --sp-component-pricing-card-featured-text: var(--sp-button-text-on-primary);
159
532
  --sp-component-pricing-card-featured-badge-bg: var(--sp-color-warning-500);
160
533
  --sp-component-pricing-card-featured-badge-text: var(--sp-color-neutral-900);
161
534
  --sp-component-pricing-card-price: var(--sp-color-neutral-900);
@@ -168,20 +541,21 @@
168
541
  --sp-component-rating-text: var(--sp-color-neutral-500);
169
542
  }
170
543
 
171
- /* dark mode overrides for complex component tokens not yet exported by spectre-tokens v2.x */
544
+ /* dark mode overrides mapped from Spectre token mode definitions */
172
545
  :root[data-spectre-theme="dark"] {
173
546
  --sp-component-testimonial-bg: var(--sp-color-neutral-800);
174
547
  --sp-component-testimonial-border: var(--sp-color-neutral-700);
175
- --sp-component-testimonial-text: var(--sp-color-neutral-300);
548
+ --sp-component-testimonial-text: var(--sp-color-neutral-200);
176
549
  --sp-component-testimonial-author-name: var(--sp-color-neutral-100);
177
- --sp-component-testimonial-author-title: var(--sp-color-neutral-400);
550
+ --sp-component-testimonial-author-title: var(--sp-color-neutral-300);
178
551
  --sp-component-testimonial-quote-mark: var(--sp-color-neutral-600);
179
552
 
180
553
  --sp-component-pricing-card-bg: var(--sp-color-neutral-800);
181
554
  --sp-component-pricing-card-border: var(--sp-color-neutral-700);
182
555
  --sp-component-pricing-card-price: var(--sp-color-neutral-100);
183
- --sp-component-pricing-card-price-description: var(--sp-color-neutral-400);
556
+ --sp-component-pricing-card-price-description: var(--sp-color-neutral-300);
184
557
 
558
+ --sp-component-rating-star-filled: var(--sp-color-warning-400);
185
559
  --sp-component-rating-star-empty: var(--sp-color-neutral-700);
186
560
  --sp-component-rating-text: var(--sp-color-neutral-400);
187
561
 
@@ -193,11 +567,11 @@
193
567
  --sp-component-badge-danger-text: var(--sp-color-error-100);
194
568
  --sp-component-badge-neutral-bg: var(--sp-color-neutral-700);
195
569
  --sp-component-badge-neutral-text: var(--sp-color-neutral-100);
196
- --sp-component-badge-info-bg: var(--sp-color-info-800);
570
+ --sp-component-badge-info-bg: var(--sp-color-info-900);
197
571
  --sp-component-badge-info-text: var(--sp-color-info-100);
198
572
 
199
573
  --sp-component-badge-success-bg-hover: var(--sp-color-success-700);
200
- --sp-component-badge-warning-bg-hover: var(--sp-color-warning-700);
574
+ --sp-component-badge-warning-bg-hover: var(--sp-color-warning-800);
201
575
  --sp-component-badge-danger-bg-hover: var(--sp-color-error-700);
202
576
  --sp-component-badge-neutral-bg-hover: var(--sp-color-neutral-600);
203
577
  --sp-component-badge-info-bg-hover: var(--sp-color-info-700);
@@ -524,8 +898,14 @@
524
898
  border-radius: var(--sp-radius-pill);
525
899
  }
526
900
 
901
+ .sp-input:hover,
902
+ .sp-input--hover {
903
+ border-color: var(--sp-component-input-role-border-hover);
904
+ }
905
+
527
906
  .sp-input:focus,
528
- .sp-input--focus {
907
+ .sp-input--focus,
908
+ .sp-input.is-focus {
529
909
  border-color: var(--sp-component-input-role-border-focus);
530
910
  box-shadow: 0 0 0 calc(var(--sp-focus-ring-width) + var(--sp-component-border-width)) var(--sp-component-input-role-ring);
531
911
  outline: none;
@@ -544,11 +924,14 @@
544
924
  color: var(--sp-component-input-role-text);
545
925
  }
546
926
 
927
+ .sp-input:disabled,
928
+ .sp-input[aria-disabled="true"],
547
929
  .sp-input--disabled {
548
930
  background-color: var(--sp-component-input-role-bg-disabled);
549
931
  color: var(--sp-component-input-role-text-disabled);
550
932
  border-color: var(--sp-component-input-role-border-disabled);
551
933
  cursor: not-allowed;
934
+ pointer-events: none;
552
935
  }
553
936
 
554
937
  .sp-input--disabled::placeholder {
@@ -619,6 +1002,11 @@
619
1002
  pointer-events: none;
620
1003
  }
621
1004
 
1005
+ .sp-card--loading {
1006
+ opacity: var(--sp-opacity-active);
1007
+ pointer-events: none;
1008
+ }
1009
+
622
1010
  .sp-card--interactive {
623
1011
  cursor: pointer;
624
1012
  transition:
@@ -628,7 +1016,11 @@
628
1016
 
629
1017
  .sp-card--interactive:hover,
630
1018
  .sp-card--interactive:focus-visible,
631
- .sp-card--interactive:focus-within {
1019
+ .sp-card--interactive:focus-within,
1020
+ .sp-card--interactive.sp-card--hover,
1021
+ .sp-card--interactive.is-hover,
1022
+ .sp-card--interactive.sp-card--focus,
1023
+ .sp-card--interactive.is-focus {
632
1024
  transform: translateY(calc(var(--sp-component-border-width) * -1));
633
1025
  box-shadow: var(--sp-component-card-shadow-elevated);
634
1026
  }
@@ -673,7 +1065,8 @@
673
1065
  color: var(--sp-component-badge-primary-text);
674
1066
  }
675
1067
 
676
- .sp-badge--primary.sp-badge--interactive:hover {
1068
+ .sp-badge--primary.sp-badge--interactive:hover,
1069
+ .sp-badge--primary.sp-badge--interactive.sp-badge--hover {
677
1070
  background-color: var(--sp-component-badge-primary-bg-hover);
678
1071
  }
679
1072
 
@@ -683,7 +1076,8 @@
683
1076
  border-color: var(--sp-component-badge-secondary-border);
684
1077
  }
685
1078
 
686
- .sp-badge--secondary.sp-badge--interactive:hover {
1079
+ .sp-badge--secondary.sp-badge--interactive:hover,
1080
+ .sp-badge--secondary.sp-badge--interactive.sp-badge--hover {
687
1081
  background-color: var(--sp-component-badge-secondary-bg-hover);
688
1082
  }
689
1083
 
@@ -692,7 +1086,8 @@
692
1086
  color: var(--sp-component-badge-success-text);
693
1087
  }
694
1088
 
695
- .sp-badge--success.sp-badge--interactive:hover {
1089
+ .sp-badge--success.sp-badge--interactive:hover,
1090
+ .sp-badge--success.sp-badge--interactive.sp-badge--hover {
696
1091
  background-color: var(--sp-component-badge-success-bg-hover);
697
1092
  }
698
1093
 
@@ -701,7 +1096,8 @@
701
1096
  color: var(--sp-component-badge-warning-text);
702
1097
  }
703
1098
 
704
- .sp-badge--warning.sp-badge--interactive:hover {
1099
+ .sp-badge--warning.sp-badge--interactive:hover,
1100
+ .sp-badge--warning.sp-badge--interactive.sp-badge--hover {
705
1101
  background-color: var(--sp-component-badge-warning-bg-hover);
706
1102
  }
707
1103
 
@@ -710,7 +1106,8 @@
710
1106
  color: var(--sp-component-badge-danger-text);
711
1107
  }
712
1108
 
713
- .sp-badge--danger.sp-badge--interactive:hover {
1109
+ .sp-badge--danger.sp-badge--interactive:hover,
1110
+ .sp-badge--danger.sp-badge--interactive.sp-badge--hover {
714
1111
  background-color: var(--sp-component-badge-danger-bg-hover);
715
1112
  }
716
1113
 
@@ -719,7 +1116,8 @@
719
1116
  color: var(--sp-component-badge-neutral-text);
720
1117
  }
721
1118
 
722
- .sp-badge--neutral.sp-badge--interactive:hover {
1119
+ .sp-badge--neutral.sp-badge--interactive:hover,
1120
+ .sp-badge--neutral.sp-badge--interactive.sp-badge--hover {
723
1121
  background-color: var(--sp-component-badge-neutral-bg-hover);
724
1122
  }
725
1123
 
@@ -728,7 +1126,8 @@
728
1126
  color: var(--sp-component-badge-info-text);
729
1127
  }
730
1128
 
731
- .sp-badge--info.sp-badge--interactive:hover {
1129
+ .sp-badge--info.sp-badge--interactive:hover,
1130
+ .sp-badge--info.sp-badge--interactive.sp-badge--hover {
732
1131
  background-color: var(--sp-component-badge-info-bg-hover);
733
1132
  }
734
1133
 
@@ -951,6 +1350,11 @@
951
1350
  pointer-events: none;
952
1351
  }
953
1352
 
1353
+ .sp-pricing-card--loading {
1354
+ opacity: var(--sp-opacity-active);
1355
+ pointer-events: none;
1356
+ }
1357
+
954
1358
  .sp-pricing-card-badge {
955
1359
  position: absolute;
956
1360
  top: var(--sp-space-16);
package/dist/index.cjs CHANGED
@@ -71,6 +71,8 @@ function getButtonClasses(opts = {}) {
71
71
  fullWidth = false,
72
72
  loading = false,
73
73
  disabled = false,
74
+ hovered = false,
75
+ active = false,
74
76
  iconOnly = false,
75
77
  pill = false
76
78
  } = opts;
@@ -109,6 +111,8 @@ function getButtonClasses(opts = {}) {
109
111
  fullWidth && "sp-btn--full",
110
112
  loading && "sp-btn--loading",
111
113
  disabled && "sp-btn--disabled",
114
+ hovered && "sp-btn--hover",
115
+ active && "sp-btn--active",
112
116
  iconOnly && "sp-btn--icon",
113
117
  pill && "sp-btn--pill"
114
118
  );
@@ -127,7 +131,10 @@ function getCardClasses(opts = {}) {
127
131
  interactive = false,
128
132
  padded = false,
129
133
  fullHeight = false,
130
- disabled = false
134
+ disabled = false,
135
+ loading = false,
136
+ hovered = false,
137
+ focused = false
131
138
  } = opts;
132
139
  const variant = resolveOption({
133
140
  name: "card variant",
@@ -148,7 +155,10 @@ function getCardClasses(opts = {}) {
148
155
  interactive && "sp-card--interactive",
149
156
  padded && "sp-card--padded",
150
157
  fullHeight && "sp-card--full",
151
- disabled && "sp-card--disabled"
158
+ disabled && "sp-card--disabled",
159
+ loading && "sp-card--loading",
160
+ hovered && "sp-card--hover",
161
+ focused && "sp-card--focus"
152
162
  );
153
163
  }
154
164
 
@@ -166,7 +176,14 @@ var INPUT_SIZES = {
166
176
  lg: true
167
177
  };
168
178
  function getInputClasses(opts = {}) {
169
- const { state: stateInput, size: sizeInput, fullWidth = false, pill = false } = opts;
179
+ const {
180
+ state: stateInput,
181
+ size: sizeInput,
182
+ fullWidth = false,
183
+ pill = false,
184
+ focused = false,
185
+ hovered = false
186
+ } = opts;
170
187
  const state = resolveOption({
171
188
  name: "input state",
172
189
  value: stateInput,
@@ -193,6 +210,8 @@ function getInputClasses(opts = {}) {
193
210
  // Visual state only; actual disabled attribute is handled by adapters.
194
211
  state === "disabled" && "sp-input--disabled",
195
212
  state === "loading" && "sp-input--loading",
213
+ focused && "sp-input--focus",
214
+ hovered && "sp-input--hover",
196
215
  fullWidth && "sp-input--full",
197
216
  pill && "sp-input--pill"
198
217
  );
@@ -214,7 +233,7 @@ var BADGE_SIZES = {
214
233
  lg: true
215
234
  };
216
235
  function getBadgeClasses(opts = {}) {
217
- const { variant: variantInput, size: sizeInput, interactive, disabled, loading } = opts;
236
+ const { variant: variantInput, size: sizeInput, interactive, hovered, disabled, loading } = opts;
218
237
  const variant = resolveOption({
219
238
  name: "badge variant",
220
239
  value: variantInput,
@@ -248,6 +267,7 @@ function getBadgeClasses(opts = {}) {
248
267
  variantClass,
249
268
  sizeClass,
250
269
  interactive && "sp-badge--interactive",
270
+ hovered && "sp-badge--hover",
251
271
  disabled && "sp-badge--disabled",
252
272
  loading && "sp-badge--loading"
253
273
  );
@@ -330,11 +350,12 @@ function getTestimonialAuthorTitleClasses() {
330
350
 
331
351
  // src/recipes/pricing-card.ts
332
352
  function getPricingCardClasses(opts = {}) {
333
- const { featured = false, disabled = false } = opts;
353
+ const { featured = false, disabled = false, loading = false } = opts;
334
354
  return cx(
335
355
  "sp-pricing-card",
336
356
  featured && "sp-pricing-card--featured",
337
- disabled && "sp-pricing-card--disabled"
357
+ disabled && "sp-pricing-card--disabled",
358
+ loading && "sp-pricing-card--loading"
338
359
  );
339
360
  }
340
361
  function getPricingCardBadgeClasses() {