Convertere

Builder Flow v4 — DaisyUI: wszystkie komponenty i style z jednego źródła

Czym jest Builder Flow v4?

Builder Flow v4 to proces przekształcania luźnego pomysłu w działający prototyp strony/aplikacji, gdzie wszystkie komponenty UI i style pochodzą z DaisyUI — gotowego, sprawdzonego zestawu 30+ komponentów. Żadnego ręcznego CSS, żadnego wymyślania kół na nowo. Każdy przycisk, karta, tabela, navbar to gotowa klasa DaisyUI.

Kluczowe różnice względem v3:

  1. DaisyUI = jedyny wybór — bez porównywania frameworków, bez wyboru biblioteki. DaisyUI przez CDN, zero konfiguracji, 30+ gotowych komponentów
  2. Wszystkie style = DaisyUI — kolory, spacing, typografia, komponenty, responsywność. Żadnego CSS poza klasami DaisyUI i Tailwind utility
  3. Motywy = data-theme — 30+ wbudowanych motywów, zmiana wyglądu całego prototypu przez jeden atrybut HTML

Proces dzieli się na 6 faz:

  1. Brainstorming — superpowers SDD zadaje pytania, owner odpowiada, powstaje precyzyjny brief
  2. Specyfikacja — superpowers SDD generuje specyfikację biznesową, techniczną i wizualną
  3. Design System — DaisyUI theme — wybór motywu, konfiguracja CDN, paleta kolorów projektu
  4. HTML mockupy — wszystkie strony z gotowych komponentów DaisyUI, spójne, z mockowanymi danymi
  5. Prototyp do klikania — człowiek przegląda i zatwierdza
  6. Backend — dopiero po zatwierdzeniu prototypu, z tym samym DaisyUI

Faza 0: Brainstorming — superpowers SDD × Owner

Zanim powstanie jakakolwiek specyfikacja, superpowers SDD prowadzi wielopytaniową wymianę z ownerem produktu. Celem jest wyciągnięcie maksimum precyzji, zanim opencode zacznie cokolwiek generować.

Krok 0.1: Init — CEO tworzy brief brainstormingowy

CEO tworzy strukturę pytań, które superpowers zada ownerowi:

mkdir -p /root/projects/<projekt>/.superpowers/sdd

cat > /root/projects/<projekt>/.superpowers/sdd/brainstorming-brief.md << 'EOF'
# Brainstorming — wielopytaniowa wymiana

## Cel
Przeprowadź szczegółową wymianę pytań i odpowiedzi z ownerem produktu, żeby precyzyjnie zdefiniować projekt. To jest NAJWAŻNIEJSZA faza — im więcej pytań, tym mniej błędów potem.

## Kategorie pytań (wymagane wszystkie)

### 1. Business & Cel (min. 5 pytań)
- Jaki problem rozwiązuje ta aplikacja?
- Dla kogo dokładnie jest? (wiek, zawód, potrzeby)
- Co jest najważniejsze: szybkość, wygląd, funkcje, niezawodność?
- Jakie znasz alternatywy? Co w nich nie działa?
- Jakie są kryteria sukcesu?

### 2. Użytkownicy i Persony (min. 4 pytania)
- Ile typów użytkowników? (admin, klient, gość, moderator)
- Co każdy typ użytkownika robi najczęściej?
- Jakie są uprawnienia?
- Czy użytkownicy są zalogowani czy anonimowi?

### 3. Funkcjonalności — priorytetyzacja (min. 6 pytań)
- Jaka jest JEDNA najważniejsza funkcja? (MVP)
- Jakie funkcje są "nice to have"?
- Czego NIE robi ta aplikacja? (anti-scope)
- Jakie są integracje? (API, płatności, email, SMS, webhooki)
- Czy są deadline/y?
- Które funkcje mogą poczekać do v2?

### 4. UX i Design (min. 4 pytania)
- Jakie aplikacje podobają Ci się wizualnie? (linki, screengraby)
- Jaki charakter ma mieć aplikacja? (poważny, zabawny, minimalistyczny, bogaty)
- Czy preferujesz dark mode czy light mode?
- Czy są elementy brandingowe? (logo, kolory firmy, font)

### 5. Technologia i hosting (min. 3 pytania)
- Czy masz preferencje technologiczne?
- Gdzie ma być hostowane?
- Czy potrzebujesz backendu czy może być statycznie?

### 6. Ograniczenia i ryzyka (min. 3 pytania)
- Jakie są największe ryzyka?
- Co jeśli projekt się nie uda?
- Czy są regulacje? (RODO, HIPAA, GDPR)

## Output
Plik brainstorming-report.md z wszystkimi pytaniami i odpowiedziami.
EOF

Krok 0.2: Uruchom brainstorming

cd /root/projects/<projekt>
opencode run --prompt '
Przeczytaj .superpowers/sdd/brainstorming-brief.md.

Wykonaj brainstorming z ownerem:
1. Zadaj pytanie z kategorii 1 (Business & Cel)
2. Czekaj na odpowiedź
3. Jeśli odpowiedź jest ogólnikowa — zadaj pytanie doprecyzowujące
4. Przejdź do następnego pytania
5. Po wyczerpaniu kategorii 1, przejdź do kategorii 2

Zadaj WSZYSTKIE pytania ze wszystkich 6 kategorii.
Po zakończeniu zapisz pełny raport do .superpowers/sdd/brainstorming-report.md.

Uwaga: to jest interaktywna sesja — zadajesz pytanie, ja odpowiadam.
' --auto

Krok 0.3: Przykładowy przebieg

superpowers: Jaki problem rozwiązuje ta aplikacja?
Owner:      Pacjenci nie wiedzą kiedy mają sesje normobarii.

superpowers: Rozumiem. Czyli chodzi o harmonogram. A jak to teraz działa?
Owner:      Dzwonią do recepcji, recepcja sprawdza w Excelu, mówi im.

superpowers: Excel — czyli jest już jakiś system. Czy chcesz go zastąpić, czy zrobić 
            coś równoległego?
Owner:      Zastąpić. Excel jest dla recepcji, nie dla pacjentów.

superpowers: Czyli aplikacja ma być dla pacjentów (self-service), a nie dla recepcji?
Owner:      Dokładnie. Aplikacja tylko dla pacjentów.
            ...

Krok 0.4: Weryfikacja

# Sprawdź czy są konkretne odpowiedzi (nie "nie wiem")
grep -c "nie wiem\|nie jestem pewien\|trudno powiedzieć" \
  /root/projects/<projekt>/.superpowers/sdd/brainstorming-report.md || true

Faza 1: Specyfikacja przez superpowers SDD

Po brainstromingu, mamy precyzyjny brief. Teraz superpowers generuje 3 specyfikacje.

Krok 1.1: Specyfikacja biznesowa (phase-1)

cat > .superpowers/sdd/phase-1-brief.md << 'EOF'
# Faza 1: Specyfikacja biznesowa

## Cel
Na podstawie brainstorming-report.md, stwórz specyfikację biznesową.

## Wymagane sekcje
1. **Persona** — typy użytkowników z konkretnymi cechami
2. **User stories** — priorytetyzowane (P0, P1, P2)
3. **MVP scope** — minimalna wersja do uruchomienia
4. **Przepływ biznesowy** — krok po kroku
5. **Metryki sukcesu** — konkretne liczby

## Output
Plik phase-1-report.md
EOF
opencode run --prompt 'Przeczytaj brainstorming-report.md i phase-1-brief.md. Wygeneruj phase-1-report.md.' --auto

Krok 1.2: Specyfikacja techniczna (phase-2)

cat > .superpowers/sdd/phase-2-brief.md << 'EOF'
# Faza 2: Specyfikacja techniczna

## Cel
Na podstawie phase-1-report.md, zdefiniuj architekturę techniczną.

## Wymagane sekcje
1. **Struktura URL-i** — lista wszystkich ścieżek
2. **Model danych** — encje, relacje, pola
3. **API endpoints** — REST, metody, request/response
4. **Stack** — framework, baza, hosting

## Output
Plik phase-2-report.md
EOF
opencode run --prompt 'Przeczytaj phase-1-report.md i phase-2-brief.md. Wygeneruj phase-2-report.md.' --auto

Krok 1.3: Specyfikacja wizualna — lista stron (phase-3)

cat > .superpowers/sdd/phase-3-brief.md << 'EOF'
# Faza 3: Specyfikacja wizualna

## Cel
Na podstawie phase-1-report.md i phase-2-report.md, stwórz listę wszystkich stron.

## Wymagane sekcje
Dla KAŻDEJ strony:
1. **URL** — ścieżka
2. **Cel strony** — co użytkownik tu robi
3. **Komponenty DaisyUI** — lista gotowych komponentów (navbar, karta, tabela, formularz, modal, sidebar, breadcrumbs, pagination, badge, alert, dropdown, tabs, accordion, tooltip, progress, loading, avatar, chat)
4. **Dane mockowe** — przykładowe dane
5. **Layout** — układ strony (container, grid, flex)
6. **Akcje użytkownika** — co może kliknąć, wpisać, przeciągnąć

## Output
Plik phase-3-report.md — lista wszystkich stron z komponentami DaisyUI.
EOF
opencode run --prompt 'Przeczytaj phase-1-report.md, phase-2-report.md i phase-3-brief.md. Wygeneruj phase-3-report.md z listą stron.' --auto

Faza 2: Design System — DaisyUI theme

DaisyUI ma wbudowanych 30+ motywów. Nie trzeba pisać ani linii CSS. Wybieramy motyw i konfigurujemy CDN.

Krok 2.1: Prezentacja motywów

CEO pokazuje użytkownikowi dostępne motywy DaisyUI i pyta o preferencje:

[CEO] DaisyUI ma 30+ wbudowanych motywów. Oto rekomendowane dla tego projektu:

| Motyw | Charakter | Dla kogo |
|-------|-----------|----------|
| light | Jasny, czysty, profesjonalny | Domyślny, bezpieczny wybór |
| dark | Ciemny, nowoczesny, technologiczny | Aplikacje tech, dashboardy |
| emerald | Zielony, naturalny, świeży | Wellness, zdrowie, medycyna |
| cupcake | Ciepły, przyjazny, delikatny | Dla pacjentów, UX friendly |
| corporate | Biznesowy, stonowany, elegancki | B2B, admin, enterprise |
| forest | Leśny, głęboki, organiczny | Naturals, eco, outdoor |
| winter | Zimny, niebieski, sterylny | Medycyna, laboratoria, precise |
| autumn | Ciepły, jesienny, przytulny | Wellness, SPA, relaks |
| acid | Neonowy, odważny, kreatywny | Gaming, młodzież, rozrywka |
| synthwave | Neon retro, lata 80 | Kreatywne, niestandardowe |

Który motyw wybierasz? Jeśli nie masz preferencji — rekomenduję emerald (wellness/zdrowie).

Krok 2.2: Zapisz wybór w konfiguracji

# Zapisz wybrany motyw
echo "data-theme: emerald" > /root/projects/<projekt>/.superpowers/sdd/selected-theme.txt

Krok 2.3: Custom theme (jeśli potrzeba)

Jeśli żaden gotowy motyw nie pasuje, DaisyUI pozwala zdefiniować własny przez tailwind.config.js:

<script>
  tailwind.config = {
    daisyui: {
      themes: [
        {
          nazwa-projektu: {
            "primary": "#2563eb",
            "primary-content": "#ffffff",
            "secondary": "#64748b",
            "secondary-content": "#ffffff",
            "accent": "#f59e0b",
            "accent-content": "#ffffff",
            "neutral": "#1e293b",
            "neutral-content": "#ffffff",
            "base-100": "#ffffff",
            "base-200": "#f8fafc",
            "base-300": "#e2e8f0",
            "base-content": "#1e293b",
            "info": "#3b82f6",
            "success": "#10b981",
            "warning": "#f59e0b",
            "error": "#ef4444",
          },
        },
      ],
    },
  }
</script>

Krok 2.4: Szablon bazowy HTML

CEO tworzy szablon HTML, który będzie używany przez wszystkie strony:

cat > /var/www/projects/<projekt>/base.html << 'EOF'
<!DOCTYPE html>
<html lang="pl" data-theme="emerald">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>PROJEKT — Nazwa Strony</title>
  <link href="https://cdn.jsdelivr.net/npm/daisyui@5" rel="stylesheet">
  <script src="https://cdn.tailwindcss.com"></script>
</head>
<body>

<!-- Navbar -->
<div class="navbar bg-base-100 shadow-sm sticky top-0 z-50">
  <div class="flex-1">
    <a href="/projekt/" class="btn btn-ghost text-xl">NazwaProjektu</a>
  </div>
  <div class="flex-none">
    <ul class="menu menu-horizontal px-1">
      <li><a href="/projekt/dashboard/" class="active">Dashboard</a></li>
      <li><a href="/projekt/sessions/">Sesje</a></li>
      <li><a href="/projekt/profile/">Profil</a></li>
      <li><a href="/projekt/settings/">Ustawienia</a></li>
    </ul>
  </div>
</div>

<!-- Content -->
<main class="container mx-auto p-6">
  <!-- STRONA: treść właściwa -->
</main>

<!-- Footer -->
<footer class="footer footer-center p-4 bg-base-200 text-base-content/60 mt-8">
  <p>Prototyp v4 — DaisyUI | data-theme="emerald"</p>
</footer>

</body>
</html>
EOF

Faza 3: HTML mockupy z DaisyUI

Teraz opencode generuje wszystkie strony, używając wyłącznie gotowych klas DaisyUI. Żadnego ręcznego CSS, żadnych inline style, żadnych hexów.

Krok 3.1: Pełna lista komponentów DaisyUI

Zanim opencode zacznie, CEO wrzuca mu do prompta pełną listę dostępnych komponentów:

KomponentKlasa DaisyUIOpis
Navbar<div class="navbar">Responsywny navbar z logo, menu, dropdown
Karta<div class="card card-bordered">Karta z body, title, actions, shadow
Przycisk<button class="btn btn-primary">8 wariantów: primary, secondary, accent, neutral, ghost, link, outline, soft
Rozmiar przyciskubtn-xs, btn-sm, btn-md, btn-lg, btn-xl5 rozmiarów
Kształt przyciskubtn-square, btn-circle, btn-blockKwadrat, okrąg, full width
Tabela<table class="table table-zebra">4 warianty: table-zebra, table-pin-rows, table-pin-cols, table-xs/sm/md/lg
Input<input class="input input-bordered">4 warianty: input-bordered, input-ghost, input-soft
Textarea<textarea class="textarea textarea-bordered">Jak input, ale wielolinijkowy
Select<select class="select select-bordered">Dropdown select
Checkbox<input type="checkbox" class="checkbox">Checkbox z 3 kolorami
Radio<input type="radio" class="radio">Radio button
Toggle<input type="checkbox" class="toggle">Przełącznik on/off
Badge<span class="badge badge-success">6 kolorów: neutral, primary, secondary, accent, success, warning, error, info, ghost
Alert<div class="alert alert-info">5 wariantów: info, success, warning, error, neutral
Modal<dialog class="modal">Modal z backdrop, form, actions
Dropdown<details class="dropdown">Dropdown bez JS (HTML-only)
Tabs<div class="tabs tabs-bordered">4 style: tabs-bordered, tabs-lifted, tabs-box, tabs-bottom
Accordion<div class="collapse collapse-arrow">Accordion z checkbox
Breadcrumbs<div class="breadcrumbs">Nawigacja okruszkowa
Loading<span class="loading loading-spinner">4 warianty: spinner, dots, ring, ball
Progress<progress class="progress progress-primary">Pasek postępu, 5 kolorów
Avatar<div class="avatar">Avatar z placeholder, online/offline
Chat<div class="chat chat-start">Bubble czatowe
Stat<div class="stat">Statystyka z tytułem, wartością, opisem
Tooltip<div class="tooltip" data-tip="tekst">Tooltip na hover
Indicator<div class="indicator">Badge nad elementem (np. licznik powiadomień)
Join<div class="join">Grupowanie przycisków/inputów
KBD<kbd class="kbd">Klawisz klawiatury
Countdown<span class="countdown">Odliczanie
Timeline<ul class="timeline">Oś czasu
Steps<ul class="steps">Kreator kroków
Diff<figure class="diff">Porównanie przed/po
Mask<div class="mask mask-squircle">Kształt avatara (squircle, heart, hexagon, star)
Skeleton<div class="skeleton">Placeholder ładowania
Carousel<div class="carousel">Karuzela
Bottom Navigation<div class="btm-nav">Nawigacja dolna (mobile)

Krok 3.2: Tailwind Utility — dozwolone klasy

Oprócz komponentów DaisyUI, opencode może używać Tailwind utility classes dla layoutu i spacingu:

&lt;!-- Layout --&gt;
&lt;div class=&quot;container mx-auto p-6&quot;&gt;
&lt;div class=&quot;grid grid-cols-1 md:grid-cols-3 gap-4&quot;&gt;
&lt;div class=&quot;flex justify-between items-center&quot;&gt;
&lt;div class=&quot;flex flex-col lg:flex-row gap-6&quot;&gt;

&lt;!-- Spacing --&gt;
p-4, p-6, p-8, px-4, py-4
m-4, mx-auto, mb-6, mt-8
gap-4, gap-6, gap-8
space-y-4, space-x-4

&lt;!-- Responsywność --&gt;
grid-cols-1 md:grid-cols-2 lg:grid-cols-3
hidden md:block
w-full, w-1/2, max-w-md, max-w-lg

&lt;!-- Kolory (tylko DaisyUI semantic) --&gt;
text-base-content, text-primary, text-secondary
bg-base-100, bg-base-200, bg-primary
border-base-300, border-primary

&lt;!-- Inne --&gt;
shadow-sm, shadow-md, shadow-lg
rounded-lg, rounded-box
overflow-x-auto
sticky top-0 z-50

Krok 3.3: Generuj strony z DaisyUI

opencode run --prompt &#x27;
Stwórz prototyp HTML dla projektu &lt;projekt&gt; w katalogu /var/www/projects/&lt;projekt&gt;/.

ZASADY — WAŻNE:
1. Framework: TYLKO DaisyUI + Tailwind CSS (przez CDN)
2. Każda strona ładuje:
   &lt;link href=&quot;https://cdn.jsdelivr.net/npm/daisyui@5&quot; rel=&quot;stylesheet&quot;&gt;
   &lt;script src=&quot;https://cdn.tailwindcss.com&quot;&gt;&lt;/script&gt;
3. Używaj WYŁĄCZNIE gotowych klas DaisyUI z listy poniżej. NIE używaj inline style, NIE używaj własnego CSS, NIE pisz hexów.
4. Do layoutu używaj Tailwind utility: container mx-auto, grid grid-cols-*, flex, gap-*, p-*, m-*
5. Atrybut data-theme na &lt;html&gt; z wybranym motywem

