@atelier-ui/react 0.1.9 → 0.1.11

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.
Files changed (35) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/package.json +1 -1
  3. package/src/lib/accordion/llm-accordion.css +120 -0
  4. package/src/lib/alert/llm-alert.css +80 -0
  5. package/src/lib/avatar/llm-avatar.css +106 -0
  6. package/src/lib/badge/llm-badge.css +60 -0
  7. package/src/lib/breadcrumbs/llm-breadcrumbs.css +62 -0
  8. package/src/lib/button/llm-button.css +139 -0
  9. package/src/lib/card/llm-card.css +70 -0
  10. package/src/lib/chat/llm-chat.css +446 -0
  11. package/src/lib/checkbox/llm-checkbox.css +123 -0
  12. package/src/lib/code-block/llm-code-block.css +112 -0
  13. package/src/lib/combobox/llm-combobox.css +169 -0
  14. package/src/lib/dialog/llm-dialog.css +174 -0
  15. package/src/lib/drawer/llm-drawer.css +228 -0
  16. package/src/lib/icon/llm-icon.css +29 -0
  17. package/src/lib/input/llm-input.css +94 -0
  18. package/src/lib/menu/llm-menu.css +85 -0
  19. package/src/lib/pagination/llm-pagination.css +80 -0
  20. package/src/lib/progress/llm-progress.css +69 -0
  21. package/src/lib/radio/llm-radio.css +78 -0
  22. package/src/lib/radio-group/llm-radio-group.css +31 -0
  23. package/src/lib/select/llm-select.css +83 -0
  24. package/src/lib/skeleton/llm-skeleton.css +51 -0
  25. package/src/lib/spec.d.ts +2 -2
  26. package/src/lib/spec.d.ts.map +1 -1
  27. package/src/lib/spec.js.map +1 -1
  28. package/src/lib/stepper/llm-stepper.css +171 -0
  29. package/src/lib/table/llm-table.css +200 -0
  30. package/src/lib/tabs/llm-tabs.css +120 -0
  31. package/src/lib/textarea/llm-textarea.css +100 -0
  32. package/src/lib/toast/llm-toast.css +137 -0
  33. package/src/lib/toggle/llm-toggle.css +118 -0
  34. package/src/lib/tooltip/llm-tooltip.css +80 -0
  35. package/styles/tokens.css +346 -0
@@ -0,0 +1,137 @@
1
+ /* ── Toast Container ── */
2
+ .llm-toast-container {
3
+ position: fixed;
4
+ z-index: var(--ui-z-toast, 400);
5
+ display: flex;
6
+ flex-direction: column;
7
+ gap: var(--ui-spacing-2);
8
+ pointer-events: none;
9
+ max-width: min(24rem, calc(100vw - 2rem));
10
+ box-sizing: border-box;
11
+ }
12
+
13
+ .llm-toast-container.position-bottom-right {
14
+ bottom: var(--ui-spacing-4);
15
+ right: var(--ui-spacing-4);
16
+ align-items: flex-end;
17
+ }
18
+
19
+ .llm-toast-container.position-bottom-center {
20
+ bottom: var(--ui-spacing-4);
21
+ left: 50%;
22
+ transform: translateX(-50%);
23
+ align-items: center;
24
+ }
25
+
26
+ .llm-toast-container.position-top-right {
27
+ top: var(--ui-spacing-4);
28
+ right: var(--ui-spacing-4);
29
+ align-items: flex-end;
30
+ }
31
+
32
+ .llm-toast-container.position-top-center {
33
+ top: var(--ui-spacing-4);
34
+ left: 50%;
35
+ transform: translateX(-50%);
36
+ align-items: center;
37
+ }
38
+
39
+ /* ── Individual Toast ── */
40
+ .llm-toast {
41
+ display: flex;
42
+ align-items: center;
43
+ gap: var(--ui-spacing-3);
44
+ padding: var(--ui-spacing-4) var(--ui-spacing-5);
45
+ border-radius: var(--ui-radius-lg);
46
+ border-left: 4px solid transparent;
47
+ font-family: var(--ui-font-family);
48
+ font-size: var(--ui-font-size-sm);
49
+ line-height: var(--ui-line-height-normal);
50
+ box-shadow: var(--ui-shadow-lg);
51
+ background-color: var(--ui-color-surface-raised, var(--ui-color-surface));
52
+ color: var(--ui-color-text);
53
+ pointer-events: auto;
54
+ min-width: 18rem;
55
+ max-width: 100%;
56
+ box-sizing: border-box;
57
+ animation: toast-enter 0.3s ease-out;
58
+ }
59
+
60
+ /* ── Variant borders & tints ── */
61
+ .llm-toast.variant-default {
62
+ border-left-color: var(--ui-color-border);
63
+ }
64
+
65
+ .llm-toast.variant-success {
66
+ border-left-color: var(--ui-color-success);
67
+ background-color: color-mix(in srgb, var(--ui-color-success) 8%, var(--ui-color-surface-raised, var(--ui-color-surface)));
68
+ }
69
+
70
+ .llm-toast.variant-warning {
71
+ border-left-color: var(--ui-color-warning);
72
+ background-color: color-mix(in srgb, var(--ui-color-warning) 8%, var(--ui-color-surface-raised, var(--ui-color-surface)));
73
+ }
74
+
75
+ .llm-toast.variant-danger {
76
+ border-left-color: var(--ui-color-danger);
77
+ background-color: color-mix(in srgb, var(--ui-color-danger) 8%, var(--ui-color-surface-raised, var(--ui-color-surface)));
78
+ }
79
+
80
+ .llm-toast.variant-info {
81
+ border-left-color: var(--ui-color-info);
82
+ background-color: color-mix(in srgb, var(--ui-color-info) 8%, var(--ui-color-surface-raised, var(--ui-color-surface)));
83
+ }
84
+
85
+ /* ── Message ── */
86
+ .llm-toast .message {
87
+ flex: 1;
88
+ }
89
+
90
+ /* ── Dismiss button ── */
91
+ .llm-toast .dismiss {
92
+ display: inline-flex;
93
+ align-items: center;
94
+ justify-content: center;
95
+ flex-shrink: 0;
96
+ width: 1.75rem;
97
+ height: 1.75rem;
98
+ padding: 0;
99
+ background: transparent;
100
+ border: none;
101
+ border-radius: var(--ui-radius-sm);
102
+ cursor: pointer;
103
+ color: var(--ui-color-text-muted, currentColor);
104
+ opacity: 0.7;
105
+ transition: opacity var(--ui-transition-fast, 150ms), background-color var(--ui-transition-fast, 150ms);
106
+ line-height: 1;
107
+ }
108
+
109
+ .llm-toast .dismiss:hover {
110
+ opacity: 1;
111
+ background-color: color-mix(in srgb, currentColor 10%, transparent);
112
+ }
113
+
114
+ .llm-toast .dismiss:focus-visible {
115
+ outline: none;
116
+ box-shadow: var(--ui-focus-ring);
117
+ opacity: 1;
118
+ }
119
+
120
+ /* ── Enter animation ── */
121
+ @keyframes toast-enter {
122
+ from {
123
+ opacity: 0;
124
+ transform: translateY(0.5rem);
125
+ }
126
+ to {
127
+ opacity: 1;
128
+ transform: translateY(0);
129
+ }
130
+ }
131
+
132
+ /* ── Reduced motion ── */
133
+ @media (prefers-reduced-motion: reduce) {
134
+ .llm-toast {
135
+ animation: none;
136
+ }
137
+ }
@@ -0,0 +1,118 @@
1
+ .llm-toggle {
2
+ display: block;
3
+ font-family: var(--ui-font-family);
4
+ font-size: var(--ui-font-size-md);
5
+ }
6
+
7
+ .llm-toggle label {
8
+ display: inline-flex;
9
+ align-items: center;
10
+ gap: var(--ui-spacing-3);
11
+ cursor: pointer;
12
+ user-select: none;
13
+ color: var(--ui-color-text);
14
+ line-height: var(--ui-line-height-normal);
15
+ min-height: 1.5rem;
16
+ }
17
+
18
+ /* Hide native checkbox visually but keep it accessible */
19
+ .llm-toggle input[type='checkbox'] {
20
+ position: absolute;
21
+ width: 1px;
22
+ height: 1px;
23
+ padding: 0;
24
+ margin: -1px;
25
+ overflow: hidden;
26
+ clip: rect(0, 0, 0, 0);
27
+ white-space: nowrap;
28
+ border: 0;
29
+ }
30
+
31
+ /* Track — pill-shaped container */
32
+ .llm-toggle .track {
33
+ position: relative;
34
+ display: inline-flex;
35
+ align-items: center;
36
+ flex-shrink: 0;
37
+ width: 2.75rem;
38
+ height: 1.5rem;
39
+ border-radius: var(--ui-radius-full);
40
+ border: 1px solid var(--ui-color-border-strong);
41
+ background-color: var(--ui-color-input-bg);
42
+ transition: background-color var(--ui-transition-fast),
43
+ border-color var(--ui-transition-fast),
44
+ box-shadow var(--ui-transition-fast);
45
+ cursor: pointer;
46
+ }
47
+
48
+ /* Thumb — circular slider */
49
+ .llm-toggle .thumb {
50
+ position: absolute;
51
+ left: 0.125rem;
52
+ width: 1.125rem;
53
+ height: 1.125rem;
54
+ border-radius: var(--ui-radius-full);
55
+ background-color: var(--ui-color-border-strong);
56
+ box-shadow: var(--ui-shadow-xs);
57
+ transition: transform var(--ui-transition-normal) var(--ui-ease-out),
58
+ background-color var(--ui-transition-fast);
59
+ }
60
+
61
+ /* Hover state */
62
+ .llm-toggle label:hover:not(:has(input:disabled)) .track {
63
+ border-color: var(--ui-color-primary);
64
+ }
65
+
66
+ /* Focus ring on track when native input is focused */
67
+ .llm-toggle input[type='checkbox']:focus-visible + .track {
68
+ box-shadow: var(--ui-focus-ring);
69
+ border-color: var(--ui-color-primary);
70
+ }
71
+
72
+ /* Checked state — track */
73
+ .llm-toggle.is-checked .track {
74
+ background-color: var(--ui-color-primary);
75
+ border-color: var(--ui-color-primary);
76
+ }
77
+
78
+ /* Checked state — thumb slides right */
79
+ .llm-toggle.is-checked .thumb {
80
+ transform: translateX(1.25rem);
81
+ background-color: var(--ui-color-text-on-primary);
82
+ }
83
+
84
+ /* Invalid state — track border */
85
+ .llm-toggle.is-invalid .track {
86
+ border-color: var(--ui-color-input-border-invalid);
87
+ }
88
+
89
+ .llm-toggle.is-invalid input[type='checkbox']:focus-visible + .track {
90
+ border-color: var(--ui-color-input-border-invalid);
91
+ box-shadow: 0 0 0 2px var(--ui-color-surface), 0 0 0 4px var(--ui-color-danger);
92
+ }
93
+
94
+ /* Disabled state */
95
+ .llm-toggle.is-disabled {
96
+ opacity: var(--ui-opacity-disabled);
97
+ cursor: not-allowed;
98
+ }
99
+
100
+ .llm-toggle.is-disabled label {
101
+ cursor: not-allowed;
102
+ }
103
+
104
+ .llm-toggle.is-disabled .track {
105
+ cursor: not-allowed;
106
+ }
107
+
108
+ /* Error messages */
109
+ .llm-toggle .errors {
110
+ margin-top: var(--ui-spacing-2);
111
+ }
112
+
113
+ .llm-toggle .error-message {
114
+ margin: 0;
115
+ font-size: var(--ui-font-size-sm);
116
+ color: var(--ui-color-error-text);
117
+ line-height: var(--ui-line-height-normal);
118
+ }
@@ -0,0 +1,80 @@
1
+ /* Tooltip wrapper — inline container */
2
+ .llm-tooltip-wrapper {
3
+ display: inline-block;
4
+ position: relative;
5
+ }
6
+
7
+ /* Tooltip content */
8
+ .llm-tooltip {
9
+ position: absolute;
10
+ z-index: var(--ui-z-tooltip, 200);
11
+ display: block;
12
+ padding: var(--ui-spacing-1) var(--ui-spacing-2);
13
+ background: var(--ui-color-text);
14
+ color: var(--ui-color-surface);
15
+ font-family: var(--ui-font-family);
16
+ font-size: var(--ui-font-size-xs);
17
+ line-height: var(--ui-line-height-normal);
18
+ border-radius: var(--ui-radius-sm);
19
+ box-shadow: var(--ui-shadow-md);
20
+ max-width: 20rem;
21
+ word-wrap: break-word;
22
+ pointer-events: none;
23
+ white-space: nowrap;
24
+
25
+ /* Entry animation */
26
+ animation: llm-tooltip-enter var(--ui-duration-fast) var(--ui-ease-out) forwards;
27
+ }
28
+
29
+ /* Positioning */
30
+ .llm-tooltip.position-above {
31
+ bottom: calc(100% + 8px);
32
+ left: 50%;
33
+ transform: translateX(-50%);
34
+ }
35
+
36
+ .llm-tooltip.position-below {
37
+ top: calc(100% + 8px);
38
+ left: 50%;
39
+ transform: translateX(-50%);
40
+ }
41
+
42
+ .llm-tooltip.position-left {
43
+ right: calc(100% + 8px);
44
+ top: 50%;
45
+ transform: translateY(-50%);
46
+ }
47
+
48
+ .llm-tooltip.position-right {
49
+ left: calc(100% + 8px);
50
+ top: 50%;
51
+ transform: translateY(-50%);
52
+ }
53
+
54
+ @keyframes llm-tooltip-enter {
55
+ from {
56
+ opacity: 0;
57
+ transform: scale(0.95) translateX(-50%);
58
+ }
59
+ to {
60
+ opacity: 1;
61
+ transform: scale(1) translateX(-50%);
62
+ }
63
+ }
64
+
65
+ /* Left/right don't need translateX in animation */
66
+ .llm-tooltip.position-left,
67
+ .llm-tooltip.position-right {
68
+ animation: llm-tooltip-enter-side var(--ui-duration-fast) var(--ui-ease-out) forwards;
69
+ }
70
+
71
+ @keyframes llm-tooltip-enter-side {
72
+ from {
73
+ opacity: 0;
74
+ transform: scale(0.95) translateY(-50%);
75
+ }
76
+ to {
77
+ opacity: 1;
78
+ transform: scale(1) translateY(-50%);
79
+ }
80
+ }
@@ -0,0 +1,346 @@
1
+ /**
2
+ * Design tokens for the Atelier component library.
3
+ * Direction A — Conciso anchor only. Deep Conciso teal on a clean white
4
+ * canvas (light) / bright teal on rich slate (dark). Modernised radius
5
+ * scale. No moss, no warm bone — just Conciso.
6
+ *
7
+ * All foreground/background pairs verified WCAG 2.2 AA via
8
+ * tools/scripts/wcag-contrast.mjs (52/52 pairs passing 2026-04-26).
9
+ *
10
+ * Plan: ~/.claude/plans/atelier-design-rebrief.md (Direction A pivot)
11
+ *
12
+ * Usage:
13
+ * @import '@atelier-ui/{angular,react,vue}/styles/tokens.css';
14
+ */
15
+
16
+ :root {
17
+ /* Typography */
18
+ --ui-font-family: 'Inter', ui-sans-serif, system-ui, -apple-system,
19
+ BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
20
+ --ui-font-size-xs: 0.75rem;
21
+ --ui-font-size-sm: 0.875rem;
22
+ --ui-font-size-md: 1rem;
23
+ --ui-font-size-lg: 1.125rem;
24
+ --ui-font-size-xl: 1.25rem;
25
+ --ui-font-size-2xl: 1.5rem;
26
+ --ui-letter-spacing-tight: -0.01em;
27
+ --ui-letter-spacing-normal: 0;
28
+ --ui-letter-spacing-wide: 0.01em;
29
+ --ui-font-weight-normal: 400;
30
+ --ui-font-weight-medium: 500;
31
+ --ui-font-weight-semibold: 600;
32
+ --ui-line-height-tight: 1.25;
33
+ --ui-line-height-normal: 1.5;
34
+
35
+ /* ── Colours · light mode (default) ────────────────────────── */
36
+
37
+ /* Primary — Conciso deep teal */
38
+ --ui-color-primary: #006470;
39
+ --ui-color-primary-hover: #004e58;
40
+ --ui-color-primary-active: #003a42;
41
+ --ui-color-primary-light: rgba(0, 100, 112, 0.08);
42
+
43
+ /* Secondary (legacy — kept for components that opt in) */
44
+ --ui-color-secondary: #475569;
45
+ --ui-color-secondary-hover: #334155;
46
+ --ui-color-secondary-active: #1e293b;
47
+
48
+ /* Semantic */
49
+ --ui-color-danger: #b91c1c;
50
+ --ui-color-danger-hover: #991b1b;
51
+ --ui-color-danger-active: #7f1d1d;
52
+ --ui-color-success: #15803d;
53
+ --ui-color-warning: #b45309;
54
+ --ui-color-info: #0369a1;
55
+
56
+ /* Semantic — AA-safe dark-text-on-tinted-bg pairs (Badge / Alert / Toast) */
57
+ --ui-color-success-bg: #dcfce7;
58
+ --ui-color-success-text: #166534;
59
+ --ui-color-warning-bg: #fef3c7;
60
+ --ui-color-warning-text: #854d0e;
61
+ --ui-color-danger-bg: #fee2e2;
62
+ --ui-color-danger-text: #991b1b;
63
+ --ui-color-info-bg: #e0f2fe;
64
+ --ui-color-info-text: #0c4a6e;
65
+
66
+ /* Surfaces — clean white + cool slate */
67
+ --ui-color-surface: #ffffff;
68
+ --ui-color-surface-raised: #f8fafc;
69
+ --ui-color-surface-sunken: #f1f5f9;
70
+ --ui-color-overlay: rgba(0, 0, 0, 0.5);
71
+
72
+ /* Borders — split decorative from functional per WCAG 1.4.11 */
73
+ --ui-color-border: #e2e8f0; /* decorative */
74
+ --ui-color-border-hover: #cbd5e1;
75
+ --ui-color-border-strong: #64748b; /* functional ≥3:1 */
76
+
77
+ /* Text */
78
+ --ui-color-text: #0f172a;
79
+ --ui-color-text-muted: #475569;
80
+ --ui-color-text-on-primary: #ffffff;
81
+ --ui-color-text-on-secondary: #ffffff;
82
+ --ui-color-text-on-danger: #ffffff;
83
+ --ui-color-text-on-success: #ffffff;
84
+
85
+ /* Brand palette — Conciso reference, opt-in for components that need it */
86
+ --ui-color-brand-corporate: #00bebe;
87
+ --ui-color-brand-agile: #00d296;
88
+ --ui-color-brand-architecture: #009696;
89
+ --ui-color-brand-development: #00b4ff;
90
+ --ui-color-brand-petrol: #005064;
91
+ --ui-color-brand-ai: #b5e61c;
92
+ --ui-color-brand-light-blue: #00ebff;
93
+ --ui-color-brand-light-green: #a0fa50;
94
+ --ui-opacity-disabled: 0.5;
95
+
96
+ /* Border radius — bumped for modern feel */
97
+ --ui-radius-sm: 0.5rem; /* was 0.375rem */
98
+ --ui-radius-md: 0.625rem; /* was 0.5rem */
99
+ --ui-radius-lg: 0.875rem; /* was 0.75rem */
100
+ --ui-radius-xl: 1.25rem; /* was 1rem */
101
+ --ui-radius-full: 9999px;
102
+
103
+ /* Spacing */
104
+ --ui-spacing-1: 0.25rem;
105
+ --ui-spacing-2: 0.5rem;
106
+ --ui-spacing-3: 0.75rem;
107
+ --ui-spacing-4: 1rem;
108
+ --ui-spacing-5: 1.25rem;
109
+ --ui-spacing-6: 1.5rem;
110
+ --ui-spacing-8: 2rem;
111
+ --ui-spacing-10: 2.5rem;
112
+ --ui-spacing-12: 3rem;
113
+ --ui-spacing-16: 4rem;
114
+
115
+ /* Shadows — slate-tinted dual-layer (ambient + key light) */
116
+ --ui-shadow-xs: 0 1px 2px 0 rgba(15, 23, 42, 0.05);
117
+ --ui-shadow-sm: 0 1px 3px 0 rgba(15, 23, 42, 0.08),
118
+ 0 1px 2px -1px rgba(15, 23, 42, 0.06);
119
+ --ui-shadow-md: 0 4px 6px -1px rgba(15, 23, 42, 0.08),
120
+ 0 2px 4px -2px rgba(15, 23, 42, 0.05);
121
+ --ui-shadow-lg: 0 10px 15px -3px rgba(15, 23, 42, 0.08),
122
+ 0 4px 6px -4px rgba(15, 23, 42, 0.04);
123
+ --ui-shadow-xl: 0 20px 25px -5px rgba(15, 23, 42, 0.10),
124
+ 0 8px 10px -6px rgba(15, 23, 42, 0.04);
125
+
126
+ /* Motion */
127
+ --ui-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
128
+ --ui-ease-in-out: cubic-bezier(0.45, 0, 0.55, 1);
129
+ --ui-ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
130
+
131
+ --ui-duration-fast: 150ms;
132
+ --ui-duration-normal: 200ms;
133
+ --ui-duration-slow: 300ms;
134
+
135
+ --ui-transition-fast: var(--ui-duration-fast) var(--ui-ease-out);
136
+ --ui-transition-normal: var(--ui-duration-normal) var(--ui-ease-out);
137
+ --ui-transition-slow: var(--ui-duration-slow) var(--ui-ease-out);
138
+
139
+ /* Focus ring — double-ring for light & dark background compatibility */
140
+ --ui-focus-ring: 0 0 0 2px var(--ui-color-surface),
141
+ 0 0 0 4px var(--ui-color-primary);
142
+
143
+ /* Form controls */
144
+ --ui-color-input-bg: var(--ui-color-surface-sunken);
145
+ --ui-color-input-bg-focus: var(--ui-color-surface);
146
+ --ui-color-input-border: var(--ui-color-border-strong);
147
+ --ui-color-input-border-hover: #475569;
148
+ --ui-color-input-border-focus: var(--ui-color-primary);
149
+ --ui-color-input-border-invalid: var(--ui-color-danger);
150
+ --ui-color-placeholder: #64748b;
151
+ --ui-color-error-text: var(--ui-color-danger-text);
152
+
153
+ /* Z-index scale */
154
+ --ui-z-base: 0;
155
+ --ui-z-dropdown: 100;
156
+ --ui-z-overlay: 200;
157
+ --ui-z-modal: 300;
158
+ --ui-z-toast: 400;
159
+ }
160
+
161
+ /* ── Colours · dark mode ───────────────────────────────────── */
162
+
163
+ @media (prefers-color-scheme: dark) {
164
+ :root {
165
+ --ui-color-primary: #34d8d8;
166
+ --ui-color-primary-hover: #5ee5e5;
167
+ --ui-color-primary-active: #87efef;
168
+ --ui-color-primary-light: rgba(52, 216, 216, 0.15);
169
+
170
+ --ui-color-secondary: #94a3b8;
171
+ --ui-color-secondary-hover: #cbd5e1;
172
+ --ui-color-secondary-active: #e2e8f0;
173
+
174
+ --ui-color-danger: #f87171;
175
+ --ui-color-danger-hover: #fca5a5;
176
+ --ui-color-danger-active: #fecaca;
177
+ --ui-color-success: #4ade80;
178
+ --ui-color-warning: #fbbf24;
179
+ --ui-color-info: #38bdf8;
180
+
181
+ --ui-color-success-bg: #0f3320;
182
+ --ui-color-success-text: #86efac;
183
+ --ui-color-warning-bg: #3a2510;
184
+ --ui-color-warning-text: #fde68a;
185
+ --ui-color-danger-bg: #3a1414;
186
+ --ui-color-danger-text: #fca5a5;
187
+ --ui-color-info-bg: #102338;
188
+ --ui-color-info-text: #bae6fd;
189
+
190
+ --ui-color-surface: #0a1116;
191
+ --ui-color-surface-raised: #131c24;
192
+ --ui-color-surface-sunken: #060c10;
193
+ --ui-color-overlay: rgba(0, 0, 0, 0.7);
194
+
195
+ --ui-color-border: #1e293b;
196
+ --ui-color-border-hover: #334155;
197
+ --ui-color-border-strong: #64748b;
198
+
199
+ --ui-color-text: #f1f5f9;
200
+ --ui-color-text-muted: #94a3b8;
201
+ --ui-color-text-on-primary: #0a1116;
202
+ --ui-color-text-on-secondary: #0f172a;
203
+ --ui-color-text-on-danger: #0a1116;
204
+ --ui-color-text-on-success: #0a1116;
205
+
206
+ --ui-opacity-disabled: 0.65;
207
+
208
+ --ui-color-input-border: var(--ui-color-border-strong);
209
+ --ui-color-input-border-hover: #94a3b8;
210
+ --ui-color-placeholder: #94a3b8;
211
+
212
+ --ui-shadow-xs: 0 1px 2px 0 rgba(0, 0, 0, 0.3);
213
+ --ui-shadow-sm: 0 1px 3px 0 rgba(0, 0, 0, 0.4),
214
+ 0 1px 2px -1px rgba(0, 0, 0, 0.3);
215
+ --ui-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.45),
216
+ 0 2px 4px -2px rgba(0, 0, 0, 0.3);
217
+ --ui-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.5),
218
+ 0 4px 6px -4px rgba(0, 0, 0, 0.25);
219
+ --ui-shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.5),
220
+ 0 8px 10px -6px rgba(0, 0, 0, 0.25);
221
+ }
222
+ }
223
+
224
+ [data-theme="dark"] {
225
+ --ui-color-primary: #34d8d8;
226
+ --ui-color-primary-hover: #5ee5e5;
227
+ --ui-color-primary-active: #87efef;
228
+ --ui-color-primary-light: rgba(52, 216, 216, 0.15);
229
+
230
+ --ui-color-secondary: #94a3b8;
231
+ --ui-color-secondary-hover: #cbd5e1;
232
+ --ui-color-secondary-active: #e2e8f0;
233
+
234
+ --ui-color-danger: #f87171;
235
+ --ui-color-danger-hover: #fca5a5;
236
+ --ui-color-danger-active: #fecaca;
237
+ --ui-color-success: #4ade80;
238
+ --ui-color-warning: #fbbf24;
239
+ --ui-color-info: #38bdf8;
240
+
241
+ --ui-color-success-bg: #0f3320;
242
+ --ui-color-success-text: #86efac;
243
+ --ui-color-warning-bg: #3a2510;
244
+ --ui-color-warning-text: #fde68a;
245
+ --ui-color-danger-bg: #3a1414;
246
+ --ui-color-danger-text: #fca5a5;
247
+ --ui-color-info-bg: #102338;
248
+ --ui-color-info-text: #bae6fd;
249
+
250
+ --ui-color-surface: #0a1116;
251
+ --ui-color-surface-raised: #131c24;
252
+ --ui-color-surface-sunken: #060c10;
253
+ --ui-color-overlay: rgba(0, 0, 0, 0.7);
254
+
255
+ --ui-color-border: #1e293b;
256
+ --ui-color-border-hover: #334155;
257
+ --ui-color-border-strong: #64748b;
258
+
259
+ --ui-color-text: #f1f5f9;
260
+ --ui-color-text-muted: #94a3b8;
261
+ --ui-color-text-on-primary: #0a1116;
262
+ --ui-color-text-on-secondary: #0f172a;
263
+ --ui-color-text-on-danger: #0a1116;
264
+ --ui-color-text-on-success: #0a1116;
265
+
266
+ --ui-opacity-disabled: 0.65;
267
+
268
+ --ui-color-input-border: var(--ui-color-border-strong);
269
+ --ui-color-input-border-hover: #94a3b8;
270
+ --ui-color-placeholder: #94a3b8;
271
+
272
+ --ui-shadow-xs: 0 1px 2px 0 rgba(0, 0, 0, 0.3);
273
+ --ui-shadow-sm: 0 1px 3px 0 rgba(0, 0, 0, 0.4),
274
+ 0 1px 2px -1px rgba(0, 0, 0, 0.3);
275
+ --ui-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.45),
276
+ 0 2px 4px -2px rgba(0, 0, 0, 0.3);
277
+ --ui-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.5),
278
+ 0 4px 6px -4px rgba(0, 0, 0, 0.25);
279
+ --ui-shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.5),
280
+ 0 8px 10px -6px rgba(0, 0, 0, 0.25);
281
+ }
282
+
283
+ /* Explicit light theme — declared last so it wins over prefers-color-scheme: dark */
284
+ [data-theme="light"] {
285
+ --ui-color-primary: #006470;
286
+ --ui-color-primary-hover: #004e58;
287
+ --ui-color-primary-active: #003a42;
288
+ --ui-color-primary-light: rgba(0, 100, 112, 0.08);
289
+
290
+ --ui-color-secondary: #475569;
291
+ --ui-color-secondary-hover: #334155;
292
+ --ui-color-secondary-active: #1e293b;
293
+
294
+ --ui-color-danger: #b91c1c;
295
+ --ui-color-danger-hover: #991b1b;
296
+ --ui-color-danger-active: #7f1d1d;
297
+ --ui-color-success: #15803d;
298
+ --ui-color-warning: #b45309;
299
+ --ui-color-info: #0369a1;
300
+
301
+ --ui-color-success-bg: #dcfce7;
302
+ --ui-color-success-text: #166534;
303
+ --ui-color-warning-bg: #fef3c7;
304
+ --ui-color-warning-text: #854d0e;
305
+ --ui-color-danger-bg: #fee2e2;
306
+ --ui-color-danger-text: #991b1b;
307
+ --ui-color-info-bg: #e0f2fe;
308
+ --ui-color-info-text: #0c4a6e;
309
+
310
+ --ui-color-surface: #ffffff;
311
+ --ui-color-surface-raised: #f8fafc;
312
+ --ui-color-surface-sunken: #f1f5f9;
313
+ --ui-color-overlay: rgba(0, 0, 0, 0.5);
314
+
315
+ --ui-color-border: #e2e8f0;
316
+ --ui-color-border-hover: #cbd5e1;
317
+ --ui-color-border-strong: #64748b;
318
+
319
+ --ui-color-text: #0f172a;
320
+ --ui-color-text-muted: #475569;
321
+ --ui-color-text-on-primary: #ffffff;
322
+ --ui-color-text-on-secondary: #ffffff;
323
+ --ui-color-text-on-danger: #ffffff;
324
+ --ui-color-text-on-success: #ffffff;
325
+
326
+ --ui-opacity-disabled: 0.5;
327
+
328
+ --ui-color-input-border: var(--ui-color-border-strong);
329
+ --ui-color-input-border-hover: #475569;
330
+ --ui-color-placeholder: #64748b;
331
+
332
+ --ui-shadow-xs: 0 1px 2px 0 rgba(15, 23, 42, 0.05);
333
+ --ui-shadow-sm: 0 1px 3px 0 rgba(15, 23, 42, 0.08), 0 1px 2px -1px rgba(15, 23, 42, 0.06);
334
+ --ui-shadow-md: 0 4px 6px -1px rgba(15, 23, 42, 0.08), 0 2px 4px -2px rgba(15, 23, 42, 0.05);
335
+ --ui-shadow-lg: 0 10px 15px -3px rgba(15, 23, 42, 0.08), 0 4px 6px -4px rgba(15, 23, 42, 0.04);
336
+ --ui-shadow-xl: 0 20px 25px -5px rgba(15, 23, 42, 0.10), 0 8px 10px -6px rgba(15, 23, 42, 0.04);
337
+ }
338
+
339
+ @media (prefers-reduced-motion: reduce) {
340
+ :root {
341
+ --ui-duration-fast: 0ms;
342
+ --ui-duration-normal: 0ms;
343
+ --ui-duration-slow: 0ms;
344
+ --ui-ease-spring: ease;
345
+ }
346
+ }