Insurance claim form
Register a claim. Send the facts of what happened, not documents you do not need for the first notice.
यह फ़ॉर्म बीमा अनुबंध या दावे का कानूनी रिकॉर्ड नहीं है। कोटेशन या अनुरोध दर्ज करने के लिए जितना ज़रूरी हो उतना ही भेजें। स्वास्थ्य डेटा GDPR में विशेष श्रेणी है — अगर अनुरोध उसके बिना हो सकता है तो उसे न जोड़ें।
24 KB तक की फ़ाइल आवेदन के साथ टेक्स्ट के रूप में जाती है। उससे बड़ी फ़ाइल का लिंक दें। Formgong अलग फ़ाइल नहीं रखता।
पूर्वावलोकन
फ़ॉर्म कोड
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Insurance claim form</title>
<style>
body { font-family: "Segoe UI", sans-serif; color: #12263a; margin: 0; background: #fff; }
main { max-width: 640px; margin: 0 auto; padding: 32px 20px 64px; }
h1 { font-size: 28px; font-weight: 650; letter-spacing: -0.02em; line-height: 1.2; }
h2 { font-size: 18px; margin: 18px 0 0; }
p { line-height: 1.5; }
form { display: grid; gap: 14px; position: relative; }
.field { display: grid; gap: 6px; }
label span, .check span { font-size: 14px; }
input, select, textarea { font: inherit; color: inherit; padding: 10px 12px; border: 1px solid #b4bdce; border-radius: 8px; width: 100%; box-sizing: border-box; background: #fff; }
textarea { min-height: 96px; }
.check { display: flex; gap: 8px; align-items: flex-start; }
.check input { width: auto; margin-top: 4px; }
button { background: #3c4ad8; color: #fff; border: 0; border-radius: 8px; padding: 12px 18px; font: inherit; cursor: pointer; }
.note { background: #fff6eb; padding: 12px 14px; border-radius: 8px; }
form [data-show-if] { display: none; }
form:has(select[name="police_report"] option[value="yes"]:checked) [data-show-if="police_report"][data-show-equals="yes"] { display: grid; }
</style>
</head>
<body>
<main>
<h1 data-i18n="title">Insurance claim form</h1>
<p data-i18n="lede">Register a claim. Send the facts of what happened, not documents you do not need for the first notice.</p>
<p class="note" data-i18n="disclaimer">This form is not an insurance contract or a legal record of a claim. Send only what is needed to quote or register the request. Health details are special-category data under the GDPR — leave them out unless the request cannot be handled without them.</p>
<form id="fg-form" action="https://formgong.com/submit" method="POST">
<input type="hidden" name="access_key" value="fk_your_access_key">
<div aria-hidden="true" style="position:absolute;left:-10000px;width:1px;height:1px;overflow:hidden"><label>Leave this field empty<input name="botcheck" tabindex="-1" autocomplete="off"></label></div>
<section><h2 data-i18n="section.policy">Policy</h2>
<div class="field"><label for="fg-policy_number"><span data-i18n="policy_number">Policy number</span></label><input id="fg-policy_number" name="policy_number" type="text" required maxlength="40"></div>
<div class="field"><label for="fg-cover_type"><span data-i18n="cover_type">Cover</span></label><select id="fg-cover_type" name="cover_type" required><option value="">—</option><option value="auto" data-i18n="cover_type.auto">Car</option><option value="home" data-i18n="cover_type.home">Home</option><option value="travel" data-i18n="cover_type.travel">Travel</option><option value="other" data-i18n="cover_type.other">Other</option></select></div>
<div class="field"><label for="fg-incident_date"><span data-i18n="incident_date">Date of the incident</span></label><input id="fg-incident_date" name="incident_date" type="date" required></div></section>
<section><h2 data-i18n="section.incident">What happened</h2>
<div class="field"><label for="fg-city"><span data-i18n="city">City</span></label><input id="fg-city" name="city" type="text" required maxlength="80" autocomplete="address-level2"></div>
<div class="field"><label for="fg-description"><span data-i18n="description">What happened?</span></label><textarea id="fg-description" name="description" required maxlength="1000"></textarea></div>
<div class="field"><label for="fg-police_report"><span data-i18n="police_report">Was a police report filed?</span></label><select id="fg-police_report" name="police_report" required><option value="">—</option><option value="yes" data-i18n="police_report.yes">Yes</option><option value="no" data-i18n="police_report.no">No</option></select></div>
<div class="field" data-show-if="police_report" data-show-equals="yes"><label for="fg-police_ref"><span data-i18n="police_ref">Report number</span></label><input id="fg-police_ref" name="police_ref" type="text" maxlength="40"></div></section>
<section><h2 data-i18n="section.contact">Contact</h2>
<div class="field"><label for="fg-name"><span data-i18n="name">Name</span></label><input id="fg-name" name="name" type="text" required maxlength="80" autocomplete="name"></div>
<div class="field"><label for="fg-email"><span data-i18n="email">Email</span></label><input id="fg-email" name="email" type="email" required maxlength="120" autocomplete="email"></div>
<div class="field"><label for="fg-phone"><span data-i18n="phone">Phone</span></label><input id="fg-phone" name="phone" type="tel" required maxlength="40" autocomplete="tel"></div></section>
<section><h2 data-i18n="section.evidence">Photos</h2>
<div class="field"><label for="fg-photo"><span data-i18n="photo">One photo, up to 24 KB</span></label><input id="fg-photo" name="photo" type="file" accept="image/*"></div>
<div class="field"><label for="fg-photo_url"><span data-i18n="photo_url">Or a link to photos</span></label><input id="fg-photo_url" name="photo_url" type="url" maxlength="300"></div></section>
<section><h2 data-i18n="section.consent">Consent</h2>
<div class="field"><label class="check"><input id="fg-consent_contact" name="consent_contact" type="checkbox" value="yes" required><span data-i18n="consent_contact">I agree to be contacted about this request.</span></label></div>
<div class="field"><label class="check"><input id="fg-consent_privacy" name="consent_privacy" type="checkbox" value="yes" required><span data-i18n="consent_privacy">I agree that these answers are stored so the request can be handled.</span></label></div></section>
<!-- Turnstile hook: enable Turnstile on this form in Formgong, then set your site key.
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
<div class="cf-turnstile" data-sitekey="YOUR_TURNSTILE_SITE_KEY"></div>
-->
<button type="submit" data-i18n="submit">Send</button>
<p data-status role="status"></p>
</form>
</main>
<script type="application/json" id="fg-labels">{"uk":{"title":"Форма заяви про страховий випадок","lede":"Реєстрація випадку. Опишіть, що сталося, без документів, які не потрібні для першого повідомлення.","submit":"Надіслати","thanks":"Надіслано. Дякуємо.","file_too_big":"Файл більший за 24 КБ. Додайте посилання.","disclaimer":"Ця форма не є договором страхування і не є юридичним записом про випадок. Надсилайте лише те, що потрібно для розрахунку чи реєстрації заявки. Дані про здоров'я — особлива категорія за GDPR: не додавайте їх, якщо без них заявку можна обробити.","section.policy":"Поліс","policy_number":"Номер поліса","cover_type":"Покриття","cover_type.auto":"Авто","cover_type.home":"Житло","cover_type.travel":"Подорож","cover_type.other":"Інше","incident_date":"Дата випадку","section.incident":"Що сталося","city":"Місто","description":"Що сталося?","police_report":"Чи є заява в поліцію?","police_report.yes":"Так","police_report.no":"Ні","police_ref":"Номер заяви","section.contact":"Контакт","name":"Ім'я","email":"Електронна пошта","phone":"Телефон","section.evidence":"Фото","photo":"Одне фото, до 24 КБ","photo_url":"Або посилання на фото","section.consent":"Згода","consent_contact":"Погоджуюсь, щоб зі мною зв'язалися щодо цієї заявки.","consent_privacy":"Погоджуюсь, що ці відповіді зберігаються, щоб заявку можна було обробити."},"en":{"title":"Insurance claim form","lede":"Register a claim. Send the facts of what happened, not documents you do not need for the first notice.","submit":"Send","thanks":"Sent. Thank you.","file_too_big":"That file is over 24 KB. Paste a link instead.","disclaimer":"This form is not an insurance contract or a legal record of a claim. Send only what is needed to quote or register the request. Health details are special-category data under the GDPR — leave them out unless the request cannot be handled without them.","section.policy":"Policy","policy_number":"Policy number","cover_type":"Cover","cover_type.auto":"Car","cover_type.home":"Home","cover_type.travel":"Travel","cover_type.other":"Other","incident_date":"Date of the incident","section.incident":"What happened","city":"City","description":"What happened?","police_report":"Was a police report filed?","police_report.yes":"Yes","police_report.no":"No","police_ref":"Report number","section.contact":"Contact","name":"Name","email":"Email","phone":"Phone","section.evidence":"Photos","photo":"One photo, up to 24 KB","photo_url":"Or a link to photos","section.consent":"Consent","consent_contact":"I agree to be contacted about this request.","consent_privacy":"I agree that these answers are stored so the request can be handled."},"pl":{"title":"Formularz zgłoszenia szkody","lede":"Zgłoszenie szkody. Opisz, co się stało, bez dokumentów zbędnych przy pierwszym zgłoszeniu.","submit":"Wyślij","thanks":"Wysłano. Dziękujemy.","file_too_big":"Plik ma ponad 24 KB. Wklej link.","disclaimer":"Ten formularz nie jest umową ubezpieczenia ani prawnym zapisem szkody. Podaj tylko to, co jest potrzebne do wyceny lub rejestracji zgłoszenia. Dane o zdrowiu to szczególna kategoria w RODO — pomiń je, jeśli zgłoszenie da się obsłużyć bez nich.","section.policy":"Polisa","policy_number":"Numer polisy","cover_type":"Ochrona","cover_type.auto":"Samochód","cover_type.home":"Dom","cover_type.travel":"Podróż","cover_type.other":"Inne","incident_date":"Data zdarzenia","section.incident":"Co się stało","city":"Miasto","description":"Co się stało?","police_report":"Czy złożono zawiadomienie na policji?","police_report.yes":"Tak","police_report.no":"Nie","police_ref":"Numer zawiadomienia","section.contact":"Kontakt","name":"Imię","email":"E-mail","phone":"Telefon","section.evidence":"Zdjęcia","photo":"Jedno zdjęcie, do 24 KB","photo_url":"Albo link do zdjęć","section.consent":"Zgoda","consent_contact":"Zgadzam się na kontakt w sprawie tego zgłoszenia.","consent_privacy":"Zgadzam się, aby te odpowiedzi zostały zapisane w celu obsługi zgłoszenia."},"tr":{"title":"Hasar bildirim formu","lede":"Hasar bildirimi. İlk kayıt için gerekmeyen belgeleri değil, olanı yazın.","submit":"Gönder","thanks":"Gönderildi. Teşekkürler.","file_too_big":"Dosya 24 KB'den büyük. Bağlantı ekleyin.","disclaimer":"Bu form bir sigorta sözleşmesi ya da hasarın yasal kaydı değildir. Teklif veya kayıt için gereken kadarını gönderin. Sağlık verisi GDPR'de özel niteliklidir; talep onsuz işlenebiliyorsa eklemeyin.","section.policy":"Poliçe","policy_number":"Poliçe numarası","cover_type":"Teminat","cover_type.auto":"Araç","cover_type.home":"Konut","cover_type.travel":"Seyahat","cover_type.other":"Diğer","incident_date":"Olay tarihi","section.incident":"Ne oldu","city":"Şehir","description":"Ne oldu?","police_report":"Polis tutanağı var mı?","police_report.yes":"Evet","police_report.no":"Hayır","police_ref":"Tutanak numarası","section.contact":"İletişim","name":"Ad","email":"E-posta","phone":"Telefon","section.evidence":"Fotoğraflar","photo":"Bir fotoğraf, en fazla 24 KB","photo_url":"Ya da fotoğraf bağlantısı","section.consent":"Onay","consent_contact":"Bu talep hakkında benimle iletişime geçilmesini kabul ediyorum.","consent_privacy":"Bu yanıtların talebin işlenmesi için saklanmasını kabul ediyorum."}}</script>
<script>
(function () {
var MAX = 24576;
var form = document.getElementById("fg-form");
var packNode = document.getElementById("fg-labels");
if (!form || !packNode) return;
var pack = JSON.parse(packNode.textContent);
function code() {
var q = new URLSearchParams(location.search).get("lang") || "";
var raw = (q || document.documentElement.lang || (navigator.language || "en")).slice(0, 2).toLowerCase();
return pack[raw] ? raw : "en";
}
function apply() {
var dict = pack[code()];
document.querySelectorAll("[data-i18n]").forEach(function (node) {
var key = node.getAttribute("data-i18n");
if (key && typeof dict[key] === "string") node.textContent = dict[key];
});
}
apply();
var status = form.querySelector("[data-status]");
form.addEventListener("submit", function (event) {
event.preventDefault();
var dict = pack[code()];
var body = {};
var files = [];
new FormData(form).forEach(function (value, key) {
if (typeof File !== "undefined" && value instanceof File) {
if (value.size) files.push([key, value]);
return;
}
body[key] = String(value);
});
if (files.some(function (pair) { return pair[1].size > MAX; })) {
if (status) status.textContent = dict.file_too_big;
return;
}
Promise.all(files.map(function (pair) {
return readFile(pair[1]).then(function (data) {
body[pair[0] + "_filename"] = pair[1].name;
body[pair[0] + "_data"] = data;
});
})).then(function () {
return fetch(form.action, {
method: "POST",
headers: { "Content-Type": "application/json", Accept: "application/json" },
body: JSON.stringify(body)
});
}).then(function (response) { return response.json(); }).then(function (result) {
if (status) status.textContent = result && result.success ? dict.thanks : ((result && result.message) || "error");
}).catch(function () {
if (status) status.textContent = "error";
});
});
function readFile(file) {
return new Promise(function (resolve, reject) {
var reader = new FileReader();
reader.onload = function () {
var raw = String(reader.result || "");
var comma = raw.indexOf(",");
resolve(comma === -1 ? raw : raw.slice(comma + 1));
};
reader.onerror = function () { reject(reader.error); };
reader.readAsDataURL(file);
});
}
})();
</script>
</body>
</html>
// Generated from src/content/industries.ts — npm run templates:write
import { useState } from "react";
const ENDPOINT = "https://formgong.com/submit";
const FILE_MAX = 24576;
const LABELS = {
"uk": {
"title": "Форма заяви про страховий випадок",
"lede": "Реєстрація випадку. Опишіть, що сталося, без документів, які не потрібні для першого повідомлення.",
"submit": "Надіслати",
"thanks": "Надіслано. Дякуємо.",
"file_too_big": "Файл більший за 24 КБ. Додайте посилання.",
"disclaimer": "Ця форма не є договором страхування і не є юридичним записом про випадок. Надсилайте лише те, що потрібно для розрахунку чи реєстрації заявки. Дані про здоров'я — особлива категорія за GDPR: не додавайте їх, якщо без них заявку можна обробити.",
"section.policy": "Поліс",
"policy_number": "Номер поліса",
"cover_type": "Покриття",
"cover_type.auto": "Авто",
"cover_type.home": "Житло",
"cover_type.travel": "Подорож",
"cover_type.other": "Інше",
"incident_date": "Дата випадку",
"section.incident": "Що сталося",
"city": "Місто",
"description": "Що сталося?",
"police_report": "Чи є заява в поліцію?",
"police_report.yes": "Так",
"police_report.no": "Ні",
"police_ref": "Номер заяви",
"section.contact": "Контакт",
"name": "Ім'я",
"email": "Електронна пошта",
"phone": "Телефон",
"section.evidence": "Фото",
"photo": "Одне фото, до 24 КБ",
"photo_url": "Або посилання на фото",
"section.consent": "Згода",
"consent_contact": "Погоджуюсь, щоб зі мною зв'язалися щодо цієї заявки.",
"consent_privacy": "Погоджуюсь, що ці відповіді зберігаються, щоб заявку можна було обробити."
},
"en": {
"title": "Insurance claim form",
"lede": "Register a claim. Send the facts of what happened, not documents you do not need for the first notice.",
"submit": "Send",
"thanks": "Sent. Thank you.",
"file_too_big": "That file is over 24 KB. Paste a link instead.",
"disclaimer": "This form is not an insurance contract or a legal record of a claim. Send only what is needed to quote or register the request. Health details are special-category data under the GDPR — leave them out unless the request cannot be handled without them.",
"section.policy": "Policy",
"policy_number": "Policy number",
"cover_type": "Cover",
"cover_type.auto": "Car",
"cover_type.home": "Home",
"cover_type.travel": "Travel",
"cover_type.other": "Other",
"incident_date": "Date of the incident",
"section.incident": "What happened",
"city": "City",
"description": "What happened?",
"police_report": "Was a police report filed?",
"police_report.yes": "Yes",
"police_report.no": "No",
"police_ref": "Report number",
"section.contact": "Contact",
"name": "Name",
"email": "Email",
"phone": "Phone",
"section.evidence": "Photos",
"photo": "One photo, up to 24 KB",
"photo_url": "Or a link to photos",
"section.consent": "Consent",
"consent_contact": "I agree to be contacted about this request.",
"consent_privacy": "I agree that these answers are stored so the request can be handled."
},
"pl": {
"title": "Formularz zgłoszenia szkody",
"lede": "Zgłoszenie szkody. Opisz, co się stało, bez dokumentów zbędnych przy pierwszym zgłoszeniu.",
"submit": "Wyślij",
"thanks": "Wysłano. Dziękujemy.",
"file_too_big": "Plik ma ponad 24 KB. Wklej link.",
"disclaimer": "Ten formularz nie jest umową ubezpieczenia ani prawnym zapisem szkody. Podaj tylko to, co jest potrzebne do wyceny lub rejestracji zgłoszenia. Dane o zdrowiu to szczególna kategoria w RODO — pomiń je, jeśli zgłoszenie da się obsłużyć bez nich.",
"section.policy": "Polisa",
"policy_number": "Numer polisy",
"cover_type": "Ochrona",
"cover_type.auto": "Samochód",
"cover_type.home": "Dom",
"cover_type.travel": "Podróż",
"cover_type.other": "Inne",
"incident_date": "Data zdarzenia",
"section.incident": "Co się stało",
"city": "Miasto",
"description": "Co się stało?",
"police_report": "Czy złożono zawiadomienie na policji?",
"police_report.yes": "Tak",
"police_report.no": "Nie",
"police_ref": "Numer zawiadomienia",
"section.contact": "Kontakt",
"name": "Imię",
"email": "E-mail",
"phone": "Telefon",
"section.evidence": "Zdjęcia",
"photo": "Jedno zdjęcie, do 24 KB",
"photo_url": "Albo link do zdjęć",
"section.consent": "Zgoda",
"consent_contact": "Zgadzam się na kontakt w sprawie tego zgłoszenia.",
"consent_privacy": "Zgadzam się, aby te odpowiedzi zostały zapisane w celu obsługi zgłoszenia."
},
"tr": {
"title": "Hasar bildirim formu",
"lede": "Hasar bildirimi. İlk kayıt için gerekmeyen belgeleri değil, olanı yazın.",
"submit": "Gönder",
"thanks": "Gönderildi. Teşekkürler.",
"file_too_big": "Dosya 24 KB'den büyük. Bağlantı ekleyin.",
"disclaimer": "Bu form bir sigorta sözleşmesi ya da hasarın yasal kaydı değildir. Teklif veya kayıt için gereken kadarını gönderin. Sağlık verisi GDPR'de özel niteliklidir; talep onsuz işlenebiliyorsa eklemeyin.",
"section.policy": "Poliçe",
"policy_number": "Poliçe numarası",
"cover_type": "Teminat",
"cover_type.auto": "Araç",
"cover_type.home": "Konut",
"cover_type.travel": "Seyahat",
"cover_type.other": "Diğer",
"incident_date": "Olay tarihi",
"section.incident": "Ne oldu",
"city": "Şehir",
"description": "Ne oldu?",
"police_report": "Polis tutanağı var mı?",
"police_report.yes": "Evet",
"police_report.no": "Hayır",
"police_ref": "Tutanak numarası",
"section.contact": "İletişim",
"name": "Ad",
"email": "E-posta",
"phone": "Telefon",
"section.evidence": "Fotoğraflar",
"photo": "Bir fotoğraf, en fazla 24 KB",
"photo_url": "Ya da fotoğraf bağlantısı",
"section.consent": "Onay",
"consent_contact": "Bu talep hakkında benimle iletişime geçilmesini kabul ediyorum.",
"consent_privacy": "Bu yanıtların talebin işlenmesi için saklanmasını kabul ediyorum."
}
};
export function IndustryForm({ lang = "en", accessKey = "fk_your_access_key" }) {
const t = LABELS[lang] || LABELS.en;
const [status, setStatus] = useState("");
const [values, setValues] = useState({ police_report: "" });
function setField(name, value) {
setValues((current) => ({ ...current, [name]: value }));
}
async function onSubmit(event) {
const form = event.currentTarget;
event.preventDefault();
const body = {};
const files = [];
for (const [key, value] of new FormData(form).entries()) {
if (value instanceof File) {
if (value.size) files.push([key, value]);
continue;
}
body[key] = String(value);
}
if (files.some((pair) => pair[1].size > FILE_MAX)) {
setStatus(t.file_too_big);
return;
}
for (const [key, file] of files) {
body[key + "_filename"] = file.name;
body[key + "_data"] = await readFile(file);
}
const response = await fetch(ENDPOINT, {
method: "POST",
headers: { "Content-Type": "application/json", Accept: "application/json" },
body: JSON.stringify(body),
});
const result = await response.json();
setStatus(result.success ? t.thanks : (result.message || "error"));
}
return (
<form onSubmit={onSubmit}>
<h1>{t.title}</h1>
<p>{t.lede}</p>
{t.disclaimer ? <p>{t.disclaimer}</p> : null}
<input type="hidden" name="access_key" value={accessKey} />
<div aria-hidden="true" style={{ position: "absolute", left: "-10000px", width: 1, height: 1, overflow: "hidden" }}>
<input name="botcheck" tabIndex={-1} autoComplete="off" />
</div>
<section><h2>{t["section.policy"]}</h2>
<label><span>{t["policy_number"]}</span><input name="policy_number" type="text" required maxLength={40} /></label>
<label><span>{t["cover_type"]}</span><select name="cover_type" required><option value="">—</option><option value="auto">{t["cover_type.auto"]}</option><option value="home">{t["cover_type.home"]}</option><option value="travel">{t["cover_type.travel"]}</option><option value="other">{t["cover_type.other"]}</option></select></label>
<label><span>{t["incident_date"]}</span><input name="incident_date" type="date" required /></label></section>
<section><h2>{t["section.incident"]}</h2>
<label><span>{t["city"]}</span><input name="city" type="text" required maxLength={80} autoComplete="address-level2" /></label>
<label><span>{t["description"]}</span><textarea name="description" required maxLength={1000} /></label>
<label><span>{t["police_report"]}</span><select name="police_report" required value={values["police_report"]} onChange={(event) => setField("police_report", event.target.value)}><option value="">—</option><option value="yes">{t["police_report.yes"]}</option><option value="no">{t["police_report.no"]}</option></select></label>
{values["police_report"] === "yes" ? (<label><span>{t["police_ref"]}</span><input name="police_ref" type="text" maxLength={40} /></label>) : null}</section>
<section><h2>{t["section.contact"]}</h2>
<label><span>{t["name"]}</span><input name="name" type="text" required maxLength={80} autoComplete="name" /></label>
<label><span>{t["email"]}</span><input name="email" type="email" required maxLength={120} autoComplete="email" /></label>
<label><span>{t["phone"]}</span><input name="phone" type="tel" required maxLength={40} autoComplete="tel" /></label></section>
<section><h2>{t["section.evidence"]}</h2>
<label><span>{t["photo"]}</span><input name="photo" type="file" accept="image/*" /></label>
<label><span>{t["photo_url"]}</span><input name="photo_url" type="url" maxLength={300} /></label></section>
<section><h2>{t["section.consent"]}</h2>
<label className="check"><input name="consent_contact" type="checkbox" value="yes" required /><span>{t["consent_contact"]}</span></label>
<label className="check"><input name="consent_privacy" type="checkbox" value="yes" required /><span>{t["consent_privacy"]}</span></label></section>
{/* Turnstile hook: enable Turnstile on this form in Formgong, load https://challenges.cloudflare.com/turnstile/v0/api.js, and render <div className="cf-turnstile" data-sitekey="YOUR_TURNSTILE_SITE_KEY" /> */}
<button type="submit">{t.submit}</button>
<p>{status}</p>
</form>
);
}
function readFile(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = () => {
const raw = String(reader.result || "");
const comma = raw.indexOf(",");
resolve(comma === -1 ? raw : raw.slice(comma + 1));
};
reader.onerror = () => reject(reader.error);
reader.readAsDataURL(file);
});
}
<!-- Generated from src/content/industries.ts — npm run templates:write -->
<script setup>
import { reactive, ref, computed } from "vue";
const props = defineProps({
lang: { type: String, default: "en" },
accessKey: { type: String, default: "fk_your_access_key" },
});
const ENDPOINT = "https://formgong.com/submit";
const FILE_MAX = 24576;
const LABELS = {
"uk": {
"title": "Форма заяви про страховий випадок",
"lede": "Реєстрація випадку. Опишіть, що сталося, без документів, які не потрібні для першого повідомлення.",
"submit": "Надіслати",
"thanks": "Надіслано. Дякуємо.",
"file_too_big": "Файл більший за 24 КБ. Додайте посилання.",
"disclaimer": "Ця форма не є договором страхування і не є юридичним записом про випадок. Надсилайте лише те, що потрібно для розрахунку чи реєстрації заявки. Дані про здоров'я — особлива категорія за GDPR: не додавайте їх, якщо без них заявку можна обробити.",
"section.policy": "Поліс",
"policy_number": "Номер поліса",
"cover_type": "Покриття",
"cover_type.auto": "Авто",
"cover_type.home": "Житло",
"cover_type.travel": "Подорож",
"cover_type.other": "Інше",
"incident_date": "Дата випадку",
"section.incident": "Що сталося",
"city": "Місто",
"description": "Що сталося?",
"police_report": "Чи є заява в поліцію?",
"police_report.yes": "Так",
"police_report.no": "Ні",
"police_ref": "Номер заяви",
"section.contact": "Контакт",
"name": "Ім'я",
"email": "Електронна пошта",
"phone": "Телефон",
"section.evidence": "Фото",
"photo": "Одне фото, до 24 КБ",
"photo_url": "Або посилання на фото",
"section.consent": "Згода",
"consent_contact": "Погоджуюсь, щоб зі мною зв'язалися щодо цієї заявки.",
"consent_privacy": "Погоджуюсь, що ці відповіді зберігаються, щоб заявку можна було обробити."
},
"en": {
"title": "Insurance claim form",
"lede": "Register a claim. Send the facts of what happened, not documents you do not need for the first notice.",
"submit": "Send",
"thanks": "Sent. Thank you.",
"file_too_big": "That file is over 24 KB. Paste a link instead.",
"disclaimer": "This form is not an insurance contract or a legal record of a claim. Send only what is needed to quote or register the request. Health details are special-category data under the GDPR — leave them out unless the request cannot be handled without them.",
"section.policy": "Policy",
"policy_number": "Policy number",
"cover_type": "Cover",
"cover_type.auto": "Car",
"cover_type.home": "Home",
"cover_type.travel": "Travel",
"cover_type.other": "Other",
"incident_date": "Date of the incident",
"section.incident": "What happened",
"city": "City",
"description": "What happened?",
"police_report": "Was a police report filed?",
"police_report.yes": "Yes",
"police_report.no": "No",
"police_ref": "Report number",
"section.contact": "Contact",
"name": "Name",
"email": "Email",
"phone": "Phone",
"section.evidence": "Photos",
"photo": "One photo, up to 24 KB",
"photo_url": "Or a link to photos",
"section.consent": "Consent",
"consent_contact": "I agree to be contacted about this request.",
"consent_privacy": "I agree that these answers are stored so the request can be handled."
},
"pl": {
"title": "Formularz zgłoszenia szkody",
"lede": "Zgłoszenie szkody. Opisz, co się stało, bez dokumentów zbędnych przy pierwszym zgłoszeniu.",
"submit": "Wyślij",
"thanks": "Wysłano. Dziękujemy.",
"file_too_big": "Plik ma ponad 24 KB. Wklej link.",
"disclaimer": "Ten formularz nie jest umową ubezpieczenia ani prawnym zapisem szkody. Podaj tylko to, co jest potrzebne do wyceny lub rejestracji zgłoszenia. Dane o zdrowiu to szczególna kategoria w RODO — pomiń je, jeśli zgłoszenie da się obsłużyć bez nich.",
"section.policy": "Polisa",
"policy_number": "Numer polisy",
"cover_type": "Ochrona",
"cover_type.auto": "Samochód",
"cover_type.home": "Dom",
"cover_type.travel": "Podróż",
"cover_type.other": "Inne",
"incident_date": "Data zdarzenia",
"section.incident": "Co się stało",
"city": "Miasto",
"description": "Co się stało?",
"police_report": "Czy złożono zawiadomienie na policji?",
"police_report.yes": "Tak",
"police_report.no": "Nie",
"police_ref": "Numer zawiadomienia",
"section.contact": "Kontakt",
"name": "Imię",
"email": "E-mail",
"phone": "Telefon",
"section.evidence": "Zdjęcia",
"photo": "Jedno zdjęcie, do 24 KB",
"photo_url": "Albo link do zdjęć",
"section.consent": "Zgoda",
"consent_contact": "Zgadzam się na kontakt w sprawie tego zgłoszenia.",
"consent_privacy": "Zgadzam się, aby te odpowiedzi zostały zapisane w celu obsługi zgłoszenia."
},
"tr": {
"title": "Hasar bildirim formu",
"lede": "Hasar bildirimi. İlk kayıt için gerekmeyen belgeleri değil, olanı yazın.",
"submit": "Gönder",
"thanks": "Gönderildi. Teşekkürler.",
"file_too_big": "Dosya 24 KB'den büyük. Bağlantı ekleyin.",
"disclaimer": "Bu form bir sigorta sözleşmesi ya da hasarın yasal kaydı değildir. Teklif veya kayıt için gereken kadarını gönderin. Sağlık verisi GDPR'de özel niteliklidir; talep onsuz işlenebiliyorsa eklemeyin.",
"section.policy": "Poliçe",
"policy_number": "Poliçe numarası",
"cover_type": "Teminat",
"cover_type.auto": "Araç",
"cover_type.home": "Konut",
"cover_type.travel": "Seyahat",
"cover_type.other": "Diğer",
"incident_date": "Olay tarihi",
"section.incident": "Ne oldu",
"city": "Şehir",
"description": "Ne oldu?",
"police_report": "Polis tutanağı var mı?",
"police_report.yes": "Evet",
"police_report.no": "Hayır",
"police_ref": "Tutanak numarası",
"section.contact": "İletişim",
"name": "Ad",
"email": "E-posta",
"phone": "Telefon",
"section.evidence": "Fotoğraflar",
"photo": "Bir fotoğraf, en fazla 24 KB",
"photo_url": "Ya da fotoğraf bağlantısı",
"section.consent": "Onay",
"consent_contact": "Bu talep hakkında benimle iletişime geçilmesini kabul ediyorum.",
"consent_privacy": "Bu yanıtların talebin işlenmesi için saklanmasını kabul ediyorum."
}
};
const t = computed(() => LABELS[props.lang] || LABELS.en);
const status = ref("");
const values = reactive({ police_report: "" });
function readFile(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = () => {
const raw = String(reader.result || "");
const comma = raw.indexOf(",");
resolve(comma === -1 ? raw : raw.slice(comma + 1));
};
reader.onerror = () => reject(reader.error);
reader.readAsDataURL(file);
});
}
async function onSubmit(event) {
const form = event.currentTarget;
event.preventDefault();
const body = {};
const files = [];
for (const [key, value] of new FormData(form).entries()) {
if (value instanceof File) {
if (value.size) files.push([key, value]);
continue;
}
body[key] = String(value);
}
if (files.some((pair) => pair[1].size > FILE_MAX)) {
status.value = t.value.file_too_big;
return;
}
for (const [key, file] of files) {
body[key + "_filename"] = file.name;
body[key + "_data"] = await readFile(file);
}
const response = await fetch(ENDPOINT, {
method: "POST",
headers: { "Content-Type": "application/json", Accept: "application/json" },
body: JSON.stringify(body),
});
const result = await response.json();
status.value = result.success ? t.value.thanks : (result.message || "error");
}
</script>
<template>
<form @submit.prevent="onSubmit">
<h1>{{ t.title }}</h1>
<p>{{ t.lede }}</p>
<p v-if="t.disclaimer">{{ t.disclaimer }}</p>
<input type="hidden" name="access_key" :value="accessKey">
<div aria-hidden="true" style="position:absolute;left:-10000px;width:1px;height:1px;overflow:hidden">
<input name="botcheck" tabindex="-1" autocomplete="off">
</div>
<section><h2>{{ t["section.policy"] }}</h2>
<label><span>{{ t["policy_number"] }}</span><input name="policy_number" type="text" required maxlength="40"></label>
<label><span>{{ t["cover_type"] }}</span><select name="cover_type" required><option value="">—</option><option value="auto">{{ t["cover_type.auto"] }}</option><option value="home">{{ t["cover_type.home"] }}</option><option value="travel">{{ t["cover_type.travel"] }}</option><option value="other">{{ t["cover_type.other"] }}</option></select></label>
<label><span>{{ t["incident_date"] }}</span><input name="incident_date" type="date" required></label></section>
<section><h2>{{ t["section.incident"] }}</h2>
<label><span>{{ t["city"] }}</span><input name="city" type="text" required maxlength="80" autocomplete="address-level2"></label>
<label><span>{{ t["description"] }}</span><textarea name="description" required maxlength="1000"></textarea></label>
<label><span>{{ t["police_report"] }}</span><select name="police_report" required v-model="values.police_report"><option value="">—</option><option value="yes">{{ t["police_report.yes"] }}</option><option value="no">{{ t["police_report.no"] }}</option></select></label>
<template v-if="values["police_report"] === 'yes'"><label><span>{{ t["police_ref"] }}</span><input name="police_ref" type="text" maxlength="40"></label></template></section>
<section><h2>{{ t["section.contact"] }}</h2>
<label><span>{{ t["name"] }}</span><input name="name" type="text" required maxlength="80" autocomplete="name"></label>
<label><span>{{ t["email"] }}</span><input name="email" type="email" required maxlength="120" autocomplete="email"></label>
<label><span>{{ t["phone"] }}</span><input name="phone" type="tel" required maxlength="40" autocomplete="tel"></label></section>
<section><h2>{{ t["section.evidence"] }}</h2>
<label><span>{{ t["photo"] }}</span><input name="photo" type="file" accept="image/*"></label>
<label><span>{{ t["photo_url"] }}</span><input name="photo_url" type="url" maxlength="300"></label></section>
<section><h2>{{ t["section.consent"] }}</h2>
<label class="check"><input name="consent_contact" type="checkbox" value="yes" required><span>{{ t["consent_contact"] }}</span></label>
<label class="check"><input name="consent_privacy" type="checkbox" value="yes" required><span>{{ t["consent_privacy"] }}</span></label></section>
<!-- Turnstile hook: enable Turnstile on this form in Formgong, add the api.js script, and a div.cf-turnstile with data-sitekey="YOUR_TURNSTILE_SITE_KEY". -->
<button type="submit">{{ t.submit }}</button>
<p>{{ status }}</p>
</form>
</template>
<!-- Generated from src/content/industries.ts — npm run templates:write -->
<script>
let { lang = "en", accessKey = "fk_your_access_key" } = $props();
const ENDPOINT = "https://formgong.com/submit";
const FILE_MAX = 24576;
const LABELS = {
"uk": {
"title": "Форма заяви про страховий випадок",
"lede": "Реєстрація випадку. Опишіть, що сталося, без документів, які не потрібні для першого повідомлення.",
"submit": "Надіслати",
"thanks": "Надіслано. Дякуємо.",
"file_too_big": "Файл більший за 24 КБ. Додайте посилання.",
"disclaimer": "Ця форма не є договором страхування і не є юридичним записом про випадок. Надсилайте лише те, що потрібно для розрахунку чи реєстрації заявки. Дані про здоров'я — особлива категорія за GDPR: не додавайте їх, якщо без них заявку можна обробити.",
"section.policy": "Поліс",
"policy_number": "Номер поліса",
"cover_type": "Покриття",
"cover_type.auto": "Авто",
"cover_type.home": "Житло",
"cover_type.travel": "Подорож",
"cover_type.other": "Інше",
"incident_date": "Дата випадку",
"section.incident": "Що сталося",
"city": "Місто",
"description": "Що сталося?",
"police_report": "Чи є заява в поліцію?",
"police_report.yes": "Так",
"police_report.no": "Ні",
"police_ref": "Номер заяви",
"section.contact": "Контакт",
"name": "Ім'я",
"email": "Електронна пошта",
"phone": "Телефон",
"section.evidence": "Фото",
"photo": "Одне фото, до 24 КБ",
"photo_url": "Або посилання на фото",
"section.consent": "Згода",
"consent_contact": "Погоджуюсь, щоб зі мною зв'язалися щодо цієї заявки.",
"consent_privacy": "Погоджуюсь, що ці відповіді зберігаються, щоб заявку можна було обробити."
},
"en": {
"title": "Insurance claim form",
"lede": "Register a claim. Send the facts of what happened, not documents you do not need for the first notice.",
"submit": "Send",
"thanks": "Sent. Thank you.",
"file_too_big": "That file is over 24 KB. Paste a link instead.",
"disclaimer": "This form is not an insurance contract or a legal record of a claim. Send only what is needed to quote or register the request. Health details are special-category data under the GDPR — leave them out unless the request cannot be handled without them.",
"section.policy": "Policy",
"policy_number": "Policy number",
"cover_type": "Cover",
"cover_type.auto": "Car",
"cover_type.home": "Home",
"cover_type.travel": "Travel",
"cover_type.other": "Other",
"incident_date": "Date of the incident",
"section.incident": "What happened",
"city": "City",
"description": "What happened?",
"police_report": "Was a police report filed?",
"police_report.yes": "Yes",
"police_report.no": "No",
"police_ref": "Report number",
"section.contact": "Contact",
"name": "Name",
"email": "Email",
"phone": "Phone",
"section.evidence": "Photos",
"photo": "One photo, up to 24 KB",
"photo_url": "Or a link to photos",
"section.consent": "Consent",
"consent_contact": "I agree to be contacted about this request.",
"consent_privacy": "I agree that these answers are stored so the request can be handled."
},
"pl": {
"title": "Formularz zgłoszenia szkody",
"lede": "Zgłoszenie szkody. Opisz, co się stało, bez dokumentów zbędnych przy pierwszym zgłoszeniu.",
"submit": "Wyślij",
"thanks": "Wysłano. Dziękujemy.",
"file_too_big": "Plik ma ponad 24 KB. Wklej link.",
"disclaimer": "Ten formularz nie jest umową ubezpieczenia ani prawnym zapisem szkody. Podaj tylko to, co jest potrzebne do wyceny lub rejestracji zgłoszenia. Dane o zdrowiu to szczególna kategoria w RODO — pomiń je, jeśli zgłoszenie da się obsłużyć bez nich.",
"section.policy": "Polisa",
"policy_number": "Numer polisy",
"cover_type": "Ochrona",
"cover_type.auto": "Samochód",
"cover_type.home": "Dom",
"cover_type.travel": "Podróż",
"cover_type.other": "Inne",
"incident_date": "Data zdarzenia",
"section.incident": "Co się stało",
"city": "Miasto",
"description": "Co się stało?",
"police_report": "Czy złożono zawiadomienie na policji?",
"police_report.yes": "Tak",
"police_report.no": "Nie",
"police_ref": "Numer zawiadomienia",
"section.contact": "Kontakt",
"name": "Imię",
"email": "E-mail",
"phone": "Telefon",
"section.evidence": "Zdjęcia",
"photo": "Jedno zdjęcie, do 24 KB",
"photo_url": "Albo link do zdjęć",
"section.consent": "Zgoda",
"consent_contact": "Zgadzam się na kontakt w sprawie tego zgłoszenia.",
"consent_privacy": "Zgadzam się, aby te odpowiedzi zostały zapisane w celu obsługi zgłoszenia."
},
"tr": {
"title": "Hasar bildirim formu",
"lede": "Hasar bildirimi. İlk kayıt için gerekmeyen belgeleri değil, olanı yazın.",
"submit": "Gönder",
"thanks": "Gönderildi. Teşekkürler.",
"file_too_big": "Dosya 24 KB'den büyük. Bağlantı ekleyin.",
"disclaimer": "Bu form bir sigorta sözleşmesi ya da hasarın yasal kaydı değildir. Teklif veya kayıt için gereken kadarını gönderin. Sağlık verisi GDPR'de özel niteliklidir; talep onsuz işlenebiliyorsa eklemeyin.",
"section.policy": "Poliçe",
"policy_number": "Poliçe numarası",
"cover_type": "Teminat",
"cover_type.auto": "Araç",
"cover_type.home": "Konut",
"cover_type.travel": "Seyahat",
"cover_type.other": "Diğer",
"incident_date": "Olay tarihi",
"section.incident": "Ne oldu",
"city": "Şehir",
"description": "Ne oldu?",
"police_report": "Polis tutanağı var mı?",
"police_report.yes": "Evet",
"police_report.no": "Hayır",
"police_ref": "Tutanak numarası",
"section.contact": "İletişim",
"name": "Ad",
"email": "E-posta",
"phone": "Telefon",
"section.evidence": "Fotoğraflar",
"photo": "Bir fotoğraf, en fazla 24 KB",
"photo_url": "Ya da fotoğraf bağlantısı",
"section.consent": "Onay",
"consent_contact": "Bu talep hakkında benimle iletişime geçilmesini kabul ediyorum.",
"consent_privacy": "Bu yanıtların talebin işlenmesi için saklanmasını kabul ediyorum."
}
};
let status = $state("");
let values = $state({ police_report: "" });
const t = $derived(LABELS[lang] || LABELS.en);
function readFile(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = () => {
const raw = String(reader.result || "");
const comma = raw.indexOf(",");
resolve(comma === -1 ? raw : raw.slice(comma + 1));
};
reader.onerror = () => reject(reader.error);
reader.readAsDataURL(file);
});
}
async function onSubmit(event) {
const form = event.currentTarget;
event.preventDefault();
const body = {};
const files = [];
for (const [key, value] of new FormData(form).entries()) {
if (value instanceof File) {
if (value.size) files.push([key, value]);
continue;
}
body[key] = String(value);
}
if (files.some((pair) => pair[1].size > FILE_MAX)) {
status = t.file_too_big;
return;
}
for (const [key, file] of files) {
body[key + "_filename"] = file.name;
body[key + "_data"] = await readFile(file);
}
const response = await fetch(ENDPOINT, {
method: "POST",
headers: { "Content-Type": "application/json", Accept: "application/json" },
body: JSON.stringify(body),
});
const result = await response.json();
status = result.success ? t.thanks : (result.message || "error");
}
</script>
<form onsubmit={onSubmit}>
<h1>{t.title}</h1>
<p>{t.lede}</p>
{#if t.disclaimer}<p>{t.disclaimer}</p>{/if}
<input type="hidden" name="access_key" value={accessKey}>
<div aria-hidden="true" style="position:absolute;left:-10000px;width:1px;height:1px;overflow:hidden">
<input name="botcheck" tabindex="-1" autocomplete="off">
</div>
<section><h2>{t["section.policy"]}</h2>
<label><span>{t["policy_number"]}</span><input name="policy_number" type="text" required maxlength="40"></label>
<label><span>{t["cover_type"]}</span><select name="cover_type" required><option value="">—</option><option value="auto">{t["cover_type.auto"]}</option><option value="home">{t["cover_type.home"]}</option><option value="travel">{t["cover_type.travel"]}</option><option value="other">{t["cover_type.other"]}</option></select></label>
<label><span>{t["incident_date"]}</span><input name="incident_date" type="date" required></label></section>
<section><h2>{t["section.incident"]}</h2>
<label><span>{t["city"]}</span><input name="city" type="text" required maxlength="80"></label>
<label><span>{t["description"]}</span><textarea name="description" required maxlength="1000"></textarea></label>
<label><span>{t["police_report"]}</span><select name="police_report" required bind:value={values.police_report}><option value="">—</option><option value="yes">{t["police_report.yes"]}</option><option value="no">{t["police_report.no"]}</option></select></label>
{#if values.police_report === "yes"}<label><span>{t["police_ref"]}</span><input name="police_ref" type="text" maxlength="40"></label>{/if}</section>
<section><h2>{t["section.contact"]}</h2>
<label><span>{t["name"]}</span><input name="name" type="text" required maxlength="80"></label>
<label><span>{t["email"]}</span><input name="email" type="email" required maxlength="120"></label>
<label><span>{t["phone"]}</span><input name="phone" type="tel" required maxlength="40"></label></section>
<section><h2>{t["section.evidence"]}</h2>
<label><span>{t["photo"]}</span><input name="photo" type="file" accept="image/*"></label>
<label><span>{t["photo_url"]}</span><input name="photo_url" type="url" maxlength="300"></label></section>
<section><h2>{t["section.consent"]}</h2>
<label class="check"><input name="consent_contact" type="checkbox" value="yes" required><span>{t["consent_contact"]}</span></label>
<label class="check"><input name="consent_privacy" type="checkbox" value="yes" required><span>{t["consent_privacy"]}</span></label></section>
<!-- Turnstile hook: enable Turnstile on this form in Formgong, add the api.js script, and a div.cf-turnstile with data-sitekey="YOUR_TURNSTILE_SITE_KEY". -->
<button type="submit">{t.submit}</button>
<p>{status}</p>
</form>