diff --git a/public/contact-form-v2.js b/public/contact-form-v2.js
new file mode 100644
index 0000000..48e47cc
--- /dev/null
+++ b/public/contact-form-v2.js
@@ -0,0 +1,63 @@
+(() => {
+ const form = document.querySelector("[data-contact-form]");
+ const message = document.querySelector("[data-form-message]");
+ const submitButton = document.querySelector("[data-form-submit]");
+
+ if (!form || !message || !submitButton) return;
+
+ form.addEventListener("submit", async (event) => {
+ event.preventDefault();
+ if (submitButton.disabled) return;
+
+ submitButton.disabled = true;
+ submitButton.textContent = "Sending...";
+ message.textContent = "";
+
+ try {
+ const formData = new FormData(form);
+ const body = new URLSearchParams();
+ for (const [key, value] of formData.entries()) {
+ if (typeof value === "string") {
+ body.append(key, value);
+ }
+ }
+ const response = await fetch(form.action, {
+ method: "POST",
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
+ body,
+ });
+
+ if (!response.ok) {
+ let errorMessage = "Request failed";
+ const errorData = await response.json().catch(() => null);
+ if (errorData?.error) {
+ errorMessage = errorData.details
+ ? `${errorData.error} (${errorData.details})`
+ : errorData.error;
+ } else {
+ const errorText = await response.text().catch(() => "");
+ if (errorText.trim()) {
+ errorMessage = `${response.status} ${response.statusText}: ${errorText}`;
+ } else {
+ errorMessage = `${response.status} ${response.statusText}`;
+ }
+ }
+ throw new Error(errorMessage);
+ }
+
+ message.textContent = "Thanks! Your message has been sent.";
+ form.reset();
+ if (window.turnstile && typeof window.turnstile.reset === "function") {
+ window.turnstile.reset();
+ }
+ } catch (error) {
+ message.textContent =
+ error instanceof Error
+ ? error.message
+ : "Sorry, something went wrong. Please try again.";
+ } finally {
+ submitButton.disabled = false;
+ submitButton.textContent = "Send message";
+ }
+ });
+})();
diff --git a/src/pages/contact.astro b/src/pages/contact.astro
index 4622422..ac6369d 100644
--- a/src/pages/contact.astro
+++ b/src/pages/contact.astro
@@ -24,7 +24,7 @@ const turnstileSiteKey = import.meta.env.PUBLIC_TURNSTILE_SITE_KEY ?? "";
)
}