// Światowid landing, hero + sections

const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
  "theme": "bone",
  "logoAnim": "flip"
}/*EDITMODE-END*/;

const THEMES = {
  dark: { label: 'OBSIDIAN', attr: '' },
  bone: { label: 'BONE', attr: 'bone' },
  steel: { label: 'STEEL', attr: 'steel' },
  blood: { label: 'BLOOD', attr: 'blood' },
};

// Client cases, rotating hero reel. Each case maps to a translation key prefix
// (case{Key}Tag / case{Key}Sub) and a Pexels CDN mp4.
const USE_CASES = [
  { key: 'heavy',   code: 'HV-01', src: 'https://videos.pexels.com/video-files/5121751/5121751-uhd_2560_1440_25fps.mp4' },
  { key: 'defense', code: 'DF-02', src: 'https://videos.pexels.com/video-files/7255101/7255101-uhd_2732_1440_30fps.mp4' },
  { key: 'markets', code: 'MX-03', src: 'https://videos.pexels.com/video-files/7578613/7578613-uhd_2732_1440_25fps.mp4' },
  { key: 'pharma',  code: 'LG-04', src: 'https://videos.pexels.com/video-files/6585382/6585382-uhd_2560_1440_30fps.mp4' },
];
const CASE_DURATION_MS = 7500;

// ─── i18n ─────────────────────────────────────────────────────────────────
const LANGS = [
  { code: 'en', label: 'EN', name: 'English' },
  { code: 'pl', label: 'PL', name: 'Polski' },
  { code: 'cs', label: 'CS', name: 'Čeština' },
  { code: 'sk', label: 'SK', name: 'Slovenčina' },
  { code: 'et', label: 'ET', name: 'Eesti' },
  { code: 'lt', label: 'LT', name: 'Lietuvių' },
  { code: 'uk', label: 'UK', name: 'Українська' },
];

const TRANSLATIONS = {
  en: {
    navHome: 'Home',
    navCapabilities: 'Capabilities',
    navBlog: 'News',
    navCareers: 'Careers',
    navRequestAccess: 'REQUEST ACCESS →',
    hero1: 'THE AI THAT',
    heroSees: 'SEES',
    heroEverything: 'EVERYTHING',
    heroBefore: 'BEFORE',
    heroItHappens: 'IT HAPPENS.',
    heroBig: 'ŚWIATOWID SEES EVERYTHING',
    heroSub: 'From raw data to finished insights.',
    heroCtaAccess: 'Request access',
    heroCtaBrief: 'Read capabilities brief',
    caseKicker: 'Deployed across',
    case_pharma_tag: 'Logistics',
    case_pharma_sub: 'Containers, freight lanes and warehouses in full chain-of-custody view.',
    case_markets_tag: 'Finance',
    case_markets_sub: 'Sportsbooks and exchanges list new markets from live Światowid signal.',
    case_heavy_tag: 'Industry',
    case_heavy_sub: 'Cement and steel deliveries aligned to furnace and kiln cadence.',
    case_defense_tag: 'Defense',
    case_defense_sub: 'Battlefield intelligence, troop movements and attack planning under one console.',
    pill_pharma_line: 'Every pallet, on time.',
    pill_markets_line: 'Price the unpriced.',
    pill_heavy_line: 'Keep the furnace fed.',
    pill_defense_line: 'Clarity under fire.',
    splitCivil: 'CIVILIAN',
    splitMilit: 'MILITARY',
    splitCaption: 'Drag to split, one engine, two doctrines.',
    dfIngest: 'INGEST.',
    dfFuse: 'FUSE.',
    dfEmit: 'EMIT.',
    dfDesc: 'Raw signals stream in from prediction markets, raw-material telemetry, satellites and OSINT. The core fuses them in sub-40ms and emits strictly-partitioned products to commercial and defense endpoints.',
    capsTitleA: 'ONE ENGINE.',
    capsTitleB: 'TWO DOCTRINES.',
    capsDesc: 'Światowid exposes the same forecasting substrate to commercial and defense clients through strictly-partitioned endpoints. You choose the blade; the engine is one.',
    cap1Title: 'Market Genesis',
    cap1Desc: 'Generate novel prediction markets for gaming and fintech partners from live real-world signals.',
    cap2Title: 'Conflict Forecast',
    cap2Desc: 'Battalion-level movement probabilities, 6–72h horizon, fused from OSINT, SIGINT, and logistics telemetry.',
    cap3Title: 'Raw Material Flows',
    cap3Desc: 'Copper, lithium, grain, LNG, shipment-level visibility from 312 ports and 1,100 rail nodes.',
    cap4Title: 'Sentiment Weighting',
    cap4Desc: 'Cross-lingual narrative tracking across 47 platforms with provenance scoring and bot filtering.',
    cap5Title: 'Odds Arbitrage',
    cap5Desc: 'Cross-book drift detection and synthetic market creation with automatic liquidity hedging.',
    cap6Title: 'Scenario Simulation',
    cap6Desc: 'Monte Carlo worldlines at 10⁶ samples. Counterfactual branching with named-actor policy models.',
    ptrTitleA: 'DEPLOYED.',
    ptrTitleB: 'WHERE DECISIONS COST MONEY.',
    ptrDesc: 'Partners operate under bilateral NDAs. Logos are not disclosed publicly. Procurement inquiries route through your government liaison or via our commercial desk.',
    ptr1Label: 'NATO-TIER MoD', ptr1Desc: 'Member state deployments',
    ptr2Label: 'FTSE-100 MINERS', ptr2Desc: 'Raw material supply partners',
    ptr3Label: 'LICENSED SPORTSBOOKS', ptr3Desc: 'EU & UK regulated operators',
    ptr4Label: 'PREDICTION-MARKETS', ptr4Desc: 'L1 data-sharing agreements',
    ptr5Label: 'SOVEREIGN FUNDS', ptr5Desc: 'Strategic intelligence tier',
    duTitleA: 'FOR THE HOUSE.',
    duTitleB: 'FOR THE STATE.',
    duDesc: 'Strictly partitioned access. Identical substrate. One interface serves the sportsbook spinning up a new "EU-summit outcome" market; the other briefs the J2 on Kharkiv oblast resupply windows.',
    duCommLabel: 'COMMERCIAL · GAMING & FINTECH',
    duCommThin: 'Spin up',
    duCommTitle: 'NEW MARKETS',
    duCommDesc: 'Gambling operators and prediction-market platforms use Światowid to invent new wager categories on the fly, backed by live pricing, liquidity recommendations, and automatic hedge books.',
    duCommB1: 'Automatic market genesis from live news stream',
    duCommB2: 'Cross-book drift & sharp-money detection',
    duCommB3: 'Synthetic liquidity with risk-bounded exposure',
    duCommB4: 'Regulator-ready provenance on every quote',
    duDefLabel: 'DEFENSE · STRATEGIC FORECASTING',
    duDefThin: 'See the',
    duDefTitle: 'NEXT MOVE',
    duDefDesc: 'Defense ministries and allied J2 cells use Światowid for 6–72h tactical forecasts on force movement, logistics anomalies, and political escalation windows, cross-validated against open markets.',
    duDefB1: 'Battalion-resolution movement probability grids',
    duDefB2: 'Logistics signature extraction from AIS + rail',
    duDefB3: 'Narrative early-warning & info-ops detection',
    duDefB4: 'Air-gapped on-prem deployment available',
    ctaTitleA: 'REQUEST',
    ctaTitleB: 'CLEARANCE',
    ctaDesc: 'Światowid is not self-serve. Access is granted after sovereignty-alignment review and vendor vetting. Expect 14–28 days to first briefing.',
    ctaApply: 'Apply for access',
    ctaDownload: 'Download capabilities brief (PDF)',
    footSecurity: 'Security',
    footExport: 'Export controls',
    footEthics: 'Ethics council',
    footDisclosures: 'Disclosures',
    reqaKicker: 'Request access',
    reqaTitle: 'Tell us about the engagement.',
    reqaLede: 'Pick the area of our offering you want to tackle. We will route the request to the partnerships team and reply within 14–28 days.',
    reqaFieldName: 'Name',
    reqaFieldEmail: 'Work email',
    reqaFieldOrg: 'Organization',
    reqaFieldArea: 'Project area',
    reqaFieldMessage: 'Message',
    reqaFieldMessagePh: 'Outcome you are trying to reach, timeline, and constraints.',
    reqaArea_heavy_industry: 'Heavy industry',
    reqaArea_markets: 'Market design',
    reqaArea_defense: 'Defense',
    reqaArea_pharma: 'Logistics',
    reqaArea_general: 'Something else',
    reqaSend: 'Send request',
    reqaSent: 'Open in mail client',
    reqaRoutedTo: 'Routed to',
    reqaClose: 'Close',
    reqaCtaOpen: 'Request access',
    reqaMailSubjectPrefix: 'Request access',
  },
  pl: {
    navHome: 'Główna',
    navCapabilities: 'Możliwości',
    navBlog: 'Newsy',
    navCareers: 'Kariera',
    navRequestAccess: 'POPROŚ O DOSTĘP →',
    hero1: 'SZTUCZNA INTELIGENCJA, KTÓRA',
    heroSees: 'WIDZI',
    heroEverything: 'WSZYSTKO',
    heroBefore: 'ZANIM',
    heroItHappens: 'SIĘ WYDARZY.',
    heroBig: 'ŚWIATOWID WIDZI WSZYSTKO',
    heroSub: 'Od surowych danych po gotowe wnioski.',
    heroCtaAccess: 'Poproś o dostęp',
    heroCtaBrief: 'Przeczytaj zestawienie możliwości',
    caseKicker: 'Wdrożenia u klientów',
    case_pharma_tag: 'Logistyka',
    case_pharma_sub: 'Kontenery, korytarze frachtowe i magazyny w pełnym widoku łańcucha dostaw.',
    case_markets_tag: 'Finanse',
    case_markets_sub: 'Bukmacherzy i giełdy otwierają rynki na podstawie sygnału Światowida.',
    case_heavy_tag: 'Przemysł',
    case_heavy_sub: 'Dostawy surowca do cementowni i hut w rytmie pieca.',
    case_defense_tag: 'Obronność',
    case_defense_sub: 'Analiza pola walki, ruchy wojsk i planowanie operacji w jednej konsoli.',
    pill_pharma_line: 'Każda paleta na czas.',
    pill_markets_line: 'Wycena tego, co nienotowane.',
    pill_heavy_line: 'Piec nigdy nie stoi pusty.',
    pill_defense_line: 'Jasność pod ogniem.',
    splitCivil: 'CYWILNY',
    splitMilit: 'MILITARNY',
    splitCaption: 'Przesuń, aby podzielić, jeden silnik, dwie doktryny.',
    dfIngest: 'POCHŁAŃ.',
    dfFuse: 'SCAL.',
    dfEmit: 'EMITUJ.',
    dfDesc: 'Surowe sygnały napływają z rynków predykcji, telemetrii surowców, satelitów i OSINT. Rdzeń łączy je w czasie poniżej 40 ms i emituje ściśle rozdzielone produkty do końcówek komercyjnych i obronnych.',
    capsTitleA: 'JEDEN SILNIK.',
    capsTitleB: 'DWIE DOKTRYNY.',
    capsDesc: 'Światowid udostępnia tę samą warstwę prognostyczną klientom komercyjnym i obronnym przez ściśle rozdzielone punkty końcowe. Wybierasz ostrze; silnik jest jeden.',
    cap1Title: 'Geneza rynków',
    cap1Desc: 'Twórz nowe rynki predykcji dla partnerów z branży gier i fintech na podstawie sygnałów z rzeczywistości w czasie rzeczywistym.',
    cap2Title: 'Prognoza konfliktu',
    cap2Desc: 'Prawdopodobieństwa ruchu na poziomie batalionu, horyzont 6–72h, łączone z OSINT, SIGINT i telemetrii logistycznej.',
    cap3Title: 'Przepływy surowców',
    cap3Desc: 'Miedź, lit, zboże, LNG, widoczność na poziomie pojedynczej dostawy z 312 portów i 1 100 węzłów kolejowych.',
    cap4Title: 'Ważenie nastrojów',
    cap4Desc: 'Wielojęzyczne śledzenie narracji w 47 platformach z oceną wiarygodności źródeł i filtracją botów.',
    cap5Title: 'Arbitraż kursowy',
    cap5Desc: 'Wykrywanie dryfu międzybukmacherskiego i tworzenie syntetycznych rynków z automatycznym hedgingiem płynności.',
    cap6Title: 'Symulacja scenariuszy',
    cap6Desc: 'Linie świata Monte Carlo przy 10⁶ próbach. Rozgałęzienia kontrfaktyczne z modelami polityki nazwanych aktorów.',
    ptrTitleA: 'WDROŻONE.',
    ptrTitleB: 'TAM, GDZIE DECYZJE KOSZTUJĄ PIENIĄDZE.',
    ptrDesc: 'Partnerzy działają na podstawie bilateralnych NDA. Loga nie są publicznie ujawniane. Zapytania ofertowe prosimy kierować przez łącznika rządowego lub nasz dział komercyjny.',
    ptr1Label: 'MON RANGI NATO', ptr1Desc: 'Wdrożenia państw członkowskich',
    ptr2Label: 'FTSE-100 GÓRNICTWO', ptr2Desc: 'Partnerzy dostaw surowców',
    ptr3Label: 'LICENCJONOWANI BUKMACHERZY', ptr3Desc: 'Regulowani operatorzy UE i UK',
    ptr4Label: 'RYNKI PREDYKCJI', ptr4Desc: 'Umowy L1 o wymianie danych',
    ptr5Label: 'FUNDUSZE SUWERENNE', ptr5Desc: 'Warstwa strategicznego wywiadu',
    duTitleA: 'DLA DOMU.',
    duTitleB: 'DLA PAŃSTWA.',
    duDesc: 'Ściśle rozdzielony dostęp. Identyczny substrat. Jeden interfejs obsługuje bukmachera tworzącego nowy rynek „wynik szczytu UE"; drugi brieffuje J2 w oknach zaopatrzenia obwodu charkowskiego.',
    duCommLabel: 'KOMERCJA · GRY & FINTECH',
    duCommThin: 'Uruchom',
    duCommTitle: 'NOWE RYNKI',
    duCommDesc: 'Operatorzy hazardowi i platformy rynków predykcji używają Światowida do tworzenia nowych kategorii zakładów w locie, z aktualnymi cenami, rekomendacjami płynności i automatycznymi księgami hedgingowymi.',
    duCommB1: 'Automatyczna geneza rynków ze strumienia newsów',
    duCommB2: 'Wykrywanie dryfu i ostrego pieniądza między operatorami',
    duCommB3: 'Syntetyczna płynność z ograniczoną ekspozycją ryzyka',
    duCommB4: 'Proweniencja zgodna z regulatorem dla każdego kursu',
    duDefLabel: 'OBRONA · PROGNOZY STRATEGICZNE',
    duDefThin: 'Zobacz',
    duDefTitle: 'NASTĘPNY RUCH',
    duDefDesc: 'Ministerstwa obrony i sojusznicze komórki J2 używają Światowida do taktycznych prognoz 6–72h dotyczących ruchu wojsk, anomalii logistycznych i okien eskalacji politycznej, walidowanych przez otwarte rynki.',
    duDefB1: 'Siatki prawdopodobieństwa ruchu w rozdzielczości batalionu',
    duDefB2: 'Ekstrakcja sygnatur logistycznych z AIS + kolei',
    duDefB3: 'Wczesne ostrzeżenie narracyjne i detekcja info-ops',
    duDefB4: 'Dostępne wdrożenie w odciętej sieci on-prem',
    ctaTitleA: 'POPROŚ O',
    ctaTitleB: 'DOPUSZCZENIE',
    ctaDesc: 'Światowid nie jest samoobsługowy. Dostęp przyznawany po weryfikacji zgodności suwerennej i audycie dostawcy. Spodziewaj się 14–28 dni do pierwszego briefingu.',
    ctaApply: 'Złóż wniosek o dostęp',
    ctaDownload: 'Pobierz zestawienie możliwości (PDF)',
    footSecurity: 'Bezpieczeństwo',
    footExport: 'Kontrola eksportu',
    footEthics: 'Rada etyki',
    footDisclosures: 'Ujawnienia',
    reqaKicker: 'Wniosek o dostęp',
    reqaTitle: 'Powiedz nam o współpracy.',
    reqaLede: 'Wybierz obszar naszej oferty, którym chcesz się zająć. Skierujemy wniosek do zespołu partnerstw i odpowiemy w 14–28 dni.',
    reqaFieldName: 'Imię i nazwisko',
    reqaFieldEmail: 'E-mail służbowy',
    reqaFieldOrg: 'Organizacja',
    reqaFieldArea: 'Obszar projektu',
    reqaFieldMessage: 'Wiadomość',
    reqaFieldMessagePh: 'Cel, który chcesz osiągnąć, harmonogram i ograniczenia.',
    reqaArea_heavy_industry: 'Przemysł ciężki',
    reqaArea_markets: 'Projektowanie rynków',
    reqaArea_defense: 'Obrona',
    reqaArea_pharma: 'Logistyka',
    reqaArea_general: 'Coś innego',
    reqaSend: 'Wyślij wniosek',
    reqaSent: 'Otwórz w kliencie poczty',
    reqaRoutedTo: 'Trafia do',
    reqaClose: 'Zamknij',
    reqaCtaOpen: 'Poproś o dostęp',
    reqaMailSubjectPrefix: 'Wniosek o dostęp',
  },
  cs: {
    navHome: 'Domů',
    navCapabilities: 'Schopnosti',
    navBlog: 'Novinky',
    navCareers: 'Kariéra',
    navRequestAccess: 'POŽÁDAT O PŘÍSTUP →',
    hero1: 'UMĚLÁ INTELIGENCE, KTERÁ',
    heroSees: 'VIDÍ',
    heroEverything: 'VŠECHNO',
    heroBefore: 'DŘÍV',
    heroItHappens: 'NEŽ SE STANE.',
    heroBig: 'ŚWIATOWID VIDÍ VŠECHNO',
    heroSub: 'Od surových dat po hotové závěry.',
    heroCtaAccess: 'Požádat o přístup',
    heroCtaBrief: 'Přečíst souhrn schopností',
    caseKicker: 'Nasazeno u zákazníků',
    case_pharma_tag: 'Logistika',
    case_pharma_sub: 'Kontejnery, nákladní koridory a sklady v plném pohledu na řetězec.',
    case_markets_tag: 'Finance',
    case_markets_sub: 'Sázkové kanceláře a burzy otevírají trhy na základě signálu Światowidu.',
    case_heavy_tag: 'Průmysl',
    case_heavy_sub: 'Dodávky surovin do cementáren a oceláren v rytmu pece.',
    case_defense_tag: 'Obrana',
    case_defense_sub: 'Analýza bojiště, pohyby vojsk a plánování operací v jedné konzoli.',
    pill_pharma_line: 'Každá paleta včas.',
    pill_markets_line: 'Oceň to, co nemá cenu.',
    pill_heavy_line: 'Pec nikdy nestojí prázdná.',
    pill_defense_line: 'Jasno pod palbou.',
    splitCivil: 'CIVILNÍ',
    splitMilit: 'VOJENSKÝ',
    splitCaption: 'Posuň pro rozdělení, jeden stroj, dvě doktríny.',
    dfIngest: 'POZŘÍT.',
    dfFuse: 'SLOUČIT.',
    dfEmit: 'VYSLAT.',
    dfDesc: 'Surové signály proudí z predikčních trhů, telemetrie surovin, satelitů a OSINT. Jádro je sjednocuje do 40 ms a vysílá striktně oddělené produkty na komerční a obranné koncové body.',
    capsTitleA: 'JEDEN STROJ.',
    capsTitleB: 'DVĚ DOKTRÍNY.',
    capsDesc: 'Światowid poskytuje stejný predikční substrát komerčním i obranným klientům přes striktně oddělené koncové body. Vybíráte ostří; stroj je jeden.',
    cap1Title: 'Geneze trhů',
    cap1Desc: 'Generujte nové predikční trhy pro herní a fintech partnery z živých reálných signálů.',
    cap2Title: 'Prognóza konfliktu',
    cap2Desc: 'Pravděpodobnosti pohybu na úrovni praporu, horizont 6–72 h, sloučené z OSINT, SIGINT a logistické telemetrie.',
    cap3Title: 'Toky surovin',
    cap3Desc: 'Měď, lithium, obilí, LNG, viditelnost na úrovni zásilky ze 312 přístavů a 1 100 železničních uzlů.',
    cap4Title: 'Vážení sentimentu',
    cap4Desc: 'Vícejazyčné sledování narativů na 47 platformách s hodnocením zdrojů a filtrací botů.',
    cap5Title: 'Arbitráž kurzů',
    cap5Desc: 'Detekce driftu mezi kancelářemi a tvorba syntetických trhů s automatickým hedgingem likvidity.',
    cap6Title: 'Simulace scénářů',
    cap6Desc: 'Monte Carlo světočáry při 10⁶ vzorcích. Kontrafaktické větvení s modely politiky pojmenovaných aktérů.',
    ptrTitleA: 'NASAZENO.',
    ptrTitleB: 'TAM, KDE ROZHODNUTÍ STOJÍ PENÍZE.',
    ptrDesc: 'Partneři pracují pod oboustrannými NDA. Loga se veřejně neuvádějí. Poptávky směrujte přes vašeho vládního styčného důstojníka nebo náš obchodní útvar.',
    ptr1Label: 'MO ÚROVNĚ NATO', ptr1Desc: 'Nasazení členských států',
    ptr2Label: 'FTSE-100 TĚŽAŘI', ptr2Desc: 'Partneři dodávek surovin',
    ptr3Label: 'LICENCOVANÉ SÁZKOVÉ KANC.', ptr3Desc: 'Operátoři regulovaní v EU a UK',
    ptr4Label: 'PREDIKČNÍ TRHY', ptr4Desc: 'Smlouvy L1 o sdílení dat',
    ptr5Label: 'SUVERÉNNÍ FONDY', ptr5Desc: 'Vrstva strategické inteligence',
    duTitleA: 'PRO DŮM.',
    duTitleB: 'PRO STÁT.',
    duDesc: 'Striktně oddělený přístup. Identický substrát. Jedno rozhraní obsluhuje sázkovku spouštějící nový trh „výsledek summitu EU"; druhé brieffuje J2 o oknech zásobování charkovské oblasti.',
    duCommLabel: 'KOMERCE · HRY & FINTECH',
    duCommThin: 'Spustit',
    duCommTitle: 'NOVÉ TRHY',
    duCommDesc: 'Provozovatelé sázek a platforem predikčních trhů využívají Światowid k vytváření nových kategorií sázek za běhu, s živým oceněním, doporučeními likvidity a automatickými hedge knihami.',
    duCommB1: 'Automatická geneze trhů ze živého zpravodajství',
    duCommB2: 'Detekce mezi-kanceláře driftu a ostrých peněz',
    duCommB3: 'Syntetická likvidita s rizikově ohraničenou expozicí',
    duCommB4: 'Provenience připravená pro regulátora u každého kurzu',
    duDefLabel: 'OBRANA · STRATEGICKÉ PROGNÓZY',
    duDefThin: 'Spatři',
    duDefTitle: 'PŘÍŠTÍ TAH',
    duDefDesc: 'Ministerstva obrany a spojenecké buňky J2 používají Światowid pro 6–72h taktické prognózy pohybu sil, logistických anomálií a oken politické eskalace, křížově ověřené vůči otevřeným trhům.',
    duDefB1: 'Mřížky pravděpodobnosti pohybu v rozlišení praporu',
    duDefB2: 'Extrakce logistických signatur z AIS + železnice',
    duDefB3: 'Narativní včasné varování a detekce info-ops',
    duDefB4: 'K dispozici nasazení on-prem v odděleném prostředí',
    ctaTitleA: 'POŽÁDAT O',
    ctaTitleB: 'OPRÁVNĚNÍ',
    ctaDesc: 'Światowid není samoobslužný. Přístup se uděluje po posouzení suverénní kompatibility a prověření dodavatele. Počítejte s 14–28 dny do prvního briefingu.',
    ctaApply: 'Podat žádost o přístup',
    ctaDownload: 'Stáhnout souhrn schopností (PDF)',
    footSecurity: 'Bezpečnost',
    footExport: 'Kontrola vývozu',
    footEthics: 'Etická rada',
    footDisclosures: 'Zveřejnění',
    reqaKicker: 'Žádost o přístup',
    reqaTitle: 'Řekněte nám o spolupráci.',
    reqaLede: 'Vyberte oblast naší nabídky, kterou chcete řešit. Předáme žádost partnerskému týmu a odpovíme do 14–28 dnů.',
    reqaFieldName: 'Jméno',
    reqaFieldEmail: 'Pracovní e-mail',
    reqaFieldOrg: 'Organizace',
    reqaFieldArea: 'Oblast projektu',
    reqaFieldMessage: 'Zpráva',
    reqaFieldMessagePh: 'Cíl, který chcete dosáhnout, časový rámec a omezení.',
    reqaArea_heavy_industry: 'Těžký průmysl',
    reqaArea_markets: 'Návrh trhů',
    reqaArea_defense: 'Obrana',
    reqaArea_pharma: 'Logistika',
    reqaArea_general: 'Něco jiného',
    reqaSend: 'Odeslat žádost',
    reqaSent: 'Otevřít v poštovním klientu',
    reqaRoutedTo: 'Adresováno',
    reqaClose: 'Zavřít',
    reqaCtaOpen: 'Požádat o přístup',
    reqaMailSubjectPrefix: 'Žádost o přístup',
  },
  sk: {
    navHome: 'Domov',
    navCapabilities: 'Schopnosti',
    navBlog: 'Novinky',
    navCareers: 'Kariéra',
    navRequestAccess: 'POŽIADAŤ O PRÍSTUP →',
    hero1: 'UMELÁ INTELIGENCIA, KTORÁ',
    heroSees: 'VIDÍ',
    heroEverything: 'VŠETKO',
    heroBefore: 'SKÔR',
    heroItHappens: 'NEŽ SA STANE.',
    heroBig: 'ŚWIATOWID VIDÍ VŠETKO',
    heroSub: 'Od surových dát po hotové závery.',
    heroCtaAccess: 'Požiadať o prístup',
    heroCtaBrief: 'Prečítať súhrn schopností',
    caseKicker: 'Nasadené u klientov',
    case_pharma_tag: 'Logistika',
    case_pharma_sub: 'Kontajnery, nákladné koridory a sklady v plnom pohľade na reťazec.',
    case_markets_tag: 'Financie',
    case_markets_sub: 'Stávkové kancelárie a burzy otvárajú trhy zo signálu Światowidu.',
    case_heavy_tag: 'Priemysel',
    case_heavy_sub: 'Dodávky surovín do cementární a oceliarní v rytme pece.',
    case_defense_tag: 'Obrana',
    case_defense_sub: 'Analýza bojiska, pohyby vojsk a plánovanie operácií v jednej konzole.',
    pill_pharma_line: 'Každá paleta včas.',
    pill_markets_line: 'Oceň to, čo nemá cenu.',
    pill_heavy_line: 'Pec nikdy nestojí prázdna.',
    pill_defense_line: 'Jasno pod paľbou.',
    splitCivil: 'CIVILNÝ',
    splitMilit: 'VOJENSKÝ',
    splitCaption: 'Potiahni pre rozdelenie, jeden stroj, dve doktríny.',
    dfIngest: 'PRIJAŤ.',
    dfFuse: 'ZLÚČIŤ.',
    dfEmit: 'VYSLAŤ.',
    dfDesc: 'Surové signály prúdia z predikčných trhov, telemetrie surovín, satelitov a OSINT. Jadro ich zjednocuje do 40 ms a vysiela striktne oddelené produkty na komerčné a obranné koncové body.',
    capsTitleA: 'JEDEN STROJ.',
    capsTitleB: 'DVE DOKTRÍNY.',
    capsDesc: 'Światowid poskytuje ten istý predikčný substrát komerčným aj obranným klientom cez striktne oddelené koncové body. Vyberáte ostrie; stroj je jeden.',
    cap1Title: 'Genéza trhov',
    cap1Desc: 'Generujte nové predikčné trhy pre herných a fintech partnerov zo živých reálnych signálov.',
    cap2Title: 'Prognóza konfliktu',
    cap2Desc: 'Pravdepodobnosti pohybu na úrovni práporu, horizont 6–72 h, zlúčené z OSINT, SIGINT a logistickej telemetrie.',
    cap3Title: 'Toky surovín',
    cap3Desc: 'Meď, lítium, obilie, LNG, viditeľnosť na úrovni zásielky z 312 prístavov a 1 100 železničných uzlov.',
    cap4Title: 'Váženie sentimentu',
    cap4Desc: 'Viacjazyčné sledovanie naratívov na 47 platformách s hodnotením pôvodu a filtrovaním botov.',
    cap5Title: 'Arbitráž kurzov',
    cap5Desc: 'Detekcia driftu medzi kanceláriami a tvorba syntetických trhov s automatickým hedgingom likvidity.',
    cap6Title: 'Simulácia scenárov',
    cap6Desc: 'Monte Carlo svetočiary pri 10⁶ vzorkách. Kontrafaktické vetvenie s modelmi politík pomenovaných aktérov.',
    ptrTitleA: 'NASADENÉ.',
    ptrTitleB: 'TAM, KDE ROZHODNUTIA STOJA PENIAZE.',
    ptrDesc: 'Partneri pracujú pod obojstrannými NDA. Logá sa verejne neuvádzajú. Dopyty smerujte cez vášho vládneho styčného dôstojníka alebo náš obchodný útvar.',
    ptr1Label: 'MO ÚROVNE NATO', ptr1Desc: 'Nasadenia členských štátov',
    ptr2Label: 'FTSE-100 ŤAŽIARI', ptr2Desc: 'Partneri dodávok surovín',
    ptr3Label: 'LICENCOVANÉ STÁVKOVÉ KANC.', ptr3Desc: 'Operátori regulovaní v EÚ a UK',
    ptr4Label: 'PREDIKČNÉ TRHY', ptr4Desc: 'Zmluvy L1 o zdieľaní dát',
    ptr5Label: 'SUVERÉNNE FONDY', ptr5Desc: 'Vrstva strategickej inteligencie',
    duTitleA: 'PRE DOM.',
    duTitleB: 'PRE ŠTÁT.',
    duDesc: 'Striktne oddelený prístup. Identický substrát. Jedno rozhranie obsluhuje stávkovku spúšťajúcu nový trh „výsledok summitu EÚ"; druhé brieffuje J2 o oknách zásobovania charkovskej oblasti.',
    duCommLabel: 'KOMERCIA · HRY & FINTECH',
    duCommThin: 'Spustiť',
    duCommTitle: 'NOVÉ TRHY',
    duCommDesc: 'Prevádzkovatelia stávok a platforiem predikčných trhov využívajú Światowid na vytváranie nových kategórií stávok za behu, so živým ocenením, odporúčaniami likvidity a automatickými hedge knihami.',
    duCommB1: 'Automatická genéza trhov zo živého spravodajstva',
    duCommB2: 'Detekcia medzi-kancelárskeho driftu a ostrých peňazí',
    duCommB3: 'Syntetická likvidita s rizikovo ohraničenou expozíciou',
    duCommB4: 'Proveniencia pripravená pre regulátora pri každom kurze',
    duDefLabel: 'OBRANA · STRATEGICKÉ PROGNÓZY',
    duDefThin: 'Uvidíš',
    duDefTitle: 'ĎALŠÍ ŤAH',
    duDefDesc: 'Ministerstvá obrany a spojenecké bunky J2 používajú Światowid pre 6–72h taktické prognózy pohybu síl, logistických anomálií a okien politickej eskalácie, krížovo overené voči otvoreným trhom.',
    duDefB1: 'Mriežky pravdepodobnosti pohybu v rozlíšení práporu',
    duDefB2: 'Extrakcia logistických signatúr z AIS + železnice',
    duDefB3: 'Naratívne včasné varovanie a detekcia info-ops',
    duDefB4: 'K dispozícii nasadenie on-prem v izolovanom prostredí',
    ctaTitleA: 'POŽIADAŤ O',
    ctaTitleB: 'OPRÁVNENIE',
    ctaDesc: 'Światowid nie je samoobslužný. Prístup sa udeľuje po posúdení suverénnej kompatibility a preverení dodávateľa. Počítajte s 14–28 dňami do prvého briefingu.',
    ctaApply: 'Podať žiadosť o prístup',
    ctaDownload: 'Stiahnuť súhrn schopností (PDF)',
    footSecurity: 'Bezpečnosť',
    footExport: 'Kontrola vývozu',
    footEthics: 'Etická rada',
    footDisclosures: 'Zverejnenia',
    reqaKicker: 'Žiadosť o prístup',
    reqaTitle: 'Povedzte nám o spolupráci.',
    reqaLede: 'Vyberte oblasť našej ponuky, ktorú chcete riešiť. Žiadosť odovzdáme partnerskému tímu a odpovieme do 14–28 dní.',
    reqaFieldName: 'Meno',
    reqaFieldEmail: 'Pracovný e-mail',
    reqaFieldOrg: 'Organizácia',
    reqaFieldArea: 'Oblasť projektu',
    reqaFieldMessage: 'Správa',
    reqaFieldMessagePh: 'Cieľ, ktorý chcete dosiahnuť, časový rámec a obmedzenia.',
    reqaArea_heavy_industry: 'Ťažký priemysel',
    reqaArea_markets: 'Návrh trhov',
    reqaArea_defense: 'Obrana',
    reqaArea_pharma: 'Logistika',
    reqaArea_general: 'Niečo iné',
    reqaSend: 'Odoslať žiadosť',
    reqaSent: 'Otvoriť v poštovom klientovi',
    reqaRoutedTo: 'Smeruje na',
    reqaClose: 'Zavrieť',
    reqaCtaOpen: 'Požiadať o prístup',
    reqaMailSubjectPrefix: 'Žiadosť o prístup',
  },
  et: {
    navHome: 'Avaleht',
    navCapabilities: 'Võimed',
    navBlog: 'Uudised',
    navCareers: 'Karjäär',
    navRequestAccess: 'TAOTLE JUURDEPÄÄSU →',
    hero1: 'TEHISINTELLEKT, MIS',
    heroSees: 'NÄEB',
    heroEverything: 'KÕIKE',
    heroBefore: 'ENNE',
    heroItHappens: 'KUI SEE TOIMUB.',
    heroBig: 'ŚWIATOWID NÄEB KÕIKE',
    heroSub: 'Toorandmetest valmis järeldusteni.',
    heroCtaAccess: 'Taotle juurdepääsu',
    heroCtaBrief: 'Loe võimekuse ülevaadet',
    caseKicker: 'Kasutusel klientidel',
    case_pharma_tag: 'Logistika',
    case_pharma_sub: 'Konteinerid, kaubakoridorid ja laod täielikus tarneahela vaates.',
    case_markets_tag: 'Rahandus',
    case_markets_sub: 'Kihlveokontorid ja börsid avavad uusi turge Światowidu signaalist.',
    case_heavy_tag: 'Tööstus',
    case_heavy_sub: 'Tsemendi- ja terasetehaste tarned vastavuses ahju rütmiga.',
    case_defense_tag: 'Kaitse',
    case_defense_sub: 'Lahinguvälja luure, vägede liikumine ja rünnakute kavandamine ühes konsoolis.',
    pill_pharma_line: 'Iga kaubaalus õigeks ajaks.',
    pill_markets_line: 'Hinnasta hinnastamatu.',
    pill_heavy_line: 'Ahi ei seisa kunagi tühi.',
    pill_defense_line: 'Selgus tule all.',
    splitCivil: 'TSIVIIL',
    splitMilit: 'SÕJALINE',
    splitCaption: 'Lohista jagamiseks, üks mootor, kaks doktriini.',
    dfIngest: 'NEELA.',
    dfFuse: 'SULATA.',
    dfEmit: 'EMITEERI.',
    dfDesc: 'Töötlemata signaalid voolavad sisse ennustusturgudelt, toorme telemeetriast, satelliitidelt ja OSINT-ist. Tuum ühendab need alla 40 ms ja väljastab rangelt eraldatud tooteid kommerts- ja kaitseotspunktidesse.',
    capsTitleA: 'ÜKS MOOTOR.',
    capsTitleB: 'KAKS DOKTRIINI.',
    capsDesc: 'Światowid pakub sama ennustussubstraati kommerts- ja kaitseklientidele rangelt eraldatud otspunktide kaudu. Sina valid tera; mootor on üks.',
    cap1Title: 'Turu teke',
    cap1Desc: 'Loo uusi ennustusturge mängu- ja fintech-partneritele reaalajas reaalmaailma signaalide põhjal.',
    cap2Title: 'Konflikti prognoos',
    cap2Desc: 'Pataljoni-tasandi liikumise tõenäosused, horisont 6–72 h, ühendatud OSINTist, SIGINTist ja logistika telemeetriast.',
    cap3Title: 'Toormevood',
    cap3Desc: 'Vask, liitium, vili, LNG, saadetise-tasandi nähtavus 312 sadamast ja 1 100 raudteesõlmest.',
    cap4Title: 'Meelsuse kaalumine',
    cap4Desc: 'Mitmekeelne narratiivide jälgimine 47 platvormil koos allika usaldusväärsuse hindamise ja botifiltriga.',
    cap5Title: 'Koefitsiendi arbitraaž',
    cap5Desc: 'Kihlveokontorite vahelise triivi tuvastamine ja sünteetiliste turgude loomine automaatse likviidsuse maandamisega.',
    cap6Title: 'Stsenaariumide simulatsioon',
    cap6Desc: 'Monte Carlo maailmajooned 10⁶ näidisel. Kontrafaktiline hargnemine nimega toimijate poliitikamudelitega.',
    ptrTitleA: 'KASUTUSEL.',
    ptrTitleB: 'SEAL, KUS OTSUSED MAKSAVAD RAHA.',
    ptrDesc: 'Partnerid töötavad kahepoolsete NDA-de alusel. Logosid avalikult ei avaldata. Hanketaotlused suunake oma valitsuse sideohvitseri või meie kaubandusosakonna kaudu.',
    ptr1Label: 'NATO-TASEME KM', ptr1Desc: 'Liikmesriikide juurutused',
    ptr2Label: 'FTSE-100 KAEVANDAJAD', ptr2Desc: 'Toorme tarnepartnerid',
    ptr3Label: 'LITSENTSITUD KIHLVEOD', ptr3Desc: 'EL ja UK reguleeritud operaatorid',
    ptr4Label: 'ENNUSTUSTURUD', ptr4Desc: 'L1 andmejagamise lepingud',
    ptr5Label: 'SUVERÄÄNSED FONDID', ptr5Desc: 'Strateegilise luure tase',
    duTitleA: 'MAJA JAOKS.',
    duTitleB: 'RIIGI JAOKS.',
    duDesc: 'Rangelt eraldatud juurdepääs. Identne substraat. Üks liides teenindab kihlveokontorit, mis käivitab uue „ELi tippkohtumise tulemus" turu; teine instrueerib J2-d Harkivi oblasti varustusakendest.',
    duCommLabel: 'KOMMERTS · MÄNGUD & FINTECH',
    duCommThin: 'Käivita',
    duCommTitle: 'UUED TURUD',
    duCommDesc: 'Hasartmänguoperaatorid ja ennustusturu platvormid kasutavad Światowidi uute panusekategooriate loomiseks lennult, toetatuna reaalajas hinnakujunduse, likviidsussoovituste ja automaatsete maandamisraamatutega.',
    duCommB1: 'Automaatne turu teke otseuudiste voost',
    duCommB2: 'Kontorite vahelise triivi ja teravraha tuvastamine',
    duCommB3: 'Sünteetiline likviidsus riskipiiratud avatusega',
    duCommB4: 'Regulaatorile valmis päritolu iga noteeringu juures',
    duDefLabel: 'KAITSE · STRATEEGILINE PROGNOOSIMINE',
    duDefThin: 'Näe',
    duDefTitle: 'JÄRGMIST KÄIKU',
    duDefDesc: 'Kaitseministeeriumid ja liitlaste J2-üksused kasutavad Światowidi 6–72h taktikaliste prognooside jaoks vägede liikumise, logistika anomaaliate ja poliitilise eskalatsiooni akende osas, ristkontrollituna avatud turgude vastu.',
    duDefB1: 'Pataljoni-tasandi liikumise tõenäosuse võrgustikud',
    duDefB2: 'Logistika allkirjade tuvastamine AIS-ist + raudteelt',
    duDefB3: 'Narratiivi varajane hoiatus ja info-ops tuvastus',
    duDefB4: 'Saadaval õhulõhega kohapealne juurutus',
    ctaTitleA: 'TAOTLE',
    ctaTitleB: 'LUBA',
    ctaDesc: 'Światowid ei ole iseteenindus. Juurdepääs antakse pärast suveräänsuse kooskõlastuse ülevaatust ja tarnija kontrolli. Arvesta 14–28 päevaga esimese briifinguni.',
    ctaApply: 'Esita juurdepääsu taotlus',
    ctaDownload: 'Laadi alla võimekuse ülevaade (PDF)',
    footSecurity: 'Turvalisus',
    footExport: 'Ekspordikontroll',
    footEthics: 'Eetikanõukogu',
    footDisclosures: 'Avalikustamised',
    reqaKicker: 'Juurdepääsu taotlus',
    reqaTitle: 'Räägi meile koostööst.',
    reqaLede: 'Vali meie pakkumise valdkond, mida soovid käsile võtta. Suuname taotluse partnerlustiimile ja vastame 14–28 päeva jooksul.',
    reqaFieldName: 'Nimi',
    reqaFieldEmail: 'Töömeil',
    reqaFieldOrg: 'Organisatsioon',
    reqaFieldArea: 'Projekti valdkond',
    reqaFieldMessage: 'Sõnum',
    reqaFieldMessagePh: 'Eesmärk, ajakava ja piirangud.',
    reqaArea_heavy_industry: 'Rasketööstus',
    reqaArea_markets: 'Turgude disain',
    reqaArea_defense: 'Kaitse',
    reqaArea_pharma: 'Logistika',
    reqaArea_general: 'Midagi muud',
    reqaSend: 'Saada taotlus',
    reqaSent: 'Ava postiprogrammis',
    reqaRoutedTo: 'Saadetakse',
    reqaClose: 'Sulge',
    reqaCtaOpen: 'Küsi juurdepääsu',
    reqaMailSubjectPrefix: 'Juurdepääsu taotlus',
  },
  lt: {
    navHome: 'Pradžia',
    navCapabilities: 'Galimybės',
    navBlog: 'Naujienos',
    navCareers: 'Karjera',
    navRequestAccess: 'PRAŠYTI PRIEIGOS →',
    hero1: 'DI, KURIS',
    heroSees: 'MATO',
    heroEverything: 'VISKĄ',
    heroBig: 'ŚWIATOWID MATO VISKĄ',
    heroSub: 'Nuo neapdorotų duomenų iki gatavų išvadų.',
    heroBefore: 'PRIEŠ',
    heroItHappens: 'TAI ĮVYKSTANT.',
    heroCtaAccess: 'Prašyti prieigos',
    heroCtaBrief: 'Skaityti galimybių apžvalgą',
    caseKicker: 'Įdiegta pas klientus',
    case_pharma_tag: 'Logistika',
    case_pharma_sub: 'Konteineriai, krovinių koridoriai ir sandėliai pilna tiekimo grandinės apžvalga.',
    case_markets_tag: 'Finansai',
    case_markets_sub: 'Lažybų bendrovės ir biržos kuria rinkas pagal Światowido signalą.',
    case_heavy_tag: 'Pramonė',
    case_heavy_sub: 'Cemento ir plieno gamyklų tiekimai pagal krosnies ritmą.',
    case_defense_tag: 'Gynyba',
    case_defense_sub: 'Mūšio lauko žvalgyba, kariuomenės judėjimas ir operacijų planavimas vienoje konsolėje.',
    pill_pharma_line: 'Kiekvienas padėklas laiku.',
    pill_markets_line: 'Kainuok tai, kas neįkainota.',
    pill_heavy_line: 'Krosnis niekada nestoja.',
    pill_defense_line: 'Aiškumas po ugnimi.',
    splitCivil: 'CIVILINIS',
    splitMilit: 'KARINIS',
    splitCaption: 'Tempk, kad atskirtum, vienas variklis, dvi doktrinos.',
    dfIngest: 'SUGERTI.',
    dfFuse: 'SUJUNGTI.',
    dfEmit: 'SKLEISTI.',
    dfDesc: 'Neapdoroti signalai plūsta iš prognozių rinkų, žaliavų telemetrijos, palydovų ir OSINT. Branduolys juos suvienija per mažiau nei 40 ms ir perduoda griežtai atskirtus produktus į komercinius ir gynybinius galutinius taškus.',
    capsTitleA: 'VIENAS VARIKLIS.',
    capsTitleB: 'DVI DOKTRINOS.',
    capsDesc: 'Światowid tą patį prognozavimo substratą pateikia komerciniams ir gynybos klientams per griežtai atskirtus galutinius taškus. Jūs renkatės ašmenis; variklis, vienas.',
    cap1Title: 'Rinkų genezė',
    cap1Desc: 'Kurkite naujas prognozių rinkas žaidimų ir fintech partneriams iš realaus laiko signalų.',
    cap2Title: 'Konflikto prognozė',
    cap2Desc: 'Bataliono lygio judėjimo tikimybės, 6–72 val. horizontas, sujungtos iš OSINT, SIGINT ir logistikos telemetrijos.',
    cap3Title: 'Žaliavų srautai',
    cap3Desc: 'Varis, litis, grūdai, LNG, siuntos lygio matomumas iš 312 uostų ir 1 100 geležinkelio mazgų.',
    cap4Title: 'Nuotaikų svorimas',
    cap4Desc: 'Daugiakalbis pasakojimų sekimas 47 platformose su šaltinio patikimumo vertinimu ir botų filtravimu.',
    cap5Title: 'Koeficientų arbitražas',
    cap5Desc: 'Dreifo tarp lošimo biurų aptikimas ir sintetinių rinkų kūrimas su automatine likvidumo apsauga.',
    cap6Title: 'Scenarijų simuliacija',
    cap6Desc: 'Monte Karlo pasaulio linijos esant 10⁶ pavyzdžiams. Kontrafaktinis šakojimas su įvardytų veikėjų politikos modeliais.',
    ptrTitleA: 'DISLOKUOTA.',
    ptrTitleB: 'TEN, KUR SPRENDIMAI KAINUOJA PINIGUS.',
    ptrDesc: 'Partneriai dirba pagal dvišalius NVS. Logotipai viešai neatskleidžiami. Užklausas nukreipkite per savo vyriausybės ryšių pareigūną arba mūsų komercinį skyrių.',
    ptr1Label: 'NATO LYGIO KM', ptr1Desc: 'Valstybių narių dislokacijos',
    ptr2Label: 'FTSE-100 KASYBA', ptr2Desc: 'Žaliavų tiekimo partneriai',
    ptr3Label: 'LICENCIJUOTOS LAŽYBOS', ptr3Desc: 'ES ir JK reguliuojami operatoriai',
    ptr4Label: 'PROGNOZIŲ RINKOS', ptr4Desc: 'L1 duomenų dalijimosi sutartys',
    ptr5Label: 'SUVERENŪS FONDAI', ptr5Desc: 'Strateginės žvalgybos lygmuo',
    duTitleA: 'NAMUI.',
    duTitleB: 'VALSTYBEI.',
    duDesc: 'Griežtai atskirta prieiga. Tas pats substratas. Viena sąsaja aptarnauja lažybų biurą, kuriantį naują „ES aukščiausiojo lygio susitikimo rezultato" rinką; kita informuoja J2 apie Charkivo srities tiekimo langus.',
    duCommLabel: 'KOMERCIJA · ŽAIDIMAI & FINTECH',
    duCommThin: 'Paleisti',
    duCommTitle: 'NAUJAS RINKAS',
    duCommDesc: 'Lošimų operatoriai ir prognozių rinkų platformos naudoja Światowid naujų statymų kategorijoms kurti realiu laiku, remiantis gyvomis kainomis, likvidumo rekomendacijomis ir automatinėmis apsidraudimo knygomis.',
    duCommB1: 'Automatinė rinkų genezė iš naujienų srauto',
    duCommB2: 'Dreifo tarp biurų ir aštrių pinigų aptikimas',
    duCommB3: 'Sintetinis likvidumas su rizikos ribojama pozicija',
    duCommB4: 'Reguliatoriui paruošta kilmė prie kiekvieno koeficiento',
    duDefLabel: 'GYNYBA · STRATEGINĖS PROGNOZĖS',
    duDefThin: 'Matyk',
    duDefTitle: 'KITĄ ĖJIMĄ',
    duDefDesc: 'Gynybos ministerijos ir sąjungininkų J2 padaliniai naudoja Światowid 6–72 val. taktinėms prognozėms dėl pajėgų judėjimo, logistikos anomalijų ir politinės eskalacijos langų, patikrintoms atvirų rinkų.',
    duDefB1: 'Bataliono rezoliucijos judėjimo tikimybės tinklai',
    duDefB2: 'Logistikos parašų išgavimas iš AIS + geležinkelių',
    duDefB3: 'Pasakojimo ankstyvas įspėjimas ir info-ops aptikimas',
    duDefB4: 'Galimas izoliuotas vietinis diegimas',
    ctaTitleA: 'PRAŠYK',
    ctaTitleB: 'LEIDIMO',
    ctaDesc: 'Światowid nėra savitarnos. Prieiga suteikiama po suvereniteto suderinamumo peržiūros ir tiekėjo patikrinimo. Iki pirmojo instruktažo, 14–28 dienos.',
    ctaApply: 'Teikti paraišką prieigai',
    ctaDownload: 'Atsisiųsti galimybių apžvalgą (PDF)',
    footSecurity: 'Saugumas',
    footExport: 'Eksporto kontrolė',
    footEthics: 'Etikos taryba',
    footDisclosures: 'Atskleidimai',
    reqaKicker: 'Prieigos paraiška',
    reqaTitle: 'Papasakokite apie bendradarbiavimą.',
    reqaLede: 'Pasirinkite mūsų pasiūlymo sritį, kurią norite spręsti. Paraišką perduosime partnerystės komandai ir atsakysime per 14–28 dienas.',
    reqaFieldName: 'Vardas',
    reqaFieldEmail: 'Darbo el. paštas',
    reqaFieldOrg: 'Organizacija',
    reqaFieldArea: 'Projekto sritis',
    reqaFieldMessage: 'Žinutė',
    reqaFieldMessagePh: 'Tikslas, terminai ir apribojimai.',
    reqaArea_heavy_industry: 'Sunkioji pramonė',
    reqaArea_markets: 'Rinkų projektavimas',
    reqaArea_defense: 'Gynyba',
    reqaArea_pharma: 'Logistika',
    reqaArea_general: 'Kažkas kita',
    reqaSend: 'Siųsti paraišką',
    reqaSent: 'Atidaryti pašto kliente',
    reqaRoutedTo: 'Siunčiama',
    reqaClose: 'Uždaryti',
    reqaCtaOpen: 'Prašyti prieigos',
    reqaMailSubjectPrefix: 'Prieigos paraiška',
  },
  uk: {
    navHome: 'Головна',
    navCapabilities: 'Можливості',
    navBlog: 'Новини',
    navCareers: 'Кар\'єра',
    navRequestAccess: 'ЗАПИТАТИ ДОСТУП →',
    hero1: 'ШІ, ЩО',
    heroSees: 'БАЧИТЬ',
    heroBig: 'ŚWIATOWID БАЧИТЬ ВСЕ',
    heroSub: 'Від сирих даних до готових висновків.',
    heroEverything: 'УСЕ',
    heroBefore: 'ЩЕ ДО',
    heroItHappens: 'ТОГО, ЯК СТАЄТЬСЯ.',
    heroCtaAccess: 'Запитати доступ',
    heroCtaBrief: 'Читати огляд можливостей',
    caseKicker: 'Впроваджено у клієнтів',
    case_pharma_tag: 'Логістика',
    case_pharma_sub: 'Контейнери, вантажні коридори та склади у повному ланцюгу постачання.',
    case_markets_tag: 'Фінанси',
    case_markets_sub: 'Букмекери та біржі відкривають ринки із сигналу Світовида.',
    case_heavy_tag: 'Промисловість',
    case_heavy_sub: 'Постачання сировини до цементних і сталеливарних заводів у ритмі печі.',
    case_defense_tag: 'Оборона',
    case_defense_sub: 'Розвідка поля бою, рухи військ і планування операцій в одній консолі.',
    pill_pharma_line: 'Кожна паллета вчасно.',
    pill_markets_line: 'Оціни те, що неоцінено.',
    pill_heavy_line: 'Піч ніколи не стоїть порожньою.',
    pill_defense_line: 'Ясність під вогнем.',
    splitCivil: 'ЦИВІЛЬНИЙ',
    splitMilit: 'ВІЙСЬКОВИЙ',
    splitCaption: 'Перетягни, щоб розділити, один двигун, дві доктрини.',
    dfIngest: 'ПОГЛИНУТИ.',
    dfFuse: 'ЗЛИТИ.',
    dfEmit: 'ПОДАТИ.',
    dfDesc: 'Сирі сигнали надходять з ринків прогнозів, телеметрії сировини, супутників і OSINT. Ядро об\'єднує їх менше ніж за 40 мс та надсилає суворо розділені продукти до комерційних і оборонних кінцевих точок.',
    capsTitleA: 'ОДИН ДВИГУН.',
    capsTitleB: 'ДВІ ДОКТРИНИ.',
    capsDesc: 'Світовид надає той самий прогностичний субстрат комерційним та оборонним клієнтам через суворо розділені кінцеві точки. Ви обираєте лезо; двигун, один.',
    cap1Title: 'Генезис ринку',
    cap1Desc: 'Створюйте нові ринки прогнозів для партнерів з ігор та fintech на основі живих сигналів реального світу.',
    cap2Title: 'Прогноз конфлікту',
    cap2Desc: 'Ймовірності переміщень на рівні батальйону, горизонт 6–72 год, поєднані з OSINT, SIGINT та логістичної телеметрії.',
    cap3Title: 'Потоки сировини',
    cap3Desc: 'Мідь, літій, зерно, СПГ, видимість на рівні відправлення з 312 портів і 1 100 залізничних вузлів.',
    cap4Title: 'Зважування настроїв',
    cap4Desc: 'Багатомовне відстеження наративів на 47 платформах з оцінкою походження та фільтрацією ботів.',
    cap5Title: 'Арбітраж коефіцієнтів',
    cap5Desc: 'Виявлення дрейфу між букмекерами та створення синтетичних ринків з автоматичним хеджуванням ліквідності.',
    cap6Title: 'Симуляція сценаріїв',
    cap6Desc: 'Світові лінії Монте-Карло на 10⁶ вибірках. Контрфактичне розгалуження з моделями політики названих акторів.',
    ptrTitleA: 'РОЗГОРНУТО.',
    ptrTitleB: 'ТАМ, ДЕ РІШЕННЯ КОШТУЮТЬ ГРОШЕЙ.',
    ptrDesc: 'Партнери працюють за двосторонніми NDA. Логотипи публічно не розкриваються. Запити на закупівлю направляйте через вашого урядового ліазона або наш комерційний відділ.',
    ptr1Label: 'МО РІВНЯ НАТО', ptr1Desc: 'Розгортання держав-членів',
    ptr2Label: 'FTSE-100 ГІРНИКИ', ptr2Desc: 'Партнери з постачання сировини',
    ptr3Label: 'ЛІЦЕНЗОВАНІ БУКМЕКЕРИ', ptr3Desc: 'Регульовані оператори ЄС і UK',
    ptr4Label: 'РИНКИ ПРОГНОЗІВ', ptr4Desc: 'Угоди L1 про обмін даними',
    ptr5Label: 'СУВЕРЕННІ ФОНДИ', ptr5Desc: 'Рівень стратегічної розвідки',
    duTitleA: 'ДЛЯ ДОМУ.',
    duTitleB: 'ДЛЯ ДЕРЖАВИ.',
    duDesc: 'Суворо розділений доступ. Ідентичний субстрат. Один інтерфейс обслуговує букмекера, що запускає новий ринок „результат саміту ЄС"; інший інструктує J2 щодо вікон постачання Харківської області.',
    duCommLabel: 'КОМЕРЦІЯ · ІГРИ & FINTECH',
    duCommThin: 'Запусти',
    duCommTitle: 'НОВІ РИНКИ',
    duCommDesc: 'Оператори азартних ігор та платформи ринків прогнозів використовують Світовид для створення нових категорій ставок на ходу, з живим ціноутворенням, рекомендаціями щодо ліквідності та автоматичними книгами хеджування.',
    duCommB1: 'Автоматичний генезис ринків з потоку новин',
    duCommB2: 'Виявлення дрейфу між букмекерами та гострих грошей',
    duCommB3: 'Синтетична ліквідність з обмеженою ризиком експозицією',
    duCommB4: 'Готове для регулятора походження у кожній котировці',
    duDefLabel: 'ОБОРОНА · СТРАТЕГІЧНЕ ПРОГНОЗУВАННЯ',
    duDefThin: 'Бач',
    duDefTitle: 'НАСТУПНИЙ ХІД',
    duDefDesc: 'Міністерства оборони та союзні комірки J2 використовують Світовид для 6–72-годинних тактичних прогнозів щодо руху сил, логістичних аномалій і вікон політичної ескалації, перехресно перевірених на відкритих ринках.',
    duDefB1: 'Сітки ймовірності руху на рівні батальйону',
    duDefB2: 'Витягування логістичних підписів з AIS + залізниці',
    duDefB3: 'Раннє попередження наративів та виявлення інфо-операцій',
    duDefB4: 'Доступне ізольоване локальне розгортання',
    ctaTitleA: 'ЗАПИТАТИ',
    ctaTitleB: 'ДОЗВІЛ',
    ctaDesc: 'Світовид не є самообслуговуванням. Доступ надається після перевірки суверенної відповідності та перевірки постачальника. Очікуйте 14–28 днів до першого брифінгу.',
    ctaApply: 'Подати заявку на доступ',
    ctaDownload: 'Завантажити огляд можливостей (PDF)',
    footSecurity: 'Безпека',
    footExport: 'Експортний контроль',
    footEthics: 'Рада з етики',
    footDisclosures: 'Розкриття',
    reqaKicker: 'Запит доступу',
    reqaTitle: 'Розкажіть про співпрацю.',
    reqaLede: 'Оберіть напрям нашої пропозиції, який ви хочете опрацювати. Запит надійде до команди партнерств, відповімо протягом 14–28 днів.',
    reqaFieldName: 'Імʼя',
    reqaFieldEmail: 'Робоча електронна пошта',
    reqaFieldOrg: 'Організація',
    reqaFieldArea: 'Напрям проєкту',
    reqaFieldMessage: 'Повідомлення',
    reqaFieldMessagePh: 'Бажаний результат, терміни й обмеження.',
    reqaArea_heavy_industry: 'Важка промисловість',
    reqaArea_markets: 'Дизайн ринків',
    reqaArea_defense: 'Оборона',
    reqaArea_pharma: 'Логістика',
    reqaArea_general: 'Щось інше',
    reqaSend: 'Надіслати запит',
    reqaSent: 'Відкрити у поштовому клієнті',
    reqaRoutedTo: 'Адресовано',
    reqaClose: 'Закрити',
    reqaCtaOpen: 'Запитати доступ',
    reqaMailSubjectPrefix: 'Запит доступу',
  },
};

const LangContext = React.createContext({ lang: 'en', setLang: () => {} });
function useT() {
  const { lang } = React.useContext(LangContext);
  const dict = TRANSLATIONS[lang] || TRANSLATIONS.en;
  return (key) => dict[key] ?? TRANSLATIONS.en[key] ?? key;
}

function App() {
  const [tweaks, setTweaks] = React.useState(() => {
    try {
      const stored = localStorage.getItem('swiatowid:theme');
      if (stored && THEMES[stored]) return { ...TWEAK_DEFAULTS, theme: stored };
    } catch (e) {}
    return TWEAK_DEFAULTS;
  });

  React.useEffect(() => {
    const onChange = (e) => {
      const next = e.detail;
      if (THEMES[next]) setTweaks(prev => (prev.theme === next ? prev : { ...prev, theme: next }));
    };
    window.addEventListener('swiatowid:theme', onChange);
    return () => window.removeEventListener('swiatowid:theme', onChange);
  }, []);
  const [editMode, setEditMode] = React.useState(false);
  const [clockTime, setClockTime] = React.useState(new Date());
  const [lang, setLangState] = React.useState(() =>
    window.resolveInitialLang(TRANSLATIONS)
  );
  const setLang = (l) => {
    setLangState(l);
    try { localStorage.setItem(window.SWIATOWID_SITE_CONFIG.langStorageKey, l); } catch (e) {}
    document.documentElement.setAttribute('lang', l);
    window.syncLangToUrl(l);
  };
  React.useEffect(() => {
    document.documentElement.setAttribute('lang', lang);
    window.syncLangToUrl(lang);
  }, [lang]);

  // Clock tick
  React.useEffect(() => {
    const t = setInterval(() => setClockTime(new Date()), 1000);
    return () => clearInterval(t);
  }, []);

  // Theme apply
  React.useEffect(() => {
    const t = THEMES[tweaks.theme] || THEMES.dark;
    if (t.attr) document.documentElement.setAttribute('data-theme', t.attr);
    else document.documentElement.removeAttribute('data-theme');
  }, [tweaks.theme]);

  // Edit mode protocol
  React.useEffect(() => {
    const handler = (e) => {
      if (e.data?.type === '__activate_edit_mode') setEditMode(true);
      if (e.data?.type === '__deactivate_edit_mode') setEditMode(false);
    };
    window.addEventListener('message', handler);
    window.parent.postMessage({ type: '__edit_mode_available' }, '*');
    return () => window.removeEventListener('message', handler);
  }, []);

  const updateTweak = (key, value) => {
    const next = { ...tweaks, [key]: value };
    setTweaks(next);
    window.parent.postMessage({ type: '__edit_mode_set_keys', edits: { [key]: value } }, '*');
  };

  // Reveal-on-scroll
  React.useEffect(() => {
    const io = new IntersectionObserver((entries) => {
      entries.forEach(e => {
        if (e.isIntersecting) e.target.classList.add('in');
      });
    }, { threshold: 0.12 });
    document.querySelectorAll('.reveal').forEach(el => io.observe(el));
    return () => io.disconnect();
  }, [lang]);

  // Crosshair cursor in hero
  React.useEffect(() => {
    const ch = document.querySelector('.crosshair');
    const hero = document.querySelector('.hero');
    if (!ch || !hero) return;
    const move = (e) => {
      ch.style.left = e.clientX + 'px';
      ch.style.top = e.clientY + 'px';
    };
    const enter = () => ch.classList.add('on');
    const leave = () => ch.classList.remove('on');
    window.addEventListener('mousemove', move);
    hero.addEventListener('mouseenter', enter);
    hero.addEventListener('mouseleave', leave);
    return () => {
      window.removeEventListener('mousemove', move);
      hero.removeEventListener('mouseenter', enter);
      hero.removeEventListener('mouseleave', leave);
    };
  }, []);

  const hh = String(clockTime.getUTCHours()).padStart(2, '0');
  const mm = String(clockTime.getUTCMinutes()).padStart(2, '0');
  const ss = String(clockTime.getUTCSeconds()).padStart(2, '0');
  const dateStr = clockTime.toISOString().slice(0, 10);

  return (
    <LangContext.Provider value={{ lang, setLang }}>
      <AppShell tweaks={tweaks} hh={hh} mm={mm} ss={ss} dateStr={dateStr} editMode={editMode} updateTweak={updateTweak} />
    </LangContext.Provider>
  );
}

function AppShell({ tweaks, hh, mm, ss, dateStr, editMode, updateTweak }) {
  const t = useT();
  return (
    <RequestAccessProvider t={t}>
      <svg aria-hidden="true" focusable="false" width="0" height="0" style={{ position: 'absolute' }}>
        <defs>
          <filter id="ticker-logo-fg" colorInterpolationFilters="sRGB">
            <feFlood floodColor="var(--fg)" result="tint" />
            <feComposite in="tint" in2="SourceAlpha" operator="in" result="colored" />
            <feMerge>
              <feMergeNode in="colored" />
            </feMerge>
          </filter>
        </defs>
      </svg>

      <div className="grain"></div>
      <div className="scanlines"></div>
      <div className="crosshair"></div>

      <NavBar logoAnim={tweaks.logoAnim} />

      <Hero logoAnim={tweaks.logoAnim} timeStr={`${hh}:${mm}:${ss}`} dateStr={dateStr} />

      <Ticker variant="black" theme={tweaks.theme} />

      <DataflowSection />

      <CapabilitiesSection />

      <PartnersSection />

      <DualUseSection />

      <CTAFinal />

      <Footer />

      <Tweaks editMode={editMode} tweaks={tweaks} updateTweak={updateTweak} />
    </RequestAccessProvider>
  );
}

function LanguageSwitcher() {
  const { lang, setLang } = React.useContext(LangContext);
  const [open, setOpen] = React.useState(false);
  const ref = React.useRef(null);
  React.useEffect(() => {
    const onDoc = (e) => { if (ref.current && !ref.current.contains(e.target)) setOpen(false); };
    document.addEventListener('mousedown', onDoc);
    return () => document.removeEventListener('mousedown', onDoc);
  }, []);
  const current = LANGS.find(l => l.code === lang) || LANGS[0];
  return (
    <div className="lang-switch" ref={ref}>
      <button
        type="button"
        className={`lang-btn ${open ? 'open' : ''}`}
        onClick={() => setOpen(o => !o)}
        aria-haspopup="listbox"
        aria-expanded={open}
      >
        <span className="lang-code">{current.label}</span>
        <span className="lang-caret">▾</span>
      </button>
      {open && (
        <div className="lang-menu" role="listbox">
          {LANGS.map(l => (
            <button
              key={l.code}
              type="button"
              role="option"
              aria-selected={l.code === lang}
              className={`lang-opt ${l.code === lang ? 'active' : ''}`}
              onClick={() => { setLang(l.code); setOpen(false); }}
            >
              <span className="lang-opt-code">{l.label}</span>
              <span className="lang-opt-name">{l.name}</span>
            </button>
          ))}
        </div>
      )}
    </div>
  );
}

function NavBar() {
  const t = useT();
  return (
    <SiteNavBar
      t={t}
      activeSection="home"
      LanguageSwitcherComponent={LanguageSwitcher}
    />
  );
}

function Hero({ logoAnim, timeStr, dateStr }) {
  const t = useT();
  const [activeIdx, setActiveIdx] = React.useState(0);
  const [prevIdx, setPrevIdx] = React.useState(null);
  const [loaded, setLoaded] = React.useState(() => USE_CASES.map(() => false));
  const videoRefs = React.useRef(USE_CASES.map(() => null));
  const timerRef = React.useRef(null);
  const pausedRef = React.useRef(false);

  const goTo = React.useCallback((next) => {
    setActiveIdx(curr => {
      if (curr === next) return curr;
      setPrevIdx(curr);
      return next;
    });
  }, []);

  const scheduleNext = React.useCallback(() => {
    if (timerRef.current) clearTimeout(timerRef.current);
    timerRef.current = setTimeout(() => {
      if (!pausedRef.current) {
        setActiveIdx(curr => {
          const next = (curr + 1) % USE_CASES.length;
          setPrevIdx(curr);
          return next;
        });
      }
      scheduleNext();
    }, CASE_DURATION_MS);
  }, []);

  React.useEffect(() => {
    scheduleNext();
    return () => { if (timerRef.current) clearTimeout(timerRef.current); };
  }, [scheduleNext]);

  React.useEffect(() => {
    const v = videoRefs.current[activeIdx];
    if (v) { try { v.currentTime = 0; v.play().catch(() => {}); } catch (_) {} }
  }, [activeIdx]);

  const onVideoLoaded = (i) => {
    setLoaded(prev => {
      if (prev[i]) return prev;
      const next = prev.slice();
      next[i] = true;
      return next;
    });
  };

  const jumpTo = (i) => {
    pausedRef.current = false;
    goTo(i);
    scheduleNext();
  };

  return (
    <section className="hero" data-screen-label="01 Hero">
      <div className="video-wrap">
        {USE_CASES.map((c, i) => (
          <video
            key={c.key}
            ref={el => { videoRefs.current[i] = el; }}
            autoPlay={i === 0}
            muted loop playsInline preload="auto"
            className={`hero-video ${i === activeIdx ? 'is-active' : ''} ${i === prevIdx ? 'is-prev' : ''}`}
            style={{ opacity: i === activeIdx ? 1 : 0 }}
            onLoadedData={() => onVideoLoaded(i)}
          >
            <source src={c.src} type="video/mp4" />
          </video>
        ))}
      </div>

      <div className="hero-inner">
        <div className="hero-title">
          <h1 className="hero-h1">{t('heroBig')}</h1>
          <p className="hero-tagline">{t('heroSub')}</p>
          <div className="hero-ctas">
            <a className="btn primary" href={window.SWIATOWID_SITE_CONFIG.requestAccessHref} target="_blank" rel="noopener noreferrer">{t('heroCtaAccess')} <span className="arrow">→</span></a>
            <a className="btn" href="brief.html">{t('heroCtaBrief')}</a>
          </div>
        </div>
      </div>

      <div className="hero-case-nav" role="tablist" aria-label={t('caseKicker')}>
        {USE_CASES.map((c, i) => (
          <button
            key={c.key}
            type="button"
            role="tab"
            aria-selected={i === activeIdx}
            className={`hero-case-pip ${i === activeIdx ? 'active' : ''}`}
            onClick={() => jumpTo(i)}
          >
            <span className="hero-case-pip-track">
              <span className="hero-case-pip-fill" style={{ animationDuration: `${CASE_DURATION_MS}ms`, animationPlayState: i === activeIdx ? 'running' : 'paused' }} />
            </span>
            <span className="hero-case-pip-label">{t(`case_${c.key}_tag`)}</span>
          </button>
        ))}
      </div>

    </section>
  );
}

function Ticker({ variant = 'default', theme = 'dark' }) {
  const isLightTheme = theme === 'bone';
  const preserveColorLogos = new Set(['NATO', 'Ministerstwo Obrony Narodowej', 'Poland', 'Nokia', 'Bielik.AI', 'Kraken', 'xStocks', 'Celo']);
  const logos = [
    { src: 'assets/logos/logo-agh.png?v=2', alt: 'AGH', h: 48 },
    { src: 'assets/logos/logo-nyse.png?v=2', alt: 'NYSE', h: 44 },
    { src: variant === 'black' && !isLightTheme ? 'assets/logos/logo-xstocks-dark.png?v=2' : 'assets/logos/logo-xstocks.png?v=2', alt: 'xStocks', h: 40 },
    { src: 'assets/logos/logo-bielik.png', alt: 'Bielik.AI', h: 42 },
    { src: 'assets/logos/logo-elevenlabs.png?v=2', alt: 'ElevenLabs', h: 40 },
    { src: 'assets/logos/logo-nokia.png?v=1', alt: 'Nokia', h: 26 },
    { src: 'assets/logos/logo-kraken.png?v=3', alt: 'Kraken', h: 44 },
    { src: 'assets/logos/logo-nato.png?v=3', alt: 'NATO', h: 44 },
    { src: 'assets/logos/tools-for-humanity.svg?v=2', alt: 'Tools for Humanity', h: 34 },
    { src: 'assets/logos/world.svg?v=2', alt: 'World', h: 42 },
    { src: 'assets/logos/logo-uw.png?v=1', alt: 'Uniwersytet Warszawski', h: 44 },
    { src: variant === 'black' && !isLightTheme ? 'assets/logos/logo_celo2-dark.png?v=1' : 'assets/logos/logo_celo2.png?v=1', alt: 'Celo', h: 18 },
    { src: 'assets/logos/logo-mon.png', alt: 'Ministerstwo Obrony Narodowej', h: 54 },
    { src: 'assets/logos/logo-poland.png', alt: 'Poland', h: 54 },
  ];
  const tripled = [...logos, ...logos, ...logos];
  const doubled = [...tripled, ...tripled];
  return (
    <div className={`ticker logo-ticker ${variant === 'black' ? 'logo-ticker-black' : ''}`}>
      <div className="track">
        {doubled.map((it, i) => (
          <div className="item logo-chip" key={i}>
            <img
              src={it.src}
              alt={it.alt}
              className={preserveColorLogos.has(it.alt) ? 'preserve-color' : ''}
              style={{ height: it.h, width: 'auto', display: 'block', objectFit: 'contain' }}
            />
          </div>
        ))}
      </div>
    </div>
  );
}

function CapabilitiesSection() {
  const t = useT();
  const sectionRef = React.useRef(null);
  const cubeRef = React.useRef(null);
  const [activeFace, setActiveFace] = React.useState(0);

  // Four-face monolith, one face per client case from the hero reel.
  // All faces share the dark-mode amber (the honey-yellow from the OBSIDIAN
  // palette). Hardcoded so the rotation stays the same warm tone even when
  // the user switches the rest of the site to bone/steel/blood.
  const FACE_TINT = 'oklch(0.78 0.14 75)';
  const caps = [
    { num: '01', key: 'heavy',   tint: FACE_TINT, photo: 'https://images.pexels.com/photos/8803230/pexels-photo-8803230.jpeg?auto=compress&cs=tinysrgb&w=1400' },
    { num: '02', key: 'defense', tint: FACE_TINT, photo: 'https://images.pexels.com/photos/29081313/pexels-photo-29081313.jpeg?auto=compress&cs=tinysrgb&w=1400' },
    { num: '03', key: 'markets', tint: FACE_TINT, photo: 'https://images.pexels.com/photos/31650949/pexels-photo-31650949.jpeg?auto=compress&cs=tinysrgb&w=1400' },
    { num: '04', key: 'pharma',  tint: FACE_TINT, photo: 'https://images.pexels.com/photos/14020705/pexels-photo-14020705.jpeg?auto=compress&cs=tinysrgb&w=1400' },
  ];

  React.useEffect(() => {
    const sec = sectionRef.current;
    if (!sec) return;
    let rafId = null;
    let alive = true;

    const update = () => {
      const cube = cubeRef.current;
      if (!cube) return;
      const rect = sec.getBoundingClientRect();
      const total = sec.offsetHeight - window.innerHeight;
      if (total <= 0) return;
      // Only animate when section is near viewport (skip work otherwise)
      const nearView = rect.bottom > -200 && rect.top < window.innerHeight + 200;
      if (!nearView) return;
      const scrolled = -rect.top;
      const progress = Math.max(0, Math.min(1, scrolled / total));
      // Intro: hold the pillar still at face 0 for the first slice of scroll
      // so the whole pillar has fully descended and stabilised before it
      // starts rotating. On mobile the pillar takes up most of the screen,
      // so we hold significantly longer before the rotation kicks in.
      // Outro: hold face 0 again at the very end so the pillar doesn't whip
      // back mid-exit. The middle slice is the spin.
      const isMobile = window.matchMedia('(max-width: 900px)').matches;
      const INTRO = isMobile ? 0.34 : 0.22;
      const OUTRO = isMobile ? 0.94 : 0.92;
      let p;
      if (progress < INTRO) p = 0;
      else if (progress > OUTRO) p = 1;
      else p = (progress - INTRO) / (OUTRO - INTRO);
      const rotY = p * 360;
      cube.style.transform = `rotateY(${rotY}deg)`;
      const face = Math.floor(((rotY + 45) % 360) / 90) % 4;
      setActiveFace(prev => (prev !== face ? face : prev));
    };

    const loop = () => {
      if (!alive) return;
      update();
      rafId = requestAnimationFrame(loop);
    };
    loop();

    const onScroll = () => update();
    window.addEventListener('scroll', onScroll, { passive: true });
    window.addEventListener('resize', onScroll);

    return () => {
      alive = false;
      if (rafId) cancelAnimationFrame(rafId);
      window.removeEventListener('scroll', onScroll);
      window.removeEventListener('resize', onScroll);
    };
  }, []);

  return (
    <section ref={sectionRef} id="capabilities" className="caps-scroll" data-screen-label="02 Capabilities">
      <div className="caps-intro">
        <div className="sec-head reveal">
          <h2 className="sec-title">
            {t('capsTitleA')}<br />
            <span className="thin">{t('capsTitleB')}</span>
          </h2>
          <p className="sec-desc">{t('capsDesc')}</p>
        </div>
      </div>

      <div className="caps-sticky">
        <div className="caps-layout">
          <div className="caps-dots">
            {caps.map((c, i) => (
              <div key={i} className={`caps-dot ${i === activeFace ? 'active' : ''}`}>
                <span className="caps-dot-mark" />
                <span className="caps-dot-num">{c.num}</span>
              </div>
            ))}
          </div>

          <div className="caps-stage">
            <div className="caps-cube" ref={cubeRef}>
              {caps.map((c, i) => (
                <div
                  key={i}
                  className={`caps-face face-${i}`}
                  style={{ '--face-tint': c.tint, backgroundImage: `url("${c.photo}")` }}
                >
                  <div className="face-photo-veil" />
                  <div className="face-corner tl" />
                  <div className="face-corner tr" />
                  <div className="face-corner bl" />
                  <div className="face-corner br" />
                  <div className="face-foot">
                    <div className="face-line" />
                    <div className="face-headline">{t(`pill_${c.key}_line`)}</div>
                  </div>
                </div>
              ))}
            </div>
            <div className="caps-shadow" />
          </div>

          <div className="caps-panel">
            {caps.map((c, i) => (
              <div key={i} className={`caps-panel-item ${i === activeFace ? 'active' : ''}`}>
                <div className="panel-num">, {c.num}</div>
                <h3>{t(`pill_${c.key}_line`)}</h3>
                <p>{t(`case_${c.key}_sub`)}</p>
                <div className="panel-tag" style={{ color: c.tint }}>{t(`case_${c.key}_tag`)}</div>
              </div>
            ))}
          </div>
        </div>
      </div>
    </section>
  );
}

function DataflowSection() {
  const t = useT();
  return (
    <section id="dataflow" data-screen-label="04 Dataflow">
      <div className="sec-head reveal">
        <h2 className="sec-title">
          {t('dfIngest')}<br />
          <span className="thin">{t('dfFuse')}</span> {t('dfEmit')}
        </h2>
        <p className="sec-desc">{t('dfDesc')}</p>
      </div>
      <div className="reveal">
        <DataflowDiagram />
      </div>
    </section>
  );
}

function SourcesSection() {
  const col1 = [
    { n: 'POLYMARKET', vol: '4.2M$ / 24h', lat: '180ms' },
    { n: 'KALSHI', vol: '1.8M$ / 24h', lat: '220ms' },
    { n: 'BETFAIR EXCHANGE', vol: '82.4M£ / 24h', lat: '90ms' },
    { n: 'MANIFOLD', vol: '140k / 24h', lat: '310ms' },
    { n: 'PREDICTIT ARCHIVAL', vol: 'historical', lat: ',' },
    { n: 'SMARKETS', vol: '12.1M£ / 24h', lat: '120ms' },
    { n: 'MYRIAD (SOL)', vol: '0.9M$ / 24h', lat: '420ms' },
    { n: 'CROWDLOGIC IRL', vol: 'research feed', lat: '1s' },
  ];
  const col2 = [
    { n: 'LME METALS L2', vol: ',', lat: '38ms' },
    { n: 'ICE BRENT / WTI', vol: ',', lat: '22ms' },
    { n: 'BALTIC DRY INDEX', vol: 'daily', lat: ',' },
    { n: 'MARINETRAFFIC AIS', vol: '412k vessels', lat: '6s' },
    { n: 'FLIGHTRADAR ADS-B', vol: '28k flights', lat: '8s' },
    { n: 'SENTINEL-2 SAR', vol: '5-day revisit', lat: ',' },
    { n: 'TELEGRAM OSINT', vol: '2,410 channels', lat: '45s' },
    { n: 'X/FIREHOSE', vol: 'weighted sample', lat: '12s' },
  ];
  return (
    <section id="sources" data-screen-label="03 Sources">
      <div className="sec-head reveal">
        <h2 className="sec-title">
          1,240 SIGNALS.<br />
          <span className="thin">FUSED IN REAL TIME.</span>
        </h2>
        <p className="sec-desc">
          Prediction markets give us the wisdom of crowds with money on the line.
          Raw material telemetry tells us what's actually moving. Social chatter reveals narrative.
          Światowid cross-validates all three before emitting a signal.
        </p>
      </div>

      <div className="sources reveal">
        <div className="source-col">
          <h4><span>MARKETS · PREDICTION</span><span className="count">, 014 / 214</span></h4>
          {col1.map((s, i) => (
            <div className="source-row" key={s.n}>
              <span className="idx">{String(i + 1).padStart(3, '0')}</span>
              <span className="name">{s.n}</span>
              <span className="volume">{s.vol}</span>
              <span className="latency"><span className="live" style={{ display: 'inline-block', marginRight: 6 }}></span>{s.lat}</span>
            </div>
          ))}
        </div>
        <div className="source-col">
          <h4><span>MATERIAL · TELEMETRY · OSINT</span><span className="count">, 018 / 412</span></h4>
          {col2.map((s, i) => (
            <div className="source-row" key={s.n}>
              <span className="idx">{String(i + 1).padStart(3, '0')}</span>
              <span className="name">{s.n}</span>
              <span className="volume">{s.vol}</span>
              <span className="latency"><span className="live" style={{ display: 'inline-block', marginRight: 6 }}></span>{s.lat}</span>
            </div>
          ))}
        </div>
      </div>
    </section>
  );
}

function DualUseSection() {
  const t = useT();
  return (
    <section id="dual-use" data-screen-label="05 Dual-use">
      <div className="sec-head reveal">
        <h2 className="sec-title">
          {t('duTitleA')}<br />
          <span className="thin">{t('duTitleB')}</span>
        </h2>
        <p className="sec-desc">{t('duDesc')}</p>
      </div>
      <SplitShowcase />
    </section>
  );
}

function GlobeSection() {
  return (
    <section id="forecast" data-screen-label="05 Globe">
      <div className="sec-head reveal">
        <h2 className="sec-title">
          SEVEN ZONES.<br />
          <span className="thin">ONE PROBABILITY LAYER.</span>
        </h2>
        <p className="sec-desc">
          A live geopolitical risk map. Drag to rotate the globe, click any zone
          to surface Światowid's current 24-hour probability estimate, its top-signal
          drivers, and the horizon under which the forecast resolves.
        </p>
      </div>

      <div className="reveal">
        <InteractiveGlobe />
      </div>
    </section>
  );
}

const PARTNER_DATA = [
  { key: 1, target: 4 },
  { key: 2, target: 3 },
  { key: 3, target: 9 },
  { key: 4, target: 6 },
  { key: 5, target: 2 },
];

function CountUp({ target, inView, duration = 1400, delay = 0 }) {
  const [n, setN] = React.useState(0);
  React.useEffect(() => {
    if (!inView) { setN(0); return; }
    let rafId = 0;
    const startTimer = setTimeout(() => {
      const start = performance.now();
      const tick = (now) => {
        const p = Math.min(1, (now - start) / duration);
        // easeOutQuart, feels like a stabilizing counter
        const e = 1 - Math.pow(1 - p, 4);
        setN(Math.round(e * target));
        if (p < 1) rafId = requestAnimationFrame(tick);
      };
      rafId = requestAnimationFrame(tick);
    }, delay);
    return () => { clearTimeout(startTimer); if (rafId) cancelAnimationFrame(rafId); };
  }, [inView, target, duration, delay]);
  return String(n).padStart(2, '0');
}

function PartnersSection() {
  const t = useT();
  const ref = React.useRef(null);
  const [inView, setInView] = React.useState(false);

  React.useEffect(() => {
    const el = ref.current;
    if (!el) return;
    const io = new IntersectionObserver(([e]) => { if (e.isIntersecting) setInView(true); }, { threshold: 0.2 });
    io.observe(el);
    return () => io.disconnect();
  }, []);

  return (
    <section id="partners" ref={ref} data-screen-label="03 Partners">
      <div className="sec-head reveal">
        <h2 className="sec-title">
          {t('ptrTitleA')}<br />
          <span className="thin">{t('ptrTitleB')}</span>
        </h2>
        <p className="sec-desc">{t('ptrDesc')}</p>
      </div>

      <div className={`partners-grid reveal ${inView ? 'is-ready' : ''}`}>
        {PARTNER_DATA.map((p, i) => (
          <div key={p.key} className="partner-card" style={{ animationDelay: `${i * 90}ms` }}>
            <div className="partner-corner tl" />
            <div className="partner-corner tr" />
            <div className="partner-corner bl" />
            <div className="partner-corner br" />
            <div className="partner-label">{t(`ptr${p.key}Label`)}</div>
            <div className="partner-num tabular">
              <CountUp target={p.target} inView={inView} duration={1500} delay={240 + i * 130} />
            </div>
            <div className="partner-desc">{t(`ptr${p.key}Desc`)}</div>
          </div>
        ))}
      </div>
    </section>
  );
}

const SPLIT_COMM_ROWS = [
  { n: 'NATO summit joint statement mentions &quot;Taiwan&quot;?', p: 72 },
  { n: 'Copper LME close &gt; $9,850 by Fri?', p: 58 },
  { n: 'Euroleague top-scorer exceeds 30pts tonight?', p: 44 },
  { n: 'ECB holds rate at next meeting?', p: 86 },
];
const SPLIT_DEF_ROWS = [
  { n: 'Russian push on Kupiansk axis', p: 34 },
  { n: 'Drone swarm over Odesa oblast', p: 78 },
  { n: 'Rail reroute via Tikhoretsk', p: 61 },
  { n: 'Grain corridor incident', p: 22 },
];

function SplitShowcase() {
  const t = useT();
  const ref = React.useRef(null);
  const afterRef = React.useRef(null);
  const rafRef = React.useRef(0);
  const targetRef = React.useRef(0.5);
  const [visible, setVisible] = React.useState(false);

  // Observe viewport entry to animate bars in.
  React.useEffect(() => {
    const el = ref.current;
    if (!el) return;
    const io = new IntersectionObserver(([e]) => { if (e.isIntersecting) setVisible(true); }, { threshold: 0.25 });
    io.observe(el);
    return () => io.disconnect();
  }, []);

  // Imperative clip-path update, bypass React render cycle for hover smoothness.
  const applyClip = React.useCallback(() => {
    rafRef.current = 0;
    const raw = targetRef.current;
    const SKEW = 0.06;
    // Map cursor 0..1 to a wider pos range so extremes fully reveal the other side.
    const pos = raw * (1 + 2 * SKEW) - SKEW;
    const topPct = (pos + SKEW) * 100;
    const botPct = (pos - SKEW) * 100;
    const el = afterRef.current;
    if (el) el.style.clipPath = `polygon(${topPct}% 0%, 100% 0%, 100% 100%, ${botPct}% 100%)`;
  }, []);

  // Set initial clip imperatively (once, on mount) so React never owns it.
  React.useEffect(() => { applyClip(); }, [applyClip]);

  const schedule = React.useCallback(() => {
    if (!rafRef.current) rafRef.current = requestAnimationFrame(applyClip);
  }, [applyClip]);

  const update = React.useCallback((clientX) => {
    const r = ref.current && ref.current.getBoundingClientRect();
    if (!r) return;
    targetRef.current = Math.max(0, Math.min(1, (clientX - r.left) / r.width));
    schedule();
  }, [schedule]);

  React.useEffect(() => {
    return () => { if (rafRef.current) cancelAnimationFrame(rafRef.current); };
  }, []);

  const onMove = (e) => update(e.clientX);
  const onTouchMove = (e) => { const t0 = e.touches && e.touches[0]; if (t0) update(t0.clientX); };
  const onLeave = () => { targetRef.current = 0.5; schedule(); };

  return (
    <div
      ref={ref}
      className="split-container reveal"
      onMouseMove={onMove}
      onMouseLeave={onLeave}
      onTouchMove={onTouchMove}
      role="img"
      aria-label={t('splitCaption')}
    >
      <div
        className="split-before"
        style={{ backgroundImage: 'url("https://images.pexels.com/photos/31650949/pexels-photo-31650949.jpeg?auto=compress&cs=tinysrgb&w=1600")' }}
      >
        <div className="split-panel split-panel-left">
          <div className="split-kicker">{t('duCommLabel')}</div>
          <h3 className="split-h">
            <span className="thin">{t('duCommThin')}</span><br />
            <em>{t('duCommTitle')}</em>
          </h3>
          <p className="split-p">{t('duCommDesc')}</p>
          <ul className="split-bullets">
            <li>{t('duCommB1')}</li>
            <li>{t('duCommB2')}</li>
            <li>{t('duCommB3')}</li>
            <li>{t('duCommB4')}</li>
          </ul>
        </div>
        <span className="split-label split-label-left">{t('splitCivil')}</span>
      </div>
      <div
        ref={afterRef}
        className="split-after"
        style={{ backgroundImage: 'url("https://images.pexels.com/photos/29081313/pexels-photo-29081313.jpeg?auto=compress&cs=tinysrgb&w=1600")' }}
      >
        <div className="split-panel split-panel-right">
          <div className="split-kicker">{t('duDefLabel')}</div>
          <h3 className="split-h">
            <span className="thin">{t('duDefThin')}</span><br />
            <em>{t('duDefTitle')}</em>
          </h3>
          <p className="split-p">{t('duDefDesc')}</p>
          <ul className="split-bullets">
            <li>{t('duDefB1')}</li>
            <li>{t('duDefB2')}</li>
            <li>{t('duDefB3')}</li>
            <li>{t('duDefB4')}</li>
          </ul>
        </div>
        <span className="split-label split-label-right">{t('splitMilit')}</span>
      </div>
      <div className="split-corner tl" />
      <div className="split-corner tr" />
      <div className="split-corner bl" />
      <div className="split-corner br" />
    </div>
  );
}

function CTAFinal() {
  const t = useT();
  return (
    <section className="cta-final" id="contact" data-screen-label="07 CTA">
      <div className="reveal" style={{ display: 'flex', justifyContent: 'center', marginBottom: 40 }}>
        <TotemLogo size={100} color="var(--amber)" speed={6000} />
      </div>
      <h2 className="reveal">
        <span className="thin">{t('ctaTitleA')}</span><br />
        <em>{t('ctaTitleB')}</em>
      </h2>
      <p className="reveal">{t('ctaDesc')}</p>
      <div className="hero-ctas reveal" style={{ justifyContent: 'center' }}>
        <a className="btn primary" href={window.SWIATOWID_SITE_CONFIG.requestAccessHref} target="_blank" rel="noopener noreferrer">{t('ctaApply')} <span className="arrow">→</span></a>
        <a className="btn" href="brief.html">{t('ctaDownload')}</a>
      </div>
    </section>
  );
}

function Footer() {
  const t = useT();
  return <SiteFooter t={t} requestAccessHref="#contact" />;
}

function Tweaks({ editMode, tweaks, updateTweak }) {
  return (
    <div className={`tweaks ${editMode ? 'on' : ''}`}>
      <div className="head">
        <span>TWEAKS</span>
        <span style={{ color: 'var(--fg-faint)' }}>◆ LIVE</span>
      </div>
      <div className="row">
        <label>Theme</label>
        <div className="opts">
          {Object.entries(THEMES).map(([k, v]) => (
            <div key={k} className={`opt ${tweaks.theme === k ? 'active' : ''}`} onClick={() => updateTweak('theme', k)}>{v.label}</div>
          ))}
        </div>
      </div>
      <div className="row">
        <label>Logo animation</label>
        <div className="opts">
          {['flip', 'fade', 'glitch'].map(k => (
            <div key={k} className={`opt ${tweaks.logoAnim === k ? 'active' : ''}`} onClick={() => updateTweak('logoAnim', k)}>{k.toUpperCase()}</div>
          ))}
        </div>
      </div>
    </div>
  );
}

ReactDOM.createRoot(document.getElementById('root')).render(<App />);
