]> danix's work - danix.xyz-2.git/commitdiff
docs: add Week 5 design spec (animations & a11y audit)
authorDanilo M. <redacted>
Thu, 16 Apr 2026 15:06:02 +0000 (17:06 +0200)
committerDanilo M. <redacted>
Thu, 16 Apr 2026 15:06:02 +0000 (17:06 +0200)
Design covers:
- Subtle, professional entrance animations (fade-in, slide-up, 200-300ms)
- Motion-safe alternatives (prefers-reduced-motion support)
- Focused accessibility audit (focus management, keyboard nav, ARIA basics)
- 60+ test cases covering animations, keyboard navigation, focus indicators
- Success criteria: WCAG 2.1 AA compliance, 60fps performance
- Deliverables: WEEK5-IMPLEMENTATION.md, WEEK5-TESTING.md, A11Y-AUDIT-REPORT.md

Scope: No page transition animations (KISS), no advanced ARIA patterns, focused audit areas only.

Co-Authored-By: Claude Haiku 4.5 <redacted>
docs/superpowers/specs/2026-04-16-week5-animations-a11y-design.md [new file with mode: 0644]

diff --git a/docs/superpowers/specs/2026-04-16-week5-animations-a11y-design.md b/docs/superpowers/specs/2026-04-16-week5-animations-a11y-design.md
new file mode 100644 (file)
index 0000000..2e91d86
--- /dev/null
@@ -0,0 +1,293 @@
+# Week 5 Design Spec: Animations & Focused A11y Audit
+
+**Date:** 2026-04-16  
+**Project:** danix.xyz Hacker Theme (Hugo)  
+**Status:** Ready for Implementation  
+**Scope:** Week 5 of 6-week build (67% complete)
+
+---
+
+## 1. Animation Strategy
+
+### 1.1 Scope & Philosophy
+
+Week 5 enhances existing components with **subtle, professional entrance animations and micro-interactions**. We follow the Slackware philosophy: clean, essential, no bloat.
+
+**What we animate:**
+- Page load animations: Fade-in + subtle slide-up (200-300ms) for cards, lists, form elements
+- Interactive animations: Hover/focus states on buttons, links, form inputs (smooth transitions)
+- Modal/toast animations: Refine existing `modalSlideUp`, enhance toast entrance/exit
+- Micro-interactions: Button presses, form field focus, checkbox/radio selection feedback
+
+**What we don't animate:**
+- Page-to-page transitions (use Hugo's standard page reloads, not JavaScript-driven SPA)
+- Unnecessary motion (avoid animations that distract from content)
+- Animations that conflict with prefers-reduced-motion preference
+
+### 1.2 Animation Types & Timing
+
+All animations use **GPU-accelerated properties** (`transform`, `opacity`) for smooth 60fps performance.
+
+| Animation | Trigger | Duration | Easing | Motion-Safe |
+|-----------|---------|----------|--------|-------------|
+| Fade-in | Page load | 300ms | ease-out | Instant opacity to 1 |
+| Slide-up | Page load | 300ms | ease-out | No transform |
+| Modal enter | User interaction | 300ms | ease-out | Instant, no animation |
+| Toast enter | Notification | 200ms | ease-out | Instant opacity |
+| Toast exit | Auto-dismiss | 200ms | ease-in | Instant opacity |
+| Button hover | Hover state | 150ms | ease-out | Instant color change |
+| Focus indicator | Tab focus | 100ms | ease-out | Instant visibility |
+| Spinner | Loading state | 600ms linear | linear | No animation, show static icon |
+
+### 1.3 Motion Safety (prefers-reduced-motion)
+
+All animations have motion-safe equivalents. When `prefers-reduced-motion: reduce`:
+
+```css
+@media (prefers-reduced-motion: reduce) {
+  /* Remove all animations, use instant state changes */
+  animation: none !important;
+  transition: none !important;
+}
+```
+
+Apply to: `*, *::before, *::after` or scoped to animation classes.
+
+### 1.4 Implementation Approach
+
+**CSS Keyframes** — Define all animations in `main.css`:
+- `@keyframes fadeIn` — opacity 0 → 1
+- `@keyframes slideUp` — translateY(20px) + opacity 0 → translateY(0) + opacity 1
+- `@keyframes modalSlideUp` — refine existing (already partial)
+- `@keyframes spin` — refine existing (already partial)
+
+**CSS Classes** — Create utility classes for easy reuse:
+- `.animate-fade-in` — apply fadeIn to any element
+- `.animate-slide-up` — apply slideUp to any element
+- `.animate-spin-loader` — apply spin (modal spinners)
+
+**Inline Data Attributes** — Use Alpine.js for conditional animations:
+```html
+<div x-show="isVisible" x-transition="fadeIn 300ms" class="card">
+```
+
+**Hover/Focus States** — Use CSS `:hover` and `:focus-visible` for interactive elements.
+
+---
+
+## 2. Focused Accessibility Audit
+
+### 2.1 Audit Scope
+
+Three focused areas, aligned with WCAG 2.1 AA requirements:
+
+1. **Focus Management** — Visible indicators, logical tab order, focus traps in modals
+2. **Keyboard Navigation** — All interactive elements reachable via keyboard
+3. **Screen Reader Basics** — ARIA labels, semantic HTML, modal announcements
+
+We skip: advanced ARIA patterns, full screen reader testing on all components, skip-to-content links (lower priority for this phase).
+
+### 2.2 Focus Management
+
+**Requirement:** Every interactive element must have a visible, high-contrast focus indicator.
+
+**Implementation:**
+- Define a focus style globally:
+  ```css
+  :focus-visible {
+    outline: 2px solid var(--accent-color);
+    outline-offset: 2px;
+  }
+  ```
+- Test on buttons, links, form inputs, modals, menu items
+- Verify outline contrast meets WCAG AA (4.5:1 min)
+- Ensure outline is visible in both light and dark modes
+
+**Focus Order:**
+- Verify tab order follows visual/logical flow (top-to-bottom, left-to-right)
+- No hidden elements receiving focus
+- No keyboard traps (users can Tab out of any element)
+
+**Modal Focus Trap:**
+- When modal opens, focus moves to first focusable element inside modal
+- Tab wraps around modal elements (last element → first element)
+- When modal closes (Escape or confirm button), focus returns to trigger element
+
+### 2.3 Keyboard Navigation
+
+**Requirement:** All interactive elements must be reachable and usable via keyboard alone.
+
+**Elements to test:**
+- Buttons — Tab to focus, Enter/Space to activate
+- Links — Tab to focus, Enter to navigate
+- Form inputs (text, email, password, number) — Tab to focus, type to enter data
+- Textareas — Tab to focus, type, Enter works (not form submit)
+- Select dropdowns — Tab to focus, Arrow keys to navigate options, Enter to select
+- Checkboxes — Tab to focus, Space to toggle
+- Radio buttons — Tab to group, Arrow keys to navigate options, Space to select
+- Modals — Tab within modal, Escape to close, focus trap active
+- Hamburger menu — Tab through menu items, Escape to close overlay
+- Spinners — Not interactive (loading indicator), no keyboard requirement
+
+**Key Bindings:**
+- `Tab` — Move to next focusable element
+- `Shift+Tab` — Move to previous focusable element
+- `Enter` — Activate button, submit form, open dropdown
+- `Escape` — Close modal, close overlay, close dropdown
+- `Arrow Up/Down` — Navigate select options, radio buttons, menu items
+- `Space` — Toggle checkbox, activate button (secondary), select radio option
+
+### 2.4 Screen Reader Basics (Spot-Check)
+
+**Requirement:** Components are announced correctly by screen readers (VoiceOver, NVDA).
+
+**ARIA Labels:**
+- Icon-only buttons must have `aria-label`:
+  ```html
+  <button aria-label="Toggle dark mode">🌙</button>
+  ```
+- Modals must have `role="dialog"` and `aria-labelledby`:
+  ```html
+  <div role="dialog" aria-labelledby="modal-title">
+    <h2 id="modal-title">Confirm Action</h2>
+  </div>
+  ```
+- Form labels must be associated with inputs via `<label for="">`:
+  ```html
+  <label for="email">Email:</label>
+  <input id="email" type="email">
+  ```
+
+**Semantic HTML:**
+- Use `<button>` for buttons (not `<div>` with click handlers)
+- Use `<a>` for links (not `<button>` as link)
+- Use `<form>` for forms, `<fieldset>` for grouped inputs
+- Use proper heading hierarchy (`<h1>`, `<h2>`, etc.)
+
+**Modal Announcements:**
+- Modal should announce its purpose: "Confirm delete (modal)"
+- Use `aria-modal="true"` to indicate modal state
+- Use `aria-hidden="true"` for backdrop/overlay
+
+---
+
+## 3. Deliverables & Testing
+
+### 3.1 Code Changes
+
+**Main CSS file** (`themes/danix-xyz-hacker/assets/css/main.css`):
+- Add `@keyframes fadeIn`, `slideUp`, refine `modalSlideUp`, `spin`
+- Add `.animate-fade-in`, `.animate-slide-up`, `.animate-spin-loader` classes
+- Add `:focus-visible` styles
+- Add hover/focus transitions for buttons, links, form inputs
+- Ensure all animations respect `prefers-reduced-motion`
+
+**HTML Templates**:
+- `form-components.html` — Add ARIA labels to icon buttons, enhance focus indicators
+- `hamburger-menu.html` — Ensure focus trap, Escape closes, proper ARIA roles
+- `header.html` — Add focus styles to logo and menu trigger
+- Other partials — Add `aria-label` to icon-only buttons, ensure semantic HTML
+
+**No new files** — Keep it simple, build on existing structure.
+
+### 3.2 Documentation
+
+**WEEK5-IMPLEMENTATION.md** (600+ lines):
+- Animation implementation guide (keyframes, classes, usage)
+- Focus management patterns (focus styles, trap implementation)
+- Keyboard navigation checklist (all interactive elements)
+- Screen reader integration (ARIA labels, semantic HTML)
+- Code examples for each pattern
+- Performance notes (GPU acceleration, animation timing)
+
+**WEEK5-TESTING.md** (600+ lines):
+- 60+ test cases covering:
+  - Animation timing (200-300ms, prefers-reduced-motion)
+  - Focus indicators (visible, high contrast, both themes)
+  - Keyboard navigation (all interactive elements, tab order)
+  - Screen reader spot-checks (buttons, modals, forms)
+  - Responsive breakpoints (320px, 768px, 1060px+)
+  - Dark/light mode verification
+  - Browser compatibility (Chrome, Firefox, Safari)
+  - Performance (60fps, no jank)
+- Test methodology (manual keyboard testing, screen reader commands)
+
+**A11Y-AUDIT-REPORT.md** (300+ lines):
+- Summary of audit findings
+- Components verified
+- Any issues found and fixed
+- Compliance statement (WCAG 2.1 AA)
+- Recommendations for Week 6
+
+### 3.3 Success Criteria
+
+✓ All animations smooth (200-300ms), respect prefers-reduced-motion  
+✓ All interactive elements have visible `:focus-visible` indicators  
+✓ Tab order is logical across all pages  
+✓ Modals have focus trap + Escape closes  
+✓ No keyboard traps (hamburger menu, dropdowns, modals, etc.)  
+✓ Icon-only buttons have `aria-label`  
+✓ Modal has `role="dialog"` and proper ARIA labels  
+✓ Form inputs have associated `<label>` elements  
+✓ Semantic HTML used throughout (no `<div>` as buttons)  
+✓ 60+ tests passing (animations, keyboard nav, focus, screen reader basics)  
+✓ No regressions from Weeks 1-4  
+✓ CSS build time under 250ms  
+✓ 60fps animations verified (no stuttering)  
+
+---
+
+## 4. Timeline & Effort
+
+**Estimated Duration:** 6-8 hours
+
+| Task | Hours | Notes |
+|------|-------|-------|
+| Animation implementation | 2-3 | Keyframes, classes, testing |
+| Focus management | 1-2 | Focus styles, tab order, traps |
+| Keyboard navigation | 1-2 | Testing all interactive elements |
+| Screen reader integration | 1 | ARIA labels, semantic HTML |
+| Testing & optimization | 1-2 | Full test suite, performance tuning |
+| Documentation | 1-2 | Implementation guide, test report |
+
+**Branch:** `week-5-animations`  
+**Master Integration:** End of week (after all tests pass)
+
+---
+
+## 5. Key Files
+
+| File | Purpose | Change |
+|------|---------|--------|
+| `themes/danix-xyz-hacker/assets/css/main.css` | Core styles | +200-300 lines (animations, focus) |
+| `themes/danix-xyz-hacker/layouts/partials/form-components.html` | Form UI | +ARIA labels, focus styles |
+| `themes/danix-xyz-hacker/layouts/partials/hamburger-menu.html` | Navigation | Focus trap, ARIA roles |
+| `WEEK5-IMPLEMENTATION.md` | Guide | NEW (600+ lines) |
+| `WEEK5-TESTING.md` | Test suite | NEW (600+ lines) |
+| `A11Y-AUDIT-REPORT.md` | Audit summary | NEW (300+ lines) |
+
+---
+
+## 6. Assumptions & Constraints
+
+- **No SPA transitions** — Hugo standard page reloads, animations apply to content on the page
+- **Subtle animations only** — 200-300ms, fade-in + slide-up, no complex choreography
+- **WCAG 2.1 AA target** — Not AAA (larger font sizes, extra color contrast), focused audit scope
+- **Keyboard-first testing** — Manual testing, not automated tools
+- **No new dependencies** — Alpine.js + vanilla CSS/JS only
+- **Existing components preserved** — Enhance, don't refactor Week 1-4 work
+
+---
+
+## 7. References
+
+- CLAUDE.md — Project instructions & Slackware philosophy
+- WEEK4-IMPLEMENTATION.md — Component baseline
+- WEEK4-TESTING.md — Testing patterns
+- WCAG 2.1 AA Guidelines — https://www.w3.org/WAI/WCAG21/quickref/
+- MDN: prefers-reduced-motion — https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-reduced-motion
+- MDN: :focus-visible — https://developer.mozilla.org/en-US/docs/Web/CSS/:focus-visible
+
+---
+
+**Status:** ✅ Design approved, ready for implementation planning