Bankowychecklist.pl






SmartBanker | Odbierz premie bankowe

<!-- Tailwind CSS -->
<script src="https://cdn.tailwindcss.com"></script>

<!-- Google Fonts: Inter -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap" rel="stylesheet">

<!-- Lucide Icons -->
<script src="https://unpkg.com/lucide@latest"></script>

<!-- Tailwind Config dla specyficznych kolorów i animacji -->
<script>
    tailwind.config = {
        theme: {
            extend: {
                fontFamily: {
                    sans: ['Inter', 'sans-serif'],
                },
                colors: {
                    appDark: '#0B0F19',
                    appCard: '#151A27',
                    appAccent: '#3B82F6',
                    appMoney: '#10B981',
                    appWarning: '#F59E0B',
                    appDanger: '#EF4444'
                },
                animation: {
                    'pulse-slow': 'pulse 3s cubic-bezier(0.4, 0, 0.6, 1) infinite',
                    'slide-up': 'slideUp 0.5s ease-out forwards',
                    'fade-in': 'fadeIn 0.3s ease-out forwards',
                },
                keyframes: {
                    slideUp: {
                        '0%': { opacity: '0', transform: 'translateY(20px)' },
                        '100%': { opacity: '1', transform: 'translateY(0)' },
                    },
                    fadeIn: {
                        '0%': { opacity: '0' },
                        '100%': { opacity: '1' },
                    }
                }
            }
        }
    }
</script>

