Files
TD_Portfolio/script.js
T
Tomas DvorakandDevin 8dd7d1f9ef Redesign to Vercel style, sync content with GitHub/LinkedIn
Monochrome Geist-based design replaces Material Design 3. Content
updated to current roles (MyBox/ELEXIM DevOps, Výdoz, Vibly),
corrected dates (P+P, ZEUS ended 2025), fixed GitHub/LinkedIn/X
handles, new project screenshots.

Authored By: TDvorak <[email protected]>

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-20 11:23:16 +02:00

42 lines
1.4 KiB
JavaScript

"use strict";
// Theme: persisted in sessionStorage, dark default.
const root = document.documentElement;
root.dataset.theme = sessionStorage.getItem("theme") || "dark";
document.querySelector("[data-theme-btn]")?.addEventListener("click", () => {
root.dataset.theme = root.dataset.theme === "dark" ? "light" : "dark";
sessionStorage.setItem("theme", root.dataset.theme);
});
// Footer year
document.getElementById("year").textContent = new Date().getFullYear();
// Contact form -> sendmail.tdvorak.dev
const form = document.getElementById("contact-form");
const status = document.getElementById("form-status");
form?.addEventListener("submit", async (e) => {
e.preventDefault();
const btn = form.querySelector('button[type="submit"]');
btn.disabled = true;
btn.textContent = "Sending…";
status.textContent = "";
status.className = "form-status mono";
try {
const params = new URLSearchParams(Object.fromEntries(new FormData(form)));
const res = await fetch(`https://sendmail.tdvorak.dev/send?${params}`, { method: "GET" });
if (!res.ok) throw new Error(await res.text() || "Send failed");
status.textContent = "Message sent. I'll get back to you soon.";
status.classList.add("ok");
form.reset();
} catch (err) {
status.textContent = "Something went wrong — try again or email me directly.";
status.classList.add("err");
} finally {
btn.disabled = false;
btn.textContent = "Send message";
}
});