Skip to content

[UX][polish] Interaction nits: digit filters, selection markers, confirmation depth, loading states #75

Open

Description

@GeekCmore

Summary

Batch of small interaction-consistency defects. Grouped for one polish pass.

UX-22 — Digit conflicts in numbered lists. In a numbered, filterable list, digits are bound to row selection before type-to-filter (packages/mayfly/src/core/ui-key-grammar.ts:278-280 is pushed ahead of the listText search matcher at :300), so a filter query cannot begin with a digit: typing "2024" picks row 2. The / escape hatch exists (:273) but no hint tells the user while the numbered hint (1-9 choose) is displayed. Also, the 1-N hint counts all visible rows including disabled ones (ui-compiler.ts:788, ui-interaction-choice.ts:211-213), but pressing a digit on a disabled row silently does nothing (ui-compiler.ts:2267).

UX-24 — Selection semantics diverge.

  • Two marker vocabularies for the same semantics: single-choice lists render ●/space (radio metaphor) and multi-select ●/○ (ui-patterns.ts:274), but expanded form pickers render [x]/[ ] for both single and multi (ui-patterns.ts:373).
  • Typing "Other" text silently discards a picked option in single-select questionnaires — questionnaire.ts:56 sets selected: [] whenever custom text is present on a non-multiSelect question; multi-select keeps both, so behavior differs by question type.
  • An open Yes/No confirmation vanishes silently when the underlying source changes: ui-interaction-surface.ts:254 drops this.decision with no message.

UX-25 — Confirmation depth. Same-class destructive actions carry three warning levels: rich browse-list Remove (plugin-commands.ts:371) vs bare-string detail-panel Remove (plugin-commands.ts:313) vs bare-string provider Delete (provider-edit.ts:162, though a matching detail translation exists unused at locale.ts:67).

UX-28 — Autocomplete loading gaps. When the skills catalog hasn't settled, the # branch returns null and no dropdown opens — no "loading skills…" row (editor-plus.ts:213-220, skills-catalog.ts:137); the @ path has an empty-result notice (editor-plus.ts:195-197) but no "searching…" row while scans run (pi-tui has no loading-row concept; runAutocompleteRequest cancels on null).

UX-29 — Wizard error on a hidden tab. On a custom endpoint with zero models, Save (provider-add.ts:101-103) fails minSelected: 1 on advertised-models (provider-add.ts:86); the selection-error path focuses but does not activate the hidden tab (ui-interaction-surface.ts:523-526; contrast field errors which do switch tabs at :562-565).

Acceptance criteria

  • Filter-first typing works for digits (or the / hatch is hinted); the numbered hint excludes inert digits.
  • One marker vocabulary per selection mode; "Other" text never silently discards a selection; confirmation disappearance is explained or prevented.
  • Destructive confirmations share one warning convention.
  • #/@ autocomplete shows a pending state; wizard errors activate the tab containing the failing control.

Audit reference

docs/audits/2026-09-28-ui-ux-audit-interaction-and-usability.md § UX-22, UX-24, UX-25, UX-28, UX-29 (baseline 27bc188, 2026-09-28)

Activity

  1. GeekCmore commented on Sep 28, 2026

    @GeekCmore
    CollaboratorAuthor

    部分处理中 / Partially in progress — PR #79 (feat/i18n-hardening)。

    覆盖了 UX-25 的 i18n 相关部分:provider 删除确认改为复用已有的详情译文(Remove the provider configuration and its stored API key.)。

    UX-22/24/28/29(数字筛选、选择标记、确认深度、autocomplete loading)属于交互语义,不在该 PR 范围内,本 issue 保持开启。

    PR: #79

  2. GeekCmore commented on Sep 29, 2026

    @GeekCmore
    CollaboratorAuthor

    Adding two residuals moved here from #73 (closed as fixed):

    • Loader durations ≥ 1h: formatElapsedMs (packages/mayfly/src/core/ui-patterns.ts:412) caps at m+s, so a ≥1h loader renders 125m 3s; make it hours-aware like compactElapsedSeconds (2h 5m 3s).
    • /help two-column layout: rows remain single-column flowing text; the audit asked for two-column aligned label/description.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions