Skip to content

feat(ui): WebUI modernization PR7 — mobile layout + WCAG accessibility pass#115

Closed
jkyberneees wants to merge 1 commit into
feat/webui-modernization-6from
feat/webui-modernization-7
Closed

feat(ui): WebUI modernization PR7 — mobile layout + WCAG accessibility pass#115
jkyberneees wants to merge 1 commit into
feat/webui-modernization-6from
feat/webui-modernization-7

Conversation

@jkyberneees

Copy link
Copy Markdown
Contributor

Summary

Final PR of the WebUI modernization roadmap — Phase 4: mobile layout + WCAG accessibility pass. Stacked on #114 (feat/webui-modernization-6). Desktop visuals are unchanged; all layout changes are inside the mobile breakpoint.

Accessibility (WCAG 2.2 AA)

  • Landmarks: <header> topbar, <nav aria-label="Sessions"> sidebar, <main> chat column; #messages is now role="log" aria-live="polite".
  • Screen-reader announcements: new visually-hidden #sr-status live region + announce() helper covering connection state, errors, approvals (shown with risk class, plus the decision), session loaded/renamed/deleted.
  • Dialog semantics: shortcuts + confirm overlays get role="dialog" aria-modal="true" aria-labelledby, with focus-in on open, focus-return on close, and a Tab focus trap (openDialog/closeDialog helpers).
  • Keyboard-operable everything: generated .tb-header/.thinking-toggle/.tb-result-more/.collapse-toggle/.es-hints/.chip-remove are now role="button" tabindex="0" (with aria-expanded where applicable), activated by Enter/Space through the existing #messages delegation. .sa-details deliberately stays click-only (a button role would make SRs read the whole content region as the label — noted for a future toggle affordance on .sa-top).
  • Focus ring now covers [tabindex]/[role="button"]; the dead [onclick]:focus-visible selector is gone.
  • Shortcuts dialog documents the new @-completion navigation.

Mobile (≤767px only)

  • #app uses 100dvh (with 100vh fallback) — no more mobile-chrome clipping.
  • Topbar reflows to two rows: model picker/custom input drop to a full-width second row; sidebar becomes an over-top drawer so the taller topbar can't clip it.
  • ≥40px touch targets on topbar buttons, session actions, attach/send, approval buttons, scroll-bottom button.
  • Approval card goes full-width (calc(100% - 16px)); toast wraps at 92vw instead of overflowing.

Verification

  • node --check all 13 UI JS files ✅; node --test: 26 pass, 0 fail
  • go build, go vet, full cmd/odek suite ✅
  • Smoke test: landmarks/role="log"/role="dialog" present in served HTML; no inline handlers anywhere, so the PR6 CSP (script-src 'self') holds ✅

This completes the modernization roadmap: #109#110#111#112#113#114 → this PR. Merge in stack order.

…y pass

Accessibility (desktop visuals unchanged):
- Landmarks: <header> topbar, <nav aria-label="Sessions"> sidebar,
  <main> chat column; #messages is now role="log" aria-live="polite"
  aria-relevant="additions".
- Visually-hidden #sr-status live region + announce() helper; announces
  connection state, system/error messages, approval shown/answered
  (with risk class), session loaded/renamed/deleted.
- Dialog semantics: shortcuts + confirm overlays get role="dialog"
  aria-modal="true" aria-labelledby; focus moves in on open
  (data-autofocus), returns on close, Tab cycles within (openDialog/
  closeDialog/focus trap in utils.js); Escape closes via the same helper.
- Keyboard activation: role="button" tabindex="0" + Enter/Space for
  .tb-header, .thinking-toggle, .tb-result-more, .collapse-toggle,
  .es-hints spans, .chip-remove; aria-expanded tracked on disclosure
  toggles and the hamburger.
- :focus-visible ring now covers [tabindex]/[role="button"] (the dead
  [onclick] selector was removed); shortcuts dialog documents @
  completion navigation.

Mobile (all inside @media (max-width: 767px), except 100dvh):
- #app uses 100dvh with 100vh fallback; grid rows go auto so the topbar
  can grow to two rows — model picker + custom-model input wrap to a
  second row inside .top-controls, theme/cancel stay on row one.
- Sidebar becomes an over-top drawer (top:0, z-index 30) so the taller
  topbar never clips it.
- ≥40px touch targets via padding/min-size: hamburger, theme, cancel,
  new-session, session row actions, attach, scroll-bottom, approval
  action buttons.
- Approval card full-width minus margins; toast wraps at 92vw instead
  of overflowing; completion popup verified full-width of input row.
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Jul 26, 2026

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
odek c3991d2 Commit Preview URL

Branch Preview URL
Jul 26 2026, 01:49 PM

@jkyberneees

Copy link
Copy Markdown
Contributor Author

Superseded: this stacked chain was merged directly into main (merge commit 9ae5e46), together with #109. All changes from this PR are on main.

@jkyberneees
jkyberneees deleted the feat/webui-modernization-7 branch July 26, 2026 16:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant