// Miss-Scully — Tractive GPS Seite (interaktiv) // Lädt nach homepage-sections.jsx + subpages-content.jsx und ersetzt window.TractivePage. const TRACTIVE_LINK = 'https://t.adcell.com/p/click?promoId=517821&slotId=95722'; const TRACTIVE_CAT_LINK = 'https://t.adcell.com/p/click?promoId=517856&slotId=95722'; /* ---------- photo gallery strip ---------- */ function TrackerGallery({ prefix, captions }) { return (
{captions.map((c, i) =>
{c}
)}
); } /* ---------- live map demo ---------- */ function LiveMapDemo({ petName, introText }) { const NAME = petName || 'Scully'; const reduced = useReducedMotion(); const [fenceOn, setFenceOn] = React.useState(true); const [alarm, setAlarm] = React.useState(false); const [pinging, setPinging] = React.useState(false); const [running, setRunning] = React.useState(true); const [liveMode, setLiveMode] = React.useState(true); const [fence, setFence] = React.useState({ x: 44, y: 56, r: 26 }); const [stats, setStats] = React.useState({ speed: '0,0', lat: '47.39210', lng: '8.50884', battery: 98, age: 0 }); const mapRef = React.useRef(null); const dogRef = React.useRef(null); const trailRef = React.useRef(null); const stateRef = React.useRef({ seg: 0, t: 0, trail: [], lastTrail: 0, disp: { x: 30, y: 62 }, lastJump: 0, prev: { x: 30, y: 62 }, start: performance.now(), lastStats: 0 }); const refs = React.useRef({}); refs.current = { fenceOn, running, liveMode, fence }; // waypoints in % of map (x, y) — a stroll around the quartier const PATH = [ [30, 62], [42, 48], [55, 40], [68, 34], [78, 26], [84, 38], [74, 50], [62, 58], [52, 70], [38, 76], [26, 72]]; React.useEffect(() => { if (reduced) { if (dogRef.current) { dogRef.current.style.left = '42%'; dogRef.current.style.top = '52%'; } return; } let raf; const SPEED = 0.0022; const step = () => { const s = stateRef.current; const R = refs.current; if (R.running) { s.t += SPEED * 16; if (s.t >= 1) { s.t = 0; s.seg = (s.seg + 1) % PATH.length; } } const a = PATH[s.seg]; const b = PATH[(s.seg + 1) % PATH.length]; const tt = s.t * s.t * (3 - 2 * s.t); const x = a[0] + (b[0] - a[0]) * tt; const y = a[1] + (b[1] - a[1]) * tt; // Anzeige-Position: flüssig im Live-Modus, sonst diskrete GPS-Pings alle 2,5 s const now = performance.now(); if (R.liveMode || now - s.lastJump > 2500) { s.disp = { x: x, y: y }; s.lastJump = now; } if (dogRef.current) { dogRef.current.style.left = s.disp.x + '%'; dogRef.current.style.top = s.disp.y + '%'; } // Positionsverlauf if (R.running && now - s.lastTrail > 420) { s.lastTrail = now; s.trail.push([s.disp.x, s.disp.y]); if (s.trail.length > 16) s.trail.shift(); if (trailRef.current) { trailRef.current.innerHTML = s.trail. map(([tx, ty], i) => ''). join(''); } } // Statuswerte ~2× pro Sekunde if (now - s.lastStats > 600) { const dx0 = x - s.prev.x, dy0 = y - s.prev.y; const dist = Math.sqrt(dx0 * dx0 + dy0 * dy0); const speed = R.running ? dist / ((now - s.lastStats) / 1000) * 1.9 : 0; s.prev = { x: x, y: y }; s.lastStats = now; setStats({ speed: speed.toFixed(1).replace('.', ','), lat: (47.3921 + (56 - y) * 0.00012).toFixed(5), lng: (8.50884 + (x - 44) * 0.00018).toFixed(5), battery: Math.max(60, Math.round(98 - (now - s.start) / 60000)), age: R.liveMode ? 0 : Math.max(0, Math.round((now - s.lastJump) / 1000)) }); } // Zaun-Prüfung gegen die angezeigte Position const dx = s.disp.x - R.fence.x, dy = s.disp.y - R.fence.y; setAlarm(R.fenceOn && Math.sqrt(dx * dx + dy * dy) > R.fence.r); raf = requestAnimationFrame(step); }; raf = requestAnimationFrame(step); return () => cancelAnimationFrame(raf); }, [reduced]); // Zaun mit der Maus verschieben const startFenceDrag = (e) => { e.preventDefault(); const map = mapRef.current; if (!map) return; const move = (ev) => { const r = map.getBoundingClientRect(); const nx = Math.min(92, Math.max(8, (ev.clientX - r.left) / r.width * 100)); const ny = Math.min(90, Math.max(10, (ev.clientY - r.top) / r.height * 100)); setFence((f) => ({ x: nx, y: ny, r: f.r })); }; const up = () => { window.removeEventListener('pointermove', move); window.removeEventListener('pointerup', up); }; window.addEventListener('pointermove', move); window.addEventListener('pointerup', up); }; const ping = () => { setPinging(true); setTimeout(() => setPinging(false), 2600); }; return (

So fühlt sich Tractive an

Probieren Sie die Live-Ortung aus

{introText || 'Eine kleine Demo: Scully dreht ihre Runde durchs Quartier. Schalten Sie den virtuellen Zaun ein und beobachten Sie, was passiert, wenn sie die sichere Zone verlässt.'}

Pfotenweg {fenceOn ?
: null}
Zuhause
{NAME} · {liveMode ? 'live' : 'GPS'}
{alarm ?
Weglaufalarm! {NAME} hat die sichere Zone verlassen.
: null}
{stats.speed} km/h {stats.lat}° N, {stats.lng}° O Akku {stats.battery} % {liveMode ? 'Update: live' : 'Update: vor ' + stats.age + ' s'}
{fenceOn ? : null}

Tipp: Ziehen Sie den virtuellen Zaun mit der Maus an eine neue Stelle – oder schalten Sie den Live-Modus aus, um echte GPS-Pings im 2,5-Sekunden-Takt zu sehen.

); } /* ---------- feature tabs ---------- */ function FeatureTabs() { const [tab, setTab] = React.useState(0); const groups = [ { label: 'Ortung & Sicherheit', items: [ { t: 'Live-Tracking', d: 'Der Standort Ihres Hundes in Echtzeit – im Live-Modus alle paar Sekunden aktualisiert.' }, { t: 'Virtuelle Zäune', d: 'Sichere Zonen definieren und sofort einen Weglaufalarm erhalten, wenn Ihr Hund sie verlässt.' }, { t: 'Positionsverlauf', d: 'Zurückgelegte Wege und Lieblingsorte nachvollziehen – mit Premium bis zu 365 Tage zurück.' }, { t: 'Familienfreigabe', d: 'Mehrere Personen können denselben Tracker in der App mitverfolgen.' }] }, { label: 'Gesundheit & Verhalten', items: [ { t: 'Aktivität & Schlaf', d: 'Bewegung und Ruhephasen im Blick – wie ein Fitnesstracker für Ihren Hund.' }, { t: 'Vitalwerte', d: 'Herz- und Atemfrequenz in Ruhe beobachten und Veränderungen früh erkennen.' }, { t: 'Gesundheitswarnungen', d: 'Benachrichtigung, wenn sich Aktivität, Schlaf oder Vitalwerte auffällig verändern.' }, { t: 'Bell- & Kratzverhalten', d: 'Hinweise auf Trennungsangst oder mögliche Hautprobleme – bevor sie gross werden.' }] }]; return (

Funktionen

Mehr als nur ein GPS-Punkt

{groups.map((g, i) => )}
{groups[tab].items.map((f) =>
{f.t}

{f.d}

)}
); } /* ---------- model comparison ---------- */ function ModelPicker() { const models = [ { name: 'DOG 6', tag: 'Der Klassiker', weight: 'Für Hunde ab ca. 4 kg', battery: 'Bis zu 14 Tage Akku', batteryNote: 'mit Energiesparzonen, sonst bis zu 6 Tage', dims: '7,2 × 2,9 × 1,8 cm · ca. 40 g', bark: true, scratch: true }, { name: 'DOG 6 XL', tag: 'Ausdauer-Champion', weight: 'Für Hunde ab ca. 20 kg', battery: 'Bis zu 6 Wochen Akku', batteryNote: 'mit Energiesparzonen, sonst bis zu 20 Tage', dims: '8,4 × 4,8 × 2,0 cm · ca. 70 g', bark: true, scratch: true }, { name: 'DOG XL Adventure', tag: 'Für Grosse & Wilde', weight: 'Für Hunde ab ca. 25 kg', battery: 'Bis zu 30 Tage Akku', batteryNote: 'mit Energiesparzonen, sonst bis zu 15 Tage', dims: '8,9 × 5,1 × 2,3 cm · ca. 115 g', bark: false, scratch: false }]; const [sel, setSel] = React.useState(0); const m = models[sel]; const always = [ '100 % wasserdicht (IP68)', 'Bissfestes Glasfasergehäuse', 'LED-Licht & Signalton', 'Funktioniert in über 175 Ländern']; return (

Welcher Tracker passt?

Wählen Sie nach Grösse Ihres Hundes

{models.map((mo, i) => )}

{m.tag}

{m.name}

Bei Tractive ansehen
Empfohlen {m.weight}
Akku {m.battery} {m.batteryNote}
Grösse & Gewicht {m.dims}
Verhaltens-Monitoring {m.bark ? 'Bellen & Kratzen ✓' : 'Nicht enthalten'}
{always.map((a) => {a} )}

Alle Tracker benötigen ein Tractive-Abo (eingebaute SIM, unbegrenzte Reichweite, jederzeit kündbar). Aktuelle Schweizer Preise sehen Sie direkt bei Tractive.

); } /* ---------- FAQ accordion ---------- */ function TractiveFaq() { const faqs = [ { q: 'Wie funktioniert der Tractive GPS Tracker?', a: 'Wie ein kleines Handy am Halsband: Der Tracker hat eine eingebaute SIM-Karte, ortet Ihren Hund per GPS und schickt den Standort über das Mobilfunknetz an Ihre App.' }, { q: 'Welche Reichweite hat der Tracker?', a: 'Es gibt keine Distanzgrenze. Solange Mobilfunkabdeckung besteht, sehen Sie den Standort – in über 175 Ländern, auch aus den Ferien.' }, { q: 'Warum braucht es ein Abo?', a: 'Das Abo deckt die Mobilfunkgebühren der eingebauten SIM-Karte ab – ohne Roaming-Kosten und ohne Distanzlimit. Es ist jederzeit kündbar.' }, { q: 'Welcher Tracker passt zu meinem Hund?', a: 'Der DOG 6 eignet sich für Hunde ab ca. 4 kg. Für grosse Hunde ab ca. 20 kg gibt es den DOG 6 XL mit deutlich längerer Akkulaufzeit.' }, { q: 'Ist der Tracker wasserdicht?', a: 'Ja, alle Modelle sind 100 % wasserdicht (IP68) – schwimmen, regnen, durch den Bach toben ist alles kein Problem.' }, { q: 'Erkennt Tractive Krankheiten?', a: 'Nein. Der Tracker zeigt Veränderungen bei Aktivität, Schlaf und Vitalwerten – ein Frühwarnsystem. Für Diagnosen ist immer die Tierarztpraxis zuständig.' }]; const [open, setOpen] = React.useState(0); return (

Häufige Fragen

Gut zu wissen

{faqs.map((f, i) =>

{f.a}

)}
); } /* ---------- page ---------- */ function DogTractiveBody() { const stats = [ '175+ Länder', '100 % wasserdicht (IP68)', 'Bis zu 6 Wochen Akku', 'Trustpilot 4,7 / 5']; return (
{stats.map((s) => {s} )}
Tractive GPS · Live

Robust gebaut

Gemacht für Abenteuer aller Art

100 % wasserdicht

IP68-zertifiziert – schwimmt mit, ohne zu murren.

Bissfestes Glasfasergehäuse

Übersteht auch wilde Spielstunden im Hundepark.

LED-Licht & Signalton

Per App aktivierbar – ideal für Nachtspaziergänge.

USB-C, schnell geladen

Klammern befestigen den Tracker sicher am Halsband.

); } function TractivePageInteractive() { const [petType, setPetType] = React.useState('dog'); const CatBody = window.CatTractiveBody; const isDog = petType === 'dog' || !CatBody; return (
Bei Tractive bestellen
{isDog ? : }
); } window.TractivePage = TractivePageInteractive; window.LiveMapDemo = LiveMapDemo; window.TrackerGallery = TrackerGallery; window.TRACTIVE_CAT_AFFILIATE = TRACTIVE_CAT_LINK;