const useT = window.useT; const LangProvider = window.LangProvider; const LangSwitch = window.LangSwitch; const { useState, useMemo, useEffect, useRef } = React; /* ------------------------------- ICONS ------------------------------- */ const I = ({ children, size = 20, className = '' }) => ( {children} ); const IconCheck = (p) => ; const IconArrow = (p) => ; const IconPlus = (p) => ; const IconShield = (p) => ; const IconLock = (p) => ; const IconCamera = (p) => ; const IconBrain = (p) => ; const IconBell = (p) => ; const IconBolt = (p) => ; const IconDb = (p) => ; const IconWifiOff = (p) => ; const IconUsers = (p) => ; const IconSend = (p) => ; const IconDoor = (p) => ; const IconRuler = (p) => ; const IconScope = (p) => ; const IconStore = (p) => ; const IconFuel = (p) => ; const IconPill = (p) => ; const IconShirt = (p) => ; const IconGem = (p) => ; const IconBuild = (p) => ; const IconStar = ({ filled = true, size = 14 }) => ( ); const IconPhone = (p) => ; /* ------------------------------- BASE BITS ------------------------------- */ const Section = ({ id, dark = false, children, className = '' }) => (
{children}
); const Eyebrow = ({ children, dark = false }) => (
{children}
); /* Stronger reveal — fades in EVERY time element scrolls into view */ const Reveal = ({ children, delay = 0, className = '', from = 'up', once = false }) => { const ref = useRef(null); useEffect(() => { const el = ref.current; if (!el) return; // If already in viewport at mount (top of page), reveal with delay const rect = el.getBoundingClientRect(); const vh = window.innerHeight || document.documentElement.clientHeight; if (rect.top < vh * 0.85 && rect.bottom > 0) { const t0 = setTimeout(() => el && el.classList.add('reveal-in'), delay); if (once) return () => clearTimeout(t0); } if (typeof IntersectionObserver === 'undefined') { el.classList.add('reveal-in'); return; } const io = new IntersectionObserver((es) => { es.forEach(e => { if (e.isIntersecting) { setTimeout(() => el && el.classList.add('reveal-in'), delay); if (once) io.unobserve(el); } else if (!once) { // Reset when scrolled fully out of view (above or below) if (e.boundingClientRect.top > vh || e.boundingClientRect.bottom < 0) { el.classList.remove('reveal-in'); } } }); }, { threshold: [0, 0.15], rootMargin: '0px 0px -10% 0px' }); io.observe(el); return () => io.disconnect(); }, [delay, once]); return
{children}
; }; const PrimaryBtn = ({ children, href = '#', invert = false, className = '' }) => ( {children} ); const OutlineBtn = ({ children, href = '#', invert = false, className = '' }) => ( {children} ); /* Smooth scroll for anchors */ const smoothScroll = (e, sel) => { const target = document.querySelector(sel); if (!target) return; e.preventDefault(); const top = target.getBoundingClientRect().top + window.scrollY - 60; window.scrollTo({ top, behavior: 'smooth' }); }; const Anchor = ({ href, children, className }) => ( href && href.startsWith('#') && smoothScroll(e, href)} className={className}>{children} ); /* ------------------------------- NAV ------------------------------- */ const Nav = () => { const { t } = useT(); const [scrolled, setScrolled] = useState(false); useEffect(() => { const onS = () => setScrolled(window.scrollY > 4); window.addEventListener('scroll', onS); onS(); return () => window.removeEventListener('scroll', onS); }, []); return (
SE SELECO / Face Security
{t('nav_kontakt')} {t('nav_demo')}
); }; /* ------------------------------- HERO ------------------------------- */ const Hero = () => { const { t } = useT(); const kpis = [['0,2s', t('hero_kpi_1')],['<1s', t('hero_kpi_2')],['95%+', t('hero_kpi_3')],['24/7', t('hero_kpi_4')]]; return (
{t('hero_eyebrow')}

{t('hero_title_a')}
{t('hero_title_b')}

{t('hero_lead_a')}{t('hero_lead_time')}{t('hero_lead_b')}

CCTV alert
{t('hero_signals')}
{t('hero_match')}
{t('hero_match_meta')}
{t('hero_telegram')}
{t('hero_telegram_meta')}
{t('hero_local')}
{t('hero_local_meta')}
0,2s {t('hero_avg')}
{kpis.map(([big, small], i) => (
{big} {small}
))}
); }; /* ------------------------------- DLA KOGO ------------------------------- */ const DlaKogo = () => { const { t } = useT(); const segments = [ { icon: IconStore, t: t('seg_1_t'), d: t('seg_1_d') }, { icon: IconFuel, t: t('seg_2_t'), d: t('seg_2_d') }, { icon: IconPill, t: t('seg_3_t'), d: t('seg_3_d') }, { icon: IconShirt, t: t('seg_4_t'), d: t('seg_4_d') }, { icon: IconGem, t: t('seg_5_t'), d: t('seg_5_d') }, { icon: IconBuild, t: t('seg_6_t'), d: t('seg_6_d') }, ]; return (
{t('segments_eyebrow')}

{t('segments_title')}

{t('segments_lead')}

{segments.map((s, i) => (
{s.t}

{s.d}

))}
); }; /* ------------------------------- JAK DZIAŁA ------------------------------- */ const Jak = () => { const { t } = useT(); const steps = [ { icon: IconCamera, t: t('step_1_t'), d: t('step_1_d') }, { icon: IconBrain, t: t('step_2_t'), d: t('step_2_d') }, { icon: IconBell, t: t('step_3_t'), d: t('step_3_d') }, ]; return (
{t('jak_eyebrow')}

{t('jak_title')}

{steps.map((s, i) => (
0{i+1}
{s.t}
{s.d}
))}
); }; /* ------------------------------- SYSTEM W AKCJI ------------------------------- */ const BrowserChrome = ({ url, label, children }) => (
{url}
{label}
{children}
); const PhoneFrame = ({ children, time = '14:23' }) => (
{time}
●●●●5G▮▮▮
{children}
); const TelegramAlert = ({ time = '14:23:08', cam = 'CAM 01 · entry', conf = '98.4%', name = 'THIEF_011', tag, urgent = true }) => { const { t } = useT(); return (
FS
Face Security · Bot
{time}
{urgent && ALERT}
{cam}
REC ●
{time}
MATCH {conf}
{t('flow_alert_detected')} {name}
{t('flow_alert_note')} {tag}
); }; const SystemFlow = () => { const { t } = useT(); return (
{t('flow_eyebrow')}

{t('flow_title_a')}
{t('flow_title_b')}{t('flow_title_c')}

{t('flow_lead')}

01 {t('flow_step_1')}
Event gallery — faces anonymised

{t('flow_step_1_d')}

{t('flow_arrow')}
→ persist
02 {t('flow_step_2')}
Offender database — faces anonymised

{t('flow_step_2_d')}

03 {t('flow_step_3')}

{t('flow_phones_t')}
{t('flow_phones_t2')}

{t('flow_phones_d')}

0,8s {t('flow_phones_avg')}
FS
Face Security
{t('flow_role_owner')}
FS
Face Security
{t('flow_alert_shop')}
{t('flow_alert_dispatch')}
{t('flow_role_manager')}
FS
Face Security
{t('flow_role_security')}
{t('flow_alert_confirm')}
{t('flow_alert_going')} {t('flow_alert_onsite')}
{t('flow_role_security')}
); }; /* ------------------------------- PAKIETY ------------------------------- */ const formatGBP = (n) => '£' + n.toLocaleString('en-GB'); const Pakiety = () => { const { t } = useT(); const plans = [ { id: 'starter', name: 'Starter', priceM: 99, setup: 299, blurb: t('pak_starter_blurb'), features: t('pak_starter_f'), cta: t('pak_starter_cta') }, { id: 'standard', name: 'Standard', priceM: 199, setup: 299, popular: true, blurb: t('pak_standard_blurb'), features: t('pak_standard_f'), cta: t('pak_standard_cta') }, { id: 'pro', name: 'Professional', priceM: 299, setup: 699, blurb: t('pak_pro_blurb'), features: t('pak_pro_f'), cta: t('pak_pro_cta') }, ]; return (
{t('pak_eyebrow')}

{t('pak_title_a')}
{t('pak_title_b')}

{t('pak_lead')}

{t('pak_callout_a')}{t('pak_callout_b')}

{plans.map((plan, i) => (
{plan.popular && (
{t('pak_popular')}
)}
{plan.name}
{formatGBP(plan.priceM)} {t('pak_per_month')}
{t('pak_setup')} {formatGBP(plan.setup)}

{plan.blurb}

    {plan.features.map((f, idx) => (
  • {f}
  • ))}
{plan.cta}
))}
{t('pak_addon_eyebrow')}
{t('pak_addon_t')}

{t('pak_addon_d')}

+£99 {t('pak_addon_per')}
{t('pak_addon_cta')}
{t('pak_example_label')}
{t('pak_example_a')}{t('pak_example_setup')}{t('pak_example_plus')}{t('pak_example_monthly')}{t('pak_example_end')}
{t('pak_footnote')}
); }; /* ------------------------------- CO ZAWIERA ------------------------------- */ const CoZawiera = () => { const { t } = useT(); const inclusion = [ { icon: IconSend, t: t('inc_1_t'), d: t('inc_1_d') }, { icon: IconScope, t: t('inc_2_t'), d: t('inc_2_d') }, { icon: IconBolt, t: t('inc_3_t'), d: t('inc_3_d') }, { icon: IconDb, t: t('inc_4_t'), d: t('inc_4_d') }, { icon: IconUsers, t: t('inc_5_t'), d: t('inc_5_d') }, { icon: IconLock, t: t('inc_6_t'), d: t('inc_6_d') }, ]; return (
{t('inc_eyebrow')}

{t('inc_title')}

{inclusion.map((it, i) => (
{it.t}

{it.d}

))}
); }; /* ------------------------------- KAMERY ------------------------------- */ const Kamery = () => { const { t } = useT(); const cameraRows = [ [...t('kam_row_1'), 4], [...t('kam_row_2'), 5], [...t('kam_row_3'), 5], [...t('kam_row_4'), 4], ]; const entranceCards = [ { icon: IconDoor, t: t('kam_ent_1_t'), d: t('kam_ent_1_d') }, { icon: IconRuler, t: t('kam_ent_2_t'), d: t('kam_ent_2_d') }, { icon: IconScope, t: t('kam_ent_3_t'), d: t('kam_ent_3_d') }, ]; return (
{t('kam_eyebrow')}

{t('kam_title')}

{t('kam_lead')}

{cameraRows.map((r, i) => ( ))}
{t('kam_th_plan')} {t('kam_th_tier')} {t('kam_th_best')} {t('kam_th_spec')} {t('kam_th_score')}
{r[0]} {r[1]} {r[2]} {r[3]} {Array.from({ length: 5 }).map((_, k) => )}
{t('kam_foot_a')} {t('kam_foot_b')}
{entranceCards.map((c, i) => (
{c.t}

{c.d}

))}
); }; /* ------------------------------- LICZBY ------------------------------- */ const Liczby = () => { const { t } = useT(); const stats = [['95%+', t('lic_1')], ['<1s', t('lic_2')], ['0', t('lic_3')], ['24/7', t('lic_4')]]; return (
{t('lic_eyebrow')}

{t('lic_title')}

{stats.map(([big, small], i) => (
{big}
{small}
))}
); }; /* ------------------------------- PRZEWAGI ------------------------------- */ const Przewagi = () => { const { t } = useT(); const advantages = [ { icon: IconDb, t: t('adv_1_t'), d: t('adv_1_d') }, { icon: IconSend, t: t('adv_2_t'), d: t('adv_2_d') }, { icon: IconShield, t: t('adv_3_t'), d: t('adv_3_d') }, { icon: IconUsers, t: t('adv_4_t'), d: t('adv_4_d') }, { icon: IconWifiOff, t: t('adv_5_t'), d: t('adv_5_d') }, ]; return (
{t('adv_eyebrow')}

{t('adv_title')}

{advantages.map((a, i) => (
0{i+1}
{a.t}

{a.d}

))}
); }; /* ------------------------------- ROI ------------------------------- */ const tierLookup = { starter: 99, standard: 199, pro: 299 }; const tierName = { starter: 'Starter', standard: 'Standard', pro: 'Professional' }; const BarRow = ({ label, color, value, display, max, note, dark }) => { const pct = Math.max(2, Math.min(100, (value / max) * 100)); return (
{label}
{display}
{note}
); }; const ROICalc = () => { const { t } = useT(); const [stores, setStores] = useState(3); const [tier, setTier] = useState('standard'); const monthly = stores * tierLookup[tier]; const lossLow = stores * 600; const lossHigh = stores * 2000; const roiLow = (lossLow / monthly).toFixed(1); const roiHigh = (lossHigh / monthly).toFixed(1); const paybackHigh = (monthly / lossLow).toFixed(1); const paybackLow = (monthly / lossHigh).toFixed(1); const maxVal = lossHigh * 1.05; return (
{t('roi_eyebrow')}

{t('roi_title_a')}
{t('roi_title_b')}

{t('roi_lead')}

{t('roi_stores')}
{stores}
{t('roi_avg_plan')}
{tierName[tier]}
setStores(+e.target.value)} className="w-full mt-5" style={{ WebkitAppearance: 'none', appearance: 'none', height: 4, background: 'linear-gradient(90deg, #B7892B 0%, #B7892B ' + ((stores-1)/29*100) + '%, rgba(255,255,255,0.15) ' + ((stores-1)/29*100) + '%, rgba(255,255,255,0.15) 100%)', borderRadius: 2, outline: 'none' }} />
1102030
{Object.entries(tierName).map(([k, l]) => ( ))}
{t('roi_multiplier')}
{roiLow}–{roiHigh}×
{t('roi_payback')} {paybackLow}–{paybackHigh} {t('roi_payback_unit')}
{t('roi_cta')}
{t('roi_footnote')}
); }; /* ------------------------------- GWARANCJA ------------------------------- */ const Guarantee = () => { const { t } = useT(); return (
{t('gua_eyebrow')}

{t('gua_title')}

{t('gua_lead')}

); }; /* ------------------------------- FAQ ------------------------------- */ const FAQ = () => { const { t } = useT(); const faqs = t('faq_qs'); return (
{t('faq_eyebrow')}

{t('faq_title')}

{t('faq_lead_a')}{t('faq_lead_b')}.

{faqs.map(([q, a], i) => (
0{i+1} {q}
{a}
))}
); }; /* ------------------------------- CTA / KONTAKT ------------------------------- */ const CTA = () => { const { t } = useT(); return (
{t('cta_eyebrow')}

{t('cta_title_a')}
{t('cta_title_b')}

{t('cta_lead')}

{t('cta_btn')}
); }; /* ------------------------------- FOOTER ------------------------------- */ const FooterCol = ({ title, items }) => (
{title}
); const Footer = () => { const { t } = useT(); return ( ); }; /* ------------------------------- APP ------------------------------- */ const App = () => (
); ReactDOM.createRoot(document.getElementById('root')).render();