tangled
alpha
login
or
join now
finxol.io
/
portfolio
0
fork
atom
Personal site
staging.colinozanne.co.uk
portfolio
astro
0
fork
atom
overview
issues
pulls
pipelines
feat: add random theme button
finxol.io
2 months ago
8bc2dd57
c5772ebf
verified
This commit was signed with the committer's
known signature
.
finxol.io
SSH Key Fingerprint:
SHA256:olFE3asYdoBMScuJOt60UxXdJ0RFdGv5kVKrdOtIcPI=
1/1
deploy.yaml
success
9s
+161
-9
1 changed file
expand all
collapse all
unified
split
src
components
customise.astro
+161
-9
src/components/customise.astro
reviewed
···
80
80
) as HTMLDialogElement;
81
81
const lightButton = document.getElementById("light-button")!;
82
82
const darkButton = document.getElementById("dark-button")!;
83
83
+
const randomButton = document.getElementById("random-button")!;
83
84
84
85
// Open dialog
85
86
trigger.addEventListener("click", () => {
···
97
98
98
99
lightButton.addEventListener("click", () => {
99
100
store.theme = "light";
101
101
+
clearRandomColors();
100
102
});
101
103
102
104
darkButton.addEventListener("click", () => {
103
105
store.theme = "dark";
106
106
+
clearRandomColors();
104
107
});
105
108
106
106
-
window.onload = () => {
107
107
-
// to trigger the theme change
108
108
-
store.theme;
109
109
-
};
110
110
-
111
109
const colours = [
112
110
"amber",
113
111
"yellow",
···
118
116
"indigo",
119
117
"fuchsia",
120
118
"rose",
121
121
-
"gray",
122
122
-
"sand",
123
119
];
120
120
+
121
121
+
function pickRandomColors(): [string, string, string] {
122
122
+
const shuffled = [...colours].sort(() => Math.random() - 0.5);
123
123
+
return [shuffled[0], shuffled[1], shuffled[2]];
124
124
+
}
125
125
+
126
126
+
function applyRandomColors(
127
127
+
primary: string,
128
128
+
secondary: string,
129
129
+
accent: string,
130
130
+
) {
131
131
+
const root = document.documentElement;
132
132
+
const isDark = store.theme === "dark";
133
133
+
const level = isDark ? "500" : "400";
134
134
+
const textLevel = "950";
135
135
+
const mutedLevel = isDark ? "600" : "300";
136
136
+
const bgLevel = isDark ? "900" : "100";
137
137
+
138
138
+
// Primary colors
139
139
+
root.style.setProperty("--primary", `var(--${primary}-${level})`);
140
140
+
root.style.setProperty(
141
141
+
"--primary-text",
142
142
+
`var(--${primary}-${textLevel})`,
143
143
+
);
144
144
+
root.style.setProperty(
145
145
+
"--primary-muted",
146
146
+
`var(--${primary}-${mutedLevel})`,
147
147
+
);
148
148
+
149
149
+
// Secondary colors
150
150
+
root.style.setProperty("--secondary", `var(--${secondary}-${level})`);
151
151
+
root.style.setProperty(
152
152
+
"--secondary-text",
153
153
+
`var(--${secondary}-${textLevel})`,
154
154
+
);
155
155
+
156
156
+
// Accent colors
157
157
+
root.style.setProperty("--accent", `var(--${accent}-${level})`);
158
158
+
root.style.setProperty(
159
159
+
"--accent-text",
160
160
+
`var(--${accent}-${textLevel})`,
161
161
+
);
162
162
+
163
163
+
// Link colors (use accent)
164
164
+
root.style.setProperty("--link", `var(--${accent}-${level})`);
165
165
+
root.style.setProperty("--link-text", `var(--${accent}-${textLevel})`);
166
166
+
167
167
+
// Background and foreground
168
168
+
root.style.setProperty("--background", `var(--${primary}-${bgLevel})`);
169
169
+
root.style.setProperty(
170
170
+
"--foreground",
171
171
+
`var(--${primary}-${isDark ? "100" : "950"})`,
172
172
+
);
173
173
+
174
174
+
// Name color
175
175
+
root.style.setProperty(
176
176
+
"--name-color",
177
177
+
`var(--${primary}-${isDark ? "800" : "500"})`,
178
178
+
);
179
179
+
root.style.setProperty(
180
180
+
"--name-color-text",
181
181
+
`var(--${primary}-${isDark ? "100" : "950"})`,
182
182
+
);
183
183
+
184
184
+
// Lang switcher
185
185
+
root.style.setProperty(
186
186
+
"--lang-bg",
187
187
+
`var(--${primary}-${isDark ? "900" : "100"})`,
188
188
+
);
189
189
+
root.style.setProperty(
190
190
+
"--lang",
191
191
+
`var(--${primary}-${isDark ? "800" : "200"})`,
192
192
+
);
193
193
+
root.style.setProperty(
194
194
+
"--lang-hover",
195
195
+
`var(--${primary}-${isDark ? "700" : "300"})`,
196
196
+
);
197
197
+
root.style.setProperty(
198
198
+
"--lang-active",
199
199
+
`var(--${primary}-${isDark ? "600" : "400"})`,
200
200
+
);
201
201
+
root.style.setProperty(
202
202
+
"--lang-active-text",
203
203
+
`var(--${primary}-${textLevel})`,
204
204
+
);
205
205
+
root.style.setProperty(
206
206
+
"--lang-text",
207
207
+
`var(--${primary}-${isDark ? "200" : "800"})`,
208
208
+
);
209
209
+
210
210
+
// Containers
211
211
+
root.style.setProperty(
212
212
+
"--intro-container",
213
213
+
`var(--${secondary}-${level})`,
214
214
+
);
215
215
+
root.style.setProperty("--blog-container", `var(--${accent}-${level})`);
216
216
+
217
217
+
// Project colors
218
218
+
root.style.setProperty("--project-1", `var(--${secondary}-${level})`);
219
219
+
root.style.setProperty(
220
220
+
"--project-1-text",
221
221
+
`var(--${secondary}-${textLevel})`,
222
222
+
);
223
223
+
root.style.setProperty("--project-2", `var(--${primary}-${level})`);
224
224
+
root.style.setProperty(
225
225
+
"--project-2-text",
226
226
+
`var(--${primary}-${textLevel})`,
227
227
+
);
228
228
+
root.style.setProperty("--project-3", `var(--${accent}-${level})`);
229
229
+
root.style.setProperty(
230
230
+
"--project-3-text",
231
231
+
`var(--${accent}-${textLevel})`,
232
232
+
);
233
233
+
234
234
+
// Store the colors
235
235
+
localStorage.setItem(
236
236
+
"randomColors",
237
237
+
JSON.stringify([primary, secondary, accent]),
238
238
+
);
239
239
+
}
240
240
+
241
241
+
function clearRandomColors() {
242
242
+
const styles = document.documentElement.style;
243
243
+
// remove all custom properties from html element
244
244
+
for (let i = styles.length - 1; i >= 0; i--) {
245
245
+
const prop = styles[i];
246
246
+
if (prop.startsWith("--")) {
247
247
+
document.documentElement.style.removeProperty(prop);
248
248
+
}
249
249
+
}
250
250
+
localStorage.removeItem("randomColors");
251
251
+
}
252
252
+
253
253
+
randomButton.addEventListener("click", () => {
254
254
+
applyRandomColors(...pickRandomColors());
255
255
+
});
256
256
+
257
257
+
// Restore random colors on load if they exist
258
258
+
window.onload = () => {
259
259
+
// Trigger theme initialization
260
260
+
store.theme;
261
261
+
262
262
+
// Restore random colors if saved
263
263
+
const saved = localStorage.getItem("randomColors");
264
264
+
if (saved) {
265
265
+
try {
266
266
+
const [primary, secondary, accent] = JSON.parse(saved);
267
267
+
applyRandomColors(primary, secondary, accent);
268
268
+
} catch {
269
269
+
localStorage.removeItem("randomColors");
270
270
+
}
271
271
+
}
272
272
+
};
124
273
</script>
125
274
126
275
<style>
···
293
442
294
443
&:hover svg {
295
444
animation: wiggle 0.4s ease;
445
445
+
transform: rotate(-5deg);
296
446
}
297
447
298
448
&#random-button {
···
305
455
}
306
456
307
457
@keyframes wiggle {
308
308
-
0%,
309
309
-
100% {
458
458
+
0% {
310
459
transform: rotate(0deg);
311
460
}
312
461
25% {
···
314
463
}
315
464
75% {
316
465
transform: rotate(15deg);
466
466
+
}
467
467
+
100% {
468
468
+
transform: rotate(-5deg);
317
469
}
318
470
}
319
471
</style>