forms-a11y
Формы, которые работают со скрин-ридерами и клавиатурой. Label, описания, ошибки, focus-management.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Формы, которые работают со скрин-ридерами и клавиатурой. Label, описания, ошибки, focus-management.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Research a company or person for sales intel — web search standalone, richer with enrichment tools or CRM connected. Trigger with "research [company]", "look up [person]", "intel on [prospect]", "who is [name] at [company]".
AI-музыка локально на your GPU (ACE-Step 1.5): инструменталы и песни, авто/кастомная лирика, модели base/xl-turbo; CLI scripts/generate.py. Триггеры: «напиши песню», jingle, soundtrack, background music. НЕ Suno (skill suno), не ElevenLabs Music.
OpenAI-совместимый HTTP-сервер поверх ЛОКАЛЬНОГО claude CLI (подписка Max, без API-ключа) — отдаёт Claude как /v1/chat/completions для n8n, OpenAI-SDK, IDE, curl, Open WebUI; SSE-стрим, X-Session-Id. НЕ: наружу к OpenAI/Perplexity/Runway→local-gateway; разовый вызов из Python→claude-cli-runner; боевые Hermes-боты→agent-builder tooling.
Prepare for a sales call — account context, attendee research, suggested agenda; richer with CRM, email, chat or transcripts connected. Trigger with "prep me for my call with [company]", "call prep [company]", "get me ready for [meeting]".
Создание визуальных карточек-каруселей для Telegram-канала — editorial стиль. HTML+CSS шаблон → Playwright render → PNG-серия 1080×1350. Библиотека шаблонов лежит в templates/ (read-only образцы); новая серия создаётся в рабочей директории (CWD). Вызывается сам или из tg-post. Триггеры — «карточки для канала», «карусель в канал», «сделай series», «нарисуй cover», «slides для поста».
Verify any fact, claim, number, statement, citation or AI-generated output for hallucinations — cross-check sources, validate research findings. Triggers: "/check-skill-solo", «проверь», «перепроверь», "verify", "fact-check".
| name | forms-a11y |
| description | Формы, которые работают со скрин-ридерами и клавиатурой. Label, описания, ошибки, focus-management. |
| when_to_use | Любая форма в production-продукте. Не для прототипа на 5 минут. |
Формы — самая нарушаемая часть accessibility. Делай правильно с первого раза.
<!-- ✅ Правильно -->
<label for="email">Email</label>
<input id="email" type="email" name="email">
<!-- ✅ Альтернатива (label оборачивает) -->
<label>
Email
<input type="email" name="email">
</label>
<!-- ❌ Неправильно — placeholder вместо label -->
<input type="email" placeholder="Email">
<!-- ❌ Неправильно — visually-hidden span ≠ label -->
<input type="email" name="email">
<span class="sr-only">Email</span>
<label for="search" class="sr-only">Поиск</label>
<input id="search" type="search" placeholder="Поиск...">
.sr-only {
position: absolute; width: 1px; height: 1px;
padding: 0; margin: -1px; overflow: hidden;
clip: rect(0,0,0,0); white-space: nowrap; border: 0;
}
<label for="pwd">Пароль</label>
<input id="pwd" type="password" aria-describedby="pwd-help">
<p id="pwd-help" class="helper">Не меньше 8 символов, цифра и буква.</p>
aria-describedby ID элемента, прочитается скрин-ридером после label.
<label for="email">Email</label>
<input id="email" type="email" aria-invalid="true" aria-describedby="email-err">
<p id="email-err" class="error" role="alert">Введите корректный email — например, ivan@example.com.</p>
aria-invalid="true" — статус.aria-describedby — связывает с текстом.role="alert" — скрин-ридер прочитает сразу.<label for="name">Имя <span aria-hidden="true">*</span></label>
<input id="name" required aria-required="true">
* визуальная — aria-hidden. required + aria-required для скрин-ридера и валидации.
<fieldset>
<legend>Способ оплаты</legend>
<label><input type="radio" name="pay" value="card"> Карта</label>
<label><input type="radio" name="pay" value="cash"> Наличные</label>
</fieldset>
<fieldset> + <legend> — обязательны для группы radio/checkbox. Без них скрин-ридер не понимает, к чему относятся опции.
<input type="text" autocomplete="given-name" name="firstName">
<input type="text" autocomplete="family-name" name="lastName">
<input type="email" autocomplete="email" name="email">
<input type="password" autocomplete="current-password">
<input type="password" autocomplete="new-password">
<input type="tel" autocomplete="tel">
<input type="text" autocomplete="postal-code">
<input type="text" autocomplete="cc-number" inputmode="numeric">
Полный список — на developer.mozilla.org/autocomplete.
inputmode="numeric" — показывает цифровую клавиатуру на мобильных.
После сабмита формы — переведи фокус:
form.addEventListener('submit', async e => {
e.preventDefault();
const result = await validate(form);
if (result.errors.length) {
const firstErrEl = form.querySelector(`[name=${result.errors[0].field}]`);
firstErrEl.focus();
} else {
successEl.tabIndex = -1;
successEl.focus();
}
});
<button type="submit">Создать аккаунт</button>
type="submit" — иначе Enter не сработает.<button type="submit" aria-busy="true" disabled>
<span class="spinner" aria-hidden="true"></span>
<span>Создаём…</span>
</button>
aria-busy + текст «Создаём…» — понятно скрин-ридеру.
Visual-only паттерн. Нужен label под капотом. Никогда не заменяй placeholder'ом.
<div class="float">
<input id="email" type="email" placeholder=" ">
<label for="email">Email</label>
</div>
.float { position: relative; }
.float input { padding: 24px 12px 8px; }
.float label {
position: absolute; left: 12px; top: 16px;
pointer-events: none; transition: all .15s ease;
color: #888;
}
.float input:focus + label, .float input:not(:placeholder-shown) + label {
top: 4px; font-size: 11px; color: #555;
}
Для каждого поля:
<label> или aria-labelaria-describedby (где нужно)role="alert" и aria-invalidautocomplete для известных полейtype соответствует данным (email, tel, url, number)inputmode на мобильныхДля формы:
<fieldset> для групп radio/checkboxdisplay: none — скрин-ридеры пропустят.<div onclick>. Только <button> или <a>.tabindex на не-интерактивных элементах.outline: none без замены focus-кольца.Прежняя расширенная версия скилла (дерево @2026-04-30) сохранена целиком в references/legacy-forms-a11y.md. Секции там: Минимум на каждое поле, Полная таблица типов, Группировка через fieldset, Error UX, Focus rings, Disabled vs read-only, Mobile keyboards, Required indicator, Validation на стороне клиента vs сервера, Антипаттерны.