Input
DraftExamples
Dział zatytułowany „Examples”Domyślny (z Field + hint)
Dział zatytułowany „Domyślny (z Field + hint)”Użyjemy go tylko do wysyłki polisy.
Domyślny
import { Field, Input } from "@polisoteka-design/ui";
export function InputBasic() {
return (
<Field label="Adres e-mail" hint="Użyjemy go tylko do wysyłki polisy.">
<Input type="email" placeholder="[email protected]" />
</Field>
);
}
export default InputBasic;Z błędem walidacji
Dział zatytułowany „Z błędem walidacji”Wprowadź poprawny 10-cyfrowy NIP.
Z błędem
import { Field, Input } from "@polisoteka-design/ui";
export function InputInvalid() {
return (
<Field label="NIP" required error="Wprowadź poprawny 10-cyfrowy NIP.">
<Input defaultValue="123-456" />
</Field>
);
}
export default InputInvalid;Używaj Input przez Field, nie samodzielnie — Field dostarcza etykietę,
generowane id, i powiązania a11y (aria-invalid, aria-describedby,
aria-required), których sam Input świadomie nie ma (patrz Dostępność
niżej). Użycie samego Input bez Field/Label ma sens tylko w kontekstach
bez formularza (np. pole wyszukiwarki z widoczną ikoną zamiast etykiety —
wtedy aria-label musisz dodać ręcznie).
Nie pokazuj błędu walidacji, zanim użytkownik nie skończył interakcji z
polem (nie waliduj on-keystroke od pierwszego znaku) — to reguła UX, nie
własność komponentu; Field tylko renderuje błąd, który mu przekażesz.
Content
Dział zatytułowany „Content”@todo(S-WYWIAD): mikrocopy komunikatów błędów i hintów (ton, długość, czy zaczynamy od czasownika czy od nazwy pola) — z wywiadu z Human.
| Nazwa | Typ | Wymagany | Domyślnie | Opis |
|---|---|---|---|---|
| Brak propsów ponad natywne atrybuty elementu — patrz opis komponentu wyżej. | ||||
| Nazwa | Typ | Wymagany | Domyślnie | Opis |
|---|---|---|---|---|
label | string | tak | — | Treść etykiety powiązanej z kontrolką. |
children | React.ReactElement | tak | — | Pojedyncza kontrolka pola (np. <Input />) — dostaje id/aria-invalid/aria-describedby/aria-required przez cloneElement. |
error | string | nie | undefined | Komunikat błędu — gdy obecny, kontrolka dostaje aria-invalid i jest powiązana z komunikatem (role='alert'). |
hint | string | nie | undefined | Podpowiedź pod polem. Pokazywana ZAWSZE, niezależnie od error — gdy oba są podane, oba renderują się jednocześnie i oba trafiają do aria-describedby. |
required | boolean | nie | false | Pole wymagane — aria-required na kontrolce + wizualny znacznik '*' przy etykiecie. |
id | string | nie | undefined | Nadpisanie wygenerowanego (React.useId) id kontrolki. |
className | string | nie | undefined | Klasy na kontenerze pola (div). |
| Nazwa | Typ | Wymagany | Domyślnie | Opis |
|---|---|---|---|---|
| Brak propsów ponad natywne atrybuty elementu — patrz opis komponentu wyżej. | ||||
Dostępność
Dział zatytułowany „Dostępność”Zapewnione przez Field:
- Generuje
id(ReactuseId) i wiążeLabelprzezhtmlFor. error→aria-invalid+aria-describedbywskazujące narole="alert".hintrenderuje się ZAWSZE, niezależnie oderror— gdy oba są podane,aria-describedbywskazuje na OBA (id połączone spacją), aid/aria-describedbyjuż obecne na przekazanej kontrolce są respektowane, nie nadpisywane.required→aria-required+ wizualny*przy etykiecie (aria-hidden, żeby czytnik ekranu nie czytał samej gwiazdki — informację niesiearia-required).
Sprawdź przy użyciu:
- Sam
InputbezFieldNIE ma żadnego z powyższych — dodaj je ręcznie albo użyjField. - Stan błędu sygnalizowany tylko
aria-invalid+ kolorem obramowania — jeśli Twój formularz pokazuje błędy zbiorczo na górze strony, upewnij się, że tekst błędu przy polu i tekst w podsumowaniu są identyczne (nie tylko kolor prowadzi do pola).
Related
Dział zatytułowany „Related”- Button — akcja zapisu formularza.
- Fundamenty → Kolor —
color.status.dangerużyty w stanie błędu.