/* listgetbuy — landing root: header, mode toggle, hero, footer */
const MAIN_LABELS = {
tr: {
buyerLabel: 'Alıcıyım',
sellerLabel: 'Satıcıyım',
login: 'Giriş Yap',
badge: 'LİSTELE, TEKLİF AL',
heroTitle: 'Fiyatı sen kovalama. Sana gelsin.',
heroSubtitle: 'Ne almak istediğini yaz, bütçeni belirle. Satıcılar teklifleriyle rekabet etsin, fiyat sen izlerken düşsün. En iyi teklif kazansın.',
motto: 'Alan memnun, Satan memnun',
startCTA: 'Hemen Başla',
scrollCTA: 'KAYDIR, NASIL ÇALIŞTIĞINI GÖR',
footerTitle: 'Listele. Teklif al. Ucuza al.',
footerSubtitle: 'Bir tarafta ucuza alan alıcı, diğer tarafta reklamsız satan satıcı. İkisi de kazanır.',
footerStartBuyer: 'Alıcı olarak başla',
footerStartSeller: 'Satıcı olarak başla'
},
en: {
buyerLabel: 'I\'m a Buyer',
sellerLabel: 'I\'m a Seller',
login: 'Log In',
badge: 'LIST, GET OFFERS',
heroTitle: 'Don\'t chase the price. Let it come to you.',
heroSubtitle: 'Write down what you want to buy, set your budget. Sellers underbid each other, watch the price drop. The lowest offer wins.',
motto: 'Happy Buyer, Happy Seller',
startCTA: 'Get Started',
scrollCTA: 'SCROLL TO SEE HOW IT WORKS',
footerTitle: 'List. Get offers. Buy cheaper.',
footerSubtitle: 'On one side, the buyer gets it cheaper; on the other, the seller sells without ads. Both win.',
footerStartBuyer: 'Start as a buyer',
footerStartSeller: 'Start as a seller'
},
de: {
buyerLabel: 'Ich bin Käufer',
sellerLabel: 'Ich bin Verkäufer',
login: 'Einloggen',
badge: 'INSERIEREN, ANGEBOTE ERHALTEN',
heroTitle: 'Jag dem Preis nicht hinterher. Lass ihn zu dir kommen.',
heroSubtitle: 'Schreibe auf, was du kaufen möchtest, setze dein Budget. Verkäufer unterbieten sich gegenseitig, sieh zu, wie der Preis sinkt. Das niedrigste Angebot gewinnt.',
motto: 'Zufriedener Käufer, Zufriedener Verkäufer',
startCTA: 'Loslegen',
scrollCTA: 'SCROLLEN, UM ZU SEHEN WIE ES FUNKTIONIERT',
footerTitle: 'Inserieren. Angebote erhalten. Günstiger kaufen.',
footerSubtitle: 'Auf der einen Seite kauft der Käufer günstiger, auf der anderen verkauft der Verkäufer ohne Werbung. Beide gewinnen.',
footerStartBuyer: 'Als Käufer starten',
footerStartSeller: 'Als Verkäufer starten'
}
};
function detectLanguage() {
const saved = localStorage.getItem('listgetbuy_lang');
if (saved && ['tr', 'en', 'de'].includes(saved)) return saved;
const browserLang = (navigator.language || navigator.userLanguage || 'tr').toLowerCase();
if (browserLang.startsWith('de')) return 'de';
if (browserLang.startsWith('en')) return 'en';
return 'tr';
}
function Header({ mode, setMode, labels }) {
return (
);
}
function Footer({ setMode, lang, setLang, labels }) {
return (
);
}
function BenefitsSection({ mode, lang }) {
const buyerBenefits = {
tr: [
{
title: 'Düşen Fiyatlar',
desc: 'Satıcılar teklif verdikçe fiyat düşer, aradığınız ürünü bütçenizin altında bir fiyata kolayca satın alırsınız.',
img: 'https://images.unsplash.com/photo-1561069934-eee225952461?q=80&w=3870&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D'
},
{
title: 'Güvenli Ödeme',
desc: 'Ödemeniz havuzda güvenle bekler. Siz ürünü teslim alıp onaylayana kadar satıcıya aktarılmaz.',
img: 'https://images.unsplash.com/photo-1698128255721-f9a9ad2da830?q=80&w=3870&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D'
},
{
title: 'Avantajlı Rekabet',
desc: 'Her online satılan ürünün pazarlaması için harcanan para rekabette herkes için avantaj yaratır. Zaman kazandırır, hızlı ticareti sağlar.',
img: 'https://images.unsplash.com/photo-1695654686808-8e90bd2c6923?q=80&w=3870&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D'
}
],
en: [
{
title: 'Dropping Prices',
desc: 'As sellers compete and make lower offers, watch the price drop and buy the product below your budget.',
img: 'https://images.unsplash.com/photo-1561069934-eee225952461?q=80&w=3870&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D'
},
{
title: 'Secure Payment',
desc: 'Your payment is kept safely in escrow. It will not be released to the seller until you receive and approve the item.',
img: 'https://images.unsplash.com/photo-1698128255721-f9a9ad2da830?q=80&w=3870&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D'
},
{
title: 'Advantageous Competition',
desc: 'The budget spent on marketing for each online-sold product creates an advantage for everyone in the competition, saving time and enabling fast trade.',
img: 'https://images.unsplash.com/photo-1695654686808-8e90bd2c6923?q=80&w=3870&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D'
}
],
de: [
{
title: 'Sinkende Preise',
desc: 'Da Verkäufer miteinander konkurrieren und niedrigere Angebote machen, sinkt der Preis unter Ihr Budget.',
img: 'https://images.unsplash.com/photo-1561069934-eee225952461?q=80&w=3870&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D'
},
{
title: 'Sichere Zahlung',
desc: 'Ihre Zahlung wird sicher auf einem Treuhandkonto verwahrt und erst freigegeben, wenn Sie den Artikel erhalten und genehmigen.',
img: 'https://images.unsplash.com/photo-1698128255721-f9a9ad2da830?q=80&w=3870&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D'
},
{
title: 'Vorteilhafter Wettbewerb',
desc: 'Das für das Marketing jedes online verkauften Produkts ausgegebene Budget schafft einen Vorteil für alle im Wettbewerb, spart Zeit und ermöglicht schnellen Handel.',
img: 'https://images.unsplash.com/photo-1695654686808-8e90bd2c6923?q=80&w=3870&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D'
}
]
};
const sellerBenefits = {
tr: [
{
title: 'Hazır Müşteri',
desc: 'Müşteri aramakla zaman kaybetmeyin. Alıcısı ve bütçesi belli olan hazır taleplere anında teklif verin.',
img: 'https://images.unsplash.com/photo-1556742049-0cfed4f6a45d?auto=format&fit=crop&w=1600&h=1000&q=80'
},
{
title: 'Sıfır Reklam Gideri',
desc: 'Görünmek için vitrin dopingi veya arama reklamı ücreti ödemezsiniz. Rekabetinizi sadece fiyatınızla yaparsınız.',
img: 'https://images.unsplash.com/photo-1460925895917-afdab827c52f?auto=format&fit=crop&w=1600&h=1000&q=80'
},
{
title: 'Hızlı Satış',
desc: 'En iyi teklifi siz verdiğinizde süre bitiminde satış doğrudan size kalır, pazarlık süreciyle uğraşmazsınız.',
img: 'https://images.unsplash.com/photo-1461896836934-ffe607ba8211?auto=format&fit=crop&w=1600&h=1000&q=80'
}
],
en: [
{
title: 'Ready Customers',
desc: 'Do not waste time searching for clients. Bid directly on active demands with established buyer budgets.',
img: 'https://images.unsplash.com/photo-1556742049-0cfed4f6a45d?auto=format&fit=crop&w=1600&h=1000&q=80'
},
{
title: 'Zero Ad Spend',
desc: 'No need to pay for search prominence or listing boosts. Compete pure and clean with your best price.',
img: 'https://images.unsplash.com/photo-1460925895917-afdab827c52f?auto=format&fit=crop&w=1600&h=1000&q=80'
},
{
title: 'Fast Sales',
desc: 'If yours is the lowest offer when time expires, the sale is awarded directly to you. No extra negotiation.',
img: 'https://images.unsplash.com/photo-1461896836934-ffe607ba8211?auto=format&fit=crop&w=1600&h=1000&q=80'
}
],
de: [
{
title: 'Bereite Kunden',
desc: 'Suchen Sie nicht lange nach Kunden. Bieten Sie direkt auf aktive Nachfragen mit bereits festgelegten Budgets.',
img: 'https://images.unsplash.com/photo-1556742049-0cfed4f6a45d?auto=format&fit=crop&w=1600&h=1000&q=80'
},
{
title: 'Keine Werbekosten',
desc: 'Zahlen Sie keine Gebühren für Hervorhebungen oder Banner. Konkurrieren Sie fair und direkt über Ihren Preis.',
img: 'https://images.unsplash.com/photo-1460925895917-afdab827c52f?auto=format&fit=crop&w=1600&h=1000&q=80'
},
{
title: 'Schneller Verkauf',
desc: 'Wenn Sie bei Ablauf der Zeit das beste Angebot haben, geht der Zuschlag direkt an Sie. Kein weiteres Verhandeln.',
img: 'https://images.unsplash.com/photo-1461896836934-ffe607ba8211?auto=format&fit=crop&w=1600&h=1000&q=80'
}
]
};
const pool = mode === 'alici' ? buyerBenefits : sellerBenefits;
const currentSlides = pool[lang] || pool.tr;
return (
{currentSlides.map((slide, index) => (
{/* Dark Overlay */}
{/* Text Content */}
{slide.title}
{slide.desc}
))}
);
}
function App() {
const [lang, setLangState] = React.useState(detectLanguage());
const [mode, setMode] = React.useState('alici');
const [config, setConfig] = React.useState({});
const setLang = (code) => {
localStorage.setItem('listgetbuy_lang', code);
setLangState(code);
};
React.useEffect(() => { window.scrollTo({ top: 0 }); }, [mode]);
React.useEffect(() => {
const SUPABASE_URL = 'https://vucrkhsjjknggfdmvpjf.supabase.co';
const SUPABASE_ANON_KEY = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InZ1Y3JraHNqamtuZ2dmZG12cGpmIiwicm9sZSI6ImFub24iLCJpYXQiOjE3ODA3NzM1MjIsImV4cCI6MjA5NjM0OTUyMn0.oqzRrMpDOsvvDc6toUUi4-EcSBFn2IifAyW526YswDI';
fetch(`${SUPABASE_URL}/rest/v1/app_config?select=*`, {
headers: {
'apikey': SUPABASE_ANON_KEY,
'Authorization': `Bearer ${SUPABASE_ANON_KEY}`
}
})
.then(res => res.json())
.then(data => {
if (Array.isArray(data)) {
const cfg = Object.fromEntries(data.map(r => [r.key, r.value]));
setConfig(cfg);
}
})
.catch(err => console.error('Failed to load SEO configs:', err));
}, []);
React.useEffect(() => {
const defaultTitles = {
tr: 'ListGetBuy — Fiyatı sen kovalama. Sana gelsin.',
en: "ListGetBuy — Don't chase the price. Let it come to you.",
de: 'ListGetBuy — Jag dem Preis nicht hinterher. Lass ihn zu dir kommen.'
};
const defaultDescriptions = {
tr: 'Ne almak istediğini yaz, bütçeni belirle. Satıcılar teklifleriyle rekabet etsin, fiyat sen izlerken düşsün. Alan memnun, Satan memnun!',
en: 'Write down what you want to buy, set your budget. Sellers underbid each other, watch the price drop. Happy Buyer, Happy Seller!',
de: 'Schreibe auf, was du kaufen möchtest, setze dein Budget. Verkäufer unterbieten sich gegenseitig, sieh zu, wie der Preis sinkt. Zufriedener Käufer, Zufriedener Verkäufer!'
};
const titleKey = `seo_title_${lang}`;
const descKey = `seo_desc_${lang}`;
const title = config[titleKey] || defaultTitles[lang] || defaultTitles.tr;
const description = config[descKey] || defaultDescriptions[lang] || defaultDescriptions.tr;
const keywords = config['seo_keywords'] || '';
const ogImage = config['seo_image'] || '';
const gaId = config['seo_google_analytics'] || '';
document.title = title;
// Helper to update meta tags
const updateMetaTag = (name, content, isProperty = false) => {
if (!content) return;
const attr = isProperty ? 'property' : 'name';
let el = document.querySelector(`meta[${attr}="${name}"]`);
if (!el) {
el = document.createElement('meta');
el.setAttribute(attr, name);
document.head.appendChild(el);
}
el.content = content;
};
updateMetaTag('description', description);
if (keywords) updateMetaTag('keywords', keywords);
updateMetaTag('og:title', title, true);
updateMetaTag('og:description', description, true);
if (ogImage) updateMetaTag('og:image', ogImage, true);
updateMetaTag('twitter:title', title);
updateMetaTag('twitter:description', description);
if (ogImage) updateMetaTag('twitter:image', ogImage);
if (gaId) {
if (!window.GA_INJECTED) {
window.GA_INJECTED = true;
const script = document.createElement('script');
script.async = true;
script.src = `https://www.googletagmanager.com/gtag/js?id=${gaId}`;
document.head.appendChild(script);
const initScript = document.createElement('script');
initScript.innerHTML = `
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', '${gaId}');
`;
document.head.appendChild(initScript);
}
}
}, [lang, config]);
const labels = MAIN_LABELS[lang] || MAIN_LABELS.tr;
return (