πŸ“ Π€ΠΎΡ€ΠΌΠ°

Π’Ρ…ΠΎΠ΄, ошибки, Π΄Π²Π΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ, Π²Ρ‹Π±ΠΎΡ€ ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ

Π€ΠΎΡ€ΠΌΠ° Π²Ρ…ΠΎΠ΄Π°

Атрибуты autocomplete Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ подстановку ΠΈΠ· ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ.

Π—Π°Π±Ρ‹Π»ΠΈ?
<form class="w-full max-w-sm space-y-4 rounded-xl border border-slate-200 bg-white p-5 dark:border-slate-700 dark:bg-slate-900">
  <div class="space-y-1.5">
    <label class="block text-sm font-medium text-slate-700 dark:text-slate-200" for="pf-mail">ЭлСктронная ΠΏΠΎΡ‡Ρ‚Π°</label>
    <input id="pf-mail" type="email" autocomplete="email" placeholder="name@example.com"
           class="w-full rounded-md border border-slate-300 bg-transparent px-3 py-2 text-sm text-slate-900
                  placeholder:text-slate-400 focus:border-sky-500 focus:ring-2 focus:ring-sky-500/30 focus:outline-none
                  dark:border-slate-600 dark:text-slate-100">
  </div>
  <div class="space-y-1.5">
    <div class="flex items-center justify-between">
      <label class="text-sm font-medium text-slate-700 dark:text-slate-200" for="pf-pass">ΠŸΠ°Ρ€ΠΎΠ»ΡŒ</label>
      <a class="text-xs text-sky-700 underline-offset-4 hover:underline dark:text-sky-400" href="#">Π—Π°Π±Ρ‹Π»ΠΈ?</a>
    </div>
    <input id="pf-pass" type="password" autocomplete="current-password"
           class="w-full rounded-md border border-slate-300 bg-transparent px-3 py-2 text-sm text-slate-900
                  focus:border-sky-500 focus:ring-2 focus:ring-sky-500/30 focus:outline-none
                  dark:border-slate-600 dark:text-slate-100">
  </div>
  <button class="w-full rounded-md bg-slate-900 px-4 py-2 text-sm font-medium text-white dark:bg-slate-100 dark:text-slate-900">Π’ΠΎΠΉΡ‚ΠΈ</button>
</form>

ПолС с подсказкой и ошибкой

Ошибка ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Π° aria-invalid ΠΈ связана с ΠΏΠΎΠ»Π΅ΠΌ Ρ‡Π΅Ρ€Π΅Π· aria-describedby.

Π€ΠΎΡ€ΠΌΠ°Ρ‚: +7 ΠΈ Π΄Π΅ΡΡΡ‚ΡŒ Ρ†ΠΈΡ„Ρ€

<div class="w-full max-w-sm space-y-1.5">
  <label class="block text-sm font-medium text-slate-700 dark:text-slate-200" for="pf-phone">Π’Π΅Π»Π΅Ρ„ΠΎΠ½</label>
  <input id="pf-phone" type="tel" inputmode="tel" value="+7 900 12" aria-invalid="true" aria-describedby="pf-phone-hint pf-phone-err"
         class="w-full rounded-md border border-slate-300 bg-transparent px-3 py-2 text-sm text-slate-900
                aria-invalid:border-rose-500 aria-invalid:bg-rose-50 dark:border-slate-600 dark:text-slate-100 dark:aria-invalid:bg-rose-950/30">
  <p id="pf-phone-hint" class="text-xs text-slate-500 dark:text-slate-400">Π€ΠΎΡ€ΠΌΠ°Ρ‚: +7 ΠΈ Π΄Π΅ΡΡΡ‚ΡŒ Ρ†ΠΈΡ„Ρ€</p>
  <p id="pf-phone-err" role="alert" class="text-xs text-rose-600 dark:text-rose-400">НомСр Π²Π²Π΅Π΄Ρ‘Π½ Π½Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ</p>
</div>

Π€ΠΎΡ€ΠΌΠ° Π² Π΄Π²Π΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ

Π¨ΠΈΡ€ΠΎΠΊΠΈΠ΅ поля Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ ΠΎΠ±Π΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ Ρ‡Π΅Ρ€Π΅Π· sm:col-span-2.

<form class="grid w-full max-w-2xl gap-4 rounded-xl border border-slate-200 bg-white p-5 sm:grid-cols-2
             dark:border-slate-700 dark:bg-slate-900">
  <div class="space-y-1.5">
    <label class="block text-sm font-medium text-slate-700 dark:text-slate-200" for="pf-first">Имя</label>
    <input id="pf-first" class="w-full rounded-md border border-slate-300 bg-transparent px-3 py-2 text-sm dark:border-slate-600 dark:text-slate-100" value="Π˜Ρ€ΠΈΠ½Π°">
  </div>
  <div class="space-y-1.5">
    <label class="block text-sm font-medium text-slate-700 dark:text-slate-200" for="pf-last">Ѐамилия</label>
    <input id="pf-last" class="w-full rounded-md border border-slate-300 bg-transparent px-3 py-2 text-sm dark:border-slate-600 dark:text-slate-100" value="Π‘ΠΎΠΊΠΎΠ»ΠΎΠ²Π°">
  </div>
  <div class="space-y-1.5 sm:col-span-2">
    <label class="block text-sm font-medium text-slate-700 dark:text-slate-200" for="pf-about">О сСбС</label>
    <textarea id="pf-about" rows="3" class="w-full rounded-md border border-slate-300 bg-transparent px-3 py-2 text-sm dark:border-slate-600 dark:text-slate-100">ΠŸΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ²Ρ‹ΠΉ Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊ</textarea>
  </div>
  <div class="flex justify-end gap-2 sm:col-span-2">
    <button class="rounded-md px-4 py-2 text-sm font-medium text-slate-600 hover:bg-slate-100 dark:text-slate-300 dark:hover:bg-slate-800">ΠžΡ‚ΠΌΠ΅Π½Π°</button>
    <button class="rounded-md bg-slate-900 px-4 py-2 text-sm font-medium text-white dark:bg-slate-100 dark:text-slate-900">Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ</button>
  </div>
</form>

Π’Ρ‹Π±ΠΎΡ€ ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΠΈ

НастоящиС input скрыты Ρ‡Π΅Ρ€Π΅Π· sr-only β€” ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° Ρ„ΠΎΡ€ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚.

<div class="w-full max-w-lg space-y-4">
  <div class="grid gap-2 sm:grid-cols-3">
    <label class="cursor-pointer rounded-lg border border-slate-200 p-3 text-center text-sm transition-colors
                  has-checked:border-sky-500 has-checked:bg-sky-50 dark:border-slate-700 dark:has-checked:bg-sky-950/40">
      <input type="radio" name="pf-plan" class="sr-only">Π‘Ρ‚Π°Ρ€Ρ‚
    </label>
    <label class="cursor-pointer rounded-lg border border-slate-200 p-3 text-center text-sm transition-colors
                  has-checked:border-sky-500 has-checked:bg-sky-50 dark:border-slate-700 dark:has-checked:bg-sky-950/40">
      <input type="radio" name="pf-plan" class="sr-only" checked>Команда
    </label>
    <label class="cursor-pointer rounded-lg border border-slate-200 p-3 text-center text-sm transition-colors
                  has-checked:border-sky-500 has-checked:bg-sky-50 dark:border-slate-700 dark:has-checked:bg-sky-950/40">
      <input type="radio" name="pf-plan" class="sr-only">Компания
    </label>
  </div>
  <label class="flex cursor-pointer items-center justify-between gap-4 rounded-lg border border-slate-200 p-3 dark:border-slate-700">
    <span class="text-sm text-slate-700 dark:text-slate-200">ΠŸΡ€ΠΈΡΡ‹Π»Π°Ρ‚ΡŒ ΠΎΡ‚Ρ‡Ρ‘Ρ‚Ρ‹ Π½Π° ΠΏΠΎΡ‡Ρ‚Ρƒ</span>
    <input type="checkbox" checked class="peer sr-only">
    <span class="relative h-6 w-11 shrink-0 rounded-full bg-slate-300 transition-colors peer-checked:bg-emerald-500 dark:bg-slate-600">
      <span class="absolute top-0.5 left-0.5 size-5 rounded-full bg-white transition-transform peer-checked:translate-x-5"></span>
    </span>
  </label>
</div>

Π Π°Π·Π±ΠΎΡ€

ΠšΠ»Π°ΡΡΠ—Π°Ρ‡Π΅ΠΌ
space-y-4Ρ€ΠΈΡ‚ΠΌ ΠΌΠ΅ΠΆΠ΄Ρƒ полями
htmlFor / idΠΊΠ»ΠΈΠΊ ΠΏΠΎ подписи фокусируСт ΠΏΠΎΠ»Π΅
autocompleteподстановка Π΄Π°Π½Π½Ρ‹Ρ… Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠΌ ΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠΌ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ
inputmodeΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π°Ρ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° Π½Π° ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ…
aria-invalidΠΎΡ„ΠΎΡ€ΠΌΠ»Π΅Π½ΠΈΠ΅ ошибки ΠΈ сообщСниС для скринридСра
aria-describedbyсвязь поля с подсказкой ΠΈ тСкстом ошибки
role="alert"ошибка ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ сразу послС появлСния
focus:ring-2Π·Π°ΠΌΠ΅Ρ‚Π½Ρ‹ΠΉ фокус Π² ΠΏΠΎΠ»Π΅

ЧастыС ошибки

  • ΠŸΠ»Π΅ΠΉΡΡ…ΠΎΠ»Π΄Π΅Ρ€ вмСсто подписи β€” ΠΏΡ€ΠΈ Π²Π²ΠΎΠ΄Π΅ подсказка исчСзаСт.
  • Ошибка ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ красной Ρ€Π°ΠΌΠΊΠΎΠΉ.
  • НСт autocomplete β€” ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ бСсполСзСн.
  • Кнопка ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ Π½Π΅ блокируСтся Π²ΠΎ врСмя запроса.
  • Валидация срабатываСт Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ клавиши.
  • ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹.