Blog O nas Kontakt
Content Pensatore

Jak przygotować treści na nową stronę internetową — praktyczny poradnik dla Bisztynek

Wielu przedsiębiorców z Bisztynka, tworząc nową stronę, zapomina o kluczowej roli treści. Zamiast budować widoczność, popełniają błędy. Odkryj, jak efektywnie przygotować teksty SEO i content na stronę, by Twoja firma zyskała przewagę w sieci.

Wielu właścicieli firm, decydując się na nową stronę internetową, skupia się głównie na jej wyglądzie i funkcjonalności, traktując **content na stronę** jako dodatek, który można "uzupełnić później". Rezultatem są często pośpiesznie napisane, generyczne opisy, które nie angażują, nie informują i co najważniejsze – nie są widoczne w wyszukiwarkach. Takie podejście, choć popularne wśród wielu firm usługowych, także w Bisztynku, to zmarnowana szansa na pozyskanie klientów i budowanie silnej marki w sieci.

Brak strategicznego planowania treści od samego początku sprawia, że nawet najpiękniejsza strona pozostaje niewidzialna dla potencjalnych klientów. W efekcie, firmy tracą cenną przewagę konkurencyjną i zmuszone są polegać wyłącznie na tradycyjnych kanałach pozyskiwania. Ten poradnik ma na celu pokazanie, jak unikać tego błędu i świadomie tworzyć **teksty SEO** oraz **content na stronę**, aby budować skuteczną obecność online od podstaw.

Sytuacja firm usługowych w Bisztynek

Wielu lokalnych przedsiębiorców w Bisztynku przez lata budowało swoją markę i bazę klientów głównie na rekomendacjach, poleceniach ustnych i bezpośrednim kontakcie. To sprawdzone metody, które wciąż mają swoją wartość. Jednak współczesny klient, niezależnie od wielkości miejscowości, coraz częściej rozpoczyna poszukiwanie usług od wyszukiwarki internetowej. Niezależnie od tego, czy szuka mechanika, fryzjera, restauracji czy usług budowlanych, pierwszym krokiem jest często wpisanie zapytania w Google. Jeśli Twoja firma nie pojawia się w wynikach wyszukiwania, stajesz się niewidzialny dla tej rosnącej grupy potencjalnych klientów.

Dla firm w Bisztynku oznacza to konieczność adaptacji. Posiadanie strony internetowej to już standard, ale posiadanie strony, która pracuje na Twój sukces – to klucz do rozwoju. Samo istnienie w sieci to za mało. Strona musi być znaleziona, a następnie przekonać odwiedzającego do podjęcia działania. To właśnie tutaj strategicznie zaplanowane i optymalizowane **teksty SEO** oraz angażujący **content na stronę** odgrywają fundamentalną rolę. Bez nich, nawet w mniejszej miejscowości, trudno o skuteczne dotarcie do nowych klientów i utrzymanie konkurencyjności w obliczu cyfryzacji.

Decyzje strategiczne przed startem

Zanim zaczniesz pisać choćby jedno słowo, kluczowe jest podjęcie kilku strategicznych decyzji. To one ukształtują cały proces tworzenia treści i zadecydują o skuteczności Twojej nowej strony. Brak tego etapu to prosta droga do tworzenia treści "dla sztuki", a nie dla realnych wyników biznesowych.

  • Określenie celów strony: Co ma osiągnąć Twoja strona? Czy ma generować zapytania ofertowe, sprzedawać produkty, budować bazę subskrybentów, a może edukować klientów? Jasne cele pozwolą precyzyjnie dobrać rodzaj i charakter **contentu na stronę**.
  • Identyfikacja grupy docelowej w Bisztynku: Kto jest Twoim idealnym klientem? Jakie ma potrzeby, problemy, pytania? Gdzie mieszka (w Bisztynku, okolicach)? Jakiego języka używa? Im lepiej poznasz swojego klienta, tym łatwiej będzie stworzyć **teksty SEO**, które do niego trafią.
  • Analiza konkurencji: Jakie treści tworzą Twoi konkurenci? Co robią dobrze, a co można poprawić? Gdzie są luki w ich komunikacji, które możesz wypełnić? Analiza ta pozwoli wyróżnić się i znaleźć swoją unikalną niszę.
  • Badanie słów kluczowych: To podstawa SEO. Jakich fraz używają potencjalni klienci, szukając Twoich usług lub produktów? Skup się na frazach lokalnych (np. "hydraulik Bisztynek", "salon kosmetyczny Bisztynek"), ale także na tych bardziej ogólnych, które mogą prowadzić do Twojej firmy. Odpowiednie **teksty SEO** muszą zawierać te słowa kluczowe w naturalny sposób.
  • Struktura strony i mapa treści: Zanim zaczniesz pisać, zaplanuj, jakie strony będą potrzebne (strona główna, oferta, o nas, kontakt, blog) i jakie treści znajdą się na każdej z nich. Stworzenie mapy treści pozwoli na spójne i logiczne ułożenie całego **contentu na stronę**.

Proces krok po kroku

Po podjęciu kluczowych decyzji strategicznych, możesz przejść do praktycznego etapu tworzenia treści. To proces iteracyjny, który wymaga uwagi i optymalizacji na każdym etaku.

  1. Audyt i analiza (jeśli strona już istniała):
    • Przejrzyj istniejące treści pod kątem aktualności, jakości i skuteczności SEO.
    • Zidentyfikuj luki informacyjne i obszary wymagające poprawy lub rozbudowy.
    • Sprawdź, które strony generują ruch, a które wymagają całkowitej przebudowy.
  2. Planowanie i strategia treści:
    • Na podstawie badania słów kluczowych, przypisz konkretne frazy do poszczególnych stron.
    • Stwórz konspekty dla każdej podstrony (tytuły, nagłówki, kluczowe punkty, CTA).
    • Określ, jaki rodzaj **contentu na stronę** będzie najlepszy dla danej sekcji (tekst, lista, FAQ, grafika).
  3. Tworzenie treści:
    • Pisanie z myślą o użytkowniku: językiem zrozumiałym dla Twojej grupy docelowej, bez zbędnego żargonu.
    • Naturalne wplatanie słów kluczowych: **teksty SEO** powinny być czytelne i angażujące, a frazy kluczowe powinny pojawiać się w sposób, który nie zaburza płynności tekstu.
    • Wartościowa i unikalna treść: unikaj kopiowania, dostarczaj realną wartość, rozwiązuj problemy potencjalnych klientów.
    • Długość treści: zależy od tematu i celu strony, ale zazwyczaj dłuższe, merytoryczne artykuły są lepiej oceniane przez wyszukiwarki.
    • Używaj krótkich akapitów, list, pogrubień, aby ułatwić skanowanie tekstu.
  4. Optymalizacja pod kątem SEO i UX:
    • Tytuły stron (</code>) i meta opisy (<code><meta description></code>):</strong> Każda strona powinna mieć unikalny, angażujący tytuł i opis, zawierający frazy kluczowe, które zachęcą do kliknięcia w wynikach wyszukiwania.</li> <li><strong>Nagłówki (<code><h2></code>, <code><h3></code>):</strong> Używaj ich do strukturyzacji treści i umieszczaj w nich słowa kluczowe.</li> <li><strong>Atrybuty <code>alt</code> dla obrazków:</strong> Opisuj grafiki, używając fraz kluczowych, co pomaga w indeksowaniu obrazów i poprawia dostępność.</li> <li><strong>Linkowanie wewnętrzne:</strong> Łącz ze sobą powiązane treści na stronie, co ułatwia nawigację i rozprowadza "moc" SEO.</li> <li><strong>Szybkość ładowania i responsywność:</strong> Upewnij się, że strona szybko się ładuje i jest w pełni funkcjonalna na urządzeniach mobilnych, co ma bezpośredni wpływ na UX i SEO.</li> </ul> </li> <li> <strong>Publikacja i monitoring:</strong> <ul> <li>Po opublikowaniu treści, regularnie monitoruj jej wyniki w narzędziach analitycznych (np. Google Analytics, Google Search Console).</li> <li>Sprawdzaj, które **teksty SEO** generują ruch, które słowa kluczowe są najskuteczniejsze, i gdzie użytkownicy spędzają najwięcej czasu.</li> <li>Na podstawie danych, wprowadzaj regularne aktualizacje i optymalizacje, aby **content na stronę** zawsze był aktualny i efektywny.</li> </ul> </li> </ol> <h2>Treści i UX pod lokalne wyszukiwania</h2> <p>Dla firm w Bisztynku, kluczowe jest, aby **content na stronę** był zoptymalizowany pod kątem lokalnych wyszukiwań. To odróżnia lokalne SEO od ogólnego i pozwala skutecznie dotrzeć do klientów z najbliższego otoczenia.</p> <ul> <li><strong>Wspominanie nazwy miejscowości:</strong> Naturalnie wplataj nazwę Bisztynek w nagłówki, akapity, opisy usług i dane kontaktowe. Przykładowo: "Najlepsze usługi hydrauliczne w Bisztynku", "Fryzjer damski i męski w Bisztynku". Unikaj jednak nadmiernego upychania, aby teksty pozostały czytelne.</li> <li><strong>Lokalne słowa kluczowe:</strong> Skup się na frazach typu "usługi [nazwa usługi] Bisztynek", "[produkt] Bisztynek cena", "sklep [branża] Bisztynek". Te specyficzne zapytania generują zazwyczaj bardzo wartościowy ruch.</li> <li><strong>Strony usługowe i produktowe:</strong> Dla każdej oferowanej usługi lub produktu stwórz osobną podstronę, na której szczegółowo ją opiszesz, używając lokalnych fraz. Pamiętaj, że każdy z tych tekstów to osobny **content na stronę**, który może być znaleziony przez wyszukiwarki.</li> <li><strong>Lokalne referencje i studia przypadków:</strong> Jeśli to możliwe, przedstaw ogólne, anonimowe historie sukcesu klientów z regionu. Pokaż, jak Twoja firma rozwiązała problem typowy dla mieszkańców Bisztynka.</li> <li><strong>Dane kontaktowe i mapa:</strong> Upewnij się, że adres, numer telefonu i godziny otwarcia są wyraźnie widoczne na każdej stronie i spójne z tymi w Google Moja Firma. Osadź interaktywną mapę dojazdu.</li> <li><strong>Optymalizacja Google Moja Firma:</strong> Choć nie jest to bezpośrednio **content na stronę**, jest to niezbędny element lokalnego SEO. Upewnij się, że Twój profil GMF jest kompletny, aktualny i zawiera te same informacje, co Twoja strona. Regularnie dodawaj wpisy i odpowiadaj na opinie.</li> <li><strong>User Experience (UX):</strong> Strona musi być intuicyjna i łatwa w obsłudze. Szybkie ładowanie, czytelna czcionka, prosta nawigacja i responsywność na urządzeniach mobilnych to podstawa. Jeśli użytkownik szybko opuści stronę, bo jest nieczytelna lub wolna, nawet najlepsze **teksty SEO** nie przyniosą rezultatów.</li> </ul> <h2>Integracje: CRM, analityka, reklamy</h2> <p>Skuteczny **content na stronę** nie działa w oderwaniu od innych narzędzi marketingowych i systemów biznesowych. Jego efektywność wzrasta, gdy jest zintegrowany z innymi elementami cyfrowego ekosystemu Twojej firmy.</p> <ul> <li><strong>CRM (Customer Relationship Management):</strong> Twój **content na stronę** powinien wspierać proces pozyskiwania i zarządzania klientami. Formularze kontaktowe, zapisy na newslettery, prośby o wycenę – to wszystko elementy, które zbierają dane o potencjalnych klientach i przesyłają je bezpośrednio do systemu CRM. Dzięki temu możesz śledzić, skąd pochodzą Twoi klienci z Bisztynka i jakich treści szukają.</li> <li><strong>Narzędzia analityczne (Google Analytics, Google Search Console):</strong> To Twoje oczy i uszy w świecie online. Pozwalają monitorować, jak użytkownicy wchodzą w interakcję z Twoimi treściami. Możesz sprawdzić, które **teksty SEO** generują najwięcej ruchu, ile czasu użytkownicy spędzają na poszczególnych stronach, które słowa kluczowe prowadzą do Twojej witryny, oraz jakie są ścieżki konwersji. Te dane są nieocenione do optymalizacji istniejącego **contentu na stronę** i planowania nowych treści.</li> <li><strong>Kampanie reklamowe (Google Ads, media społecznościowe):</strong> Strony docelowe (landing pages) dla płatnych kampanii muszą być ściśle zintegrowane z treścią reklam. Jeśli reklama obiecuje konkretną ofertę lub rozwiązanie problemu, strona docelowa musi to potwierdzić i rozwinąć. Spójność między reklamą a **contentem na stronie** docelowej zwiększa wskaźniki konwersji i obniża koszty reklam. Analiza, które **teksty SEO** na stronach docelowych działają najlepiej, pozwoli optymalizować budżet reklamowy.</li> <li><strong>Narzędzia do automatyzacji marketingu:</strong> Dzięki nim możesz personalizować komunikację z klientami na podstawie ich interakcji z Twoim **contentem na stronę**. Przykładowo, jeśli ktoś odwiedził konkretną stronę usługową, możesz wysłać mu automatyczną wiadomość e-mail z dodatkowymi informacjami.</li> </ul> <p>Integracja tych elementów sprawia, że **content na stronę** przestaje być tylko "tekstem", a staje się aktywnym narzędziem biznesowym, które współpracuje z innymi systemami, aby maksymalizować Twoje wyniki. Daje to firmom z Bisztynka narzędzia do sprawnego zarządzania relacjami z klientami i optymalizacji działań marketingowych.</p> <h2>FAQ — najczęstsze pytania</h2> <h3>Jak często aktualizować treści na stronie?</h3> <p>Częstotliwość aktualizacji zależy od branży i rodzaju treści. Artykuły blogowe i aktualności mogą być dodawane regularnie (np. raz w tygodniu, raz w miesiącu). Strony usługowe i produktowe powinny być aktualizowane, gdy zmienia się oferta, ceny lub pojawiają się nowe informacje. Ogólnie, warto przeglądać cały **content na stronę** co najmniej raz do roku, aby upewnić się, że jest aktualny, dokładny i nadal dobrze zoptymalizowany pod **teksty SEO** dla lokalnych klientów z Bisztynka.</p> <h3>Czy warto inwestować w długie artykuły blogowe?</h3> <p>Tak, długie, merytoryczne artykuły (powyżej 1000 słów) często są bardzo wartościowe. Pozwalają na dogłębne omówienie tematu, budują autorytet eksperta w danej dziedzinie i mogą przyciągać ruch z wielu różnych słów kluczowych. Dłuższy **content na stronę** daje również wyszukiwarkom więcej kontekstu do zrozumienia tematu, co sprzyja lepszemu pozycjonowaniu. Ważne, aby były one dobrze ustrukturyzowane i łatwe do czytania.</p> <h3>Jakie narzędzia pomagają w tworzeniu treści SEO?</h3> <p>Istnieje wiele narzędzi, które ułatwiają tworzenie i optymalizację **tekstów SEO**. Do badania słów kluczowych przydadzą się Google Keyword Planner, Senuto czy Semrush. Do analizy konkurencji i monitorowania pozycji możesz wykorzystać Ahrefs lub Surfer SEO. Google Search Console i Google Analytics to podstawy do monitorowania ruchu i zachowań użytkowników. Warto również korzystać z edytorów tekstu z wbudowanymi sprawdzaniem gramatyki i ortografii, aby zapewnić wysoką jakość językową **contentu na stronę**.</p> </div> </div> </section> <section class="w-full bg-zinc-900 py-16 md:py-20"> <div class="max-w-5xl mx-auto px-6 text-center reveal-element"> <h2 class="font-heading text-3xl md:text-4xl text-white mb-4">Potrzebujesz wsparcia w przygotowaniu treści?</h2> <p class="text-zinc-300 text-base leading-relaxed max-w-2xl mx-auto mb-8">Skuteczne teksty SEO i content na stronę to podstawa widoczności. Pomożemy Ci wyróżnić się w Bisztynku.</p> <a href="/wycena/" class="inline-flex items-center justify-center gap-2 bg-rose-500 hover:bg-rose-600 text-white font-medium px-7 py-3.5 rounded-full transition-all hover:scale-105 active:scale-95"> Umów bezpłatną wycenę <svg aria-hidden="true" focusable="false" class="w-4 h-4" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"> <path d="M5 12h14m-7-7l7 7-7 7"></path> </svg> </a> </div> </section> </article> </main> <style> .reveal-element { opacity: 0; transform: translateY(20px); transition: opacity 0.7s cubic-bezier(0.16, 1, 0.3, 1), transform 0.7s cubic-bezier(0.16, 1, 0.3, 1); } .reveal-element.is-visible { opacity: 1; transform: translateY(0); } </style> <style> .blog-content { font-size: 1.0625rem; line-height: 1.75; color: #52525b; } .blog-content > *:first-child { margin-top: 0; } .blog-content h2 { font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; font-size: clamp(1.5rem, 4vw, 1.875rem); font-weight: 600; line-height: 1.25; letter-spacing: -0.02em; color: #18181b; margin-top: 2.5rem; margin-bottom: 0.75rem; } .blog-content h3 { font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; font-size: 1.25rem; font-weight: 600; line-height: 1.35; color: #18181b; margin-top: 1.75rem; margin-bottom: 0.5rem; } .blog-content h4 { font-size: 1.125rem; font-weight: 600; color: #18181b; margin-top: 1.5rem; margin-bottom: 0.5rem; } .blog-content p { margin-bottom: 1.25em; line-height: 1.75; color: #52525b; } .blog-content ul, .blog-content ol { margin: 1rem 0 1.5rem; padding-left: 1.5rem; color: #52525b; } .blog-content ul { list-style-type: disc; } .blog-content ol { list-style-type: decimal; } .blog-content li { margin-bottom: 0.5em; line-height: 1.7; } .blog-content li::marker { color: #f43f5e; } .blog-content a { color: #f43f5e; text-decoration: underline; } .blog-content a:hover { color: #e11d48; } .blog-content strong { color: #18181b; font-weight: 600; } .blog-content blockquote { border-left: 4px solid #f43f5e; padding-left: 1rem; margin: 1.5rem 0; color: #71717a; font-style: italic; } </style> <script> document.addEventListener('DOMContentLoaded', function () { var elements = document.querySelectorAll('.reveal-element'); if (!elements.length) return; var observer = new IntersectionObserver(function (entries) { entries.forEach(function (entry) { if (entry.isIntersecting) { entry.target.classList.add('is-visible'); observer.unobserve(entry.target); } }); }, { threshold: 0.1, rootMargin: '0px 0px -40px 0px' }); elements.forEach(function (el) { observer.observe(el); }); }); </script> </div> <section id="kontakt" class="w-full bg-zinc-900"> <div class="max-w-7xl mx-auto px-6 py-20 lg:py-28"> <div class="grid lg:grid-cols-12 gap-12 lg:gap-16 items-start"> <div class="lg:col-span-5 reveal-element" style="opacity: 1; transform: translateY(0px); transition: opacity 0.7s cubic-bezier(0.16, 1, 0.3, 1), transform 0.7s cubic-bezier(0.16, 1, 0.3, 1);"> <p class="text-rose-400 text-sm font-medium tracking-widest uppercase mb-3">Napisz do nas</p> <h2 class="font-heading text-3xl md:text-4xl lg:text-5xl text-white mb-6"> <span>Zbudujmy Ci biznes, który</span> <span class="italic text-rose-400">zarabia</span> </h2> <p class="text-zinc-400 text-base leading-relaxed mb-10">Opowiedz nam o swoim projekcie. Pierwsza konsultacja jest bezpłatna — sprawdzimy co możemy dla Ciebie zrobić i ile to kosztuje.</p> <div class="space-y-6"> <div class="flex items-center gap-4"> <div class="w-10 h-10 bg-zinc-800 rounded-xl flex items-center justify-center border border-zinc-700"> <svg aria-hidden="true" focusable="false" class="w-5 h-5 text-rose-400" fill="none" stroke="currentColor" stroke-width="1.5" viewbox="0 0 24 24"> <path d="M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75"> </path> </svg> </div> <span class="text-zinc-300 text-sm">biuro@pensatore.pl</span> </div> <div class="flex items-center gap-4"> <div class="w-10 h-10 bg-zinc-800 rounded-xl flex items-center justify-center border border-zinc-700"> <svg aria-hidden="true" focusable="false" class="w-5 h-5 text-rose-400" fill="none" stroke="currentColor" stroke-width="1.5" viewbox="0 0 24 24"> <path d="M2.25 6.75c0 8.284 6.716 15 15 15h2.25a2.25 2.25 0 002.25-2.25v-1.372c0-.516-.351-.966-.852-1.091l-4.423-1.106c-.44-.11-.902.055-1.173.417l-.97 1.293c-.282.376-.769.542-1.21.38a12.035 12.035 0 01-7.143-7.143c-.162-.441.004-.928.38-1.21l1.293-.97c.363-.271.527-.734.417-1.173L6.963 3.102a1.125 1.125 0 00-1.091-.852H4.5A2.25 2.25 0 002.25 4.5v2.25z"> </path> </svg> </div> <a href="tel:+48787112730" class="text-zinc-300 text-sm hover:text-white transition-colors">+48 787 112 730</a> </div> </div> <div class="mt-10 pt-10 border-t border-zinc-800"> <p class="text-zinc-500 text-xs uppercase tracking-wider mb-4">Nasze usługi</p> <div class="flex flex-wrap gap-2"> <a href="/zaistniej-online/" class="text-xs bg-zinc-800 text-zinc-400 px-3 py-1.5 rounded-full border border-zinc-700 hover:text-zinc-200 hover:border-zinc-500 transition-colors">Zaistniej online</a> <a href="/sprzedawaj-online/" class="text-xs bg-zinc-800 text-zinc-400 px-3 py-1.5 rounded-full border border-zinc-700 hover:text-zinc-200 hover:border-zinc-500 transition-colors">Sprzedawaj online</a> <a href="/badz-widoczny/" class="text-xs bg-zinc-800 text-zinc-400 px-3 py-1.5 rounded-full border border-zinc-700 hover:text-zinc-200 hover:border-zinc-500 transition-colors">Bądź widoczny</a> <a href="/pokaz-sie-z-ekranu/" class="text-xs bg-zinc-800 text-zinc-400 px-3 py-1.5 rounded-full border border-zinc-700 hover:text-zinc-200 hover:border-zinc-500 transition-colors">Pokaż się z ekranu</a> </div> </div> </div> <div class="lg:col-span-7 reveal-element"> <div class="bg-zinc-800/50 rounded-2xl p-8 lg:p-10 border border-zinc-700/50 backdrop-blur-sm"> <form class="space-y-5 contact-form" method="post" action="/kontakt/wyslij/" data-contact-form> <input type="hidden" name="csrfmiddlewaretoken" value="MEtOtBkuX2qaDe2PfpkF1jrhA4eMcTez4imUKxxEhMxaCzwiZ5QvDzxsudOudY7L"> <input type="hidden" name="source" value="footer" /> <div class="grid sm:grid-cols-2 gap-5"> <div> <label class="text-zinc-400 text-sm mb-2 block">Imię i nazwisko</label> <input type="text" name="name" required class="w-full bg-zinc-900/50 border border-zinc-700 rounded-xl px-4 py-3 text-white text-sm placeholder-zinc-600 focus:outline-none focus:border-rose-500/50 focus:ring-1 focus:ring-rose-500/20 transition-colors" placeholder="Jan Kowalski" /> </div> <div> <label class="text-zinc-400 text-sm mb-2 block">E-mail</label> <input type="email" name="email" required class="w-full bg-zinc-900/50 border border-zinc-700 rounded-xl px-4 py-3 text-white text-sm placeholder-zinc-600 focus:outline-none focus:border-rose-500/50 focus:ring-1 focus:ring-rose-500/20 transition-colors" placeholder="jan@firma.pl" /> </div> </div> <div> <label class="text-zinc-400 text-sm mb-2 block">Temat</label> <input type="text" name="subject" required class="w-full bg-zinc-900/50 border border-zinc-700 rounded-xl px-4 py-3 text-white text-sm placeholder-zinc-600 focus:outline-none focus:border-rose-500/50 focus:ring-1 focus:ring-rose-500/20 transition-colors" placeholder="Np. Wycena strony internetowej" /> </div> <div> <label class="text-zinc-400 text-sm mb-2 block">Opisz swój projekt</label> <textarea rows="4" name="message" required class="w-full bg-zinc-900/50 border border-zinc-700 rounded-xl px-4 py-3 text-white text-sm placeholder-zinc-600 focus:outline-none focus:border-rose-500/50 focus:ring-1 focus:ring-rose-500/20 transition-colors resize-none" placeholder="Opowiedz nam o swoich potrzebach..."></textarea> </div> <button type="submit" class="w-full bg-rose-500 hover:bg-rose-600 text-white font-medium px-7 py-3.5 rounded-full transition-all hover:scale-[1.02] active:scale-[0.98] shadow-lg shadow-rose-500/20">Wyślij zapytanie</button> <p class="text-zinc-500 text-xs text-center" data-contact-status>Odpowiadamy w ciągu 24 godzin. Konsultacja jest bezpłatna.</p> </form> </div> </div> </div> </div> </section> <footer class="w-full bg-zinc-950"> <div class="max-w-7xl mx-auto px-6 py-12"> <div class="flex flex-col lg:flex-row items-start lg:items-center justify-between gap-8 pb-10 border-b border-zinc-800"> <div class="flex items-center gap-2.5"> <span class="font-heading text-lg text-white tracking-tight">pensatore</span> </div> <div class="flex flex-wrap gap-6"><a href="/zaistniej-online/" class="text-sm text-zinc-500 hover:text-zinc-300 transition-colors">Zaistniej online</a><a href="/sprzedawaj-online/" class="text-sm text-zinc-500 hover:text-zinc-300 transition-colors">Sprzedawaj online</a><a href="/badz-widoczny/" class="text-sm text-zinc-500 hover:text-zinc-300 transition-colors">Bądź widoczny</a><a href="/pokaz-sie-z-ekranu/" class="text-sm text-zinc-500 hover:text-zinc-300 transition-colors">Pokaż się z ekranu</a></div> </div> <div class="flex flex-col md:flex-row items-center justify-between gap-4 pt-8"> <p class="text-xs text-zinc-500">© 2026 Pensatore House. Wszelkie prawa zastrzeżone.</p> <p class="text-xs text-zinc-500 text-center md:text-right"> Partner strategiczny: <a href="https://kryminalnezagadki.pl/" class="text-zinc-400 hover:text-zinc-200 transition-colors underline underline-offset-2">Kryminalne Zagadki</a> — logiczne śledztwa online po polsku. </p> <div class="flex items-center gap-6"><a href="/polityka-prywatnosci/" class="text-xs text-zinc-500 hover:text-zinc-300 transition-colors">Polityka prywatności</a><a href="/polityka-cookies/" class="text-xs text-zinc-500 hover:text-zinc-300 transition-colors">Cookies</a></div> </div> </div> </footer> <div id="newsletter-popup" class="fixed inset-0 z-[99999] hidden items-center justify-center bg-zinc-950/70 px-6 backdrop-blur-sm"> <div class="relative w-full max-w-md rounded-3xl bg-white p-8 shadow-2xl shadow-zinc-950/20"> <button type="button" data-newsletter-close class="absolute right-4 top-4 rounded-full p-2 text-zinc-400 hover:bg-zinc-100 hover:text-zinc-700" aria-label="Zamknij newsletter"> <svg aria-hidden="true" focusable="false" class="h-5 w-5" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"> <path d="M6 18L18 6M6 6l12 12"></path> </svg> </button> <p class="text-rose-500 text-sm font-medium tracking-widest uppercase mb-3">Newsletter</p> <h2 class="font-heading text-3xl text-zinc-900 mb-4">Zapisz się i potwierdź 10% zniżki</h2> <p class="text-zinc-500 text-sm leading-relaxed mb-6">Dostaniesz praktyczne wskazówki o stronach, reklamie i sprzedaży online. Kod rabatowy wyślemy po potwierdzeniu adresu e-mail.</p> <form method="post" action="/newsletter/zapisz/" data-newsletter-form class="space-y-4"> <input type="hidden" name="csrfmiddlewaretoken" value="MEtOtBkuX2qaDe2PfpkF1jrhA4eMcTez4imUKxxEhMxaCzwiZ5QvDzxsudOudY7L"> <input type="text" name="name" class="w-full rounded-xl border border-zinc-200 px-4 py-3 text-sm focus:border-rose-400 focus:outline-none" placeholder="Imię (opcjonalnie)" /> <input type="email" name="email" required class="w-full rounded-xl border border-zinc-200 px-4 py-3 text-sm focus:border-rose-400 focus:outline-none" placeholder="Twój e-mail" /> <label class="flex items-start gap-3 text-xs leading-relaxed text-zinc-500"> <input type="checkbox" name="marketing_consent" required class="mt-1 h-4 w-4 rounded border-zinc-300 text-rose-500 focus:ring-rose-400" /> <span>Wyrażam zgodę na otrzymywanie od EMPIRE SP. Z O.O. informacji marketingowych i handlowych drogą elektroniczną na podany adres e-mail, w tym newslettera Pensatore. Wiem, że zgodę mogę wycofać w każdej chwili. Szczegóły są w <a href="/polityka-prywatnosci/" class="text-rose-500 hover:text-rose-600">polityce prywatności</a>.</span> </label> <button type="submit" class="w-full rounded-full bg-rose-500 px-6 py-3.5 text-sm font-medium text-white transition-colors hover:bg-rose-600">Wyślij link potwierdzający</button> <p class="text-center text-xs text-zinc-400" data-newsletter-status>Administrator: EMPIRE SP. Z O.O. Zero spamu. Możesz wypisać się w każdej chwili.</p> </form> </div> </div> <script> document.addEventListener('DOMContentLoaded', function () { var contactForm = document.querySelector('[data-contact-form]'); if (contactForm) { contactForm.addEventListener('submit', function (event) { event.preventDefault(); var status = contactForm.querySelector('[data-contact-status]'); var button = contactForm.querySelector('button[type="submit"]'); if (status) status.textContent = 'Wysyłamy wiadomość...'; if (button) button.disabled = true; fetch(contactForm.action, { method: 'POST', body: new FormData(contactForm), headers: { 'X-Requested-With': 'XMLHttpRequest' } }) .then(function (response) { return response.json().then(function (data) { return { ok: response.ok, data: data }; }); }) .then(function (result) { if (status) status.textContent = result.data.message || (result.ok ? 'Wysłano.' : 'Nie udało się wysłać.'); if (result.ok) { contactForm.reset(); var sourceInput = contactForm.querySelector('input[name="source"]'); if (window.pensatoreTrackFormSubmit) { window.pensatoreTrackFormSubmit({ form_name: 'contact', form_id: 'contact-form-footer', form_source: sourceInput ? sourceInput.value : 'footer', }); } } }) .catch(function () { if (status) status.textContent = 'Nie udało się wysłać wiadomości. Spróbuj ponownie albo napisz e-mail.'; }) .finally(function () { if (button) button.disabled = false; }); }); } var popup = document.getElementById('newsletter-popup'); var newsletterForm = document.querySelector('[data-newsletter-form]'); var closeButtons = document.querySelectorAll('[data-newsletter-close]'); var storageKey = 'pensatore_newsletter_popup_closed'; function closeNewsletterPopup() { if (!popup) return; popup.classList.add('hidden'); popup.classList.remove('flex'); localStorage.setItem(storageKey, '1'); } var cookieConsentKey = 'pensatore_cookie_consent'; function hasCookieDecision() { var value = localStorage.getItem(cookieConsentKey); return value === 'accepted' || value === 'necessary'; } function scheduleNewsletterPopup() { if (!popup || localStorage.getItem(storageKey) === '1') return; if (!hasCookieDecision()) return; window.setTimeout(function () { if (!popup || localStorage.getItem(storageKey) === '1') return; if (!hasCookieDecision()) return; popup.classList.remove('hidden'); popup.classList.add('flex'); }, 2500); } if (hasCookieDecision()) { scheduleNewsletterPopup(); } document.addEventListener('pensatore:cookie-consent', function () { if (localStorage.getItem(storageKey) !== '1') { scheduleNewsletterPopup(); } }); closeButtons.forEach(function (button) { button.addEventListener('click', closeNewsletterPopup); }); if (popup) { popup.addEventListener('click', function (event) { if (event.target === popup) closeNewsletterPopup(); }); } if (newsletterForm) { newsletterForm.addEventListener('submit', function (event) { event.preventDefault(); var status = newsletterForm.querySelector('[data-newsletter-status]'); var button = newsletterForm.querySelector('button[type="submit"]'); if (status) status.textContent = 'Wysyłamy link potwierdzający...'; if (button) button.disabled = true; fetch(newsletterForm.action, { method: 'POST', body: new FormData(newsletterForm), headers: { 'X-Requested-With': 'XMLHttpRequest' } }) .then(function (response) { var contentType = response.headers.get('content-type') || ''; if (contentType.indexOf('application/json') === -1) { throw new Error('HTTP ' + response.status); } return response.json().then(function (data) { return { ok: response.ok, data: data }; }); }) .then(function (result) { if (status) status.textContent = result.data.message || 'Sprawdź skrzynkę i potwierdź zapis.'; if (result.ok) { localStorage.setItem(storageKey, '1'); newsletterForm.reset(); } }) .catch(function (error) { if (status) status.textContent = 'Nie udało się zapisać. Błąd serwera: ' + error.message + '.'; }) .finally(function () { if (button) button.disabled = false; }); }); } }); </script> <script> (() => { if (window.PensatoreVueSPA) return; window.PensatoreVueSPA = true; const parser = new DOMParser(); const ignoredExtensions = /\.(pdf|zip|rar|7z|jpg|jpeg|png|gif|webp|svg|mp4|webm|doc|docx|xls|xlsx)$/i; let spaApp = null; function getParts(root) { return { view: root.querySelector("#spa-view"), }; } function shouldHandleLink(link, event) { if (!link || event.defaultPrevented) return false; if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return false; if (link.target && link.target !== "_self") return false; if (link.hasAttribute("download")) return false; if (link.dataset.noSpa !== undefined) return false; if (link.getAttribute("href").startsWith("#")) return false; const url = new URL(link.href, window.location.href); if (url.origin !== window.location.origin) return false; if (url.protocol !== "http:" && url.protocol !== "https:") return false; if (url.pathname.startsWith("/admin/") || url.pathname.startsWith("/django-admin/")) return false; if (ignoredExtensions.test(url.pathname)) return false; if (url.pathname === window.location.pathname && url.search === window.location.search) return false; return true; } function syncHead(nextDocument) { document.title = nextDocument.title; const selectors = [ 'meta[name="description"]', 'meta[name="keywords"]', 'meta[name="robots"]', 'link[rel="canonical"]', 'meta[property^="og:"]', 'meta[name^="twitter:"]', 'script[type="application/ld+json"]', ]; selectors.forEach((selector) => { document.head.querySelectorAll(selector).forEach((node) => node.remove()); nextDocument.head.querySelectorAll(selector).forEach((node) => { document.head.appendChild(node.cloneNode(true)); }); }); } function replacePart(currentNode, nextNode) { if (!nextNode) return; const clone = nextNode.cloneNode(true); if (currentNode) { currentNode.replaceWith(clone); return clone; } return null; } function runScripts(scope) { const readyCallbacks = []; const nativeAddEventListener = document.addEventListener.bind(document); document.addEventListener = function (type, listener, options) { if (type === "DOMContentLoaded" && typeof listener === "function") { readyCallbacks.push(listener); return; } nativeAddEventListener(type, listener, options); }; try { scope.querySelectorAll("script").forEach((oldScript) => { if (oldScript.src && oldScript.src.includes("vue.global")) return; const script = document.createElement("script"); Array.from(oldScript.attributes).forEach((attr) => { script.setAttribute(attr.name, attr.value); }); script.textContent = oldScript.textContent; oldScript.replaceWith(script); }); } finally { document.addEventListener = nativeAddEventListener; } readyCallbacks.forEach((listener) => { listener.call(document, new Event("DOMContentLoaded")); }); } function createMountNode() { const node = document.createElement("div"); node.id = "pensatore-vue-spa"; node.hidden = true; document.body.appendChild(node); return node; } function ensurePreloaderHidden() { const preloader = document.getElementById("preloader"); if (!preloader) return; if (window.PensatorePreloader) { window.PensatorePreloader.hide(); return; } preloader.style.opacity = "0"; preloader.style.display = "none"; } function loadVue() { if (window.Vue) return Promise.resolve(window.Vue); if (window.__vueLoadPromise) return window.__vueLoadPromise; window.__vueLoadPromise = new Promise((resolve, reject) => { const script = document.createElement("script"); script.src = "https://unpkg.com/vue@3/dist/vue.global.prod.js"; script.async = true; script.onload = () => resolve(window.Vue); script.onerror = reject; document.body.appendChild(script); }); return window.__vueLoadPromise; } function mountSpa(Vue) { if (spaApp) return spaApp; spaApp = Vue.createApp({ data() { return { loading: false }; }, methods: { async go(url, pushState = true) { this.loading = true; document.documentElement.classList.add("spa-loading"); window.PensatorePreloader?.show(); try { const response = await fetch(url, { headers: { "X-Requested-With": "fetch", Accept: "text/html" }, credentials: "same-origin", }); if (!response.ok) { window.location.href = url; return; } const html = await response.text(); const nextDocument = parser.parseFromString(html, "text/html"); const currentParts = getParts(document); const nextParts = getParts(nextDocument); if (!nextParts.view) { window.location.href = url; return; } syncHead(nextDocument); const updatedParts = [ replacePart(currentParts.view, nextParts.view), ].filter(Boolean); if (pushState) { history.pushState({ spa: true }, "", url); } updatedParts.forEach((part) => runScripts(part)); ensurePreloaderHidden(); document.querySelector("#mobile-nav .mobile-menu")?.classList.add("hidden"); document.querySelector("#mobile-nav .mobile-menu-toggle")?.setAttribute("aria-expanded", "false"); window.scrollTo({ top: 0, behavior: "auto" }); document.dispatchEvent(new CustomEvent("pensatore:page-loaded")); } catch (error) { window.location.href = url; } finally { this.loading = false; document.documentElement.classList.remove("spa-loading"); } }, }, }).mount(createMountNode()); return spaApp; } document.addEventListener("click", async (event) => { const link = event.target.closest("a[href]"); if (!shouldHandleLink(link, event)) return; event.preventDefault(); try { const Vue = await loadVue(); const spa = mountSpa(Vue); spa.go(link.href); } catch (error) { window.location.href = link.href; } }); window.addEventListener("popstate", () => { window.location.href = window.location.href; }); })(); </script> <script> document.addEventListener('DOMContentLoaded', function () { var reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches; if (reduceMotion) { document.documentElement.classList.add('ph-animate-static'); return; } document.documentElement.classList.add('ph-animate-ready'); var elements = document.querySelectorAll('.reveal-element'); elements.forEach(function (element, index) { element.style.setProperty('--ph-delay', Math.min(index, 4) * 60 + 'ms'); }); var observer = new IntersectionObserver(function (entries) { entries.forEach(function (entry) { if (entry.isIntersecting) { entry.target.classList.add('is-visible'); observer.unobserve(entry.target); } }); }, { threshold: 0.08, rootMargin: '0px 0px -32px 0px' }); elements.forEach(function (element) { observer.observe(element); }); }); </script> </body> </html>