-
{{ t("cookie policy title") }}
-
- {{ t("cookie policy") }}
-
-
-
-
-
+
+
{{ t("cookie policy title") }}
+
+ {{ t("cookie policy") }}
+
+
+
+
@@ -29,6 +27,7 @@
import { randomInt, random } from "@/utilities/random";
import { shouldShowCookie, acceptCookie, refuseCookie } from "@/utilities/cookie_handler";
import { useI18n } from "vue-i18n";
+ import { addFoundEasterEgg } from "@/utilities/easteregg_handler";
const { t } = useI18n({ messages: {
"en": {
@@ -118,6 +117,7 @@
}
function throwCookie() {
+ addFoundEasterEgg("cookie");
if (!engine) { return; }
// Creates a cookie at the bottom of visible screen
diff --git a/src/components/easteregg-banner/EastereggBanner.vue b/src/components/easteregg-banner/EastereggBanner.vue
new file mode 100644
index 0000000..951f03d
--- /dev/null
+++ b/src/components/easteregg-banner/EastereggBanner.vue
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
{{ found_eastereggs }}/{{ total_eastereggs }} {{ t("easter eggs found") }}
+
{{ t("all easter eggs found") }}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/easteregg-banner/eggs/Cookie.vue b/src/components/easteregg-banner/eggs/Cookie.vue
new file mode 100644
index 0000000..49a9cd1
--- /dev/null
+++ b/src/components/easteregg-banner/eggs/Cookie.vue
@@ -0,0 +1,32 @@
+
+
+
+
+
+
![]()
+
+
+
+
+
{{ t("title") }}
+
{{ t("description") }}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/easteregg-banner/eggs/Future.vue b/src/components/easteregg-banner/eggs/Future.vue
new file mode 100644
index 0000000..5ed37f4
--- /dev/null
+++ b/src/components/easteregg-banner/eggs/Future.vue
@@ -0,0 +1,32 @@
+
+
+
+
+
+
![]()
+
+
+
+
+
{{ t("title") }}
+
{{ t("description") }}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/utilities/easteregg_handler.ts b/src/utilities/easteregg_handler.ts
new file mode 100644
index 0000000..9aeff09
--- /dev/null
+++ b/src/utilities/easteregg_handler.ts
@@ -0,0 +1,28 @@
+const EASTER_EGGS = ["cookie", "future"];
+
+export function addFoundEasterEgg(name:string):void {
+ if (!EASTER_EGGS.includes(name)) { return; }
+
+ let found_eastereggs = new Set( JSON.parse(localStorage.getItem("eastereggs") ?? "[]") );
+ const is_new = !found_eastereggs.has(name);
+
+ found_eastereggs.add(name);
+ localStorage.setItem("eastereggs", JSON.stringify([...found_eastereggs]));
+
+ if (is_new) {
+ // To trigger the banner
+ document.dispatchEvent(new CustomEvent("easteregg", { detail: name }));
+ }
+}
+
+export function getFoundEasterEggs():string[] {
+ return JSON.parse(localStorage.getItem("eastereggs") ?? "[]");
+}
+
+export function getFoundEasterEggsCount():number {
+ return getFoundEasterEggs().length;
+}
+
+export function getTotalEasterEggsCount():number {
+ return EASTER_EGGS.length;
+}
\ No newline at end of file
diff --git a/src/views/resume/ExperienceTimeline.vue b/src/views/resume/ExperienceTimeline.vue
index c9b9166..bb1bed7 100644
--- a/src/views/resume/ExperienceTimeline.vue
+++ b/src/views/resume/ExperienceTimeline.vue
@@ -1,7 +1,7 @@
-
+
addFoundEasterEgg('future')">
@@ -52,6 +52,7 @@
import locale from "./locale.js";
import { initTooltips } from "flowbite";
import { onMounted } from "vue";
+ import { addFoundEasterEgg } from "@/utilities/easteregg_handler";
const timeline_locale = locale;
// @ts-ignore