Vodič
SvelteKit kontakt forma (backend nije potreban)
SvelteKitu ne treba sopstveni form actions endpoint da primi kontakt unos. Možete da ubacite istu običnu HTML formu u +page.svelte, ili - ako želite inline stanja uspeha/greške - da koristite malu Svelte 5 komponentu sa $state i fetch-om.
Koristite običnu HTML formu
API ruta vam nije potrebna. Forma šalje POST direktno na Formhook i vaš framework nikada ne mora da dodirne unos.
<form action="https://formhook.app/f/YOUR_API_KEY" method="POST">
<label>
Email
<input type="email" name="email" required />
</label>
<label>
Message
<textarea name="message" required></textarea>
</label>
<!-- honeypot: bots fill this; humans don't see it -->
<input type="text" name="_gotcha" tabindex="-1" autocomplete="off" hidden />
<!-- optional: send users to a thank-you page after a native POST -->
<input type="hidden" name="_redirect" value="https://example.com/thanks" />
<button type="submit">Send</button>
</form>Ili pošaljite fetch-om u SvelteKit
Koristite ovu verziju ako želite klijentska stanja uspeha/greške bez ponovnog učitavanja stranice.
<!-- src/routes/contact/+page.svelte -->
<script lang="ts">
let status = $state<"idle" | "sending" | "ok" | "error">("idle");
async function onSubmit(e: SubmitEvent) {
e.preventDefault();
status = "sending";
const form = e.currentTarget as HTMLFormElement;
const data = Object.fromEntries(new FormData(form));
const res = await fetch("https://formhook.app/f/YOUR_API_KEY", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(data),
});
status = res.ok ? "ok" : "error";
if (res.ok) form.reset();
}
</script>
{#if status === "ok"}
<p>Thanks - we'll be in touch.</p>
{:else}
<form onsubmit={onSubmit}>
<input type="email" name="email" placeholder="Email" required />
<textarea name="message" placeholder="Message" required></textarea>
<input type="text" name="_gotcha" tabindex="-1" hidden />
<button type="submit" disabled={status === "sending"}>
{status === "sending" ? "Sending…" : "Send"}
</button>
{#if status === "error"}
<p>Something went wrong. Please try again.</p>
{/if}
</form>
{/if}Kako radi
Snipet sa običnom formom radi u svakom +page.svelte - bez +page.server.ts, bez SvelteKit form action handlera. Ako želite klijentski UX, drugi snipet koristi Svelte 5 rune ($state) i šalje direktno na formhook.app/f/YOUR_API_KEY. Endpoint prima JSON, form-encoded ili multipart, pa je Object.fromEntries(new FormData(form)) serijalizovan kao JSON put najmanjeg otpora.
Šta se dešava dalje
- Unos stiže u vašu Formhook kontrolnu tablu u roku od sekunde.
- Push obaveštenje stiže na svaki uređaj na kom ste ga uključili.
- Odgovorite direktno iz kontrolne table (Pro i više) bez podizanja sopstvenog odlaznog imejla.
- Vaš SvelteKit deploy ostaje statički (ili skoro statički) build - serverski adapter nije potreban za kontakt formu.
Isporučite svoju SvelteKit kontakt formu danas.
Registrujte se besplatno, napravite formu, nalepite API ključ. Pet minuta.
Počnite besplatnoBesplatni paket: 5 formi · 250 unosa mesečno · Bez kreditne kartice.
SvelteKit kontakt forma - FAQ
- Da li moram da pišem SvelteKit form action ili +page.server.ts fajl?
- Ne. Forma šalje POST direktno na Formhook. To drži vaš SvelteKit deploy prijateljskim prema statici - radi na Cloudflare Pages, Vercel static, GitHub Pages sa adapter-static, bilo gde.
- Kako da prikažem stanje uspeha bez ponovnog učitavanja stranice?
- Koristite fetch snipet. On prati $state promenljivu kroz idle → sending → ok/error i zamenjuje formu porukom zahvalnice kada POST vrati 200. Forma se nikada ne šalje nativno, pa pregledač ne navigira.
- Da li ovo radi sa adapter-static / GitHub Pages?
- Da. Pošto slanje ide na formhook.app, vašem SvelteKit sajtu ne treba serversko okruženje. Buildujte statički, deployujte bilo gde.
Vodiči za druge frameworke
Migrating from Formspree? See how Formhook compares.