GH GambleHub

Мікровзаємодії та фідбек

1) Що таке мікровзаємодія

Мікровзаємодії - короткі цикли «сигнал ↔ відповідь», що підтверджують, що система почула користувача і рухається до результату.

Класична четвірка:

1. Тригер (клік, свайп, фокус, системна подія).

2. Правила (що і як змінюється).

3. Фідбек (візуальний/звуковий/тактильний/текстовий).

4. Цикл/мета-правила (повтор, закінчення, undo/redo).

Мета: знизити невизначеність і когнітивне навантаження, не відволікаючи від завдання.

2) Принципи проектування

Сенс> ефект. Ефект пояснює «що сталося» і «що далі».
Миттєвість. Перший відгук ≤ 100 мс (кнопки/перемикачі).
Однозначність. Помітні стани: hover/focus/pressed/disabled/loading.
Економія. Мінімум властивостей, короткі тривалості, без «салютів».
Консистентність. Однакові дії - однакові сигнали.
Доступність. Фідбек бачимо, чуємо і читаємо скрінрідером; є альтернатива руху/звуку.

3) Таймінги і криві

Hover/Focus: 120-180 мс

Pressed/Toggle: 80-120 мс

Toast/Tooltip: вхід 180-240 мс, вихід 120-160 мс

Inline-валідація: ≤ 100 мс після втрати фокусу поля

Типова крива: `cubic-bezier(0. 2, 0, 0. 2, 1)`; для pressed - прискорена'cubic-bezier (0. 4, 0, 1, 1)`.

4) Каталог мікровзаємодій

4. 1 Кнопки та перемикачі

Негайний відгук: візуальний «клацання «/вдавлювання + стан'busy'при мережевому запиті.
Оптимістичне оновлення: міняємо UI відразу, відкочуємо при помилці (з undo).
Дебаунс подвійних кліків: блокуємо повтор до відповіді/timeout.

4. 2 Inline-валідація форм

Валідація на blur поля; повідомлення короткі і конструктивні («мінімум 8 символів»).
Іконка статусу + колір + текст (не кольором одним).
Для паролів - моментальний індикатор «сили» (не заважає введення).

4. 3 Тости/банери/снекбари

Використовуйте для неблокуючих підтверджень.
Тривалість 2-5 с, пауза при hover/focus, кнопка Undo де доречно.
Не закривайте важливий контент і CTA.

4. 4 Прогрес і скелетони

Якщо довжина процесу відома - прогресбар; якщо ні - skeleton замість спінера.
Без стрибків layout: фікс. висоти блоків.

4. 5 Бейджі/лічильники

Контраст цифри ≥ 4. 5:1; максимум 99/999 з усіченням'99 +'.
Анімації інкременту - короткі кроки 40-60 мс батчами, без «тремтіння» макета.

4. 6 Tooltip/Help

Поява по hover/focus; доступність через'aria-describedby'.
Заборона на критичну інформацію тільки в tooltip.

5) Помилки, порожні стани, undo

Помилка: чесний текст, пояснення причини і дії («Повторити», «Змінити карту»).
Порожній стан: що це і як почати; ілюстрація приглушена, контраст тексту AA/AAA.
Undo window: 5-10 с для оборотних дій (видалення, скасування ставки до кулі).

6) Мультимодальний фідбек

Звук: тихий, короткий, один патерн на тип події (успіх/помилка/увага); вимикаємо в налаштуваннях.
Вібро/хаптика: легкий відгук на press/успіх; поважаємо'prefers-reduced-motion'і системні обмеження.
Візуальний: тільки'transform/opacity', без важких blur/тіней на масивах.

7) Доступність (A11y)

`:focus-visible'для клавіатури; фокус-кільце без blur.
Скрінрідер: 'role = «status »/» alert»'для тостів; живі регіони'aria-live = «polite/assertive»'.
Альтернатива звуку/руху;'prefers-reduced-motion: reduce`.
Контраст тексту та іконок - по WCAG (звичайний ≥ 4. 5:1).

8) Перформанс

Реагуйте за ≤ 100 мс: візуальний відгук до мережі.
Анімуйте'transform/opacity'; уникайте'height/left/box-shadow'на безлічі елементів.
Мережеві ефекти - з префетчем і оптимістикою; ретраї ідемпотентні.

9) Токени мікровзаємодій (дизайн-система)

json
{
"micro": {
"duration": { "hover": 160, "focus": 160, "press": 90, "toastIn": 220, "toastOut": 140 },
"easing":  { "std": "cubic-bezier(0. 2,0,0. 2,1)", "acc": "cubic-bezier(0. 4,0,1,1)" },
"toast":  { "timeoutMs": 3500, "pauseOnHover": true },
"badge":  { "max": 99, "emphasisStepMs": 50 }
}
}

10) Сніпети реалізації

Тост з паузою по hover і Undo:
html
<div id="toast" role="status" aria-live="polite" hidden></div>
<script>
const toast = (msg, {undo, timeout=3500}={})=>{
const el = document. getElementById('toast');
el. innerHTML = undo? '$ {msg} <button> Undo </button>': msg;
el. hidden = false;
let t = setTimeout(close, timeout);
el. onmouseenter = () => clearTimeout(t);
el. onmouseleave = () => t = setTimeout(close, timeout);
if (undo) el. querySelector('button'). onclick = ()=>{ undo(); close(); };
function close(){ el. hidden = true; el. innerHTML=''; }
};
</script>
Inline-валідація на blur:
js const rules = { password: v => v.length>=8         "Minimum 8 characters"};
document. querySelectorAll('[data-validate]'). forEach(i=>{
i.addEventListener('blur', e=>{
const rule = rules[e. target. name]; if (!rule) return;
const ok = rule(e. target. value);
e. target. dataset. state = ok===true? 'ok': 'err';
e. target. nextElementSibling. textContent = ok===true? '': ok;
});
});
Хаптика/вібро (фолбек):
js export const haptic = type => {
if (!('vibrate' in navigator)) return;
if (type==='success') navigator. vibrate(10);
if (type==='error') navigator. vibrate([20,40,20]);
};
CSS для «дешевих» ефектів:
css
.button{ transition: transform. 09s cubic-bezier(.4,0,1,1), box-shadow. 16s cubic-bezier(.2,0,.2,1); }
.button:active{ transform: scale(.98); }
.input[data-state="err"]{ outline: 2px solid var(--role-danger); }
.sr-only{ position:absolute; width:1px; height:1px; overflow:hidden; clip:rect(0 0 0 0); white-space:nowrap; }
@media (prefers-reduced-motion: reduce){ { animation:none! important; transition-duration:.01ms! important; } }

11) Метрики та контроль якості

INP p75 <200 мс, частка Long Tasks <5%.
First User Feedback (klik→vizualnyy відгук) ≤ 100 мс.
Частка оптимістичних дій з відкатом <3% (інакше - недовіра).
UX-опитування: зрозумілість повідомлень про помилки, видимість підтверджень.

QA-чек-лист

  • У кожного інтерактиву є'pressed/busy/disabled'.
  • Помилки супроводжуються текстом і діями (Retry/Undo).
  • Тости доступні по SR і не перекривають ключовий контент.
  • Inline-валідація не заважає введення; повідомлення конкретні.
  • Підтриманий'prefers-reduced-motion'; звук/вібра вимикаються.
  • Немає стрибків layout і строба; анімації на'transform/opacity'.

12) Специфіка iGaming

Ставка/купівля: миттєвий'pressed→busy', тост «Прийнято» з Undo (якщо регламент дозволяє), idempotent-ключі; при затримці> 1 с - «Очікуємо підтвердження»....
Spin/Reveal: короткий прес-фідбек, плавний старт/стоп без нескінченного блимання; виграш - сплеск ≤ 500 мс + читабельний текст (AAA).
Лайв-коефіцієнти: оновлення батчами, візуальний дифф (стрілка/товщина) без «стрибків».
Платежі/висновки: покроковий прогрес (KUS→Proverka→Vyplata), прозорі тексти причин відмови.
Відповідальна гра: повідомлення без відволікаючих ефектів; вищий контраст, явні CTA «Встановити ліміт».

13) Анти-патерни

Чекати мережевої відповіді, перш ніж показати відгук на клік.
«Колір без форми»: стан відрізняється тільки відтінком.
Нескінченні пульсації/миготіння, різкі звуки без вимикача.
Tooltip з критичним контентом, недоступним з клавіатури.
Спінер в порожнечі> 1-2 с без прогресу/скелетону.
Тонкі тіні/blur на сотнях елементів (лаг на слабких пристроях).

14) Документація в дизайн-системі

«Micro-tokens»: 'duration/easing', пресети тостів/бейджів/валідаторів.
«Patterns»: кнопки, форми, тости, прогрес, inline-помилки, undo.
«A11y & Motion»: правила для SR/HC/reduced-motion; приклади ARIA.
«Do/Don’t»: короткі кліпи з таймінгами, цифрами INP/First Feedback.

Коротке резюме

Мікровзаємодії - це мова впевненості. Давайте відгук за ≤ 100 мс, фіксуйте зрозумілі стани, використовуйте оптимістику з безпечним відкатом, не покладайтеся тільки на колір і анімуйте легкі властивості. Поважайте доступність і продуктивність - тоді продукт відчувається живим, чесним і надійним, особливо в сценаріях реального часу.

Contact

Зв’яжіться з нами

Звертайтеся з будь-яких питань або за підтримкою.Ми завжди готові допомогти!

Розпочати інтеграцію

Email — обов’язковий. Telegram або WhatsApp — за бажанням.

Ваше ім’я необов’язково
Email необов’язково
Тема необов’язково
Повідомлення необов’язково
Telegram необов’язково
@
Якщо ви вкажете Telegram — ми відповімо й там, додатково до Email.
WhatsApp необов’язково
Формат: +код країни та номер (наприклад, +380XXXXXXXXX).

Натискаючи кнопку, ви погоджуєтесь на обробку даних.