Repository navigation
Description
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:56setsselected: []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:254dropsthis.decisionwith 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
GeekCmore commentedon Sep 28, 2026
部分处理中 / 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
GeekCmore commentedon Sep 29, 2026
Adding two residuals moved here from #73 (closed as fixed):
formatElapsedMs(packages/mayfly/src/core/ui-patterns.ts:412) caps atm+s, so a ≥1h loader renders125m 3s; make it hours-aware likecompactElapsedSeconds(2h 5m 3s)./helptwo-column layout: rows remain single-column flowing text; the audit asked for two-column aligned label/description.