Przegląd

noski — noski to polska usługa, w której asystent AI prowadzi marketing małej firmy, a właściciel podejmuje decyzje — najczęściej na telefonie, między innymi obowiązkami. System ma sprawić, że każda decyzja jest jedna, jasna i ma znaną cenę.

Projektuj mobile first od 360px. Komponenty są w window.Noski (React 18). Kolory, typografia, odstępy i wymiary — tylko przez tokeny.

Zasady produktu w interfejsie

  1. Asystent prowadzi. Każdy ekran kończy się następnym krokiem zaproponowanym przez asystenta (ChatMessage + Button variant="accent"). Nie pytaj o to, co produkt już wie.
  2. Jedna decyzja naraz. Wybór = DecisionCard, najwyżej 3 opcje, jedna recommended. Nigdy dwie karty decyzji na jednym ekranie.
  3. Cztery osobne zgody. Propozycja → zgoda na koszt (CostApproval) → ocena materiału (przyciski akceptacji / poprawek) → zgoda na publikację (PublishApproval). Żaden przycisk nie łączy dwóch z nich. Akceptacja materiału nie uruchamia wydatku ani publikacji — mów to wprost po akceptacji.
  4. Koszt przed pracą. Przed płatnym działaniem klient widzi kwotę, źródło (prepaid albo pula abonamentu) i saldo po. Kwota jest w etykiecie przycisku.
  5. Prawdziwy stan. Praca w tle = TaskProgress ze stanem queued, running, needs-action, done albo failed. Nie udawaj postępu. Brak danych = „Brak danych” + powód, nigdy 0.
  6. Własne pliki to możliwość, nie wymóg. Puste stany zapraszają do rozmowy, nie do uploadu.
  7. Prywatność linków. Ekran z prywatnego linku pokazuje Notice tone="locked": widać tylko ten materiał.

Język i treść

  • Po polsku, na „Ty”, krótko. Asystent mówi w 1. osobie liczby pojedynczej („Przygotowałem”, „Polecam”).
  • Nazwy działań opisują rezultat: „Zaplanuj publikację”, „Zatwierdź koszt 49,00 zł”, „Poproś o zmiany”. Nie: „Generuj”, „Submit”, „Uruchom workflow”.
  • Bez żargonu: nie „prompt”, „model”, „render”, „token”, „AI-generated”. Tak: „asystent przygotuje”, „film”, „grafika”.
  • Nie wymieniaj dostawców technicznych. Platformy społecznościowe i ich ekrany logowania nazywaj prawdziwie (Instagram, Facebook, TikTok, Google).
  • Marka: zawsze „noski — noski” (małe litery, pauza ze spacjami). Archiwum dawnego sklepu dziecięcego to osobny obszar „noski noski” — nie używaj tego systemu do jego treści bez osobnej decyzji.
  • Liczby: 4 812, 3,1%, 49,00 zł, daty „pt 13 grudnia, 18:00”. Czas 24-godzinny.
  • Bez emoji w interfejsie. Wykrzykniki tylko w treściach postów klienta.
  • Błąd = co się stało + co zrobić + co z pieniędzmi. Bez kodów błędów.

Przykłady z produktu:

Znam Twoje menu i to, że jest wegańskie. Ostatni post był 3 tygodnie temu. Mam trzy możliwości — polecam pierwszą.

Materiał zaakceptowany. Nic nie zostało opublikowane ani pobrane.

Instagram nie przyjął publikacji. Połączenie z kontem wygasło. Post czeka — opublikujemy go zaraz po ponownym połączeniu.

Kolor

  • Tło ekranu surface; karty, arkusze, dymki asystenta surface-raised; tło rozmowy i podglądów surface-sunken.
  • Tekst ink; pomocniczy ink-muted (≥4.5:1 na wszystkich trzech powierzchniach w obu motywach).
  • Paleta: chłodna, lekko zielonkawa biel (surface), ciemnozielony tekst (ink), butelkowa zieleń jako kolor działania (action) i Morela z logo jako akcent (brand). Żadnych kremowych, beżowych ani „kawowych” teł.
  • Główne działanie: wypełnienie action (butelkowa zieleń) z tekstem on-action; w ciemnym motywie jasna mięta z ciemnym tekstem. Dymek klienta w rozmowie też action.
  • Marka — Morela brand: awatar asystenta, przycisk accent przy rekomendacji, aktywna zakładka (brand-soft + brand-ink), licznik w TabBar. Tekst na brand zawsze on-brand. W jasnym motywie brand nie jest kolorem tekstu ani obrysu — do tego brand-ink.
  • Statusy: success, warning, danger, info z tłami *-soft. Status zawsze ma ikonę i słowo, kolor nigdy nie jest jedynym nośnikiem. brand nie oznacza żadnego statusu.
  • Obrysy: line dekoracyjnie, line-strong dla kontrolek (≥3:1).
  • Fokus: outline: 2px solid var(--focus) z odstępem 2px — na każdym elemencie interaktywnym.
  • Motywy: light (domyślny) i dark, według ustawień systemu.

Typografia

  • Dwie rodziny z Google Fonts (latin-ext — pełne polskie znaki): Rubik 600 (display) do nagłówków i kwot — ten sam krój co logo, oraz Hanken Grotesk (sans) 400/600 do całego interfejsu.
  • Wyłącznie kroje bezszeryfowe. Nie używaj szeryfowych nagłówków.
  • display — tylko strona publiczna i powitanie. headline — tytuł ekranu zakładki. title — karta, arkusz, pytanie decyzji. amount — kwoty i liczby, cyfry tabelaryczne.
  • Czytelność numer 1 — duży tekst. body 18/28 to domyślny tekst interfejsu, body-lg 20/30 — wiadomości w rozmowie. label 17 — przyciski i etykiety pól. caption 15 — metadane w ink-muted. micro 13 — najmniejszy rozmiar w aplikacji; nic mniejszego.
  • Nagłówki (display, headline, title) zostają w dotychczasowych rozmiarach — hierarchię buduje grubość i krój, nie skok rozmiaru.
  • Pola tekstowe 18px (iOS nie powiększa przy ≥16px). Bez wersalików w nagłówkach i etykietach.

Odstępy, rozmiary, kształt

  • Siatka 4px: space-1…space-12. Margines boczny ekranu space-4, od 600px space-6. Między sekcjami space-6, w karcie space-3.
  • Dotyk: każdy element interaktywny ≥ tap-min (44px). Główny przycisk control-h (52px), pełna szerokość, w doku na dole ekranu.
  • Paski: bar-h (TopBar), tabbar-h (TabBar) + safe area. Kolumna treści maks. content-max na tablecie i desktopie.
  • Promienie: radius-sm pola i miniatury, radius-md karty i dymki, radius-lg arkusze i karty zgód, radius-pill przyciski, plakietki, kompozytor.
  • Cienie tylko shadow-raised (kompozytor, pływający dok) i shadow-sheet (arkusz dolny). Karty w treści — obrys line, bez cienia.

Ruch

  • Krótko i funkcjonalnie: 150–250 ms, ease-out. Arkusze wjeżdżają z dołu.
  • Animacje ładowania (szkielet, pasek nieokreślony, spinner) wyłączają się przy prefers-reduced-motion.

Ikony

  • Zestaw liniowy 24px w komponencie Icon (32 ikony, window.Noski.icons), obrys 1.75, currentColor. Rysowany dla tego systemu — nie ma zewnętrznej biblioteki.
  • spark = asystent AI i tylko on.
  • Ikona bez tekstu zawsze z etykietą (IconButton label). Bez emoji, bez ikon wypełnionych.

