Skip to content

UI/UX polish: GroupSetup back button, AMOLED contrast, i18n, confirm dialogs#19

Draft
AndVl1 wants to merge 11 commits into
masterfrom
feat/ui-ux-polish-2026-06-12
Draft

UI/UX polish: GroupSetup back button, AMOLED contrast, i18n, confirm dialogs#19
AndVl1 wants to merge 11 commits into
masterfrom
feat/ui-ux-polish-2026-06-12

Conversation

@AndVl1

@AndVl1 AndVl1 commented Jun 12, 2026

Copy link
Copy Markdown
Owner

Автономный UI/UX-свип (/team, full-feature). ~32 дефекта найдено 3 агентами, исправлено.

Headline (по запросу)

  • GroupSetup: добавлена стрелка «назад» в TopAppBar (была главная жалоба — выхода на главную не было).
  • «Тёмное на тёмном»: корень — BoutScreen, чёрная карточка 0xFF212121 исчезала на AMOLED 0xFF000000. Введён BlackCardSurface = 0xFF424242; жёлтая карточка — contentColor на кнопке; хардкод Color.White/Gray → токены темы. (Иконки тулбара уже были корректны — onSurface.)

Также

  • action_back (RU/EN) для всех стрелок «назад» — раньше озвучивали "Settings".
  • Полная локализация SettingsScreen (был хардкод-русский).
  • Диалоги подтверждения деструктивных действий: Reset / Skip / Exclude fencer.
  • GroupSetup: валидация пустых/дублирующихся имён + Snackbar, IME-навигация, обработка ошибок createPool.
  • BoutConfirm/BoutResult: Scaffold/insets; безопасный бэкстек (back больше не возвращает на сыгранный бой); recordBoutResult идемпотентен.
  • DE: экран ошибки + «Повторить» вместо вечного спиннера.
  • Undo всегда отрисован (без скачка тулбара); тач-таргет карточки 48dp; BoutsList без ложного ripple; BoutResult isLeftWinner.

Ревью

  • code-reviewer: APPROVED (0 critical/high).
  • manual-qa: 9/9 PASS на эмуляторе (скриншоты в vibe-report/screens/ui-ux-polish/).
  • qa нашёл HIGH-баг (isCreating не сбрасывался → «Создать» disabled после возврата) — исправлен; +6 инструментальных тестов.

Проверки

  • assembleDebug: PASS · assembleDebugAndroidTest: PASS
  • connectedDebugAndroidTest: затронутые 8 — 0 падений; полный прогон 42/43 (1 пред-существующий flake boutConfirm_startBout, не относится к ветке).

Отчёт: vibe-report/ui-ux-polish-2026-06-12.md.

🤖 Generated with Claude Code

AndVl1 and others added 11 commits June 12, 2026 14:44
…kCardSurface color token

Adds 17 new string resource keys (action_back, settings_mode_*, confirm_reset_*,
confirm_skip_*, cd_give_card, error_create_pool_failed, more_options,
ranking_header_name, de_load_error, retry, confirm_exclude_fencer,
de_slot_bye/tbd) to values/ (RU default), values-en/, and values-ru-rRU/.
Adds BlackCardSurface color visible on both AMOLED-black and dark-gray surfaces.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…rs; SettingsScreen i18n

BoutScreen: reset/skip buttons now show AlertDialog before acting; undo always rendered
with alpha(0.3f) when disabled; timer turns RedTimer at zero; fencer names/scores use
theme tokens; card indicator has minimum touch target and contentDescription; yellow card
button uses Color.Black contentColor; intentional no-back-arrow comment added.

SettingsScreen: all hardcoded strings replaced with stringResource() calls.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…E, weapon i18n

Component: GroupSetupError sealed class (BlankNames/DuplicateNames/CreateFailed);
validation moved from screen to component; Crashlytics recordException on createPool
failure; DismissError event clears error state.

Screen: Scaffold with CenterAlignedTopAppBar + back arrow (testTag groupSetup_button_back);
LaunchedEffect shows localized Snackbar on error; all text fields get singleLine + IME
Next (Done on last region field); weapon chips use private weaponLabel() composable;
create button enabled only when not creating (validation is component responsibility).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…i18n, back CD

Replace all Color.Gray borders with MaterialTheme.colorScheme.outline (4 occurrences
including MatrixCellView); remove Color import that was only used for gray borders.
EditScoreDialog and QuickEntryDialog: confirm button enabled only when both score inputs
are valid integers. ExcludeFencerDialog: two-step confirmation — click fencer to show
nested AlertDialog with confirm_exclude_fencer formatted string.
MoreVert icon gets contentDescription more_options; back icon CD changed to action_back.
Rankings table Name header uses ranking_header_name string resource.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…, back CD

Component: DeTableauEvent.Retry resets to loading state and re-calls observeData().
Screen: bracket==null/error branch shows error Text + retry Button with testTags
de_text_loadError and de_button_retry instead of a bare spinner; slotDisplayText
made @composable to use stringResource for BYE/TBD slots; back arrow CD uses action_back.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…Confirm Scaffold

BoutsListScreen: BoutListItem split into interactive/non-interactive Card overloads via
private BoutListItemContent composable; pending bouts no longer show ripple feedback.

BoutResultComponent: isLeftWinner computed property (get() = winner == "LEFT") added to
BoutResultState to avoid repeated inline comparisons; idempotency comment on init block.
BoutResultScreen: systemBarsPadding() added to root Column; left/right columns use fixed
Alignment.Start/End; all winner checks use state.isLeftWinner/!state.isLeftWinner.

BoutConfirmScreen: wrapped in Scaffold(@OptIn ExperimentalMaterial3Api); TopAppBar with
ArrowBack navigationIcon (testTag boutConfirm_button_back, CD action_back, onClick=Cancel);
innerPadding threaded to both loading and content branches; bottom Cancel button kept.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…e objects

RootComponent: PoolBout.onBoutFinished uses navigation.navigate{} to drop everything
above GroupDashboard before pushing BoutResult, so Continue/Back from BoutResult goes
directly to GroupDashboard instead of landing on a stale BoutConfirm.

Tests: BoutPage adds resetConfirmButton + skipConfirmButton matchers; GroupSetupPage
adds backButton matcher; boutScreen_resetBout and boutScreen_skipSection now click
the confirm dialog button after the action button.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
… Create button on back-nav

GroupSetupComponent now sets isCreating=false before calling onPoolCreated so that
navigating back to the screen leaves the button enabled (F1 fix).
GroupSetupScreen wraps SnackbarHost to expose testTag for instrumented tests.
GroupDashboardScreen adds testTags to overflow button, exclude menu item, fencer
buttons and second-step confirm dialog text (F3 prerequisites).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
F2: BoutConfirmPage.backButton selector for boutConfirm_button_back.
F3 tests added:
- groupSetup_backButton_navigatesHome
- groupSetup_blankName_showsSnackbar (asserts groupSetup_snackbar tag)
- groupSetup_duplicateName_showsSnackbar (asserts groupSetup_snackbar tag)
- boutConfirm_backArrow_navigatesToDashboard
- excludeFencer_secondStepConfirmationRequired
GroupDashboardPage gets overflow/exclude/fencer/confirm-dialog selectors.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant