You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Accessibility (a governance MUST, and a genuine differentiator — a
spatial PKM you can drive without a mouse):
- Navigation.res: pure geometry to find the nearest note in a direction;
arrow keys move the selection, Alt+arrow nudges the selected note.
Wired through new NavigateCanvas / NudgeSelectedNote messages so the
logic sees current state (the global key handler is registered once).
Suppressed while typing in inputs/textareas.
- ARIA + focus: sidebar rows are real <button>s inside <li> (valid list
semantics); canvas notes are role=button, focusable, Enter/Space edits;
toolbar has role=toolbar with aria-pressed toggles; search/zoom/clear
controls get accessible names; error banner is role=alert.
- styles.css: :focus-visible rings, prefers-reduced-motion, and contrast
fixes — a darker --accent-strong behind light text on the primary and
active buttons, and a lighter dirty-indicator, clearing the last
sub-4.5:1 nodes.
PWA (true offline, local-first):
- manifest.webmanifest + icon.svg, plain-JS service-worker.js (precache
app shell + wasm, cache-first). Registered best-effort at startup;
theme-color + manifest/icon links in index.html. build/dev scripts now
copy the icon too.
Verified: cargo test (5 suites), deno test:ui (7, incl. new Navigation
geometry), deno lint. E2E (headless Chromium): ArrowRight moves selection
between canvas notes, Alt+ArrowRight nudges +20px, service worker reaches
ready, manifest/theme/icon load, and axe-core reports 0 serious/critical
WCAG 2.2 AA violations in the canvas-active state.
Claude-Session: https://claude.ai/code/session_01PAEqVP7Y3bZDhtAaPUTbps
Co-authored-by: Claude <noreply@anthropic.com>
0 commit comments