@phcdevworks/spectre-ui 1.1.0 β†’ 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.
package/LICENSE CHANGED
@@ -1,21 +1,20 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2025 PHCDevworks
3
+ Copyright (c) 2026 PHCDevworks
4
4
 
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the "Software"), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software is furnished to do so,
10
+ subject to the following conditions:
11
11
 
12
12
  The above copyright notice and this permission notice shall be included in all
13
13
  copies or substantial portions of the Software.
14
14
 
15
15
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md CHANGED
@@ -1,120 +1,198 @@
1
1
  # @phcdevworks/spectre-ui
2
2
 
3
- ### **The Blueprint (Layer 2 of the Spectre 8-Layer Arsenal)**
3
+ [![GitHub issues](https://img.shields.io/github/issues/phcdevworks/spectre-ui)](https://github.com/phcdevworks/spectre-ui/issues)
4
+ [![GitHub pull requests](https://img.shields.io/github/issues-pr/phcdevworks/spectre-ui)](https://github.com/phcdevworks/spectre-ui/pulls)
5
+ [![License](https://img.shields.io/github/license/phcdevworks/spectre-ui)](LICENSE)
4
6
 
5
- `@phcdevworks/spectre-ui` is the structural engine of the Spectre design system. It translates the design "DNA" from `@phcdevworks/spectre-tokens` into CSS structure, localized Tailwind presets, and type-safe class recipes.
7
+ `@phcdevworks/spectre-ui` is the implementation layer between
8
+ [`@phcdevworks/spectre-tokens`](https://github.com/phcdevworks/spectre-tokens)
9
+ and downstream adapters or apps.
6
10
 
7
- 🀝 **[Contributing Guide](CONTRIBUTING.md)** | πŸ“ **[Changelog](CHANGELOG.md)** | πŸ›οΈ **[Spectre Arsenal](https://github.com/phcdevworks)**
11
+ Maintained by PHCDevworks, it turns Spectre tokens into reusable CSS bundles,
12
+ Tailwind tooling, and type-safe class recipes. It is framework-agnostic,
13
+ token-driven, and follows a strict zero-hex policy so visual values do not drift
14
+ locally.
8
15
 
9
- ---
16
+ [Contributing](CONTRIBUTING.md) | [Changelog](CHANGELOG.md) |
17
+ [Security Policy](SECURITY.md)
10
18
 
11
- ## πŸ—οΈ Core Architecture
19
+ ## Key capabilities
12
20
 
13
- This package operates as a pure **Blueprint Layer**. It follows a strict **Zero-Hex Enforcement** policyβ€”visual values are imported via `--sp-*` variables, ensuring that if tokens change, the entire UI layer updates automatically.
21
+ - Ships precompiled CSS: `index.css`, `base.css`, `components.css`, and
22
+ `utilities.css`
23
+ - Provides Tailwind theme and preset helpers built from Spectre tokens
24
+ - Exports type-safe class recipes for shared UI patterns
25
+ - Keeps CSS classes and recipe APIs aligned
26
+ - Gives adapters and apps a stable styling contract instead of re-implementing
27
+ classes
28
+ - Enforces a zero-hex approach so visual values stay tied to
29
+ `@phcdevworks/spectre-tokens`
14
30
 
15
- - πŸ’Ž **Token-Driven**: Fully compatible with `@phcdevworks/spectre-tokens` v2.1.0.
16
- - πŸ“¦ **Precompiled CSS**: Ships `base`, `components`, and `utilities` bundles.
17
- - πŸ§ͺ **Type-Safe Recipes**: Pure JS/TS functions for generating framework-agnostic class strings.
18
- - πŸŒͺ️ **Tailwind Preset**: Mirrors the design scale into the Tailwind utility engine.
31
+ ## Installation
19
32
 
20
- ---
33
+ ```bash
34
+ npm install @phcdevworks/spectre-ui
35
+ ```
21
36
 
22
- ## πŸš€ Quick Start
37
+ ## Quick start
23
38
 
24
- ### Installation
39
+ ### CSS import
25
40
 
26
- ```bash
27
- npm install @phcdevworks/spectre-ui
41
+ Import the full stylesheet:
42
+
43
+ ```ts
44
+ import '@phcdevworks/spectre-ui/index.css'
28
45
  ```
29
46
 
30
- ### 1. Import CSS
31
- For most applications, importing the unified `index.css` is recommended.
47
+ Or import the bundles separately:
32
48
 
33
49
  ```ts
34
- import "@phcdevworks/spectre-ui/index.css";
50
+ import '@phcdevworks/spectre-ui/base.css'
51
+ import '@phcdevworks/spectre-ui/components.css'
52
+ import '@phcdevworks/spectre-ui/utilities.css'
35
53
  ```
36
54
 
37
- ### 2. Tailwind Integration
38
- Synchronize your Tailwind theme with the Spectre token scale.
55
+ ### Tailwind preset usage
56
+
57
+ Use Spectre tokens as the source of truth for your Tailwind theme:
39
58
 
40
59
  ```ts
41
60
  // tailwind.config.ts
42
- import { createSpectreTailwindPreset } from "@phcdevworks/spectre-ui/tailwind";
43
- import { spectreTokens } from "@phcdevworks/spectre-tokens";
61
+ import type { Config } from 'tailwindcss'
62
+ import { createSpectreTailwindPreset } from '@phcdevworks/spectre-ui/tailwind'
63
+ import tokens from '@phcdevworks/spectre-tokens'
44
64
 
45
- const spectrePreset = createSpectreTailwindPreset({ tokens: spectreTokens });
65
+ const config: Config = {
66
+ content: ['./src/**/*.{ts,tsx,js,jsx,html}'],
67
+ presets: [createSpectreTailwindPreset({ tokens })]
68
+ }
46
69
 
47
- export default {
48
- content: ["./src/**/*.{js,ts,jsx,tsx}"],
49
- presets: [spectrePreset],
50
- };
70
+ export default config
51
71
  ```
52
72
 
53
- ---
73
+ ### Class recipe usage
54
74
 
55
- ## 🧩 Class Recipes
75
+ Class recipes are the stable styling API for adapters and apps. They return
76
+ predictable class strings and keep behavior consistent across frameworks.
56
77
 
57
- Recipes are the API contract for all Spectre framework adapters. They ensure `.sp-btn--primary` always behaves identical whether used in React, Astro, or WordPress.
78
+ ```ts
79
+ import {
80
+ getBadgeClasses,
81
+ getButtonClasses,
82
+ getPricingCardClasses
83
+ } from '@phcdevworks/spectre-ui'
84
+
85
+ const cta = getButtonClasses({ variant: 'primary', size: 'lg' })
86
+ const badge = getBadgeClasses({ variant: 'success', size: 'sm' })
87
+ const pricingCard = getPricingCardClasses({ featured: true })
88
+ ```
58
89
 
59
- ### Core Components
60
- | Recipe | Primary Variants | Sizes |
61
- | :--- | :--- | :--- |
62
- | `getButtonClasses` | `primary`, `secondary`, `ghost`, `danger`, `success` | `sm`, `md`, `lg` |
63
- | `getBadgeClasses` | `primary`, `success`, `warning`, `danger` | `sm`, `md`, `lg` |
64
- | `getCardClasses` | `elevated`, `outline`, `ghost` | `padded` |
65
- | `getInputClasses` | `default`, `error`, `success` | `sm`, `md`, `lg` |
66
- | `getIconBoxClasses` | `primary`, `success`, `warning`, `danger`, `info` | `sm`, `md`, `lg` |
90
+ ## What this package owns
67
91
 
68
- ### Specialized Components
69
- | Recipe | Description |
70
- | :--- | :--- |
71
- | `getPricingCardClasses` | Semantic structure for pricing tables and plans. |
72
- | `getTestimonialClasses` | Compound classes for quotes, authors, and roles. |
73
- | `getRatingClasses` | Layout recipes for star ratings and count labels. |
92
+ - Token-driven CSS implementation
93
+ - Precompiled CSS bundles and utility classes
94
+ - Tailwind helpers and preset generation
95
+ - Type-safe class recipes for shared UI contracts
96
+ - Stable styling behavior consumed by downstream adapters and apps
74
97
 
75
- ```ts
76
- import { getButtonClasses, getPricingCardClasses } from "@phcdevworks/spectre-ui";
98
+ Golden rule: consume tokens, do not redefine them.
77
99
 
78
- // Generate a primary CTA class string
79
- const cta = getButtonClasses({ variant: "primary", size: "lg" });
80
- // Result: "sp-btn sp-btn--primary sp-btn--lg"
100
+ ## What this package does not own
81
101
 
82
- // Generate pricing card layout
83
- const pricing = getPricingCardClasses({ featured: true });
84
- ```
102
+ - Design values or semantic meaning That belongs to
103
+ `@phcdevworks/spectre-tokens`.
104
+ - Framework-specific component delivery Adapters and apps consume
105
+ `@phcdevworks/spectre-ui`; they do not recreate its styling logic.
106
+ - Local visual values outside the token contract Hardcoded hex, spacing, or
107
+ shadow values are drift unless clearly intentional and documented.
85
108
 
86
- ---
109
+ ## Package exports / API surface
87
110
 
88
- ## πŸ›οΈ The Spectre Suite Hierarchy
111
+ ### Root package
89
112
 
90
- Spectre is built on a non-negotiable hierarchy to prevent style leakage and duplication:
113
+ Exports CSS path constants and class recipes, including:
91
114
 
92
- 1. **Layer 1: Tokens** ([@phcdevworks/spectre-tokens](https://github.com/phcdevworks/spectre-tokens)) – The source of truth for all design values.
93
- 2. **Layer 2: UI (This Package)** – Translates tokens into CSS structure and recipes.
94
- 3. **Layer 3: Adapters** (WordPress, Astro, etc.) – Thin bridges that map Layer 2 to specific frameworks.
115
+ - `spectreStyles`
116
+ - `getButtonClasses`
117
+ - `getBadgeClasses`
118
+ - `getCardClasses`
119
+ - `getInputClasses`
120
+ - `getIconBoxClasses`
121
+ - `getPricingCardClasses`
122
+ - `getTestimonialClasses`
123
+ - `getRatingClasses`
95
124
 
96
- > **The Golden Rule**: Tokens define *meaning*. UI defines *structure*. Adapters define *delivery*.
125
+ Recipes also export their related TypeScript option and variant types.
97
126
 
98
- ---
127
+ ### Tailwind entry point
99
128
 
100
- ## πŸ› οΈ Development
129
+ `@phcdevworks/spectre-ui/tailwind` exports:
101
130
 
102
- ### Build Pipeline
103
- Compiles TypeScript, processes PostCSS, and bundles artifacts into `dist/`.
131
+ - `createSpectreTailwindPreset`
132
+ - `createSpectreTailwindTheme`
104
133
 
105
- ```bash
106
- npm run build
107
- ```
134
+ ### CSS entry points
135
+
136
+ - `@phcdevworks/spectre-ui/index.css`
137
+ - `@phcdevworks/spectre-ui/base.css`
138
+ - `@phcdevworks/spectre-ui/components.css`
139
+ - `@phcdevworks/spectre-ui/utilities.css`
108
140
 
109
- ### Testing
110
- Run the Vitest suite to verify recipe outputs and token-first compliance.
141
+ ## Relationship to the rest of Spectre
142
+
143
+ Spectre keeps responsibilities separate:
144
+
145
+ - [`@phcdevworks/spectre-tokens`](https://github.com/phcdevworks/spectre-tokens)
146
+ defines design values and semantic meaning
147
+ - `@phcdevworks/spectre-ui` turns those tokens into reusable CSS, Tailwind
148
+ tooling, and type-safe class recipes
149
+ - Adapters and apps consume `@phcdevworks/spectre-ui` instead of re-implementing
150
+ its styling layer
151
+
152
+ That separation keeps recipe behavior consistent across frameworks and reduces
153
+ implementation drift.
154
+
155
+ ## Development
156
+
157
+ Install dependencies, then run the package checks:
111
158
 
112
159
  ```bash
160
+ npm run build
113
161
  npm test
114
162
  ```
115
163
 
116
- ---
164
+ Key source areas:
165
+
166
+ - `src/styles/` for source CSS
167
+ - `src/recipes/` for class recipes
168
+ - `src/tailwind/` for Tailwind helpers
169
+ - `tests/` for contract and regression coverage
170
+ - `examples/` for visual demos and verification fixtures
171
+
172
+ ## Examples
173
+
174
+ Use [`examples/examples.html`](examples/examples.html) as the visual index for
175
+ the package demos.
176
+
177
+ Available examples include:
178
+
179
+ - `vanilla.html` for the broad component showcase
180
+ - `showroom.html` for a richer marketing-style composition
181
+ - `verification.html` and focused verification fixtures for regression checks
182
+
183
+ ## Contributing
184
+
185
+ PHCDevworks maintains this package as part of the Spectre suite.
186
+
187
+ When contributing:
188
+
189
+ - keep styling token-driven
190
+ - keep recipe APIs and CSS classes in sync
191
+ - avoid local visual values unless clearly intentional
192
+ - run `npm run build` and `npm test` before opening a pull request
193
+
194
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for the full workflow.
117
195
 
118
- ## ❀️ Support & Community
196
+ ## License
119
197
 
120
- - **License**: MIT Β© [PHCDevworks](https://phcdevworks.com)
198
+ MIT Β© PHCDevworks. See [LICENSE](LICENSE).
package/dist/base.css CHANGED
@@ -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 base {
2
377
 
3
378
  *,