aboutsummaryrefslogtreecommitdiff
path: root/themes/hugo-theme-stack/assets/ts/color.ts
diff options
context:
space:
mode:
authorAlexander Neonxp Kiryukhin <i@neonxp.ru>2024-11-03 20:08:36 +0300
committerAlexander Neonxp Kiryukhin <i@neonxp.ru>2024-11-03 20:08:36 +0300
commit59c7d4567380d1a9c80e96eb958fdbdd512ce006 (patch)
tree65410cfc10dbc7d060ec23be110662d9b7f6b0e9 /themes/hugo-theme-stack/assets/ts/color.ts
новая жизнь блога
Diffstat (limited to 'themes/hugo-theme-stack/assets/ts/color.ts')
-rw-r--r--themes/hugo-theme-stack/assets/ts/color.ts63
1 files changed, 63 insertions, 0 deletions
diff --git a/themes/hugo-theme-stack/assets/ts/color.ts b/themes/hugo-theme-stack/assets/ts/color.ts
new file mode 100644
index 0000000..50581d1
--- /dev/null
+++ b/themes/hugo-theme-stack/assets/ts/color.ts
@@ -0,0 +1,63 @@
+interface colorScheme {
+ hash: string, /// Regenerate color scheme when the image hash is changed
+ DarkMuted: {
+ hex: string,
+ rgb: Number[],
+ bodyTextColor: string
+ },
+ Vibrant: {
+ hex: string,
+ rgb: Number[],
+ bodyTextColor: string
+ }
+}
+
+let colorsCache: { [key: string]: colorScheme } = {};
+
+if (localStorage.hasOwnProperty('StackColorsCache')) {
+ try {
+ colorsCache = JSON.parse(localStorage.getItem('StackColorsCache'));
+ }
+ catch (e) {
+ colorsCache = {};
+ }
+}
+
+async function getColor(key: string, hash: string, imageURL: string) {
+ if (!key) {
+ /**
+ * If no key is provided, do not cache the result
+ */
+ return await Vibrant.from(imageURL).getPalette();
+ }
+
+ if (!colorsCache.hasOwnProperty(key) || colorsCache[key].hash !== hash) {
+ /**
+ * If key is provided, but not found in cache, or the hash mismatches => Regenerate color scheme
+ */
+ const palette = await Vibrant.from(imageURL).getPalette();
+
+ colorsCache[key] = {
+ hash: hash,
+ Vibrant: {
+ hex: palette.Vibrant.hex,
+ rgb: palette.Vibrant.rgb,
+ bodyTextColor: palette.Vibrant.bodyTextColor
+ },
+ DarkMuted: {
+ hex: palette.DarkMuted.hex,
+ rgb: palette.DarkMuted.rgb,
+ bodyTextColor: palette.DarkMuted.bodyTextColor
+ }
+ }
+
+ /* Save the result in localStorage */
+ localStorage.setItem('StackColorsCache', JSON.stringify(colorsCache));
+ }
+
+ return colorsCache[key];
+}
+
+export {
+ getColor
+} \ No newline at end of file