Fase 3 — toegankelijkheids-fundering (shadow-DOM sneltoets-bewaker, focus-trap, plan-popover) #178

Merged
robbertbos merged 2 commits from fase-3-toegankelijkheid-v2 into main 2026-07-25 11:18:21 +00:00
Owner

Fase 3 — toegankelijkheids-fundering

Derde fase van de "nieuw bericht opstellen + plannen"-keten, op main gerebased.
Frontend-only WCAG-fundering die latere fasen (de composer, de plan-popover)
nodig hebben.

Wat

  • Shadow-DOM-bewuste sneltoets-bewakerlib/editableTarget.ts deelt één
    isEditableTarget(e) die via composedPath()[0] door de shadow-DOM heen kijkt.
    useGlobalSearchShortcut en useCardKeyboardNav deduppen hierop, zodat een
    losse-letter-sneltoets (/) niet meer afgaat terwijl je typt in een veld dat
    in een NLDD web-component zit (WCAG 2.1.4).
  • Focus-trap over shadow-roots + contenteditableuseFocusTrap liep
    eerder langs knoppen in web-components en de Tiptap-editor heen, waardoor Tab
    naar de achtergrond kon weglopen; deepActiveElement() en het aflopen van
    shadow-roots verhelpen dat (WCAG 2.4.3).
  • Plan-/snooze-popover toetsenbord-bedienbaarTimePresetPicker was een
    muis-only role="menu"; nu role="dialog" met eigen focus-trap, focus-return
    naar de knop, en Escape sluit alleen de popover (WCAG 2.1.1). SendButton en
    BubbleMenuButton krijgen aria-haspopup="dialog".

Gates

  • Frontend: tsc schoon, vitest 531/531 groen, build ok, eslint 0 errors.
  • Pre-commit: alle hooks groen.

Geen backend-wijzigingen.

## Fase 3 — toegankelijkheids-fundering Derde fase van de "nieuw bericht opstellen + plannen"-keten, op main gerebased. Frontend-only WCAG-fundering die latere fasen (de composer, de plan-popover) nodig hebben. ### Wat - **Shadow-DOM-bewuste sneltoets-bewaker** — `lib/editableTarget.ts` deelt één `isEditableTarget(e)` die via `composedPath()[0]` door de shadow-DOM heen kijkt. `useGlobalSearchShortcut` en `useCardKeyboardNav` deduppen hierop, zodat een losse-letter-sneltoets (`/`) niet meer afgaat terwijl je typt in een veld dat in een NLDD web-component zit (WCAG 2.1.4). - **Focus-trap over shadow-roots + contenteditable** — `useFocusTrap` liep eerder langs knoppen in web-components en de Tiptap-editor heen, waardoor Tab naar de achtergrond kon weglopen; `deepActiveElement()` en het aflopen van shadow-roots verhelpen dat (WCAG 2.4.3). - **Plan-/snooze-popover toetsenbord-bedienbaar** — `TimePresetPicker` was een muis-only `role="menu"`; nu `role="dialog"` met eigen focus-trap, focus-return naar de knop, en Escape sluit alleen de popover (WCAG 2.1.1). `SendButton` en `BubbleMenuButton` krijgen `aria-haspopup="dialog"`. ### Gates - Frontend: `tsc` schoon, vitest 531/531 groen, build ok, eslint 0 errors. - Pre-commit: alle hooks groen. Geen backend-wijzigingen.
robbertbos force-pushed fase-3-toegankelijkheid-v2 from cc76e60d50
All checks were successful
CI / pre-commit (pull_request) Successful in 55s
CI / frontend-test (pull_request) Successful in 5m23s
CI / release-scripts (pull_request) Successful in 10s
security-scan / Python SCA (pip-audit) (pull_request) Successful in 59s
security-scan / Python SAST (bandit) (pull_request) Successful in 39s
security-scan / JS SCA (npm audit) (pull_request) Successful in 44s
CI / backend-test (pull_request) Successful in 8m44s
security-scan / SBOM (trivy) (pull_request) Successful in 16s
security-scan / Filesystem scan (trivy fs) (pull_request) Successful in 24s
CI / e2e (pull_request) Successful in 8m58s
CI / backend-test-postgres (pull_request) Successful in 9m42s
test-build / build (backend) (pull_request) Successful in 1m58s
test-build / build (frontend) (pull_request) Successful in 2m15s
test-build / build (pull_request) Successful in 0s
to bfa51257b1
All checks were successful
CI / pre-commit (pull_request) Successful in 50s
CI / frontend-test (pull_request) Successful in 5m31s
CI / release-scripts (pull_request) Successful in 10s
CI / backend-test (pull_request) Successful in 6m41s
security-scan / Python SCA (pip-audit) (pull_request) Successful in 58s
security-scan / Python SAST (bandit) (pull_request) Successful in 39s
security-scan / JS SCA (npm audit) (pull_request) Successful in 40s
security-scan / SBOM (trivy) (pull_request) Successful in 15s
security-scan / Filesystem scan (trivy fs) (pull_request) Successful in 22s
CI / backend-test-postgres (pull_request) Successful in 8m34s
CI / e2e (pull_request) Successful in 8m23s
test-build / build (backend) (pull_request) Successful in 1m58s
test-build / build (frontend) (pull_request) Successful in 2m14s
test-build / build (pull_request) Successful in 0s
2026-07-24 16:29:45 +00:00
Compare
robbertbos force-pushed fase-3-toegankelijkheid-v2 from 0442f83d05
All checks were successful
CI / pre-commit (pull_request) Successful in 52s
CI / frontend-test (pull_request) Successful in 5m2s
CI / release-scripts (pull_request) Successful in 10s
CI / backend-test (pull_request) Successful in 6m55s
security-scan / Filesystem scan (trivy fs) (pull_request) Successful in 25s
security-scan / JS SCA (npm audit) (pull_request) Successful in 41s
security-scan / SBOM (trivy) (pull_request) Successful in 16s
CI / e2e (pull_request) Successful in 8m27s
test-build / build (frontend) (pull_request) Successful in 2m5s
security-scan / Python SCA (pip-audit) (pull_request) Successful in 59s
security-scan / Python SAST (bandit) (pull_request) Successful in 38s
CI / backend-test-postgres (pull_request) Successful in 8m39s
test-build / build (backend) (pull_request) Successful in 1m52s
test-build / build (pull_request) Successful in 0s
to 6b4bbef71c
All checks were successful
CI / pre-commit (pull_request) Successful in 56s
CI / frontend-test (pull_request) Successful in 4m52s
CI / release-scripts (pull_request) Successful in 10s
security-scan / Python SCA (pip-audit) (pull_request) Successful in 59s
security-scan / Python SAST (bandit) (pull_request) Successful in 37s
CI / backend-test (pull_request) Successful in 6m53s
security-scan / Filesystem scan (trivy fs) (pull_request) Successful in 24s
security-scan / JS SCA (npm audit) (pull_request) Successful in 40s
security-scan / SBOM (trivy) (pull_request) Successful in 17s
CI / backend-test-postgres (pull_request) Successful in 8m50s
test-build / build (backend) (pull_request) Successful in 1m53s
CI / e2e (pull_request) Successful in 8m26s
test-build / build (frontend) (pull_request) Successful in 2m12s
test-build / build (pull_request) Successful in 0s
2026-07-25 10:58:02 +00:00
Compare
robbertbos deleted branch fase-3-toegankelijkheid-v2 2026-07-25 11:18:21 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
robbertbos/waggle!178
No description provided.