// Swiatowid landing, hero + sections

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

const THEMES = {
  dark: { label: 'OBSIDIAN', attr: 'dark' },
  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.
// First-frame stills extracted from source mp4 at native resolution (ffmpeg -q:v 1).
const CASE_POSTERS = {
  heavy:   'assets/posters/hero-brokers.jpg',
  markets: 'assets/posters/hero-bookmakers.jpg',
  pharma:  'assets/posters/hero-insurance.jpg',
  defense: 'assets/posters/hero-publishers.jpg',
};
const USE_CASES = [
  { key: 'heavy',   code: 'HV-01', src: 'https://videos.pexels.com/video-files/7578613/7578613-uhd_2732_1440_25fps.mp4', srcMobile: 'assets/videos/mobile/hero-brokers.mp4', poster: CASE_POSTERS.heavy },
  { key: 'markets', code: 'MX-02', src: 'https://videos.pexels.com/video-files/32086211/13677496_1440_2560_30fps.mp4', srcMobile: 'assets/videos/mobile/hero-bookmakers.mp4', poster: CASE_POSTERS.markets },
  { key: 'pharma',  code: 'LG-03', src: 'https://videos.pexels.com/video-files/7732811/7732811-hd_1920_1080_25fps.mp4', srcMobile: 'assets/videos/mobile/hero-insurance.mp4', poster: CASE_POSTERS.pharma },
  { key: 'defense', code: 'DF-04', src: 'https://videos.pexels.com/video-files/6980928/6980928-uhd_2560_1440_25fps.mp4', srcMobile: 'assets/videos/mobile/hero-publishers.mp4', poster: CASE_POSTERS.defense },
];
const CASE_DURATION_MS = 5000;
const HERO_MOBILE_MQ = '(max-width: 900px)';

// iPhone and iPad (iPadOS reports itself as a Mac with touch). Safari there
// often refuses muted autoplay (Low Power Mode, data saver), so the hero shows
// each clip's first frame instead of downloading video it may never play.
const IS_APPLE_TOUCH = typeof navigator !== 'undefined'
  && (/iPad|iPhone|iPod/.test(navigator.userAgent) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1));

function useHeroMobile() {
  const [mobile, setMobile] = React.useState(() =>
    typeof window !== 'undefined' && window.matchMedia(HERO_MOBILE_MQ).matches
  );
  React.useEffect(() => {
    const mq = window.matchMedia(HERO_MOBILE_MQ);
    const onChange = () => setMobile(mq.matches);
    mq.addEventListener('change', onChange);
    return () => mq.removeEventListener('change', onChange);
  }, []);
  return mobile;
}

function heroCaseSrc(c, mobile) {
  return mobile && c.srcMobile ? c.srcMobile : c.src;
}

// ─── i18n ─────────────────────────────────────────────────────────────────
const LANGS = [
  { code: 'en', label: 'EN', name: 'English' },
  { code: 'pl', label: 'PL', name: 'Polski' },
  { code: 'de', label: 'DE', name: 'Deutsch' },
  { code: 'es', label: 'ES', name: 'Español' },
  { code: 'fr', label: 'FR', name: 'Français' },
];

const TRANSLATIONS = {
  en: {
    navHome: 'Home',
    navCapabilities: 'Solutions',
    navOferta: 'Offering',
    navBlog: 'News',
    navCareers: 'Careers',
    navKontakt: 'Contact',
    navRequestAccess: 'REQUEST ACCESS',
    hero1: 'THE AI THAT',
    heroSees: 'SEES',
    heroEverything: 'EVERYTHING',
    heroBefore: 'BEFORE',
    heroItHappens: 'IT HAPPENS',
    heroBig: 'FROM RAW DATA\nTO MEANINGFUL INSIGHTS',
    heroSub: 'Swiatowid sees everything',
    heroCtaAccess: 'Request access',
    heroCtaBrief: 'Read capabilities brief',
    voicesTitleA: 'What our',
    voicesTitleB: 'partners say',
    voicesDesc: 'The people who put Swiatowid to work, in their words.',
    voicesCaption: 'What our partners say',
    voices_synerise_quote: 'From the very beginning, we believed in the potential of Swiatowid and the people building it. It is a team full of passion, competence and ambitious ideas that have a real chance to change the market. We are glad we can support their growth and be part of this story, helping turn bold visions into reality.',
    voices_synerise_name: 'Jarosław Królewski',
    voices_synerise_role: 'CEO, Synerise',
    voices_world_quote: 'For a long time, the Swiatowid team was our strongest partner in the European market. The guys consistently delivered results and thanks to their hard work, the World project acquired more than 100,000 users. They also surprised us many times with innovative ideas and a fresh approach to developing the project.',
    voices_world_name: 'Alex Blania',
    voices_world_role: 'CEO, Tools for Humanity · World',
    voices_betfan_quote: 'I’m impressed by the technical expertise and creativity of the Światowid team. Their solution enables us to offer betting options that aren’t available on any other platform. The team excels at designing custom systems, connecting different data sources and processes, and finding solutions where no ready-made blueprint exists.',
    voices_betfan_name: 'Łukasz Łazarewicz',
    voices_betfan_role: 'CEO, BETFAN',
    voices_kuke_quote: 'In receivables and export-transaction insurance, spotting risk early is everything. Perun delivers probability forecasts for market and geopolitical events that support our decisions and Swiatowid is a reliable, professional partner.',
    voices_kuke_name: 'Janusz Władczyk',
    voices_kuke_role: 'KUKE · Grupa PFR',
    caseKicker: 'Deployed across',
    case_pharma_tag: 'Insurance',
    case_pharma_sub: 'Parametric policies priced from live event probability.',
    case_markets_tag: 'Bookmakers',
    case_markets_sub: 'New markets opened from the first signal, not a week later.',
    case_heavy_tag: 'Brokers',
    case_heavy_sub: 'Event probability next to the chart, before the narrative catches up.',
    case_defense_tag: 'Publishers',
    case_defense_sub: 'A probability widget beside the article, not another opinion paragraph.',
    pill_pharma_line: 'Price parametric risk.',
    pill_markets_line: 'Open markets faster.',
    pill_heavy_line: 'Add probability to charts.',
    pill_defense_line: 'Turn news into odds.',
    dfIngest: 'AGGREGATE',
    dfFuse: 'ANALYSE',
    dfEmit: 'CONCLUDE',
    dfDesc: 'Swiatowid reads more than any research desk could, and keeps connecting new sources: prediction markets, media, open-source intelligence, expert networks. Each one carries a weight: how often it has been right, how often it has been wrong, and whether anything independent confirms it. Only then do those weights settle into a single number you can defend.',
    platTitleA: 'ONE NUMBER',
    platTitleB: 'FULL EXPLAINABILITY',
    platDesc: 'Every result shows which forecaster groups moved it, by how much and with what weight. Each group\'s contribution opens down to the individual forecasts, with the sources behind them and how accurate they have been so far.',
    platEvent: 'EVENT',
    platQuestion: 'Will allied forces conduct a military operation in the Middle East before the end of this year?',
    platWhy: 'EXPLAINABILITY LAYER',
    platWhyMeta: 'How each signal moved the final value.',
    platDrv_market: 'Prediction markets',
    platDrv_market_t: 'The contract on a military operation in the region by year-end repriced from 0.31 to 0.79 on five times the usual volume, the largest single move since it opened.',
    platDrv_osint: 'OSINT / GEOINT',
    platDrv_osint_t: 'Unusual aerial tanker traffic over the eastern Mediterranean, a pattern consistent with preparing a strike package.',
    platDrv_agency: 'Wire agencies',
    platDrv_agency_t: 'Reuters and AP report a carrier group repositioning into the Persian Gulf. The wires agree, but both trace back to a single administration source.',
    platDrv_expert: 'Expert network',
    platDrv_expert_t: 'Three regional analysts raised their assessment. Historical accuracy of that group: 0.81.',
    platDrv_social: 'Social / narratives',
    platDrv_social_t: 'A wave of unverified posts about embassy evacuations. The pattern matches earlier false alarms, so the channel was weighted down rather than up.',
    platAlert: 'ALERT',
    platNow: 'NOW',
    platProbLabel: 'PROBABILITY',
    platChartAlt: 'Probability over the 30-day horizon: flat at the baseline, then a jump inside the detection window.',
    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: 'DUAL-USE',
    duTitleB: 'ONE TECHNOLOGY, TWO USES',
    duDesc: 'Swiatowid applies the same forecasting technology to both commercial and security use cases. In the market it can support risk pricing, odds, insurance, analytics and information products. In security it helps assess how a situation develops, the risk of escalation, force movements or logistics anomalies. The foundation stays the same: a shared model, methodology and way of weighting sources. What changes is the deployment environment, the scope of access and how data is managed.',
    duCommLabel: 'MARKET AND MEDIA',
    duCommThin: 'Applications',
    duCommTitle: 'COMMERCIAL',
    duCommDesc: 'Event probability goes straight into products: bookmaker odds, insurance models, market analysis and content for readers. It prices what an event means before its effects are fully reflected in the market.',
    duDefLabel: 'DEFENCE AND SERVICES',
    duDefThin: 'Applications',
    duDefTitle: 'STATE',
    duDefDesc: 'Event probability supports situation assessment: the risk of escalation, force movements and disruptions in logistics and supply. It raises an early warning and supports decisions built on results whose sources and derivation can be clearly traced.',
    duProfile: 'RECIPIENT PROFILE',
    duCommC1: 'BROKERS',
    duCommC2: 'BOOKMAKERS',
    duCommC3: 'INSURERS',
    duCommC4: 'PUBLISHERS',
    duDefC1: 'GOVERNMENT',
    duDefC2: 'DEFENCE',
    duDefC3: 'PUBLIC AGENCIES',
    ctaTitleA: 'REQUEST',
    ctaTitleB: 'CLEARANCE',
    ctaDesc: 'Swiatowid 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)',
    capFaqTitleA: 'Frequently',
    capFaqTitleB: 'asked questions',
    capFaqDesc: 'The questions that come back most often before a first briefing. If yours is not here, write to us.',
    capFaqContact: 'Ask a question',
    capFaq_001_q: 'What is Perun and how does the event probability stream work?',
    capFaq_001_a: 'Perun is a signal stream. It gathers prediction markets, news services, open sources and the movement of goods, then reduces them to a single number: the probability that a specific event happens. A partner subscribes to the events it cares about over REST and WebSocket and embeds the result in its own product. This does not replace a research desk, it backs one up: it gives you the crowd\'s price, which an analyst can hold their own thesis against and see where the two diverge.',
    capFaq_002_q: 'Can I build an odds feed on top of Perun?',
    capFaq_002_a: 'Yes, and it is one of the main uses. The probabilities compose into a ready odds feed: a market opens the same day the event appears, and the operator has an independent reference for its own pricing. Political, geopolitical, financial and technology markets update continuously, the way sports odds do, instead of sitting at a price set once. Refresh runs under a second, so trading reacts before the line moves. The odds, the margin and the UX stay with the operator.',
    capFaq_003_q: 'How does the insurance industry use Perun?',
    capFaq_003_a: 'Wherever uncertainty is in play: risk assessment, pricing, and watching contracts already on the books. When a geopolitical, climate or market event raises exposure, the risk team hears about it straight away rather than at the next portfolio review. What matters most, though, is explainability: every number shows which signals moved it and by how much. A decision can be justified to the regulator, not merely reported.',
    capFaq_004_q: 'How do I keep readers engaged next to an article?',
    capFaq_004_a: 'With a ready widget matched to what the piece is about. Under an election story sits the question of whether a given candidate wins; under a markets piece, whether a company lists this year. The reader can vote their own guess first, then see how Perun prices the same event, and come back when it settles. Instead of speculation in the comments there is a number that can be checked.',
    capFaq_005_q: 'How does Perun help with market analysis?',
    capFaq_005_a: 'It shows how the market prices what historical data cannot: the probability of a rate hike, an election result, an acquisition or a listing. It is the crowd\'s consensus, which you can set against your own model to see where an asset\'s valuation drifts from what the market actually expects. For fintech it is a layer of context no quote feed sells.',
    capFaq_006_q: 'Where does Perun run and what happens to my data?',
    capFaq_006_a: 'By default through our API, and then there is nothing to stand up on your side. If the data is sensitive enough that it cannot leave your infrastructure, we deploy Perun in your cloud or on your own servers, including a network cut off from the internet. The technology has passed an independent technical audit by Thoughtworks.',
    capFaq_007_q: 'What does integration actually look like?',
    capFaq_007_a: 'We open an account for you on the platform. From a catalogue of thousands of events you pick the ones that should feed yours, and you manage that feed yourself: add, remove, change the scope. Reading it runs over REST and WebSocket, refreshing in under a second. Alongside every result sits the explainability layer, showing which signals added up to that number.',
    capFaq_008_q: 'Can I test Perun first, and what does it cost?',
    capFaq_008_a: 'Yes. You open an account, pick a few events, and the pilot on those is free. Pricing is settled afterwards, in conversation: it depends on the size of the feed, the scope of the integration and how many events you actually subscribe to.',
    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 seven days.',
    reqaFieldName: 'Name',
    reqaFieldEmail: 'Work email',
    reqaFieldOrg: 'Organization',
    reqaFieldArea: 'Project area',
    reqaFieldMessage: 'Message',
    reqaFieldMessagePh: 'Project goal, expected timeline and any 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',
    df_in_crowd: 'CROWD\nWISDOM',
    df_in_osint: 'OSINT /\nGEOINT',
    df_in_media: 'NEWS /\nSOCIAL',
    df_in_expert: 'EXPERT\nNETWORK',
    df_out_genesis: 'MARKET\nGENESIS',
    df_out_conflict: 'CONFLICT\nFORECAST',
    df_out_logistics: 'LOGISTICS\nANOMALY',
    df_out_scenario: 'SCENARIO\nSIMULATION',
    footerCompany: 'Company',
    footerContact: 'Contact',
    footerSocial: 'Social',
    footerHQ: 'HQ',
    footerPrivacy: 'Privacy',
    footerTerms: 'Terms',
    footerCookies: 'Cookies',
  },
  pl: {
    navHome: 'Główna',
    navCapabilities: 'Rozwiązania',
    navOferta: 'Oferta',
    navBlog: 'Newsy',
    navCareers: 'Kariera',
    navKontakt: 'Kontakt',
    navRequestAccess: 'POPROŚ O DOSTĘP',
    hero1: 'SZTUCZNA INTELIGENCJA, KTÓRA',
    heroSees: 'WIDZI',
    heroEverything: 'WSZYSTKO',
    heroBefore: 'ZANIM',
    heroItHappens: 'SIĘ WYDARZY',
    heroBig: 'OD SUROWYCH DANYCH\nPO GOTOWE WNIOSKI',
    heroSub: 'Swiatowid widzi więcej',
    heroCtaAccess: 'Umów spotkanie',
    heroCtaBrief: 'Lista rozwiązań',
    voicesTitleA: 'Co mówią',
    voicesTitleB: 'o nas partnerzy',
    voicesDesc: 'Ludzie, którzy wdrożyli Swiatowida, ich własnymi słowami.',
    voicesCaption: 'Co mówią o nas partnerzy',
    voices_synerise_quote: 'Od samego początku wierzyliśmy w potencjał Swiatowida i ludzi, którzy go tworzą. To zespół pełen pasji, kompetencji i ambitnych pomysłów, które mają realną szansę zmieniać rynek. Cieszymy się, że możemy wspierać ich rozwój i być częścią tej historii, pomagając przekształcać odważne wizje w rzeczywistość.',
    voices_synerise_name: 'Jarosław Królewski',
    voices_synerise_role: 'Prezes, Synerise',
    voices_world_quote: 'Zespół Swiatowida przez długi czas był naszym najmocniejszym partnerem na rynku europejskim. Chłopaki konsekwentnie dowozili wyniki, a dzięki ich ciężkiej pracy projekt World pozyskał ponad 100 tysięcy użytkowników. Wielokrotnie zaskakiwali nas także innowacyjnymi pomysłami i świeżym podejściem do rozwoju projektu.',
    voices_world_name: 'Alex Blania',
    voices_world_role: 'CEO, Tools for Humanity · World',
    voices_betfan_quote: 'Jestem pod wrażeniem umiejętności technicznych i pomysłowości zespołu Światowida. Ich rozwiązanie pozwala nam oferować zakłady niedostępne na żadnej innej platformie. Zespół potrafi projektować niestandardowe systemy, łączyć ze sobą różne źródła danych i procesy oraz znajdować rozwiązania tam, gdzie nie ma gotowych schematów.',
    voices_betfan_name: 'Łukasz Łazarewicz',
    voices_betfan_role: 'CEO, BETFAN',
    voices_kuke_quote: 'W ubezpieczeniach należności i transakcji eksportowych liczy się wyprzedzające rozpoznanie ryzyka. Perun dostarcza nam prognozy prawdopodobieństwa zdarzeń rynkowych i geopolitycznych, które wspierają nasze decyzje, a Swiatowid to rzetelny i profesjonalny partner.',
    voices_kuke_name: 'Janusz Władczyk',
    voices_kuke_role: 'KUKE · Grupa PFR',
    caseKicker: 'Wdrożenia u klientów',
    case_pharma_tag: 'Ubezpieczenia',
    case_pharma_sub: 'Polisy parametryczne wyceniane z prawdopodobieństwa zdarzeń na żywo.',
    case_markets_tag: 'Bukmacherzy',
    case_markets_sub: 'Nowe rynki otwierane od pierwszego sygnału, nie tydzień później.',
    case_heavy_tag: 'Brokerzy',
    case_heavy_sub: 'Prawdopodobieństwo zdarzenia obok wykresu, zanim rynek dopowie narrację.',
    case_defense_tag: 'Wydawcy',
    case_defense_sub: 'Widget probabilistyczny przy artykule zamiast kolejnego akapitu opinii.',
    pill_pharma_line: 'Wyceń ryzyko parametryczne.',
    pill_markets_line: 'Otwieraj rynki szybciej.',
    pill_heavy_line: 'Dodaj procent do wykresu.',
    pill_defense_line: 'Zamień news w prawdopodobieństwo.',
    dfIngest: 'AGREGUJ',
    dfFuse: 'ANALIZUJ',
    dfEmit: 'WNIOSKUJ',
    dfDesc: 'Swiatowid czyta więcej, niż przeczyta jakikolwiek dział analiz, i bez przerwy podłącza nowe źródła: rynki predykcji, media, otwarty wywiad, sieci eksperckie. Każde z nich ma swoją wagę: ile razy miało rację, ile razy się pomyliło i czy potwierdza je ktoś niezależny. Dopiero z tych wag składa się jedna liczba, którą da się obronić.',
    platTitleA: 'JEDNA LICZBA',
    platTitleB: 'PEŁNA WYJAŚNIALNOŚĆ',
    platDesc: 'Przy każdym wyniku widać, które grupy prognostów na niego wpłynęły, w jakim stopniu i z jaką wagą. Wkład każdej grupy można rozwinąć aż do pojedynczych prognoz i sprawdzić, na jakich źródłach się opierają i jak trafne były dotąd.',
    platEvent: 'ZDARZENIE',
    platQuestion: 'Czy siły sojusznicze przeprowadzą operację wojskową na Bliskim Wschodzie do końca bieżącego roku?',
    platWhy: 'WARSTWA WYJAŚNIALNOŚCI',
    platWhyMeta: 'Wpływ poszczególnych sygnałów na końcową wartość.',
    platDrv_market: 'Rynki predykcyjne',
    platDrv_market_t: 'Kontrakt na operację wojskową w regionie do końca roku przeceniony z 0.31 na 0.79 przy pięciokrotnym wolumenie. Największy pojedynczy ruch na tym rynku od otwarcia kontraktu.',
    platDrv_osint: 'OSINT / GEOINT',
    platDrv_osint_t: 'Nietypowy ruch powietrznych tankowców nad wschodnią częścią Morza Śródziemnego, wzorzec typowy dla przygotowania uderzenia.',
    platDrv_agency: 'Agencje prasowe',
    platDrv_agency_t: 'Reuters i AP donoszą o przebazowaniu grupy lotniskowcowej w rejon Zatoki Perskiej. Depesze są zgodne, ale obie prowadzą do jednego źródła w administracji.',
    platDrv_expert: 'Sieć ekspercka',
    platDrv_expert_t: 'Trzech analityków regionalnych podniosło ocenę. Historyczna trafność tej grupy: 0.81.',
    platDrv_social: 'Social / narracje',
    platDrv_social_t: 'Fala niepotwierdzonych wpisów o ewakuacji placówek dyplomatycznych. Wzorzec zgodny z wcześniejszymi fałszywymi alarmami, więc waga tego kanału została obniżona, a nie podniesiona.',
    platAlert: 'ALERT',
    platNow: 'TERAZ',
    platProbLabel: 'PRAWDOPODOBIEŃSTWO',
    platChartAlt: 'Prawdopodobieństwo w horyzoncie 30 dni: płasko przy poziomie wyjściowym, potem skok wewnątrz okna detekcji.',
    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: 'DUAL-USE',
    duTitleB: 'PODWÓJNE ZASTOSOWANIE',
    duDesc: 'Swiatowid wykorzystuje tę samą technologię prognostyczną zarówno w zastosowaniach komercyjnych, jak i związanych z bezpieczeństwem. Na rynku może wspierać wycenę ryzyka, kursy, ubezpieczenia, analitykę i produkty informacyjne. W obszarze bezpieczeństwa pomaga oceniać rozwój sytuacji, ryzyko eskalacji, ruch sił czy anomalie logistyczne. Fundament pozostaje ten sam: wspólny model, metodologia i sposób ważenia źródeł. Zmieniają się środowisko wdrożenia, zakres dostępu oraz sposób zarządzania danymi.',
    duCommLabel: 'RYNEK I MEDIA',
    duCommThin: 'Zastosowania',
    duCommTitle: 'KOMERCYJNE',
    duCommDesc: 'Prawdopodobieństwo zdarzeń trafia bezpośrednio do produktów: kursów bukmacherskich, modeli ubezpieczeniowych, analiz rynkowych i treści dla czytelników. Pozwala wycenić znaczenie zdarzenia, zanim jego skutki zostaną w pełni uwzględnione przez rynek.',
    duDefLabel: 'OBRONNOŚĆ I SŁUŻBY',
    duDefThin: 'Zastosowania',
    duDefTitle: 'PAŃSTWOWE',
    duDefDesc: 'Prawdopodobieństwo zdarzeń wspiera ocenę sytuacji: ryzyka eskalacji, ruchów sił oraz zakłóceń w logistyce i dostawach. Daje sygnał ostrzegawczy i wspiera decyzje oparte na wynikach, których źródła i sposób powstania można jasno prześledzić.',
    duProfile: 'PROFIL ODBIORCY',
    duCommC1: 'BROKERZY',
    duCommC2: 'BUKMACHERZY',
    duCommC3: 'UBEZPIECZYCIELE',
    duCommC4: 'WYDAWCY',
    duDefC1: 'ADMINISTRACJA',
    duDefC2: 'OBRONNOŚĆ',
    duDefC3: 'SŁUŻBY PUBLICZNE',
    ctaTitleA: 'POPROŚ O',
    ctaTitleB: 'DOPUSZCZENIE',
    ctaDesc: 'Swiatowid 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 brief (PDF)',
    capFaqTitleA: 'Najczęściej',
    capFaqTitleB: 'zadawane pytania',
    capFaqDesc: 'To, o co pytają nas najczęściej przed pierwszym briefingiem. Jeśli Waszego pytania tu nie ma, napiszcie do nas.',
    capFaqContact: 'Zadaj pytanie',
    capFaq_001_q: 'Czym jest Perun i jak działa strumień prawdopodobieństwa zdarzeń?',
    capFaq_001_a: 'Perun to strumień sygnałów. Zbiera rynki predykcyjne, serwisy informacyjne, otwarte źródła i przepływy towarów, po czym sprowadza je do jednej liczby: prawdopodobieństwa, że konkretne zdarzenie nastąpi. Partner subskrybuje wybrane zdarzenia przez REST i WebSocket i osadza wynik we własnym produkcie. To nie zastępuje działu analiz, tylko go wspiera: daje wycenę mądrości tłumu, do której analityk przykłada własną tezę i widzi, gdzie się rozjeżdżają.',
    capFaq_002_q: 'Czy na prawdopodobieństwach Peruna da się zbudować feed kursów?',
    capFaq_002_a: 'Tak, i to jest jedno z głównych zastosowań. Z prawdopodobieństw da się złożyć gotowy feed kursów: rynek otwiera się tego samego dnia, w którym pojawia się zdarzenie, a operator ma niezależne odniesienie dla własnej wyceny. Rynki polityczne, geopolityczne, finansowe i technologiczne aktualizują się na bieżąco, tak jak kursy sportowe, zamiast stać przy raz ustawionej cenie. Odświeżanie schodzi poniżej sekundy, więc trading reaguje, zanim zmieni się linia. Kurs, marża i UX zostają po stronie operatora.',
    capFaq_003_q: 'Jak z Peruna korzysta branża ubezpieczeniowa?',
    capFaq_003_a: 'Wszędzie tam, gdzie w grę wchodzi niepewność: przy ocenie ryzyka, przy wycenie i przy monitoringu zawartych umów. Gdy wydarzenie geopolityczne, klimatyczne lub rynkowe podnosi ekspozycję, zespół ryzyka dostaje sygnał od razu, a nie przy najbliższym przeglądzie portfela. Najważniejsza jest jednak wyjaśnialność: przy każdej liczbie widać, które sygnały ją podniosły i o ile. Decyzję da się uzasadnić przed nadzorem, a nie tylko zaraportować.',
    capFaq_004_q: 'Jak zaangażować czytelników przy artykule?',
    capFaq_004_a: 'Gotowym widgetem dopasowanym do tematu tekstu. Pod artykułem o wyborach staje pytanie, czy dany kandydat wygra; pod tekstem o rynku, czy spółka wejdzie na giełdę w tym roku. Czytelnik może najpierw zagłosować po swojemu, a potem zobaczyć, jak to samo zdarzenie wycenia Perun, i wrócić, kiedy sprawa się rozstrzygnie. Zamiast domysłów w komentarzach zostaje liczba, którą da się sprawdzić.',
    capFaq_005_q: 'Jak Perun pomaga w analizie rynkowej?',
    capFaq_005_a: 'Pokazuje, jak rynek wycenia to, czego nie widać w danych historycznych: prawdopodobieństwo podwyżki stóp, wyniku wyborów, przejęcia albo debiutu giełdowego. To konsensus mądrości tłumu, który można zestawić z własnym modelem i sprawdzić, gdzie wycena aktywa odstaje od tego, czego rynek naprawdę się spodziewa. Dla fintechu to warstwa kontekstu, której nie kupi się w kanale z notowaniami.',
    capFaq_006_q: 'Gdzie działa Perun i co się dzieje z moimi danymi?',
    capFaq_006_a: 'Domyślnie przez nasze API i wtedy nie trzeba niczego u siebie stawiać. Jeśli dane są na tyle wrażliwe, że nie mogą opuścić waszej infrastruktury, wdrażamy Peruna w waszej chmurze albo na waszych serwerach, także w sieci odciętej od internetu. Technologia przeszła niezależny audyt techniczny Thoughtworks.',
    capFaq_007_q: 'Jak w praktyce wygląda integracja?',
    capFaq_007_a: 'Zakładamy wam konto na platformie. Z katalogu liczącego tysiące zdarzeń wybieracie te, które mają trafić do waszego feedu, i tym feedem zarządzacie sami: dodajecie, usuwacie, zmieniacie zakres. Sam odczyt idzie przez REST i WebSocket, z odświeżaniem poniżej sekundy. Przy każdym wyniku dochodzi warstwa wyjaśnialności, w której widać, które sygnały złożyły się na tę liczbę.',
    capFaq_008_q: 'Czy mogę przetestować Peruna i ile to kosztuje?',
    capFaq_008_a: 'Tak. Zakładacie konto, wybieracie kilka zdarzeń i pilotaż na nich jest bezpłatny. Cennik ustalamy dopiero potem, w rozmowie: zależy od wielkości feedu, zakresu integracji i tego, ile zdarzeń realnie subskrybujecie.',
    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 ciągu siedmiu dni.',
    reqaFieldName: 'Imię i nazwisko',
    reqaFieldEmail: 'E-mail służbowy',
    reqaFieldOrg: 'Organizacja',
    reqaFieldArea: 'Obszar projektu',
    reqaFieldMessage: 'Wiadomość',
    reqaFieldMessagePh: 'Cel projektu, oczekiwany harmonogram i istotne 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',
    df_in_crowd: 'MĄDROŚĆ\nTŁUMU',
    df_in_osint: 'OSINT /\nGEOINT',
    df_in_media: 'NEWSY /\nSOCIAL',
    df_in_expert: 'SIEĆ\nEKSPERTÓW',
    df_out_genesis: 'GENEZA\nRYNKU',
    df_out_conflict: 'PROGNOZA\nKONFLIKTU',
    df_out_logistics: 'ANOMALIA\nLOGISTYCZNA',
    df_out_scenario: 'SYMULACJA\nSCENARIUSZY',
    footerCompany: 'Firma',
    footerContact: 'Kontakt',
    footerSocial: 'Social',
    footerHQ: 'Siedziba',
    footerPrivacy: 'Prywatność',
    footerTerms: 'Regulamin',
    footerCookies: 'Cookies',
  },
  de: {
    // German fronts the object, so heroSees/heroEverything hold
    // "ALLES"/"SIEHT" rather than a literal key-for-key mapping.
    navHome: 'Start',
    navCapabilities: 'Lösungen',
    navOferta: 'Angebot',
    navBlog: 'News',
    navCareers: 'Karriere',
    navKontakt: 'Kontakt',
    navRequestAccess: 'ZUGANG ANFRAGEN',
    hero1: 'DIE KI, DIE',
    heroSees: 'ALLES',
    heroEverything: 'SIEHT',
    heroBefore: 'BEVOR',
    heroItHappens: 'ES PASSIERT',
    heroBig: 'VON ROHDATEN\nZU BELASTBAREN ERKENNTNISSEN',
    heroSub: 'Swiatowid sieht alles',
    heroCtaAccess: 'Zugang anfragen',
    heroCtaBrief: 'Capabilities Brief lesen',
    voicesTitleA: 'Was unsere',
    voicesTitleB: 'Partner sagen',
    voicesDesc: 'Die Menschen, die Swiatowid einsetzen, in ihren eigenen Worten.',
    voicesCaption: 'Was unsere Partner sagen',
    voices_synerise_quote: 'Von Anfang an haben wir an das Potenzial von Swiatowid und an die Menschen dahinter geglaubt. Es ist ein Team voller Leidenschaft, Kompetenz und ehrgeiziger Ideen, die den Markt wirklich verändern können. Wir freuen uns, ihr Wachstum unterstützen und Teil dieser Geschichte sein zu dürfen, indem wir helfen, kühne Visionen Wirklichkeit werden zu lassen.',
    voices_synerise_name: 'Jarosław Królewski',
    voices_synerise_role: 'CEO, Synerise',
    voices_world_quote: 'Das Team von Swiatowid war lange Zeit unser stärkster Partner auf dem europäischen Markt. Die Jungs haben konsequent geliefert und dank ihrer harten Arbeit hat das Projekt World mehr als 100.000 Nutzer gewonnen. Sie haben uns außerdem viele Male mit innovativen Ideen und einem frischen Blick auf die Weiterentwicklung des Projekts überrascht.',
    voices_world_name: 'Alex Blania',
    voices_world_role: 'CEO, Tools for Humanity · World',
    voices_betfan_quote: 'Ich bin beeindruckt von der technischen Kompetenz und der Kreativität des Światowid-Teams. Ihre Lösung ermöglicht es uns, Wetten anzubieten, die es auf keiner anderen Plattform gibt. Das Team entwirft maßgeschneiderte Systeme, verbindet unterschiedliche Datenquellen und Prozesse miteinander und findet Lösungen dort, wo es keine fertigen Vorlagen gibt.',
    voices_betfan_name: 'Łukasz Łazarewicz',
    voices_betfan_role: 'CEO, BETFAN',
    voices_kuke_quote: 'In der Forderungs- und Exportkreditversicherung ist das frühe Erkennen von Risiken alles. Perun liefert Wahrscheinlichkeitsprognosen für Markt- und geopolitische Ereignisse, die unsere Entscheidungen stützen und Swiatowid ist ein verlässlicher, professioneller Partner.',
    voices_kuke_name: 'Janusz Władczyk',
    voices_kuke_role: 'KUKE · Grupa PFR',
    caseKicker: 'Im Einsatz bei',
    case_pharma_tag: 'Versicherer',
    case_pharma_sub: 'Parametrische Policen, bepreist aus laufender Ereigniswahrscheinlichkeit.',
    case_markets_tag: 'Buchmacher',
    case_markets_sub: 'Neue Märkte ab dem ersten Signal, nicht erst eine Woche später.',
    case_heavy_tag: 'Broker',
    case_heavy_sub: 'Ereigniswahrscheinlichkeit neben dem Chart, bevor die Erzählung nachzieht.',
    case_defense_tag: 'Verlage',
    case_defense_sub: 'Ein Wahrscheinlichkeits-Widget neben dem Artikel statt eines weiteren Meinungsabsatzes.',
    pill_pharma_line: 'Parametrisches Risiko bepreisen.',
    pill_markets_line: 'Märkte schneller öffnen.',
    pill_heavy_line: 'Wahrscheinlichkeit in Charts bringen.',
    pill_defense_line: 'Nachrichten in Quoten verwandeln.',
    dfIngest: 'AGGREGIEREN',
    dfFuse: 'ANALYSIEREN',
    dfEmit: 'SCHLUSSFOLGERN',
    dfDesc: 'Swiatowid liest mehr, als jede Research-Abteilung je lesen könnte, und schließt ununterbrochen neue Quellen an: Prognosemärkte, Medien, offene Quellen, Expertennetzwerke. Jede trägt ihr Gewicht: wie oft sie recht hatte, wie oft sie danebenlag und ob sie unabhängig bestätigt wird. Erst aus diesen Gewichten entsteht eine einzige Zahl, die sich verteidigen lässt.',
    platTitleA: 'EINE ZAHL',
    platTitleB: 'VOLLE ERKLÄRBARKEIT',
    platDesc: 'Zu jedem Ergebnis ist sichtbar, welche Prognosegruppen es beeinflusst haben, wie stark und mit welchem Gewicht. Der Beitrag jeder Gruppe lässt sich bis zu den einzelnen Prognosen aufklappen, samt ihren Quellen und ihrer bisherigen Trefferquote.',
    platEvent: 'EREIGNIS',
    platQuestion: 'Führen verbündete Streitkräfte bis Ende dieses Jahres eine Militäroperation im Nahen Osten durch?',
    platWhy: 'ERKLÄRBARKEITSSCHICHT',
    platWhyMeta: 'Wie stark jedes Signal den Endwert bewegt hat.',
    platDrv_market: 'Prognosemärkte',
    platDrv_market_t: 'Der Kontrakt auf eine Militäroperation in der Region bis Jahresende wurde bei fünffachem Volumen von 0,31 auf 0,79 neu bepreist, die größte Einzelbewegung seit seiner Eröffnung.',
    platDrv_osint: 'OSINT / GEOINT',
    platDrv_osint_t: 'Auffälliger Tankflugzeugverkehr über dem östlichen Mittelmeer, ein Muster, wie es der Vorbereitung eines Schlags entspricht.',
    platDrv_agency: 'Nachrichtenagenturen',
    platDrv_agency_t: 'Reuters und AP melden die Verlegung einer Trägergruppe in den Persischen Golf. Die Meldungen stimmen überein, führen aber beide auf eine einzige Quelle in der Regierung zurück.',
    platDrv_expert: 'Expertennetzwerk',
    platDrv_expert_t: 'Drei Regionalanalysten hoben ihre Einschätzung an. Historische Treffsicherheit dieser Gruppe: 0,81.',
    platDrv_social: 'Social / Narrative',
    platDrv_social_t: 'Eine Welle unbestätigter Posts über Botschaftsevakuierungen. Das Muster entspricht früheren Fehlalarmen, deshalb wurde der Kanal herunter- und nicht heraufgewichtet.',
    platAlert: 'ALARM',
    platNow: 'JETZT',
    platProbLabel: 'WAHRSCHEINLICHKEIT',
    platChartAlt: 'Wahrscheinlichkeit über den 30-Tage-Horizont: flach auf Ausgangsniveau, dann ein Sprung im Erkennungsfenster.',
    cap1Title: 'Market Genesis',
    cap1Desc: 'Neuartige Prognosemärkte für Gaming- und Fintech-Partner aus Echtzeitsignalen der realen Welt erzeugen.',
    cap2Title: 'Conflict Forecast',
    cap2Desc: 'Bewegungswahrscheinlichkeiten auf Bataillonsebene, Horizont 6–72 h, fusioniert aus OSINT, SIGINT und Logistiktelemetrie.',
    cap3Title: 'Rohstoffströme',
    cap3Desc: 'Kupfer, Lithium, Getreide, LNG, Sichtbarkeit auf Sendungsebene aus 312 Häfen und 1.100 Bahnknoten.',
    cap4Title: 'Sentiment-Gewichtung',
    cap4Desc: 'Sprachübergreifendes Narrativ-Tracking über 47 Plattformen mit Herkunftsbewertung und Bot-Filterung.',
    cap5Title: 'Quoten-Arbitrage',
    cap5Desc: 'Drift-Erkennung über Buchmacher hinweg und Erzeugung synthetischer Märkte mit automatischem Liquiditäts-Hedging.',
    cap6Title: 'Szenariosimulation',
    cap6Desc: 'Monte-Carlo-Weltlinien mit 10⁶ Samples. Kontrafaktische Verzweigung mit Politikmodellen benannter Akteure.',
    ptrTitleA: 'IM EINSATZ',
    ptrTitleB: 'WO ENTSCHEIDUNGEN GELD KOSTEN',
    ptrDesc: 'Partner arbeiten unter bilateralen NDAs. Logos werden nicht öffentlich genannt. Beschaffungsanfragen laufen über Ihre Regierungsverbindung oder unseren Commercial Desk.',
    ptr1Label: 'VERTEIDIGUNGSMINISTERIEN NATO-EBENE',
    ptr1Desc: 'Einsätze in Mitgliedstaaten',
    ptr2Label: 'FTSE-100-BERGBAU',
    ptr2Desc: 'Partner der Rohstoffversorgung',
    ptr3Label: 'LIZENZIERTE SPORTSBOOKS',
    ptr3Desc: 'In EU und UK regulierte Anbieter',
    ptr4Label: 'PROGNOSEMÄRKTE',
    ptr4Desc: 'L1-Vereinbarungen zum Datenaustausch',
    ptr5Label: 'STAATSFONDS',
    ptr5Desc: 'Strategische Aufklärungsstufe',
    duTitleA: 'DUAL USE',
    duTitleB: 'EINE TECHNOLOGIE, ZWEI ZWECKE',
    duDesc: 'Swiatowid nutzt dieselbe Prognosetechnologie sowohl für kommerzielle als auch für sicherheitsbezogene Anwendungen. Im Markt kann sie Risikobewertung, Quoten, Versicherungen, Analytik und Informationsprodukte unterstützen. Im Sicherheitsbereich hilft sie, die Entwicklung einer Lage, Eskalationsrisiken, Truppenbewegungen oder logistische Anomalien einzuschätzen. Das Fundament bleibt gleich: ein gemeinsames Modell, dieselbe Methodik und dieselbe Gewichtung der Quellen. Es ändern sich die Einsatzumgebung, der Zugriffsumfang und die Art der Datenverwaltung.',
    duCommLabel: 'MARKT UND MEDIEN',
    duCommThin: 'Anwendungen',
    duCommTitle: 'KOMMERZIELL',
    duCommDesc: 'Die Ereigniswahrscheinlichkeit fließt direkt in Produkte ein: Buchmacherquoten, Versicherungsmodelle, Marktanalysen und Inhalte für Leser. So lässt sich die Bedeutung eines Ereignisses bewerten, bevor der Markt seine Folgen vollständig eingepreist hat.',
    duDefLabel: 'VERTEIDIGUNG UND DIENSTE',
    duDefThin: 'Anwendungen',
    duDefTitle: 'BEHÖRDLICH',
    duDefDesc: 'Die Ereigniswahrscheinlichkeit unterstützt die Lagebeurteilung: Eskalationsrisiken, Truppenbewegungen sowie Störungen in Logistik und Nachschub. Sie liefert ein Warnsignal und stützt Entscheidungen auf Ergebnisse, deren Quellen und Entstehung sich klar nachvollziehen lassen.',
    duProfile: 'EMPFÄNGERPROFIL',
    duCommC1: 'BROKER',
    duCommC2: 'BUCHMACHER',
    duCommC3: 'VERSICHERER',
    duCommC4: 'MEDIENHÄUSER',
    duDefC1: 'REGIERUNG',
    duDefC2: 'VERTEIDIGUNG',
    duDefC3: 'BEHÖRDEN',
    ctaTitleA: 'FREIGABE',
    ctaTitleB: 'ANFRAGEN',
    ctaDesc: 'Swiatowid ist kein Self-Service. Zugang wird nach einer Prüfung der Souveränitätsausrichtung und einem Vendor-Vetting gewährt. Rechnen Sie mit 14–28 Tagen bis zum ersten Briefing.',
    ctaApply: 'Zugang beantragen',
    ctaDownload: 'Capabilities Brief herunterladen (PDF)',
    capFaqTitleA: 'Häufig',
    capFaqTitleB: 'gestellte Fragen',
    capFaqDesc: 'Die Fragen, die vor einem ersten Briefing am häufigsten wiederkehren. Fehlt Ihre, schreiben Sie uns.',
    capFaqContact: 'Frage stellen',
    capFaq_001_q: 'Was ist Perun und wie funktioniert der Wahrscheinlichkeitsstrom?',
    capFaq_001_a: 'Perun ist ein Signalstrom. Er sammelt Prognosemärkte, Nachrichtendienste, offene Quellen und Warenströme und verdichtet sie zu einer einzigen Zahl: der Wahrscheinlichkeit, dass ein bestimmtes Ereignis eintritt. Ein Partner abonniert die Ereignisse, die ihn interessieren, über REST und WebSocket und bindet das Ergebnis in sein eigenes Produkt ein. Das ersetzt keine Research-Abteilung, es stützt sie: Sie erhalten den Preis der Menge, gegen den eine Analystin ihre eigene These halten und sehen kann, wo beide auseinanderlaufen.',
    capFaq_002_q: 'Lässt sich auf Perun ein Quotenfeed aufbauen?',
    capFaq_002_a: 'Ja, und das ist eine der Hauptanwendungen. Aus den Wahrscheinlichkeiten lässt sich ein fertiger Quotenfeed bauen: Ein Markt öffnet am selben Tag, an dem das Ereignis auftaucht, und der Anbieter hat eine unabhängige Referenz für die eigene Bepreisung. Politische, geopolitische, Finanz- und Technologiemärkte aktualisieren sich laufend, so wie Sportquoten, statt bei einem einmal gesetzten Preis zu verharren. Die Aktualisierung liegt unter einer Sekunde, das Trading reagiert also, bevor sich die Linie bewegt. Quote, Marge und UX bleiben beim Anbieter.',
    capFaq_003_q: 'Wie nutzt die Versicherungsbranche Perun?',
    capFaq_003_a: 'Überall dort, wo Unsicherheit im Spiel ist: bei der Risikobewertung, bei der Bepreisung und bei der Überwachung laufender Verträge. Erhöht ein geopolitisches, klimatisches oder Marktereignis das Exposure, erfährt das Risikoteam es sofort und nicht erst beim nächsten Portfolioreview. Am wichtigsten ist aber die Erklärbarkeit: Zu jeder Zahl ist sichtbar, welche Signale sie bewegt haben und um wie viel. Eine Entscheidung lässt sich vor der Aufsicht begründen, nicht nur melden.',
    capFaq_004_q: 'Wie halte ich Leser neben einem Artikel bei der Sache?',
    capFaq_004_a: 'Mit einem fertigen Widget, das zum Thema des Textes passt. Unter einem Wahlartikel steht die Frage, ob ein bestimmter Kandidat gewinnt; unter einem Marktartikel, ob ein Unternehmen dieses Jahr an die Börse geht. Die Leserin kann zuerst selbst tippen, dann sehen, wie Perun dasselbe Ereignis bepreist, und zurückkommen, wenn es sich entscheidet. Statt Spekulation in den Kommentaren bleibt eine Zahl, die sich überprüfen lässt.',
    capFaq_005_q: 'Wie hilft Perun bei der Marktanalyse?',
    capFaq_005_a: 'Er zeigt, wie der Markt das bepreist, was in historischen Daten nicht steht: die Wahrscheinlichkeit einer Zinserhöhung, eines Wahlausgangs, einer Übernahme oder eines Börsengangs. Es ist der Konsens der Menge, den Sie gegen Ihr eigenes Modell halten können, um zu sehen, wo die Bewertung eines Assets von dem abweicht, was der Markt tatsächlich erwartet. Für Fintech ist das eine Kontextschicht, die kein Kursfeed verkauft.',
    capFaq_006_q: 'Wo läuft Perun und was geschieht mit meinen Daten?',
    capFaq_006_a: 'Standardmäßig über unsere API, dann muss bei Ihnen nichts aufgesetzt werden. Sind die Daten so sensibel, dass sie Ihre Infrastruktur nicht verlassen dürfen, rollen wir Perun in Ihrer Cloud oder auf Ihren eigenen Servern aus, auch in einem vom Internet getrennten Netz. Die Technologie hat ein unabhängiges technisches Audit von Thoughtworks bestanden.',
    capFaq_007_q: 'Wie sieht die Integration in der Praxis aus?',
    capFaq_007_a: 'Wir richten Ihnen ein Konto auf der Plattform ein. Aus einem Katalog von Tausenden Ereignissen wählen Sie jene aus, die in Ihren Feed sollen, und verwalten diesen Feed selbst: hinzufügen, entfernen, Umfang ändern. Gelesen wird über REST und WebSocket, mit Aktualisierung unter einer Sekunde. Zu jedem Ergebnis kommt die Erklärbarkeitsschicht, in der sichtbar ist, welche Signale diese Zahl ergeben haben.',
    capFaq_008_q: 'Kann ich Perun testen, und was kostet es?',
    capFaq_008_a: 'Ja. Sie richten ein Konto ein, wählen einige Ereignisse aus, und der Pilot darauf ist kostenlos. Die Preise klären wir erst danach im Gespräch: Sie hängen von der Größe des Feeds, dem Umfang der Integration und der Zahl der tatsächlich abonnierten Ereignisse ab.',
    footSecurity: 'Sicherheit',
    footExport: 'Exportkontrolle',
    footEthics: 'Ethikrat',
    footDisclosures: 'Offenlegungen',
    reqaKicker: 'Zugang anfragen',
    reqaTitle: 'Erzählen Sie uns von dem Vorhaben',
    reqaLede: 'Wählen Sie den Bereich unseres Angebots, den Sie angehen wollen. Wir leiten die Anfrage an das Partnerschaftsteam weiter und antworten binnen sieben Tagen.',
    reqaFieldName: 'Name',
    reqaFieldEmail: 'Geschäftliche E-Mail',
    reqaFieldOrg: 'Organisation',
    reqaFieldArea: 'Projektbereich',
    reqaFieldMessage: 'Nachricht',
    reqaFieldMessagePh: 'Projektziel, gewünschter Zeitrahmen und relevante Rahmenbedingungen.',
    reqaArea_heavy_industry: 'Schwerindustrie',
    reqaArea_markets: 'Marktdesign',
    reqaArea_defense: 'Verteidigung',
    reqaArea_pharma: 'Logistik',
    reqaArea_general: 'Etwas anderes',
    reqaSend: 'Anfrage senden',
    reqaSent: 'Im Mailprogramm öffnen',
    reqaRoutedTo: 'Weitergeleitet an',
    reqaClose: 'Schließen',
    reqaCtaOpen: 'Zugang anfragen',
    reqaMailSubjectPrefix: 'Zugang anfragen',
    df_in_crowd: 'SCHWARM-\nWISSEN',
    df_in_osint: 'OSINT /\nGEOINT',
    df_in_media: 'NEWS /\nSOCIAL',
    df_in_expert: 'EXPERTEN-\nNETZWERK',
    df_out_genesis: 'MARKT-\nGENESE',
    df_out_conflict: 'KONFLIKT-\nPROGNOSE',
    df_out_logistics: 'LOGISTIK-\nANOMALIE',
    df_out_scenario: 'SZENARIO-\nSIMULATION',
    footerCompany: 'Unternehmen',
    footerContact: 'Kontakt',
    footerSocial: 'Social',
    footerHQ: 'Hauptsitz',
    footerPrivacy: 'Datenschutz',
    footerTerms: 'AGB',
    footerCookies: 'Cookies',
  },
  es: {
    navHome: 'Inicio',
    navCapabilities: 'Soluciones',
    navOferta: 'Oferta',
    navBlog: 'Noticias',
    navCareers: 'Empleo',
    navKontakt: 'Contacto',
    navRequestAccess: 'SOLICITAR ACCESO',
    hero1: 'LA IA QUE',
    heroSees: 'LO VE',
    heroEverything: 'TODO',
    heroBefore: 'ANTES',
    heroItHappens: 'DE QUE OCURRA',
    heroBig: 'DE DATOS EN BRUTO\nA CONCLUSIONES ÚTILES',
    heroSub: 'Swiatowid lo ve todo',
    heroCtaAccess: 'Solicitar acceso',
    heroCtaBrief: 'Leer el informe de capacidades',
    voicesTitleA: 'Lo que dicen',
    voicesTitleB: 'nuestros socios',
    voicesDesc: 'Las personas que ponen Swiatowid a trabajar, en sus propias palabras.',
    voicesCaption: 'Lo que dicen nuestros socios',
    voices_synerise_quote: 'Desde el principio creímos en el potencial de Swiatowid y en las personas que lo construyen. Es un equipo lleno de pasión, competencia e ideas ambiciosas con una posibilidad real de cambiar el mercado. Nos alegra poder apoyar su crecimiento y formar parte de esta historia, ayudando a convertir visiones audaces en realidad.',
    voices_synerise_name: 'Jarosław Królewski',
    voices_synerise_role: 'CEO, Synerise',
    voices_world_quote: 'Durante mucho tiempo, el equipo de Swiatowid fue nuestro socio más fuerte en el mercado europeo. Entregaron resultados de forma constante y, gracias a su trabajo, el proyecto World superó los 100.000 usuarios. Además nos sorprendieron muchas veces con ideas innovadoras y un enfoque fresco para desarrollar el proyecto.',
    voices_world_name: 'Alex Blania',
    voices_world_role: 'CEO, Tools for Humanity · World',
    voices_betfan_quote: 'Me impresionan la competencia técnica y la creatividad del equipo de Światowid. Su solución nos permite ofrecer apuestas que no están disponibles en ninguna otra plataforma. El equipo destaca diseñando sistemas a medida, conectando distintas fuentes de datos y procesos, y encontrando soluciones allí donde no existe un esquema preestablecido.',
    voices_betfan_name: 'Łukasz Łazarewicz',
    voices_betfan_role: 'CEO, BETFAN',
    voices_kuke_quote: 'En el seguro de créditos comerciales y de operaciones de exportación, detectar el riesgo pronto lo es todo. Perun ofrece previsiones de probabilidad para eventos de mercado y geopolíticos que respaldan nuestras decisiones y Swiatowid es un socio fiable y profesional.',
    voices_kuke_name: 'Janusz Władczyk',
    voices_kuke_role: 'KUKE · Grupa PFR',
    caseKicker: 'Desplegado en',
    case_pharma_tag: 'Aseguradoras',
    case_pharma_sub: 'Pólizas paramétricas tarificadas a partir de la probabilidad de eventos en vivo.',
    case_markets_tag: 'Casas de apuestas',
    case_markets_sub: 'Mercados nuevos desde la primera señal, no una semana después.',
    case_heavy_tag: 'Brókeres',
    case_heavy_sub: 'La probabilidad del evento junto al gráfico, antes de que el relato se ponga al día.',
    case_defense_tag: 'Editores',
    case_defense_sub: 'Un widget de probabilidad junto al artículo, no otro párrafo de opinión.',
    pill_pharma_line: 'Tarifica el riesgo paramétrico.',
    pill_markets_line: 'Abre mercados más rápido.',
    pill_heavy_line: 'Añade probabilidad a los gráficos.',
    pill_defense_line: 'Convierte las noticias en cuotas.',
    dfIngest: 'AGREGAR',
    dfFuse: 'ANALIZAR',
    dfEmit: 'CONCLUIR',
    dfDesc: 'Swiatowid lee más de lo que podría leer cualquier equipo de análisis y conecta sin descanso nuevas fuentes: mercados de predicción, medios, inteligencia de fuentes abiertas, redes de expertos. Cada una lleva su peso: cuántas veces acertó, cuántas se equivocó y si algo independiente la confirma. Solo entonces esos pesos cuajan en una sola cifra que se puede defender.',
    platTitleA: 'UN NÚMERO',
    platTitleB: 'EXPLICABILIDAD TOTAL',
    platDesc: 'En cada resultado se ve qué grupos de pronosticadores influyeron en él, en qué medida y con qué peso. La aportación de cada grupo se despliega hasta las previsiones individuales, con las fuentes en las que se basan y su acierto hasta ahora.',
    platEvent: 'EVENTO',
    platQuestion: '¿Llevarán a cabo las fuerzas aliadas una operación militar en Oriente Próximo antes de que termine este año?',
    platWhy: 'CAPA DE EXPLICABILIDAD',
    platWhyMeta: 'Cuánto movió cada señal el valor final.',
    platDrv_market: 'Mercados de predicción',
    platDrv_market_t: 'El contrato sobre una operación militar en la región antes de fin de año se revalorizó de 0.31 a 0.79 con cinco veces el volumen habitual, el mayor movimiento único desde su apertura.',
    platDrv_osint: 'OSINT / GEOINT',
    platDrv_osint_t: 'Tráfico inusual de aviones cisterna sobre el Mediterráneo oriental, un patrón compatible con la preparación de un ataque.',
    platDrv_agency: 'Agencias de noticias',
    platDrv_agency_t: 'Reuters y AP informan del reposicionamiento de un grupo de portaaviones hacia el Golfo Pérsico. Los teletipos coinciden, pero ambos remiten a una única fuente de la administración.',
    platDrv_expert: 'Red de expertos',
    platDrv_expert_t: 'Tres analistas regionales subieron su valoración. Acierto histórico de ese grupo: 0.81.',
    platDrv_social: 'Social / narrativas',
    platDrv_social_t: 'Una oleada de publicaciones sin verificar sobre evacuaciones de embajadas. El patrón coincide con falsas alarmas anteriores, así que el canal se ponderó a la baja y no al alza.',
    platAlert: 'ALERTA',
    platNow: 'AHORA',
    platProbLabel: 'PROBABILIDAD',
    platChartAlt: 'Probabilidad en el horizonte de 30 días: plana en el nivel de partida y luego un salto dentro de la ventana de detección.',
    cap1Title: 'Market Genesis',
    cap1Desc: 'Genera mercados de predicción inéditos para socios de gaming y fintech a partir de señales reales en vivo.',
    cap2Title: 'Conflict Forecast',
    cap2Desc: 'Probabilidades de movimiento a nivel de batallón, horizonte de 6–72 h, fusionadas de OSINT, SIGINT y telemetría logística.',
    cap3Title: 'Flujos de materias primas',
    cap3Desc: 'Cobre, litio, grano y GNL: visibilidad por envío desde 312 puertos y 1.100 nodos ferroviarios.',
    cap4Title: 'Ponderación de sentimiento',
    cap4Desc: 'Seguimiento de narrativas entre idiomas en 47 plataformas, con puntuación de procedencia y filtrado de bots.',
    cap5Title: 'Arbitraje de cuotas',
    cap5Desc: 'Detección de desviación entre casas y creación de mercados sintéticos con cobertura automática de liquidez.',
    cap6Title: 'Simulación de escenarios',
    cap6Desc: 'Líneas de universo Monte Carlo con 10⁶ muestras. Ramificación contrafáctica con modelos de conducta de actores concretos.',
    ptrTitleA: 'DESPLEGADO',
    ptrTitleB: 'DONDE LAS DECISIONES CUESTAN DINERO',
    ptrDesc: 'Los socios operan bajo acuerdos de confidencialidad bilaterales. Los logotipos no se hacen públicos. Las consultas de compra se canalizan a través de su enlace gubernamental o de nuestro equipo comercial.',
    ptr1Label: 'MINISTERIOS DE DEFENSA NIVEL OTAN',
    ptr1Desc: 'Despliegues en Estados miembros',
    ptr2Label: 'MINERAS DEL FTSE-100',
    ptr2Desc: 'Socios de suministro de materias primas',
    ptr3Label: 'CASAS DE APUESTAS CON LICENCIA',
    ptr3Desc: 'Operadores regulados en la UE y el Reino Unido',
    ptr4Label: 'MERCADOS DE PREDICCIÓN',
    ptr4Desc: 'Acuerdos L1 de intercambio de datos',
    ptr5Label: 'FONDOS SOBERANOS',
    ptr5Desc: 'Nivel de inteligencia estratégica',
    duTitleA: 'DOBLE USO',
    duTitleB: 'UNA TECNOLOGÍA, DOS USOS',
    duDesc: 'Swiatowid aplica la misma tecnología de previsión tanto a usos comerciales como a usos relacionados con la seguridad. En el mercado puede apoyar la valoración de riesgos, las cuotas, los seguros, la analítica y los productos informativos. En el ámbito de la seguridad ayuda a evaluar la evolución de una situación, el riesgo de escalada, los movimientos de fuerzas o las anomalías logísticas. La base sigue siendo la misma: un modelo común, la misma metodología y la misma forma de ponderar las fuentes. Lo que cambia es el entorno de despliegue, el alcance del acceso y la forma de gestionar los datos.',
    duCommLabel: 'MERCADO Y MEDIOS',
    duCommThin: 'Aplicaciones',
    duCommTitle: 'COMERCIALES',
    duCommDesc: 'La probabilidad de los eventos entra directamente en los productos: cuotas de apuestas, modelos de seguros, análisis de mercado y contenidos para lectores. Permite valorar la importancia de un evento antes de que el mercado haya incorporado del todo sus efectos.',
    duDefLabel: 'DEFENSA Y SERVICIOS',
    duDefThin: 'Aplicaciones',
    duDefTitle: 'ESTATALES',
    duDefDesc: 'La probabilidad de los eventos apoya la evaluación de la situación: el riesgo de escalada, los movimientos de fuerzas y las alteraciones en la logística y el suministro. Ofrece una señal de alerta y respalda decisiones basadas en resultados cuyas fuentes y origen pueden rastrearse con claridad.',
    duProfile: 'PERFIL DEL DESTINATARIO',
    duCommC1: 'BRÓKERES',
    duCommC2: 'CASAS DE APUESTAS',
    duCommC3: 'ASEGURADORAS',
    duCommC4: 'EDITORES',
    duDefC1: 'GOBIERNO',
    duDefC2: 'DEFENSA',
    duDefC3: 'ORGANISMOS PÚBLICOS',
    ctaTitleA: 'SOLICITAR',
    ctaTitleB: 'AUTORIZACIÓN',
    ctaDesc: 'Swiatowid no es de autoservicio. El acceso se concede tras una revisión de alineación de soberanía y una verificación del proveedor. Cuente con 14–28 días hasta la primera sesión informativa.',
    ctaApply: 'Solicitar acceso',
    ctaDownload: 'Descargar el informe de capacidades (PDF)',
    capFaqTitleA: 'Preguntas',
    capFaqTitleB: 'frecuentes',
    capFaqDesc: 'Las preguntas que más se repiten antes de una primera sesión. Si falta la tuya, escríbenos.',
    capFaqContact: 'Haz una pregunta',
    capFaq_001_q: '¿Qué es Perun y cómo funciona el flujo de probabilidad de eventos?',
    capFaq_001_a: 'Perun es un flujo de señales. Reúne mercados de predicción, servicios de noticias, fuentes abiertas y el movimiento de mercancías, y los reduce a una sola cifra: la probabilidad de que ocurra un evento concreto. El socio se suscribe a los eventos que le interesan vía REST y WebSocket e integra el resultado en su propio producto. Esto no sustituye a un equipo de análisis, lo respalda: te da el precio de la multitud, contra el que un analista contrasta su propia tesis y ve dónde divergen.',
    capFaq_002_q: '¿Se puede construir un feed de cuotas sobre Perun?',
    capFaq_002_a: 'Sí, y es uno de los usos principales. Con las probabilidades se compone un feed de cuotas listo para usar: el mercado abre el mismo día en que aparece el evento y el operador tiene una referencia independiente para su propia tarificación. Los mercados políticos, geopolíticos, financieros y tecnológicos se actualizan de forma continua, como las cuotas deportivas, en lugar de quedarse en un precio fijado una vez. El refresco baja del segundo, así que el trading reacciona antes de que se mueva la línea. Cuota, margen y UX siguen siendo del operador.',
    capFaq_003_q: '¿Cómo usa Perun el sector asegurador?',
    capFaq_003_a: 'En todo punto donde entra la incertidumbre: evaluación del riesgo, tarificación y vigilancia de los contratos ya en cartera. Cuando un evento geopolítico, climático o de mercado eleva la exposición, el equipo de riesgo se entera al momento y no en la siguiente revisión de cartera. Lo más importante, sin embargo, es la explicabilidad: en cada cifra se ve qué señales la movieron y cuánto. La decisión se puede justificar ante el supervisor, no solo reportar.',
    capFaq_004_q: '¿Cómo mantener al lector enganchado junto a un artículo?',
    capFaq_004_a: 'Con un widget listo, ajustado al tema del texto. Bajo un artículo electoral aparece la pregunta de si tal candidato gana; bajo uno de mercados, si una empresa sale a bolsa este año. El lector puede votar primero su propia apuesta, luego ver cómo Perun valora ese mismo evento y volver cuando se resuelva. En lugar de especulación en los comentarios queda una cifra que se puede comprobar.',
    capFaq_005_q: '¿Cómo ayuda Perun en el análisis de mercado?',
    capFaq_005_a: 'Muestra cómo valora el mercado lo que los datos históricos no recogen: la probabilidad de una subida de tipos, de un resultado electoral, de una adquisición o de una salida a bolsa. Es el consenso de la multitud, que puedes contrastar con tu propio modelo para ver dónde la valoración de un activo se aleja de lo que el mercado realmente espera. Para el fintech es una capa de contexto que ningún feed de cotizaciones vende.',
    capFaq_006_q: '¿Dónde funciona Perun y qué pasa con mis datos?',
    capFaq_006_a: 'Por defecto a través de nuestra API, y entonces no hay nada que levantar de tu lado. Si los datos son tan sensibles que no pueden salir de tu infraestructura, desplegamos Perun en tu nube o en tus propios servidores, incluso en una red aislada de internet. La tecnología ha superado una auditoría técnica independiente de Thoughtworks.',
    capFaq_007_q: '¿Cómo es la integración en la práctica?',
    capFaq_007_a: 'Te abrimos una cuenta en la plataforma. De un catálogo de miles de eventos eliges los que deben alimentar tu feed, y ese feed lo gestionas tú: añadir, quitar, cambiar el alcance. La lectura va por REST y WebSocket, con refresco por debajo del segundo. Junto a cada resultado está la capa de explicabilidad, donde se ve qué señales componen esa cifra.',
    capFaq_008_q: '¿Puedo probar Perun y cuánto cuesta?',
    capFaq_008_a: 'Sí. Abres una cuenta, eliges unos cuantos eventos y el piloto sobre ellos es gratuito. El precio se acuerda después, en conversación: depende del tamaño del feed, del alcance de la integración y de cuántos eventos suscribes realmente.',
    footSecurity: 'Seguridad',
    footExport: 'Control de exportaciones',
    footEthics: 'Comité de ética',
    footDisclosures: 'Divulgaciones',
    reqaKicker: 'Solicitar acceso',
    reqaTitle: 'Cuéntanos sobre el proyecto',
    reqaLede: 'Elige el área de nuestra oferta que quieres abordar. Dirigiremos la solicitud al equipo de alianzas y responderemos en siete días.',
    reqaFieldName: 'Nombre',
    reqaFieldEmail: 'Correo corporativo',
    reqaFieldOrg: 'Organización',
    reqaFieldArea: 'Área del proyecto',
    reqaFieldMessage: 'Mensaje',
    reqaFieldMessagePh: 'Objetivo del proyecto, plazos previstos y limitaciones relevantes.',
    reqaArea_heavy_industry: 'Industria pesada',
    reqaArea_markets: 'Diseño de mercados',
    reqaArea_defense: 'Defensa',
    reqaArea_pharma: 'Logística',
    reqaArea_general: 'Otra cosa',
    reqaSend: 'Enviar solicitud',
    reqaSent: 'Abrir en el cliente de correo',
    reqaRoutedTo: 'Dirigido a',
    reqaClose: 'Cerrar',
    reqaCtaOpen: 'Solicitar acceso',
    reqaMailSubjectPrefix: 'Solicitar acceso',
    df_in_crowd: 'SABIDURÍA\nCOLECTIVA',
    df_in_osint: 'OSINT /\nGEOINT',
    df_in_media: 'PRENSA /\nSOCIAL',
    df_in_expert: 'RED DE\nEXPERTOS',
    df_out_genesis: 'GÉNESIS\nDE MERCADO',
    df_out_conflict: 'PREVISIÓN\nDE CONFLICTOS',
    df_out_logistics: 'ANOMALÍA\nLOGÍSTICA',
    df_out_scenario: 'SIMULACIÓN DE\nESCENARIOS',
    footerCompany: 'Empresa',
    footerContact: 'Contacto',
    footerSocial: 'Social',
    footerHQ: 'Sede',
    footerPrivacy: 'Privacidad',
    footerTerms: 'Términos',
    footerCookies: 'Cookies',
  },
  fr: {
    navHome: 'Accueil',
    navCapabilities: 'Solutions',
    navOferta: 'Offre',
    navBlog: 'Actualités',
    navCareers: 'Carrières',
    navKontakt: 'Contact',
    navRequestAccess: 'DEMANDER L\'ACCÈS',
    hero1: 'L\'IA QUI',
    heroSees: 'VOIT',
    heroEverything: 'TOUT',
    heroBefore: 'AVANT',
    heroItHappens: 'QUE ÇA ARRIVE',
    heroBig: 'DES DONNÉES BRUTES\nAUX ENSEIGNEMENTS UTILES',
    heroSub: 'Swiatowid voit tout',
    heroCtaAccess: 'Demander l\'accès',
    heroCtaBrief: 'Lire le dossier de capacités',
    voicesTitleA: 'Ce que disent',
    voicesTitleB: 'nos partenaires',
    voicesDesc: 'Les personnes qui font travailler Swiatowid, dans leurs propres mots.',
    voicesCaption: 'Ce que disent nos partenaires',
    voices_synerise_quote: 'Dès le départ, nous avons cru au potentiel de Swiatowid et aux personnes qui le construisent. C\'est une équipe pleine de passion, de compétence et d\'idées ambitieuses qui ont une vraie chance de changer le marché. Nous sommes heureux de pouvoir soutenir leur croissance et de faire partie de cette histoire, en aidant à transformer des visions audacieuses en réalité.',
    voices_synerise_name: 'Jarosław Królewski',
    voices_synerise_role: 'CEO, Synerise',
    voices_world_quote: 'Pendant longtemps, l\'équipe de Swiatowid a été notre partenaire le plus solide sur le marché européen. Ils ont livré des résultats avec constance et, grâce à leur travail, le projet World a dépassé les 100 000 utilisateurs. Ils nous ont aussi surpris à maintes reprises par des idées innovantes et un regard neuf sur le développement du projet.',
    voices_world_name: 'Alex Blania',
    voices_world_role: 'CEO, Tools for Humanity · World',
    voices_betfan_quote: 'Je suis impressionné par l’expertise technique et la créativité de l’équipe Światowid. Leur solution nous permet de proposer des paris qui ne sont disponibles sur aucune autre plateforme. L’équipe excelle à concevoir des systèmes sur mesure, à relier différentes sources de données et processus, et à trouver des solutions là où aucun modèle tout fait n’existe.',
    voices_betfan_name: 'Łukasz Łazarewicz',
    voices_betfan_role: 'CEO, BETFAN',
    voices_kuke_quote: 'En assurance-crédit et en couverture des transactions à l\'export, repérer le risque tôt fait toute la différence. Perun fournit des prévisions de probabilité sur les événements de marché et géopolitiques qui étayent nos décisions et Swiatowid est un partenaire fiable et professionnel.',
    voices_kuke_name: 'Janusz Władczyk',
    voices_kuke_role: 'KUKE · Grupa PFR',
    caseKicker: 'Déployé chez',
    case_pharma_tag: 'Assureurs',
    case_pharma_sub: 'Des polices paramétriques tarifées à partir de la probabilité d\'événement en temps réel.',
    case_markets_tag: 'Bookmakers',
    case_markets_sub: 'De nouveaux marchés dès le premier signal, pas une semaine plus tard.',
    case_heavy_tag: 'Courtiers',
    case_heavy_sub: 'La probabilité de l\'événement à côté du graphique, avant que le récit ne rattrape son retard.',
    case_defense_tag: 'Éditeurs',
    case_defense_sub: 'Un widget de probabilité à côté de l\'article et non un paragraphe d\'opinion de plus.',
    pill_pharma_line: 'Tarifez le risque paramétrique.',
    pill_markets_line: 'Ouvrez des marchés plus vite.',
    pill_heavy_line: 'Ajoutez la probabilité aux graphiques.',
    pill_defense_line: 'Transformez l\'actualité en cotes.',
    dfIngest: 'AGRÉGER',
    dfFuse: 'ANALYSER',
    dfEmit: 'CONCLURE',
    dfDesc: 'Swiatowid lit plus que n\'importe quelle cellule de recherche ne pourrait lire, et branche sans cesse de nouvelles sources : marchés de prédiction, médias, renseignement de sources ouvertes, réseaux d\'experts. Chacune porte son poids : combien de fois elle a eu raison, combien de fois elle s\'est trompée et si quelque chose d\'indépendant la confirme. Ce n\'est qu\'ensuite que ces poids forment un seul chiffre que l\'on peut défendre.',
    platTitleA: 'UN CHIFFRE',
    platTitleB: 'EXPLICABILITÉ TOTALE',
    platDesc: 'Pour chaque résultat, on voit quels groupes de prévisionnistes l\'ont influencé, dans quelle mesure et avec quel poids. La contribution de chaque groupe se déplie jusqu\'aux prévisions individuelles, avec leurs sources et leur justesse passée.',
    platEvent: 'ÉVÉNEMENT',
    platQuestion: 'Les forces alliées mèneront-elles une opération militaire au Moyen-Orient d\'ici la fin de l\'année ?',
    platWhy: 'COUCHE D\'EXPLICABILITÉ',
    platWhyMeta: 'L\'effet de chaque signal sur la valeur finale.',
    platDrv_market: 'Marchés de prédiction',
    platDrv_market_t: 'Le contrat sur une opération militaire dans la région d\'ici la fin de l\'année est passé de 0,31 à 0,79 pour un volume cinq fois supérieur, la plus forte variation depuis son ouverture.',
    platDrv_osint: 'OSINT / GEOINT',
    platDrv_osint_t: 'Trafic inhabituel d\'avions ravitailleurs au-dessus de la Méditerranée orientale, un schéma compatible avec la préparation d\'une frappe.',
    platDrv_agency: 'Agences de presse',
    platDrv_agency_t: 'Reuters et AP rapportent le repositionnement d\'un groupe aéronaval dans le Golfe Persique. Les dépêches concordent, mais toutes deux remontent à une source unique au sein de l\'administration.',
    platDrv_expert: 'Réseau d\'experts',
    platDrv_expert_t: 'Trois analystes régionaux ont relevé leur évaluation. Justesse historique de ce groupe : 0,81.',
    platDrv_social: 'Social / récits',
    platDrv_social_t: 'Une vague de publications non vérifiées sur des évacuations d\'ambassades. Le schéma correspond à de fausses alertes passées : le canal a donc été pondéré à la baisse et non à la hausse.',
    platAlert: 'ALERTE',
    platNow: 'MAINTENANT',
    platProbLabel: 'PROBABILITÉ',
    platChartAlt: 'Probabilité sur l\'horizon de 30 jours : plate au niveau de départ, puis un saut dans la fenêtre de détection.',
    cap1Title: 'Market Genesis',
    cap1Desc: 'Générez des marchés de prédiction inédits pour les partenaires du jeu et de la fintech à partir de signaux réels en direct.',
    cap2Title: 'Conflict Forecast',
    cap2Desc: 'Probabilités de mouvement à l’échelle du bataillon, horizon 6–72 h, fusionnées depuis OSINT, SIGINT et télémétrie logistique.',
    cap3Title: 'Flux de matières premières',
    cap3Desc: 'Cuivre, lithium, céréales, GNL : visibilité à la cargaison depuis 312 ports et 1 100 nœuds ferroviaires.',
    cap4Title: 'Pondération du sentiment',
    cap4Desc: 'Suivi des récits entre langues sur 47 plateformes, avec notation de provenance et filtrage des bots.',
    cap5Title: 'Arbitrage de cotes',
    cap5Desc: 'Détection de dérive entre opérateurs et création de marchés synthétiques avec couverture automatique de liquidité.',
    cap6Title: 'Simulation de scénarios',
    cap6Desc: 'Lignes d\'univers Monte-Carlo à 10⁶ tirages. Ramification contrefactuelle avec modèles de conduite d\'acteurs nommés.',
    ptrTitleA: 'DÉPLOYÉ',
    ptrTitleB: 'LÀ OÙ LES DÉCISIONS COÛTENT DE L\'ARGENT',
    ptrDesc: 'Les partenaires opèrent sous accords de confidentialité bilatéraux. Les logos ne sont pas rendus publics. Les demandes d\'achat passent par votre correspondant gouvernemental ou par notre équipe commerciale.',
    ptr1Label: 'MINISTÈRES DE LA DÉFENSE NIVEAU OTAN',
    ptr1Desc: 'Déploiements dans des États membres',
    ptr2Label: 'MINIÈRES DU FTSE-100',
    ptr2Desc: 'Partenaires d\'approvisionnement en matières premières',
    ptr3Label: 'OPÉRATEURS DE PARIS AGRÉÉS',
    ptr3Desc: 'Opérateurs régulés dans l’UE et au Royaume-Uni',
    ptr4Label: 'MARCHÉS DE PRÉDICTION',
    ptr4Desc: 'Accords L1 de partage de données',
    ptr5Label: 'FONDS SOUVERAINS',
    ptr5Desc: 'Niveau renseignement stratégique',
    duTitleA: 'DOUBLE USAGE',
    duTitleB: 'UNE TECHNOLOGIE, DEUX USAGES',
    duDesc: 'Swiatowid applique la même technologie de prévision à des usages commerciaux comme à des usages liés à la sécurité. Sur le marché, elle peut soutenir la tarification du risque, les cotes, l\'assurance, l\'analytique et les produits d\'information. Dans le domaine de la sécurité, elle aide à évaluer l\'évolution d\'une situation, le risque d\'escalade, les mouvements de forces ou les anomalies logistiques. Le socle reste le même : un modèle commun, une même méthodologie et une même pondération des sources. Ce qui change, c\'est l\'environnement de déploiement, le périmètre d\'accès et la gestion des données.',
    duCommLabel: 'MARCHÉ ET MÉDIAS',
    duCommThin: 'Applications',
    duCommTitle: 'COMMERCIALES',
    duCommDesc: 'La probabilité des événements entre directement dans les produits : cotes de paris, modèles d\'assurance, analyses de marché et contenus pour les lecteurs. Elle permet d\'évaluer la portée d\'un événement avant que le marché n\'en ait pleinement intégré les effets.',
    duDefLabel: 'DÉFENSE ET SERVICES',
    duDefThin: 'Applications',
    duDefTitle: 'ÉTATIQUES',
    duDefDesc: 'La probabilité des événements appuie l\'appréciation de situation : risque d\'escalade, mouvements de forces, perturbations de la logistique et de l\'approvisionnement. Elle donne un signal d\'alerte et appuie des décisions fondées sur des résultats dont les sources et l\'élaboration peuvent être clairement retracées.',
    duProfile: 'PROFIL DU DESTINATAIRE',
    duCommC1: 'COURTIERS',
    duCommC2: 'BOOKMAKERS',
    duCommC3: 'ASSUREURS',
    duCommC4: 'ÉDITEURS',
    duDefC1: 'GOUVERNEMENT',
    duDefC2: 'DÉFENSE',
    duDefC3: 'SERVICES PUBLICS',
    ctaTitleA: 'DEMANDER',
    ctaTitleB: 'UNE HABILITATION',
    ctaDesc: 'Swiatowid n\'est pas en libre-service. L\'accès est accordé après examen de l\'alignement de souveraineté et vérification du fournisseur. Comptez 14 à 28 jours jusqu\'au premier briefing.',
    ctaApply: 'Demander l\'accès',
    ctaDownload: 'Télécharger le dossier de capacités (PDF)',
    capFaqTitleA: 'Questions',
    capFaqTitleB: 'fréquentes',
    capFaqDesc: 'Les questions qui reviennent le plus souvent avant un premier briefing. Si la vôtre n\'y est pas, écrivez-nous.',
    capFaqContact: 'Poser une question',
    capFaq_001_q: 'Qu\'est-ce que Perun et comment fonctionne le flux de probabilités ?',
    capFaq_001_a: 'Perun est un flux de signaux. Il réunit marchés de prédiction, services d\'actualité, sources ouvertes et mouvements de marchandises, puis les réduit à un seul chiffre : la probabilité qu\'un événement précis se produise. Le partenaire s\'abonne aux événements qui l\'intéressent via REST et WebSocket et intègre le résultat à son propre produit. Cela ne remplace pas une cellule de recherche, cela l\'appuie : vous obtenez le prix de la foule, auquel un analyste confronte sa propre thèse pour voir où les deux divergent.',
    capFaq_002_q: 'Peut-on bâtir un flux de cotes sur Perun ?',
    capFaq_002_a: 'Oui, et c\'est l\'un des usages principaux. Les probabilités se composent en un flux de cotes prêt à l\'emploi : un marché ouvre le jour même où l\'événement apparaît, et l\'opérateur dispose d\'une référence indépendante pour sa propre tarification. Les marchés politiques, géopolitiques, financiers et technologiques se mettent à jour en continu, comme les cotes sportives, au lieu de rester sur un prix fixé une fois. Le rafraîchissement passe sous la seconde : le trading réagit avant que la ligne ne bouge. Cote, marge et UX restent chez l\'opérateur.',
    capFaq_003_q: 'Comment le secteur de l\'assurance utilise-t-il Perun ?',
    capFaq_003_a: 'Partout où l\'incertitude entre en jeu : évaluation du risque, tarification, surveillance des contrats déjà en portefeuille. Lorsqu\'un événement géopolitique, climatique ou de marché accroît l\'exposition, l\'équipe risque l\'apprend aussitôt, et non à la revue de portefeuille suivante. Le plus important reste l\'explicabilité : chaque chiffre montre quels signaux l\'ont déplacé, et de combien. Une décision se justifie devant le régulateur, elle ne se contente pas d\'être déclarée.',
    capFaq_004_q: 'Comment retenir le lecteur à côté d\'un article ?',
    capFaq_004_a: 'Avec un widget prêt à l\'emploi, accordé au sujet de l\'article. Sous un papier électoral, la question de savoir si tel candidat l\'emporte ; sous un papier marchés, si une société entre en bourse cette année. Le lecteur peut d\'abord parier lui-même, puis voir comment Perun valorise ce même événement, et revenir quand il se dénoue. À la place des spéculations en commentaires, il reste un chiffre vérifiable.',
    capFaq_005_q: 'Comment Perun aide-t-il à l\'analyse de marché ?',
    capFaq_005_a: 'Il montre comment le marché valorise ce que les données historiques ne contiennent pas : la probabilité d\'une hausse de taux, d\'un résultat électoral, d\'une acquisition ou d\'une introduction en bourse. C\'est le consensus de la foule, que vous pouvez confronter à votre propre modèle pour voir où la valorisation d\'un actif s\'écarte de ce que le marché attend vraiment. Pour la fintech, c\'est une couche de contexte qu\'aucun flux de cotations ne vend.',
    capFaq_006_q: 'Où tourne Perun et qu\'advient-il de mes données ?',
    capFaq_006_a: 'Par défaut via notre API, et il n\'y a alors rien à installer chez vous. Si les données sont assez sensibles pour ne pas quitter votre infrastructure, nous déployons Perun dans votre cloud ou sur vos propres serveurs, y compris sur un réseau coupé d\'internet. La technologie a passé un audit technique indépendant de Thoughtworks.',
    capFaq_007_q: 'À quoi ressemble l\'intégration en pratique ?',
    capFaq_007_a: 'Nous vous ouvrons un compte sur la plateforme. Dans un catalogue de milliers d\'événements, vous choisissez ceux qui doivent alimenter votre flux, et vous gérez ce flux vous-même : ajouter, retirer, changer le périmètre. La lecture passe par REST et WebSocket, avec un rafraîchissement inférieur à la seconde. À côté de chaque résultat se trouve la couche d\'explicabilité, qui montre quels signaux composent ce chiffre.',
    capFaq_008_q: 'Puis-je tester Perun, et combien cela coûte-t-il ?',
    capFaq_008_a: 'Oui. Vous ouvrez un compte, choisissez quelques événements, et le pilote sur ceux-ci est gratuit. Le tarif se règle ensuite, en discussion : il dépend de la taille du flux, du périmètre de l\'intégration et du nombre d\'événements réellement souscrits.',
    footSecurity: 'Sécurité',
    footExport: 'Contrôle des exportations',
    footEthics: 'Comité d’éthique',
    footDisclosures: 'Informations réglementées',
    reqaKicker: 'Demander l\'accès',
    reqaTitle: 'Parlez-nous de votre projet',
    reqaLede: 'Choisissez le domaine de notre offre que vous voulez traiter. Nous transmettrons la demande à l\'équipe partenariats et répondrons sous sept jours.',
    reqaFieldName: 'Nom',
    reqaFieldEmail: 'E-mail professionnel',
    reqaFieldOrg: 'Organisation',
    reqaFieldArea: 'Domaine du projet',
    reqaFieldMessage: 'Message',
    reqaFieldMessagePh: 'Objectif du projet, calendrier envisagé et contraintes éventuelles.',
    reqaArea_heavy_industry: 'Industrie lourde',
    reqaArea_markets: 'Conception de marchés',
    reqaArea_defense: 'Défense',
    reqaArea_pharma: 'Logistique',
    reqaArea_general: 'Autre chose',
    reqaSend: 'Envoyer la demande',
    reqaSent: 'Ouvrir dans le client de messagerie',
    reqaRoutedTo: 'Transmis à',
    reqaClose: 'Fermer',
    reqaCtaOpen: 'Demander l\'accès',
    reqaMailSubjectPrefix: 'Demander l\'accès',
    df_in_crowd: 'SAGESSE\nCOLLECTIVE',
    df_in_osint: 'OSINT /\nGEOINT',
    df_in_media: 'PRESSE /\nSOCIAL',
    df_in_expert: 'RÉSEAU\nD\'EXPERTS',
    df_out_genesis: 'GENÈSE\nDE MARCHÉS',
    df_out_conflict: 'PRÉVISION\nDE CONFLITS',
    df_out_logistics: 'ANOMALIE\nLOGISTIQUE',
    df_out_scenario: 'SIMULATION DE\nSCÉNARIOS',
    footerCompany: 'Entreprise',
    footerContact: 'Contact',
    footerSocial: 'Social',
    footerHQ: 'Siège',
    footerPrivacy: 'Confidentialité',
    footerTerms: 'Conditions',
    footerCookies: 'Cookies',
  },
};

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;
}

// One brief per language; English covers anything outside the five we publish.
const BRIEF_PDF = { pl: '/brief.pdf', en: '/brief-en.pdf', de: '/brief-de.pdf', es: '/brief-es.pdf', fr: '/brief-fr.pdf' };
function getBriefPdfHref(lang) {
  return BRIEF_PDF[lang] || BRIEF_PDF.en;
}

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.bone;
    document.documentElement.setAttribute('data-theme', t.attr);
  }, [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]);

  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>

      <NavBar logoAnim={tweaks.logoAnim} />

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

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

      <PartnerVoices />

      <DataflowSection />

      <PlatformSection />

      <DualUseSection />

      <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 { lang } = React.useContext(LangContext);
  const isMobile = useHeroMobile();
  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 activeIdxRef = React.useRef(activeIdx);
  activeIdxRef.current = activeIdx;
  const timerRef = React.useRef(null);
  const pausedRef = React.useRef(false);
  const nextIdx = (activeIdx + 1) % USE_CASES.length;

  const heroVideoSrc = (i) => {
    const c = USE_CASES[i];
    if (IS_APPLE_TOUCH) return null;
    if (isMobile && i !== activeIdx && i !== nextIdx) return null;
    return heroCaseSrc(c, isMobile);
  };

  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(() => {
    // Only the active video should be decoding. Pause the rest, otherwise
    // 4 HD streams compound on the CPU/GPU after the first cycle.
    videoRefs.current.forEach((v, i) => {
      if (!v) return;
      if (i === activeIdx) {
        try { v.currentTime = 0; v.play().catch(() => {}); } catch (_) {}
      } else {
        try { v.pause(); } catch (_) {}
      }
    });
  }, [activeIdx]);

  React.useEffect(() => {
    // Muted-video autoplay is suspended while the tab is hidden and can be
    // blocked outright (data-saver, some mobile policies). The play() calls
    // above swallow those rejections, which would leave the hero frozen on a
    // poster frame. Re-kick the active clip when the tab regains focus and on
    // the first user interaction, so playback always self-heals.
    const resume = () => {
      const v = videoRefs.current[activeIdxRef.current];
      if (v) { try { v.play().catch(() => {}); } catch (_) {} }
    };
    const onVisible = () => { if (document.visibilityState === 'visible') resume(); };
    document.addEventListener('visibilitychange', onVisible);
    window.addEventListener('pointerdown', resume, { once: true });
    window.addEventListener('keydown', resume, { once: true });
    return () => {
      document.removeEventListener('visibilitychange', onVisible);
      window.removeEventListener('pointerdown', resume);
      window.removeEventListener('keydown', resume);
    };
  }, []);

  const onVideoLoaded = (i) => {
    setLoaded(prev => {
      if (prev[i]) return prev;
      const next = prev.slice();
      next[i] = true;
      return next;
    });
    if (i === activeIdxRef.current) {
      const v = videoRefs.current[i];
      try { v?.play().catch(() => {}); } catch (_) {}
    }
  };

  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) => {
          const src = heroVideoSrc(i);
          const preload = isMobile
            ? (i === activeIdx ? 'auto' : i === nextIdx ? 'metadata' : 'none')
            : (i === 0 ? 'auto' : 'metadata');
          return (
            <video
              key={c.key}
              ref={el => { videoRefs.current[i] = el; }}
              src={src || undefined}
              autoPlay={i === 0 && !!src}
              muted loop playsInline
              preload={src ? preload : 'none'}
              poster={c.poster}
              data-case={c.key}
              className={`hero-video ${i === activeIdx ? 'is-active' : ''} ${i === prevIdx ? 'is-prev' : ''}`}
              style={{ opacity: i === activeIdx ? 1 : 0 }}
              onLoadedData={() => onVideoLoaded(i)}
            />
          );
        })}
        <div className="hero-case-overlay" aria-hidden="true">
          <div className="hero-case-overlay-tag">{t(`case_${USE_CASES[activeIdx].key}_tag`)}</div>
        </div>
      </div>

      <div className="hero-inner">
        <div className="hero-title">
          <h1 className="hero-h1">{t('heroBig').split('\n').map((line, i, arr) => (
            <React.Fragment key={i}>
              {line}
              {i < arr.length - 1 && <br/>}
            </React.Fragment>
          ))}</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')}</a>
            <a className="btn" href={getBriefPdfHref(lang)} type="application/pdf">{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)}
            aria-label={t(`case_${c.key}_tag`)}
          >
            <span className="hero-case-pip-track">
              <span className="hero-case-pip-fill" style={{ animationDuration: `${CASE_DURATION_MS}ms`, animationPlayState: i === activeIdx ? 'running' : 'paused' }} />
            </span>
          </button>
        ))}
      </div>

    </section>
  );
}

