// Miss-Scully — Animalia Versicherung (voll interaktiv: Video-Hero, Szenarien, Schätzer, FAQ)
// Lädt nach homepage-sections.jsx + subpages-content.jsx, ersetzt window.AnimaliaPage.
const CALC_BASE =
'https://animalia.ch/de/pramienrechner-versicherung-hund-katze?codeAgent=9590&breedType=';
/* ---------- Count-up hook (startet, sobald sichtbar) ---------- */
function useCountUp(target, duration) {
const ref = React.useRef(null);
const [val, setVal] = React.useState(0);
const reduced = window.useReducedMotion ? window.useReducedMotion() : false;
React.useEffect(() => {
const el = ref.current;
if (!el) return;
if (reduced || !('IntersectionObserver' in window)) { setVal(target); return; }
let started = false;
const io = new IntersectionObserver((entries) => {
entries.forEach((e) => {
if (e.isIntersecting && !started) {
started = true;
const dur = duration || 1400;
const t0 = performance.now();
const tick = (now) => {
const p = Math.min(1, (now - t0) / dur);
const ease = 1 - Math.pow(1 - p, 3);
setVal(target * ease);
if (p < 1) requestAnimationFrame(tick);else setVal(target);
};
requestAnimationFrame(tick);
}
});
}, { threshold: 0.4 });
io.observe(el);
return () => io.disconnect();
}, [target, duration, reduced]);
return [ref, val];
}
/* ---------- Video-Hero (eigenes Video je Tierart) ---------- */
function AnimaliaHero({ petType, setPetType }) {
const [videos, setVideos] = React.useState({ dog: null, cat: null });
React.useEffect(() => {
let alive = true;
const candidates = {
dog: ['/assets/animalia-hero-hund.mp4', '/assets/animalia-hero.mp4'],
cat: ['/assets/animalia-hero-katze.mp4', '/assets/animalia-hero.mp4']
};
Object.entries(candidates).forEach(([pet, list]) => {
list.reduce(
(p, url) => p.then((found) => found ||
fetch(url, { method: 'HEAD' }).then((r) => r.ok ? url : null).catch(() => null)),
Promise.resolve(null)
).then((url) => {
if (alive && url) setVideos((v) => Object.assign({}, v, { [pet]: url }));
});
});
return () => {alive = false;};
}, []);
const src = videos[petType];
return (
{src ?
: null}
Animalia Tierversicherung
{petType === 'dog' ?
'Die beste Versicherung für Ihren Hund' :
'Die beste Versicherung für Ihre Katze'}
Schützen Sie Ihr Tier gegen Krankheiten und Unfälle – ohne jede
Altersbegrenzung. Als offizieller Animalia-Partner begleiten wir Sie persönlich.
setPetType('dog')}>
Für Hunde
setPetType('cat')}>
Für Katzen
{src ? null :
Videos als «assets/animalia-hero-hund.mp4» und «assets/animalia-hero-katze.mp4» ablegen – sie erscheinen automatisch je nach Auswahl.
}
);
}
/* ---------- Animierte Zahlen ---------- */
function Stat({ value, suffix, prefix, decimals, label }) {
const [ref, val] = useCountUp(value, 1500);
const shown = (prefix || '') + val.toFixed(decimals || 0).replace('.', ',') + (suffix || '');
return (
{shown}
{label}
);
}
function AnimaliaStats() {
return (
);
}
/* ---------- Interaktive Kosten-Szenarien ---------- */
function CostScenarios({ petType }) {
const scenarios = [
{ n: 'Kreuzband-OP', cost: 4500, d: 'Eine der häufigsten Operationen bei Hunden: Riss des Kreuzbandes nach dem Toben – inkl. OP, Narkose und Nachkontrollen.' },
{ n: 'Magendrehung (Not-OP)', cost: 5800, d: 'Lebensbedrohlicher Notfall, der sofort operiert werden muss – oft nachts oder am Wochenende mit Notfallzuschlag.' },
{ n: 'Fremdkörper verschluckt', cost: 3200, d: 'Spielzeug, Stein oder Socke im Magen: Diagnostik, Endoskopie oder OP plus stationäre Überwachung.' },
{ n: 'Allergie-Abklärung', cost: 1800, d: 'Tests, Ausschlussdiät und Behandlung über mehrere Monate – Kosten, die sich leise summieren.' },
{ n: 'Zahnbehandlung', cost: 1400, d: 'Zahnstein-Entfernung unter Narkose, Extraktionen und Röntgen – bei Katzen und kleinen Hunden besonders häufig.' }];
const [sel, setSel] = React.useState(0);
const s = scenarios[sel];
const deductible = 250;
const refund = Math.round((s.cost - deductible) * 0.9);
const own = s.cost - refund;
const fmt = (n) => "CHF " + n.toLocaleString('de-CH').replace(/,/g, "'");
return (
Was kostet der Tierarzt?
Echte Fälle, echte Zahlen
Wählen Sie einen typischen Behandlungsfall – und sehen Sie sofort,
was die Versicherung übernimmt und was Sie selbst tragen.
{scenarios.map((sc, i) =>
setSel(i)}>
{sc.n}
)}
{s.n}
{s.d}
{fmt(s.cost)}
Typische Gesamtkosten (Richtwert Schweiz)
Animalia erstattet
{fmt(refund)}
Rechenbeispiel: 90 % Rückerstattung nach Selbstbehalt von CHF 250.–.
Effektive Werte abhängig von Deckung und Police.
);
}
/* ---------- Interaktiver Prämienschätzer ---------- */
function PremiumEstimator({ petType }) {
const [plan, setPlan] = React.useState(1); // 0 Compact, 1 Classic, 2 Comfort
const [age, setAge] = React.useState(3);
const planData = [
{ name: 'Compact', base: 24 },
{ name: 'Classic', base: 41 },
{ name: 'Comfort', base: 57 }];
const petFactor = petType === 'cat' ? 0.78 : 1;
const ageAdd = Math.max(0, age - 2) * 1.9;
const raw = (planData[plan].base + ageAdd) * petFactor;
const monthly = Math.round(raw);
const [display, setDisplay] = React.useState(monthly);
React.useEffect(() => {
let raf;const t0 = performance.now();const from = display;const to = monthly;
const tick = (now) => {
const p = Math.min(1, (now - t0) / 450);
const e = 1 - Math.pow(1 - p, 3);
setDisplay(Math.round(from + (to - from) * e));
if (p < 1) raf = requestAnimationFrame(tick);
};
raf = requestAnimationFrame(tick);
return () => cancelAnimationFrame(raf);
}, [monthly]);
const calc = CALC_BASE + (petType || 'dog');
return (
Prämienschätzer
In 10 Sekunden zur Richtprämie
Bewegen Sie die Regler – die geschätzte Monatsprämie passt sich sofort an.
Für die verbindliche Prämie nutzen Sie den offiziellen Animalia-Rechner.
Deckung
{planData.map((p, i) =>
setPlan(i)}>
{p.name}
)}
{(plan === 0 ?
['Unfälle'] :
plan === 1 ?
['Unfälle', 'Akute & chronische Krankheiten', 'CHF 100.– Prävention'] :
['Unfälle', 'Krankheiten', 'Erbkrankheiten & Geburtsgebrechen', 'CHF 100.– Prävention']).
map((it) =>
{it}
)}
Geschätzte Monatsprämie
CHF
{display}
/Mt.
{planData[plan].name}-Deckung · {petType === 'cat' ? 'Katze' : 'Hund'} · {age} {age === 1 ? 'Jahr' : 'Jahre'}
Verbindliche Prämie berechnen →
Unverbindliche Schätzung. Es gelten die Konditionen der Animalia.
);
}
/* ---------- Video-Sektion (interaktiv: Hund/Katze) ---------- */
function AnimaliaVideo({ petType, setPetType }) {
const frames = petType === 'cat' ?
[
{ wide: true, src: '/assets/animalia-video-katze-1.mp4', slotId: 'animalia-video-katze-1', ph: 'Video/Foto: Katze – Datei assets/animalia-video-katze-1.mp4 hochladen oder Foto hier ablegen', title: 'Neugier ohne Risiko', text: 'Auch Freigänger sind rundum versichert.', href: '#estimator', label: 'Prämie schätzen' },
{ src: '/assets/animalia-video-katze-2.mp4', slotId: 'animalia-video-katze-2', ph: 'Video/Foto: Katze beim Tierarzt – Datei assets/animalia-video-katze-2.mp4 hochladen oder Foto hier ablegen', title: 'Beim Tierarzt entspannt', text: '90 % der Kosten werden zurückerstattet.', href: '#szenarien', label: 'Beispiele ansehen' },
{ src: '/assets/animalia-video-katze-3.mp4', slotId: 'animalia-video-katze-3', ph: 'Video/Foto: Katze zu Hause – Datei assets/animalia-video-katze-3.mp4 hochladen oder Foto hier ablegen', title: 'Ein Katzenleben lang', text: 'Ohne Altersgrenze – auch für Senioren.', href: '#estimator', label: 'Prämie schätzen' }] :
[
{ wide: true, src: '/assets/animalia-video-hund-1.mp4', slotId: 'animalia-video-1', ph: 'Video/Foto: Hund & Halterin – Datei assets/animalia-video-hund-1.mp4 hochladen oder Foto hier ablegen', title: 'Sorglos unterwegs', text: 'Ohne Altersgrenze versichert – ein Hundeleben lang.', href: '#estimator', label: 'Prämie schätzen' },
{ src: '/assets/animalia-video-hund-2.mp4', slotId: 'animalia-video-2', ph: 'Video/Foto: Beim Tierarzt – Datei assets/animalia-video-hund-2.mp4 hochladen oder Foto hier ablegen', title: 'Beim Tierarzt entspannt', text: '90 % der Kosten werden zurückerstattet.', href: '#szenarien', label: 'Beispiele ansehen' },
{ src: '/assets/animalia-video-hund-3.mp4', slotId: 'animalia-video-3', ph: 'Video/Foto: Hund beim Spielen – Datei assets/animalia-video-hund-3.mp4 hochladen oder Foto hier ablegen', title: 'Toben ohne Sorgen', text: 'Unfälle sind mitversichert – weltweit.', href: '#estimator', label: 'Prämie schätzen' }];
return (
Im Schadenfall an Ihrer Seite
Sicherheit, die man spürt
setPetType('dog')}>
Hunde-Videos
setPetType('cat')}>
Katzen-Videos
{frames.map((f) =>
)}
);
}
function AnimaliaPlans() {
const plans = [
{ name: 'Animalia Compact', tag: 'Der Basisschutz', items: ['Unfälle'], pop: false },
{ name: 'Animalia Classic', tag: 'Der Bewährte', items: ['Unfälle', 'Akute und chronische Krankheiten', 'CHF 100.– geschenkt für Präventionskosten'], pop: false },
{ name: 'Animalia Comfort', tag: 'Beliebt', items: ['Unfälle', 'Akute und chronische Krankheiten', 'Erbkrankheiten und/oder Geburtsgebrechen', 'CHF 100.– für Präventionskosten'], pop: true }];
return (
Drei Deckungen
Vom Basisschutz bis zum Rundum-Paket
{plans.map((p, i) =>
{p.pop ?
Beliebt : null}
{p.tag}
{p.name}
{p.items.map((it) =>
{it}
)}
Prämie schätzen
)}
);
}
function AnimaliaBenefits() {
const benefits = [
{ t: 'Krankheiten', d: '90 % der Behandlungskosten nach Selbstbehalt – ohne Begrenzung der Versicherungssumme.' },
{ t: 'Unfälle', d: '90 % der Behandlungskosten nach Selbstbehalt, ebenfalls ohne Summenbegrenzung.' },
{ t: 'Präventionspaket', d: 'CHF 100.– pro Jahr für Vorsorge – ohne Selbstbehalt.' },
{ t: 'Weltweite Deckung', d: 'Im Notfall ist Ihr Tier auch in den Ferien weltweit versichert.' },
{ t: 'Komplementärmedizin', d: 'Bis CHF 600.–/Jahr für Osteopathie, Physiotherapie oder Akupunktur.' },
{ t: 'Tierambulanz', d: 'Bis CHF 100.–/Jahr für den Notfalltransport in die Tierklinik.' },
{ t: 'Unterbringung', d: 'Bis CHF 150.–/Jahr, falls Sie ins Spital müssen und Ihr Tier versorgt werden muss.' },
{ t: 'Unterkunftskosten', d: 'Bis CHF 200.–/Jahr bei Klinikaufenthalten – für Sie und Ihr Tier.' }];
return (
8 gute Gründe
Das leistet die Animalia Tierversicherung
Ohne Altersbegrenzung – auch Senioren auf vier Pfoten sind willkommen.
{benefits.map((b, i) =>
)}
);
}
/* ---------- Galerie (interaktiv: Hunde/Katzen, Bilder per Drag & Drop) ---------- */
function AnimaliaGallery({ petType, setPetType }) {
const sets = {
dog: [
{ id: 'animalia-gal-dog-1', src: '/assets/scully.jpg', cap: 'Scully – bestens versichert unterwegs', ph: 'Foto: Hund unterwegs' },
{ id: 'animalia-gal-dog-2', src: '/assets/westie-vet.jpg', cap: 'Beim Tierarzt ohne Kostensorgen', ph: 'Foto: Beim Tierarzt' },
{ id: 'animalia-gal-dog-3', src: '/assets/hund-toben.jpg', cap: 'Toben ohne Risiko', ph: 'Foto: Hund beim Spielen hier ablegen' }],
cat: [
{ id: 'animalia-gal-cat-1', src: '/assets/katzenbaby.jpg', cap: 'Neugier ist mitversichert', ph: 'Foto: Katze hier ablegen' },
{ id: 'animalia-gal-cat-2', src: '', cap: 'Beim Tierarzt ohne Kostensorgen', ph: 'Foto: Katze beim Tierarzt hier ablegen' },
{ id: 'animalia-gal-cat-3', src: '/assets/katze-tracker.jpg', cap: 'Freigänger? Kein Problem.', ph: 'Foto: Katze draussen hier ablegen' }]
};
const cards = sets[petType] || sets.dog;
return (
Unbeschwerte Momente
{petType === 'cat' ? 'Versichert heisst: einfach Katze sein dürfen' : 'Versichert heisst: einfach Hund sein dürfen'}
setPetType('dog')}>
Hunde
setPetType('cat')}>
Katzen
{cards.map((c, i) =>
{c.cap}
)}
);
}
/* ---------- FAQ ---------- */
function AnimaliaFaq() {
const items = [
{ q: 'Ab wann ist mein Tier versichert?', a: 'Nach Abschluss gilt eine kurze Wartefrist (Karenzfrist) für Krankheiten; Unfälle sind in der Regel schneller gedeckt. Die genauen Fristen finden Sie in Ihrer Police.' },
{ q: 'Kann ich meinen Tierarzt frei wählen?', a: 'Ja – Sie gehen zu dem Tierarzt oder der Klinik Ihres Vertrauens, in der ganzen Schweiz und im Notfall weltweit.' },
{ q: 'Wie melde ich einen Schadenfall?', a: 'Ganz einfach online: Im Animalia-Kundenbereich einloggen, Tierarztrechnung hochladen – die Rückerstattung kommt direkt auf Ihr Bankkonto.' }];
const [openKey, setOpenKey] = React.useState(items[0].q);
return (
Häufige Fragen
Gut zu wissen
{items.map((f) =>
setOpenKey(openKey === f.q ? null : f.q)}>
{f.q}
)}
);
}
/* ---------- Tweaks ---------- */
const ANIMALIA_TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
"palette": ["#B77253", "#9A5B3F", "#221C36"],
"tone": "Elegant",
"motion": "Lebendig"
}/*EDITMODE-END*/;
const ANIMALIA_PALETTES = [
["#B77253", "#9A5B3F", "#221C36"], // Kupfer (Brand)
["#5F8F6E", "#4C7A5B", "#1E2A22"], // Salbei
["#5E739E", "#4A5F89", "#1B2033"]]; // Nachtblau
function useAnimaliaTweaks() {
const [t, setTweak] = useTweaks(ANIMALIA_TWEAK_DEFAULTS);
React.useEffect(() => {
const r = document.documentElement.style;
const [accent, deep, dark] = t.palette;
r.setProperty('--accent', accent);
r.setProperty('--accent-deep', deep);
r.setProperty('--accent-tint', 'color-mix(in srgb, ' + accent + ' 14%, transparent)');
r.setProperty('--paw', 'color-mix(in srgb, ' + accent + ' 35%, transparent)');
r.setProperty('--paw-on-dark', accent);
r.setProperty('--dark', dark);
r.setProperty('--dark-2', 'color-mix(in srgb, ' + dark + ' 88%, white)');
r.setProperty('--font-display',
t.tone === 'Freundlich' ? '"Bricolage Grotesque", sans-serif' : '"DM Serif Display", serif');
document.body.dataset.tone = t.tone.toLowerCase();
document.body.dataset.motion = t.motion.toLowerCase();
}, [t]);
return [t, setTweak];
}
function AnimaliaTweaks({ t, setTweak }) {
return (
setTweak('palette', v)}>
setTweak('tone', v)}>
setTweak('motion', v)}>
);
}
/* ---------- Seite ---------- */
function AnimaliaPageInteractive() {
const [petType, setPetType] = React.useState('dog');
const [t, setTweak] = useAnimaliaTweaks();
return (
);
}
window.AnimaliaPage = AnimaliaPageInteractive;