@refrakt-md/lumina 0.12.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/assets/logo/prism-16-dark.png +0 -0
  2. package/assets/logo/prism-16-light.png +0 -0
  3. package/assets/logo/prism-180-dark.png +0 -0
  4. package/assets/logo/prism-180-light.png +0 -0
  5. package/assets/logo/prism-192-dark.png +0 -0
  6. package/assets/logo/prism-192-light.png +0 -0
  7. package/assets/logo/prism-24-dark.png +0 -0
  8. package/assets/logo/prism-24-light.png +0 -0
  9. package/assets/logo/prism-32-dark.png +0 -0
  10. package/assets/logo/prism-32-light.png +0 -0
  11. package/assets/logo/prism-48-dark.png +0 -0
  12. package/assets/logo/prism-48-light.png +0 -0
  13. package/assets/logo/prism-512-dark.png +0 -0
  14. package/assets/logo/prism-512-light.png +0 -0
  15. package/assets/logo/prism-64-dark.png +0 -0
  16. package/assets/logo/prism-64-light.png +0 -0
  17. package/assets/logo/prism-96-dark.png +0 -0
  18. package/assets/logo/prism-96-light.png +0 -0
  19. package/assets/logo/prism.svg +4 -0
  20. package/contracts/structures.json +23 -1
  21. package/dist/config.js +32 -32
  22. package/dist/config.js.map +1 -1
  23. package/dist/presets/niwaki.d.ts +23 -0
  24. package/dist/presets/niwaki.d.ts.map +1 -0
  25. package/dist/presets/niwaki.js +50 -0
  26. package/dist/presets/niwaki.js.map +1 -0
  27. package/dist/presets/tideline.d.ts +26 -0
  28. package/dist/presets/tideline.d.ts.map +1 -0
  29. package/dist/presets/tideline.js +132 -0
  30. package/dist/presets/tideline.js.map +1 -0
  31. package/dist/tokens.d.ts +20 -0
  32. package/dist/tokens.d.ts.map +1 -0
  33. package/dist/tokens.js +178 -0
  34. package/dist/tokens.js.map +1 -0
  35. package/dist/transform.d.ts +5 -0
  36. package/dist/transform.d.ts.map +1 -1
  37. package/dist/transform.js +5 -0
  38. package/dist/transform.js.map +1 -1
  39. package/index.css +1 -0
  40. package/package.json +17 -6
  41. package/styles/dimensions/surfaces.css +4 -2
  42. package/styles/global.css +4 -4
  43. package/styles/layouts/blog.css +8 -2
  44. package/styles/layouts/default.css +37 -3
  45. package/styles/layouts/docs.css +24 -6
  46. package/styles/layouts/mobile.css +36 -5
  47. package/styles/runes/codegroup.css +19 -15
  48. package/styles/runes/hint.css +5 -9
  49. package/styles/runes/nav.css +330 -1
  50. package/styles/runes/pagination.css +85 -0
  51. package/styles/runes/palette.css +9 -0
  52. package/styles/runes/tint.css +116 -72
  53. package/tokens/base.css +74 -53
  54. package/tokens/dark.css +97 -75
@@ -16,32 +16,32 @@
16
16
  @property --rf-color-bg {
17
17
  syntax: '<color>';
18
18
  inherits: true;
19
- initial-value: #faf5eb;
19
+ initial-value: #f5f4f1;
20
20
  }
21
21
  @property --rf-color-surface {
22
22
  syntax: '<color>';
23
23
  inherits: true;
24
- initial-value: #fffbf2;
24
+ initial-value: #fbfaf7;
25
25
  }
26
26
  @property --rf-color-text {
27
27
  syntax: '<color>';
28
28
  inherits: true;
29
- initial-value: #1d3557;
29
+ initial-value: #1c1a17;
30
30
  }
31
31
  @property --rf-color-muted {
32
32
  syntax: '<color>';
33
33
  inherits: true;
34
- initial-value: #5a7a90;
34
+ initial-value: #6b6661;
35
35
  }
36
36
  @property --rf-color-primary {
37
37
  syntax: '<color>';
38
38
  inherits: true;
39
- initial-value: #457b9d;
39
+ initial-value: #1c1a17;
40
40
  }
41
41
  @property --rf-color-border {
42
42
  syntax: '<color>';
43
43
  inherits: true;
44
- initial-value: #d8e4de;
44
+ initial-value: #e2e0dd;
45
45
  }
46
46
 