function Ticker({ variant = 'default', theme = 'dark' }) {
  const isLightTheme = theme === 'bone';
  const features = (window.SWIATOWID_SITE_CONFIG && window.SWIATOWID_SITE_CONFIG.features) || {};
  const preserveColorLogos = new Set(['Nokia', 'Bielik.AI', 'Kraken', 'xStocks', 'Celo', 'Betfan', 'KUKE']);
  const logos = [
    { src: 'assets/logos/logo-agh.png?v=2', alt: 'AGH', h: 48 },
    { 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-synerise.png?v=2', alt: 'Synerise', h: 26 },
    { src: 'assets/logos/logo-betfan.png', alt: 'Betfan', h: 44, flag: 'betfan' },
    { src: 'assets/logos/logo-kuke.jpg', alt: 'KUKE', h: 30, flag: 'kuke' },
    { src: 'assets/logos/logo-elevenlabs.png?v=2', alt: 'ElevenLabs', h: 40 },
    { src: 'assets/logos/logo-openai.svg?v=1', alt: 'OpenAI', h: 36 },
    { 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/tools-for-humanity.svg?v=2', alt: 'Tools for Humanity', h: 34 },
    { src: 'assets/logos/world.png?v=3', alt: 'World', h: 22 },
    { src: variant === 'black' && !isLightTheme ? 'assets/logos/logo_celo2-dark.png?v=1' : 'assets/logos/logo_celo2.png?v=1', alt: 'Celo', h: 18 },
  ].filter(l => !l.flag || features[l.flag]);
  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>
  );
}

const PARTNER_VOICES = [
  { company: 'Synerise', url: 'https://www.synerise.com', logo: 'assets/logos/logo-synerise.png?v=2', avatar: 'assets/partners/jaroslaw-krolewski.jpg', q: 'voices_synerise_quote', n: 'voices_synerise_name', r: 'voices_synerise_role' },
  { company: 'World',    url: 'https://world.org/',       logo: 'assets/logos/world.png?v=3',          avatar: 'assets/partners/alex-blania.jpg',        q: 'voices_world_quote',    n: 'voices_world_name',    r: 'voices_world_role' },
  { company: 'Betfan',   url: 'https://betfan.pl/',       logo: 'assets/logos/logo-betfan.png',       avatar: 'assets/partners/lukasz-lazarewicz.png', q: 'voices_betfan_quote',   n: 'voices_betfan_name',   r: 'voices_betfan_role', flag: 'betfan' },
  { company: 'KUKE',     logo: 'assets/logos/logo-kuke.jpg',         avatar: 'assets/partners/janusz-wladczyk.jpg',   q: 'voices_kuke_quote',     n: 'voices_kuke_name',     r: 'voices_kuke_role',   flag: 'kuke' },
];

function VoiceCard({ v, t }) {
  const inner = (
    <>
      <blockquote className="voice-quote">{t(v.q)}</blockquote>
      <div className="voice-meta">
        <img className="voice-avatar" src={v.avatar} alt={t(v.n)} loading="lazy" />
        <div className="voice-who">
          <span className="voice-name">{t(v.n)}</span>
          <span className="voice-role">{t(v.r)}</span>
        </div>
        <img className="voice-logo" src={v.logo} alt={v.company} loading="lazy" />
      </div>
    </>
  );
  return v.url
    ? <a className={`voice-card${v.flag ? ` voice-card-${v.flag}` : ''}`} href={v.url} target="_blank" rel="noopener noreferrer">{inner}</a>
    : <figure className={`voice-card${v.flag ? ` voice-card-${v.flag}` : ''}`}>{inner}</figure>;
}

function PartnerVoices() {
  const t = useT();
  const visible = PARTNER_VOICES.slice(0, 3);
  return (
    <section id="voices" data-screen-label="Partner voices">
      <p className="voices-caption reveal">{t('voicesCaption')}</p>
      <div className="voices-static reveal">
        {visible.map((v, i) => <VoiceCard key={i} v={v} t={t} />)}
      </div>
    </section>
  );
}

function PlatformSection() {
  const t = useT();
  return (
    <section id="platform" data-screen-label="02 Platform">
      <div className="sec-head reveal">
        <h2 className="sec-title">
          {t('platTitleA')}<br />
          <span className="thin">{t('platTitleB')}</span>
        </h2>
        <p className="sec-desc">{t('platDesc')}</p>
      </div>
      <div className="reveal">
        <ProbabilityConsole />
      </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 dataflow-title">
          {t('dfIngest')} {t('dfFuse')} {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.
          Swiatowid 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>
      <DualUseTopology />
    </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 Swiatowid'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-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 Footer() {
  const t = useT();
  const { lang } = React.useContext(LangContext);
  return <SiteFooter t={t} lang={lang} 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 />);
