Pređi na sadržaj
FFormhook
Svi vodiči

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.

contact.html
<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
<!-- 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 besplatno

Besplatni 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.