Skip to content

feat(web): add persistent theme/language preferences and accessibility/mobile hardening #350

Description

@sowen1023

Parent

Problem

The current Web UI follows browser language detection and one fixed visual presentation. It has no user-facing theme or language controls, no reviewed persistence contract for those choices, and only initial responsive/reduced-motion coverage. Keyboard navigation, focus management, screen-reader semantics, contrast, zoom, and narrow mobile layouts have not received a complete real-browser audit.

These are recoverable polish gaps, but together they prevent the workbench from being a dependable daily interface for a broader range of users.

Value

  • Let users choose a readable appearance and language consistently.
  • Make all core workbench operations usable without a pointer.
  • Catch mobile and accessibility regressions with repeatable evidence.

Approach constraints

  • Package-owned theme/UI preferences follow the OpenPI setup configuration contract: canonical config, setup status, SETUP.md, README defaults, and tests stay synchronized.
  • Define which transient browser state, if any, may remain browser-local; do not create an accidental second package configuration store.
  • Preserve system preference fallback and reduced-motion behavior.
  • Theme and language changes must not reload, duplicate, or mutate the active Session.
  • Avoid color-only status communication and preserve semantic labels.
  • Validate real browser behavior in addition to static source assertions.

Acceptance criteria

  • Users can choose documented supported themes plus system/default behavior.
  • Users can explicitly choose supported languages plus automatic detection.
  • Preferences survive reload according to the documented canonical storage contract.
  • No credential, Session transcript, or workspace path is persisted with UI preferences.
  • Sidebar, dialogs, model picker, search, composer, transcript, tool details, and activity panels are fully keyboard operable.
  • Focus is trapped/restored correctly for dialogs and remains visible.
  • Accessible names, roles, live updates, status text, contrast, zoom, and reduced motion are audited.
  • Core flows remain usable at documented narrow viewport widths and with touch input.
  • Automated accessibility checks and real-browser desktop/mobile interaction tests are added.
  • Setup/config documentation and drift guards are updated for package-owned preferences.
  • bun run check and bun run test pass.

Out of scope

  • Native mobile applications.
  • Pixel parity with another product.
  • Remote synchronization of personal UI preferences.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions