/* 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', howEyebrow: 'NASIL ÇALIŞIR', howTitle: 'Bütçeni yaz — satıcılar fiyatı senin için düşürsün.', howSubtitle: 'Klasik pazaryerinin tersi: aramaya değil, sana geliyor. Birden fazla satıcı bütçenin altında, birbirinin altına teklif veriyor. Sen fiyatın eridiğini izliyorsun.', step1Eyebrow: '1. Sen', step1Title: 'İstediğini ve bütçeni söyle', step1Desc: 'Ne almak istediğini bir cümleyle yaz, ödeyebileceğin maks bütçeyi belirle. Süreyi sen seçiyorsun.', step2Eyebrow: '2. Satıcılar', step2Title: 'Bütçenin altında yarışıyorlar', step2Desc: 'Birden fazla satıcı senin için rekabet ediyor. Her yeni teklif bir önceki en düşüğün altına iniyor.', step3Eyebrow: '3. Sonuç', step3Title: 'En düşük teklif senin oluyor', step3Desc: 'Süre bitince ya da sen onayladığında işlem kapanır. Cebinde kalan miktar net.', demoBudgetLabel: 'Bütçen', demoLowestLabel: 'En düşük teklif', demoSavingsLabel: 'Sen tasarruf ettin', demoSellersCompeting: 'satıcı yarışıyor', faqEyebrow: 'SIKÇA SORULAN', faqTitle: 'Aklındaki sorular', faq: [ { q: 'ListGetBuy nedir?', a: 'Klasik bir satış pazaryeri değil — alım pazaryeri. Alıcı ne aldığını ve bütçesini söyler; satıcılar bu bütçenin altında rekabet eder. Yön tersine işliyor: ürün sana geliyor, sen ürünün peşinden koşmuyorsun.' }, { q: 'Kimler satıcı olabilir?', a: 'Herkes — bireysel kullanıcı ya da firma. Telefon doğrulamasıyla satıcı moduna geçilir; istersen firma kaydı yaparak vergi belgenle şirket olarak teklif verebilirsin. Şirket satıcılar profilde "Mağaza" rozetiyle görünür.' }, { q: 'Ücretsiz mi?', a: 'Listeleme + teklif verme + mesajlaşma tamamen ücretsiz. Komisyon sadece kargolu / online ödemeli işlemlerde, alıcının bütçesinden yaptığı tasarruftan alınır. Yani sıfır cepten maliyet — kazandığın indirimden küçük bir pay platforma kalır.' }, { q: 'Elden teslimde komisyon var mı?', a: 'Hayır. Elden teslimde hiçbir komisyon yok; alıcı ile satıcı tutarı kendi aralarında halleder.' }, { q: 'Ödeme güvenliği nasıl?', a: 'Online ödemelerde Stripe Connect pazaryeri sistemi kullanılır. Ödeme alıcıdan tahsil edilir, satıcıya hemen geçmez — iki taraf da teslimi onayladığında para güvenli biçimde satıcıya aktarılır.' }, { q: 'İade ve anlaşmazlık?', a: 'İade süreçleri alıcı ile satıcı arasındadır. Mesajlaşma altyapısını biz sağlarız, çözümü taraflar kendi aralarında bulur. Mutabakata varılamazsa Stripe üzerinden anlaşmazlık (dispute) açılabilir.' }, { q: 'Süre dolarsa ne olur?', a: 'Süre bitince en düşük teklif otomatik kazanır, ödeme alınır ve satıcı kargolar. Sen istersen süre dolmadan da kabul edebilirsin.' }, ], sellerCtaEyebrow: 'SATICI MISIN?', sellerCtaTitle: 'Alıcı sana hazır geliyor.', sellerCtaDesc: 'Alıcı ne istediğini ve bütçesini söylüyor. Sen sadece teklifini ver. Reklam, mağaza yönetimi, depo yok — sadece satış.', sellerCtaButton: 'Satıcı sayfasını gör', sellerCtaBullets: [ 'Hazır talep, hazır bütçe', 'Komisyon yalnızca alıcının tasarrufundan, sadece online ödemede', 'Reklam, mağaza, depo yok', 'Stripe pazaryeri — onay sonrası güvenli aktarım', ] }, 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', howEyebrow: 'HOW IT WORKS', howTitle: 'Set your budget — sellers compete to lower the price for you.', howSubtitle: "The reverse marketplace: it comes to you, not the other way around. Multiple sellers underbid each other below your budget. You watch the price melt.", step1Eyebrow: '1. You', step1Title: 'Tell us what & your budget', step1Desc: 'Write what you want to buy in one line and set the max you would pay. You choose the time window.', step2Eyebrow: '2. Sellers', step2Title: 'They compete under your budget', step2Desc: 'Multiple sellers race for your purchase. Each new bid goes below the previous lowest.', step3Eyebrow: '3. Result', step3Title: 'The lowest bid is yours', step3Desc: 'When the timer ends or you accept, the deal is sealed. What stays in your pocket is clear.', demoBudgetLabel: 'Your budget', demoLowestLabel: 'Lowest offer', demoSavingsLabel: 'You saved', demoSellersCompeting: 'sellers competing', faqEyebrow: 'FREQUENTLY ASKED', faqTitle: 'Things you might wonder', faq: [ { q: 'What is ListGetBuy?', a: 'Not a classic selling marketplace — a buying marketplace. The buyer states what they want and their budget; sellers compete under that budget. The flow is reversed: the product comes to you instead of you chasing it.' }, { q: 'Who can be a seller?', a: 'Anyone — individuals or businesses. Sellers verify by phone; if you wish, register as a company with a tax document and bid as a business. Business sellers show a "Shop" badge on their profile.' }, { q: 'Is it free?', a: 'Posting a listing, bidding and messaging are completely free. Commission applies only on shipped / online-paid orders and comes out of the buyer\'s savings (the gap between budget and winning bid). Zero out-of-pocket cost — just a small share of what you saved.' }, { q: 'Any fee for in-person handover?', a: 'No. Zero commission on in-person handovers; the buyer and seller settle the amount between themselves.' }, { q: 'How safe is the payment?', a: 'Online payments use the Stripe Connect marketplace system. The buyer is charged but the seller is not paid immediately — funds are released to the seller only after both sides confirm delivery.' }, { q: 'Returns and disputes?', a: 'Returns are handled directly between the buyer and the seller — we provide the messaging layer; the resolution stays with them. If no agreement is reached, a Stripe dispute can be opened.' }, { q: 'What happens when time runs out?', a: 'The lowest offer wins automatically; payment is taken and the seller ships. You can also accept before the timer ends.' }, ], sellerCtaEyebrow: 'ARE YOU A SELLER?', sellerCtaTitle: 'The buyer comes ready.', sellerCtaDesc: 'The buyer tells you what they want and their budget. You just submit your offer. No ads, no storefront, no warehouse — just sales.', sellerCtaButton: 'See the seller page', sellerCtaBullets: [ 'Ready demand, ready budget', 'Commission only from buyer\'s savings, only on online payments', 'No ads, no storefront, no warehouse', 'Stripe marketplace — secure transfer after confirmation', ] }, 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', howEyebrow: 'SO FUNKTIONIERT ES', howTitle: 'Lege dein Budget fest — Verkäufer drücken den Preis für dich.', howSubtitle: 'Der umgekehrte Marktplatz: der Preis kommt zu dir, nicht du zum Preis. Mehrere Verkäufer unterbieten sich unter deinem Budget. Du siehst, wie der Preis schmilzt.', step1Eyebrow: '1. Du', step1Title: 'Sag, was du willst und dein Budget', step1Desc: 'Schreibe in einem Satz, was du kaufen möchtest, und lege das maximale Budget fest. Du wählst den Zeitraum.', step2Eyebrow: '2. Verkäufer', step2Title: 'Sie konkurrieren unter deinem Budget', step2Desc: 'Mehrere Verkäufer wetteifern. Jedes neue Angebot liegt unter dem bisherigen niedrigsten.', step3Eyebrow: '3. Ergebnis', step3Title: 'Das niedrigste Angebot gehört dir', step3Desc: 'Wenn die Zeit endet oder du annimmst, ist der Deal besiegelt. Was bei dir bleibt, ist klar.', demoBudgetLabel: 'Dein Budget', demoLowestLabel: 'Niedrigstes Angebot', demoSavingsLabel: 'Du sparst', demoSellersCompeting: 'Verkäufer im Wettbewerb', faqEyebrow: 'HÄUFIGE FRAGEN', faqTitle: 'Was dich vielleicht interessiert', faq: [ { q: 'Was ist ListGetBuy?', a: 'Kein klassischer Verkaufsmarktplatz — ein Kaufmarktplatz. Der Käufer nennt, was er sucht, und sein Budget; Verkäufer konkurrieren unter diesem Budget. Der Ablauf ist umgekehrt: das Produkt kommt zu dir, statt dass du es jagst.' }, { q: 'Wer kann verkaufen?', a: 'Jeder — Privatpersonen oder Firmen. Verkäufer verifizieren sich per Telefon; wer möchte, registriert sich als Firma mit Steuernachweis und bietet gewerblich. Geschäftliche Verkäufer tragen ein "Shop"-Badge im Profil.' }, { q: 'Ist es kostenlos?', a: 'Listings erstellen, bieten und chatten sind komplett kostenlos. Eine Provision fällt nur bei versendeten / online bezahlten Aufträgen an — und zwar aus der Ersparnis des Käufers (Differenz Budget − Gewinnergebot). Keine Auslagen, nur ein kleiner Anteil deiner Ersparnis.' }, { q: 'Gibt es eine Gebühr bei Übergabe vor Ort?', a: 'Nein. Keine Provision bei persönlicher Übergabe; Käufer und Verkäufer regeln den Betrag unter sich.' }, { q: 'Wie ist mein Geld geschützt?', a: 'Online-Zahlungen laufen über Stripe Connect (Marketplace). Der Käufer zahlt, der Verkäufer erhält das Geld aber erst, wenn beide Seiten die Übergabe bestätigt haben.' }, { q: 'Rückgaben und Streitfälle?', a: 'Rückgaben werden direkt zwischen Käufer und Verkäufer abgewickelt — wir stellen den Nachrichten-Layer; die Lösung bleibt bei euch. Bei Uneinigkeit kann ein Stripe-Dispute eröffnet werden.' }, { q: 'Was passiert, wenn die Zeit abläuft?', a: 'Das niedrigste Angebot gewinnt automatisch, die Zahlung wird abgewickelt und der Verkäufer versendet. Du kannst auch früher annehmen.' }, ], sellerCtaEyebrow: 'BIST DU VERKÄUFER?', sellerCtaTitle: 'Der Käufer kommt fertig zu dir.', sellerCtaDesc: 'Der Käufer sagt, was er möchte und sein Budget. Du gibst nur dein Angebot ab. Keine Werbung, kein Shop, kein Lager — nur Verkauf.', sellerCtaButton: 'Verkäufer-Seite ansehen', sellerCtaBullets: [ 'Bereite Nachfrage, bereites Budget', 'Provision nur aus der Käufer-Ersparnis, nur bei Online-Zahlung', 'Keine Werbung, kein Shop, kein Lager', 'Stripe-Marketplace — sichere Auszahlung nach Bestätigung', ] } }; function detectLanguage() { // Önce landing kendi anahtarı, sonra webapp anahtarı (kullanıcı /webapp'te dil değiştirdiyse de hatırla) const saved = localStorage.getItem('listgetbuy_lang') || localStorage.getItem('lgb_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, lang }) { return (
{/* Mobile Login Icon */} { e.currentTarget.style.background = 'var(--green)'; e.currentTarget.style.color = '#fff'; }} onMouseLeave={(e) => { e.currentTarget.style.background = 'var(--green-soft)'; e.currentTarget.style.color = 'var(--green-ink)'; }} >
e.target.style.opacity = 0.85} onMouseLeave={(e) => e.target.style.opacity = 1} >{labels.login}
); } function BuyerHero({ labels, lang }) { return (
{labels.badge}

{labels.heroTitle.split('. ')[0]}.
{labels.heroTitle.split('. ')[1]}

{labels.heroSubtitle}

✨ {labels.motto}
e.target.style.opacity = 0.9} onMouseLeave={(e) => e.target.style.opacity = 1} > {labels.startCTA}
window.scrollBy({ top: Math.round(window.innerHeight * 0.85), behavior: 'smooth' })} onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); window.scrollBy({ top: Math.round(window.innerHeight * 0.85), behavior: 'smooth' }); } }} style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 8, color: 'var(--green)', cursor: 'pointer', userSelect: 'none', animation: 'cueBlink 1.4s ease-in-out infinite', }} > {labels.scrollCTA}
); } function HowItWorks({ labels }) { // Animated bid demo: budget 8000, lowest bid drops 8000 → 5450 const [lowest, setLowest] = React.useState(8000); const target = 5450; const budget = 8000; React.useEffect(() => { const obs = new IntersectionObserver((entries) => { if (entries[0].isIntersecting) { // Animasyonu bir kez başlat let step = 0; const steps = [7800, 7400, 7150, 6800, 6500, 6200, 5950, 5750, 5600, 5450]; const timer = setInterval(() => { setLowest(steps[step]); step += 1; if (step >= steps.length) clearInterval(timer); }, 220); obs.disconnect(); } }, { threshold: 0.4 }); const el = document.getElementById('how-demo-anchor'); if (el) obs.observe(el); return () => obs.disconnect(); }, []); const fmt = (n) => '€ ' + n.toLocaleString('de-DE'); const pct = Math.round(((budget - lowest) / budget) * 100); const savings = budget - lowest; const steps = [ { eyebrow: labels.step1Eyebrow, title: labels.step1Title, desc: labels.step1Desc, icon: '📝' }, { eyebrow: labels.step2Eyebrow, title: labels.step2Title, desc: labels.step2Desc, icon: '⚡' }, { eyebrow: labels.step3Eyebrow, title: labels.step3Title, desc: labels.step3Desc, icon: '🏆' }, ]; return (
{labels.howEyebrow}

{labels.howTitle}

{labels.howSubtitle}

{/* Bütçe yarışı görseli */}
{labels.demoBudgetLabel}
{fmt(budget)}
{labels.demoLowestLabel}
{fmt(lowest)}
{/* Bar: budget → lowest */}
{[1,2,3,4,5].map(i => (
{['M','A','K','Y','S'][i-1]}
))}
5 {labels.demoSellersCompeting}
↓ {pct}% {labels.demoSavingsLabel} {fmt(savings)}
{/* 3 adım kartları */}
{steps.map((s, i) => (
{s.icon}
{s.eyebrow}

{s.title}

{s.desc}

))}
); } function FAQSection({ labels }) { const [open, setOpen] = React.useState(0); // ilk soru açık başlasın return (
{labels.faqEyebrow}

{labels.faqTitle}

{labels.faq.map((item, i) => { const isOpen = open === i; return (
{isOpen && (
{item.a}
)}
); })}
); } function SellerCTASection({ labels }) { return (
{labels.sellerCtaEyebrow}

{labels.sellerCtaTitle}

{labels.sellerCtaDesc}

e.target.style.opacity = 0.92} onMouseLeave={(e) => e.target.style.opacity = 1} > {labels.sellerCtaButton}
{[ { icon: '🎯', text: labels.sellerCtaBullets?.[0] }, { icon: '💰', text: labels.sellerCtaBullets?.[1] }, { icon: '📦', text: labels.sellerCtaBullets?.[2] }, { icon: '✅', text: labels.sellerCtaBullets?.[3] }, ].map((item, i) => (
{item.icon} {item.text}
))}
); } 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()); // URL ?seller veya #seller varsa satıcı sayfası aç const initialMode = (() => { if (typeof window === 'undefined') return 'alici'; const u = new URL(window.location.href); if (u.searchParams.has('seller') || u.hash === '#seller') return 'satici'; return 'alici'; })(); const [mode, setMode] = React.useState(initialMode); const [config, setConfig] = React.useState({}); const setLang = (code) => { localStorage.setItem('listgetbuy_lang', code); // Webapp aynı dili kullansın (eksilt-web/webapp `lgb_lang` okur) try { localStorage.setItem('lgb_lang', code); } catch {} 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 (
{mode === 'alici' ? (
) : (
)} {mode === 'alici' && } {mode === 'alici' && }
); } ReactDOM.createRoot(document.getElementById('root')).render();