DOZWOLONE KOMPONENTY DAISYUI:
- navbar, card card-bordered, btn btn-primary/btn-secondary/btn-ghost/btn-outline/btn-soft, btn-sm/btn-xs/btn-lg, btn-circle, btn-block
- table table-zebra, table-pin-rows, table-xs/sm/md/lg
- input input-bordered, textarea textarea-bordered, select select-bordered, checkbox, radio, toggle
- badge badge-success/badge-warning/badge-error/badge-info/badge-neutral/badge-primary/badge-secondary/badge-accent/badge-ghost
- alert alert-info/alert-success/alert-warning/alert-error
- modal (dialog), dropdown (details), tabs tabs-bordered, collapse collapse-arrow
- breadcrumbs, loading loading-spinner, progress progress-primary
- avatar, chat chat-start/chat-end, stat, tooltip, indicator
- join, kbd, countdown, timeline, steps, skeleton, carousel, btm-nav

DOZWOLONE KOLORY (TYLKO semanticzne):
- text-base-content, text-primary, text-secondary, text-accent, text-success, text-warning, text-error
- bg-base-100, bg-base-200, bg-base-300, bg-primary, bg-secondary, bg-accent, bg-success, bg-warning, bg-error
- border-base-300, border-primary

Na podstawie .superpowers/sdd/phase-3-report.md, wygeneruj:

/var/www/projects/&lt;projekt&gt;/
├── index.html               — Strona główna
├── dashboard/index.html     — Dashboard
├── sessions/index.html      — Lista sesji
├── sessions/123/index.html — Szczegóły sesji
├── profile/index.html       — Profil
├── settings/index.html      — Ustawienia

Wszystkie linki wewnętrzne prowadzą do innych stron prototypu.
Realistyczne dane mockowe.
&#x27; --auto

Krok 3.4: Przykład — strona dashboard z DaisyUI

&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;pl&quot; data-theme=&quot;emerald&quot;&gt;
&lt;head&gt;
  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
  &lt;title&gt;Dashboard — NormoCare&lt;/title&gt;
  &lt;link href=&quot;https://cdn.jsdelivr.net/npm/daisyui@5&quot; rel=&quot;stylesheet&quot;&gt;
  &lt;script src=&quot;https://cdn.tailwindcss.com&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;!-- Navbar DaisyUI --&gt;
&lt;div class=&quot;navbar bg-base-100 shadow-sm sticky top-0 z-50&quot;&gt;
  &lt;div class=&quot;flex-1&quot;&gt;
    &lt;a href=&quot;/normo/&quot; class=&quot;btn btn-ghost text-xl&quot;&gt;NormoCare&lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&quot;flex-none&quot;&gt;
    &lt;ul class=&quot;menu menu-horizontal px-1&quot;&gt;
      &lt;li&gt;&lt;a href=&quot;/normo/dashboard/&quot; class=&quot;active&quot;&gt;Dashboard&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;/normo/sessions/&quot;&gt;Sesje&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;/normo/profile/&quot;&gt;Profil&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;
        &lt;details class=&quot;dropdown&quot;&gt;
          &lt;summary class=&quot;btn btn-ghost&quot;&gt;Więcej&lt;/summary&gt;
          &lt;ul class=&quot;dropdown-content menu bg-base-100 rounded-box z-50 shadow-sm&quot;&gt;
            &lt;li&gt;&lt;a href=&quot;/normo/settings/&quot;&gt;Ustawienia&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href=&quot;/normo/help/&quot;&gt;Pomoc&lt;/a&gt;&lt;/li&gt;
          &lt;/ul&gt;
        &lt;/details&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;main class=&quot;container mx-auto p-6&quot;&gt;

  &lt;!-- Breadcrumbs --&gt;
  &lt;div class=&quot;breadcrumbs text-sm mb-4&quot;&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;/normo/&quot;&gt;Strona główna&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;Dashboard&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/div&gt;

  &lt;!-- Nagłówek --&gt;
  &lt;div class=&quot;flex justify-between items-center mb-6&quot;&gt;
    &lt;h1 class=&quot;text-3xl font-bold&quot;&gt;Dashboard&lt;/h1&gt;
    &lt;button class=&quot;btn btn-primary&quot;&gt;+ Dodaj sesję&lt;/button&gt;
  &lt;/div&gt;

  &lt;!-- Statystyki (karty DaisyUI z komponentem stat) --&gt;
  &lt;div class=&quot;grid grid-cols-1 md:grid-cols-3 gap-4 mb-6&quot;&gt;
    &lt;div class=&quot;card card-bordered bg-base-100 shadow-sm&quot;&gt;
      &lt;div class=&quot;card-body&quot;&gt;
        &lt;div class=&quot;stat&quot;&gt;
          &lt;div class=&quot;stat-title&quot;&gt;Ukończone sesje&lt;/div&gt;
          &lt;div class=&quot;stat-value text-primary&quot;&gt;12&lt;/div&gt;
          &lt;div class=&quot;stat-desc&quot;&gt;z 20 zaplanowanych&lt;/div&gt;
        &lt;/div&gt;
        &lt;progress class=&quot;progress progress-primary w-full&quot; value=&quot;60&quot; max=&quot;100&quot;&gt;&lt;/progress&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class=&quot;card card-bordered bg-base-100 shadow-sm&quot;&gt;
      &lt;div class=&quot;card-body&quot;&gt;
        &lt;div class=&quot;stat&quot;&gt;
          &lt;div class=&quot;stat-title&quot;&gt;Łączny czas&lt;/div&gt;
          &lt;div class=&quot;stat-value text-secondary&quot;&gt;24h&lt;/div&gt;
          &lt;div class=&quot;stat-desc&quot;&gt;w tym tygodniu: 4h&lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class=&quot;card card-bordered bg-base-100 shadow-sm&quot;&gt;
      &lt;div class=&quot;card-body&quot;&gt;
        &lt;div class=&quot;stat&quot;&gt;
          &lt;div class=&quot;stat-title&quot;&gt;Compliance&lt;/div&gt;
          &lt;div class=&quot;stat-value text-accent&quot;&gt;85%&lt;/div&gt;
          &lt;div class=&quot;stat-desc flex items-center gap-1&quot;&gt;
            &lt;span class=&quot;badge badge-success badge-sm&quot;&gt;+5%&lt;/span&gt;
            vs poprzedni miesiąc
          &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;!-- Tabela sesji (DaisyUI table-zebra) --&gt;
  &lt;div class=&quot;card card-bordered bg-base-100 shadow-sm&quot;&gt;
    &lt;div class=&quot;card-body&quot;&gt;
      &lt;h2 class=&quot;card-title&quot;&gt;Ostatnie sesje&lt;/h2&gt;
      &lt;div class=&quot;overflow-x-auto&quot;&gt;
        &lt;table class=&quot;table table-zebra&quot;&gt;
          &lt;thead&gt;
            &lt;tr&gt;
              &lt;th&gt;Data&lt;/th&gt;
              &lt;th&gt;Czas&lt;/th&gt;
              &lt;th&gt;Ciśnienie&lt;/th&gt;
              &lt;th&gt;Wynik&lt;/th&gt;
              &lt;th&gt;Status&lt;/th&gt;
              &lt;th&gt;&lt;/th&gt;
            &lt;/tr&gt;
          &lt;/thead&gt;
          &lt;tbody&gt;
            &lt;tr&gt;
              &lt;td&gt;2026-07-20&lt;/td&gt;
              &lt;td&gt;60 min&lt;/td&gt;
              &lt;td&gt;1500 hPa&lt;/td&gt;
              &lt;td&gt;Bardzo dobry&lt;/td&gt;
              &lt;td&gt;&lt;span class=&quot;badge badge-success&quot;&gt;Ukończona&lt;/span&gt;&lt;/td&gt;
              &lt;td&gt;&lt;button class=&quot;btn btn-ghost btn-sm&quot;&gt;Szczegóły&lt;/button&gt;&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
              &lt;td&gt;2026-07-18&lt;/td&gt;
              &lt;td&gt;45 min&lt;/td&gt;
              &lt;td&gt;1500 hPa&lt;/td&gt;
              &lt;td&gt;Dobry&lt;/td&gt;
              &lt;td&gt;&lt;span class=&quot;badge badge-success&quot;&gt;Ukończona&lt;/span&gt;&lt;/td&gt;
              &lt;td&gt;&lt;button class=&quot;btn btn-ghost btn-sm&quot;&gt;Szczegóły&lt;/button&gt;&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
              &lt;td&gt;2026-07-16&lt;/td&gt;
              &lt;td&gt;60 min&lt;/td&gt;
              &lt;td&gt;1500 hPa&lt;/td&gt;
              &lt;td&gt;Średni&lt;/td&gt;
              &lt;td&gt;&lt;span class=&quot;badge badge-warning&quot;&gt;Przerwana&lt;/span&gt;&lt;/td&gt;
              &lt;td&gt;&lt;button class=&quot;btn btn-ghost btn-sm&quot;&gt;Szczegóły&lt;/button&gt;&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
              &lt;td&gt;2026-07-14&lt;/td&gt;
              &lt;td&gt;30 min&lt;/td&gt;
              &lt;td&gt;1500 hPa&lt;/td&gt;
              &lt;td&gt;Słaby&lt;/td&gt;
              &lt;td&gt;&lt;span class=&quot;badge badge-error&quot;&gt;Anulowana&lt;/span&gt;&lt;/td&gt;
              &lt;td&gt;&lt;button class=&quot;btn btn-ghost btn-sm&quot;&gt;Szczegóły&lt;/button&gt;&lt;/td&gt;
            &lt;/tr&gt;
          &lt;/tbody&gt;
        &lt;/table&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;!-- Alert informacyjny --&gt;
  &lt;div class=&quot;alert alert-info mt-6&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;stroke-current shrink-0 w-6 h-6&quot;&gt;
      &lt;path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot; d=&quot;M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z&quot;&gt;&lt;/path&gt;
    &lt;/svg&gt;
    &lt;span&gt;Następna sesja: 2026-07-22, 10:00. Nie zapomnij potwierdzić obecności.&lt;/span&gt;
  &lt;/div&gt;

&lt;/main&gt;

&lt;!-- Footer --&gt;
&lt;footer class=&quot;footer footer-center p-4 bg-base-200 text-base-content/60 mt-8&quot;&gt;
  &lt;p&gt;Prototyp v4 — DaisyUI | data-theme=&quot;emerald&quot;&lt;/p&gt;
&lt;/footer&gt;

&lt;/body&gt;
&lt;/html&gt;

Krok 3.5: Weryfikacja spójności

# 1. Sprawdź czy wszystkie strony ładują DaisyUI
for f in $(find /var/www/projects/&lt;projekt&gt;/ -name &#x27;index.html&#x27;); do
  has_daisy=$(grep -c &#x27;daisyui&#x27; &quot;$f&quot; || true)
  [ &quot;$has_daisy&quot; -eq 0 ] &amp;&amp; echo &quot;❌ $f — brak DaisyUI&quot;
done

# 2. Sprawdź czy są twarde kolory (hex/RGB) — powinno być 0
for f in $(find /var/www/projects/&lt;projekt&gt;/ -name &#x27;index.html&#x27;); do
  hard=$(grep -cE &#x27;#[0-9a-fA-F]{3,6}&#x27; &quot;$f&quot; || true)
  [ &quot;$hard&quot; -gt 2 ] &amp;&amp; echo &quot;⚠️  $f — $hard hexów (użyj klas DaisyUI: text-primary, bg-base-100)&quot;
done

# 3. Sprawdź czy któryś plik ma własny CSS lub inline style
for f in $(find /var/www/projects/&lt;projekt&gt;/ -name &#x27;index.html&#x27;); do
  inline=$(grep -c &#x27;style=&quot;&#x27; &quot;$f&quot; || true)
  [ &quot;$inline&quot; -gt 0 ] &amp;&amp; echo &quot;⚠️  $f — $inline inline style (zastąp klasami DaisyUI)&quot;
  style_tag=$(grep -c &#x27;&lt;style&gt;&#x27; &quot;$f&quot; || true)
  [ &quot;$style_tag&quot; -gt 0 ] &amp;&amp; echo &quot;⚠️  $f — ma własny &lt;style&gt; tag (usuń, użyj DaisyUI)&quot;
done

# 4. Sprawdź HTTP 200
for path in /dashboard /sessions /sessions/123 /profile /settings; do
  code=$(curl -s -o /dev/null -w &quot;%{http_code}&quot; --max-time 5 &quot;https://10s.pl/&lt;projekt&gt;$path/&quot;)
  echo &quot;$path → HTTP $code&quot;
done

Faza 4: Prototyp do klikania

Krok 4.1: Raport do zatwierdzenia

hermes kanban --board convertere comment &lt;card-id&gt; \
  &quot;[CEO] ✅ Prototyp v4 gotowy do klikania:
Motyw: emerald (DaisyUI)
Stack: DaisyUI + Tailwind CSS przez CDN

Strony:
- https://10s.pl/&lt;projekt&gt;/
- https://10s.pl/&lt;projekt&gt;/dashboard/
- https://10s.pl/&lt;projekt&gt;/sessions/
- https://10s.pl/&lt;projekt&gt;/sessions/123/
- https://10s.pl/&lt;projekt&gt;/profile/
- https://10s.pl/&lt;projekt&gt;/settings/

Weryfikacja:
✅ Wszystkie strony HTTP 200
✅ Wszystkie linki wewnętrzne działają
✅ Brak hexów/twardych kolorów
✅ Brak własnego CSS — tylko DaisyUI
✅ Zmiana wyglądu = zmiana data-theme na &lt;html&gt;
⏳ Czekam na zatwierdzenie przed backendem&quot;

Krok 4.2: Iteracja — zmiana motywu

To jest supermoc v4. Użytkownik mówi "zmień na dark":

# 1 komenda zmienia CAŁY prototyp
sed -i &#x27;s/data-theme=&quot;emerald&quot;/data-theme=&quot;dark&quot;/&#x27; /var/www/projects/&lt;projekt&gt;/*/index.html
sed -i &#x27;s/data-theme=&quot;emerald&quot;/data-theme=&quot;dark&quot;/&#x27; /var/www/projects/&lt;projekt&gt;/index.html

# Weryfikacja — wszystkie strony w nowym motywie
curl -s https://10s.pl/&lt;projekt&gt;/dashboard/ | grep -o &#x27;data-theme=&quot;[^&quot;]*&quot;&#x27;
# → data-theme=&quot;dark&quot;

Bez zmiany HTML (poza 1 atrybutem), bez regeneracji, bez błędów.


Faza 5: Backend z DaisyUI

Backend używa tego samego DaisyUI — żadnych nowych zależności CSS.

Krok 5.1: Kopiuj szablon

# Skopiuj gotową stronę jako szablon bazowy
cp /var/www/projects/&lt;projekt&gt;/dashboard/index.html \
  /root/projects/&lt;projekt&gt;/src/templates/base.html

# Wyciągnij navbar i footer do osobnych plików (w zależności od frameworka)

Krok 5.2: Implementacja z DaisyUI

opencode run --prompt &#x27;
Zaimplementuj backend dla projektu &lt;projekt&gt;.

ZACHOWAJ DAISYUI:
1. Użyj TEGO SAMEGO DaisyUI + Tailwind co prototyp
2. Użyj TYCH SAMYCH klas: navbar, card, btn, table table-zebra, input input-bordered, badge, alert, modal, dropdown, tabs, progress, stat, breadcrumbs
3. ŻADNYCH nowych styli CSS — tylko DaisyUI
4. Szablon bazowy: base.html z navbar, footer i DaisyUI CDN
5. data-theme to samo co w prototypie

Na podstawie .superpowers/sdd/phase-2-report.md:
- API endpoints
- Baza danych
- Integracja frontend-backend

Po implementacji: zweryfikuj HTTP 200 dla wszystkich stron.
&#x27; --auto

Porównanie v1 → v2 → v3 → v4

Aspektv1v2v3v4 ✅
Obrazki3 opcjeUsunięteUsunięteUsunięte
Brainstorming20+ pytań20+ pytań
CSSRęcznytheme.css3 frameworkiZero CSS — tylko DaisyUI
KomponentyWłasne klasyDaisyUI lub inne30+ DaisyUI
Motywy3 własne30+ DaisyUI30+ DaisyUI
Zmiana wygląduRegeneracja1 plik CSSdata-themedata-theme
Własny CSSTakTakMożliwyZakazany
Gotowe puzzelkiKażdy komponent to gotowa klasa
Hex colorsWszędzieRzadziejMożliweZabronione — tylko semanticzne klasy
Inline styleCzęstoRzadziejMożliweZabronione
KonfiguracjaCDN — 2 linie, zero instalacji

Playbook: 30-minutowy Builder Flow v4

Przygotowanie (2 min):

Brainstorming (5 min):

Specyfikacja (8 min):

Design System — DaisyUI (2 min):

HTML mockupy (10 min):

Weryfikacja (3 min):


Ryzyka i wyzwania

Ryzyko 1: Opencode pisze własny CSS zamiast DaisyUI

Najczęstszy błąd — opencode dodaje style="color: #333" zamiast class="text-base-content".

Rozwiązanie: W promptu CEO dodaje: "NIE używaj style="" ani hexów. NIE twórz własnych klas CSS. Używaj TYLKO klas DaisyUI. Jeśli nie wiesz jak zrobić coś w DaisyUI — pomiń to, zamiast dodawać własny CSS."

Ryzyko 2: Opencode nie zna DaisyUI

kimi-k2-7-code może nie mieć w treningu najnowszej wersji DaisyUI.

Rozwiązanie: CEO wkleja do prompta pełną listę komponentów (patrz sekcja 3.1). Daje to opencode dokładną mapę dostępnych klas.

Ryzyko 3: CDN DaisyUI nie działa

Jeśli serwer nie ma dostępu do internetu, strony się nie ładują.

Rozwiązanie: Przed generowaniem sprawdź: curl -s -o /dev/null https://cdn.jsdelivr.net/npm/daisyui@5/dist/full.min.css. Jeśli nie działa → użyj lokalnego CDN lub npm.

Ryzyko 4: data-theme nie działa na podstronach

Jeśli <html> ma data-theme, ale jakaś podstrona go nadpisuje — motyw nie jest spójny.

Rozwiązanie: CEO weryfikuje: grep -r 'data-theme' /var/www/projects/<projekt>/. Wszystkie strony powinny mieć ten sam motyw.

Ryzyko 5: DaisyUI v5 vs v4 różnice

DaisyUI zmienia API między wersjami. v4 → v5 zmieniło system theme.

Rozwiązanie: CEO sprawdza wersję: curl -s https://cdn.jsdelivr.net/npm/daisyui@5/package.json | grep '"version"'. Prompt używa wersji z CDN.


Mierzenie sukcesu

MetrykaTargetJak mierzyć
Pytania w brainstromingu≥ 20grep -c '?' brainstorming-report.md
DaisyUI załadowany na każdej stronie100%grep -c 'daisyui' /var/www/projects/*/index.html
Brak hexów (twardych kolorów)0`grep -cE '#[0-9a-f]{3,6}' /var/www/projects/*/index.html \\true`
Brak inline style0`grep -c 'style="' /var/www/projects/*/index.html \\true`
Brak własnego CSS0`grep -c '