// Reusable UI parts const { useState, useEffect, useRef } = React; function Nav({ lang, setLang, content, onContact }) { const [active, setActive] = useState("hero"); const [menuOpen, setMenuOpen] = useState(false); useEffect(() => { const onScroll = () => { const ids = content.nav.map(n => n.id); for (const id of ids) { const el = document.getElementById(id); if (!el) continue; const r = el.getBoundingClientRect(); if (r.top <= 120 && r.bottom >= 120) { setActive(id); break; } } }; window.addEventListener("scroll", onScroll, { passive: true }); return () => window.removeEventListener("scroll", onScroll); }, [content]); useEffect(() => { document.body.style.overflow = menuOpen ? "hidden" : ""; return () => { document.body.style.overflow = ""; }; }, [menuOpen]); const go = (id) => (e) => { e.preventDefault(); const el = document.getElementById(id); if (el) window.scrollTo({ top: el.offsetTop - 64, behavior: "smooth" }); setMenuOpen(false); }; return ( <>
{content.nav.map(n => ( {n.label} ))}
0312 395 58 62 {setLang && (
)}
); } function Ticker({ items }) { const doubled = [...items, ...items]; return (
{doubled.map((t, i) => {t})}
); } function WAFab({ lang }) { return (
WhatsApp {lang === "tr" ? "Hızlı yazış" : "Quick chat"}
); } function ContactModal({ open, onClose, info, lang }) { return (
e.stopPropagation()}>

{lang === "tr" ? "İletişim" : "Contact"}

{lang === "tr" ? "Telefon (7/24)" : "Phone (24/7)"}
{info.phone}
@
E-mail
{info.email}
{lang === "tr" ? "Adres" : "Address"}
{info.address}
{lang === "tr" ? "Çalışma Saatleri" : "Hours"}
{info.hours}
); } function TweaksPanel({ open, setOpen, tweaks, setTweaks }) { if (!open) return null; const colors = [ { key: "#facc15", name: "Sarı" }, { key: "#f97316", name: "Turuncu" }, { key: "#ef4444", name: "Kırmızı" }, { key: "#22d3ee", name: "Siyan" }, { key: "#a3e635", name: "Yeşil" }, ]; const set = (patch) => { const next = { ...tweaks, ...patch }; setTweaks(next); try { window.parent.postMessage({ type: "__edit_mode_set_keys", edits: patch }, "*"); } catch (e) {} }; return (
Tweaks
Vurgu rengi
{colors.map(c => (
set({ accent: c.key })} /> ))}
Tema
Dil
Ticker
); } function MapCanvas({ filter, hovered, setHovered, selected, setSelected }) { const hq = GEO.hq; const showAnkara = filter === "all" || filter === "ankara"; const showProv = filter === "all" || filter === "provinces" || (filter !== "ankara" && filter !== "all"); const activeProv = filter !== "all" && filter !== "ankara" && filter !== "provinces" ? filter : null; const isDimmed = (kind, key) => { if (filter === "all") return false; if (filter === "ankara") return kind !== "ankara"; if (filter === "provinces") return kind !== "province"; return !(kind === "province" && key === filter); }; return ( {/* Crosshair through HQ */} {/* Delivery radius rings with labels */} {[ { r: 6, label: "4 SAAT" }, { r: 14, label: "250 KM" }, { r: 24, label: "500 KM" }, ].map((ring, i) => ( {ring.label} ))} {/* HQ radial glow */} {/* Province connections from HQ */} {GEO.provinces.map((p, i) => { const dim = isDimmed("province", p.key); return ( ); })} {/* Ankara districts — small markers */} {showAnkara && GEO.ankara.map((d, i) => { const isHover = hovered && hovered.kind === "ankara" && hovered.idx === i; const isSel = selected && selected.kind === "ankara" && selected.idx === i; const r = d.zone === 1 ? 0.7 : 0.55; return ( setHovered({ kind: "ankara", idx: i, data: d })} onMouseLeave={() => setHovered(null)} onClick={() => setSelected({ kind: "ankara", idx: i, data: d })} style={{ cursor: "pointer" }}> {(isHover || isSel) && ( )} {(isHover || isSel) && ( )} ); })} {/* Province hubs and towns */} {showProv && GEO.provinces.map((p, i) => { const dim = isDimmed("province", p.key); const isActive = activeProv === p.key; return ( {/* cluster zone */} {isActive && ( )} {/* towns */} {p.towns.filter(t => !t.hub).map((t, ti) => { const isHover = hovered && hovered.kind === "town" && hovered.provKey === p.key && hovered.idx === ti; return ( setHovered({ kind: "town", provKey: p.key, idx: ti, data: { ...t, province: p.name } })} onMouseLeave={() => setHovered(null)} onClick={() => setSelected({ kind: "town", provKey: p.key, idx: ti, data: { ...t, province: p.name } })} style={{ cursor: "pointer" }}> {isHover && } {isHover && ( {t.name.toUpperCase()} )} ); })} {/* hub marker */} {(() => { const isProvHover = hovered && hovered.kind === "province" && hovered.provKey === p.key; const showLabel = isActive || isProvHover; return ( setHovered({ kind: "province", provKey: p.key, data: p })} onMouseLeave={() => setHovered(null)} onClick={() => setSelected({ kind: "province", provKey: p.key, data: p })} style={{ cursor: "pointer" }}> {showLabel ? ( {p.name} ) : ( {p.name.slice(0,3)} )} ); })()} ); })} {/* HQ marker — always on top */} HQ ); } Object.assign(window, { Nav, Ticker, WAFab, ContactModal, TweaksPanel, MapCanvas });