@zpress/ui 0.3.1 → 0.4.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 (29) hide show
  1. package/dist/index.d.ts +2 -0
  2. package/dist/index.mjs +38 -3
  3. package/dist/theme/components/nav/layout.tsx +4 -4
  4. package/dist/theme/components/nav/theme-switcher.css +92 -0
  5. package/dist/theme/components/nav/theme-switcher.tsx +135 -0
  6. package/dist/theme/components/shared/browser-window.css +61 -0
  7. package/dist/theme/components/shared/browser-window.tsx +35 -0
  8. package/dist/theme/components/theme-provider.tsx +159 -0
  9. package/dist/theme/index.tsx +7 -0
  10. package/dist/theme/styles/overrides/rspress.css +3 -72
  11. package/dist/theme/styles/overrides/tokens.css +3 -34
  12. package/dist/theme/styles/themes/arcade-fx.css +360 -0
  13. package/dist/theme/styles/themes/arcade.css +96 -0
  14. package/dist/theme/styles/themes/base.css +133 -0
  15. package/dist/theme/styles/themes/midnight.css +96 -0
  16. package/package.json +2 -2
  17. package/src/theme/components/nav/layout.tsx +4 -4
  18. package/src/theme/components/nav/theme-switcher.css +92 -0
  19. package/src/theme/components/nav/theme-switcher.tsx +135 -0
  20. package/src/theme/components/shared/browser-window.css +61 -0
  21. package/src/theme/components/shared/browser-window.tsx +35 -0
  22. package/src/theme/components/theme-provider.tsx +159 -0
  23. package/src/theme/index.tsx +7 -0
  24. package/src/theme/styles/overrides/rspress.css +3 -72
  25. package/src/theme/styles/overrides/tokens.css +3 -34
  26. package/src/theme/styles/themes/arcade-fx.css +360 -0
  27. package/src/theme/styles/themes/arcade.css +96 -0
  28. package/src/theme/styles/themes/base.css +133 -0
  29. package/src/theme/styles/themes/midnight.css +96 -0
@@ -1,11 +1,8 @@
1
1
  /**
2
- * zpress custom properties (--zp-* prefix).
2
+ * zpress structural tokens (--zp-* prefix).
3
3
  *
4
- * Palette derived from apps/console globals.css:
5
- * --background : oklch(0.1448 0 0) ≈ #1a1a1a
6
- * --foreground : oklch(0.9851 0 0) ≈ #fbfbfb
7
- * --primary : oklch(0.78 0.13 291) ≈ #a78bfa (purple/violet)
8
- * --border : oklch(0.3407 0 0) ≈ #4a4a4a
4
+ * Color definitions have moved to theme files (styles/themes/*.css).
5
+ * This file retains only structural tokens: fonts, layout, radii.
9
6
  */
10
7
 
11
8
  :root {
@@ -17,32 +14,4 @@
17
14
  --rp-radius: 0.25rem;
18
15
  --rp-radius-small: 0.125rem;
19
16
  --rp-radius-large: 0.5rem;
20
-
21
- --zp-c-brand-1: #a78bfa;
22
- --zp-c-brand-2: #8b5cf6;
23
- --zp-c-brand-3: #7c3aed;
24
- --zp-c-brand-soft: rgba(167, 139, 250, 0.14);
25
-
26
- /* Light-mode surface & text defaults — ensures --zp-c-* variables
27
- resolve even when .rp-dark is not applied. */
28
- --zp-c-bg: #ffffff;
29
- --zp-c-bg-alt: #f9f9f9;
30
- --zp-c-bg-elv: #f5f5f5;
31
- --zp-c-bg-soft: #f0f0f0;
32
- --zp-c-bg-icon: #cccccc;
33
-
34
- --zp-c-text-1: #1a1a1a;
35
- --zp-c-text-2: rgba(26, 26, 26, 0.72);
36
- --zp-c-text-3: rgba(26, 26, 26, 0.48);
37
-
38
- --zp-c-divider: #e2e2e2;
39
- --zp-c-border: #d0d0d0;
40
- --zp-c-gutter: #f5f5f5;
41
-
42
- --zp-code-block-bg: #f5f5f5;
43
-
44
- --zp-button-brand-bg: #7c3aed;
45
- --zp-button-brand-hover-bg: #8b5cf6;
46
- --zp-button-brand-active-bg: #6d28d9;
47
- --zp-button-brand-text: #ffffff;
48
17
  }
