Skip to content

Shell: switch surfaces with the kit tab bar #75

Closed

Description

@elementalvoid

What to build

The surface switch above the content becomes the kit's tab bar. Seven surfaces — dashboard, upload, failed items, review, settings, logs, diagnostics — stay switchable, and the switch now scrolls or offers an overflow menu when the window is too narrow for all of them, instead of clipping or forcing a large minimum window width.

The window minimum size currently exists partly because seven hand-built buttons must fit on one row. This ticket decouples those two decisions.

Acceptance criteria

  • Pointer and keyboard both reach every surface, and the selected one is conveyed by more than colour.
  • At a window narrower than the seven labels, nothing is clipped: the bar scrolls, or the overflow menu lists the tabs that do not fit, and picking one switches to it.
  • The window's minimum size is set by the narrowest surface's layout, not by the tab row, and the comment on it says so.
  • The environment-variable surface pin and the folder-detail link into a filtered list still open the surface they name.
  • The per-surface tests that assert the switch still pass; the nav element ids tests rely on are preserved.

Notes

Accessibility is the point, not a side effect: the accessibility label of each tab is part of the acceptance, not a follow-up.

Activity

  1. elementalvoid commented on Oct 31, 2026

    @elementalvoid
    OwnerAuthor

    Landed in main at 35691b2, merged from integration/kit-surface (CI green at 43223e2). Gate on the merged tree: cargo fmt --all -- --check, cargo clippy --workspace --all-targets -D warnings, cargo test --workspace — all clean.

    What the reviews changed. Three passes. The keyboard path had no visible focus state — a regression from the Button it replaced — and nothing at all told a user that tabs were hidden at the minimum window. The fix took the kit's focus ring and edge fades, with the fades lever-tested for pointer hit-testing; a third pass found the ring clipped top and bottom, painting brackets rather than a ring, so the strip now keeps its room on every side with the geometry asserted. The minimum is 520×480, set by the dashboard header, and the tab row provably no longer holds it open.

    Still manual. Real screen reader; a real trackpad (the mask's axis lock is untested here); macOS/Windows runtime. Known: the strip reveals on resize, so scrolling the tabs away and then resizing snaps back to the shown surface's tab.

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

    accessibilityBarrier affecting people with disabilitiesenhancementNew feature or requestready-for-agentFully specified, ready for an AFK agent

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions