@transcodes/design-tokens 0.3.0 → 0.3.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/CHANGELOG.md ADDED
@@ -0,0 +1,52 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [0.3.1] - 2025-12-11
9
+
10
+ ### Added
11
+
12
+ - CSS auto-import: `import '@transcodes/design-tokens'`로 CSS 자동 로드 (하위 호환성 복구)
13
+ - 다크모드 dual selector 지원: `prefers-color-scheme` 자동 감지 + `data-theme` 수동 오버라이드
14
+ - CSS minification: lightningcss 기반 압축 (평균 45% 용량 감소)
15
+
16
+ ### Changed
17
+
18
+ - 다크모드 CSS 선택자 개선: `@media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) }` + `[data-theme="dark"]`
19
+ - package.json에 `sideEffects` 필드 추가로 번들러 최적화 지원
20
+
21
+ ## [0.3.0] - 2025-12-11
22
+
23
+ ### Added
24
+
25
+ - JS main export 추가 (`index.js`, `index.d.ts`) - ESBuild 등 번들러 호환성 개선
26
+ - `tokens` 객체 export (camelCase 키)
27
+ - `cssVars` 객체 export (CSS 변수명 키)
28
+ - 버튼 시맨틱 토큰: `--button-dark`, `--button-dark-hover`, `--button-light`, `--button-light-hover`
29
+ - 시맨틱 배경 토큰: `--semantic-warning-bg`, `--semantic-warning-light`, `--semantic-success-bg`, `--semantic-info-bg`
30
+
31
+ ### Changed
32
+
33
+ - package.json exports 구조 개선: main export를 CSS에서 JS로 변경
34
+ - CSS import 경로 변경: `@transcodes/design-tokens` → `@transcodes/design-tokens/css`
35
+
36
+ ## [0.2.0] - 2025-12-10
37
+
38
+ ### Changed
39
+
40
+ - Bun native API로 빌드 스크립트 전환 (빌드 성능 개선)
41
+
42
+ ## [0.1.0] - 2025-12-10
43
+
44
+ ### Added
45
+
46
+ - Initial release of design tokens
47
+ - CSS custom properties for colors, typography, spacing, shadows, and borders
48
+ - Dark mode support via `[data-theme="dark"]` selector
49
+ - TypeScript type definitions (`tokens.d.ts`)
50
+ - Component CSS classes (`.button`, `.input`, `.notice`, `.field-group`, etc.)
51
+ - WCAG AA compliant color contrast ratios (4.5:1+)
52
+ - DTCG standard compliant token format (`$value`, `$type`)
package/README.md CHANGED
@@ -7,40 +7,31 @@ A comprehensive design token system built with [Style Dictionary](https://amzn.g
7
7
 
8
8
  ## Features
9
9
 
10
- - **Dark Mode Support** - Built-in light and dark themes with `data-theme` attribute
10
+ - **Dark Mode Support** - Automatic system detection + manual override with `data-theme`
11
11
  - **WCAG AA Compliant** - All color combinations meet accessibility contrast requirements
12
12
  - **Responsive Values** - Fluid typography and spacing using CSS `clamp()`
13
13
  - **TypeScript Support** - Full type definitions included
14
- - **Zero Runtime** - Pure CSS variables with no JavaScript required
14
+ - **CSS Auto-import** - Zero-config CSS loading (v0.3.1+)
15
+ - **Tree-shakable** - Optimized for modern bundlers
15
16
 
16
17
  ## Installation
17
18
 
18
19
  ```bash
19
20
  npm install @transcodes/design-tokens
20
21
  # or
21
- yarn add @transcodes/design-tokens
22
- # or
23
- pnpm add @transcodes/design-tokens
24
- # or
25
22
  bun add @transcodes/design-tokens
26
23
  ```
27
24
 
28
25
  ## Quick Start
29
26
 
30
- ### 1. Import the tokens
27
+ ### Automatic CSS Loading (v0.3.1+)
31
28
 
32
29
  ```typescript
33
- // Import base tokens (light theme by default)
30
+ // CSS automatically loaded (light + dark themes)
34
31
  import '@transcodes/design-tokens';
35
-
36
- // Optional: Import dark theme support
37
- import '@transcodes/design-tokens/tokens-dark.css';
38
-
39
- // Optional: Import component utility classes
40
- import '@transcodes/design-tokens/components.css';
41
32
  ```
42
33
 
43
- ### 2. Use CSS variables in your styles
34
+ That's it! CSS variables are now available globally.
44
35
 
45
36
  ```css
46
37
  .card {
@@ -48,32 +39,66 @@ import '@transcodes/design-tokens/components.css';
48
39
  background: var(--paper-white);
49
40
  padding: var(--space-md);
50
41
  border-radius: var(--radius-md);
51
- box-shadow: var(--shadow-sm);
52
- transition: box-shadow var(--transition-smooth);
42
+ box-shadow: var(--shadow-card);
53
43
  }
44
+ ```
45
+
46
+ ### JavaScript Objects (Optional)
47
+
48
+ ```typescript
49
+ import { tokens, cssVars } from '@transcodes/design-tokens';
50
+
51
+ // camelCase keys
52
+ console.log(tokens.accentPrimary); // "#6b4fd9"
53
+ console.log(tokens.spaceMd); // "clamp(0.875rem, 0.77rem + 0.54vw, 1.25rem)"
54
54
 
55
- .card:hover {
56
- box-shadow: var(--shadow-md);
55
+ // CSS variable names as keys
56
+ console.log(cssVars['--accent-primary']); // "#6b4fd9"
57
+ console.log(cssVars['--space-md']); // "clamp(0.875rem, 0.77rem + 0.54vw, 1.25rem)"
58
+ ```
59
+
60
+ ### Dark Mode
61
+
62
+ **Automatic Detection (v0.3.1+)**
63
+
64
+ Dark mode is automatically applied based on system preferences:
65
+
66
+ ```css
67
+ /* Respects prefers-color-scheme: dark */
68
+ @media (prefers-color-scheme: dark) {
69
+ :root:not([data-theme="light"]) {
70
+ /* Dark theme variables */
71
+ }
57
72
  }
58
73
  ```
59
74
 
60
- ### 3. Enable dark mode
75
+ **Manual Override**
76
+
77
+ Force a specific theme:
61
78
 
62
79
  ```html
63
- <!-- Light theme (default) -->
80
+ <!-- Force light theme (ignores system preference) -->
64
81
  <html data-theme="light">
65
82
 
66
- <!-- Dark theme -->
83
+ <!-- Force dark theme (ignores system preference) -->
67
84
  <html data-theme="dark">
85
+
86
+ <!-- Auto (respect system preference) -->
87
+ <html> <!-- no data-theme attribute -->
68
88
  ```
69
89
 
70
90
  ```javascript
71
- // Toggle theme with JavaScript
91
+ // Toggle theme with manual override
72
92
  function toggleTheme() {
73
93
  const current = document.documentElement.getAttribute('data-theme');
74
94
  const next = current === 'dark' ? 'light' : 'dark';
75
95
  document.documentElement.setAttribute('data-theme', next);
76
96
  }
97
+
98
+ // Reset to system preference
99
+ function resetTheme() {
100
+ document.documentElement.removeAttribute('data-theme');
101
+ }
77
102
  ```
78
103
 
79
104
  ## Available Tokens
@@ -86,7 +111,6 @@ function toggleTheme() {
86
111
  | `--ink-dark` | #2d2d2d | #e5e5e5 | Secondary text |
87
112
  | `--ink-medium` | #5c5c5c | #a3a3a3 | Tertiary text |
88
113
  | `--ink-light` | #8a8a8a | #737373 | Placeholder text |
89
- | `--ink-faint` | #c4c4c4 | #525252 | Decorative elements |
90
114
  | `--paper-white` | #faf9fc | #1a1a1a | Primary background |
91
115
  | `--paper-cream` | #f5f4f8 | #2d2d2d | Secondary background |
92
116
  | `--paper-warm` | #ebe9f0 | #404040 | Tertiary background |
@@ -94,9 +118,21 @@ function toggleTheme() {
94
118
  | `--accent-success` | #357a46 | #4ade80 | Success state |
95
119
  | `--error-base` | #c0392b | #f87171 | Error state |
96
120
 
121
+ ### Semantic Tokens (v0.3.0+)
122
+
123
+ | Token | Description |
124
+ |-------|-------------|
125
+ | `--button-dark` | Dark button background |
126
+ | `--button-dark-hover` | Dark button hover state |
127
+ | `--button-light` | Light button background |
128
+ | `--button-light-hover` | Light button hover state |
129
+ | `--semantic-warning-bg` | Warning callout background |
130
+ | `--semantic-success-bg` | Success callout background |
131
+ | `--semantic-info-bg` | Info callout background |
132
+
97
133
  ### Spacing
98
134
 
99
- All spacing values are responsive and scale with viewport width.
135
+ Responsive values that scale with viewport width.
100
136
 
101
137
  | Token | Value Range |
102
138
  |-------|-------------|
@@ -130,12 +166,6 @@ All spacing values are responsive and scale with viewport width.
130
166
  ### Layout
131
167
 
132
168
  ```css
133
- /* Breakpoints */
134
- --breakpoint-sm: 640px;
135
- --breakpoint-md: 768px;
136
- --breakpoint-lg: 1024px;
137
- --breakpoint-xl: 1280px;
138
-
139
169
  /* Border radius */
140
170
  --radius-sm: 4px;
141
171
  --radius-md: 8px;
@@ -157,22 +187,29 @@ All spacing values are responsive and scale with viewport width.
157
187
  --transition-bounce: 400ms cubic-bezier(0.34, 1.56, 0.64, 1);
158
188
  ```
159
189
 
160
- ## TypeScript Support
161
-
162
- ```typescript
163
- import type { DesignTokens } from '@transcodes/design-tokens/types';
164
- ```
165
-
166
190
  ## Exports
167
191
 
168
192
  | Path | Description |
169
193
  |------|-------------|
170
- | `@transcodes/design-tokens` | Base CSS variables (light theme) |
171
- | `@transcodes/design-tokens/tokens-dark.css` | Dark theme overrides |
194
+ | `@transcodes/design-tokens` | **Recommended** - Auto-loads CSS + exports JS objects |
195
+ | `@transcodes/design-tokens/css` | CSS variables only (light theme) |
196
+ | `@transcodes/design-tokens/tokens-dark.css` | Dark theme CSS only |
172
197
  | `@transcodes/design-tokens/components.css` | Component utility classes |
198
+ | `@transcodes/design-tokens/components` | Component styles as JS |
173
199
  | `@transcodes/design-tokens/types` | TypeScript type definitions |
174
200
  | `@transcodes/design-tokens/json` | Raw token values as JSON |
175
201
 
202
+ ### Migration from v0.3.0
203
+
204
+ ```typescript
205
+ // v0.3.0 (manual CSS imports)
206
+ import '@transcodes/design-tokens/css';
207
+ import '@transcodes/design-tokens/tokens-dark.css';
208
+
209
+ // v0.3.1+ (automatic)
210
+ import '@transcodes/design-tokens';
211
+ ```
212
+
176
213
  ## Accessibility
177
214
 
178
215
  All primary color combinations meet WCAG AA standards (4.5:1 minimum contrast ratio):
@@ -186,7 +223,7 @@ All primary color combinations meet WCAG AA standards (4.5:1 minimum contrast ra
186
223
 
187
224
  ## Browser Support
188
225
 
189
- This package uses CSS custom properties (CSS variables) and `clamp()` for responsive values. Supported in all modern browsers:
226
+ Supports all modern browsers with CSS custom properties and `clamp()`:
190
227
 
191
228
  - Chrome 79+
192
229
  - Firefox 75+
@@ -197,6 +234,10 @@ This package uses CSS custom properties (CSS variables) and `clamp()` for respon
197
234
 
198
235
  - [@transcodes/ui-components](https://www.npmjs.com/package/@transcodes/ui-components) - Lit 3.x component library using these tokens
199
236
 
237
+ ## Changelog
238
+
239
+ See [CHANGELOG.md](./CHANGELOG.md) for release history.
240
+
200
241
  ## License
201
242
 
202
243
  [MIT](./LICENSE)
@@ -1,501 +1 @@
1
- /**
2
- * Do not edit directly, this file was auto-generated.
3
- */
4
-
5
- /* Animations */
6
- @keyframes fadeInUp {
7
- 0% {
8
- opacity: 0;
9
- transform: translateY(1rem);
10
- }
11
- 100% {
12
- opacity: 1;
13
- transform: translateY(0);
14
- }
15
- }
16
-
17
- @keyframes slideDown {
18
- 0% {
19
- opacity: 0;
20
- transform: translateY(-0.5rem);
21
- }
22
- 100% {
23
- opacity: 1;
24
- transform: translateY(0);
25
- }
26
- }
27
-
28
- @keyframes slideUp {
29
- 0% {
30
- opacity: 0;
31
- transform: translateY(0.5rem);
32
- }
33
- 100% {
34
- opacity: 1;
35
- transform: translateY(0);
36
- }
37
- }
38
-
39
- @keyframes spin {
40
- to {
41
- transform: rotate(360deg);
42
- }
43
- }
44
-
45
- @keyframes shake {
46
- 0%, 100% {
47
- transform: translateX(0);
48
- }
49
- 25% {
50
- transform: translateX(-0.25rem);
51
- }
52
- 75% {
53
- transform: translateX(0.25rem);
54
- }
55
- }
56
-
57
- @keyframes inkFloat {
58
- 0%, 100% {
59
- transform: translate(0, 0) scale(1);
60
- opacity: 0.5;
61
- }
62
- 50% {
63
- transform: translate(0.625rem, -0.625rem) scale(1.1);
64
- opacity: 0.7;
65
- }
66
- }
67
-
68
- @keyframes inkDrift {
69
- 0%, 100% {
70
- transform: translate(0, 0) rotate(0deg);
71
- opacity: 0.4;
72
- }
73
- 33% {
74
- transform: translate(-0.5rem, 0.5rem) rotate(-5deg);
75
- opacity: 0.6;
76
- }
77
- 66% {
78
- transform: translate(0.375rem, -0.375rem) rotate(3deg);
79
- opacity: 0.5;
80
- }
81
- }
82
-
83
- @keyframes inkSpread {
84
- 0% {
85
- transform: scale(0);
86
- opacity: 0.4;
87
- }
88
- 100% {
89
- transform: scale(var(--ink-effect-spread-scale, 2.5));
90
- opacity: 0;
91
- }
92
- }
93
-
94
- /* Page Layout */
95
- .page-container {
96
- position: relative;
97
- width: 100%;
98
- max-width: var(--page-container-max-width);
99
- margin: 0 auto;
100
- padding: 0 var(--page-container-padding);
101
- animation: fadeInUp 600ms var(--transition-smooth) both;
102
- }
103
-
104
- .page-container--wide {
105
- max-width: var(--page-container-max-width-wide);
106
- }
107
-
108
- .page-card {
109
- background: var(--paper-white);
110
- padding: var(--page-card-padding);
111
- border-radius: var(--page-card-radius);
112
- box-shadow: var(--shadow-card);
113
- position: relative;
114
- overflow: hidden;
115
- }
116
-
117
- .page-card::before {
118
- content: '';
119
- position: absolute;
120
- inset: 0;
121
- border-radius: inherit;
122
- padding: var(--space-fixed-2xs);
123
- background: linear-gradient(135deg, var(--alpha-primary08) 0%, transparent 50%, var(--alpha-primary04) 100%);
124
- -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
125
- -webkit-mask-composite: xor;
126
- mask-composite: exclude;
127
- pointer-events: none;
128
- }
129
-
130
- .page-card--centered {
131
- text-align: center;
132
- }
133
-
134
- /* Page Decoration - Ink effect backgrounds */
135
- .page-decoration {
136
- position: absolute;
137
- border-radius: 50%;
138
- filter: blur(3.75rem);
139
- pointer-events: none;
140
- z-index: 0;
141
- }
142
-
143
- .page-decoration--primary {
144
- background: var(--alpha-primary15);
145
- }
146
-
147
- .page-decoration--success {
148
- background: var(--alpha-success15);
149
- }
150
-
151
- .page-decoration--float {
152
- animation: inkFloat 4s ease-in-out infinite;
153
- }
154
-
155
- .page-decoration--drift {
156
- animation: inkDrift 5s ease-in-out infinite;
157
- }
158
-
159
- /* Buttons */
160
- .button {
161
- height: var(--button-height);
162
- padding: 0 var(--space-lg);
163
- font-family: var(--font-body);
164
- font-size: var(--button-font-size);
165
- font-weight: var(--button-font-weight);
166
- letter-spacing: var(--button-letter-spacing);
167
- border: var(--space-fixed-2xs) solid transparent;
168
- border-radius: var(--button-radius);
169
- cursor: pointer;
170
- transition: background var(--transition-fast), transform var(--transition-fast);
171
- }
172
-
173
- .button-primary {
174
- background: var(--accent-primary);
175
- color: var(--paper-white);
176
- }
177
-
178
- .button-primary:hover:not(:disabled) {
179
- background: var(--accent-primary-hover);
180
- box-shadow: var(--shadow-button-hover-primary);
181
- transform: translateY(calc(-1 * var(--space-fixed-2xs)));
182
- }
183
-
184
- .button-success {
185
- background: var(--accent-success);
186
- color: var(--paper-white);
187
- }
188
-
189
- .button-success:hover:not(:disabled) {
190
- background: var(--accent-success-hover);
191
- box-shadow: var(--shadow-button-hover-success);
192
- transform: translateY(calc(-1 * var(--space-fixed-2xs)));
193
- }
194
-
195
- .button-secondary {
196
- height: var(--button-height-secondary);
197
- background: transparent;
198
- color: var(--ink-dark);
199
- border: var(--space-fixed-2xs) solid var(--ink-faint);
200
- }
201
-
202
- .button-secondary:hover:not(:disabled) {
203
- color: var(--accent-primary);
204
- border-color: var(--accent-primary);
205
- background: var(--alpha-primary04);
206
- }
207
-
208
- .button:disabled {
209
- cursor: not-allowed;
210
- opacity: 0.7;
211
- }
212
-
213
- /* Text Button */
214
- .text-button {
215
- display: inline-flex;
216
- align-items: center;
217
- justify-content: center;
218
- height: var(--button-text-height);
219
- padding: var(--space-sm) var(--space-md);
220
- font-family: var(--font-body);
221
- font-size: var(--button-text-font-size);
222
- font-weight: 500;
223
- color: var(--ink-dark);
224
- background: transparent;
225
- border: none;
226
- border-radius: var(--radius-md);
227
- cursor: pointer;
228
- transition: background var(--transition-fast), color var(--transition-fast);
229
- }
230
-
231
- .text-button:hover {
232
- background: var(--paper-cream);
233
- color: var(--accent-primary);
234
- }
235
-
236
- .text-button-sm {
237
- height: auto;
238
- padding: var(--space-xs) var(--space-sm);
239
- font-size: 0.8125rem;
240
- }
241
-
242
- .text-button-md {
243
- height: auto;
244
- padding: var(--space-sm) var(--space-md);
245
- }
246
-
247
- /* Button Content Layout */
248
- .button-content {
249
- display: flex;
250
- align-items: center;
251
- justify-content: center;
252
- gap: var(--button-content-gap);
253
- }
254
-
255
- .button-icon {
256
- display: flex;
257
- align-items: center;
258
- justify-content: center;
259
- flex-shrink: 0;
260
- }
261
-
262
- .button-text {
263
- flex: 1;
264
- text-align: center;
265
- }
266
-
267
- /* Button Spinner */
268
- .button-spinner {
269
- width: var(--button-spinner-size);
270
- height: var(--button-spinner-size);
271
- border: var(--button-spinner-border-width) solid currentColor;
272
- border-top-color: transparent;
273
- border-radius: 50%;
274
- animation: spin 600ms linear infinite;
275
- }
276
-
277
- /* Button Ink Ripple Effect */
278
- .button-ink {
279
- position: relative;
280
- overflow: hidden;
281
- }
282
-
283
- .button-ink::after {
284
- content: '';
285
- position: absolute;
286
- top: 50%;
287
- left: 50%;
288
- width: 21.875rem;
289
- height: 21.875rem;
290
- background: radial-gradient(circle, rgba(255, 255, 255, 0.5) 0%, transparent 70%);
291
- transform: translate(-50%, -50%) scale(0);
292
- border-radius: 50%;
293
- pointer-events: none;
294
- transition: transform var(--ink-effect-ripple-duration, 600ms) var(--ink-effect-ripple-easing, cubic-bezier(0.4, 0, 0.2, 1)),
295
- opacity var(--ink-effect-fade-duration, 300ms) ease;
296
- opacity: 0;
297
- }
298
-
299
- .button-ink:hover::after {
300
- transform: translate(-50%, -50%) scale(1);
301
- opacity: 1;
302
- }
303
-
304
- .button-ink:active::after {
305
- transform: translate(-50%, -50%) scale(0.8);
306
- opacity: 0.8;
307
- }
308
-
309
- /* Card */
310
- .card {
311
- background: var(--paper-white);
312
- padding: var(--card-padding);
313
- border-radius: var(--card-radius);
314
- box-shadow: var(--shadow-card);
315
- position: relative;
316
- overflow: hidden;
317
- }
318
-
319
- /* Container */
320
- .container {
321
- position: relative;
322
- width: 100%;
323
- max-width: var(--container-max-width);
324
- }
325
-
326
- .container-wide {
327
- max-width: var(--container-max-width-wide);
328
- }
329
-
330
- /* Form Layout */
331
- .form-header {
332
- text-align: center;
333
- margin-bottom: var(--form-header-margin-bottom);
334
- }
335
-
336
- .form-title {
337
- font-family: var(--font-body);
338
- font-size: var(--title-font-size);
339
- font-weight: var(--title-font-weight);
340
- color: var(--ink-black);
341
- letter-spacing: var(--title-letter-spacing);
342
- animation: slideDown 400ms var(--transition-smooth) 200ms both;
343
- }
344
-
345
- .form-subtitle {
346
- font-size: var(--form-subtitle-font-size);
347
- color: var(--ink-medium);
348
- margin-top: var(--space-sm);
349
- animation: fadeInUp 400ms var(--transition-smooth) 400ms both;
350
- }
351
-
352
- .form-fields {
353
- display: flex;
354
- flex-direction: column;
355
- gap: var(--form-fields-gap);
356
- }
357
-
358
- .form-footer {
359
- margin-top: var(--form-footer-margin-top);
360
- text-align: center;
361
- animation: fadeInUp 400ms var(--transition-smooth) 600ms both;
362
- }
363
-
364
- /* Field Group */
365
- .field-group {
366
- display: flex;
367
- flex-direction: column;
368
- gap: var(--field-group-gap);
369
- }
370
-
371
- .field-label {
372
- display: block;
373
- font-size: var(--label-font-size);
374
- font-weight: var(--label-font-weight);
375
- text-transform: uppercase;
376
- letter-spacing: var(--label-letter-spacing);
377
- color: var(--ink-medium);
378
- transition: color var(--transition-fast);
379
- }
380
-
381
- .field-group.focused .field-label {
382
- color: var(--accent-primary);
383
- }
384
-
385
- .required-mark {
386
- color: var(--accent-primary);
387
- margin-left: var(--space-2xs);
388
- }
389
-
390
- /* Input */
391
- .input {
392
- width: 100%;
393
- padding: var(--input-padding-y) var(--input-padding-x);
394
- font-family: var(--font-body);
395
- font-size: var(--input-font-size);
396
- color: var(--ink-black);
397
- background: var(--paper-cream);
398
- border: var(--space-fixed-2xs) solid transparent;
399
- border-radius: var(--input-radius);
400
- transition: background var(--transition-smooth), border-color var(--transition-smooth), box-shadow var(--transition-smooth);
401
- }
402
-
403
- .input::placeholder {
404
- color: var(--ink-faint);
405
- }
406
-
407
- .input:hover {
408
- background: var(--paper-warm);
409
- }
410
-
411
- .input:focus {
412
- outline: none;
413
- background: var(--paper-white);
414
- border-color: var(--ink-faint);
415
- box-shadow: var(--shadow-input-focus);
416
- }
417
-
418
- /* Label */
419
- .label {
420
- display: block;
421
- font-size: var(--label-font-size);
422
- font-weight: var(--label-font-weight);
423
- text-transform: uppercase;
424
- letter-spacing: var(--label-letter-spacing);
425
- color: var(--ink-medium);
426
- margin-bottom: var(--space-sm);
427
- transition: color var(--transition-fast);
428
- }
429
-
430
- /* Title */
431
- .title {
432
- font-family: var(--font-body);
433
- font-size: var(--title-font-size);
434
- font-weight: var(--title-font-weight);
435
- color: var(--ink-black);
436
- letter-spacing: var(--title-letter-spacing);
437
- }
438
-
439
- /* Feedback */
440
- .error-message {
441
- display: flex;
442
- align-items: flex-start;
443
- gap: var(--feedback-error-gap);
444
- padding: var(--feedback-error-padding);
445
- background: var(--error-bg);
446
- border: var(--space-fixed-2xs) solid var(--error-border);
447
- border-radius: var(--feedback-error-radius);
448
- color: var(--error-base);
449
- animation: slideDown 300ms var(--transition-smooth) both;
450
- }
451
-
452
- .error-icon {
453
- display: flex;
454
- align-items: center;
455
- justify-content: center;
456
- flex-shrink: 0;
457
- width: var(--feedback-error-icon-size);
458
- height: var(--feedback-error-icon-size);
459
- color: var(--error-base);
460
- }
461
-
462
- .error-message.shake {
463
- animation: shake 400ms var(--transition-smooth);
464
- }
465
-
466
- /* Notice */
467
- .notice {
468
- display: flex;
469
- align-items: flex-start;
470
- gap: var(--feedback-notice-gap);
471
- padding: var(--feedback-notice-padding);
472
- border-radius: var(--feedback-notice-radius);
473
- animation: slideUp 400ms var(--transition-smooth) both;
474
- }
475
-
476
- .notice-icon {
477
- display: flex;
478
- align-items: center;
479
- justify-content: center;
480
- flex-shrink: 0;
481
- width: var(--feedback-notice-icon-size);
482
- height: var(--feedback-notice-icon-size);
483
- }
484
-
485
- .notice-success {
486
- background: rgba(53, 122, 70, 0.08);
487
- border: var(--space-fixed-2xs) solid rgba(53, 122, 70, 0.2);
488
- color: var(--accent-success);
489
- }
490
-
491
- .notice-warning {
492
- background: rgba(180, 83, 9, 0.08);
493
- border: var(--space-fixed-2xs) solid rgba(180, 83, 9, 0.2);
494
- color: var(--semantic-warning);
495
- }
496
-
497
- .notice-info {
498
- background: rgba(3, 105, 161, 0.08);
499
- border: var(--space-fixed-2xs) solid rgba(3, 105, 161, 0.2);
500
- color: var(--semantic-info);
501
- }
1
+ @keyframes fadeInUp{0%{opacity:0;transform:translateY(1rem)}to{opacity:1;transform:translateY(0)}}@keyframes slideDown{0%{opacity:0;transform:translateY(-.5rem)}to{opacity:1;transform:translateY(0)}}@keyframes slideUp{0%{opacity:0;transform:translateY(.5rem)}to{opacity:1;transform:translateY(0)}}@keyframes spin{to{transform:rotate(360deg)}}@keyframes shake{0%,to{transform:translate(0)}25%{transform:translate(-.25rem)}75%{transform:translate(.25rem)}}@keyframes inkFloat{0%,to{opacity:.5;transform:translate(0)scale(1)}50%{opacity:.7;transform:translate(.625rem,-.625rem)scale(1.1)}}@keyframes inkDrift{0%,to{opacity:.4;transform:translate(0)rotate(0)}33%{opacity:.6;transform:translate(-.5rem,.5rem)rotate(-5deg)}66%{opacity:.5;transform:translate(.375rem,-.375rem)rotate(3deg)}}@keyframes inkSpread{0%{opacity:.4;transform:scale(0)}to{transform:scale(var(--ink-effect-spread-scale,2.5));opacity:0}}.page-container{width:100%;max-width:var(--page-container-max-width);padding:0 var(--page-container-padding);animation:fadeInUp .6s var(--transition-smooth)both;margin:0 auto;position:relative}.page-container--wide{max-width:var(--page-container-max-width-wide)}.page-card{background:var(--paper-white);padding:var(--page-card-padding);border-radius:var(--page-card-radius);box-shadow:var(--shadow-card);position:relative;overflow:hidden}.page-card:before{content:"";border-radius:inherit;padding:var(--space-fixed-2xs);background:linear-gradient(135deg,var(--alpha-primary08)0%,transparent 50%,var(--alpha-primary04)100%);-webkit-mask-composite:xor;pointer-events:none;position:absolute;inset:0;-webkit-mask-image:linear-gradient(#fff 0 0),linear-gradient(#fff 0 0);-webkit-mask-position:0 0,0 0;-webkit-mask-size:auto,auto;-webkit-mask-repeat:repeat,repeat;-webkit-mask-clip:content-box,border-box;-webkit-mask-origin:content-box,border-box;mask-composite:exclude;mask-mode:match-source,match-source}.page-card--centered{text-align:center}.page-decoration{filter:blur(3.75rem);pointer-events:none;z-index:0;border-radius:50%;position:absolute}.page-decoration--primary{background:var(--alpha-primary15)}.page-decoration--success{background:var(--alpha-success15)}.page-decoration--float{animation:4s ease-in-out infinite inkFloat}.page-decoration--drift{animation:5s ease-in-out infinite inkDrift}.button{height:var(--button-height);padding:0 var(--space-lg);font-family:var(--font-body);font-size:var(--button-font-size);font-weight:var(--button-font-weight);letter-spacing:var(--button-letter-spacing);border:var(--space-fixed-2xs)solid transparent;border-radius:var(--button-radius);cursor:pointer;transition:background var(--transition-fast),transform var(--transition-fast)}.button-primary{background:var(--accent-primary);color:var(--paper-white)}.button-primary:hover:not(:disabled){background:var(--accent-primary-hover);box-shadow:var(--shadow-button-hover-primary);transform:translateY(calc(-1*var(--space-fixed-2xs)))}.button-success{background:var(--accent-success);color:var(--paper-white)}.button-success:hover:not(:disabled){background:var(--accent-success-hover);box-shadow:var(--shadow-button-hover-success);transform:translateY(calc(-1*var(--space-fixed-2xs)))}.button-secondary{height:var(--button-height-secondary);color:var(--ink-dark);border:var(--space-fixed-2xs)solid var(--ink-faint);background:0 0}.button-secondary:hover:not(:disabled){color:var(--accent-primary);border-color:var(--accent-primary);background:var(--alpha-primary04)}.button:disabled{cursor:not-allowed;opacity:.7}.text-button{height:var(--button-text-height);padding:var(--space-sm)var(--space-md);font-family:var(--font-body);font-size:var(--button-text-font-size);color:var(--ink-dark);border-radius:var(--radius-md);cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast);background:0 0;border:none;justify-content:center;align-items:center;font-weight:500;display:inline-flex}.text-button:hover{background:var(--paper-cream);color:var(--accent-primary)}.text-button-sm{height:auto;padding:var(--space-xs)var(--space-sm);font-size:.8125rem}.text-button-md{height:auto;padding:var(--space-sm)var(--space-md)}.button-content{justify-content:center;align-items:center;gap:var(--button-content-gap);display:flex}.button-icon{flex-shrink:0;justify-content:center;align-items:center;display:flex}.button-text{text-align:center;flex:1}.button-spinner{width:var(--button-spinner-size);height:var(--button-spinner-size);border:var(--button-spinner-border-width)solid currentColor;border-top-color:#0000;border-radius:50%;animation:.6s linear infinite spin}.button-ink{position:relative;overflow:hidden}.button-ink:after{content:"";pointer-events:none;width:21.875rem;height:21.875rem;transition:transform var(--ink-effect-ripple-duration,.6s)var(--ink-effect-ripple-easing,cubic-bezier(.4,0,.2,1)),opacity var(--ink-effect-fade-duration,.3s)ease;opacity:0;background:radial-gradient(circle,#ffffff80 0%,#0000 70%);border-radius:50%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)scale(0)}.button-ink:hover:after{opacity:1;transform:translate(-50%,-50%)scale(1)}.button-ink:active:after{opacity:.8;transform:translate(-50%,-50%)scale(.8)}.card{background:var(--paper-white);padding:var(--card-padding);border-radius:var(--card-radius);box-shadow:var(--shadow-card);position:relative;overflow:hidden}.container{width:100%;max-width:var(--container-max-width);position:relative}.container-wide{max-width:var(--container-max-width-wide)}.form-header{text-align:center;margin-bottom:var(--form-header-margin-bottom)}.form-title{font-family:var(--font-body);font-size:var(--title-font-size);font-weight:var(--title-font-weight);color:var(--ink-black);letter-spacing:var(--title-letter-spacing);animation:slideDown .4s var(--transition-smooth).2s both}.form-subtitle{font-size:var(--form-subtitle-font-size);color:var(--ink-medium);margin-top:var(--space-sm);animation:fadeInUp .4s var(--transition-smooth).4s both}.form-fields{gap:var(--form-fields-gap);flex-direction:column;display:flex}.form-footer{margin-top:var(--form-footer-margin-top);text-align:center;animation:fadeInUp .4s var(--transition-smooth).6s both}.field-group{gap:var(--field-group-gap);flex-direction:column;display:flex}.field-label{font-size:var(--label-font-size);font-weight:var(--label-font-weight);text-transform:uppercase;letter-spacing:var(--label-letter-spacing);color:var(--ink-medium);transition:color var(--transition-fast);display:block}.field-group.focused .field-label{color:var(--accent-primary)}.required-mark{color:var(--accent-primary);margin-left:var(--space-2xs)}.input{width:100%;padding:var(--input-padding-y)var(--input-padding-x);font-family:var(--font-body);font-size:var(--input-font-size);color:var(--ink-black);background:var(--paper-cream);border:var(--space-fixed-2xs)solid transparent;border-radius:var(--input-radius);transition:background var(--transition-smooth),border-color var(--transition-smooth),box-shadow var(--transition-smooth)}.input::placeholder{color:var(--ink-faint)}.input:hover{background:var(--paper-warm)}.input:focus{background:var(--paper-white);border-color:var(--ink-faint);box-shadow:var(--shadow-input-focus);outline:none}.label{font-size:var(--label-font-size);font-weight:var(--label-font-weight);text-transform:uppercase;letter-spacing:var(--label-letter-spacing);color:var(--ink-medium);margin-bottom:var(--space-sm);transition:color var(--transition-fast);display:block}.title{font-family:var(--font-body);font-size:var(--title-font-size);font-weight:var(--title-font-weight);color:var(--ink-black);letter-spacing:var(--title-letter-spacing)}.error-message{align-items:flex-start;gap:var(--feedback-error-gap);padding:var(--feedback-error-padding);background:var(--error-bg);border:var(--space-fixed-2xs)solid var(--error-border);border-radius:var(--feedback-error-radius);color:var(--error-base);animation:slideDown .3s var(--transition-smooth)both;display:flex}.error-icon{width:var(--feedback-error-icon-size);height:var(--feedback-error-icon-size);color:var(--error-base);flex-shrink:0;justify-content:center;align-items:center;display:flex}.error-message.shake{animation:shake .4s var(--transition-smooth)}.notice{align-items:flex-start;gap:var(--feedback-notice-gap);padding:var(--feedback-notice-padding);border-radius:var(--feedback-notice-radius);animation:slideUp .4s var(--transition-smooth)both;display:flex}.notice-icon{width:var(--feedback-notice-icon-size);height:var(--feedback-notice-icon-size);flex-shrink:0;justify-content:center;align-items:center;display:flex}.notice-success{border:var(--space-fixed-2xs)solid #357a4633;color:var(--accent-success);background:#357a4614}.notice-warning{border:var(--space-fixed-2xs)solid #b4530933;color:var(--semantic-warning);background:#b4530914}.notice-info{border:var(--space-fixed-2xs)solid #0369a133;color:var(--semantic-info);background:#0369a114}
package/build/index.js CHANGED
@@ -3,6 +3,10 @@
3
3
  * Design tokens as JavaScript object for use in JS/TS environments
4
4
  */
5
5
 
6
+ // CSS side-effect imports (auto-loaded when package is imported)
7
+ import './tokens.css';
8
+ import './tokens-dark.css';
9
+
6
10
  /**
7
11
  * All design tokens as a JavaScript object
8
12
  * Keys are camelCase versions of CSS variable names
@@ -1,27 +1 @@
1
- /**
2
- * Do not edit directly, this file was auto-generated.
3
- */
4
-
5
- [data-theme="dark"] {
6
- --ink-black: #ffffff; /** Primary text (dark). WCAG AAA: 16.1:1 on paper-white */
7
- --ink-dark: #e5e5e5; /** Secondary text (dark). WCAG AAA: 12.7:1 on paper-white */
8
- --ink-medium: #a3a3a3; /** Tertiary text (dark). WCAG AAA: 7.0:1 on paper-white */
9
- --ink-light: #737373; /** Placeholder, disabled text (dark). Contrast: 4.2:1 (meets 3:1 minimum) */
10
- --ink-faint: #525252; /** Decorative only (dark). NOT for readable text. Contrast: 2.6:1 */
11
- --paper-white: #1a1a1a; /** Primary background (dark) */
12
- --paper-cream: #2d2d2d; /** Secondary background (dark) */
13
- --paper-warm: #404040; /** Tertiary background (dark) */
14
- --accent-primary: #a78bfa; /** Primary accent (dark). WCAG AA: 7.5:1 on paper-white */
15
- --accent-primary-hover: #c4b5fd; /** Primary accent hover (dark). WCAG AA: 10.2:1 on paper-white */
16
- --accent-primary-pressed: #8b5cf6; /** Primary accent pressed (dark). WCAG AA: 5.5:1 on paper-white */
17
- --accent-success: #4ade80; /** Success accent (dark). WCAG AA: 9.8:1 on paper-white */
18
- --accent-success-hover: #86efac; /** Success accent hover (dark). WCAG AA: 12.5:1 on paper-white */
19
- --accent-success-pressed: #22c55e; /** Success accent pressed (dark). WCAG AA: 7.2:1 on paper-white */
20
- --semantic-warning: #fbbf24; /** Warning state (dark). WCAG AA: 11.3:1 on paper-white */
21
- --semantic-warning-hover: #fcd34d; /** Warning hover (dark). WCAG AA: 12.8:1 on paper-white */
22
- --semantic-info: #38bdf8; /** Info state (dark). WCAG AA: 9.4:1 on paper-white */
23
- --semantic-info-hover: #7dd3fc; /** Info hover (dark). WCAG AA: 11.6:1 on paper-white */
24
- --error-base: #f87171; /** Error state (dark). WCAG AA: 6.5:1 on paper-white */
25
- --error-bg: rgba(248, 113, 113, 0.12); /** Error background (dark). Decorative, not for text */
26
- --error-border: rgba(248, 113, 113, 0.3); /** Error border (dark). Decorative, not for text */
27
- }
1
+ @media (prefers-color-scheme:dark){:root:not([data-theme=light]){--ink-black:#fff;--ink-dark:#e5e5e5;--ink-medium:#a3a3a3;--ink-light:#737373;--ink-faint:#525252;--paper-white:#1a1a1a;--paper-cream:#2d2d2d;--paper-warm:#404040;--accent-primary:#a78bfa;--accent-primary-hover:#c4b5fd;--accent-primary-pressed:#8b5cf6;--accent-success:#4ade80;--accent-success-hover:#86efac;--accent-success-pressed:#22c55e;--semantic-warning:#fbbf24;--semantic-warning-hover:#fcd34d;--semantic-info:#38bdf8;--semantic-info-hover:#7dd3fc;--error-base:#f87171;--error-bg:#f871711f;--error-border:#f871714d}}[data-theme=dark]{--ink-black:#fff;--ink-dark:#e5e5e5;--ink-medium:#a3a3a3;--ink-light:#737373;--ink-faint:#525252;--paper-white:#1a1a1a;--paper-cream:#2d2d2d;--paper-warm:#404040;--accent-primary:#a78bfa;--accent-primary-hover:#c4b5fd;--accent-primary-pressed:#8b5cf6;--accent-success:#4ade80;--accent-success-hover:#86efac;--accent-success-pressed:#22c55e;--semantic-warning:#fbbf24;--semantic-warning-hover:#fcd34d;--semantic-info:#38bdf8;--semantic-info-hover:#7dd3fc;--error-base:#f87171;--error-bg:#f871711f;--error-border:#f871714d}
package/build/tokens.css CHANGED
@@ -1,195 +1 @@
1
- /**
2
- * Do not edit directly, this file was auto-generated.
3
- */
4
-
5
- :root, [data-theme="light"] {
6
- --duration-instant: 150ms; /** Instant feedback for micro-interactions */
7
- --duration-fast: 300ms; /** Fast transitions for hover/focus states */
8
- --duration-smooth: 400ms; /** Smooth transitions for modals/overlays */
9
- --duration-slow: 600ms; /** Slow transitions for page animations */
10
- --duration-slower: 800ms; /** Slower transitions for complex animations */
11
- --easing-ease: ease; /** Default easing function */
12
- --easing-ease-in-out: cubic-bezier(0.4, 0, 0.2, 1); /** Smooth ease-in-out for transitions */
13
- --easing-bounce: cubic-bezier(0.34, 1.56, 0.64, 1); /** Bounce effect for playful interactions */
14
- --ink-effect-ripple-duration: 600ms;
15
- --ink-effect-ripple-easing: cubic-bezier(0.4, 0, 0.2, 1);
16
- --ink-effect-spread-scale: 2.5;
17
- --ink-effect-fade-duration: 300ms;
18
- --transition-fast: 150ms ease;
19
- --transition-smooth: 300ms cubic-bezier(0.4, 0, 0.2, 1);
20
- --transition-bounce: 400ms cubic-bezier(0.34, 1.56, 0.64, 1);
21
- --opacity-disabled: 0.6; /** Disabled state opacity - WCAG 1.4.3 minimum */
22
- --opacity-hover: 0.7; /** Hover state for interactive elements */
23
- --opacity-loading: 0.6; /** Loading pulse animation minimum opacity */
24
- --opacity-hidden: 0; /** Fully transparent/hidden state */
25
- --opacity-visible: 1; /** Fully visible state */
26
- --brand-primary: #7c5cff; /** Transcodes primary brand color */
27
- --brand-primary-hover: #6a4ae8;
28
- --brand-logo-text: #1a1a1a;
29
- --accent-primary: #6b4fd9; /** Primary accent. WCAG AA: 4.5:1 on paper-white */
30
- --accent-primary-hover: #5a3fc8; /** Primary accent hover. WCAG AA: 5.2:1 on paper-white */
31
- --accent-primary-pressed: #4a32b0; /** Primary accent pressed. WCAG AA: 6.5:1 on paper-white */
32
- --accent-success: #357a46; /** Success accent. WCAG AA: 4.8:1 on paper-white */
33
- --accent-success-hover: #2d6a3c; /** Success accent hover. WCAG AA: 5.6:1 on paper-white */
34
- --accent-success-pressed: #255a32; /** Success accent pressed. WCAG AA: 6.8:1 on paper-white */
35
- --alpha-primary04: rgba(124, 92, 255, 0.04);
36
- --alpha-primary08: rgba(124, 92, 255, 0.08);
37
- --alpha-primary10: rgba(124, 92, 255, 0.1);
38
- --alpha-primary12: rgba(124, 92, 255, 0.12);
39
- --alpha-primary15: rgba(124, 92, 255, 0.15);
40
- --alpha-primary20: rgba(124, 92, 255, 0.2);
41
- --alpha-primary30: rgba(124, 92, 255, 0.3);
42
- --alpha-primary40: rgba(124, 92, 255, 0.4);
43
- --alpha-primary50: rgba(124, 92, 255, 0.5);
44
- --alpha-success10: rgba(61, 138, 80, 0.1);
45
- --alpha-success15: rgba(61, 138, 80, 0.15);
46
- --alpha-success20: rgba(61, 138, 80, 0.2);
47
- --alpha-success30: rgba(61, 138, 80, 0.3);
48
- --alpha-warning08: rgba(180, 83, 9, 0.08);
49
- --alpha-warning15: rgba(180, 83, 9, 0.15);
50
- --alpha-warning20: rgba(180, 83, 9, 0.2);
51
- --alpha-info08: rgba(3, 105, 161, 0.08);
52
- --alpha-info15: rgba(3, 105, 161, 0.15);
53
- --alpha-info20: rgba(3, 105, 161, 0.2);
54
- --alpha-ink04: rgba(26, 26, 26, 0.04);
55
- --alpha-ink06: rgba(26, 26, 26, 0.06);
56
- --alpha-ink10: rgba(26, 26, 26, 0.1);
57
- --alpha-white15: rgba(255, 255, 255, 0.15);
58
- --alpha-white30: rgba(255, 255, 255, 0.3);
59
- --alpha-white90: rgba(255, 255, 255, 0.9);
60
- --error-base: #c0392b; /** Error state. WCAG AA: 4.8:1 on paper-white */
61
- --error-bg: rgba(231, 76, 60, 0.08); /** Error background. Decorative, not for text */
62
- --error-border: rgba(231, 76, 60, 0.2); /** Error border. Decorative, not for text */
63
- --ink-black: #1a1a1a; /** Primary text. WCAG AA: 15.8:1 on paper-white */
64
- --ink-dark: #2d2d2d; /** Secondary text. WCAG AA: 12.5:1 on paper-white */
65
- --ink-medium: #5c5c5c; /** Tertiary text. WCAG AA: 6.0:1 on paper-white */
66
- --ink-light: #8a8a8a; /** Placeholder, disabled text. Contrast: 3.5:1 (meets 3:1 minimum) */
67
- --ink-faint: #c4c4c4; /** Decorative only. NOT for readable text. Contrast: 1.7:1 */
68
- --overlay-dim: rgba(0, 0, 0, 0.5); /** Modal/dialog overlay background */
69
- --overlay-dark: rgba(0, 0, 0, 0.7); /** Darker overlay for critical modals (offline, error states) */
70
- --overlay-shadow-light: rgba(0, 0, 0, 0.1); /** Light shadow for subtle elevation */
71
- --overlay-shadow-subtle: rgba(0, 0, 0, 0.15); /** Subtle shadow for toasts and banners */
72
- --overlay-shadow-medium: rgba(0, 0, 0, 0.2); /** Medium shadow for cards and dropdowns */
73
- --overlay-shadow-strong: rgba(0, 0, 0, 0.3); /** Strong shadow for modals and floating elements */
74
- --overlay-shadow-heavy: rgba(0, 0, 0, 0.4); /** Heavy shadow for prominent floating elements */
75
- --overlay-glow-white: rgba(255, 255, 255, 0.15); /** Button radial glow overlay effect */
76
- --overlay-spinner-track: rgba(255, 255, 255, 0.3); /** Spinner base track color on dark backgrounds */
77
- --paper-white: #faf9fc;
78
- --paper-cream: #f5f4f8;
79
- --paper-warm: #ebe9f0;
80
- --semantic-warning: #b45309; /** Warning state. WCAG AA: 4.6:1 on paper-white */
81
- --semantic-warning-hover: #92400e; /** Warning hover. WCAG AA: 5.8:1 on paper-white */
82
- --semantic-warning-bg: #fff8e1; /** Warning background tint for callouts/notifications */
83
- --semantic-warning-light: #fef3c7; /** Warning light background */
84
- --semantic-success-bg: #d1fae5; /** Success background tint for status indicators */
85
- --semantic-info: #0369a1; /** Info state. WCAG AA: 4.8:1 on paper-white */
86
- --semantic-info-hover: #075985; /** Info hover. WCAG AA: 5.8:1 on paper-white */
87
- --semantic-info-bg: #e0f2fe; /** Info background tint */
88
- --button-height: 3.25rem;
89
- --button-height-secondary: 3rem;
90
- --button-radius: 0.625rem;
91
- --button-font-size: 0.9375rem;
92
- --button-font-weight: 500;
93
- --button-letter-spacing: 0.02em;
94
- --button-dark-hover: #2a2a2a; /** Dark button hover state */
95
- --button-text-height: 2.5rem; /** Text button height */
96
- --button-text-font-size: 0.875rem; /** Text button font size */
97
- --button-spinner-size: 1rem; /** Loading spinner size */
98
- --button-spinner-border-width: 2px; /** Spinner border width */
99
- --container-max-width: 25rem;
100
- --container-max-width-wide: 26.25rem;
101
- --feedback-error-icon-size: 1rem; /** Error icon size */
102
- --feedback-notice-icon-size: 1.25rem; /** Notice icon size */
103
- --input-padding-y: 0.875rem;
104
- --input-padding-x: 1rem;
105
- --input-radius: 0.625rem;
106
- --input-font-size: 1rem;
107
- --label-font-size: 0.75rem;
108
- --label-font-weight: 500;
109
- --label-letter-spacing: 0.08em;
110
- --title-font-size: clamp(1.375rem, 1.27rem + 0.54vw, 1.75rem);
111
- --title-font-weight: 600;
112
- --title-letter-spacing: -0.02em;
113
- --form-subtitle-font-size: 0.9375rem; /** Form subtitle font size */
114
- --page-container-max-width: 25rem; /** Default page container max width (400px) */
115
- --page-container-max-width-wide: 26.25rem; /** Wide page container max width (420px) */
116
- --radius-sm: 0.5rem;
117
- --radius-md: 0.625rem;
118
- --radius-lg: 0.75rem;
119
- --radius-full: 9999px;
120
- --radius-card: clamp(0.75rem, 0.59rem + 0.78vw, 1rem);
121
- --shadow-card: 0 0.0625rem 0.1875rem rgba(26, 26, 26, 0.04), 0 0.375rem 1rem rgba(26, 26, 26, 0.06), 0 1.5rem 3rem rgba(26, 26, 26, 0.06);
122
- --shadow-button-hover-primary: 0 0.25rem 0.75rem rgba(124, 92, 255, 0.3), 0 0.125rem 0.25rem rgba(124, 92, 255, 0.2);
123
- --shadow-button-hover-success: 0 0.25rem 0.75rem rgba(61, 138, 80, 0.3), 0 0.125rem 0.25rem rgba(61, 138, 80, 0.2);
124
- --shadow-input-focus: 0 0 0 0.1875rem rgba(124, 92, 255, 0.12), inset 0 0.0625rem 0.125rem rgba(26, 26, 26, 0.04);
125
- --shadow-overlay: 0 0.25rem 0.5rem rgba(0, 0, 0, 0.1);
126
- --shadow-modal: 0 1.5rem 3rem rgba(0, 0, 0, 0.15);
127
- --shadow-otp-cell-focus: 0 0 0 0.25rem rgba(124, 92, 255, 0.1);
128
- --breakpoint-sm: 640px;
129
- --breakpoint-md: 768px;
130
- --breakpoint-lg: 1024px;
131
- --breakpoint-xl: 1280px;
132
- --z-index-dropdown: 1000;
133
- --z-index-sticky: 1020;
134
- --z-index-fixed: 1030;
135
- --z-index-modal-backdrop: 1040;
136
- --z-index-modal: 1050;
137
- --z-index-popover: 1060;
138
- --z-index-tooltip: 1070;
139
- --size-icon-sm: 1rem; /** Small icon size (16px) */
140
- --size-icon-md: 1.5rem; /** Medium icon size (24px) */
141
- --size-icon-lg: 2rem; /** Large icon size (32px) */
142
- --size-icon-xl: 2.5rem; /** Extra large icon size (40px) */
143
- --size-spinner-sm: 1rem; /** Small spinner (16px) */
144
- --size-spinner-md: 2rem; /** Medium spinner (32px) */
145
- --size-spinner-lg: 4rem; /** Large spinner (64px) */
146
- --size-spinner-button: 1.125rem; /** Spinner size inside buttons (18px) */
147
- --size-border-width-thin: 0.0625rem; /** Thin border (1px) */
148
- --size-border-width-base: 0.09375rem; /** Base border (1.5px) */
149
- --size-border-width-thick: 0.125rem; /** Thick border (2px) */
150
- --size-border-width-heavy: 0.1875rem; /** Heavy border (3px) */
151
- --size-border-width-bold: 0.25rem; /** Bold border (4px) */
152
- --size-chip-padding-sm: 0.125rem 0.5rem; /** Small chip padding */
153
- --size-chip-padding-md: 0.25rem 0.75rem; /** Medium chip padding */
154
- --size-close-button: 2rem; /** Close button size (32px) */
155
- --space-fixed-2xs: 0.0625rem; /** 1px - border, hairline */
156
- --space-fixed-xs: 0.125rem; /** 2px - focus ring */
157
- --space-fixed-sm: 0.25rem; /** 4px - small gap */
158
- --space-fixed-md: 0.5rem; /** 8px - standard gap */
159
- --space-xs: clamp(0.25rem, 0.23rem + 0.11vw, 0.3125rem);
160
- --space-sm: clamp(0.5rem, 0.46rem + 0.22vw, 0.625rem);
161
- --space-md: clamp(0.875rem, 0.77rem + 0.54vw, 1.25rem);
162
- --space-lg: clamp(1.25rem, 1.03rem + 1.09vw, 2rem);
163
- --space-xl: clamp(1.5rem, 1.15rem + 1.74vw, 2.75rem);
164
- --space-2xl: clamp(2rem, 1.35rem + 3.26vw, 4.5rem);
165
- --font-body: "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
166
- --font-size-sm: clamp(0.8125rem, 0.78rem + 0.16vw, 0.9375rem);
167
- --font-size-base: clamp(0.875rem, 0.83rem + 0.22vw, 1rem);
168
- --font-size-lg: clamp(1rem, 0.93rem + 0.33vw, 1.25rem);
169
- --font-size-xl: clamp(1.25rem, 1.14rem + 0.54vw, 1.5rem);
170
- --font-size-2xl: clamp(1.5rem, 1.35rem + 0.76vw, 1.875rem);
171
- --line-height-tight: 1.25;
172
- --line-height-normal: 1.5;
173
- --line-height-relaxed: 1.75;
174
- --button-dark: var(--ink-black); /** Dark button background (console, signin) */
175
- --button-light: var(--paper-cream); /** Light gray secondary button background */
176
- --button-light-hover: var(--paper-warm); /** Light button hover state */
177
- --button-text-padding-sm: var(--space-xs) var(--space-sm); /** Small text button padding */
178
- --button-text-padding-md: var(--space-sm) var(--space-md); /** Medium text button padding */
179
- --button-content-gap: var(--space-sm); /** Gap between button icon and text */
180
- --card-padding: var(--space-lg);
181
- --card-radius: var(--radius-card);
182
- --feedback-error-padding: var(--space-md); /** Error message padding */
183
- --feedback-error-radius: var(--radius-md); /** Error message border radius */
184
- --feedback-error-gap: var(--space-sm); /** Gap between error icon and text */
185
- --feedback-notice-padding: var(--space-md); /** Notice box padding */
186
- --feedback-notice-radius: var(--radius-md); /** Notice box border radius */
187
- --feedback-notice-gap: var(--space-sm); /** Gap between notice icon and text */
188
- --form-header-margin-bottom: var(--space-xl); /** Space below form header */
189
- --form-fields-gap: var(--space-lg); /** Gap between form fields */
190
- --form-footer-margin-top: var(--space-lg); /** Space above form footer */
191
- --field-group-gap: var(--space-sm); /** Gap between label and input in field group */
192
- --page-container-padding: var(--space-lg); /** Page container horizontal padding */
193
- --page-card-padding: var(--space-xl); /** Page card internal padding */
194
- --page-card-radius: var(--radius-lg); /** Page card border radius */
195
- }
1
+ :root,[data-theme=light]{--duration-instant:.15s;--duration-fast:.3s;--duration-smooth:.4s;--duration-slow:.6s;--duration-slower:.8s;--easing-ease:ease;--easing-ease-in-out:cubic-bezier(.4,0,.2,1);--easing-bounce:cubic-bezier(.34,1.56,.64,1);--ink-effect-ripple-duration:.6s;--ink-effect-ripple-easing:cubic-bezier(.4,0,.2,1);--ink-effect-spread-scale:2.5;--ink-effect-fade-duration:.3s;--transition-fast:.15s ease;--transition-smooth:.3s cubic-bezier(.4,0,.2,1);--transition-bounce:.4s cubic-bezier(.34,1.56,.64,1);--opacity-disabled:.6;--opacity-hover:.7;--opacity-loading:.6;--opacity-hidden:0;--opacity-visible:1;--brand-primary:#7c5cff;--brand-primary-hover:#6a4ae8;--brand-logo-text:#1a1a1a;--accent-primary:#6b4fd9;--accent-primary-hover:#5a3fc8;--accent-primary-pressed:#4a32b0;--accent-success:#357a46;--accent-success-hover:#2d6a3c;--accent-success-pressed:#255a32;--alpha-primary04:#7c5cff0a;--alpha-primary08:#7c5cff14;--alpha-primary10:#7c5cff1a;--alpha-primary12:#7c5cff1f;--alpha-primary15:#7c5cff26;--alpha-primary20:#7c5cff33;--alpha-primary30:#7c5cff4d;--alpha-primary40:#7c5cff66;--alpha-primary50:#7c5cff80;--alpha-success10:#3d8a501a;--alpha-success15:#3d8a5026;--alpha-success20:#3d8a5033;--alpha-success30:#3d8a504d;--alpha-warning08:#b4530914;--alpha-warning15:#b4530926;--alpha-warning20:#b4530933;--alpha-info08:#0369a114;--alpha-info15:#0369a126;--alpha-info20:#0369a133;--alpha-ink04:#1a1a1a0a;--alpha-ink06:#1a1a1a0f;--alpha-ink10:#1a1a1a1a;--alpha-white15:#ffffff26;--alpha-white30:#ffffff4d;--alpha-white90:#ffffffe6;--error-base:#c0392b;--error-bg:#e74c3c14;--error-border:#e74c3c33;--ink-black:#1a1a1a;--ink-dark:#2d2d2d;--ink-medium:#5c5c5c;--ink-light:#8a8a8a;--ink-faint:#c4c4c4;--overlay-dim:#00000080;--overlay-dark:#000000b3;--overlay-shadow-light:#0000001a;--overlay-shadow-subtle:#00000026;--overlay-shadow-medium:#0003;--overlay-shadow-strong:#0000004d;--overlay-shadow-heavy:#0006;--overlay-glow-white:#ffffff26;--overlay-spinner-track:#ffffff4d;--paper-white:#faf9fc;--paper-cream:#f5f4f8;--paper-warm:#ebe9f0;--semantic-warning:#b45309;--semantic-warning-hover:#92400e;--semantic-warning-bg:#fff8e1;--semantic-warning-light:#fef3c7;--semantic-success-bg:#d1fae5;--semantic-info:#0369a1;--semantic-info-hover:#075985;--semantic-info-bg:#e0f2fe;--button-height:3.25rem;--button-height-secondary:3rem;--button-radius:.625rem;--button-font-size:.9375rem;--button-font-weight:500;--button-letter-spacing:.02em;--button-dark-hover:#2a2a2a;--button-text-height:2.5rem;--button-text-font-size:.875rem;--button-spinner-size:1rem;--button-spinner-border-width:2px;--container-max-width:25rem;--container-max-width-wide:26.25rem;--feedback-error-icon-size:1rem;--feedback-notice-icon-size:1.25rem;--input-padding-y:.875rem;--input-padding-x:1rem;--input-radius:.625rem;--input-font-size:1rem;--label-font-size:.75rem;--label-font-weight:500;--label-letter-spacing:.08em;--title-font-size:clamp(1.375rem,1.27rem + .54vw,1.75rem);--title-font-weight:600;--title-letter-spacing:-.02em;--form-subtitle-font-size:.9375rem;--page-container-max-width:25rem;--page-container-max-width-wide:26.25rem;--radius-sm:.5rem;--radius-md:.625rem;--radius-lg:.75rem;--radius-full:9999px;--radius-card:clamp(.75rem,.59rem + .78vw,1rem);--shadow-card:0 .0625rem .1875rem #1a1a1a0a,0 .375rem 1rem #1a1a1a0f,0 1.5rem 3rem #1a1a1a0f;--shadow-button-hover-primary:0 .25rem .75rem #7c5cff4d,0 .125rem .25rem #7c5cff33;--shadow-button-hover-success:0 .25rem .75rem #3d8a504d,0 .125rem .25rem #3d8a5033;--shadow-input-focus:0 0 0 .1875rem #7c5cff1f,inset 0 .0625rem .125rem #1a1a1a0a;--shadow-overlay:0 .25rem .5rem #0000001a;--shadow-modal:0 1.5rem 3rem #00000026;--shadow-otp-cell-focus:0 0 0 .25rem #7c5cff1a;--breakpoint-sm:640px;--breakpoint-md:768px;--breakpoint-lg:1024px;--breakpoint-xl:1280px;--z-index-dropdown:1000;--z-index-sticky:1020;--z-index-fixed:1030;--z-index-modal-backdrop:1040;--z-index-modal:1050;--z-index-popover:1060;--z-index-tooltip:1070;--size-icon-sm:1rem;--size-icon-md:1.5rem;--size-icon-lg:2rem;--size-icon-xl:2.5rem;--size-spinner-sm:1rem;--size-spinner-md:2rem;--size-spinner-lg:4rem;--size-spinner-button:1.125rem;--size-border-width-thin:.0625rem;--size-border-width-base:.09375rem;--size-border-width-thick:.125rem;--size-border-width-heavy:.1875rem;--size-border-width-bold:.25rem;--size-chip-padding-sm:.125rem .5rem;--size-chip-padding-md:.25rem .75rem;--size-close-button:2rem;--space-fixed-2xs:.0625rem;--space-fixed-xs:.125rem;--space-fixed-sm:.25rem;--space-fixed-md:.5rem;--space-xs:clamp(.25rem,.23rem + .11vw,.3125rem);--space-sm:clamp(.5rem,.46rem + .22vw,.625rem);--space-md:clamp(.875rem,.77rem + .54vw,1.25rem);--space-lg:clamp(1.25rem,1.03rem + 1.09vw,2rem);--space-xl:clamp(1.5rem,1.15rem + 1.74vw,2.75rem);--space-2xl:clamp(2rem,1.35rem + 3.26vw,4.5rem);--font-body:"DM Sans",-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;--font-size-sm:clamp(.8125rem,.78rem + .16vw,.9375rem);--font-size-base:clamp(.875rem,.83rem + .22vw,1rem);--font-size-lg:clamp(1rem,.93rem + .33vw,1.25rem);--font-size-xl:clamp(1.25rem,1.14rem + .54vw,1.5rem);--font-size-2xl:clamp(1.5rem,1.35rem + .76vw,1.875rem);--line-height-tight:1.25;--line-height-normal:1.5;--line-height-relaxed:1.75;--button-dark:var(--ink-black);--button-light:var(--paper-cream);--button-light-hover:var(--paper-warm);--button-text-padding-sm:var(--space-xs)var(--space-sm);--button-text-padding-md:var(--space-sm)var(--space-md);--button-content-gap:var(--space-sm);--card-padding:var(--space-lg);--card-radius:var(--radius-card);--feedback-error-padding:var(--space-md);--feedback-error-radius:var(--radius-md);--feedback-error-gap:var(--space-sm);--feedback-notice-padding:var(--space-md);--feedback-notice-radius:var(--radius-md);--feedback-notice-gap:var(--space-sm);--form-header-margin-bottom:var(--space-xl);--form-fields-gap:var(--space-lg);--form-footer-margin-top:var(--space-lg);--field-group-gap:var(--space-sm);--page-container-padding:var(--space-lg);--page-card-padding:var(--space-xl);--page-card-radius:var(--radius-lg)}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@transcodes/design-tokens",
3
- "version": "0.3.0",
3
+ "version": "0.3.2",
4
4
  "private": false,
5
5
  "description": "Style Dictionary based design tokens with dark mode support for consistent, beautiful interfaces",
6
6
  "keywords": [
@@ -29,6 +29,10 @@
29
29
  "access": "public"
30
30
  },
31
31
  "type": "module",
32
+ "sideEffects": [
33
+ "./build/*.css",
34
+ "./build/index.js"
35
+ ],
32
36
  "exports": {
33
37
  ".": {
34
38
  "types": "./build/index.d.ts",
@@ -47,14 +51,17 @@
47
51
  },
48
52
  "files": [
49
53
  "build/",
50
- "README.md"
54
+ "README.md",
55
+ "CHANGELOG.md",
56
+ "LICENSE"
51
57
  ],
52
58
  "scripts": {
53
- "build": "bun --bun style-dictionary build --config sd.config.ts && bun --bun style-dictionary build --config sd.config.dark.ts && bun run scripts/build-components-js.ts && bun run scripts/build-index.ts",
59
+ "build": "bun --bun style-dictionary build --config sd.config.ts && bun --bun style-dictionary build --config sd.config.dark.ts && bun run scripts/build-dark-css.ts && bun run scripts/build-components-js.ts && bun run scripts/build-index.ts && bun run scripts/minify-css.ts",
54
60
  "clean": "rm -rf build"
55
61
  },
56
62
  "devDependencies": {
57
63
  "@types/bun": "^1.3.4",
64
+ "lightningcss": "^1.30.2",
58
65
  "style-dictionary": "^5.1.1"
59
66
  }
60
67
  }