47
47
  /* ── 1. Colour scheme override ──────────────────────────────────────────────
@@ -55,12 +55,12 @@
55
55
  color: var(--rf-color-text);
56
56
  background-color: var(--rf-color-bg);
57
57
 
58
- --cs-bg: #152238;
59
- --cs-surface: #1a2940;
60
- --cs-text: #f1faee;
61
- --cs-muted: #a8dadc;
62
- --cs-accent: #70b4c0;
63
- --cs-border: rgba(168, 218, 220, 0.15);
58
+ --cs-bg: #1a1a17;
59
+ --cs-surface: #211f1c;
60
+ --cs-text: #f6f4ef;
61
+ --cs-muted: #94908a;
62
+ --cs-accent: #f6f4ef;
63
+ --cs-border: #2a2825;
64
64
 
65
65
  --rf-color-bg: var(--cs-bg);
66
66
  --rf-color-surface: var(--cs-surface);
@@ -69,27 +69,48 @@
69
69
  --rf-color-primary: var(--cs-accent);
70
70
  --rf-color-border: var(--cs-border);
71
71
 
72
- --rf-color-primary-hover: #a8dadc;
73
- --rf-color-surface-hover: #203048;
74
- --rf-color-surface-active: #263850;
75
- --rf-color-surface-raised: #1a2940;
76
-
77
- --rf-color-info: #a8dadc;
78
- --rf-color-info-bg: rgba(69, 123, 157, 0.12);
79
- --rf-color-info-border: rgba(69, 123, 157, 0.3);
80
- --rf-color-warning: #e8c07a;
81
- --rf-color-warning-bg: rgba(200, 144, 10, 0.12);
82
- --rf-color-warning-border: rgba(200, 144, 10, 0.3);
83
- --rf-color-danger: #f07078;
84
- --rf-color-danger-bg: rgba(230, 57, 70, 0.12);
85
- --rf-color-danger-border: rgba(230, 57, 70, 0.3);
86
- --rf-color-success: #72c098;
87
- --rf-color-success-bg: rgba(61, 143, 101, 0.12);
88
- --rf-color-success-border: rgba(61, 143, 101, 0.3);
89
-
90
- --rf-color-code-bg: #152238;
91
- --rf-color-code-text: #f1faee;
92
- --rf-color-inline-code-bg: rgba(168, 218, 220, 0.08);
72
+ --rf-color-primary-hover: #d4cfc5;
73
+ --rf-color-surface-hover: #2a2825;
74
+ --rf-color-surface-active: #353330;
75
+ --rf-color-surface-raised: #292723;
76
+
77
+ --rf-color-info: #9bb4c7;
78
+ --rf-color-info-bg: #1f2530;
79
+ --rf-color-info-border: #3d4655;
80
+ --rf-color-warning: #d4a868;
81
+ --rf-color-warning-bg: #2a2519;
82
+ --rf-color-warning-border: #4a3f2a;
83
+ --rf-color-danger: #d48888;
84
+ --rf-color-danger-bg: #2a1818;
85
+ --rf-color-danger-border: #4a2a2a;
86
+ --rf-color-success: #7eb398;
87
+ --rf-color-success-bg: #1a2a1f;
88
+ --rf-color-success-border: #2a4a35;
89
+
90
+ --rf-color-code-bg: #222220;
91
+ --rf-color-code-text: #f6f4ef;
92
+ --rf-color-code-inline-bg: #2b2b29;
93
+ --rf-color-inline-code-bg: #2b2b29;
94
+
95
+ --rf-syntax-keyword: #7eb6bc;
96
+ --rf-syntax-function: #a89bc7;
97
+ --rf-syntax-string: #c79a9a;
98
+ --rf-syntax-constant: #d4b07e;
99
+ --rf-syntax-comment: #6b6661;
100
+ --rf-syntax-punctuation: #94908a;
101
+ --rf-syntax-variable: #f6f4ef;
102
+
103
+ --rf-syntax-foreground: #f6f4ef;
104
+ --rf-syntax-background: #222220;
105
+ --rf-syntax-token-keyword: #7eb6bc;
106
+ --rf-syntax-token-string: #c79a9a;
107
+ --rf-syntax-token-string-expression: #c79a9a;
108
+ --rf-syntax-token-constant: #d4b07e;
109
+ --rf-syntax-token-comment: #6b6661;
110
+ --rf-syntax-token-function: #a89bc7;
111
+ --rf-syntax-token-parameter: #f6f4ef;
112
+ --rf-syntax-token-punctuation: #94908a;
113
+ --rf-syntax-token-link: #a89bc7;
93
114
 
94
115
  --rf-shadow-xs: 0 1px 2px rgba(0,0,0,0.3);
95
116
  --rf-shadow-sm: 0 1px 3px rgba(0,0,0,0.4), 0 1px 2px rgba(0,0,0,0.3);
@@ -103,12 +124,12 @@
103
124
  color: var(--rf-color-text);
104
125
  background-color: var(--rf-color-bg);
105
126
 
106
- --cs-bg: #faf5eb;
107
- --cs-surface: #fffbf2;
108
- --cs-text: #1d3557;
109
- --cs-muted: #5a7a90;
110
- --cs-accent: #457b9d;
111
- --cs-border: #d8e4de;
127
+ --cs-bg: #f5f4f1;
128
+ --cs-surface: #fbfaf7;
129
+ --cs-text: #1c1a17;
130
+ --cs-muted: #6b6661;
131
+ --cs-accent: #1c1a17;
132
+ --cs-border: #e2e0dd;
112
133
 
113
134
  --rf-color-bg: var(--cs-bg);
114
135
  --rf-color-surface: var(--cs-surface);
@@ -117,25 +138,48 @@
117
138
  --rf-color-primary: var(--cs-accent);
118
139
  --rf-color-border: var(--cs-border);
119
140
 
120
- --rf-color-primary-hover: #376585;
121
- --rf-color-surface-hover: #fdf0d5;
122
- --rf-color-surface-active: #f9ebcc;
141
+ --rf-color-primary-hover: #3a342d;
142
+ --rf-color-surface-hover: #ecebe8;
143
+ --rf-color-surface-active: #e2e0dd;
123
144
  --rf-color-surface-raised: #ffffff;
124
145
 
125
- --rf-color-info: #457b9d;
126
- --rf-color-info-bg: #edf4f8;
127
- --rf-color-info-border: #a8dadc;
128
- --rf-color-warning: #c8900a;
129
- --rf-color-warning-bg: #fdf5e4;
130
- --rf-color-warning-border: #edd49a;
131
- --rf-color-danger: #e63946;
132
- --rf-color-danger-bg: #fdeced;
133
- --rf-color-danger-border: #f0b0b5;
134
- --rf-color-success: #3d8f65;
135
- --rf-color-success-bg: #ecf5ef;
136
- --rf-color-success-border: #a8d4b8;
137
-
138
- --rf-color-inline-code-bg: #f9ebcc;
146
+ --rf-color-info: #34547a;
147
+ --rf-color-info-bg: #e8edf4;
148
+ --rf-color-info-border: #c5d2e0;
149
+ --rf-color-warning: #9c5a18;
150
+ --rf-color-warning-bg: #f5ebd9;
151
+ --rf-color-warning-border: #e0c9a3;
152
+ --rf-color-danger: #a83232;
153
+ --rf-color-danger-bg: #f5e0e0;
154
+ --rf-color-danger-border: #e0b8b8;
155
+ --rf-color-success: #2d6a3e;
156
+ --rf-color-success-bg: #e0eee4;
157
+ --rf-color-success-border: #b8d4be;
158
+
159
+ --rf-color-code-bg: #ebeae8;
160
+ --rf-color-code-text: #1c1a17;
161
+ --rf-color-code-inline-bg: #e6e5e3;
162
+ --rf-color-inline-code-bg: #e6e5e3;
163
+
164
+ --rf-syntax-keyword: #2a5c63;
165
+ --rf-syntax-function: #4a3b6e;
166
+ --rf-syntax-string: #8a3a3a;
167
+ --rf-syntax-constant: #876327;
168
+ --rf-syntax-comment: #8a857d;
169
+ --rf-syntax-punctuation: #6b6661;
170
+ --rf-syntax-variable: #1c1a17;
171
+
172
+ --rf-syntax-foreground: #1c1a17;
173
+ --rf-syntax-background: #ebeae8;
174
+ --rf-syntax-token-keyword: #2a5c63;
175
+ --rf-syntax-token-string: #8a3a3a;
176
+ --rf-syntax-token-string-expression: #8a3a3a;
177
+ --rf-syntax-token-constant: #876327;
178
+ --rf-syntax-token-comment: #8a857d;
179
+ --rf-syntax-token-function: #4a3b6e;
180
+ --rf-syntax-token-parameter: #1c1a17;
181
+ --rf-syntax-token-punctuation: #6b6661;
182
+ --rf-syntax-token-link: #4a3b6e;
139
183
 
140
184
  --rf-shadow-xs: 0 1px 2px rgba(0,0,0,0.04);
141
185
  --rf-shadow-sm: 0 1px 3px rgba(0,0,0,0.06), 0 1px 2px rgba(0,0,0,0.04);
@@ -157,11 +201,11 @@
157
201
 
158
202
  [data-tint] {
159
203
  color: var(--rf-color-text);
160
- --rf-color-bg: var(--tint-background);
204
+ --rf-color-bg: var(--tint-bg);
161
205
  --rf-color-surface: var(--tint-surface);
162
- --rf-color-text: var(--tint-primary);
163
- --rf-color-muted: var(--tint-secondary);
164
- --rf-color-primary: var(--tint-accent);
206
+ --rf-color-text: var(--tint-text);
207
+ --rf-color-muted: var(--tint-muted);
208
+ --rf-color-primary: var(--tint-primary);
165
209
  --rf-color-border: var(--tint-border);
166
210
  }
167
211
 
@@ -173,11 +217,11 @@
173
217
  * (which carries the dark theme value). */