Logo

  • Logo główne: noski-noski-poziome-kolor-na-jasne.svg — czarny napis (#17161A) z pomarańczowym myślnikiem (Morela, #FF6B3D), na białym albo przezroczystym tle. Używaj go zawsze, gdy nic nie stoi na przeszkodzie. Wszystkie pozostałe pliki to wersje dodatkowe, tylko gdy główna nie zadziała (ciemne tło, kwadratowe miejsce, druk jednobarwny).
  • Logo to napis „noski — noski” w kroju Rubik 600, z długim myślnikiem w kolorze brand. Litery są zamienione na krzywe. Pliki są w grupie zasobów Logos; nigdy nie składaj logo fontem ani nie rysuj go od nowa.
  • Dwa układy: poziome (domyślne: nagłówki, stopki, strona) i kwadrat (noski / — / noski: avatary, ikona aplikacji, miejsca kwadratowe).
  • Wersja z claimem „marketing dla firm” (Rubik 400): w poziomej claim jest wyrównany do prawej krawędzi logo, w kwadracie ma szerokość napisu „noski”. Claim używaj tam, gdzie marka występuje pierwszy raz (strona publiczna, materiały zewnętrzne); w aplikacji wystarczy logo bez claimu.
  • Wersje dodatkowe: kolor-na-ciemne na ciemnym tle, czarne / biale do druku jednobarwnego i na zdjęciach, morela tylko na neutralnym jasnym tle.
  • Pole ochronne: wokół logo zostaw co najmniej wysokość litery „n”. Minimalna szerokość poziomego: 96px (bez claimu), 160px (z claimem).

Struktura aplikacji

  • Nawigacja główna TabBar: Start · Asystenci · Materiały · Wyniki · Twoja Firma. Abonament, rozliczenia, konsultacje i pomoc są w Twojej Firmie.
  • Ekran zakładki: TopBar large. Ekran szczegółu: TopBar back.
  • Rozmowa: tło surface-sunken, ChatMessage, pod wiadomością asystenta DecisionCard / CostApproval / PublishApproval, na dole Composer.
  • Strona publiczna i panel operatora używają tych samych tokenów; operator może mieć gęstszy układ (body, space-3), ale te same komponenty statusu.

Stany pracy

Każdy widok, który ładuje dane albo czeka na pracę, projektuj we wszystkich stanach poniżej. Brakujący stan = niedokończony projekt.

Stan Komponent Treść
Brak danych / pusto EmptyState; w liczbach StatCard missing Co się tu pojawi + jeden krok do asystenta. W statystykach „Brak danych” + powód.
Oczekiwanie (do ~2 s) Skeleton Kształt przyszłej treści. Bez pełnoekranowego spinnera.
Kolejka TaskProgress state="queued" Kiedy ruszy.
Postęp TaskProgress state="running" Pasek określony tylko przy znanym postępie; szacowany czas w detail. Informacja, że można zamknąć aplikację.
Decyzja klienta TaskProgress state="needs-action", DecisionCard, CostApproval, PublishApproval Jedna decyzja, jedno działanie. Licznik w TabBar liczy tylko te rzeczy.
Sukces Notice tone="success", StatusBadge Co się stało + czego to NIE oznacza („nic nie zostało opublikowane”).
Błąd Notice tone="danger", TaskProgress state="failed", StatusBadge status="failed" Co się stało, co zrobić, co z pieniędzmi. Zawsze działanie naprawcze.
Brak dostępu Notice tone="locked" Co widać, czego nie, jak uzyskać dostęp (zaloguj się / poproś właściciela).
Za mało środków CostApproval insufficient Doładuj saldo; nic nie zostanie pobrane bez zgody.

Pieniądze w stanach

  • Rezerwacja ≠ pobranie. Po zgodzie: „Zarezerwowano 49,00 zł”. Po wykonaniu: „Pobrano”. Po błędzie: „Środki nie zostały pobrane” albo „Wróciły na saldo”.
  • Pula materiałów marki liczy zmiany („1 z 5”), prepaid liczy złotówki. Nie mieszaj jednostek w jednej karcie.

Dostępność

  • Kontrast tekstu ≥4.5:1 (≥3:1 dla 24px+ i kontrolek) w obu motywach — tokeny są dobrane tak, by pary z ich opisów to spełniały.
  • Obszar dotyku ≥44px, główne działania w zasięgu kciuka (dok na dole).
  • Prawdziwe elementy: button, a href, input z label, radio w DecisionCard.
  • Komunikaty danger/warning jako role="alert", pozostałe role="status"; postęp jako progressbar.
  • Kolor nigdy sam: status = ikona + słowo.

Kolory

surface

light: #F2F6F3 · dark: #0F1714

Tło ekranu aplikacji i strony publicznej — chłodna, lekko zielonkawa biel.

surface-raised

light: #FFFFFF · dark: #17211D

Karty, arkusze dolne, dymki asystenta, pola formularzy.

surface-sunken

light: #E4ECE6 · dark: #0A100E

Wnęki: tło rozmowy, podglądy plików, szkielety ładowania, pasek kompozytora.

line

light: #D1DCD4 · dark: #2A3631

Linie podziału i obrys kart. Dekoracyjne — nie jedyny nośnik informacji.

line-strong

light: #7A8B7F · dark: #6E7E76

Obrys pól, checkboxów i przycisku secondary. Min. 3:1 do surface i surface-raised w obu motywach.

ink

light: #0D221A · dark: #EEF3EF

Tekst główny i ikony na surface, surface-raised, surface-sunken.

ink-muted

light: #4A5C52 · dark: #A7B5AD

Tekst pomocniczy, metadane, podpowiedzi pól — na wszystkich trzech powierzchniach (≥4.5:1).

action

light: #0F4A37 · dark: #8ED3B0

Butelkowa zieleń — wypełnienie przycisku primary, dymek klienta w rozmowie, zaznaczona opcja. Główne działanie ekranu. W ciemnym motywie jasna mięta z ciemnym tekstem.

on-action

light: #FFFFFF · dark: #0D221A

Tekst i ikony na wypełnieniu action (biały / ciemnozielony).

brand

light: #FF6B3D · dark: #FF7A50

Morela — kolor myślnika w logo. Wypełnienia: awatar asystenta, przycisk accent (rekomendacja), licznik w TabBar. W jasnym motywie NIE jako tekst ani obrys (2.6:1 do surface) — do tekstu brand-ink.

on-brand

light: #0D221A · dark: #0D221A

Tekst i ikony na wypełnieniu brand. Nigdy biały.

brand-soft

light: #FFE6DC · dark: #3A1C12

Tło wyróżnienia: rekomendowana opcja, dymek propozycji asystenta, plakietka „Polecane”.

brand-ink

light: #B23A12 · dark: #FF9A78

Tekst w barwie marki na surface, surface-raised i brand-soft; linki w treści.

success

light: #1F7A2E · dark: #74D68F

Sukces, „Zatwierdzone”, „Opublikowane”. Zawsze z ikoną check i słowem — odcieniem jest bliski action, więc kolor nigdy nie jest jedynym nośnikiem.

success-soft

light: #DFF3E2 · dark: #0F2B1B

Tło plakietek i komunikatów sukcesu.

warning

light: #8F4B00 · dark: #F2B45A

Wymaga decyzji klienta, niski limit, termin blisko. Tekst/ikona na surface-raised i warning-soft.

warning-soft

light: #FFF0D6 · dark: #2E1E06

Tło komunikatów i plakietek „Czeka na Ciebie”.

danger

light: #B4232B · dark: #FF8A8A

Błąd, odrzucenie, nieudana publikacja/płatność. Tekst/ikona na surface-raised i danger-soft. Zawsze z ikoną alert i słowem.

danger-soft

light: #FCE4E4 · dark: #3A1214

Tło komunikatów błędów.

info

light: #1F5FBF · dark: #8AB4FF

Informacja neutralna, zadanie w toku, pasek postępu. Tekst/ikona na surface-raised i info-soft.

info-soft

light: #E3ECFB · dark: #13213A

Tło komunikatów informacyjnych i zadań w tle.

focus

light: #1F5FBF · dark: #8AB4FF

Pierścień fokusu klawiatury: 2px odstępu w kolorze tła + 2px pełnej linii focus. ≥3:1 na każdej powierzchni w obu motywach.

scrim

light: rgba(23, 22, 26, 0.48) · dark: rgba(0, 0, 0, 0.64)

Przyciemnienie pod arkuszem dolnym i dialogiem.

Typografia

display

display · 40px/44px · 600

Tylko strona publiczna i ekrany powitalne. Jeden na ekran. Rubik — ten sam krój co logo.

Zadbajmy o Twoją firmę

headline

display · 28px/34px · 600

Tytuł ekranu w aplikacji (TopBar large).

Twoja Firma

title

display · 20px/26px · 600

Tytuł karty, arkusza, sekcji.

Seria postów na grudzień

amount

display · 28px/32px · 600

Kwoty i liczby w statystykach (StatCard, CostApproval). Cyfry tabelaryczne.

149,00 zł

body-lg

sans · 20px/30px · 400

Wiadomości asystenta i klienta w rozmowie.

Przygotowałem trzy pomysły na posty o nowym menu.

body

sans · 18px/28px · 400

Domyślny tekst interfejsu.

Post zostanie opublikowany na Instagramie w piątek o 18:00.

body-strong

sans · 18px/28px · 600

Wyróżnienie w akapicie, nazwa opcji w DecisionCard.

Wersja 2 · Instagram

label

sans · 17px/22px · 600

Etykiety przycisków i pól, zakładki.

Zatwierdź koszt

caption

sans · 15px/22px · 400

Metadane, podpowiedzi pól, czas. Kolor ink-muted.

Zaktualizowano 5 min temu

micro

sans · 13px/18px · 600

Plakietki statusu, etykiety TabBar. Najmniejszy rozmiar w aplikacji — nic poniżej 13px.

Do oceny

Odstępy, promienie, rozmiary, cienie

Odstępy

space-14pxOdstęp ikona–tekst w plakietce.
space-28pxOdstęp ikona–etykieta w przycisku, między plakietkami.
space-312pxOdstęp między elementami w karcie, między dymkami rozmowy.
space-416pxMargines boczny ekranu mobilnego, padding kart.
space-520pxPadding arkusza dolnego i kart decyzji.
space-624pxOdstęp między sekcjami ekranu; margines boczny od 600px szerokości.
space-832pxOdstęp między grupami sekcji, góra pustego stanu.
space-1248pxRytm sekcji strony publicznej (mobile).

Promienie

radius-sm8pxPola formularzy, miniatury, plakietki kwadratowe.
radius-md14pxKarty, komunikaty, dymki rozmowy.
radius-lg24pxArkusz dolny (górne rogi), duże karty podglądu materiału.
radius-pill999pxPrzyciski, plakietki statusu, chipy, kompozytor.

Rozmiary

tap-min44pxMinimalny obszar dotyku każdego elementu interaktywnego (także IconButton).
control-h52pxWysokość przycisku size=lg i pola tekstowego — główne działanie ekranu.
control-h-sm44pxWysokość przycisku size=md, chipów.
bar-h56pxWysokość TopBar.
tabbar-h64pxWysokość TabBar (bez safe area).
content-max640pxMaks. szerokość kolumny treści w aplikacji na tablecie/desktopie.

Cienie

shadow-raisedKarty unoszące się nad treścią: kompozytor, pływający pasek decyzji.
shadow-sheetArkusz dolny i dialog.

Komponenty

Icon

Ikony liniowe 24×24, obrys 1.75px, zaokrąglone końce; kolor dziedziczą z color.

  • Podajesz name (lista: window.Noski.icons) i opcjonalnie size (16 w plakietkach i podpowiedziach, 20 w przyciskach, 22 w nawigacji, 24 domyślnie).
  • Ikona dekoracyjna obok tekstu: bez label (dostaje aria-hidden). Ikona jako jedyny nośnik treści: zawsze label.
  • spark oznacza wyłącznie asystenta AI. Nie używaj go jako ozdobnika „nowości”.
  • Nie mieszaj z emoji ani ikonami wypełnionymi.

Button

Przycisk działania. Etykieta mówi, co się stanie — nazwa rezultatu, nie mechanizmu.

Podajesz: children (etykieta), variant, size, opcjonalnie icon, iconEnd, loading, block, onClick.

variant kiedy
primary Jedno główne działanie ekranu lub karty. Maks. jeden na widoku.
accent Wybór polecany przez asystenta, gdy stoi obok innych opcji. Tło brand, tekst on-brand.
secondary Działanie alternatywne (Poproś o zmiany, Zmień termin).
ghost Odroczenie lub wyjście (Nie teraz, Pomiń).
danger Odwracalne tylko z wysiłkiem: anulowanie, usunięcie, odłączenie konta.
  • Na telefonie główne działanie: size="lg" + block, przyklejone na dole ekranu nad TabBar.
  • Etykiety: czasownik + rezultat. Tak: „Zatwierdź koszt 49 zł”, „Zaplanuj publikację”. Nie: „OK”, „Wyślij”, „Generuj”.
  • Płatne działanie zawsze pokazuje kwotę w etykiecie.
  • loading blokuje przycisk i zachowuje szerokość. Zmień etykietę na stan („Zapisuję…”).
  • disabled tylko gdy obok widać powód. Lepiej zostawić aktywny i wyjaśnić po kliknięciu.

IconButton

Okrągły przycisk z samą ikoną, obszar dotyku 44×44 (tap-min).

  • Podajesz icon i obowiązkowo label (czytany przez czytnik ekranu i pokazany jako podpowiedź).
  • Tylko dla działań o oczywistej ikonie: wróć, więcej, pobierz, wyślij, zamknij. Wszystko inne — Button z tekstem.
  • variant="solid" wyłącznie dla „Wyślij” w kompozytorze.

TextField

Pole tekstowe z etykietą nad polem, podpowiedzią i błędem pod nim.

Podajesz: label (zawsze widoczna — placeholder nie zastępuje etykiety), opcjonalnie hint, error, optional, multiline, oraz zwykłe atrybuty input.

  • Rozmiar tekstu w polu 18px — iOS nie przybliża ekranu.
  • Domyślnie pola są wymagane; dopisek „(opcjonalnie)” przy pozostałych.
  • Błąd mówi, jak naprawić, nie co jest źle: „Wpisz pełny adres, np. …”. Pokazuj po opuszczeniu pola, nie przy każdym znaku.
  • Formularze to wyjątek: asystent zbiera informacje w rozmowie. Pola tylko do danych twardych (logowanie, płatność, dane do faktury).

Badge

Krótka etykieta (1–3 słowa) przy elemencie: platforma, kategoria, ton.

  • Podajesz tone i children, opcjonalnie icon.
  • Ton niesie znaczenie, nigdy dekorację. Każdy ton inny niż neutral ma ikonę — kolor nie może być jedynym nośnikiem.
  • brand + spark = rekomendacja asystenta („Polecam”). Nic innego.
  • Statusy materiałów i publikacji — użyj StatusBadge, nie składaj ich ręcznie.

StatusBadge

Jedyny sposób pokazania stanu materiału lub publikacji — stały słownik, ikona i kolor.

status etykieta znaczenie
draft Szkic Asystent przygotowuje propozycję, nic nie kosztuje.
working W przygotowaniu Trwa płatna produkcja (zgoda na koszt już udzielona).
review Do oceny Klient ma ocenić materiał.
changes Poprawki Klient poprosił o zmiany.
approved Zatwierdzone Materiał zaakceptowany. Nie oznacza publikacji.
scheduled Zaplanowane Konkretna wersja ma termin i konto.
published Opublikowane Jest na koncie.
failed Błąd publikacji Platforma odrzuciła — zawsze z Notice i działaniem naprawczym.
paused Wstrzymane Automatyzacja zatrzymana przez klienta lub operatora.
  • Podajesz status. Własną etykietę (children) tylko gdy słownik nie wystarcza — z tą samą ikoną.

Notice

Komunikat w treści ekranu: informacja, sukces, ostrzeżenie, błąd, brak dostępu.

Podajesz: tone, title (zdanie, które wystarczy przeczytać), opcjonalnie children (szczegół) i action (jeden Button size="md").

  • info — stan pracy w tle, wyjaśnienie. success — potwierdzenie po działaniu. warning — potrzebna decyzja lub limit blisko. danger — coś się nie udało. locked — brak dostępu.
  • Błąd = co się stało + co zrobić. Zawsze z działaniem naprawczym, jeśli istnieje. Bez kodów błędów i nazw dostawców technicznych.
  • danger i warning są ogłaszane czytnikom ekranu (role="alert"), pozostałe jako status.
  • Maks. jeden Notice danego tonu na ekranie.

TaskProgress

Zadanie wykonywane w tle — pokazuje rzeczywisty stan, rezultat lub potrzebę działania klienta.

Podajesz: title (co powstaje, językiem rezultatu), state, opcjonalnie progress (0–100, tylko gdy znany), detail, action.

state etykieta kiedy
queued W kolejce Zadanie przyjęte, jeszcze nie ruszyło.
running W toku Pasek: określony, gdy znamy postęp; nieokreślony, gdy nie.
needs-action Czeka na Ciebie Bez klienta zadanie nie pójdzie dalej. Zawsze z action.
done Gotowe Z działaniem do rezultatu.
failed Nie udało się detail mówi, co się stało i czy pobrano środki. Zawsze z action.
  • Nigdy nie udawaj postępu. Brak procentu = pasek nieokreślony + szacowany czas w detail, jeśli znany.
  • Po failed zawsze informuj o pieniądzach: pobrano / nie pobrano / zwrócono.

Skeleton

Szkielet treści na czas ładowania (do ~2 s). Dłużej — TaskProgress lub komunikat.

  • Podajesz lines, opcjonalnie media (blok podglądu) i label dla czytnika.
  • Kształt odpowiada treści, która się pojawi. Nie używaj spinnera na całym ekranie.
  • Przy prefers-reduced-motion szkielet nie pulsuje.

EmptyState

Pusty widok: brak materiałów, rozmów, publikacji, danych.

Podajesz: icon, title (co tu będzie), children (jak to się pojawi), action (jeden krok, najczęściej do asystenta).

  • Pusty stan to zaproszenie, nie błąd. Mów, co się tu pojawi i co zrobi asystent.
  • Nigdy nie wymagaj od klienta przygotowania plików, tekstów czy pomysłów.
  • Brak danych w statystykach to co innego — StatCard z missing.

ChatMessage

Wiadomość w rozmowie z asystentem.

Podajesz: from (assistant | user), children (tekst lub akapity <p>), opcjonalnie name (nazwa konkretnego asystenta) i time.

  • Asystent: awatar brand z ikoną spark, dymek na surface-raised. Klient: dymek action po prawej.
  • Tekst w body-lg (17/26) — rozmowa to główna treść produktu.
  • Asystent mówi w 1. osobie, krótko: co wie → co proponuje → ile kosztuje (lub że nic). Maks. 3 krótkie akapity.
  • Propozycje wyboru nie są listą w tekście — wstaw pod wiadomością DecisionCard, a płatne kroki CostApproval.
  • Gdy asystent zapisuje wiedzę o firmie, mówi to wprost („zapisuję w Twojej Firmie”).

Composer

Pole wiadomości do asystenta, przyklejone do dołu ekranu rozmowy.

  • Podajesz placeholder, opcjonalnie onSend, disabled.
  • Pusty: przycisk mikrofonu (wiadomość głosowa). Z tekstem: przycisk „Wyślij”.
  • Spinacz dodaje własne pliki — możliwość, nie wymóg.
  • Placeholder zachęca potrzebą, nie poleceniem technicznym: „Napisz, czego potrzebujesz…”.

DecisionCard

Jedna decyzja naraz: pytanie i najwyżej trzy opcje, w tym jedna rekomendowana.

Podajesz: question, options (id, title, opcjonalnie description, meta, recommended), opcjonalnie context i action (przycisk potwierdzenia).

  • Komponent obcina listę do 3 opcji. Więcej możliwości = asystent zawęża je przed pytaniem.
  • Dokładnie jedna opcja recommended: tło brand-soft, plakietka „Polecam”, domyślnie zaznaczona.
  • meta pokazuje koszt i źródło (prepaid / pula abonamentu) albo „Bez kosztu”. Kwota tu jest orientacyjna — wiąże dopiero CostApproval.
  • Wybór opcji nie uruchamia wydatku ani publikacji. To osobne decyzje.
  • Opcje to natywne radio — działają z klawiatury i czytnikiem ekranu.

CostApproval

Zgoda na koszt — osobna decyzja przed każdą płatną pracą. Klient widzi kwotę, źródło i saldo przed uruchomieniem.

Podajesz: title (co powstanie), amount, source (prepaid | plan), opcjonalnie balance, balanceAfter, note, insufficient, loading, onApprove, onDecline.

  • source="plan" — zestawy materiałów marki z puli abonamentu (początkowo 5 zmian na okres); amount to liczba zmian.
  • source="prepaid" — zwykła produkcja. Pokaż saldo teraz i po zatwierdzeniu.
  • Etykieta przycisku zawiera kwotę: „Zatwierdź koszt 49,00 zł”.
  • insufficient zamienia działanie na „Doładuj saldo” i mówi, że nic nie zostanie pobrane bez zgody.
  • Nigdy nie łącz z oceną materiału ani zgodą na publikację w jednym przycisku.

PublishApproval

Zgoda na publikację: konkretna wersja, konkretne konto, konkretny termin.

Podajesz: version, account (prawdziwa nazwa platformy i konta), when, opcjonalnie preview (podgląd tej wersji), cta, onApprove, onChange.

  • Wszystkie trzy pola zawsze widoczne — klient musi wiedzieć, co dokładnie zatwierdza.
  • Zatwierdzenie materiału (approved) nie publikuje. Publikacja to ta karta.
  • Dla publikacji „teraz” ustaw cta="Opublikuj teraz" i when="Teraz".
  • Przy automatyzacji (seria w granicach ustaleń) pokaż zakres zgody w version, np. „Seria 6 postów · wersje zatwierdzone”.

MaterialCard

Wiersz materiału w Bibliotece, rozmowie i powiadomieniach: miniatura, tytuł, wersja, status.

Podajesz: title, kind, opcjonalnie kindLabel, version, meta (platforma), status, thumb (URL miniatury) + thumbAlt, href.

  • Tytuł opisuje treść, nie plik: „Weekendowe śniadania — post 1/3”, nie „IMG_2041.jpg”.
  • Wersja zawsze, gdy istnieje więcej niż jedna.
  • Bez thumb pokazuje ikonę rodzaju — nie generuj sztucznych podglądów.
  • Cała karta jest linkiem do szczegółu (href), bez osobnego przycisku.

StatCard

Jedna liczba z kontekstem. Zasięg i zaangażowanie są wyraźnie oddzielone od sprzedaży.

Podajesz: label, kind (reach | sales), value + opcjonalnie delta, trend, source — albo missing (dlaczego brak danych i jak je zdobyć), albo loading.

  • Nadetykieta zawsze mówi rodzaj: „Zasięg i zaangażowanie” albo „Sprzedaż”. Nigdy nie sugeruj, że zasięg = sprzedaż.
  • Brak danych zostaje widoczny: „Brak danych” + powód. Nie pokazuj 0 ani kreski zamiast braku.
  • source podaje platformę i okres.
  • Liczby po polsku: spacja tysięcy, przecinek dziesiętny, „zł” po kwocie.

TopBar

Pasek górny ekranu aplikacji (56px).

Podajesz: title, opcjonalnie back + onBack, actions (maks. jeden IconButton), large + subtitle dla ekranów głównych zakładek.

  • Ekrany zakładek (TabBar): large — nagłówek headline pod paskiem.
  • Ekrany szczegółu: tytuł w pasku + strzałka „Wróć”.
  • Brak hamburgera — nawigacja główna to TabBar.

TabBar

Dolna nawigacja główna aplikacji klienta — 5 sekcji, zawsze te same.

id etykieta zawiera
start Start Co czeka na decyzję, zadania w tle, następny krok asystenta.
asystenci Asystenci Lista asystentów i ich rozmowy.
materialy Materiały Biblioteka, materiały marki, publikacje i kalendarz.
wyniki Wyniki Statystyki i rekomendacje.
firma Twoja Firma Profil, wiedza, konta, abonament i rozliczenia, pomoc.
  • count = liczba rzeczy czekających na decyzję klienta (nie powiadomień ogólnych).
  • Aktywna zakładka: tło brand-soft, ikona brand-ink, aria-current="page".
  • Od 1024px szerokości TabBar zamienia się w boczny pasek z tymi samymi pozycjami.

Wzorce procesów

Gotowe sekwencje ekranów sprawdzające system na scenariuszach z briefu. Podglądy: karty w grupie Wzorce (FlowStart, FlowAssistant, FlowReviewLink, FlowResults).

Start — co czeka na Ciebie (FlowStart)

Kolejność sekcji: Czeka na Ciebie (decyzje) → W toku (zadania w tle) → Asystent proponuje (jeden następny krok). Pierwszy dzień: EmptyState z zaproszeniem do rozmowy i stan abonamentu w Notice.

Rozmowa → decyzja → koszt → praca w tle (FlowAssistant)

  1. Klient pisze potrzebę. Asystent mówi, co już wie, i pokazuje DecisionCard (≤3 opcje, jedna polecana, orientacyjny koszt w meta).
  2. Po wyborze: darmowa część od razu (np. teksty), płatna czeka na CostApproval.
  3. Po zgodzie: Notice success o rezerwacji + TaskProgress. Asystent zapowiada ocenę i przypomina, że akceptacja nie publikuje.

Ocena z e-maila → publikacja (FlowReviewLink)

  1. Prywatny link otwiera jeden materiał bez logowania: Notice locked, podgląd, StatusBadge review, pole „Co zmienić?”, dok: Akceptuję / Poproś o zmiany / Przejdź do panelu.
  2. Po akceptacji: Notice success („nic nie zostało opublikowane ani pobrane”) i osobna PublishApproval z wersją, kontem i terminem.
  3. Przejście do panelu po zalogowaniu wraca do tego samego materiału.
  4. Błąd platformy: StatusBadge failed + Notice danger z działaniem naprawczym.

Wyniki (FlowResults)

Dwie osobne sekcje: Zasięg i zaangażowanie oraz Sprzedaż. Brak danych pokazany wprost, ładowanie szkieletem, na końcu jedna rekomendacja asystenta z przyciskiem accent.

Kolejne obszary — jak składać

  • Twoja Firma: lista sekcji (profil, oferta, odbiorcy, cele, marka, ustalenia) jako karty surface-raised z caption „Ostatnio uzupełnione przez asystenta: …”; edycja przez rozmowę, pola TextField tylko do danych twardych.
  • Materiały marki: MaterialCard kind="logo" + CostApproval source="plan" (pula zmian).
  • Biblioteka: lista MaterialCard z filtrami jako Badge w poziomym przewijaniu.
  • Strona internetowa: rozmowa z asystentem strony + TaskProgress + podgląd + PublishApproval (konto = domena).
  • Abonament i rozliczenia: wiersze nn-rows (jak w CostApproval), kwoty w amount.
  • Konsultacje: wybór terminu jako DecisionCard (3 najbliższe terminy, „Polecam” przy najbliższym), potem CostApproval.
  • Panel operatora: te same StatusBadge, TaskProgress, Notice; układ tabelaryczny od 1024px.

Ekran Start — co czeka na Ciebie

Rozmowa → decyzja → koszt

Ocena z e-maila → publikacja

Wyniki — brak danych, ładowanie, rekomendacja