const { useState, useMemo, useEffect } = React; // Helpers const formatDate = (iso) => { const d = new Date(iso); const months = ["stycznia", "lutego", "marca", "kwietnia", "maja", "czerwca", "lipca", "sierpnia", "września", "października", "listopada", "grudnia"]; return `${d.getDate()} ${months[d.getMonth()]} ${d.getFullYear()}`; }; const daysLeft = (iso) => { const now = new Date("2026-05-22"); const end = new Date(iso); return Math.max(0, Math.ceil((end - now) / (1000 * 60 * 60 * 24))); }; const Logo = ({ size = 32, inverted = false }) => { const gold = "#D4A03A"; const ink = inverted ? "#FFFFFF" : "#1a2230"; return ( ); }; const Brand = ({ inverted = false }) => ( ranking.pl ); const Difficulty = ({ level, label }) =>
{[1, 2, 3, 4, 5].map((i) => )}
{label}
; const BankLogo = ({ bank }) =>
{bank.initials}
; const OfferCard = ({ offer, expanded, onToggle, isFeatured }) => { const dLeft = daysLeft(offer.expiry); const urgent = dLeft <= 10; return (
{String(offer.rank).padStart(2, '0')} {isFeatured && }

{offer.bank}

{offer.product}

{offer.badges.map((b) => {b})}
Premia {offer.premiaLabel}
{offer.breakdown.map((b, i) =>
{b.label} {b.value}
)}

{offer.description}

Trudność
Czas do nagrody {offer.timeToReward}
Oferta do {formatDate(offer.expiry)} {urgent && tylko {dLeft} dni}
{offer.promoCode &&
Kod promocyjny {offer.promoCode}
}
Sprawdź ofertę
{expanded &&

Warunki promocji

    {offer.conditions.map((c, i) =>
  1. {c}
  2. )}

Powyższe punkty to streszczenie kluczowych warunków. Przed założeniem konta zapoznaj się z pełnym regulaminem promocji na stronie banku.

}
); }; const Filters = ({ sortBy, setSortBy, filterDiff, setFilterDiff, search, setSearch, count }) =>
setSearch(e.target.value)} />
Sortuj:
{[ { id: 'premia', label: 'Wysokość premii' }, { id: 'difficulty', label: 'Łatwość warunków' }, { id: 'expiry', label: 'Kończące się' }]. map((opt) => )}
Trudność:
{[ { id: 'all', label: 'Wszystkie' }, { id: 'easy', label: 'Łatwe' }, { id: 'medium', label: 'Średnie' }]. map((opt) => )}
{count} {count === 1 ? 'oferta' : count < 5 ? 'oferty' : 'ofert'} dopasowane do filtrów · Aktualizacja: 22 maja 2026
; const Hero = ({ totalMax, bankCount, topOffer }) =>
{(window.VARIANT_CONFIG?.hero?.eyebrow) || 'Ranking maj 2026 — zaktualizowano dziś'}

{(() => { const t = window.VARIANT_CONFIG?.hero?.title; if (t) { return <>{t.pre}
{t.em && {t.em.replace('{premia}', topOffer.premia.toLocaleString('pl-PL'))}{' '}}{t.post}; } return <>Najlepsze promocje bankowe.
Do {topOffer.premia.toLocaleString('pl-PL')} zł{' '} za otwarcie konta.; })()}

{(window.VARIANT_CONFIG?.hero?.sub) || `Aktualne i sprawdzone oferty banków w Polsce — ${bankCount} promocji w jednym miejscu. Sortuj wg wysokości premii albo trudności warunków. Bez ukrytych haków, z bezpośrednimi linkami do każdej oferty.`}

{bankCount} aktualnych promocji
{topOffer.premiaLabel} u lidera: {topOffer.bank}
10 min tyle trwa otwarcie konta online
0 zł opłaty za nasze rekomendacje
{(window.VARIANT_CONFIG?.hero?.cta) || 'Zobacz ranking'} Jak korzystać z promocji?
; const HowItWorks = () =>
Jak to działa

Cztery kroki do premii