@@ -0,0 +1,360 @@
1
+ /**
2
+ * Arcade theme — custom hover animations and visual effects.
3
+ *
4
+ * All rules are scoped to html[data-zp-theme='arcade'] so they
5
+ * only activate when the arcade palette is in use.
6
+ *
7
+ * Effects:
8
+ * 1. Border trace — conic-gradient that spins around cards on hover
9
+ * 2. Neon pulse — expanding glow ring on buttons
10
+ * 3. CRT scanlines — subtle scrolling overlay on code blocks
11
+ * 4. Link glow — neon underline sweep on hover
12
+ * 5. Sidebar + navbar hover — neon underline sweep
13
+ * 6. Sidebar active glow bar
14
+ */
15
+
16
+ /* ── @property for animatable gradient angle ─────────────── */
17
+ @property --arcade-border-angle {
18
+ syntax: '<angle>';
19
+ initial-value: 0deg;
20
+ inherits: false;
21
+ }
22
+
23
+ /* ── 1. Border trace — cards ─────────────────────────────── */
24
+
25
+ /*
26
+ * Uses a conic-gradient as the border-image source.
27
+ * The --arcade-border-angle custom property is animated from
28
+ * 0deg to 360deg, creating a neon light tracing the border.
29
+ *
30
+ * Requires position: relative and overflow: hidden on the card
31
+ * so the ::before pseudo-element stays within bounds.
32
+ */
33
+ html[data-zp-theme='arcade'] .home-card,
34
+ html[data-zp-theme='arcade'] .section-card {
35
+ position: relative;
36
+ overflow: hidden;
37
+ --arcade-border-angle: 0deg;
38
+ }
39
+
40
+ html[data-zp-theme='arcade'] .home-card::before,
41
+ html[data-zp-theme='arcade'] .section-card::before {
42
+ content: '';
43
+ position: absolute;
44
+ inset: 0;
45
+ border-radius: inherit;
46
+ padding: 1px;
47
+ background: conic-gradient(
48
+ from var(--arcade-border-angle),
49
+ transparent 40%,
50
+ #00ff88 50%,
51
+ #00ffcc 55%,
52
+ transparent 60%
53
+ );
54
+ mask:
55
+ linear-gradient(#000 0 0) content-box,
56
+ linear-gradient(#000 0 0);
57
+ -webkit-mask-composite: xor;
58
+ mask-composite: exclude;
59
+ opacity: 0;
60
+ transition: opacity 0.3s;
61
+ pointer-events: none;
62
+ z-index: 1;
63
+ }
64
+
65
+ html[data-zp-theme='arcade'] .home-card:hover::before,
66
+ html[data-zp-theme='arcade'] .section-card:hover::before {
67
+ opacity: 1;
68
+ animation: arcade-border-spin 2.5s linear infinite;
69
+ }
70
+
71
+ /* Glow shadow behind the card on hover */
72
+ html[data-zp-theme='arcade'] .home-card:hover,
73
+ html[data-zp-theme='arcade'] .section-card:hover {
74
+ box-shadow:
75
+ 0 0 12px rgba(0, 255, 136, 0.15),
76
+ 0 0 24px rgba(0, 255, 136, 0.06);
77
+ }
78
+
79
+ @keyframes arcade-border-spin {
80
+ to {
81
+ --arcade-border-angle: 360deg;
82
+ }
83
+ }
84
+
85
+ /* ── 2. Neon pulse — buttons ─────────────────────────────── */
86
+
87
+ /*
88
+ * Replace the default gradient with a solid neon brand color,
89
+ * dark text for contrast, and a subtle border glow on hover.
90
+ */
91
+ html[data-zp-theme='arcade'] .rp-button--brand {
92
+ background: #7c3aed;
93
+ color: #fff;
94
+ border: 1px solid #7c3aed;
95
+ opacity: 1;
96
+ }
97
+
98
+ html[data-zp-theme='arcade'] .rp-button--brand:hover {
99
+ background: transparent;
100
+ color: #a78bfa;
101
+ border-color: #a78bfa;
102
+ opacity: 1;
103
+ box-shadow:
104
+ 0 0 8px rgba(124, 58, 237, 0.5),
105
+ inset 0 0 8px rgba(124, 58, 237, 0.15);
106
+ }
107
+
108
+ /*
109
+ * Alt button — outlined style with neon border.
110
+ */
111
+ html[data-zp-theme='arcade'] .rp-button--alt {
112
+ background: transparent;
113
+ color: var(--zp-c-text-1);
114
+ border: 1px solid var(--zp-c-border);
115
+ }
116
+
117
+ html[data-zp-theme='arcade'] .rp-button--alt:hover {
118
+ border-color: #a78bfa;
119
+ color: #a78bfa;
120
+ opacity: 1;
121
+ background: transparent;
122
+ box-shadow:
123
+ 0 0 8px rgba(124, 58, 237, 0.3),
124
+ inset 0 0 8px rgba(124, 58, 237, 0.06);
125
+ }
126
+
127
+ /*
128
+ * On hover, hero action buttons emit an expanding ring pulse
129
+ * using box-shadow animation. The ring fades out as it expands.
130
+ */
131
+ html[data-zp-theme='arcade'] .rp-button--medium,
132
+ html[data-zp-theme='arcade'] .rp-button--big {
133
+ transition:
134
+ background 0.2s,
135
+ box-shadow 0.2s,
136
+ transform 0.2s;
137
+ }
138
+
139
+ html[data-zp-theme='arcade'] .rp-button--medium:hover,
140
+ html[data-zp-theme='arcade'] .rp-button--big:hover {
141
+ transform: scale(1.03);
142
+ animation: arcade-neon-pulse 1.4s ease-out infinite;
143
+ }
144
+
145
+ @keyframes arcade-neon-pulse {
146
+ 0% {
147
+ box-shadow:
148
+ 0 0 4px rgba(124, 58, 237, 0.6),
149
+ 0 0 0 0 rgba(124, 58, 237, 0.4);
150
+ }
151
+ 70% {
152
+ box-shadow:
153
+ 0 0 8px rgba(124, 58, 237, 0.3),
154
+ 0 0 0 12px rgba(124, 58, 237, 0);
155
+ }
156
+ 100% {
157
+ box-shadow:
158
+ 0 0 4px rgba(124, 58, 237, 0.6),
159
+ 0 0 0 0 rgba(124, 58, 237, 0);
160
+ }
161
+ }
162
+
163
+ /* ── 3. CRT scanlines — code blocks ──────────────────────── */
164
+
165
+ /*
166
+ * A repeating linear-gradient of thin semi-transparent lines
167
+ * scrolls slowly down code blocks, simulating a CRT monitor.
168
+ * pointer-events: none keeps the overlay non-interactive.
169
+ *
170
+ * Rspress wraps code blocks in .rp-codeblock which already
171
+ * has position: relative. The overlay targets .rp-codeblock__content
172
+ * (the inner container with the background color) so it sits
173
+ * above the code but below the title bar and button group.
174
+ */
175
+ html[data-zp-theme='arcade'] .rp-codeblock__content {
176
+ position: relative;
177
+ }
178
+
179
+ html[data-zp-theme='arcade'] .rp-codeblock__content::after {
180
+ content: '';
181
+ position: absolute;
182
+ inset: 0;
183
+ background: repeating-linear-gradient(
184
+ to bottom,
185
+ transparent 0px,
186
+ transparent 3px,
187
+ rgba(0, 255, 136, 0.08) 3px,
188
+ rgba(0, 255, 136, 0.08) 4px
189
+ );
190
+ animation: arcade-scanline 8s linear infinite;
191
+ pointer-events: none;
192
+ z-index: 2;
193
+ opacity: 1;
194
+ transition: opacity 0.3s ease;
195
+ }
196
+
197
+ html[data-zp-theme='arcade'] .rp-codeblock:hover .rp-codeblock__content::after {
198
+ opacity: 0;
199
+ }
200
+
201
+ @keyframes arcade-scanline {
202
+ from {
203
+ background-position: 0 0;
204
+ }
205
+ to {
206
+ background-position: 0 200px;
207
+ }
208
+ }
209
+
210
+ /* ── 4. Link glow — neon underline sweep ─────────────────── */
211
+
212
+ /*
213
+ * Content links get a neon underline that sweeps in from the
214
+ * left on hover, paired with a subtle text-shadow glow.
215
+ *
216
+ * Rspress uses a.rp-link for content links inside .rp-doc.
217
+ * Header anchors use .rp-header-anchor and are excluded.
218
+ */
219
+ html[data-zp-theme='arcade'] .rp-doc a.rp-link:not(.rp-header-anchor) {
220
+ text-decoration: none;
221
+ background-image: linear-gradient(#00ff88, #00ff88);
222
+ background-size: 0% 1.5px;
223
+ background-position: 0 100%;
224
+ background-repeat: no-repeat;
225
+ transition:
226
+ background-size 0.3s ease,
227
+ text-shadow 0.3s ease;
228
+ }
229
+
230
+ html[data-zp-theme='arcade'] .rp-doc a.rp-link:not(.rp-header-anchor):hover {
231
+ background-size: 100% 1.5px;
232
+ border-bottom: none;
233
+ text-shadow:
234
+ 0 0 6px rgba(0, 255, 136, 0.5),
235
+ 0 0 12px rgba(0, 255, 136, 0.2);
236
+ }
237
+
238
+ /* ── 5. Sidebar + navbar link hover — neon underline sweep ── */
239
+
240
+ /*
241
+ * Same sweep effect as doc content links, adapted for
242
+ * sidebar items (.rp-sidebar-item) and navbar menu items
243
+ * (.rp-nav-menu__item). Uses a background-image gradient
244
+ * that expands from 0% to 100% width on hover.
245
+ */
246
+ html[data-zp-theme='arcade'] .rp-sidebar-item {
247
+ text-decoration: none;
248
+ background-image: linear-gradient(#00ff88, #00ff88);
249
+ background-size: 0% 1.5px;
250
+ background-position: 0 100%;
251
+ background-repeat: no-repeat;
252
+ transition:
253
+ color 0.15s,
254
+ background-color 0.15s,
255
+ background-size 0.3s ease,
256
+ text-shadow 0.3s ease;
257
+ }
258
+
259
+ html[data-zp-theme='arcade'] .rp-sidebar-item:hover {
260
+ background-size: 100% 1.5px;
261
+ text-shadow:
262
+ 0 0 6px rgba(0, 255, 136, 0.5),
263
+ 0 0 12px rgba(0, 255, 136, 0.2);
264
+ }
265
+
266
+ html[data-zp-theme='arcade'] .rp-nav-menu__item {
267
+ text-decoration: none;
268
+ background-image: linear-gradient(#00ff88, #00ff88);
269
+ background-size: 0% 1.5px;
270
+ background-position: 0 100%;
271
+ background-repeat: no-repeat;
272
+ transition:
273
+ color 0.25s,
274
+ background-size 0.3s ease,
275
+ text-shadow 0.3s ease;
276
+ }
277
+
278
+ html[data-zp-theme='arcade'] .rp-nav-menu__item:hover {
279
+ background-size: 100% 1.5px;
280
+ text-shadow:
281
+ 0 0 6px rgba(0, 255, 136, 0.5),
282
+ 0 0 12px rgba(0, 255, 136, 0.2);
283
+ }
284
+
285
+ /* ── 6. Sidebar active glow bar ──────────────────────────── */
286
+
287
+ /*
288
+ * The active sidebar item gets a left-border glow that
289
+ * scales in vertically, simulating a neon indicator light.
290
+ *
291
+ * Rspress uses .rp-sidebar-item--active (BEM double hyphen).
292
+ * It already has position: relative. Uses ::after because
293
+ * ::before is used by Rspress for group-item line indicators.
294
+ */
295
+ html[data-zp-theme='arcade'] .rp-sidebar-item--active {
296
+ overflow: visible;
297
+ }
298
+
299
+ html[data-zp-theme='arcade'] .rp-sidebar-item--active::after {
300
+ content: '';
301
+ position: absolute;
302
+ left: 0;
303
+ top: 50%;
304
+ width: 2px;
305
+ height: 0;
306
+ background: #00ff88;
307
+ box-shadow:
308
+ 0 0 4px rgba(0, 255, 136, 0.8),
309
+ 0 0 8px rgba(0, 255, 136, 0.4);
310
+ border-radius: 1px;
311
+ animation: arcade-glow-bar 0.3s ease-out forwards;
312
+ }
313
+
314
+ @keyframes arcade-glow-bar {
315
+ to {
316
+ height: 60%;
317
+ top: 20%;
318
+ }
319
+ }
320
+
321
+ /* ── 7. Search results — readable highlight ────────────── */
322
+
323
+ /*
324
+ * The default search highlight uses --rp-c-brand (#00ff88)
325
+ * as a background, which is too bright for white text.
326
+ * Override to a darker green that maintains the neon feel
327
+ * while ensuring legibility.
328
+ */
329
+ html[data-zp-theme='arcade'] .rp-suggest-item--current .rp-suggest-item__link {
330
+ background-color: #007a42;
331
+ }
332
+
333
+ html[data-zp-theme='arcade'] .rp-suggest-item__mark {
334
+ color: #00ff88;
335
+ }
336
+
337
+ html[data-zp-theme='arcade'] .rp-suggest-item--current .rp-suggest-item__mark {
338
+ color: #fff;
339
+ }
340
+
341
+ /* ── Reduced motion ──────────────────────────────────────── */
342
+
343
+ /*
344
+ * Disable all continuous and hover-triggered animations when
345
+ * the user has opted into reduced motion.
346
+ */
347
+ @media (prefers-reduced-motion: reduce) {
348
+ html[data-zp-theme='arcade'] .home-card:hover::before,
349
+ html[data-zp-theme='arcade'] .section-card:hover::before,
350
+ html[data-zp-theme='arcade'] .rp-codeblock__content::after,
351
+ html[data-zp-theme='arcade'] .rp-sidebar-item--active::after {
352
+ animation: none;
353
+ }
354
+
355
+ html[data-zp-theme='arcade'] .rp-button--medium:hover,
356
+ html[data-zp-theme='arcade'] .rp-button--big:hover {
357
+ animation: none;
358
+ transform: none;
359
+ }
360
+ }
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Arcade theme — retro neon gaming palette.
3
+ *
4
+ * Vibrant neon green/cyan brand with deep indigo backgrounds.
5
+ * High-saturation, high-energy visual style.
6
+ */
7
+
8
+ /* ── Light mode (deep indigo) ────────────────────────────── */
9
+ html[data-zp-theme='arcade'] {
10
+ --zp-c-brand-1: #00ff88;
11
+ --zp-c-brand-2: #00cc6a;
12
+ --zp-c-brand-3: #00aa55;
13
+ --zp-c-brand-soft: rgba(0, 255, 136, 0.14);
14
+
15
+ --zp-c-bg: #0d0d1a;
16
+ --zp-c-bg-alt: #10102a;
17
+ --zp-c-bg-elv: #141433;
18
+ --zp-c-bg-soft: #18183d;
19
+ --zp-c-bg-icon: #2a2a55;
20
+
21
+ --zp-c-text-1: #e0ffe0;
22
+ --zp-c-text-2: rgba(224, 255, 224, 0.72);
23
+ --zp-c-text-3: rgba(224, 255, 224, 0.48);
24
+
25
+ --zp-c-divider: #1a1a40;
26
+ --zp-c-border: #252560;
27
+ --zp-c-gutter: #10102a;
28
+
29
+ --zp-code-block-bg: #10102a;
30
+
31
+ --zp-button-brand-bg: #00aa55;
32
+ --zp-button-brand-hover-bg: #00cc6a;
33
+ --zp-button-brand-active-bg: #008844;
34
+ --zp-button-brand-text: #0d0d1a;
35
+
36
+ --rp-c-brand: #00ff88;
37
+ --rp-c-brand-light: #66ffbb;
38
+ --rp-c-brand-lighter: #99ffcc;
39
+ --rp-c-brand-dark: #00cc6a;
40
+ --rp-c-brand-darker: #00aa55;
41
+ --rp-c-brand-tint: rgba(0, 255, 136, 0.14);
42
+
43
+ --rp-c-bg: #0d0d1a;
44
+ --rp-c-bg-soft: #18183d;
45
+ --rp-c-bg-mute: #141433;
46
+
47
+ --rp-c-text-1: #e0ffe0;
48
+ --rp-c-text-2: rgba(224, 255, 224, 0.72);
49
+ --rp-c-text-3: rgba(224, 255, 224, 0.48);
50
+
51
+ --rp-c-divider: #1a1a40;
52
+ --rp-c-link: var(--rp-c-brand-light);
53
+
54
+ --rp-code-block-bg: #10102a;
55
+
56
+ --rp-home-background-bg: #0d0d1a;
57
+ }
58
+
59
+ /* ── Dark mode (deeper indigo) ───────────────────────────── */
60
+ html[data-zp-theme='arcade'].rp-dark {
61
+ --zp-c-bg: #080812;
62
+ --zp-c-bg-alt: #0a0a1a;
63
+ --zp-c-bg-elv: #0d0d22;
64
+ --zp-c-bg-soft: #10102a;
65
+ --zp-c-bg-icon: #222250;
66
+
67
+ --zp-c-text-1: #f0fff0;
68
+ --zp-c-text-2: rgba(240, 255, 240, 0.72);
69
+ --zp-c-text-3: rgba(240, 255, 240, 0.48);
70
+
71
+ --zp-c-divider: #141430;
72
+ --zp-c-border: #1e1e50;
73
+ --zp-c-gutter: #0a0a1a;
74
+
75
+ --zp-code-block-bg: #0a0a1a;
76
+
77
+ --zp-button-brand-bg: #00aa55;
78
+ --zp-button-brand-hover-bg: #00cc6a;
79
+ --zp-button-brand-active-bg: #008844;
80
+ --zp-button-brand-text: #080812;
81
+
82
+ --rp-c-bg: #080812;
83
+ --rp-c-bg-soft: #10102a;
84
+ --rp-c-bg-mute: #0d0d22;
85
+
86
+ --rp-c-text-1: #f0fff0;
87
+ --rp-c-text-2: rgba(240, 255, 240, 0.72);
88
+ --rp-c-text-3: rgba(240, 255, 240, 0.48);
89
+
90
+ --rp-c-divider: #141430;
91
+ --rp-c-link: var(--rp-c-brand-light);
92
+
93
+ --rp-code-block-bg: #0a0a1a;
94
+
95
+ --rp-home-background-bg: #080812;
96
+ }
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Base theme — purple/violet palette.
3
+ *
4
+ * Default zpress theme. `:root` fallback block prevents FOUC
5
+ * by providing colors before ThemeProvider sets [data-zp-theme].
6
+ */
7
+
8
+ /* ── FOUC fallback — loads before JS hydration ───────────── */
9
+ :root {
10
+ --zp-c-brand-1: #a78bfa;
11
+ --zp-c-brand-2: #8b5cf6;
12
+ --zp-c-brand-3: #7c3aed;
13
+ --zp-c-brand-soft: rgba(167, 139, 250, 0.14);
14
+
15
+ --zp-c-bg: #ffffff;
16
+ --zp-c-bg-alt: #f9f9f9;
17
+ --zp-c-bg-elv: #f5f5f5;
18
+ --zp-c-bg-soft: #f0f0f0;
19
+ --zp-c-bg-icon: #cccccc;
20
+
21
+ --zp-c-text-1: #1a1a1a;
22
+ --zp-c-text-2: rgba(26, 26, 26, 0.72);
23
+ --zp-c-text-3: rgba(26, 26, 26, 0.48);
24
+
25
+ --zp-c-divider: #e2e2e2;
26
+ --zp-c-border: #d0d0d0;
27
+ --zp-c-gutter: #f5f5f5;
28
+
29
+ --zp-code-block-bg: #f5f5f5;
30
+
31
+ --zp-button-brand-bg: #7c3aed;
32
+ --zp-button-brand-hover-bg: #8b5cf6;
33
+ --zp-button-brand-active-bg: #6d28d9;
34
+ --zp-button-brand-text: #ffffff;
35
+
36
+ --rp-c-brand: #a78bfa;
37
+ --rp-c-brand-light: #c4b5fd;
38
+ --rp-c-brand-lighter: #ddd6fe;
39
+ --rp-c-brand-dark: #8b5cf6;
40
+ --rp-c-brand-darker: #7c3aed;
41
+ --rp-c-brand-tint: rgba(167, 139, 250, 0.14);
42
+
43
+ --rp-home-background-bg: #fff;
44
+ }
45
+
46
+ /* ── Light mode ──────────────────────────────────────────── */
47
+ html[data-zp-theme='base'] {
48
+ --zp-c-brand-1: #a78bfa;
49
+ --zp-c-brand-2: #8b5cf6;
50
+ --zp-c-brand-3: #7c3aed;
51
+ --zp-c-brand-soft: rgba(167, 139, 250, 0.14);
52
+
53
+ --zp-c-bg: #ffffff;
54
+ --zp-c-bg-alt: #f9f9f9;
55
+ --zp-c-bg-elv: #f5f5f5;
56
+ --zp-c-bg-soft: #f0f0f0;
57
+ --zp-c-bg-icon: #cccccc;
58
+
59
+ --zp-c-text-1: #1a1a1a;
60
+ --zp-c-text-2: rgba(26, 26, 26, 0.72);
61
+ --zp-c-text-3: rgba(26, 26, 26, 0.48);
62
+
63
+ --zp-c-divider: #e2e2e2;
64
+ --zp-c-border: #d0d0d0;
65
+ --zp-c-gutter: #f5f5f5;
66
+
67
+ --zp-code-block-bg: #f5f5f5;
68
+
69
+ --zp-button-brand-bg: #7c3aed;
70
+ --zp-button-brand-hover-bg: #8b5cf6;
71
+ --zp-button-brand-active-bg: #6d28d9;
72
+ --zp-button-brand-text: #ffffff;
73
+
74
+ --rp-c-brand: #a78bfa;
75
+ --rp-c-brand-light: #c4b5fd;
76
+ --rp-c-brand-lighter: #ddd6fe;
77
+ --rp-c-brand-dark: #8b5cf6;
78
+ --rp-c-brand-darker: #7c3aed;
79
+ --rp-c-brand-tint: rgba(167, 139, 250, 0.14);
80
+
81
+ --rp-home-background-bg: #fff;
82
+ }
83
+
84
+ /* ── Dark mode ───────────────────────────────────────────── */
85
+ html[data-zp-theme='base'].rp-dark {
86
+ --zp-c-bg: #141414;
87
+ --zp-c-bg-alt: #1a1a1a;
88
+ --zp-c-bg-elv: #1f1f1f;
89
+ --zp-c-bg-soft: #222222;
90
+ --zp-c-bg-icon: #3d3d3d;
91
+
92
+ --zp-c-text-1: #fbfbfb;
93
+ --zp-c-text-2: rgba(251, 251, 251, 0.72);
94
+ --zp-c-text-3: rgba(251, 251, 251, 0.48);
95
+
96
+ --zp-c-divider: #2e2e2e;
97
+ --zp-c-border: #3a3a3a;
98
+ --zp-c-gutter: #1a1a1a;
99
+
100
+ --zp-c-brand-1: #a78bfa;
101
+ --zp-c-brand-2: #8b5cf6;
102
+ --zp-c-brand-3: #7c3aed;
103
+ --zp-c-brand-soft: rgba(167, 139, 250, 0.14);
104
+
105
+ --zp-code-block-bg: #1a1a1a;
106
+
107
+ --zp-button-brand-bg: #7c3aed;
108
+ --zp-button-brand-hover-bg: #8b5cf6;
109
+ --zp-button-brand-active-bg: #6d28d9;
110
+ --zp-button-brand-text: #fbfbfb;
111
+
112
+ --rp-c-bg: #141414;
113
+ --rp-c-bg-soft: #222222;
114
+ --rp-c-bg-mute: #1f1f1f;
115
+
116
+ --rp-c-text-1: #fbfbfb;
117
+ --rp-c-text-2: rgba(251, 251, 251, 0.72);
118
+ --rp-c-text-3: rgba(251, 251, 251, 0.48);
119
+
120
+ --rp-c-divider: #2e2e2e;
121
+
122
+ --rp-c-brand: #a78bfa;
123
+ --rp-c-brand-light: #c4b5fd;
124
+ --rp-c-brand-lighter: #ddd6fe;
125
+ --rp-c-brand-dark: #8b5cf6;
126
+ --rp-c-brand-darker: #7c3aed;
127
+ --rp-c-brand-tint: rgba(167, 139, 250, 0.14);
128
+ --rp-c-link: var(--rp-c-brand-light);
129
+
130
+ --rp-code-block-bg: #1a1a1a;
131
+
132
+ --rp-home-background-bg: #141414;
133
+ }