174
218
 
175
219
  :is([data-theme="dark"], [data-color-scheme="dark"]) [data-tint] {
176
- --rf-color-bg: var(--tint-dark-background, var(--tint-background));
220
+ --rf-color-bg: var(--tint-dark-bg, var(--tint-bg));
177
221
  --rf-color-surface: var(--tint-dark-surface, var(--tint-surface));
178
- --rf-color-text: var(--tint-dark-primary, var(--tint-primary));
179
- --rf-color-muted: var(--tint-dark-secondary, var(--tint-secondary));
180
- --rf-color-primary: var(--tint-dark-accent, var(--tint-accent));
222
+ --rf-color-text: var(--tint-dark-text, var(--tint-text));
223
+ --rf-color-muted: var(--tint-dark-muted, var(--tint-muted));
224
+ --rf-color-primary: var(--tint-dark-primary, var(--tint-primary));
181
225
  --rf-color-border: var(--tint-dark-border, var(--tint-border));
182
226
  }
183
227
 
@@ -187,19 +231,19 @@
187
231
  * tint tokens use the colour-scheme value, not the page-level value. */
188
232
 
189
233
  [data-color-scheme="dark"][data-tint] {
190
- --rf-color-bg: var(--tint-dark-background, var(--tint-background, var(--cs-bg)));
234
+ --rf-color-bg: var(--tint-dark-bg, var(--tint-bg, var(--cs-bg)));
191
235
  --rf-color-surface: var(--tint-dark-surface, var(--tint-surface, var(--cs-surface)));
192
- --rf-color-text: var(--tint-dark-primary, var(--tint-primary, var(--cs-text)));
193
- --rf-color-muted: var(--tint-dark-secondary, var(--tint-secondary, var(--cs-muted)));
194
- --rf-color-primary: var(--tint-dark-accent, var(--tint-accent, var(--cs-accent)));
236
+ --rf-color-text: var(--tint-dark-text, var(--tint-text, var(--cs-text)));
237
+ --rf-color-muted: var(--tint-dark-muted, var(--tint-muted, var(--cs-muted)));
238
+ --rf-color-primary: var(--tint-dark-primary, var(--tint-primary, var(--cs-accent)));
195
239
  --rf-color-border: var(--tint-dark-border, var(--tint-border, var(--cs-border)));
196
240
  }
