CSSWeb DevelopmentFrontend+1 więcej

Tailwind CSS: Jak Tworzyć UI szybciej za pomocą AI

Zapomnij o skakaniu między plikami HTML i CSS. Poznaj Tailwind CSS – framework, który zrewolucjonizował frontend i stał się standardem w erze AI. Naucz się budować responsywne layouty bez wychodzenia z HTML-a.

/
13 min czytania
Tailwind CSS: Jak Tworzyć UI szybciej za pomocą AI
Tailwind - Budowanie interfejsów bezpośrednio w kodzie HTML

Witajcie! 👋

Po ostatnich zajęciach znacie już HTML i potraficie pisać własny CSS. Prawdopodobnie zauważyliście jednak pewien problem...

Ciągłe przełączanie się między plikiem index.html a style.css, wymyślanie nazw klas (.wrapper-inner-container-left 🤯) i walka z kaskadowością potrafią być męczące.

Dziś poznacie narzędzie, które rozwiązuje te problemy i jest obecnie standardem rynkowym. Co więcej – jest to ulubiony framework sztucznej inteligencji. Jeśli chcecie efektywnie generować kod z Claude czy GitHub Copilot, musicie znać Tailwind CSS.

Zaczynamy przyspieszenie! 🚀

Czym jest Tailwind CSS? (Utility-First)

Tailwind to framework CSS typu Utility-First. W przeciwieństwie do Bootstrapa, który daje nam gotowe komponenty (np. gotowy przycisk .btn), Tailwind daje nam "klocki lego" – małe klasy, które robią jedną, konkretną rzecz.

Zamiast pisać w CSS:

/* Tradycyjny CSS */
.chat-notification {
  display: flex;
  max-width: 24rem;
  margin: 0 auto;
  padding: 1.5rem;
  border-radius: 0.75rem;
  background-color: white;
  box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
}

Piszemy w HTML:

<div class="mx-auto flex max-w-sm rounded-xl bg-white p-6 shadow-lg">...</div>

Brzmi jak bałagan w HTML? Na początku tak. Ale po godzinie pracy zrozumiecie, że nie musisz wymyślać nazw klas i nie musisz skakać po plikach. Widzisz strukturę i styl w jednym miejscu.

Dlaczego Tailwind + AI to "Połączenie Doskonałe"? 🤖

W artykule o Promptowaniu wspominałem, że AI zmienia zasady gry. Tailwind jest tego najlepszym przykładem.

Dlaczego modele AI (Claude, GPT, Gemini) piszą lepszy kod w Tailwindzie niż w czystym CSS?

  1. Kontekst jest w jednym miejscu: Model AI widzi strukturę (HTML) i wygląd (klasy) w jednej linijce. Nie musi "domyślać się", co jest w pliku CSS.
  2. Mniej halucynacji: Tailwind ma skończoną liczbę klas. AI rzadziej wymyśla nieistniejące właściwości.
  3. Tokenizacja: Klasy Tailwinda są krótkie (p-4, flex), co jest "tańsze" i szybsze dla modelu do wygenerowania.

💡 Wniosek: Jeśli prosisz AI o wygenerowanie landing page'a, dodaj w prompcie: " Użyj Tailwind w stylowaniu / zaimportuj go CDN / stwórz landing w jednym pliku HTML". Wynik będzie o niebo lepszy.

Instalacja (Wersja Edukacyjna)

W profesjonalnych projektach (React, Next.js) Tailwinda instaluje się przez terminal. Na potrzeby nauki i prototypowania użyjemy metody CDN.

Wklej ten skrypt do sekcji <head> swojego pliku HTML:

<script src="https://cdn.tailwindcss.com"></script>

I to wszystko. Możesz już używać klas Tailwinda!

⚠️ Uwaga: Ta metoda służy tylko do nauki i testów. Nie używaj jej na "prawdziwej" produkcji, bo jest wolniejsza niż skompilowany CSS.

Podstawowe Klasy, które Musisz Znać

Tailwind ma tysiące klas, ale 80% czasu będziesz używać tych samych kilkunastu. Oto Twój niezbędnik:

1. Odstępy (Spacing) i Rozmiary

Tailwind używa skali. 1 to zazwyczaj 0.25rem (4px).

  • m-4 = margin: 1rem (16px)
  • p-2 = padding: 0.5rem (8px)
  • w-full = width: 100%
  • h-screen = height: 100vh (wysokość całego ekranu)

2. Kolory i Tekst

  • bg-blue-500 - Tło niebieskie (odcień 500)
  • text-white - Biały tekst
  • text-xl - Większa czcionka
  • font-bold - Pogrubienie

3. Flexbox (Layout)

Pamiętasz CSS Flexbox? W Tailwindzie to bajecznie proste:

<div class="flex h-screen items-center justify-center bg-gray-100">
  <div class="p-10 bg-white shadow-lg">Jestem na środku!</div>
</div>
  • flex - włącza Flexbox
  • justify-center - wyrównanie w poziomie (oś główna)
  • items-center - wyrównanie w pionie (oś poprzeczna)
  • gap-4 - odstęp między elementami

Responsywność: Mobile First 📱

Tailwind ma wbudowane "przedrostki" dla różnych rozmiarów ekranu. Działają one na zasadzie: "Zastosuj ten styl OD tego rozmiaru w górę".

PrzedrostekRozmiar Ekranu
(brak)Domyślny (Telefon)
md:Tablet (min-width: 768px)
lg:Laptop (min-width: 1024px)

Przykład:

Chcemy siatkę, która na telefonie jest jedną kolumną, a na komputerze trzema.

<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
  <div class="bg-red-200 p-4">Kolumna 1</div>
  <div class="bg-green-200 p-4">Kolumna 2</div>
  <div class="bg-blue-200 p-4">Kolumna 3</div>
</div>

Czytaj to tak: "Domyślnie zrób 1 kolumnę. Ale (md:) na średnich i większych ekranach zmień na 3 kolumny."

Stany: Hover, Focus, Active

Interakcja z użytkownikiem jest kluczowa. W Tailwindzie dodajemy przedrostek hover: i gotowe.

<button
  class="bg-blue-500 text-white px-4 py-2 rounded 
               hover:bg-blue-700 transition duration-300"
>
  Najedź na mnie
</button>

Dodałem też transition i duration-300, żeby zmiana koloru była płynna. Proste, prawda?

Dobre Praktyki (Nie zrób bałaganu w HTML)

Częstym zarzutem wobec Tailwinda jest to, że HTML staje się nieczytelny od nadmiaru klas.

Oto jak sobie z tym radzić:

  1. Formatowanie: Używaj wtyczki "Tailwind CSS IntelliSense" w VS Code. Podpowiada klasy i pokazuje kolory.
  2. Prettier: Zainstaluj plugin prettier-plugin-tailwindcss. Automatycznie posortuje Twoje klasy w logicznej kolejności przy zapisywaniu pliku.
  3. Nie nadużywaj @apply: Wiele osób próbuje używać Tailwinda jak starego CSS, tworząc klasy .btn { @apply bg-blue-500 ... }. Unikaj tego, chyba że wiesz, co robisz. Siłą Tailwinda jest HTML.

Zadania Praktyczne 🛠️

Zadanie 1: Karta Produktu (Refaktoryzacja)

Weź "czysty" HTML i stwórz kartę produktu, która zawiera:

  • Obrazek na górze (zaokrąglone rogi).
  • Tytuł (text-xl, font-bold).
  • Cenę (kolor wyróżniający, np. text-green-600).
  • Przycisk "Kup teraz" z efektem hover.
  • Dodaj cień do całej karty (shadow-lg).

Zadanie 2: Responsywne Menu

Stwórz navbar, który:

  • Na telefonie wyświetla linki jeden pod drugim (pionowo).
  • Na desktopie (md:) wyświetla linki obok siebie (poziomo) i przesuwa je na prawą stronę (justify-end).

Zadanie 3: Wyzwanie AI (Prompting)

Wróć do lekcji o generowaniu stron przez AI.

Użyj ChatGPT lub Claude i wpisz prompt:

"Stwórz sekcję Hero dla strony Uniwersytetu Civitas (lub innej dowolnej firmy) używając Tailwind CSS. Sekcja ma mieć zdjęcie w tle, ciemną nakładkę (overlay), biały wyśrodkowany tekst i dwa przyciski (lub inny design). Kod ma być gotowy do wklejenia do pliku HTML z CDN."

Przeanalizuj kod, który dostałeś. Zobacz, jakich klas użyło AI.

Podsumowanie

Tailwind CSS to nie tylko "kolejny framework". To zmiana sposobu myślenia o budowaniu interfejsów.

Szybkość: Nie tracisz czasu na wymyślanie nazw klas.
Spójność: Korzystasz ze zdefiniowanego systemu (kolory, odstępy).
AI-Ready: To najlepszy język do komunikacji z generatorami kodu.

Bonus: Kompletna Strona Landing Page 🎁

Czas na coś konkretnego. Poniżej znajdziesz produkcyjny kod pełnej strony landing page z Tailwindem.

To nie jest "tutorial code" – to struktura, którą stosuję w prawdziwych projektach wygenerowana przez AI! Semantyczny HTML5, accessibility, responsywność mobile-first, i czyste separacje sekcji.

Skopiuj, wklej do pliku HTML, otwórz w przeglądarce i zobacz Tailwinda w akcji.

<!DOCTYPE html>
<html lang="pl" class="scroll-smooth">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Twoja Firma - Profesjonalne Rozwiązania</title>
    <script src="https://cdn.tailwindcss.com"></script>
  </head>
  <body class="font-sans antialiased text-gray-900">
    <!-- Hero Section -->
    <header
      class="relative h-screen flex items-center justify-center bg-gradient-to-br from-blue-600 to-purple-700 text-white"
    >
      <div class="absolute inset-0 bg-black/40"></div>

      <div class="relative z-10 max-w-4xl mx-auto px-6 text-center">
        <h1 class="text-4xl md:text-6xl font-bold mb-6 leading-tight">
          Tworzymy Rozwiązania, Które
          <span class="text-yellow-300">Działają</span>
        </h1>
        <p class="text-lg md:text-xl mb-8 text-gray-100 max-w-2xl mx-auto">
          Specjalizujemy się w tworzeniu nowoczesnych aplikacji webowych, które
          pomagają firmom rozwijać się w erze cyfrowej.
        </p>
        <div class="flex flex-col sm:flex-row gap-4 justify-center">
          <a
            href="#contact"
            class="px-8 py-4 bg-yellow-400 text-gray-900 font-semibold rounded-lg 
                  hover:bg-yellow-300 transition-all duration-300 shadow-lg hover:shadow-xl"
          >
            Rozpocznij Projekt
          </a>
          <a
            href="#about"
            class="px-8 py-4 bg-white/10 backdrop-blur-sm border-2 border-white 
                  hover:bg-white/20 transition-all duration-300 rounded-lg"
          >
            Dowiedz Się Więcej
          </a>
        </div>
      </div>
    </header>

    <!-- About Section -->
    <section id="about" class="py-20 bg-white">
      <div class="max-w-6xl mx-auto px-6">
        <div class="text-center mb-16">
          <h2 class="text-3xl md:text-4xl font-bold mb-4">Kim Jesteśmy?</h2>
          <div class="w-20 h-1 bg-blue-600 mx-auto"></div>
        </div>

        <div class="grid md:grid-cols-2 gap-12 items-center">
          <div>
            <h3 class="text-2xl font-bold mb-4 text-gray-800">
              Ponad 20 Lat Doświadczenia w Branży
            </h3>
            <p class="text-gray-600 leading-relaxed mb-4">
              Od dwóch dekad pomagamy firmom w transformacji cyfrowej. Nasze
              rozwiązania łączą nowoczesne technologie z głębokim zrozumieniem
              potrzeb biznesowych.
            </p>
            <p class="text-gray-600 leading-relaxed">
              Pracowaliśmy z startupami, średnimi przedsiębiorstwami i
              korporacjami, dostarczając rozwiązania od MVP po skalowalne
              platformy enterprise.
            </p>
          </div>

          <div
            class="bg-gradient-to-br from-blue-50 to-purple-50 p-8 rounded-2xl"
          >
            <ul class="space-y-4">
              <li class="flex items-start gap-3">
                <svg
                  class="w-6 h-6 text-green-500 flex-shrink-0 mt-1"
                  fill="currentColor"
                  viewBox="0 0 20 20"
                >
                  <path
                    fill-rule="evenodd"
                    d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z"
                    clip-rule="evenodd"
                  />
                </svg>
                <div>
                  <strong class="text-gray-900">500+ Projektów</strong>
                  <p class="text-gray-600 text-sm">Zrealizowanych z sukcesem</p>
                </div>
              </li>
              <li class="flex items-start gap-3">
                <svg
                  class="w-6 h-6 text-green-500 flex-shrink-0 mt-1"
                  fill="currentColor"
                  viewBox="0 0 20 20"
                >
                  <path
                    fill-rule="evenodd"
                    d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z"
                    clip-rule="evenodd"
                  />
                </svg>
                <div>
                  <strong class="text-gray-900">99.9% Uptime</strong>
                  <p class="text-gray-600 text-sm">Gwarancja dostępności</p>
                </div>
              </li>
              <li class="flex items-start gap-3">
                <svg
                  class="w-6 h-6 text-green-500 flex-shrink-0 mt-1"
                  fill="currentColor"
                  viewBox="0 0 20 20"
                >
                  <path
                    fill-rule="evenodd"
                    d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z"
                    clip-rule="evenodd"
                  />
                </svg>
                <div>
                  <strong class="text-gray-900">24/7 Support</strong>
                  <p class="text-gray-600 text-sm">
                    Zawsze do Twojej dyspozycji
                  </p>
                </div>
              </li>
            </ul>
          </div>
        </div>
      </div>
    </section>

    <!-- Services Cards -->
    <section class="py-20 bg-gray-50">
      <div class="max-w-6xl mx-auto px-6">
        <div class="text-center mb-16">
          <h2 class="text-3xl md:text-4xl font-bold mb-4">Nasze Usługi</h2>
          <p class="text-gray-600 max-w-2xl mx-auto">
            Kompleksowe rozwiązania dostosowane do Twoich potrzeb biznesowych
          </p>
        </div>

        <div class="grid md:grid-cols-3 gap-8">
          <!-- Card 1 -->
          <article
            class="bg-white p-8 rounded-xl shadow-md hover:shadow-2xl transition-shadow duration-300 group"
          >
            <div
              class="w-14 h-14 bg-blue-100 rounded-lg flex items-center justify-center mb-6 group-hover:bg-blue-600 transition-colors duration-300"
            >
              <svg
                class="w-7 h-7 text-blue-600 group-hover:text-white transition-colors duration-300"
                fill="none"
                stroke="currentColor"
                viewBox="0 0 24 24"
              >
                <path
                  stroke-linecap="round"
                  stroke-linejoin="round"
                  stroke-width="2"
                  d="M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"
                />
              </svg>
            </div>
            <h3 class="text-xl font-bold mb-3">Aplikacje Webowe</h3>
            <p class="text-gray-600 leading-relaxed">
              Tworzymy szybkie, responsywne aplikacje wykorzystując React,
              Next.js i nowoczesne technologie.
            </p>
          </article>

          <!-- Card 2 -->
          <article
            class="bg-white p-8 rounded-xl shadow-md hover:shadow-2xl transition-shadow duration-300 group"
          >
            <div
              class="w-14 h-14 bg-purple-100 rounded-lg flex items-center justify-center mb-6 group-hover:bg-purple-600 transition-colors duration-300"
            >
              <svg
                class="w-7 h-7 text-purple-600 group-hover:text-white transition-colors duration-300"
                fill="none"
                stroke="currentColor"
                viewBox="0 0 24 24"
              >
                <path
                  stroke-linecap="round"
                  stroke-linejoin="round"
                  stroke-width="2"
                  d="M12 18h.01M8 21h8a2 2 0 002-2V5a2 2 0 00-2-2H8a2 2 0 00-2 2v14a2 2 0 002 2z"
                />
              </svg>
            </div>
            <h3 class="text-xl font-bold mb-3">Mobile-First Design</h3>
            <p class="text-gray-600 leading-relaxed">
              Projektujemy interfejsy, które wyglądają perfekcyjnie na każdym
              urządzeniu – od smartfona po desktop.
            </p>
          </article>

          <!-- Card 3 -->
          <article
            class="bg-white p-8 rounded-xl shadow-md hover:shadow-2xl transition-shadow duration-300 group"
          >
            <div
              class="w-14 h-14 bg-green-100 rounded-lg flex items-center justify-center mb-6 group-hover:bg-green-600 transition-colors duration-300"
            >
              <svg
                class="w-7 h-7 text-green-600 group-hover:text-white transition-colors duration-300"
                fill="none"
                stroke="currentColor"
                viewBox="0 0 24 24"
              >
                <path
                  stroke-linecap="round"
                  stroke-linejoin="round"
                  stroke-width="2"
                  d="M13 10V3L4 14h7v7l9-11h-7z"
                />
              </svg>
            </div>
            <h3 class="text-xl font-bold mb-3">Optymalizacja SEO</h3>
            <p class="text-gray-600 leading-relaxed">
              Dbamy o widoczność w wyszukiwarkach – struktura, meta tagi,
              performance i Core Web Vitals.
            </p>
          </article>
        </div>
      </div>
    </section>

    <!-- Contact Form -->
    <section id="contact" class="py-20 bg-white">
      <div class="max-w-4xl mx-auto px-6">
        <div class="text-center mb-12">
          <h2 class="text-3xl md:text-4xl font-bold mb-4">
            Skontaktuj Się z Nami
          </h2>
          <p class="text-gray-600">
            Opisz swój projekt – odpowiemy w ciągu 24 godzin
          </p>
        </div>

        <form
          class="bg-gray-50 p-8 md:p-12 rounded-2xl shadow-lg"
          method="POST"
          action="#"
        >
          <div class="grid md:grid-cols-2 gap-6 mb-6">
            <div>
              <label
                for="name"
                class="block text-sm font-medium text-gray-700 mb-2"
              >
                Imię i Nazwisko <span class="text-red-500">*</span>
              </label>
              <input
                type="text"
                id="name"
                name="name"
                required
                class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-all duration-200"
                placeholder="Jan Kowalski"
              />
            </div>

            <div>
              <label
                for="email"
                class="block text-sm font-medium text-gray-700 mb-2"
              >
                Email <span class="text-red-500">*</span>
              </label>
              <input
                type="email"
                id="email"
                name="email"
                required
                class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-all duration-200"
                placeholder="jan@przykład.pl"
              />
            </div>
          </div>

          <div class="mb-6">
            <label
              for="message"
              class="block text-sm font-medium text-gray-700 mb-2"
            >
              Wiadomość <span class="text-red-500">*</span>
            </label>
            <textarea
              id="message"
              name="message"
              rows="6"
              required
              class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-all duration-200 resize-none"
              placeholder="Opisz swój projekt, wymagania i oczekiwania..."
            ></textarea>
          </div>

          <button
            type="submit"
            class="w-full md:w-auto px-8 py-4 bg-blue-600 text-white font-semibold rounded-lg hover:bg-blue-700 focus:ring-4 focus:ring-blue-300 transition-all duration-300 shadow-lg hover:shadow-xl"
          >
            Wyślij Wiadomość
          </button>
        </form>
      </div>
    </section>

    <!-- Footer -->
    <footer class="bg-gray-900 text-gray-300 py-12">
      <div class="max-w-6xl mx-auto px-6">
        <div class="grid md:grid-cols-3 gap-8 mb-8">
          <!-- Company Info -->
          <div>
            <h3 class="text-white text-lg font-bold mb-4">Twoja Firma</h3>
            <p class="text-sm leading-relaxed mb-4">
              Tworzymy nowoczesne rozwiązania webowe, które pomagają firmom
              osiągać cele biznesowe.
            </p>
            <div class="flex gap-4">
              <a
                href="#"
                class="hover:text-white transition-colors duration-200"
                aria-label="Facebook"
              >
                <svg class="w-6 h-6" fill="currentColor" viewBox="0 0 24 24">
                  <path
                    d="M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z"
                  />
                </svg>
              </a>
              <a
                href="#"
                class="hover:text-white transition-colors duration-200"
                aria-label="Twitter"
              >
                <svg class="w-6 h-6" fill="currentColor" viewBox="0 0 24 24">
                  <path
                    d="M23.953 4.57a10 10 0 01-2.825.775 4.958 4.958 0 002.163-2.723c-.951.555-2.005.959-3.127 1.184a4.92 4.92 0 00-8.384 4.482C7.69 8.095 4.067 6.13 1.64 3.162a4.822 4.822 0 00-.666 2.475c0 1.71.87 3.213 2.188 4.096a4.904 4.904 0 01-2.228-.616v.06a4.923 4.923 0 003.946 4.827 4.996 4.996 0 01-2.212.085 4.936 4.936 0 004.604 3.417 9.867 9.867 0 01-6.102 2.105c-.39 0-.779-.023-1.17-.067a13.995 13.995 0 007.557 2.209c9.053 0 13.998-7.496 13.998-13.985 0-.21 0-.42-.015-.63A9.935 9.935 0 0024 4.59z"
                  />
                </svg>
              </a>
              <a
                href="#"
                class="hover:text-white transition-colors duration-200"
                aria-label="LinkedIn"
              >
                <svg class="w-6 h-6" fill="currentColor" viewBox="0 0 24 24">
                  <path
                    d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"
                  />
                </svg>
              </a>
            </div>
          </div>

          <!-- Quick Links -->
          <div>
            <h3 class="text-white text-lg font-bold mb-4">Szybkie Linki</h3>
            <ul class="space-y-2 text-sm">
              <li>
                <a
                  href="#about"
                  class="hover:text-white transition-colors duration-200"
                  >O Nas</a
                >
              </li>
              <li>
                <a
                  href="#services"
                  class="hover:text-white transition-colors duration-200"
                  >Usługi</a
                >
              </li>
              <li>
                <a
                  href="#portfolio"
                  class="hover:text-white transition-colors duration-200"
                  >Portfolio</a
                >
              </li>
              <li>
                <a
                  href="#contact"
                  class="hover:text-white transition-colors duration-200"
                  >Kontakt</a
                >
              </li>
            </ul>
          </div>

          <!-- Contact Info -->
          <div>
            <h3 class="text-white text-lg font-bold mb-4">Kontakt</h3>
            <ul class="space-y-2 text-sm">
              <li class="flex items-start gap-2">
                <svg
                  class="w-5 h-5 flex-shrink-0 mt-0.5"
                  fill="none"
                  stroke="currentColor"
                  viewBox="0 0 24 24"
                >
                  <path
                    stroke-linecap="round"
                    stroke-linejoin="round"
                    stroke-width="2"
                    d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"
                  />
                </svg>
                <a
                  href="mailto:kontakt@twojafirma.pl"
                  class="hover:text-white transition-colors duration-200"
                >
                  kontakt@twojafirma.pl
                </a>
              </li>
              <li class="flex items-start gap-2">
                <svg
                  class="w-5 h-5 flex-shrink-0 mt-0.5"
                  fill="none"
                  stroke="currentColor"
                  viewBox="0 0 24 24"
                >
                  <path
                    stroke-linecap="round"
                    stroke-linejoin="round"
                    stroke-width="2"
                    d="M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z"
                  />
                </svg>
                <a
                  href="tel:+48123456789"
                  class="hover:text-white transition-colors duration-200"
                >
                  +48 123 456 789
                </a>
              </li>
              <li class="flex items-start gap-2">
                <svg
                  class="w-5 h-5 flex-shrink-0 mt-0.5"
                  fill="none"
                  stroke="currentColor"
                  viewBox="0 0 24 24"
                >
                  <path
                    stroke-linecap="round"
                    stroke-linejoin="round"
                    stroke-width="2"
                    d="M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z"
                  />
                  <path
                    stroke-linecap="round"
                    stroke-linejoin="round"
                    stroke-width="2"
                    d="M15 11a3 3 0 11-6 0 3 3 0 016 0z"
                  />
                </svg>
                <span>Warszawa, Polska</span>
              </li>
            </ul>
          </div>
        </div>

        <div class="border-t border-gray-800 pt-8 text-center text-sm">
          <p>&copy; 2025 Twoja Firma. Wszelkie prawa zastrzeżone.</p>
        </div>
      </div>
    </footer>
  </body>
</html>

Co warto zauważyć w tym kodzie? 🔍

Semantyczny HTML:

  • <header>, <section>, <article>, <footer> – struktura zrozumiała dla botów i screen readerów
  • Atrybuty aria-label dla ikon społecznościowych
  • Prawidłowa hierarchia nagłówków (h1→h2→h3)

Accessibility:

  • Focus states (focus:ring-4)
  • Wystarczający kontrast kolorów
  • Oznaczenia wymaganych pól (*)
  • Alternatywne teksty dla ikon

Mobile-First Responsywność:

  • Breakpoint md: używany świadomie
  • Grid automatycznie przechodzi z 1 do 3 kolumn
  • Stack pionowy → poziomy dla przycisków

Performance:

  • scroll-smooth dla płynnego scrollowania
  • Transitions tylko tam, gdzie potrzeba
  • Brak zewnętrznych fontów (system fonts = 0 KB dodatkowego ładowania)

Realne Praktyki:

  • group hover dla kart (efekt dla ikony + tła jednocześnie)
  • backdrop-blur dla przycisku ghost
  • Wydzielone komponenty (każda karta to <article>)

Co dalej?

Masz już potężny arsenał: HTML, CSS, AI i Tailwind. W następnej kolejności połączymy to wszystko, aby opublikować Twój pierwszy poważny projekt w sieci!

Masz problem z layoutem? Grid Ci się rozjeżdża? Napisz do mnie: m@zeprzalka.com lub wklej swój kod do ChatGPT z dopiskiem "Fix styling using Tailwind" spróbuj pokombinować, najlepsza nauka to praktyka. 😉

Powodzenia! 🎨