Blog O nas Kontakt
Content Pensatore

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

Wielu przedsiębiorców w Opalenicy, uruchamiając nową stronę, skupia się na aspekcie wizualnym, zapominając o kluczowej roli dobrze przemyślanych treści. Sprawdź, jak uniknąć tego błędu i stworzyć teksty, które faktycznie działają.

Uruchomienie nowej strony internetowej to dla wielu firm w Opalenicy ważny krok. Niestety, dość często zdarza się, że właściciele przedsiębiorstw koncentrują się głównie na wyglądzie witryny, zapominając o tym, co jest jej sercem – treści. Efektem są strony piękne wizualnie, ale ubogie w informacje, nieczytelne dla wyszukiwarek i niezbyt angażujące dla potencjalnych klientów. W efekcie, nawet najlepiej zaprojektowana strona nie realizuje swojego podstawowego zadania: nie przyciąga nowych zapytań i nie buduje wizerunku eksperta. Ten poradnik ma pomóc firmom z Opalenicy przygotować content na stronę w taki sposób, aby od początku pracował na ich sukces, ze szczególnym uwzględnieniem lokalnego kontekstu.

Sytuacja firm usługowych w Opalenica

Lokalny rynek usługowy w Opalenicy, podobnie jak w wielu mniejszych miejscowościach, charakteryzuje się dużą konkurencją i silnymi powiązaniami społecznymi. Klienci często polegają na rekomendacjach, ale coraz częściej swoje poszukiwania zaczynają w internecie. To właśnie tam szukają fryzjera, mechanika, biura rachunkowego czy usług budowlanych. Firmy, które nie mają skutecznej obecności online, tracą znaczną część potencjalnych zapytań. Problem polega na tym, że nawet posiadając stronę, wiele przedsiębiorstw z Opalenicy nie dba o to, by ich teksty SEO były zoptymalizowane pod kątem lokalnych wyszukiwań. Zamiast konkretnych informacji o zakresie usług, godzinach otwarcia czy obszarze działania, często spotyka się ogólnikowe opisy, które nie wyróżniają firmy na tle konkurencji i nie odpowiadają na potrzeby lokalnego odbiorcy.

Brak odpowiedniego contentu na stronę sprawia, że Google ma trudności z przyporządkowaniem witryny do konkretnych zapytań, zwłaszcza tych z frazami lokalnymi. Oznacza to, że firma jest niewidoczna dla mieszkańców Opalenicy, którzy aktywnie szukają jej usług. Skuteczna strategia contentowa powinna uwzględniać specyfikę lokalnego rynku, język, jakim posługują się klienci, oraz ich specyficzne potrzeby. To nie tylko kwestia bycia online, ale bycia online w sposób, który przynosi wymierne korzyści.

Decyzje strategiczne przed startem

Zanim zaczniesz tworzyć jakiekolwiek teksty SEO na nową stronę, musisz podjąć kilka kluczowych decyzji strategicznych. One zdefiniują kierunek i ton Twojego contentu na stronę:

  • Określenie grupy docelowej: Dla kogo jest Twoja strona? Czy są to mieszkańcy Opalenicy, okolicznych wsi, czy może szersze grono odbiorców? Czy są to klienci indywidualni, czy firmy? Zrozumienie ich potrzeb, problemów i języka jest fundamentem. Przykładowo, warsztat samochodowy w Opalenicy może mieć inną grupę docelową niż lokalny deweloper.
  • Analiza konkurencji: Zobacz, co robią Twoi konkurenci, zarówno ci lokalni, jak i ci działający w podobnych miejscowościach. Jakie treści publikują? Jak są zorganizowane ich strony? Gdzie są ich mocne strony, a gdzie można znaleźć luki, które Ty możesz wypełnić swoim contentem na stronę?
  • Cele biznesowe strony: Co strona ma osiągnąć? Czy ma generować zapytania ofertowe, sprzedawać produkty, budować bazę mailingową, a może edukować? Każdy z tych celów wymaga innego podejścia do tworzenia treści. Dla firmy usługowej z Opalenicy celem często będzie bezpośredni kontakt telefoniczny lub wypełnienie formularza.
  • Unikalna propozycja wartości (USP): Co wyróżnia Twoją firmę? Dlaczego klient z Opalenicy powinien wybrać właśnie Ciebie? Czy to doświadczenie, specjalistyczne usługi, lokalny charakter, a może wyjątkowa obsługa? Twoje teksty SEO muszą jasno komunikować tę przewagę.
  • Struktura strony: Zaplanuj, jakie podstrony będą potrzebne (o nas, usługi, kontakt, blog, realizacje). Każda z nich będzie wymagała specyficznych treści, które powinny logicznie się ze sobą łączyć i prowadzić użytkownika przez całą witrynę.

Proces krok po kroku

Tworzenie skutecznych tekstów SEO i contentu na stronę to proces, który wymaga systematyczności i planowania. Oto jak podejść do tego zadania dla Twojej firmy w Opalenicy:

  1. Badanie słów kluczowych: To podstawa. Zidentyfikuj frazy, których Twoi potencjalni klienci używają w wyszukiwarkach. Nie zapomnij o frazach lokalnych, np. „hydraulik Opalenica”, „biuro rachunkowe Opalenica”, „usługi remontowe Opalenica”. Skorzystaj z narzędzi do badania słów kluczowych, aby znaleźć te o odpowiednim potencjale i niskiej konkurencji. Pamiętaj, że liczą się nie tylko popularne frazy, ale także te bardziej szczegółowe, tzw. long-tail keywords.
  2. Planowanie struktury treści: Na podstawie badań słów kluczowych i celów biznesowych stwórz mapę treści. Określ, jakie tematy będą poruszane na poszczególnych podstronach i w artykułach blogowych. Dla każdej podstrony ustal główną frazę kluczową i kilka pobocznych, które zostaną naturalnie wplecione w content na stronę.
  3. Tworzenie person klientów: Wyobraź sobie idealnych klientów. Kim są? Czego szukają? Jakie mają obawy? Tworzenie treści z myślą o konkretnej personie sprawi, że teksty SEO będą bardziej trafne i angażujące, a to z kolei zwiększy szanse na konwersję.
  4. Pisanie treści: Pisz jasno, zwięźle i konkretnie. Unikaj branżowego żargonu, jeśli Twoja grupa docelowa to klienci indywidualni. Skup się na korzyściach dla klienta, a nie tylko na cechach produktu czy usługi. Pamiętaj o naturalnym wplataniu słów kluczowych – nie "upychaj" ich na siłę. Każdy akapit powinien wnosić wartość. Nagłówki

    i

    , listy
      , pogrubienia pomogą w czytelności.
    • Optymalizacja pod kątem SEO: Po napisaniu treści, zadbaj o ich techniczne aspekty SEO. Upewnij się, że:
      • Każda podstrona ma unikalny tytuł (</code>) i meta description, zawierające słowa kluczowe.</li> <li>Nagłówki <code><h1></code> (chociaż w tym artykule nie używamy, to ważne dla strony), <code><h2></code>, <code><h3></code> są logicznie ułożone i zawierają kluczowe frazy.</li> <li>Obrazy mają atrybuty <code>alt</code> z opisem.</li> <li>Istnieją linki wewnętrzne, prowadzące do innych powiązanych podstron na Twojej witrynie.</li> <li>Treść jest wystarczająco długa i wyczerpująca temat.</li> </ul> </li> <li> <strong>Korekta i edycja:</strong> Zawsze dwukrotnie sprawdź teksty pod kątem błędów językowych, stylistycznych i merytorycznych. Poproś inną osobę o przeczytanie – świeże spojrzenie pomoże wyłapać niedociągnięcia. Dobrze napisany <strong>content na stronę</strong> buduje zaufanie i profesjonalizm Twojej firmy w Opalenicy.</li> </ol> <h2>Treści i UX pod lokalne wyszukiwania</h2> <p>Dla firm działających w Opalenicy, lokalne SEO to absolutna podstawa. Oznacza to, że <strong>teksty SEO</strong> muszą być nie tylko zoptymalizowane pod kątem ogólnych fraz, ale przede wszystkim pod kątem tych, które zawierają nazwę miejscowości lub regionu. Oto kluczowe aspekty:</p> <ul> <li> <strong>Wspominaj nazwę Opalenica:</strong> Naturalnie wplataj nazwę miejscowości w treści strony głównej, podstron usługowych, w opisach realizacji czy w artykułach blogowych. Nie rób tego na siłę, ale upewnij się, że Google wie, gdzie działasz. Przykładowo, zamiast "Oferujemy usługi remontowe", napisz "Oferujemy kompleksowe usługi remontowe dla mieszkańców Opalenicy i okolic". </li> <li> <strong>Dane kontaktowe i Google Moja Firma:</strong> Upewnij się, że Twoje dane kontaktowe (adres w Opalenicy, numer telefonu) są łatwo dostępne na każdej podstronie. Co więcej, absolutnie kluczowe jest założenie i optymalizacja profilu Google Moja Firma. To tam klienci z Opalenicy znajdą najważniejsze informacje o Twojej firmie, godziny otwarcia, zdjęcia, opinie i link do Twojej strony. <strong>Content na stronę</strong> powinien być spójny z tym profilem. </li> <li> <strong>Lokalne referencje i realizacje:</strong> Jeśli masz klientów z Opalenicy, poproś ich o referencje. Opisy realizacji, ze zdjęciami i krótkimi historiami projektów wykonanych w Opalenicy, to doskonały sposób na budowanie zaufania i wzmocnienie lokalnego charakteru Twojej firmy. To również świetne miejsce na wplecenie lokalnych słów kluczowych. </li> <li> <strong>Lokalne słowa kluczowe w nagłówkach i treści:</strong> Używaj fraz takich jak "Opalenica hydraulik", "serwis komputerów Opalenica", "gabinet stomatologiczny Opalenica" w nagłówkach <code><h2></code> i <code><h3></code> oraz w akapitach. Pamiętaj o naturalności – treść ma być przede wszystkim dla człowieka, a dopiero potem dla algorytmów. </li> <li> <strong>User Experience (UX) dla lokalnego klienta:</strong> Projektując <strong>content na stronę</strong>, pomyśl o użytkowniku z Opalenicy. Czy łatwo znajdzie to, czego szuka? Czy strona ładuje się szybko na urządzeniach mobilnych? Czy formularz kontaktowy jest prosty w obsłudze? Dobre UX zwiększa szanse na konwersję i poprawia pozycję w wynikach wyszukiwania. </li> <li> <strong>Blog lokalny:</strong> Jeśli prowadzisz bloga, twórz artykuły odpowiadające na pytania i problemy mieszkańców Opalenicy. "Jak przygotować ogród na wiosnę w Opalenicy?", "Gdzie w Opalenicy znajdziesz najlepszy chleb?" (jeśli prowadzisz piekarnię) – takie treści przyciągną lokalny ruch i zbudują Twoją pozycję jako lokalnego eksperta.</li> </ul> <h2>Integracje: CRM, analityka, reklamy</h2> <p>Strona internetowa z dobrze przygotowanym <strong>contentem na stronę</strong> to dopiero początek. Aby w pełni wykorzystać jej potencjał, ważne jest zintegrowanie jej z innymi narzędziami biznesowymi. To zapewni spójność działań i umożliwi mierzenie efektywności.</p> <ul> <li> <strong>System CRM (Customer Relationship Management):</strong> Integracja formularzy kontaktowych na stronie z systemem CRM pozwala automatycznie zbierać dane od potencjalnych klientów. Dzięki temu żadne zapytanie z Opalenicy nie zostanie pominięte, a Ty zyskasz uporządkowaną bazę danych do dalszego kontaktu i budowania relacji. Skuteczne <strong>teksty SEO</strong> zwiększą liczbę wypełnionych formularzy, a CRM pomoże je obsłużyć. </li> <li> <strong>Narzędzia analityczne (np. Google Analytics):</strong> Monitorowanie ruchu na stronie to podstawa. Dzięki analityce dowiesz się, skąd pochodzą Twoi użytkownicy (np. czy są to mieszkańcy Opalenicy), jakie podstrony odwiedzają najczęściej, ile czasu spędzają na stronie i co robią. Te dane są nieocenione do optymalizacji <strong>contentu na stronę</strong> i identyfikacji, które <strong>teksty SEO</strong> działają najlepiej, a które wymagają poprawy. </li> <li> <strong>Platformy reklamowe (np. Google Ads, Facebook Ads):</strong> Dobrze przygotowany <strong>content na stronę</strong> jest fundamentem skutecznych kampanii reklamowych. Landing page stworzony pod konkretną reklamę, zoptymalizowany pod kątem konwersji i zawierający odpowiednie <strong>teksty SEO</strong>, znacznie zwiększy ROI. Możesz precyzyjnie targetować reklamy na mieszkańców Opalenicy, kierując ich do podstron z treścią, która bezpośrednio odpowiada na ich potrzeby. </li> <li> <strong>E-mail marketing:</strong> Zbieranie adresów e-mail poprzez formularze zapisu na newsletter (z atrakcyjnym <strong>contentem na stronę</strong> zachęcającym do subskrypcji) pozwala na budowanie długoterminowych relacji z klientami. Możesz wysyłać im aktualności, promocje czy wartościowe treści, utrzymując zaangażowanie i informując o nowościach w Twojej firmie w Opalenicy.</li> </ul> <p>Integracja tych narzędzi tworzy spójny ekosystem, w którym strona internetowa nie jest tylko cyfrową wizytówką, ale aktywnym narzędziem biznesowym, wspierającym sprzedaż i marketing. Dzięki temu inwestycja w <strong>teksty SEO</strong> i <strong>content na stronę</strong> przekłada się na realne wyniki dla Twojej firmy w Opalenicy.</p> <h2>FAQ — najczęstsze pytania</h2> <h3>Jak często powinienem aktualizować treści na stronie dla firmy w Opalenicy?</h3> <p>Częstotliwość aktualizacji zależy od branży i rodzaju treści. Strony usługowe powinny być aktualizowane co najmniej raz w roku, aby zapewnić aktualność danych. Blogi, ze względu na charakter informacyjny, wymagają częstszych publikacji – np. raz w miesiącu. Regularne dodawanie świeżego <strong>contentu na stronę</strong>, w tym nowych <strong>tekstów SEO</strong>, sygnalizuje wyszukiwarkom, że witryna jest aktywna i wartościowa, co może pozytywnie wpłynąć na jej pozycję w wynikach dla Opalenicy.</p> <h3>Czy warto inwestować w treści blogowe dla lokalnej firmy z Opalenicy?</h3> <p>Zdecydowanie tak. Blog to doskonałe narzędzie do przyciągania ruchu organicznego, budowania autorytetu i angażowania lokalnej społeczności. Poprzez publikowanie artykułów odpowiadających na lokalne problemy i zapytania, możesz dotrzeć do mieszkańców Opalenicy, którzy szukają informacji, a niekoniecznie od razu usługi. To również świetna okazja, aby w naturalny sposób wplatać <strong>teksty SEO</strong> z frazami lokalnymi.</p> <h3>Jakie są najważniejsze elementy, aby moje teksty SEO były skuteczne dla klientów z Opalenicy?</h3> <p>Kluczowe jest połączenie optymalizacji technicznej z wartością dla użytkownika. Skup się na: 1) badaniu lokalnych słów kluczowych, 2) naturalnym wplataniu ich w nagłówki i treść, 3) tworzeniu unikalnego i pomocnego <strong>contentu na stronę</strong>, który odpowiada na pytania klientów z Opalenicy, 4) zapewnieniu łatwych do znalezienia danych kontaktowych i adresowych, oraz 5) optymalizacji profilu Google Moja Firma. Treści powinny być czytelne, zrozumiałe i przekonujące.</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 tworzeniu treści?</h2> <p class="text-zinc-300 text-base leading-relaxed max-w-2xl mx-auto mb-8">Skontaktuj się z Pensatore, aby opracować strategię contentową i stworzyć teksty, które przyciągną klientów z Opalenicy i okolic.</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="6EluGttft3fEOz8sS88mzSCOOeJRN7K0cPJTbhXPwJuixfSqAIi47K1tFD0tM16r"> <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="6EluGttft3fEOz8sS88mzSCOOeJRN7K0cPJTbhXPwJuixfSqAIi47K1tFD0tM16r"> <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>