@phcdevworks/spectre-ui 1.1.1 → 1.2.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/README.md CHANGED
@@ -60,11 +60,11 @@ Use Spectre tokens as the source of truth for your Tailwind theme:
60
60
  // tailwind.config.ts
61
61
  import type { Config } from 'tailwindcss'
62
62
  import { createSpectreTailwindPreset } from '@phcdevworks/spectre-ui/tailwind'
63
- import { spectreTokens } from '@phcdevworks/spectre-tokens'
63
+ import tokens from '@phcdevworks/spectre-tokens'
64
64
 
65
65
  const config: Config = {
66
66
  content: ['./src/**/*.{ts,tsx,js,jsx,html}'],
67
- presets: [createSpectreTailwindPreset({ tokens: spectreTokens })]
67
+ presets: [createSpectreTailwindPreset({ tokens })]
68
68
  }
69
69
 
70
70
  export default config
@@ -110,19 +110,44 @@ Golden rule: consume tokens, do not redefine them.
110
110
 
111
111
  ### Root package
112
112
 
113
- Exports CSS path constants and class recipes, including:
113
+ The root package exports CSS path constants plus the recipe functions re-exported
114
+ from `src/recipes/index.ts`.
115
+
116
+ Root constants:
114
117
 
115
118
  - `spectreStyles`
116
- - `getButtonClasses`
119
+ - `spectreBaseStylesPath`
120
+ - `spectreComponentsStylesPath`
121
+ - `spectreUtilitiesStylesPath`
122
+
123
+ Root recipe functions:
124
+
117
125
  - `getBadgeClasses`
126
+ - `getButtonClasses`
118
127
  - `getCardClasses`
119
- - `getInputClasses`
120
128
  - `getIconBoxClasses`
129
+ - `getInputClasses`
121
130
  - `getPricingCardClasses`
122
- - `getTestimonialClasses`
123
131
  - `getRatingClasses`
132
+ - `getTestimonialClasses`
124
133
 
125
- Recipes also export their related TypeScript option and variant types.
134
+ Root recipe helper functions:
135
+
136
+ - `getPricingCardBadgeClasses`
137
+ - `getPricingCardDescriptionClasses`
138
+ - `getPricingCardPriceClasses`
139
+ - `getPricingCardPriceContainerClasses`
140
+ - `getRatingStarClasses`
141
+ - `getRatingStarsClasses`
142
+ - `getRatingTextClasses`
143
+ - `getTestimonialAuthorClasses`
144
+ - `getTestimonialAuthorInfoClasses`
145
+ - `getTestimonialAuthorNameClasses`
146
+ - `getTestimonialAuthorTitleClasses`
147
+ - `getTestimonialQuoteClasses`
148
+
149
+ The root package also re-exports the related recipe option, variant, size, and
150
+ state TypeScript types defined by those recipes.
126
151
 
127
152
  ### Tailwind entry point
128
153
 
@@ -154,12 +179,9 @@ implementation drift.
154
179
 
155
180
  ## Development
156
181
 
157
- Install dependencies, then run the package checks:
182
+ Install dependencies, then run the package verification flow:
158
183
 
159
- ```bash
160
- npm run build
161
- npm test
162
- ```
184
+ npm run ci:verify
163
185
 
164
186
  Key source areas:
165
187
 
@@ -167,6 +189,18 @@ Key source areas:
167
189
  - `src/recipes/` for class recipes
168
190
  - `src/tailwind/` for Tailwind helpers
169
191
  - `tests/` for contract and regression coverage
192
+ - `examples/` for visual demos and verification fixtures
193
+
194
+ ## Examples
195
+
196
+ Use [`examples/examples.html`](examples/examples.html) as the visual index for
197
+ the package demos.
198
+
199
+ Available examples include:
200
+
201
+ - `vanilla.html` for the broad component showcase
202
+ - `showroom.html` for a richer marketing-style composition
203
+ - `verification.html` and focused verification fixtures for regression checks
170
204
 
171
205
  ## Contributing
172
206
 
@@ -177,7 +211,7 @@ When contributing:
177
211
  - keep styling token-driven
178
212
  - keep recipe APIs and CSS classes in sync
179
213
  - avoid local visual values unless clearly intentional
180
- - run `npm run build` and `npm test` before opening a pull request
214
+ - run npm run ci:verify before opening a pull request
181
215
 
182
216
  See [CONTRIBUTING.md](CONTRIBUTING.md) for the full workflow.
183
217
 
package/dist/base.css CHANGED
@@ -1,3 +1,396 @@
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: #4b576a;
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: 600;
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: 700;
182
+ --sp-font-3xl-size: 2.25rem;
183
+ --sp-font-3xl-line-height: 2.75rem;
184
+ --sp-font-3xl-weight: 700;
185
+ --sp-font-4xl-size: 3rem;
186
+ --sp-font-4xl-line-height: 3.5rem;
187
+ --sp-font-4xl-weight: 800;
188
+ --sp-font-5xl-size: 3.75rem;
189
+ --sp-font-5xl-line-height: 4.25rem;
190
+ --sp-font-5xl-weight: 800;
191
+ --sp-font-6xl-size: 4.5rem;
192
+ --sp-font-6xl-line-height: 5rem;
193
+ --sp-font-6xl-weight: 900;
194
+ --sp-font-xs-letter-spacing: 0.02em;
195
+ --sp-text-on-page-default: #141b24;
196
+ --sp-text-on-page-muted: #4b576a;
197
+ --sp-text-on-page-subtle: #657287;
198
+ --sp-text-on-page-meta: #657287;
199
+ --sp-text-on-surface-default: #141b24;
200
+ --sp-text-on-surface-muted: #4b576a;
201
+ --sp-text-on-surface-subtle: #657287;
202
+ --sp-text-on-surface-meta: #657287;
203
+ --sp-badge-neutral-bg: #eef1f6;
204
+ --sp-badge-neutral-text: #374253;
205
+ --sp-badge-info-bg: #e0f2fe;
206
+ --sp-badge-info-text: #075985;
207
+ --sp-badge-success-bg: #dcfce7;
208
+ --sp-badge-success-text: #166534;
209
+ --sp-badge-warning-bg: #fff1c2;
210
+ --sp-badge-warning-text: #8f5200;
211
+ --sp-badge-danger-bg: #fee2e2;
212
+ --sp-badge-danger-text: #991b1b;
213
+ --sp-icon-box-bg: #ffffff;
214
+ --sp-icon-box-border: #d9dfeb;
215
+ --sp-icon-box-icon-default: #0369a1;
216
+ --sp-icon-box-icon-success: #16a34a;
217
+ --sp-icon-box-icon-warning: #d48806;
218
+ --sp-icon-box-icon-danger: #dc2626;
219
+ --sp-shadow-none: none;
220
+ --sp-shadow-sm: 0 1px 2px 0 rgba(34, 43, 56, 0.06);
221
+ --sp-shadow-md: 0 2px 6px -1px rgba(34, 43, 56, 0.08);
222
+ --sp-shadow-lg: 0 6px 16px -4px rgba(34, 43, 56, 0.12);
223
+ --sp-breakpoint-sm: 640px;
224
+ --sp-breakpoint-md: 768px;
225
+ --sp-breakpoint-lg: 1024px;
226
+ --sp-breakpoint-xl: 1280px;
227
+ --sp-breakpoint-2xl: 1536px;
228
+ --sp-z-index-base: 0;
229
+ --sp-z-index-dropdown: 1000;
230
+ --sp-z-index-sticky: 1100;
231
+ --sp-z-index-fixed: 1200;
232
+ --sp-z-index-overlay: 1300;
233
+ --sp-z-index-modal: 1400;
234
+ --sp-z-index-popover: 1500;
235
+ --sp-z-index-tooltip: 1600;
236
+ --sp-duration-instant: 75ms;
237
+ --sp-duration-fast: 150ms;
238
+ --sp-duration-base: 200ms;
239
+ --sp-duration-moderate: 300ms;
240
+ --sp-duration-slow: 500ms;
241
+ --sp-duration-slower: 700ms;
242
+ --sp-easing-linear: linear;
243
+ --sp-easing-in: cubic-bezier(0.4, 0, 1, 1);
244
+ --sp-easing-out: cubic-bezier(0, 0, 0.2, 1);
245
+ --sp-easing-inout: cubic-bezier(0.4, 0, 0.2, 1);
246
+ --sp-easing-spring: cubic-bezier(0.4, 0, 0.2, 1);
247
+ --sp-opacity-disabled: 0.38;
248
+ --sp-opacity-hover: 0.92;
249
+ --sp-opacity-active: 0.84;
250
+ --sp-opacity-focus: 1;
251
+ --sp-opacity-overlay: 0.5;
252
+ --sp-opacity-tooltip: 0.95;
253
+ --sp-focus-ring-width: 2px;
254
+ --sp-focus-ring-offset: 2px;
255
+ --sp-focus-ring-style: solid;
256
+ --sp-min-touch-target: 44px;
257
+ --sp-min-text-size: 16px;
258
+ --sp-button-primary-bg: #0369a1;
259
+ --sp-button-primary-bghover: #075985;
260
+ --sp-button-primary-bgactive: #0c4a6e;
261
+ --sp-button-primary-bgdisabled: #d9dfeb;
262
+ --sp-button-primary-text: #ffffff;
263
+ --sp-button-primary-textdisabled: #8a96ad;
264
+ --sp-button-primary-focusring: rgba(14, 165, 233, 0.4);
265
+ --sp-button-primary-focusvisible: {colors.info.500} / 0.4;
266
+ --sp-button-secondary-bg: #ffffff;
267
+ --sp-button-secondary-bghover: #f7f8fb;
268
+ --sp-button-secondary-bgactive: #eef1f6;
269
+ --sp-button-secondary-bgdisabled: #f7f8fb;
270
+ --sp-button-secondary-text: #075985;
271
+ --sp-button-secondary-textdisabled: #8a96ad;
272
+ --sp-button-secondary-border: #075985;
273
+ --sp-button-secondary-borderdisabled: #d9dfeb;
274
+ --sp-button-secondary-focusring: rgba(14, 165, 233, 0.4);
275
+ --sp-button-secondary-focusvisible: {colors.info.500} / 0.4;
276
+ --sp-button-ghost-bg: transparent;
277
+ --sp-button-ghost-bghover: #f0f9ff;
278
+ --sp-button-ghost-bgactive: #e0f2fe;
279
+ --sp-button-ghost-bgdisabled: transparent;
280
+ --sp-button-ghost-text: #075985;
281
+ --sp-button-ghost-textdisabled: #8a96ad;
282
+ --sp-button-ghost-focusring: rgba(14, 165, 233, 0.4);
283
+ --sp-button-ghost-focusvisible: {colors.info.500} / 0.4;
284
+ --sp-button-danger-bg: #dc2626;
285
+ --sp-button-danger-bghover: #b91c1c;
286
+ --sp-button-danger-bgactive: #991b1b;
287
+ --sp-button-danger-bgdisabled: #fecaca;
288
+ --sp-button-danger-text: #ffffff;
289
+ --sp-button-danger-textdisabled: #8a96ad;
290
+ --sp-button-danger-focusring: rgba(239, 68, 68, 0.4);
291
+ --sp-button-success-bg: #15803d;
292
+ --sp-button-success-bghover: #166534;
293
+ --sp-button-success-bgactive: #14532d;
294
+ --sp-button-success-bgdisabled: #bbf7d0;
295
+ --sp-button-success-text: #ffffff;
296
+ --sp-button-success-textdisabled: #8a96ad;
297
+ --sp-button-success-focusring: rgba(34, 197, 94, 0.4);
298
+ --sp-button-cta-bg: #1f57db;
299
+ --sp-button-cta-bghover: #1946b4;
300
+ --sp-button-cta-bgactive: #173b8f;
301
+ --sp-button-cta-bgdisabled: #b9d2ff;
302
+ --sp-button-cta-text: #ffffff;
303
+ --sp-button-cta-textdisabled: #8a96ad;
304
+ --sp-button-cta-shadow: 0 4px 14px 0 rgba(51, 109, 244, 0.39);
305
+ --sp-button-cta-focusring: rgba(51, 109, 244, 0.4);
306
+ --sp-button-accent-bg: #7135dd;
307
+ --sp-button-accent-bghover: #5d28b8;
308
+ --sp-button-accent-bgactive: #4d2393;
309
+ --sp-button-accent-bgdisabled: #ddccff;
310
+ --sp-button-accent-text: #ffffff;
311
+ --sp-button-accent-textdisabled: #8a96ad;
312
+ --sp-button-accent-focusring: rgba(133, 79, 247, 0.4);
313
+ --sp-button-accent-focusvisible: {colors.accent.500} / 0.4;
314
+ --sp-form-default-bg: #ffffff;
315
+ --sp-form-default-border: #b7c1d4;
316
+ --sp-form-default-text: #141b24;
317
+ --sp-form-default-placeholder: #657287;
318
+ --sp-form-hover-border: #0ea5e9;
319
+ --sp-form-focus-border: #0ea5e9;
320
+ --sp-form-focus-ring: #0ea5e9;
321
+ --sp-form-focusvisible-border: {colors.info.500};
322
+ --sp-form-focusvisible-ring: {colors.info.500};
323
+ --sp-form-valid-border: #22c55e;
324
+ --sp-form-valid-bg: #f0fdf4;
325
+ --sp-form-valid-text: #15803d;
326
+ --sp-form-invalid-border: #ef4444;
327
+ --sp-form-invalid-bg: #fef2f2;
328
+ --sp-form-invalid-text: #b91c1c;
329
+ --sp-form-disabled-bg: #f7f8fb;
330
+ --sp-form-disabled-border: #d9dfeb;
331
+ --sp-form-disabled-text: #8a96ad;
332
+ --sp-animation-fadein-duration: 200ms;
333
+ --sp-animation-fadein-easing: cubic-bezier(0, 0, 0.2, 1);
334
+ --sp-animation-fadein-keyframes: fade-in;
335
+ --sp-animation-fadeout-duration: 150ms;
336
+ --sp-animation-fadeout-easing: cubic-bezier(0.4, 0, 1, 1);
337
+ --sp-animation-fadeout-keyframes: fade-out;
338
+ --sp-animation-slideup-duration: 300ms;
339
+ --sp-animation-slideup-easing: cubic-bezier(0, 0, 0.2, 1);
340
+ --sp-animation-slideup-keyframes: slide-up;
341
+ --sp-animation-slidedown-duration: 300ms;
342
+ --sp-animation-slidedown-easing: cubic-bezier(0, 0, 0.2, 1);
343
+ --sp-animation-slidedown-keyframes: slide-down;
344
+ --sp-animation-scalein-duration: 200ms;
345
+ --sp-animation-scalein-easing: cubic-bezier(0.34, 1.56, 0.64, 1);
346
+ --sp-animation-scalein-keyframes: scale-in;
347
+ --sp-animation-bounce-duration: 300ms;
348
+ --sp-animation-bounce-easing: cubic-bezier(0.4, 0, 0.2, 1);
349
+ --sp-animation-bounce-keyframes: bounce;
350
+ --sp-animation-shake-duration: 250ms;
351
+ --sp-animation-shake-easing: cubic-bezier(0.4, 0, 0.2, 1);
352
+ --sp-animation-shake-keyframes: shake;
353
+ --sp-animation-pulse-duration: 1200ms;
354
+ --sp-animation-pulse-easing: cubic-bezier(0.4, 0, 0.2, 1);
355
+ --sp-animation-pulse-keyframes: pulse;
356
+ }
357
+ :root[data-spectre-theme="dark"] {
358
+ --sp-surface-page: #141b24;
359
+ --sp-surface-card: #222b38;
360
+ --sp-surface-input: #374253;
361
+ --sp-surface-overlay: #222b38;
362
+ --sp-surface-hero: linear-gradient(135deg, #401f75 0%, #5d28b8 100%);
363
+ --sp-text-on-page-default: #f7f8fb;
364
+ --sp-text-on-page-muted: #b7c1d4;
365
+ --sp-text-on-page-subtle: #8a96ad;
366
+ --sp-text-on-page-meta: #8a96ad;
367
+ --sp-text-on-surface-default: #eef1f6;
368
+ --sp-text-on-surface-muted: #b7c1d4;
369
+ --sp-text-on-surface-subtle: #8a96ad;
370
+ --sp-text-on-surface-meta: #8a96ad;
371
+ --sp-component-card-text: #eef1f6;
372
+ --sp-component-card-text-muted: #b7c1d4;
373
+ --sp-component-input-text: #eef1f6;
374
+ --sp-component-input-placeholder: #b7c1d4;
375
+ --sp-button-text-default: #eef1f6;
376
+ --sp-button-text-on-primary: #ffffff;
377
+ --sp-badge-neutral-bg: #374253;
378
+ --sp-badge-neutral-text: #eef1f6;
379
+ --sp-badge-info-bg: #0c4a6e;
380
+ --sp-badge-info-text: #e0f2fe;
381
+ --sp-badge-success-bg: #166534;
382
+ --sp-badge-success-text: #dcfce7;
383
+ --sp-badge-warning-bg: #8f5200;
384
+ --sp-badge-warning-text: #fff1c2;
385
+ --sp-badge-danger-bg: #991b1b;
386
+ --sp-badge-danger-text: #fee2e2;
387
+ --sp-icon-box-bg: #222b38;
388
+ --sp-icon-box-border: #374253;
389
+ --sp-icon-box-icon-default: #38bdf8;
390
+ --sp-icon-box-icon-success: #4ade80;
391
+ --sp-icon-box-icon-warning: #ffc21a;
392
+ --sp-icon-box-icon-danger: #f87171;
393
+ }
1
394
  @layer base {
2
395
 
3
396
  *,