Skip to content

[UX][polish] Overflow and truncation consistency across lanes, todo pane, and panels #74

Closed

Description

@GeekCmore

Summary

Batch of overflow/truncation inconsistencies. Grouped for one polish pass.

UX-17 — Todo pane. Item rows omit overflow: 'truncate' (packages/mayfly/src/transcript/pane-todo.ts:254, :260) while the title and blocked rows truncate (:238, :249); the compiler default is wrap (ui-compiler.ts:1087-1089). The "5-row" folded view can therefore take many more screen rows, an expanded long list has no size cap (pane-todo.ts:283-288), and under lane pressure the clamp drops the tail — including the ctrl+t to collapse footer (surface-manager.ts:241-245). Queue-pane rows likewise wrap unbounded (interaction/pane-queue.ts:39). Related: the todo docstring promises muted strikethrough for completed items but only tone: 'muted' is applied (pane-todo.ts:10 vs :163).

UX-18 — Inconsistent overflow indicators.

  • Header lane silently drops rows past its 4-row cap with no marker (surface-manager.ts:344, SURFACE_HEADER_MAX_ROWS at :88), while bottom panes render … +N more rows (surface-manager.ts:241-245, :317-320) — same situation, two behaviors.
  • A bottom pane allotted exactly one row shows its head with no overflow hint (surface-manager.ts:243).
  • Three truncation indicators in one chrome layer: pi-tui default '...' (chrome.ts:339, :344, :353), '…' (chrome.ts:191), and silent cutoff with no indicator (chrome.ts:412).

UX-19 — ScrollablePanel affordances. The panel chrome carries no scrollbar cell or position counter (scrollable-panel.ts:84-92) — compare the autocomplete list's (3/17) indicator (ui-patterns.ts:153) — so a user reading a long subagent transcript can't tell whether more content exists above/below. render returns [] below width 5 (scrollable-panel.ts:62), making the whole panel including borders vanish instead of degrading. (Suspected) tall plugin overlays are hard-clipped by renderLayoutFrame at the default 33%-of-screen max height with unreachable tails (surface-renderer.ts:205-211); shipped overlays embed ui.scroll(...), so impact depends on third-party content.

Acceptance criteria

  • Todo/queue rows truncate consistently; folded height matches the promise; expanded lists are size-capped; the footer survives clamping.
  • One overflow-indicator convention across lanes and chrome (with a marker whenever content is hidden).
  • ScrollablePanel exposes a scroll-position affordance and degrades gracefully at tiny widths.

Audit reference

docs/audits/2026-09-28-ui-ux-audit-data-and-layout.md § UX-17 – UX-19 (baseline 27bc188, 2026-09-28)

Activity

  1. self-assigned this
    on Sep 28, 2026
  2. GeekCmore commented on Sep 28, 2026

    @GeekCmore
    CollaboratorAuthor

    In progress (status:in-progress). Covered by the unified overflow pass:

    • One overflow-indicator convention: the header lane no longer silently drops rows; fitSurfaceRows/surface-renderer share one marker; content truncation uses … everywhere.
    • Todo rows truncate (overflow: 'truncate'), the expanded list is size-capped, and the ctrl+t collapse/expand affordance survives lane clamping (overflowKeepsTail).
    • ScrollablePanel: scroll-position indicator and graceful degradation below width 5 instead of vanishing; tall overlays verified/regression-tested.

    Note: the queue-row wrap item is already fixed on main by #57 — interaction/pane-queue.ts now sets overflow: 'truncate' (baseline 27bc188 did not). Only a regression test is needed.

    Branch fix/display-layout-fidelity.

  3. GeekCmore commented on Sep 28, 2026

    @GeekCmore
    CollaboratorAuthor

    Implementation opened as #81 (branch fix/display-layout-fidelity). pnpm run verify:full is green (typecheck, lint, build, shots, coverage, happy smoke). Manual runtime acceptance is pending before merge.

  4. added 2 commits that reference this issue on Sep 28, 2026
  5. GeekCmore commented on Sep 29, 2026

    @GeekCmore
    CollaboratorAuthor

    Closing as fixed, verified on current main.

    • One overflow-indicator convention: OVERFLOW_ELLIPSIS (…, core/width.ts) marks the chrome frame's title/footer rows, panel chrome, and the degenerate-width clamp.
    • Todo rows truncate (overflow: 'truncate') with the MAX_VISIBLE fold cap and the ctrl+t affordance (transcript/pane-todo.ts); pane-todo.spec.ts (24 tests) pins the folded/expanded selection and the affordance contract.
    • Queue rows truncate and the regression test this issue asked for exists: interaction/pane-queue.spec.ts pins the one-rendered-line contract against long rows (overflow: 'truncate' on every queue row).
    • The fold affordance survives lane clamping: overflowKeepsTail classification asserted in plugin-surface-bridge-pane.spec.ts (29) and surface-manager.spec.ts (27).
    • Below-frame-minimum degrade survives as the FRAME_DEGENERATE_WIDTH backstop in core/chrome.ts.

    Note: ScrollablePanel and its (start-end/total) position indicator were removed by the #85 conversation-views rework (component + spec deleted together); panels now budget from screen.editorViewport. If a scroll-position indicator is still wanted, that is new work against #85's architecture — please open a fresh issue rather than reopening this one.

    Deterministic evidence re-run today on main (14e6ce7): pane-todo 24, pane-queue 7, surface-manager 27, plugin-surface-bridge-pane 29, width scans 300 — all pass.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingstatus:in-progressWork has started on this issue

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions