UI: доводка выпадашек игроков — без пустых вариантов, фон как у select, быстрее отклик

Из списков убраны варианты-плейсхолдеры («— игрок —» в выборе игрока,
«— фракция —» в выборе фракции — disabled+hidden, в закрытом виде текст
остаётся). Фон .suggest-list — surface-2, как у input/select; hover строк —
--border. Скорость: дебаунс поиска 250→100 мс, в инвайте показанный список
дофильтровывается по вводу на клиенте, не дожидаясь ответа сервера;
touch-action: manipulation на строках и триггере.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-18 03:13:05 +03:00
co-authored by Claude Fable 5
parent f22ee1ec29
commit 8a2b53d0b2
6 changed files with 20 additions and 32 deletions
+5 -1
View File
@@ -215,7 +215,11 @@ export function CreateMatchPage() {
}
style={{ flex: 1 }}
>
<option value="">— фракция —</option>
{/* disabled+hidden: в закрытом select это плейсхолдер, в раскрытом
списке варианта «— фракция —» нет. */}
<option value="" disabled hidden>
— фракция —
</option>
{(factions ?? []).map((f) => (
<option key={f.id} value={f.id}>
{f.name_ru}
+6 -1
View File
@@ -57,8 +57,13 @@ export function GroupPage() {
};
// Подсказки: уже состоящих в группе не предлагаем, показываем до 3.
// Дофильтровка по текущему вводу — на клиенте: пока сервер отвечает на новую
// букву, показанный список (keepPreviousData) сужается мгновенно.
const memberIds = new Set((members ?? []).map((m) => m.user_id));
const suggestions = (foundUsers ?? []).filter((u) => !memberIds.has(u.user_id)).slice(0, 3);
const needle = newNick.trim().toLowerCase();
const suggestions = (foundUsers ?? [])
.filter((u) => !memberIds.has(u.user_id) && u.nickname.toLowerCase().includes(needle))
.slice(0, 3);
const showSuggest =
nickFocused && !nickPicked && newNick.trim().length > 0 && suggestions.length > 0;