4.1 · Zastosowania
Interfejsy
Komponenty i zasady UI obecnej witryny Refindi — przyciski, powierzchnie squircle, przewijane rzędy, nawigacja, statusy i ruch. Żywe przykłady pochodzą z kodu witryny.
Wersja 2026.1Aktualizacja 2026-10-06 Markdown
Interfejsy Refindi są jasne, spokojne i miękkie w kształcie. Treść leży na białych powierzchniach z narożnikami squircle, akcje są wyraźne, a ruch krótki i sprężysty. Przykłady na tej stronie to te same komponenty, których używa witryna — z tymi samymi parametrami.
Przyciski
Przyciski są w pełni zaokrąglonymi pigułkami. Główny przycisk ma niebieskie tło #53BDF6 i białą etykietę, drugorzędny — tło #E9E8E6 i etykietę #3A3A3A. Etykieta jest krótka i ma formę wezwania do działania („Zarejestruj obiekt”, „Pobierz plik”).
Na ciemnych panelach można użyć wariantu ciemnego (tło #00111F, jasna etykieta) — jako akcentu, nie zamiennika głównego CTA.
- Musi
Główne CTA: pigułka (rounded-full), tło #53BDF6, biała etykieta Satoshi 600 (renderowana jako 700), 14–15 px. Drugorzędne: tło #E9E8E6, etykieta #3A3A3A.
- PowinnoDo weryfikacji
Biała etykieta na #53BDF6 ma kontrast ok. 2,1:1 — poniżej WCAG AA. Nie zmieniaj koloru po cichu; decyzja o wariancie dostępnym należy do właściciela marki.
- MusiPropozycja
Każdy przycisk i link ma widoczny stan focus z klawiatury, który nie jest przycinany przez kształt squircle.
- PowinnoPropozycja
Na jednym ekranie lub w jednej sekcji stosuj jeden przycisk główny; pozostałe akcje jako drugorzędne lub linki.
4.1.c
Anatomia CTA
Pigułka: promień = połowa wysokości. Wysokość i padding zmieniają się z breakpointem, etykieta Satoshi 600 (renderowana jako 700, bo 600 nie jest ładowane).
Źródło: Business.tsx, hero. Szerokość etykiety zmierzona w przeglądarce.
Stany · sekwencja
1. Spoczynek
scale 1
2. Hover
scale 1,04 · etykieta w górę
3. Wciśnięcie
scale 0,95
4. Focus z klawiatury
obrys 2 px · odstęp 3 px
Skale i sprężyna 500 / 14 pochodzą z witryny; stan focus dodano w Guidelines (w źródłowych CTA go brak). Przerywany obrys to rozmiar w spoczynku.
Na żywo · najedź, wciśnij, przejdź Tabem
Powierzchnie i squircle
Każda karta i panel ma narożniki squircle — superelipsę z pełnym wygładzeniem (odpowiednik 100% smoothing w Figmie). Kształt jest liczony na bieżąco dla rozmiaru elementu, więc karta zachowuje te same proporcje narożnika na każdym ekranie.
Powierzchnie układają się warstwami: tło strony #F5F4F2 → biały panel → karty wewnętrzne. Panel z obrysem składa się z dwóch squircle: zewnętrznego w kolorze obrysu i wewnętrznego, mniejszego o grubość obrysu.
| Element | Promień |
|---|---|
| Duży panel / banner | 90 px desktop, 40 px mobile |
| Kafle procesu | 64 / 48 / 32 px |
| Pasek wyszukiwania | 28 px |
| Karta | 20 px |
| Karta zagnieżdżona | 16 px |
| Przycisk | pigułka |
- Musi
Karty, panele i bannery mają narożniki squircle (clip-path liczony dla aktualnego rozmiaru elementu, smoothing 1). Zwykły border-radius ani jedna sztywna ścieżka nie odtwarzają tego kształtu.
- Musi
Obrys squircle buduj dwiema warstwami (zewnętrzna w kolorze obrysu #DEDEDE, wewnętrzna z promieniem pomniejszonym o grubość obrysu), a cień nakładaj na wrapper — clip-path ucina box-shadow.
- Powinno
Promień zależy od skali elementu: duże panele 90 px (desktop) / 40 px (mobile), kafle 32–64 px, karty 20 px, karty zagnieżdżone 16 px, przyciski — pełna pigułka.
- Powinno
Tło strony to ciepła szarość #F5F4F2, treść leży na białych powierzchniach. Ciemne panele #00111F są kontrolowanym akcentem, nie dominującym tłem.
4.1.a
Squircle a zaokrąglony róg
Ten sam rozmiar, ten sam promień — inny narożnik. border-radius to łuk koła doklejony do prostej; squircle (wygładzenie ξ = 1, jak na witrynie) prowadzi krzywiznę od zera, więc narożnik nie ma widocznego „załamania”. Przesuń suwaki — rysunek i wykres liczone są z tej samej ścieżki.
Lupa · prawy górny narożnik
400 × 300 px · R 60
- AStyk łuku z prostą. Krzywizna skacze z 0 do 1/R — tu oko widzi załamanie.
- BPoczątek przejścia squircle. Krzywizna rośnie od zera na odcinku p = (1 + ξ)·R.
Nałożenie · ten sam rozmiar i promień
- Przejście squircle p
- 120,0 px
- (1 + 1,00) · 60
- Przejście łuku
- 60 px
- = R
- Łuk koła w squircle
- 0,0°
- przy ξ = 1 brak odcinka łuku
- Skoki krzywizny
- 0 vs 2
- squircle vs łuk
Krzywizna wzdłuż krawędzi narożnika
liczona numerycznie z próbek ścieżki getSvgPath
Przy ξ = 1 krzywizna squircle jest ciągła na całej długości narożnika (G2) — zero skoków. Łuk koła ma dwa skoki o pełne 1/R w punktach A.
Załamanie optyczne
Łuk koła styka się z prostą w jednym punkcie i krzywizna skacze z 0 do 1/R. Przy dużych promieniach narożnik wygląda na doklejony.
Zmiana rozłożona
Squircle rozkłada zmianę krzywizny na dłuższy odcinek (p = 2R przy ξ = 1). Narożnik jest miękki i spójny nawet przy 40–90 px.
Ścieżka zamiast border-radius
border-radius rysuje tylko łuki. Witryna liczy ścieżkę dla bieżącego rozmiaru i nakłada ją jako clip-path; duże sekcje używają corner-shape: squircle tam, gdzie przeglądarka go wspiera (z mniejszym łukiem jako fallback).
Konsekwencje
Cień na wrapperze (clip-path ucina box-shadow). Focus ring poza kształtem, żeby klip go nie przyciął. Ścieżka przeliczana przy zmianie rozmiaru (ResizeObserver); przed hydratacją działa bazowy border-radius.
4.1.b
Promień wewnętrzny = zewnętrzny − padding
Karta w karcie wygląda spójnie tylko wtedy, gdy oba narożniki mają wspólny „środek”. Odejmij padding od promienia zewnętrznego: 28 − 12 = 16.
Z tym samym promieniem odstęp w narożniku puchnie — liczony na dwusiecznej ścieżek: 17,0 px zamiast 12.
✕ Źle · ten sam promień
R wewn. = 28 · odstęp na dwusiecznej 17,0 px
✓ Dobrze · R wewn. = R zewn. − padding
28 − 12 = 16 · odstęp na dwusiecznej 12,0 px
Na żywo · SquircleBox (witryna)
Gruby odstęp w narożniku
Wspólny środek narożników
Przewijane rzędy
Rzędy kart na telefonie przewijają się poziomo z przyciąganiem do kart (scroll-snap) i ukrytym paskiem przewijania. Strzałki obok rzędu przewijają o jedną kartę i działają z klawiatury. Cała strona przewija się normalnie — nie zamykamy treści w niskich, wewnętrznych obszarach przewijania.
- Powinno
Przewijane poziomo rzędy kart używają scroll-snap i ukrytego paska przewijania, a obok mają kontrolki strzałek dostępne z klawiatury.
Dla developera — źródło i API
// src/components/business/ProcessStepsCarousel.tsx
<ul className="flex gap-3 overflow-x-auto snap-x snap-mandatory [scrollbar-width:none]">
<li className="snap-start shrink-0 w-[78%] sm:w-[260px]">…</li>
</ul>Nawigacja
Nawigacja witryny: jasne tło, logo po lewej, linki pośrodku i jedno wyróżnione CTA po prawej. Belki z pigułkami (jak główna belka tych Guidelines) mają tło #E9E8E6 i białą, sprężyście przesuwaną pigułkę aktywnej pozycji (sprężyna 380 / 22 / 0.8).
- Musi
Aktywna pozycja w belkach i paskach przewijanych poziomo zawsze pozostaje widoczna w kadrze.
- Powinno
Pasek nawigacji ma jasne tło, logo po lewej i jedno wyróżnione CTA po prawej.
Dla developera — źródło i API
// src/components/b2c/MagneticBar.tsx — kopia w src/components/ui/MagneticBar.tsx
<MagneticBar hoverScale={1.025} tapScale={0.99}>
<SquircleBox radius={28} className="bg-surface">…</SquircleBox>
</MagneticBar>Statusy
Status przedmiotu lub zgłoszenia to mała pigułka z jasnym tłem i ciemniejszym tekstem z tej samej rodziny barw, zawsze z etykietą słowną.
- Musi
Statusy przedmiotów i zgłoszeń pokazuj jako pigułki z tłem i tekstem w parze jednego koloru oraz słowną etykietą — kolor nigdy nie jest jedynym nośnikiem informacji.
- Zgłoszenie przyjęte
- Weryfikacja
- Przygotowanie zwrotu
- W drodze / wysłano
- Zwrócone
Dla developera — źródło i API
// src/pages/NewB2C.tsx
const HERO_STATUS_STYLES = {
received: { icon: Send, bg: "bg-violet-50", text: "text-violet-700" },
verifying: { icon: SearchCheck, bg: "bg-amber-50", text: "text-amber-700" },
preparing: { icon: Package, bg: "bg-emerald-50", text: "text-emerald-700" },
shipping: { icon: Truck, bg: "bg-sky-50", text: "text-sky-700" },
returned: { icon: CheckCircle2, bg: "bg-green-50", text: "text-green-700" },
};Ruch
Ruch jest krótki, sprężysty i reaguje na intencję użytkownika: najechanie lekko powiększa element, wciśnięcie go zmniejsza. Etykieta przycisku „przewija się” w górę przy najechaniu. Przy włączonym ograniczeniu ruchu w systemie elementy zmieniają stan natychmiast.
| Element | Parametry |
|---|---|
| Przycisk | sprężyna 500 / 14, hover 1.04, wciśnięcie 0.95 |
| Etykieta przycisku | 0,5 s, cubic-bezier(0.76, 0, 0.24, 1) |
| Przycisk strzałki | sprężyna 500 / 14, hover 1.08, wciśnięcie 0.86 |
| Pasek wyszukiwania | hover 380 / 20 / 0.85 (1.025), wciśnięcie 600 / 30 / 0.7 (0.99) |
| Wskaźnik aktywnej pozycji | 380 / 22 / 0.8 |
| Karta segmentu | 260 / 18 / 0.9, hover 1.06 |
- Musi
Przy prefers-reduced-motion wyłącz skalowanie, przesuwanie etykiet i paralaksę. Treść, nawigacja i pobieranie muszą działać bez animacji.
- Powinno
Ruch przycisków: sprężyna stiffness 500 / damping 14, hover 1.04, wciśnięcie 0.95; etykieta wyjeżdża w górę w 0,5 s z krzywą cubic-bezier(0.76, 0, 0.24, 1).
4.1.d
Sprężyna i krzywa etykiety
Przycisk skaluje się sprężyną 500 / 14 (masa 1) — szybko, z wyraźnym odbiciem. Etykieta „przewija się” w 0,5 s po krzywej cubic-bezier(0.76, 0, 0.24, 1): wolny start, szybki środek, miękkie lądowanie. Wykresy liczone są z tych parametrów, kulki poruszają się po tych samych danych.
Sprężyna · pozycja w czasie
k 500 · c 14 · m 1
Odbicie
36%
Ustalenie ±0,5%
762 ms
Tłumienie ζ
0,31
Roll etykiety · cubic-bezier
(0.76, 0, 0.24, 1) · 0,5 s
Czas
500 ms
Postęp w ½ czasu
50%
Przesunięcie
0 → −110%
Haptyka
Przyciski Refindi odpowiadają nie tylko ruchem, ale i dotykiem. Safari i Chrome na iOS nie udostępniają Vibration API, dlatego witryna używa „hacku haptycznego”: natywny przełącznik iOS (<input type="checkbox" switch>) przy każdym przestawieniu wywołuje systemową haptykę. Komponent <Haptic> chowa taki przełącznik w przezroczystej etykiecie nałożonej na przycisk — palec trafia w etykietę, przełącznik daje „klik” Taptic Engine, a etykieta przekazuje kliknięcie do prawdziwego przycisku.
Kolejność zdarzeń po dotknięciu na iPhonie:
- Dotyk trafia w przezroczystą etykietę (warstwa nad przyciskiem, z tym samym zaokrągleniem).
- Etykieta od razu przekazuje
pointerdowndo przycisku — działa sprężyna wciśnięcia (whileTap). - Po puszczeniu palca etykieta dostaje
clicki wywołujeclick()na przycisku (pole tekstowe dostaje fokus bez przewijania); przycisk wyłączony nie reaguje. - Domyślna akcja etykiety przestawia ukryty przełącznik — iOS odtwarza systemowy „klik”. Kroki 3 i 4 dzieją się w jednym zdarzeniu, więc akcja i haptyka są odczuwane jednocześnie.
Na Androidzie zamiast etykiety działa navigator.vibrate(10) — jeden krótki impuls przy kliknięciu. Na desktopie i z klawiatury nic się nie zmienia: etykieta nie jest renderowana, a przycisk działa normalnie.
| Platforma | Mechanizm | Odczucie |
|---|---|---|
| iOS (Safari, Chrome) | ukryty przełącznik switch pod etykietą |
systemowy „klik” |
| Android | navigator.vibrate(10) |
krótka wibracja 10 ms |
| Desktop, klawiatura | brak | bez zmian |
Gdzie działa. <Haptic> powstał 3 października 2026 (commit 3c98123e; tego samego dnia dodano przekazywanie pointerdown dla sprężyny — 5947087e). Od 3 października owija główne CTA strony dla biznesu, karty segmentów w hero, strzałki karuzeli segmentów, kafle ról, kroki procesu i startu oraz plany cenowe. Od 5 października (c8bca4aa) obejmuje też menu mobilne, przełącznik języka i pola tekstowe.
Warstwa globalna. Od 22 czerwca 2026 (64c68e48) witryna ma też drugi mechanizm: src/lib/haptics.ts z biblioteką web-haptics. Funkcja installGlobalHaptics(), ładowana leniwie w App.tsx, nasłuchuje touchstart, pointerdown i click na całym dokumencie i dla przycisków, linków, opcji, zakładek i pól formularzy odtwarza wzorzec TAP_PATTERN (40 ms) — jeden na gest, z de-duplikacją 120 ms. Listy rozwijane wyboru kraju mają własny, podwójny wzorzec DROPDOWN_PATTERN (30 ms, przerwa 60 ms, 40 ms) i atrybut data-haptic-skip, który wyłącza dla nich wzorzec globalny.
- Musi
Każdy główny element dotykowy — CTA, karty segmentów, kafle ról, strzałki karuzel, pozycje menu mobilnego — owijaj w komponent
<Haptic>. Na iOS to jedyna droga do haptyki systemowej z poziomu WWW. - Musi
Mechanizm
<Haptic>na iOS: ukryty natywny<input type="checkbox" switch>w przezroczystej etykiecie (absolute inset-0, z-10, aria-hidden) nałożonej na przycisk. Etykieta przekazuje kliknięcie (click(), a dla pól tekstowych focus bez przewijania) oraz pointerdown do prawdziwego przycisku, żeby zadziałała sprężyna whileTap. - Musi
Android: jedno krótkie navigator.vibrate(10) w fazie capture kliknięcia. Desktop i obsługa z klawiatury pozostają bez zmian — bez etykiety, bez wibracji.
- Musi
Wyzwalacz listy rozwijanej ma własny wzorzec DROPDOWN_PATTERN (30 ms, przerwa 60 ms, 40 ms) i atrybut data-haptic-skip, żeby warstwa globalna nie dodała drugiego impulsu.
Pokaż wszystkie reguły (7)Zwiń reguły
- Powinno
Warstwa globalna (installGlobalHaptics, biblioteka web-haptics) daje jeden wzorzec TAP_PATTERN (40 ms) na gest dla przycisków, linków, opcji, zakładek i pól formularzy — z de-duplikacją 120 ms i pominięciem elementów disabled.
- Nie wolnoPropozycja
Haptyka tylko potwierdza gest użytkownika — nigdy nie jest jedynym sygnałem. Każda akcja ma też widoczną reakcję (sprężyna, zmiana stanu, komunikat). Nie wywołuj haptyki bez dotknięcia: przy przewijaniu, ładowaniu ani w odpowiedzi na zdarzenia systemowe.
- UnikajPropozycja
Nie dokładaj nowych wzorców wibracji poza TAP_PATTERN i DROPDOWN_PATTERN bez uzgodnienia; dłuższe lub wielokrotne impulsy rezerwuj dla błędów i potwierdzeń krytycznych.
4.1.e
Hack haptyczny: przełącznik pod etykietą
iOS nie daje stronom WWW dostępu do wibracji, ale natywny przełącznik <input switch> odtwarza systemowy „klik”. Komponent <Haptic> kładzie nad przyciskiem przezroczystą etykietę z ukrytym przełącznikiem i przekazuje dotyk do prawdziwego przycisku. Rysunek rozsuwa te trzy warstwy; oś czasu pokazuje kolejność zdarzeń po jednym dotknięciu.
- Krok 1DotykPalec trafia w przezroczystą etykietę (z-10) nałożoną na przycisk.
- Krok 2pointerdown → przyciskEtykieta przekazuje wciśnięcie — sprężyna whileTap 0,95.
- Krok 3click na etykieciePo puszczeniu palca etykieta dostaje zdarzenie click.
- Krok 4click() → przyciskAkcja przycisku: onClick, nawigacja; pole tekstowe dostaje fokus.
- Krok 5Switch zmienia stanDomyślna akcja etykiety przestawia ukryty <input switch>.
- Krok 6Haptyka iOSSystem odtwarza „klik” Taptic Engine. Na Androidzie: vibrate(10).
Żywe demo · Cta z <Haptic>
Na iPhonie poczujesz haptykę; na Androidzie wibrację; na desktopie nic.
Twoje urządzenie: — · dotknięcia: 0
Fale wokół przycisku to tylko wizualizacja impulsu.
Wzorce impulsów
Warstwa globalna (web-haptics) daje jeden impuls 40 ms na gest; lista rozwijana ma własny, podwójny wzorzec i jest wyłączona z warstwy globalnej. <Haptic> na Androidzie wibruje 10 ms, na iOS czas określa system.
Układ
Strony projektujemy modułowo, ze stałym rytmem sekcji, dla desktopu, tabletu i telefonu. Konkretne breakpointy pochodzą z kodu witryny (640 / 768 / 1024 / 1280 px oraz 940 i 1060 px dla nagłówka). Margines boczny: clamp(20 px, 5vw, 40 px).
- Powinno
Na desktopie dziel treść sekcji w proporcjach 8/4 lub 6/6; na telefonie stosuj jedną kolumnę i pionowy przepływ treści.
- Powinno
Sekcja treści ma stałą kolejność: nadtytuł (wersaliki, brzoskwinia, tracking 0.2em), nagłówek, lead, tekst główny, link lub CTA.
Prezentacja produktu
Refindi pokazujemy jako doświadczenie, które łączy technologię z realnym światem obiektu — nie jako samą aplikację. W deckach B2B, kampaniach i na stronie prezentacja ma prosto pokazać działanie, korzyści i jakość obsługi: telefon w dłoni, paczka, odbiór rzeczy, ciepłe naturalne światło, neutralne tło.
- Musi
W materiałach marketingowych i deckach pokazuj aktualny, rzeczywisty interfejs Refindi — realistyczne, dopracowane zrzuty, nie makiety z nieistniejącymi funkcjami.
- Powinno
Prowadź odbiorcę przez produkt krok po kroku, scenariuszami z perspektywy właściciela rzeczy i obiektu (zgłoszenie → potwierdzenie → wysyłka).
- MusiDo weryfikacji
Funkcje Premium (personalizacja interfejsu pod identyfikację obiektu, dodawanie znalezisk przez personel z powiadomieniem) oznaczaj w materiałach jako Premium.
- Nie wolnoPropozycja
Nie pokazuj logo realnych obiektów partnerskich na makietach bez zgody partnera; do przykładów personalizacji używaj fikcyjnej marki.

Trzy kroki procesu — zdjęcia z witryny
Trzy pionowe zdjęcia w kartach squircle: dłoń z telefonem i formularzem zgłoszenia Refindi, dłoń zamykająca paczkę z logo Refindi, osoba odbierająca paczkę. Neutralne, jasne tło, miękkie światło.
witryna (repo): public/__l5e/…/step-1-report.jpg

Panel obiektu — aktualny interfejs
Zrzut panelu koordynatora: boczna nawigacja z logo Refindi, lista szablonów wiadomości ze statusem „Active”. Pokazuje realny produkt w materiałach B2B.
witryna (repo): public/__l5e/…/refindi-dashboard.png
Historia
Brandbook 2025 opierał witrynę na Bootstrap 5 (kontener 1110 px, gutter 30 px), kroju Kumbh Sans, przyciskach z promieniem 8–10 px i innych kolorach przycisków. Pokazywał też ekrany produktu z pastelowym gradientem i brzoskwiniowymi przyciskami pełnej szerokości. Wszystko to zastąpił obecny system witryny: React + Tailwind, Satoshi, pigułki i squircle.
- Nie wolno
Ekrany z brandbooka 2025 (s. 84–89) są historyczne — nie używaj ich jako wzorca wyglądu ani jako zrzutów w nowych materiałach.
- Błędnie
Ekrany produktu z 2025 jako wzorzec
Szablon telefonu i trzy ekrany z brandbooka 2025: start z logo i brzoskwiniowym przyciskiem, formularz z polami i niebieskim oraz brzoskwiniowym przyciskiem, ekran „Czy to Twój przedmiot?”. To wygląd historyczny — nie kopiuj go do nowych materiałów.
Załączniki
Pod każdym przyciskiem pobierania — zasady użycia pliku w Markdown.
Tokeny UI — JSON
JSON · obecny system digital
JSON · 9 KB · v2026.1
Kolory, typografia, kształty (squircle), cienie, ruch i układ obecnej witryny Refindi, każda wartość ze ścieżką źródłową w kodzie.
Do rozstrzygnięcia (7) — rejestr redakcyjny, nie norma
- W kodzie działają równolegle trzy kontenery: .container-refindi (1110 px), Tailwind container (1200 px) i tokeny B2C 1200/1400 px. Trzeba wybrać jeden kanoniczny.
- Kontrast białej etykiety na #53BDF6 (≈2,1:1) i brzoskwini #FF9E6D na #F5F4F2 (≈1,8:1) jest poniżej WCAG AA.
- Główne CTA w hero witryny nie mają stylu focus ani disabled; w Guidelines dodano je w kopii komponentu.
- Waga Satoshi 600 nie jest ładowana — font-semibold renderuje się jako 700.
- Przypisanie funkcji do planu Premium i zakres automatycznych powiadomień wymagają potwierdzenia operacyjnego. (PDF s. 86-87)
- S. 86 pokazuje personalizację na przykładzie logo sieci hotelowej — brak informacji o zgodzie partnera. (PDF s. 86)
- Przykładowe copy ze s. 137 („do 60 minut”, „bez integracji”, „bezpłatna wersja”, „koszt wysyłki ponosi gość”) wymaga potwierdzenia biznesowego. (PDF s. 137)