<style>
    body {
        background-color: #0B0F19;
        color: #F8FAFC;
        -webkit-font-smoothing: antialiased;
    }

    /* Ukrycie standardowego scrollbara, wygląd jak w apce */
    ::-webkit-scrollbar {
        width: 6px;
    }
    ::-webkit-scrollbar-track {
        background: #0B0F19;
    }
    ::-webkit-scrollbar-thumb {
        background: #334155;
        border-radius: 10px;
    }
    ::-webkit-scrollbar-thumb:hover {
        background: #475569;
    }

    .glass-panel {
        background: rgba(21, 26, 39, 0.7);
        backdrop-filter: blur(12px);
        -webkit-backdrop-filter: blur(12px);
        border: 1px solid rgba(255, 255, 255, 0.05);
    }

    .card-hover {
        transition: all 0.3s ease;
    }
    .card-hover:hover {
        transform: translateY(-4px);
        box-shadow: 0 20px 40px -10px rgba(0,0,0,0.5);
        border-color: rgba(59, 130, 246, 0.3);
    }

    .gradient-text {
        background: linear-gradient(135deg, #60A5FA, #A78BFA);
        -webkit-background-clip: text;
        -webkit-text-fill-color: transparent;
        background-clip: text;
    }

    .timeline-dot::before {
        content: '';
        position: absolute;
        left: -25px;
        top: 6px;
        width: 12px;
        height: 12px;
        border-radius: 50%;
        background-color: #3B82F6;
        border: 2px solid #0B0F19;
        z-index: 10;
    }

    .accordion-content {
        max-height: 0;
        overflow: hidden;
        transition: max-height 0.4s cubic-bezier(0.4, 0, 0.2, 1);
    }

    .toast {
        position: fixed;
        bottom: 24px;
        left: 50%;
        transform: translateX(-50%) translateY(100px);
        opacity: 0;
        transition: all 0.3s cubic-bezier(0.68, -0.55, 0.265, 1.55);
        z-index: 100;
    }
    .toast.show {
        transform: translateX(-50%) translateY(0);
        opacity: 1;
    }
</style>
<!-- Nawigacja -->
<nav class="fixed top-0 w-full glass-panel z-50 border-b border-white/10">
    <div class="max-w-5xl mx-auto px-4 h-16 flex items-center justify-between">
        <div class="flex items-center gap-2">
            <div class="w-8 h-8 rounded-lg bg-gradient-to-br from-blue-500 to-indigo-600 flex items-center justify-center shadow-lg">
                <i data-lucide="wallet" class="w-5 h-5 text-white"></i>
            </div>
            <span class="font-bold text-xl tracking-tight">Smart<span class="text-blue-400">Banker</span></span>
        </div>
        <div class="hidden md:flex items-center gap-4 text-sm font-medium text-slate-300">
            <span>Łączna pula premii:</span>
            <span class="bg-emerald-500/10 text-emerald-400 px-3 py-1 rounded-full border border-emerald-500/20 shadow-[0_0_15px_rgba(16,185,129,0.2)]">
                + <span id="total-pool">0</span> zł
            </span>
        </div>
    </div>
</nav>

<!-- Sekcja Hero -->
<main class="flex-grow pt-24 pb-20 px-4">
    <div class="max-w-3xl mx-auto text-center mb-12 animate-slide-up">
        <div class="inline-flex items-center gap-2 px-3 py-1.5 rounded-full bg-blue-500/10 border border-blue-500/20 text-blue-400 text-sm font-medium mb-6">
            <i data-lucide="shield-check" class="w-4 h-4"></i>
            Zweryfikowane oferty bankowe
        </div>
        <h1 class="text-4xl md:text-5xl font-extrabold mb-4 leading-tight">
            Zarabiaj na <span class="gradient-text">promocjach bankowych</span>
        </h1>
        <p class="text-slate-400 text-lg md:text-xl">
            Odbieraj darmową gotówkę za testowanie kont. Wyselekcjonowane, bezpieczne oferty. Wybierz bank, wykonaj proste kroki i odbierz premię.
        </p>
    </div>

    <!-- Kontener na dynamiczne karty ofert -->
    <div id="offers-container" class="max-w-4xl mx-auto space-y-6">
        <!-- Karty będą renderowane tutaj przez JavaScript -->
    </div>
</main>

<!-- Sticky Mobile Footer -->
<div class="md:hidden fixed bottom-0 w-full glass-panel border-t border-white/10 p-4 z-40 pb-safe">
    <div class="flex justify-between items-center">
        <div class="flex flex-col">
            <span class="text-xs text-slate-400">Do zgarnięcia:</span>
            <span class="text-lg font-bold text-emerald-400">+ <span id="mobile-total-pool">0</span> zł</span>
        </div>
        <button onclick="window.scrollTo(0,0)" class="bg-white/10 hover:bg-white/20 text-white p-2 rounded-xl backdrop-blur-sm transition-colors">
            <i data-lucide="arrow-up" class="w-5 h-5"></i>
        </button>
    </div>
</div>

<!-- Toast Notification -->
<div id="toast" class="toast bg-slate-800 border border-slate-700 text-white px-4 py-3 rounded-2xl shadow-2xl flex items-center gap-3">
    <div class="w-8 h-8 rounded-full bg-emerald-500/20 flex items-center justify-center">
        <i data-lucide="check" class="w-4 h-4 text-emerald-500"></i>
    </div>
    <span id="toast-message" class="font-medium text-sm">Skopiowano pomyślnie</span>
</div>

<script>
    // Inicjalizacja ikon Lucide
    lucide.createIcons();

    // Baza danych ofert (strukturyzacja tekstu)
    const offersData = [
        {
            id: "erste",
            bankName: "Erste Bank",
            logoUrl: "https://bankowychecklist.pl/wp-content/uploads/2026/06/logo-erste.png",
            bannerUrl: "https://bankowychecklist.pl/wp-content/uploads/2026/06/erste-bank.jpg",
            reward: "800 zł",
            extraReward: "Lokata 4,5%",
            title: "Darmowe konto do 26. roku życia. Zgarnij 800 zł premii i 4,5% na lokacie!",
            deadline: "2026-07-31T23:59:59",
            limit: null,
            link: "https://prostodo.pl/c?zid=16702889540&tid=5980&ha=3174784782&r=5377",
            steps: [
                {
                    title: "Start (Do 30 czerwca)",
                    content: "Otwórz konto promocyjne z kartą debetową i podpisz umowę. <strong>Ważne:</strong> We wniosku zaznacz WSZYSTKIE zgody (marketing, kontakt elektroniczny/telefoniczny oraz EKK)."
                },
                {
                    title: "Trzy miesiące aktywności",
                    content: "W lipcu, sierpniu i wrześniu zrób to samo:<br>- Przelej na konto min. 1500 zł.<br>- Zapłać min. 5 razy kartą lub BLIKiem.<br>- Załóż cel oszczędnościowy w 'Moje Cele'."
                },
                {
                    title: "Odbiór gotówki",
                    content: "Sierpień: 200 zł. Wrzesień: 200 zł. Październik: 200 zł. (+100 zł wpada za poprawne otwarcie konta i zgody)."
                },
                {
                    title: "BONUS! +100 zł (Program Poleceń)",
                    content: `Do 30 dni od otwarcia zaloguj się i dołącz do programu. Podaj kod: <span class="inline-flex items-center gap-1 bg-slate-800 px-2 py-1 rounded text-blue-400 font-mono text-sm border border-slate-700 mx-1 cursor-pointer hover:bg-slate-700" onclick="copyToClipboard('JFJ8LX')">JFJ8LX <i data-lucide="copy" class="w-3 h-3"></i></span>. W kolejnym miesiącu zrób płatności kartą na min. 300 zł. Otrzymasz voucher do sklepu.`
                }
            ],
            details: `<strong>Kto może wziąć udział?</strong> Nowy klient (brak konta od 1 czerwca 2024 r.). Program poleceń dla osób bez konta przez ostatnie 12 miesięcy. Posiadanie karty kredytowej nie wyklucza!<br><br><strong>Lokata 4,5%:</strong> Dla osób bez konta przez ostatnie 2 lata. Okres 3 miesiące, limit 50 000 zł.`
        },
        {
            id: "bnp",
            bankName: "BNP Paribas",
            logoUrl: "https://bankowychecklist.pl/wp-content/uploads/2026/06/logo-bnp-paribas.png",
            bannerUrl: "https://bankowychecklist.pl/wp-content/uploads/2026/06/bnp-paribas-1.png",
            reward: "700 zł",
            title: "Zgarnij aż 700 zł premii za proste płatności kartą!",
            deadline: "2026-08-31T23:59:59",
            limit: "Tylko 30 000 rejestracji",
            link: "https://prostodo.pl/c?zid=47312489390&tid=6260&ha=444817510&r=1865",
            steps: [
                {
                    title: "Rejestracja i wniosek (Do 31 sierpnia)",
                    content: "Odblokuj PESEL. Przejdź na stronę, wypełnij formularz. Pobierz aplikację przez kod QR i wybierz 'Konto osobiste w promocji'. Zaakceptuj regulamin i zgody marketingowe. Wybierz Kartę Otwartą na Świat."
                },
                {
                    title: "Pętla kasowa przez 12 miesięcy",
                    content: "Przez 12 kolejnych miesięcy (od następnego miesiąca po otwarciu):<br>- Przelej min. 1000 zł.<br>- Zapłać min. 7 razy kartą (BLIK się nie liczy).<br>Za każdy miesiąc dostaniesz 50 zł (łącznie 600 zł)."
                },
                {
                    title: "Ekstra bonus +100 zł na finał",
                    content: "W 12. miesiącu posiadaj Konto Lokacyjne lub 'Konto Pełne Marzeń' z saldem min. 100 zł. Zgarniasz dodatkowe 100 zł!"
                }
            ],
            details: `<strong>Kto może wziąć udział?</strong> Osoba pełnoletnia, brak konta osobistego w BNP Paribas przez ostatnie 24 miesiące.<br><br><strong>Koszty:</strong> Prowadzenie konta 0 zł. Karta 0 zł w tej promocji. Wypłaty z bankomatów poza EOG 0 zł.`
        },
        {
            id: "alior",
            bankName: "Alior Bank",
            logoUrl: "https://bankowychecklist.pl/wp-content/uploads/2026/06/logo-alior-bank-.png",
            bannerUrl: "https://bankowychecklist.pl/wp-content/uploads/2026/06/alior-bank-1.png",
            reward: "1000 zł",
            extraReward: "+ Obrączka (500 zł)",
            title: "Weź aż 1000 zł gotówki i zgarnij designerską obrączkę płatniczą!",
            deadline: "2026-06-30T23:59:59",
            limit: null,
            link: "https://okazjabankowa.ebrokerpartner.pl/short/5opw0",
            steps: [
                {
                    title: "Otwarcie konta z kodem (Do 30 czerwca)",
                    content: `Złóż wniosek o Alior Konto. Wpisz kod promocyjny: <span class="inline-flex items-center gap-1 bg-slate-800 px-2 py-1 rounded text-blue-400 font-mono text-sm border border-slate-700 mx-1 cursor-pointer hover:bg-slate-700" onclick="copyToClipboard('ZYSKAJ2026')">ZYSKAJ2026 <i data-lucide="copy" class="w-3 h-3"></i></span>. Zaznacz zgody na marketing bezpośredni.`
                },
                {
                    title: "Pierwsza aktywność (W ciągu 10 dni)",
                    content: "Zaloguj się do Alior Mobile. Zarejestruj kartę w Bezcenne Chwile. Wykonaj min. 5 płatności kartą/BLIK. <strong>Nagroda:</strong> 200 zł oraz kod na darmową obrączkę płatniczą."
                },
                {
                    title: "Pętla cashbacku (Przez 8 miesięcy)",
                    content: "Zapewnij wpływ min. 2000 zł. Zaloguj się 1 raz do aplikacji. Płać kartą/BLIK - bank zwraca 10% wartości zakupów (do 100 zł miesięcznie)."
                }
            ],
            details: `<strong>Kto może wziąć udział?</strong> Osoby, które przez ostatnie 3 lata nie posiadały konta osobistego w Alior Banku.<br><br><strong>Koszty:</strong> Konto za 0 zł. Karta za 0 zł przy wydatkach min. 300 zł/mc (inaczej 6 zł).`
        },
        {
            id: "mbank",
            bankName: "mBank",
            logoUrl: "https://bankowychecklist.pl/wp-content/uploads/2026/06/logo-mbank.png",
            bannerUrl: "https://bankowychecklist.pl/wp-content/uploads/2026/06/mbank-1.png",
            reward: "1260 zł",
            title: "Rekordowe 1260 zł premii za założenie darmowego eKonta do Usług!",
            deadline: "2026-08-31T23:59:59",
            limit: "Tylko 2 000 kont",
            link: "https://okazjabankowa.ebrokerpartner.pl/short/5opw2",
            steps: [
                {
                    title: "Rejestracja (Do 31 sierpnia)",
                    content: `Odblokuj PESEL. Zapisz się do akcji i złóż wniosek. Wpisz kod: <span class="inline-flex items-center gap-1 bg-slate-800 px-2 py-1 rounded text-blue-400 font-mono text-sm border border-slate-700 mx-1 cursor-pointer hover:bg-slate-700" onclick="copyToClipboard('banklovers99')">banklovers99 <i data-lucide="copy" class="w-3 h-3"></i></span>. Zaakceptuj mOkazje i 'Moje Cele'. Umowę podpisz przez selfie lub mObywatel do 9 września.`
                },
                {
                    title: "Pierwszy miesiąc",
                    content: "W ciągu 7 dni przelej min. 2000 zł. Do końca pierwszego miesiąca zapłać kartą min. 350 zł. Utrzymaj saldo min. 100 zł na 'Moje Cele' w ostatni dzień roboczy."
                },
                {
                    title: "Pętla aktywności (Kolejne 5 miesięcy)",
                    content: "Co miesiąc: wpływ min. 2000 zł, płatności kartą min. 350 zł, przyrost salda na 'Moje Cele' o 100 zł względem poprzedniego miesiąca."
                },
                {
                    title: "Dodatkowe bonusy",
                    content: "Wpływ wynagrodzenia (w 4 z 6 miesięcy): +300 zł. Otwarcie konta dla dziecka: +100 zł."
                }
            ],
            details: `<strong>Kto może wziąć udział?</strong> Nowi klienci (brak konta po 1 stycznia 2022 r.).<br><br><strong>Koszty:</strong> Prowadzenie 0 zł. Karta 0 zł przy płatnościach min. 350 zł/mc (inaczej 10 zł).`
        },
        {
            id: "pekao",
            bankName: "Pekao S.A.",
            logoUrl: "https://bankowychecklist.pl/wp-content/uploads/2026/06/logo-pekao-sa.png",
            bannerUrl: "https://bankowychecklist.pl/wp-content/uploads/2026/06/pekao-S.A-1.png",
            reward: "300 zł",
            extraReward: "+ 2400 zł zwrotu",
            title: "Zgarnij 300 zł szybkiej gotówki + nawet 2400 zł zwrotu na podróże!",
            deadline: "2026-07-15T23:59:59",
            limit: null,
            link: "https://prostodo.pl/c?zid=33525907120&tid=2637&ha=3673410168&r=711",
            steps: [
                {
                    title: "Start (Do 15 lipca)",
                    content: "Otwórz Konto Przekorzystne. Zaznacz zgody marketingowe. Tego samego dnia podpisz umowę online i zaloguj się do PeoPay. <strong>Pierwsza nagroda: 100 zł</strong>."
                },
                {
                    title: "Dwa miesiące płatności",
                    content: "W pierwszym i drugim miesiącu wykonaj min. 5 płatności kartą na dowolną kwotę. <strong>Kolejna nagroda: 200 zł</strong>."
                },
                {
                    title: "Opcja VIP: 2400 zł na podróże",
                    content: "Wybierz Złotą Kartę. Płać nią przez 12 miesięcy - bank daje 3% do 6% zwrotu (do 200 zł/mc) do wirtualnego portfela. Środki te możesz wypłacić na zakupy związane z podróżami (paliwo, bilety, wycieczki)."
                }
            ],
            details: `<strong>Kto może wziąć udział?</strong> Brak konta w Pekao S.A. po 1 maja 2024 r.<br><br><strong>Koszty:</strong> Konto za 0 zł. Karta za 0 zł (warunek: wpływ 500 zł i 1 płatność) lub Złota Karta za 0 zł (wpływ 1000 zł i 5 płatności). Osoby <26 lat mają karty za darmo.`
        },
        {
            id: "revolut",
            bankName: "Revolut",
            logoUrl: "https://bankowychecklist.pl/wp-content/uploads/2026/06/logo-revolut-.png",
            bannerUrl: "https://bankowychecklist.pl/wp-content/uploads/2026/06/revolut-1.png",
            reward: "100 zł",
            title: "Najprostsza promocja w internecie. Wydajesz 100 zł – odbierasz 100 zł!",
            deadline: "2026-12-31T23:59:59",
            limit: null,
            link: "https://okazjabankowa.ebrokerpartner.pl/short/5hrzp",
            steps: [
                {
                    title: "Rejestracja",
                    content: "Kliknij w link, podaj numer telefonu. Pobierz aplikację i zweryfikuj tożsamość."
                },
                {
                    title: "Darmowa karta",
                    content: "Zamów darmową kartę wirtualną i podepnij ją do Apple Pay / Google Pay."
                },
                {
                    title: "Prosta płatność i odbiór",
                    content: "Zasil konto. W ciągu 30 dni wydaj łącznie min. 100 zł nową kartą. W ciągu 3 dni roboczych otrzymasz bonus 100 zł bezpośrednio na konto!"
                }
            ],
            details: `<strong>Kto może wziąć udział?</strong> Tylko nowi klienci. Wiek: 18+.<br><br><strong>Koszty:</strong> Plan Standard to 0 zł opłat miesięcznych, darmowa wirtualna karta i darmowe przelewy między użytkownikami.`
        },
        {
            id: "revolutbiz",
            bankName: "Revolut Business",
            logoUrl: "https://placehold.co/100x100/1e293b/ffffff?text=RB",
            bannerUrl: "https://bankowychecklist.pl/wp-content/uploads/2026/06/revolut-biznes-1.png",
            reward: "500 zł",
            title: "Zgarnij 500 zł premii w jeden dzień za proste zasilenie konta!",
            deadline: "2026-07-31T23:59:59",
            limit: null,
            link: "https://okazjabankowa.ebrokerpartner.pl/short/5oq3c",
            steps: [
                {
                    title: "Wniosek i rejestracja",
                    content: "Pobierz aplikację biznesową. Uzupełnij dane firmy (dla JDG wybierz jednoosobową działalność)."
                },
                {
                    title: "Weryfikacja",
                    content: "Zrób nagranie twarzy (selfie weryfikacyjne) i zdjęcie dowodu osobistego. Wybierz darmowy plan Basic."
                },
                {
                    title: "Zasilenie i premia",
                    content: "Gdy konto będzie aktywne, zasil je dowolną kwotą (np. 10 zł) przelewem lub kartą. Premia 500 zł wpadnie błyskawicznie, często tego samego dnia!"
                }
            ],
            details: `<strong>Kto może wziąć udział?</strong> Nowi klienci biznesowi (JDG).<br><br><strong>Koszty:</strong> Plan Basic za 0 zł. Karta i dostawa za darmo.`
        },
        {
            id: "millennium",
            bankName: "Bank Millennium",
            logoUrl: "https://bankowychecklist.pl/wp-content/uploads/2026/06/logo-milenium-.png",
            bannerUrl: "https://bankowychecklist.pl/wp-content/uploads/2026/06/millenium-1.png",
            reward: "700 zł",
            extraReward: "Lokata 5,5%",
            title: "Zgarnij aż 700 zł premii na start + 5,5% dla Twoich oszczędności!",
            deadline: "2026-10-27T23:59:59",
            limit: "Limit 300 000 wniosków",
            link: "https://okazjabankowa.ebrokerpartner.pl/short/5oq3e",
            steps: [
                {
                    title: "Wniosek i zgody (Do 27 października)",
                    content: "Zawnioskuj o Konto Millennium 360°. Zaznacz zgody marketingowe. Podpisz umowę przez mObywatel lub otwarta bankowość."
                },
                {
                    title: "Pierwsza premia (200 zł)",
                    content: "W 14 dni od otwarcia: zarejestruj telefon do BLIK, zrób wpływ min. 3000 zł (1500 zł dla osób <26 lat) i zrób 5 płatności telefonem w sklepach."
                },
                {
                    title: "Główna premia (500 zł)",
                    content: "Przez 5 kolejnych miesięcy: utrzymuj BLIK, wpływy 3000 zł (lub 1500 zł) i płać kartą/telefonem min. 1000 zł miesięcznie w sklepach stacjonarnych."
                }
            ],
            details: `<strong>Kto może wziąć udział?</strong> Osoby bez rachunku w Millennium od 1 stycznia 2022 r. Karta kredytowa nie wyklucza.<br><br><strong>Koszty:</strong> Konto za 0 zł. Karta za 0 zł przy 5 płatnościach kartą/BLIK w miesiącu (dla osób 18-26 lat wystarczy 1 płatność).`
        },
        {
            id: "pkobp",
            bankName: "PKO BP",
            logoUrl: "https://placehold.co/100x100/1e293b/ffffff?text=PKO",
            bannerUrl: "https://placehold.co/800x400/0f172a/ffffff?text=PKO+BP+Promocja",
            reward: "600 zł",
            title: "Zgarnij 600 zł premii gotówkowej za założenie darmowego Konta za Zero!",
            deadline: "2026-06-30T23:59:59",
            limit: "Tylko 7 000 wniosków",
            link: "#",
            steps: [
                {
                    title: "Rejestracja z kodem",
                    content: `Złóż wniosek i koniecznie wpisz kod promocyjny: <span class="inline-flex items-center gap-1 bg-slate-800 px-2 py-1 rounded text-blue-400 font-mono text-sm border border-slate-700 mx-1 cursor-pointer hover:bg-slate-700" onclick="copyToClipboard('PREMIA')">PREMIA <i data-lucide="copy" class="w-3 h-3"></i></span>.`
                },
                {
                    title: "Pierwsza stówa",
                    content: "W pierwszym pełnym miesiącu zrób min. 1 płatność kartą. Dostaniesz 100 zł."
                },
                {
                    title: "Moneyback (Do 500 zł)",
                    content: "Przez 10 miesięcy płać kartą (5% zwrotu, max 50 zł miesięcznie) i loguj się min. 1 raz w miesiącu do aplikacji IKO."
                }
            ],
            details: `<strong>Kto może wziąć udział?</strong> Osoby bez konta w PKO BP od 1 października 2024 do 31 marca 2026 r.<br><br><strong>Koszty:</strong> Prowadzenie konta 0 zł.`
        },
        {
            id: "pocztowy",
            bankName: "Bank Pocztowy",
            logoUrl: "https://placehold.co/100x100/1e293b/ffffff?text=BP",
            bannerUrl: "https://placehold.co/800x400/0f172a/ffffff?text=Bank+Pocztowy",
            reward: "960 zł",
            extraReward: "+ 1000 zł z poleceń",
            title: "Zgarnij aż 960 zł premii w gotówce + do 1000 zł za polecanie znajomych!",
            deadline: "2026-08-31T23:59:59",
            limit: null,
            link: "#",
            steps: [
                {
                    title: "Wniosek i rejestracja",
                    content: "Odblokuj PESEL. Otwórz 'Konto w Porządku', zaakceptuj zgody marketingowe i podpisz umowę."
                },
                {
                    title: "Cashback za zakupy",
                    content: "W każdym z kolejnych miesięcy płać kartą za codzienne zakupy. Bank będzie zwracał Ci część wydatków prosto na konto (aż do kwoty 960 zł w okresie promocji)."
                },
                {
                    title: "Program Poleceń",
                    content: "Polecaj konto znajomym generując link z poziomu aplikacji. Za skutecznie otwarte konta możesz zgarnąć dodatkowe 1000 zł!"
                }
            ],
            details: `<strong>Kto może wziąć udział?</strong> Nowi klienci, nieposiadający konta w Banku Pocztowym.<br><br><strong>Koszty:</strong> Przejrzyste warunki, darmowe konto przy aktywnym korzystaniu.`
        }
    ];

    // Zmienna do zliczania całkowitej puli
    let totalRewardValue = 0;

    // Funkcja do wyciągania liczby ze stringa (np. "800 zł" -> 800)
    function parseReward(str) {
        const num = parseInt(str.replace(/[^0-9]/g, ''));
        return isNaN(num) ? 0 : num;
    }

    // Renderowanie kart ofert
    function renderOffers() {
        const container = document.getElementById('offers-container');
        container.innerHTML = '';

        offersData.forEach((offer, index) => {
            totalRewardValue += parseReward(offer.reward);

            // Tworzenie HTML dla danej oferty
            const cardHTML = `
            <div class="glass-panel rounded-3xl p-6 border border-slate-800 relative overflow-hidden card-hover animate-slide-up" style="animation-delay: ${index * 0.1}s">
                <!-- Tło gradientowe (subtelne) -->
                <div class="absolute top-0 right-0 -mr-20 -mt-20 w-64 h-64 bg-blue-500/10 blur-[80px] rounded-full pointer-events-none"></div>

                <div class="flex flex-col md:flex-row gap-6 relative z-10">
                    <!-- Lewa strona: Logo i Grafik -->
                    <div class="w-full md:w-1/4 flex flex-col items-center gap-4">
                        <div class="w-20 h-20 rounded-2xl bg-white p-2 shadow-xl border border-slate-700/50 flex items-center justify-center overflow-hidden">
                            <img src="${offer.logoUrl}" alt="${offer.bankName}" class="max-w-full max-h-full object-contain" onerror="this.src='https://placehold.co/100x100/1e293b/ffffff?text=Bank'">
                        </div>

                        <div class="text-center w-full">
                            <div class="text-xs text-slate-400 uppercase tracking-wider font-semibold mb-1">Do odebrania</div>
                            <div class="text-3xl font-black text-emerald-400 flex justify-center items-center gap-1">
                                ${offer.reward}
                            </div>
                            ${offer.extraReward ? `<div class="text-sm text-emerald-500/80 font-medium mt-1">${offer.extraReward}</div>` : ''}
                        </div>
                    </div>

                    <!-- Prawa strona: Treść -->
                    <div class="w-full md:w-3/4 flex flex-col justify-between">
                        <div>
                            <div class="flex flex-wrap gap-2 mb-3">
                                <!-- Timer -->
                                <div class="inline-flex items-center gap-1.5 px-2.5 py-1 rounded-md bg-slate-800/80 border border-slate-700 text-xs font-medium text-slate-300">
                                    <i data-lucide="clock" class="w-3.5 h-3.5 text-blue-400"></i>
                                    Koniec: <span class="countdown-timer font-mono text-blue-300" data-deadline="${offer.deadline}">Obliczanie...</span>
                                </div>

                                <!-- Limit (jeśli istnieje) -->
                                ${offer.limit ? `
                                <div class="inline-flex items-center gap-1.5 px-2.5 py-1 rounded-md bg-amber-500/10 border border-amber-500/20 text-xs font-medium text-amber-400">
                                    <div class="w-2 h-2 rounded-full bg-amber-500 animate-pulse-slow"></div>
                                    ${offer.limit}
                                </div>` : ''}
                            </div>

                            <h2 class="text-xl md:text-2xl font-bold text-white mb-4 leading-tight">${offer.title}</h2>

                            <!-- Główny przycisk akcji -->
                            <a href="${offer.link}" target="_blank" rel="noopener noreferrer" class="group flex items-center justify-center gap-2 w-full md:w-auto bg-blue-600 hover:bg-blue-500 text-white font-semibold py-3.5 px-6 rounded-xl transition-all shadow-[0_0_20px_rgba(37,99,235,0.3)] hover:shadow-[0_0_25px_rgba(59,130,246,0.5)]">
                                Otwórz konto z premią
                                <i data-lucide="arrow-right" class="w-5 h-5 group-hover:translate-x-1 transition-transform"></i>
                            </a>
                        </div>
                    </div>
                </div>

                <!-- Sekcja rozwijana: Jak odebrać? -->
                <div class="mt-8 pt-6 border-t border-slate-800">
                    <button class="flex items-center justify-between w-full text-left text-slate-300 hover:text-white transition-colors" onclick="toggleAccordion('acc-${offer.id}', this)">
                        <div class="flex items-center gap-2 font-semibold">
                            <i data-lucide="list-checks" class="w-5 h-5 text-blue-400"></i>
                            Jak odebrać nagrodę? (Krok po kroku)
                        </div>
                        <i data-lucide="chevron-down" class="w-5 h-5 transition-transform duration-300 transform"></i>
                    </button>

                    <div id="acc-${offer.id}" class="accordion-content">
                        <div class="pt-6 pb-2">
                            <!-- Timeline (Kroki) -->
                            <div class="relative pl-6 ml-2 border-l-2 border-slate-800 space-y-8">
                                ${offer.steps.map((step, idx) => `
                                    <div class="relative timeline-dot">
                                        <h4 class="text-sm font-bold text-blue-400 mb-1.5 uppercase tracking-wide">Krok ${idx + 1}: ${step.title}</h4>
                                        <p class="text-slate-400 text-sm leading-relaxed">${step.content}</p>
                                    </div>
                                `).join('')}
                            </div>

                            <!-- Szczegóły dodatkowe -->
                            <div class="mt-8 bg-slate-900/50 border border-slate-800 rounded-xl p-4 text-sm text-slate-400">
                                <div class="flex items-center gap-2 mb-2 text-slate-300 font-semibold">
                                    <i data-lucide="info" class="w-4 h-4"></i> Ważne szczegóły
                                </div>
                                ${offer.details}
                            </div>
                        </div>
                    </div>
                </div>
            </div>
            `;
            container.insertAdjacentHTML('beforeend', cardHTML);
        });

        // Animacja licznika całkowitej kwoty
        animateValue("total-pool", 0, totalRewardValue, 2000);
        animateValue("mobile-total-pool", 0, totalRewardValue, 2000);

        // Re-inicjalizacja ikon dla nowo wyrenderowanych elementów
        lucide.createIcons();

        // Start Timerów
        startTimers();
    }

    // Funkcja rozwijania/zwijania (Accordion)
    window.toggleAccordion = function(id, button) {
        const content = document.getElementById(id);
        const icon = button.querySelector('[data-lucide="chevron-down"]');

        if (content.style.maxHeight && content.style.maxHeight !== '0px') {
            content.style.maxHeight = '0px';
            icon.style.transform = 'rotate(0deg)';
        } else {
            content.style.maxHeight = content.scrollHeight + "px";
            icon.style.transform = 'rotate(180deg)';
            // Aktualizacja maxHeight na wypadek zmiany rozmiaru ekranu lub zawartości
            setTimeout(() => {
                content.style.maxHeight = 'fit-content';
            }, 400);
        }
    }

    // Kopiowanie do schowka z powiadomieniem
    window.copyToClipboard = function(text) {
        try {
            // Nowoczesne API
            navigator.clipboard.writeText(text).then(showToast, fallbackCopyTextToClipboard(text));
        } catch (err) {
            // Fallback dla iFrame / starych przeglądarek
            fallbackCopyTextToClipboard(text);
        }
    }

    function fallbackCopyTextToClipboard(text) {
        var textArea = document.createElement("textarea");
        textArea.value = text;
        textArea.style.top = "0";
        textArea.style.left = "0";
        textArea.style.position = "fixed";
        document.body.appendChild(textArea);
        textArea.focus();
        textArea.select();
        try {
            document.execCommand('copy');
            showToast();
        } catch (err) {
            console.error('Błąd kopiowania', err);
        }
        document.body.removeChild(textArea);
    }

    function showToast() {
        const toast = document.getElementById('toast');
        toast.classList.add('show');
        setTimeout(() => {
            toast.classList.remove('show');
        }, 3000);
    }

    // Animacja licznika (np. od 0 do 8500)
    function animateValue(id, start, end, duration) {
        if (start === end) return;
        const obj = document.getElementById(id);
        let startTimestamp = null;
        const step = (timestamp) => {
            if (!startTimestamp) startTimestamp = timestamp;
            const progress = Math.min((timestamp - startTimestamp) / duration, 1);
            // Ease out
            const easeProgress = 1 - Math.pow(1 - progress, 3);
            obj.innerHTML = Math.floor(easeProgress * (end - start) + start).toLocaleString('pl-PL');
            if (progress < 1) {
                window.requestAnimationFrame(step);
            }
        };
        window.requestAnimationFrame(step);
    }

    // Logika odliczania czasu
    function startTimers() {
        const timerElements = document.querySelectorAll('.countdown-timer');

        function updateTimers() {
            const now = new Date().getTime();

            timerElements.forEach(el => {
                const deadlineStr = el.getAttribute('data-deadline');
                const deadline = new Date(deadlineStr).getTime();
                const distance = deadline - now;

                if (distance < 0) {
                    el.innerHTML = "Zakończona";
                    el.classList.remove('text-blue-300');
                    el.classList.add('text-red-400');
                    return;
                }

                const days = Math.floor(distance / (1000 * 60 * 60 * 24));
                const hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));

                if (days > 30) {
                    el.innerHTML = `${days} dni`;
                } else if (days > 0) {
                    el.innerHTML = `${days}d ${hours}h`;
                    el.classList.remove('text-blue-300');
                    el.classList.add('text-amber-400');
                } else {
                    const minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
                    el.innerHTML = `${hours}h ${minutes}m`;
                    el.classList.remove('text-blue-300');
                    el.classList.add('text-red-400', 'animate-pulse');
                }
            });
        }

        updateTimers(); // Pierwsze wywołanie
        setInterval(updateTimers, 60000); // Aktualizacja co minutę (nie potrzebujemy sekund dla tak długich dat)
    }

    // Inicjalizacja aplikacji po załadowaniu DOM
    document.addEventListener('DOMContentLoaded', () => {
        renderOffers();
    });

</script>

Przewijanie do góry