@zpress/ui 0.3.0 → 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.
- package/dist/index.d.ts +3 -0
- package/dist/index.mjs +45 -4
- package/dist/theme/components/nav/layout.tsx +4 -4
- package/dist/theme/components/nav/theme-switcher.css +92 -0
- package/dist/theme/components/nav/theme-switcher.tsx +135 -0
- package/dist/theme/components/shared/browser-window.css +61 -0
- package/dist/theme/components/shared/browser-window.tsx +35 -0
- package/dist/theme/components/theme-provider.tsx +159 -0
- package/dist/theme/index.tsx +7 -0
- package/dist/theme/styles/overrides/rspress.css +3 -72
- package/dist/theme/styles/overrides/tokens.css +3 -34
- package/dist/theme/styles/themes/arcade-fx.css +360 -0
- package/dist/theme/styles/themes/arcade.css +96 -0
- package/dist/theme/styles/themes/base.css +133 -0
- package/dist/theme/styles/themes/midnight.css +96 -0
- package/package.json +2 -2
- package/src/theme/components/nav/layout.tsx +4 -4
- package/src/theme/components/nav/theme-switcher.css +92 -0
- package/src/theme/components/nav/theme-switcher.tsx +135 -0
- package/src/theme/components/shared/browser-window.css +61 -0
- package/src/theme/components/shared/browser-window.tsx +35 -0
- package/src/theme/components/theme-provider.tsx +159 -0
- package/src/theme/index.tsx +7 -0
- package/src/theme/styles/overrides/rspress.css +3 -72
- package/src/theme/styles/overrides/tokens.css +3 -34
- package/src/theme/styles/themes/arcade-fx.css +360 -0
- package/src/theme/styles/themes/arcade.css +96 -0
- package/src/theme/styles/themes/base.css +133 -0
- package/src/theme/styles/themes/midnight.css +96 -0
|
@@ -1,25 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Rspress
|
|
2
|
+
* Rspress structural overrides.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Color definitions have moved to theme files (styles/themes/*.css).
|
|
5
|
+
* This file retains only structural overrides: fonts, layout, LLMs UI.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
html:root {
|
|
9
9
|
/* Fonts — map Geist into Rspress's font stack */
|
|
10
10
|
--rp-font-family-base: 'Geist Pixel Square', ui-sans-serif, system-ui, sans-serif;
|
|
11
11
|
--rp-font-family-mono: 'Geist Mono', ui-monospace, 'SFMono-Regular', monospace;
|
|
12
|
-
|
|
13
|
-
/* Brand colors */
|
|
14
|
-
--rp-c-brand: #a78bfa;
|
|
15
|
-
--rp-c-brand-light: #c4b5fd;
|
|
16
|
-
--rp-c-brand-lighter: #ddd6fe;
|
|
17
|
-
--rp-c-brand-dark: #8b5cf6;
|
|
18
|
-
--rp-c-brand-darker: #7c3aed;
|
|
19
|
-
--rp-c-brand-tint: rgba(167, 139, 250, 0.14);
|
|
20
|
-
|
|
21
|
-
/* Solid home background — overrides Rspress default radial gradients */
|
|
22
|
-
--rp-home-background-bg: #fff;
|
|
23
12
|
}
|
|
24
13
|
|
|
25
14
|
/* ── LLMs UI — hide the view-options trigger button (dropdown arrow) ── */
|
|
@@ -48,61 +37,3 @@ html table {
|
|
|
48
37
|
border-radius: var(--rp-radius);
|
|
49
38
|
overflow: hidden;
|
|
50
39
|
}
|
|
51
|
-
|
|
52
|
-
/* ── Dark-mode overrides (zpress custom vars) ─────────────── */
|
|
53
|
-
.rp-dark,
|
|
54
|
-
html[data-dark='true'] {
|
|
55
|
-
--zp-c-bg: #141414;
|
|
56
|
-
--zp-c-bg-alt: #1a1a1a;
|
|
57
|
-
--zp-c-bg-elv: #1f1f1f;
|
|
58
|
-
--zp-c-bg-soft: #222222;
|
|
59
|
-
--zp-c-bg-icon: #3d3d3d;
|
|
60
|
-
|
|
61
|
-
--zp-c-text-1: #fbfbfb;
|
|
62
|
-
--zp-c-text-2: rgba(251, 251, 251, 0.72);
|
|
63
|
-
--zp-c-text-3: rgba(251, 251, 251, 0.48);
|
|
64
|
-
|
|
65
|
-
--zp-c-divider: #2e2e2e;
|
|
66
|
-
--zp-c-border: #3a3a3a;
|
|
67
|
-
--zp-c-gutter: #1a1a1a;
|
|
68
|
-
|
|
69
|
-
--zp-c-brand-1: #a78bfa;
|
|
70
|
-
--zp-c-brand-2: #8b5cf6;
|
|
71
|
-
--zp-c-brand-3: #7c3aed;
|
|
72
|
-
--zp-c-brand-soft: rgba(167, 139, 250, 0.14);
|
|
73
|
-
|
|
74
|
-
--zp-code-block-bg: #1a1a1a;
|
|
75
|
-
|
|
76
|
-
--zp-button-brand-bg: #7c3aed;
|
|
77
|
-
--zp-button-brand-hover-bg: #8b5cf6;
|
|
78
|
-
--zp-button-brand-active-bg: #6d28d9;
|
|
79
|
-
--zp-button-brand-text: #fbfbfb;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/* ── Dark-mode overrides (Rspress vars) ──────────────────────
|
|
83
|
-
* html.rp-dark bumps specificity (0,1,1) above Rspress vars.css
|
|
84
|
-
* .rp-dark (0,1,0) so these always win regardless of load order. */
|
|
85
|
-
html.rp-dark {
|
|
86
|
-
--rp-c-bg: #141414;
|
|
87
|
-
--rp-c-bg-soft: #222222;
|
|
88
|
-
--rp-c-bg-mute: #1f1f1f;
|
|
89
|
-
|
|
90
|
-
--rp-c-text-1: #fbfbfb;
|
|
91
|
-
--rp-c-text-2: rgba(251, 251, 251, 0.72);
|
|
92
|
-
--rp-c-text-3: rgba(251, 251, 251, 0.48);
|
|
93
|
-
|
|
94
|
-
--rp-c-divider: #2e2e2e;
|
|
95
|
-
|
|
96
|
-
--rp-c-brand: #a78bfa;
|
|
97
|
-
--rp-c-brand-light: #c4b5fd;
|
|
98
|
-
--rp-c-brand-lighter: #ddd6fe;
|
|
99
|
-
--rp-c-brand-dark: #8b5cf6;
|
|
100
|
-
--rp-c-brand-darker: #7c3aed;
|
|
101
|
-
--rp-c-brand-tint: rgba(167, 139, 250, 0.14);
|
|
102
|
-
--rp-c-link: var(--rp-c-brand-light);
|
|
103
|
-
|
|
104
|
-
--rp-code-block-bg: #1a1a1a;
|
|
105
|
-
|
|
106
|
-
/* Solid home background — overrides Rspress default radial gradients */
|
|
107
|
-
--rp-home-background-bg: #141414;
|
|
108
|
-
}
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* zpress
|
|
2
|
+
* zpress structural tokens (--zp-* prefix).
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
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
|
+
}
|