States checklist
Дизайнеры рисуют «успешное» состояние и забывают остальные. 80% пользовательского опыта живёт в нестандартных состояниях.
Минимальный набор для любого экрана с данными
| Состояние |
Когда показать |
Что должно быть |
| Loading |
Данные ещё не пришли |
Skeleton (не спиннер), не блокировать UI |
| Empty (cold) |
Никогда не было данных (новый юзер) |
Объяснение + onboarding-кнопка |
| Empty (clean) |
Данные были, сейчас 0 (всё прочитано / выполнено) |
Похвала + нейтральная иллюстрация |
| Empty (filtered) |
Применён фильтр, под него ничего нет |
«Очистить фильтр» |
| Error (network) |
Запрос упал |
«Не удалось загрузить» + Retry |
| Error (forbidden) |
403 |
Что произошло + куда пойти |
| Error (not found) |
404 на конкретный ресурс |
Ссылка на список |
| Partial |
Загрузилась часть |
Показать что есть + индикатор «загружается ещё» |
| Stale |
Данные устарели |
«Обновить» + timestamp |
| Offline |
Сеть пропала |
Баннер + что доступно офлайн |
Минимальный набор для форм
- Default (пустая, до фокуса)
- Focused (поле в фокусе)
- Filled (введено)
- Validating (асинхронная проверка)
- Error (с конкретным сообщением)
- Success (после отправки)
- Disabled
- Read-only (если применимо)
Минимальный набор для кнопок
- Default
- Hover
- Active (нажата)
- Focus-visible
- Disabled
- Loading (асинхронное действие)
- Success-flash (200ms после успеха)
Чек-лист (использовать как linter перед сдачей)
Для каждого экрана прототипа:
Шаблоны компонентов
templates/states.html — готовая страница с примерами всех состояний для копирования.
<!-- Skeleton -->
<div class="skeleton">
<div class="line w-3/4"></div>
<div class="line w-1/2"></div>
<div class="line w-2/3"></div>
</div>
<!-- Empty (cold) -->
<div class="empty">
<div class="empty-icon"><!-- placeholder --></div>
<h2>Здесь будут ваши проекты</h2>
<p>Начните с создания первого проекта.</p>
<button>Создать проект</button>
</div>
<!-- Error -->
<div class="error" role="alert">
<h3>Не удалось загрузить</h3>
<p>Проверьте подключение и повторите.</p>
<button>Повторить</button>
<button class="secondary">Подробности</button>
</div>
CSS skeleton-анимации:
.skeleton .line {
height: 12px; border-radius: 6px;
background: linear-gradient(90deg, #eee 0%, #f5f5f5 50%, #eee 100%);
background-size: 200% 100%;
animation: shimmer 1.4s infinite;
}
@keyframes shimmer {
0% { background-position: 200% 0; }
100% { background-position: -200% 0; }
}
@media (prefers-reduced-motion) {
.skeleton .line { animation: none; background: #eee; }
}
Правила
- Skeleton, не спиннер, на загрузке списков и страниц. Спиннер — только для action-кнопок (200ms-3s).
- Не показывай loading младше 200ms — мерцание раздражает. Дебаунс.
- После 5 секунд — добавь «занимает дольше обычного» сообщение.
- Empty-state не должен быть пустым — это тоже экран, заполни смыслом.
- Error-сообщения — конкретны, без «Произошла ошибка».
Legacy reference
Прежняя расширенная версия скилла (дерево @2026-04-30) сохранена целиком в references/legacy-states-checklist.md. Секции там: 8 обязательных состояний, Чеклист на экран, Empty state design, Error state design, Loading state — когда что показывать, Disabled vs read-only vs locked, Куда сложить варианты состояний, Антипаттерны.
1---2name: states-checklist3description: Чек-лист состояний экрана перед сдачей прототипа: empty, loading, error, partial, success. Триггеры: «happy path только», «8 состояний UI».4---56# States checklist78Дизайнеры рисуют «успешное» состояние и забывают остальные. **80% пользовательского опыта живёт в нестандартных состояниях.**910## Минимальный набор для любого экрана с данными1112| Состояние | Когда показать | Что должно быть |13|---|---|---|14| **Loading** | Данные ещё не пришли | Skeleton (не спиннер), не блокировать UI |15| **Empty (cold)** | Никогда не было данных (новый юзер) | Объяснение + onboarding-кнопка |16| **Empty (clean)** | Данные были, сейчас 0 (всё прочитано / выполнено) | Похвала + нейтральная иллюстрация |17| **Empty (filtered)** | Применён фильтр, под него ничего нет | «Очистить фильтр» |18| **Error (network)** | Запрос упал | «Не удалось загрузить» + Retry |19| **Error (forbidden)** | 403 | Что произошло + куда пойти |20| **Error (not found)** | 404 на конкретный ресурс | Ссылка на список |21| **Partial** | Загрузилась часть | Показать что есть + индикатор «загружается ещё» |22| **Stale** | Данные устарели | «Обновить» + timestamp |23| **Offline** | Сеть пропала | Баннер + что доступно офлайн |2425## Минимальный набор для форм2627- Default (пустая, до фокуса)28- Focused (поле в фокусе)29- Filled (введено)30- Validating (асинхронная проверка)31- Error (с конкретным сообщением)32- Success (после отправки)33- Disabled34- Read-only (если применимо)3536## Минимальный набор для кнопок3738- Default39- Hover40- Active (нажата)41- Focus-visible42- Disabled43- Loading (асинхронное действие)44- Success-flash (200ms после успеха)4546## Чек-лист (использовать как linter перед сдачей)4748Для каждого экрана прототипа:49- [ ] Что видит юзер, который только что зарегистрировался (cold empty)?50- [ ] Что видит, если очистил всё / выполнил всё (clean empty)?51- [ ] Что видит, если выключил wifi на 3 секунды (loading + error)?52- [ ] Что видит, если ввёл неправильные данные в форму?53- [ ] Что видит, если кликнул на ссылку, которая ведёт в удалённый объект?54- [ ] Что видит на slow-3g (skeleton нужен)?55- [ ] Что видит, если у него отключены картинки (alt-текст осмыслен)?5657## Шаблоны компонентов5859`templates/states.html` — готовая страница с примерами всех состояний для копирования.6061```html62<!-- Skeleton -->63<div class="skeleton">64 <div class="line w-3/4"></div>65 <div class="line w-1/2"></div>66 <div class="line w-2/3"></div>67</div>6869<!-- Empty (cold) -->70<div class="empty">71 <div class="empty-icon"><!-- placeholder --></div>72 <h2>Здесь будут ваши проекты</h2>73 <p>Начните с создания первого проекта.</p>74 <button>Создать проект</button>75</div>7677<!-- Error -->78<div class="error" role="alert">79 <h3>Не удалось загрузить</h3>80 <p>Проверьте подключение и повторите.</p>81 <button>Повторить</button>82 <button class="secondary">Подробности</button>83</div>84```8586CSS skeleton-анимации:8788```css89.skeleton .line {90 height: 12px; border-radius: 6px;91 background: linear-gradient(90deg, #eee 0%, #f5f5f5 50%, #eee 100%);92 background-size: 200% 100%;93 animation: shimmer 1.4s infinite;94}95@keyframes shimmer {96 0% { background-position: 200% 0; }97 100% { background-position: -200% 0; }98}99@media (prefers-reduced-motion) {100 .skeleton .line { animation: none; background: #eee; }101}102```103104## Правила105106- **Skeleton, не спиннер**, на загрузке списков и страниц. Спиннер — только для action-кнопок (200ms-3s).107- **Не показывай loading младше 200ms** — мерцание раздражает. Дебаунс.108- **После 5 секунд** — добавь «занимает дольше обычного» сообщение.109- **Empty-state не должен быть пустым** — это тоже экран, заполни смыслом.110- **Error-сообщения — конкретны**, без «Произошла ошибка».111112## Legacy reference113114Прежняя расширенная версия скилла (дерево @2026-04-30) сохранена целиком в `references/legacy-states-checklist.md`. Секции там: 8 обязательных состояний, Чеклист на экран, Empty state design, Error state design, Loading state — когда что показывать, Disabled vs read-only vs locked, Куда сложить варианты состояний, Антипаттерны.