105 lines
3.0 KiB
JavaScript
105 lines
3.0 KiB
JavaScript
(function () {
|
|
const root = document.documentElement;
|
|
const toggleButton = document.getElementById("theme-toggle");
|
|
const toggleIcon = toggleButton ? toggleButton.querySelector("i") : null;
|
|
|
|
const storage = {
|
|
get(key) {
|
|
try {
|
|
return window.localStorage.getItem(key);
|
|
} catch (error) {
|
|
return null;
|
|
}
|
|
},
|
|
set(key, value) {
|
|
try {
|
|
window.localStorage.setItem(key, value);
|
|
} catch (error) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
};
|
|
|
|
const setTheme = (theme) => {
|
|
const isDark = theme === "dark";
|
|
|
|
if (isDark) {
|
|
root.setAttribute("data-theme", "dark");
|
|
} else {
|
|
root.removeAttribute("data-theme");
|
|
}
|
|
|
|
if (toggleIcon) {
|
|
toggleIcon.classList.toggle("fa-sun", isDark);
|
|
toggleIcon.classList.toggle("fa-moon", !isDark);
|
|
}
|
|
|
|
if (toggleButton) {
|
|
toggleButton.setAttribute("aria-pressed", String(isDark));
|
|
toggleButton.title = isDark ? "Switch to light theme" : "Switch to dark theme";
|
|
}
|
|
};
|
|
|
|
const savedTheme = storage.get("theme") || "light";
|
|
setTheme(savedTheme);
|
|
|
|
if (toggleButton) {
|
|
toggleButton.addEventListener("click", () => {
|
|
const nextTheme = root.hasAttribute("data-theme") ? "light" : "dark";
|
|
setTheme(nextTheme);
|
|
storage.set("theme", nextTheme);
|
|
});
|
|
}
|
|
|
|
const printButton = document.getElementById("print-resume");
|
|
if (printButton) {
|
|
printButton.addEventListener("click", () => window.print());
|
|
}
|
|
|
|
const contactKey = 43;
|
|
const contactValues = {
|
|
email: [65, 74, 88, 68, 69, 78, 94, 76, 78, 69, 78, 76, 74, 89, 89, 66, 88, 68, 69, 107, 66, 72, 71, 68, 94, 79, 5, 72, 68, 70],
|
|
ky: [3, 25, 28, 27, 2, 11, 19, 19, 18, 6, 19, 27, 28, 25],
|
|
tn: [3, 19, 29, 30, 2, 11, 18, 19, 30, 6, 26, 29, 31, 26]
|
|
};
|
|
|
|
const revealContact = (contactType) => {
|
|
const encoded = contactValues[contactType];
|
|
|
|
if (!encoded) {
|
|
return "";
|
|
}
|
|
|
|
return encoded.map((code) => String.fromCharCode(code ^ contactKey)).join("");
|
|
};
|
|
|
|
const revealButtonContact = (button) => {
|
|
const contactType = button.dataset.contact;
|
|
const value = revealContact(contactType);
|
|
|
|
if (!value) {
|
|
return;
|
|
}
|
|
|
|
const href = contactType === "email"
|
|
? `mailto:${value}`
|
|
: `tel:${value.replace(/\D/g, "")}`;
|
|
|
|
const link = document.createElement("a");
|
|
link.href = href;
|
|
link.rel = "nofollow";
|
|
link.textContent = value;
|
|
button.replaceWith(link);
|
|
};
|
|
|
|
document.querySelectorAll("[data-contact]").forEach((button) => {
|
|
button.addEventListener("click", () => revealButtonContact(button));
|
|
});
|
|
|
|
window.addEventListener("beforeprint", () => {
|
|
document.querySelectorAll("[data-contact]").forEach(revealButtonContact);
|
|
});
|
|
})();
|