{[ { n: '01', t: 'Wybierz ofertę', d: 'Posortuj ranking wg wysokości premii lub trudności warunków. Sprawdź, czy nie obowiązuje Cię karencja.' }, { n: '02', t: 'Wypełnij wniosek online', d: 'Każda oferta prowadzi bezpośrednio do strony banku. Większość konta założysz w 10 minut na selfie lub przez mObywatela.' }, { n: '03', t: 'Spełnij warunki', d: 'Najczęściej wystarczy wpływ na konto i kilka płatności kartą lub BLIKIEM przez 2–3 miesiące.' }, { n: '04', t: 'Odbierz premię', d: 'Bank wypłaca nagrodę przelewem — w jednej lub w kilku transzach, zgodnie z regulaminem promocji.' }]. map((s) =>
{s.n}

{s.t}

{s.d}

)}
; const FAQ = () => { const [open, setOpen] = useState(0); const items = [ { q: 'Czy promocje bankowe są bezpieczne?', a: 'Tak. Premia za otwarcie konta to standardowa forma marketingu — wszystkie banki w naszym rankingu są nadzorowane przez Komisję Nadzoru Finansowego i objęte gwarancjami Bankowego Funduszu Gwarancyjnego do 100 000 EUR.' }, { q: 'Ile kont mogę założyć jednocześnie?', a: 'Nie ma limitu. Możesz brać udział w kilku promocjach naraz w różnych bankach. Pamiętaj jednak, że każdy bank określa własną „karencję" — okres, w którym nie mogłeś mieć u niego konta, żeby zaliczyć się do nowych klientów.' }, { q: 'Czy od premii bankowej trzeba zapłacić podatek?', a: 'Zazwyczaj nie — większość banków sama rozlicza podatek lub korzysta ze zwolnienia (do 200 zł na podstawie art. 21 ust. 1 pkt 68a ustawy o PIT). Wyższe nagrody bywają wypłacane w transzach, by mieścić się w zwolnieniu. Szczegóły znajdziesz w regulaminie konkretnej promocji.' }, { q: 'Jak długo czeka się na wypłatę bonusu?', a: 'Od 3 dni roboczych (Revolut) do nawet 12 miesięcy (Bank Pocztowy, PKO BP). Większość banków wypłaca premię w 30–60 dni od spełnienia warunków danego etapu.' }, { q: 'Co to jest karencja w promocji bankowej?', a: 'To okres, w którym nie mogłeś być klientem danego banku, żeby załapać się na nową promocję. Najczęściej wynosi 6–24 miesiące. Erste Bank wymaga braku konta od 01.04.2024, mBank od 01.01.2022, a Alior Bank — przez ostatnie 3 lata.' }, { q: 'Czy mogę zrezygnować z konta po odebraniu premii?', a: 'Tak, ale uważaj — niektóre regulaminy wymagają utrzymania konta przez określony czas (np. 6 miesięcy) po wypłacie ostatniej transzy nagrody. W przeciwnym razie bank może zażądać zwrotu bonusu.' }, { q: 'Jak nie zapomnieć o warunkach każdej promocji?', a: 'Załóż kalendarz z przypomnieniami na każdy miesiąc: wpływ + transakcje kartą + logowanie do aplikacji. Najczęstszy powód utraty premii to niezauważone wymaganie z regulaminu, nie brak aktywności.' }]; return (
FAQ

Pytania, które naprawdę zadajecie

{items.map((it, i) =>
{open === i &&
{it.a}
}
)}
); }; const Methodology = () =>
Metodologia

Jak tworzymy ranking

1

Analizujemy regulaminy

Każdą promocję czytamy w całości — łącznie z definicją „nowego klienta" i wymogami dotyczącymi zgód marketingowych.

2

Ważymy nagrodę i trudność

Wysokość premii to nie wszystko. Porównujemy ją z liczbą wymaganych transakcji, minimalnym wpływem i czasem do wypłaty.

3

Odrzucamy nieprzejrzyste

Pomijamy promocje, w których przyznanie nagrody zależy od uznaniowej decyzji banku albo niejasnych zapisów regulaminu.

4

Aktualizujemy co tydzień

Ranking odświeżamy w każdy poniedziałek oraz natychmiast po publikacji nowej promocji przez którykolwiek bank z zestawienia.

; const Footer = () => ; const App = () => { const [sortBy, setSortBy] = useState('premia'); const [filterDiff, setFilterDiff] = useState('all'); const [search, setSearch] = useState(''); const [expandedId, setExpandedId] = useState(null); const filtered = useMemo(() => { let list = [...window.BANK_OFFERS]; if (search.trim()) { const q = search.toLowerCase(); list = list.filter((o) => o.bank.toLowerCase().includes(q) || o.product.toLowerCase().includes(q) ); } if (filterDiff === 'easy') list = list.filter((o) => o.difficulty <= 2); if (filterDiff === 'medium') list = list.filter((o) => o.difficulty === 3); if (sortBy === 'premia') list.sort((a, b) => b.premia - a.premia); if (sortBy === 'difficulty') list.sort((a, b) => a.difficulty - b.difficulty || b.premia - a.premia); if (sortBy === 'expiry') list.sort((a, b) => new Date(a.expiry) - new Date(b.expiry)); return list; }, [sortBy, filterDiff, search]); const totalMax = useMemo(() => window.BANK_OFFERS.reduce((s, o) => s + o.premia, 0), []); const topOffer = window.BANK_OFFERS[0]; return (
Ranking

Wszystkie aktualne promocje — maj 2026

Najatrakcyjniejsze oferty na górze. Kliknij „Pokaż warunki", aby zobaczyć dokładne wymagania każdej promocji.

{filtered.length === 0 &&

Brak ofert spełniających kryteria.

} {filtered.map((offer, idx) => setExpandedId(expandedId === offer.id ? null : offer.id)} isFeatured={sortBy === 'premia' && idx < 3} /> )}

Nie wiesz, od czego zacząć?

Wybierz ofertę z TOP 3 i załóż konto online w 10 minut. Pierwszą premię odbierzesz już w przyszłym miesiącu.

Załóż {topOffer.bank} →
); }; ReactDOM.createRoot(document.getElementById('root')).render();