Update progress plan: Sprint 8 complete, all accessibility sprints done

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
pull/599/head
Marcelo Paiva 3 weeks ago
parent 995da6ab0e
commit 6371ff13a1

@ -534,3 +534,47 @@ The following items are deferred for a separate planning session due to complexi
4. **7-H skipped**: `scroll_buttons.js` aria-hidden on hidden buttons — verify or add
5. **7-I deeper fix**: Current fix adds `aria-label` to the native select; consider full combobox refactor for better AT experience (lower priority)
6. **Retest audit**: Run fresh accessibility audit to confirm no regressions introduced
---
## Session Summary - 2026-02-26
### Completed: Sprint 8 — Template Builder Keyboard Access
**Commit: 995da6ab**
All four Sprint 8 items implemented:
#### 8-A: Keyboard alternative for drag-and-drop field placement
- **`fields.vue`**: Default field `<div draggable>` items now have `tabindex="0"`, `role="button"`, `:aria-label`, and `@keydown.enter/space` handlers emitting new `add-default-field` event
- **`fields.vue`**: Field type grid buttons use new `onFieldTypeClick(event, type)` — detects keyboard activation via `event.detail === 0` and emits `add-field` directly (skips draw mode); mouse users continue to get draw mode for non-special types
- **`builder.vue`**: Added `@add-default-field="addDefaultField"` handler; new `addDefaultField(defaultFieldItem)` method creates and inserts field via `insertField()` + `save()`
#### 8-B: Context menu keyboard trigger
- **`area.vue`**: Root div now has `tabindex="0"`, `:aria-label="areaLabel"` (computed: "{type}: {name}"), `@keydown="onAreaKeydown"`
- **`area.vue`**: `onAreaKeydown` fires on ContextMenu key or Shift+F10 — synthesizes `MouseEvent('contextmenu', { bubbles, clientX, clientY })` at element center (from `getBoundingClientRect()`) and dispatches it on the root element, which bubbles up to page.vue's `@contextmenu` handler
#### 8-C: Field settings dropdown focus trap
- **`field.vue`**: Settings `<label>` gets `@focus="renderDropdown = true"` so keyboard focus renders dropdown content (was previously only mouse-triggered)
- **`field.vue`**: Settings dropdown `<span>` gets `@keydown.escape.stop="closeDropdown"` to close on Escape
#### 8-D: Live region announcements
- **`builder.vue`**: `announcePolite()` after `addField()` and `addDefaultField()` — "{type} field added"
- **`fields.vue`**: `announcePolite()` in `removeField()` after `save()` — "Field removed"
- **`i18n.js`**: Added `field_type_added` and `field_removed` keys to all 7 language objects (en/es/it/pt/fr/de/nl)
### Status: ALL ACCESSIBILITY SPRINTS COMPLETE
Sprints 1, 5, 6, 7, and 8 are all committed. The project has addressed:
- All WCAG Level A critical violations
- All WCAG Level AA high-priority issues
- Medium-priority improvements (aria-busy, error linking, table semantics, etc.)
- Complex template builder keyboard access (Sprint 8)
### Recommendations for Future Sessions
1. **Manual regression testing**: Run keyboard-only navigation through the full template builder flow to verify Sprint 8 changes work end-to-end
2. **Screen reader testing**: NVDA+Chrome / VoiceOver+Safari to confirm all `announcePolite` calls are heard
3. **7-C check**: Verify `v-show` + `aria-hidden` sync in `form.vue` (may have been addressed in Sprint 6 `form.vue` changes)
4. **7-H check**: `scroll_buttons.js` `aria-hidden` on hidden buttons — verify or add
5. **Combobox refactor**: `phone_step.vue` country code selector (currently patched with `aria-label`; full combobox would be more accessible)
6. **axe-core automated scan**: Run the axe-core RSpec suite against the current codebase to catch any remaining automated violations

Loading…
Cancel
Save