197
241
 
198
242
  [data-color-scheme="light"][data-tint] {
199
- --rf-color-bg: var(--tint-background, var(--cs-bg));
243
+ --rf-color-bg: var(--tint-bg, var(--cs-bg));
200
244
  --rf-color-surface: var(--tint-surface, var(--cs-surface));
201
- --rf-color-text: var(--tint-primary, var(--cs-text));
202
- --rf-color-muted: var(--tint-secondary, var(--cs-muted));
203
- --rf-color-primary: var(--tint-accent, var(--cs-accent));
245
+ --rf-color-text: var(--tint-text, var(--cs-text));
246
+ --rf-color-muted: var(--tint-muted, var(--cs-muted));
247
+ --rf-color-primary: var(--tint-primary, var(--cs-accent));
204
248
  --rf-color-border: var(--tint-border, var(--cs-border));
205
249
  }
package/tokens/base.css CHANGED
@@ -1,50 +1,56 @@
1
- /* Lumina Theme — Design Tokens (Light Mode) */
1
+ /* Lumina Theme — Design Tokens (Light Mode)
2
+ *
3
+ * Source of truth: packages/lumina/src/tokens.ts (`luminaTokens` export).
4
+ * This file mirrors that export verbatim — a coverage test in
5
+ * `packages/lumina/test/token-config-coverage.test.ts` keeps them in
6
+ * lockstep; drift fails CI. Edit `tokens.ts` and update both, or run
7
+ * a future build script that regenerates this file. */
2
8
 
3
9
  :root {
4
10
  /* Typography */
5
- --rf-font-sans: 'Outfit', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
6
- --rf-font-mono: 'JetBrains Mono', 'Fira Code', 'Cascadia Code', monospace;
11
+ --rf-font-sans: 'Inter', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
12
+ --rf-font-mono: 'JetBrains Mono', 'Fira Code', ui-monospace, 'Cascadia Code', monospace;
7
13
 
8
- /* Primary scale (ceruleanfrosted blue) */
9
- --rf-color-primary-50: #f0f6f9;
10
- --rf-color-primary-100: #dcebf0;
11
- --rf-color-primary-200: #b8d6e2;
12
- --rf-color-primary-300: #a8dadc;
13
- --rf-color-primary-400: #70b4c0;
14
- --rf-color-primary-500: #457b9d;
15
- --rf-color-primary-600: #376585;
16
- --rf-color-primary-700: #1d3557;
17
- --rf-color-primary-800: #182c4a;
18
- --rf-color-primary-900: #12213a;
19
- --rf-color-primary-950: #0c162a;
14
+ /* Primary scale warm-neutral axis, near-bg near-text */
15
+ --rf-color-primary-50: #fbfaf7;
16
+ --rf-color-primary-100: #f5f4f1;
17
+ --rf-color-primary-200: #ecebe8;
18
+ --rf-color-primary-300: #e2e0dd;
19
+ --rf-color-primary-400: #bfbab2;
20
+ --rf-color-primary-500: #94908a;
21
+ --rf-color-primary-600: #76716a;
22
+ --rf-color-primary-700: #5a564f;
23
+ --rf-color-primary-800: #3a342d;
24
+ --rf-color-primary-900: #2a2622;
25
+ --rf-color-primary-950: #1c1a17;
20
26
 
21
27
  /* Core palette */
22
- --rf-color-text: #1d3557;
23
- --rf-color-muted: #5a7a90;
24
- --rf-color-border: #d8e4de;
25
- --rf-color-bg: #faf5eb;
26
- --rf-color-primary: #457b9d;
27
- --rf-color-primary-hover: #376585;
28
+ --rf-color-text: #1c1a17;
29
+ --rf-color-muted: #6b6661;
30
+ --rf-color-border: #e2e0dd;
31
+ --rf-color-bg: #f5f4f1;
32
+ --rf-color-primary: #1c1a17;
33
+ --rf-color-primary-hover: #3a342d;
28
34
 
29
- /* Surfaces — lighter than background */
30
- --rf-color-surface: #fffbf2;
31
- --rf-color-surface-hover: #fdf0d5;
32
- --rf-color-surface-active: #f9ebcc;
35
+ /* Surfaces */
36
+ --rf-color-surface: #fbfaf7;
37
+ --rf-color-surface-hover: #ecebe8;
38
+ --rf-color-surface-active: #e2e0dd;
33
39
  --rf-color-surface-raised: #ffffff;
34
40
 
35
- /* Semantic */
36
- --rf-color-info: #457b9d;
37
- --rf-color-info-bg: #edf4f8;
38
- --rf-color-info-border: #a8dadc;
39
- --rf-color-warning: #c8900a;
40
- --rf-color-warning-bg: #fdf5e4;
41
- --rf-color-warning-border: #edd49a;
42
- --rf-color-danger: #e63946;
43
- --rf-color-danger-bg: #fdeced;
44
- --rf-color-danger-border: #f0b0b5;
45
- --rf-color-success: #3d8f65;
46
- --rf-color-success-bg: #ecf5ef;
47
- --rf-color-success-border: #a8d4b8;
41
+ /* Semantic — muted earthy band per SPEC-051 */
42
+ --rf-color-info: #34547a;
43
+ --rf-color-info-bg: #e8edf4;
44
+ --rf-color-info-border: #c5d2e0;
45
+ --rf-color-warning: #9c5a18;
46
+ --rf-color-warning-bg: #f5ebd9;
47
+ --rf-color-warning-border: #e0c9a3;
48
+ --rf-color-danger: #a83232;
49
+ --rf-color-danger-bg: #f5e0e0;
50
+ --rf-color-danger-border: #e0b8b8;
51
+ --rf-color-success: #2d6a3e;
52
+ --rf-color-success-bg: #e0eee4;
53
+ --rf-color-success-border: #b8d4be;
48
54
 
49
55
  /* Radii */
50
56
  --rf-radius-sm: 6px;
@@ -79,20 +85,35 @@
79
85
  --rf-shadow-lg: 0 8px 24px rgba(0,0,0,0.08), 0 2px 6px rgba(0,0,0,0.04);
80
86
 
81
87
  /* Code block */
82
- --rf-color-code-bg: #1d3557;
83
- --rf-color-code-text: #f1faee;
84
- --rf-color-inline-code-bg: #f9ebcc;
88
+ --rf-color-code-bg: #ebeae8;
89
+ --rf-color-code-text: #1c1a17;
90
+ --rf-color-code-inline-bg: #e6e5e3;
91
+ /* Legacy alias — same value, kept for downstream CSS that reads the
92
+ * older variable name. Will be removed once the rename is documented
93
+ * widely enough that it's safe to drop. */
94
+ --rf-color-inline-code-bg: #e6e5e3;
85
95
 
86
- /* Syntax highlighting (Shiki CSS variables) */
87
- --shiki-foreground: #f1faee;
88
- --shiki-background: #1d3557;
89
- --shiki-token-keyword: #f2cc8f;
90
- --shiki-token-string: #a8dadc;
91
- --shiki-token-string-expression: #a8dadc;
92
- --shiki-token-constant: #e8c07a;
93
- --shiki-token-comment: #5a7a90;
94
- --shiki-token-function: #70b4c0;
95
- --shiki-token-parameter: #b8d6e2;
96
- --shiki-token-punctuation: #a8dadc;
97
- --shiki-token-link: #70b4c0;
96
+ /* Syntax the quiet spectrum walk */
97
+ --rf-syntax-keyword: #2a5c63;
98
+ --rf-syntax-function: #4a3b6e;
99
+ --rf-syntax-string: #8a3a3a;
100
+ --rf-syntax-constant: #876327;
101
+ --rf-syntax-comment: #8a857d;
102
+ --rf-syntax-punctuation: #6b6661;
103
+ --rf-syntax-variable: #1c1a17;
104
+
105
+ /* Shiki aliases — Shiki's CSS-variables theme emits `--rf-syntax-token-*`
106
+ * with `token-` hardcoded inside its theme builder. We bridge by emitting
107
+ * literal hex values matching the contract surface above. */
108
+ --rf-syntax-foreground: #1c1a17;
109
+ --rf-syntax-background: #ebeae8;
110
+ --rf-syntax-token-keyword: #2a5c63;
111
+ --rf-syntax-token-string: #8a3a3a;
112
+ --rf-syntax-token-string-expression: #8a3a3a;
113
+ --rf-syntax-token-constant: #876327;
114
+ --rf-syntax-token-comment: #8a857d;
115
+ --rf-syntax-token-function: #4a3b6e;
116
+ --rf-syntax-token-parameter: #1c1a17;
117
+ --rf-syntax-token-punctuation: #6b6661;
118
+ --rf-syntax-token-link: #4a3b6e;
98
119
  }
package/tokens/dark.css CHANGED
@@ -1,47 +1,61 @@
1
- /* Lumina Theme — Dark Mode Token Overrides */
1
+ /* Lumina Theme — Dark Mode Token Overrides
2
+ *
3
+ * Source of truth: packages/lumina/src/tokens.ts (`luminaTokens.modes.dark`).
4
+ * This file mirrors that overlay verbatim under both selectors
5
+ * (`[data-theme="dark"]` for user toggles and the `prefers-color-scheme`
6
+ * media query for system preference). A coverage test keeps the two in
7
+ * lockstep; drift fails CI. */
2
8
 
3
9
  [data-theme="dark"] {
4
- --rf-color-text: #f1faee;
5
- --rf-color-muted: #a8dadc;
6
- --rf-color-border: rgba(168, 218, 220, 0.15);
7
- --rf-color-bg: #152238;
8
- --rf-color-primary: #70b4c0;
9
- --rf-color-primary-hover: #a8dadc;
10
+ --rf-color-text: #f6f4ef;
11
+ --rf-color-muted: #94908a;
12
+ --rf-color-border: #2a2825;
13
+ --rf-color-bg: #1a1a17;
14
+ --rf-color-primary: #f6f4ef;
15
+ --rf-color-primary-hover: #d4cfc5;
10
16
 
11
- --rf-color-surface: #1a2940;
12
- --rf-color-surface-hover: #203048;
13
- --rf-color-surface-active: #263850;
14
- --rf-color-surface-raised: #1a2940;
17
+ --rf-color-surface: #211f1c;
18
+ --rf-color-surface-hover: #2a2825;
19
+ --rf-color-surface-active: #353330;
20
+ --rf-color-surface-raised: #292723;
15
21
 
16
- --rf-color-info: #a8dadc;
17
- --rf-color-info-bg: rgba(69, 123, 157, 0.12);
18
- --rf-color-info-border: rgba(69, 123, 157, 0.3);
19
- --rf-color-warning: #e8c07a;
20
- --rf-color-warning-bg: rgba(200, 144, 10, 0.12);
21
- --rf-color-warning-border: rgba(200, 144, 10, 0.3);
22
- --rf-color-danger: #f07078;
23
- --rf-color-danger-bg: rgba(230, 57, 70, 0.12);
24
- --rf-color-danger-border: rgba(230, 57, 70, 0.3);
25
- --rf-color-success: #72c098;
26
- --rf-color-success-bg: rgba(61, 143, 101, 0.12);
27
- --rf-color-success-border: rgba(61, 143, 101, 0.3);
22
+ --rf-color-info: #9bb4c7;
23
+ --rf-color-info-bg: #1f2530;
24
+ --rf-color-info-border: #3d4655;
25
+ --rf-color-warning: #d4a868;
26
+ --rf-color-warning-bg: #2a2519;
27
+ --rf-color-warning-border: #4a3f2a;
28
+ --rf-color-danger: #d48888;
29
+ --rf-color-danger-bg: #2a1818;
30
+ --rf-color-danger-border: #4a2a2a;
31
+ --rf-color-success: #7eb398;
32
+ --rf-color-success-bg: #1a2a1f;
33
+ --rf-color-success-border: #2a4a35;
28
34
 
29
- --rf-color-code-bg: #152238;
30
- --rf-color-code-text: #f1faee;
31
- --rf-color-inline-code-bg: rgba(168, 218, 220, 0.08);
35
+ --rf-color-code-bg: #222220;
36
+ --rf-color-code-text: #f6f4ef;
37
+ --rf-color-code-inline-bg: #2b2b29;
38
+ --rf-color-inline-code-bg: #2b2b29;
32
39
 
33
- /* Syntax highlighting (Shiki CSS variables) */
34
- --shiki-foreground: #f1faee;
35
- --shiki-background: #0c162a;
36
- --shiki-token-keyword: #f2cc8f;
37
- --shiki-token-string: #a8dadc;
38
- --shiki-token-string-expression: #a8dadc;
39
- --shiki-token-constant: #e8c07a;
40
- --shiki-token-comment: #5a7a90;
41
- --shiki-token-function: #a8dadc;
42
- --shiki-token-parameter: #b8d6e2;
43
- --shiki-token-punctuation: #70b4c0;
44
- --shiki-token-link: #a8dadc;
40
+ --rf-syntax-keyword: #7eb6bc;
41
+ --rf-syntax-function: #a89bc7;
42
+ --rf-syntax-string: #c79a9a;
43
+ --rf-syntax-constant: #d4b07e;
44
+ --rf-syntax-comment: #6b6661;
45
+ --rf-syntax-punctuation: #94908a;
46
+ --rf-syntax-variable: #f6f4ef;
47
+
48
+ --rf-syntax-foreground: #f6f4ef;
49
+ --rf-syntax-background: #222220;
50
+ --rf-syntax-token-keyword: #7eb6bc;
51
+ --rf-syntax-token-string: #c79a9a;
52
+ --rf-syntax-token-string-expression: #c79a9a;
53
+ --rf-syntax-token-constant: #d4b07e;
54
+ --rf-syntax-token-comment: #6b6661;
55
+ --rf-syntax-token-function: #a89bc7;
56
+ --rf-syntax-token-parameter: #f6f4ef;
57
+ --rf-syntax-token-punctuation: #94908a;
58
+ --rf-syntax-token-link: #a89bc7;
45
59
 
46
60
  --rf-shadow-xs: 0 1px 2px rgba(0,0,0,0.3);
47
61
  --rf-shadow-sm: 0 1px 3px rgba(0,0,0,0.4), 0 1px 2px rgba(0,0,0,0.3);
@@ -52,47 +66,55 @@
52
66
  /* Auto dark mode via system preference */
53
67
  @media (prefers-color-scheme: dark) {
54
68
  :root:not([data-theme="light"]) {
55
- --rf-color-text: #f1faee;
56
- --rf-color-muted: #a8dadc;
57
- --rf-color-border: rgba(168, 218, 220, 0.15);
58
- --rf-color-bg: #152238;
59
- --rf-color-primary: #70b4c0;
60
- --rf-color-primary-hover: #a8dadc;
69
+ --rf-color-text: #f6f4ef;
70
+ --rf-color-muted: #94908a;
71
+ --rf-color-border: #2a2825;
72
+ --rf-color-bg: #1a1a17;
73
+ --rf-color-primary: #f6f4ef;
74
+ --rf-color-primary-hover: #d4cfc5;
75
+
76
+ --rf-color-surface: #211f1c;
77
+ --rf-color-surface-hover: #2a2825;
78
+ --rf-color-surface-active: #353330;
79
+ --rf-color-surface-raised: #292723;
61
80
 
62
- --rf-color-surface: #1a2940;
63
- --rf-color-surface-hover: #203048;
64
- --rf-color-surface-active: #263850;
65
- --rf-color-surface-raised: #1a2940;
81
+ --rf-color-info: #9bb4c7;
82
+ --rf-color-info-bg: #1f2530;
83
+ --rf-color-info-border: #3d4655;
84
+ --rf-color-warning: #d4a868;
85
+ --rf-color-warning-bg: #2a2519;
86
+ --rf-color-warning-border: #4a3f2a;
87
+ --rf-color-danger: #d48888;
88
+ --rf-color-danger-bg: #2a1818;
89
+ --rf-color-danger-border: #4a2a2a;
90
+ --rf-color-success: #7eb398;
91
+ --rf-color-success-bg: #1a2a1f;
92
+ --rf-color-success-border: #2a4a35;
66
93
 
67
- --rf-color-info: #a8dadc;
68
- --rf-color-info-bg: rgba(69, 123, 157, 0.12);
69
- --rf-color-info-border: rgba(69, 123, 157, 0.3);
70
- --rf-color-warning: #e8c07a;
71
- --rf-color-warning-bg: rgba(200, 144, 10, 0.12);
72
- --rf-color-warning-border: rgba(200, 144, 10, 0.3);
73
- --rf-color-danger: #f07078;
74
- --rf-color-danger-bg: rgba(230, 57, 70, 0.12);
75
- --rf-color-danger-border: rgba(230, 57, 70, 0.3);
76
- --rf-color-success: #72c098;
77
- --rf-color-success-bg: rgba(61, 143, 101, 0.12);
78
- --rf-color-success-border: rgba(61, 143, 101, 0.3);
94
+ --rf-color-code-bg: #222220;
95
+ --rf-color-code-text: #f6f4ef;
96
+ --rf-color-code-inline-bg: #2b2b29;
97
+ --rf-color-inline-code-bg: #2b2b29;
79
98
 
80
- --rf-color-code-bg: #152238;
81
- --rf-color-code-text: #f1faee;
82
- --rf-color-inline-code-bg: rgba(168, 218, 220, 0.08);
99
+ --rf-syntax-keyword: #7eb6bc;
100
+ --rf-syntax-function: #a89bc7;
101
+ --rf-syntax-string: #c79a9a;
102
+ --rf-syntax-constant: #d4b07e;
103
+ --rf-syntax-comment: #6b6661;
104
+ --rf-syntax-punctuation: #94908a;
105
+ --rf-syntax-variable: #f6f4ef;
83
106
 
84
- /* Syntax highlighting (Shiki CSS variables) */
85
- --shiki-foreground: #f1faee;
86
- --shiki-background: #0c162a;
87
- --shiki-token-keyword: #f2cc8f;
88
- --shiki-token-string: #a8dadc;
89
- --shiki-token-string-expression: #a8dadc;
90
- --shiki-token-constant: #e8c07a;
91
- --shiki-token-comment: #5a7a90;
92
- --shiki-token-function: #a8dadc;
93
- --shiki-token-parameter: #b8d6e2;
94
- --shiki-token-punctuation: #70b4c0;
95
- --shiki-token-link: #a8dadc;
107
+ --rf-syntax-foreground: #f6f4ef;
108
+ --rf-syntax-background: #222220;
109
+ --rf-syntax-token-keyword: #7eb6bc;
110
+ --rf-syntax-token-string: #c79a9a;
111
+ --rf-syntax-token-string-expression: #c79a9a;
112
+ --rf-syntax-token-constant: #d4b07e;
113
+ --rf-syntax-token-comment: #6b6661;
114
+ --rf-syntax-token-function: #a89bc7;
115
+ --rf-syntax-token-parameter: #f6f4ef;
116
+ --rf-syntax-token-punctuation: #94908a;
117
+ --rf-syntax-token-link: #a89bc7;
96
118
 
97
119
  --rf-shadow-xs: 0 1px 2px rgba(0,0,0,0.3);
98
120
  --rf-shadow-sm: 0 1px 3px rgba(0,0,0,0.4), 0 1px 2px rgba(0,0,0,0.3);