Skip to content

fix(ux): light-mode contrast, reduced-motion, ARIA state, mobile hit-target#44

Open
avrabe wants to merge 1 commit intomainfrom
fix/ux-blockers-and-rivet-issue-count
Open

fix(ux): light-mode contrast, reduced-motion, ARIA state, mobile hit-target#44
avrabe wants to merge 1 commit intomainfrom
fix/ux-blockers-and-rivet-issue-count

Conversation

@avrabe
Copy link
Copy Markdown
Contributor

@avrabe avrabe commented Apr 29, 2026

Summary

Four UX blockers from a multi-persona review of the new light mode and 3D projects cube. Each is small, isolated, and ships ahead of the overdoing post putting more eyes on these surfaces.

(5) "184+ issues" overclaim that one of the agents flagged was a misread by the agent — `#184` is the tracking issue's number (real, accurately cited), not a claim about issue count. The "twenty-five coordinated issues" is also accurate (29 cross-references on issue #184 today, "twenty-five" reads as a stable approximation). No content fix needed.

Four fixes

# Where What Why
1 `sass/_variables.scss` light tokens `--text-faint` `#6b7280` → `#586273` WCAG AA contrast on cream: 4.4:1 → 5.6:1. Body-text-sized labels (`.face-tool__desc`, `.face-edge`, `.cube-hint`, `.cube-detail__panel p`) — the smallest on the page, where the sunlight-visibility thesis lives or dies
2 `static/cube.js` `openFace` + `closeFace` honor `prefers-reduced-motion` Was half-honored — global flag killed auto-spin, but click-to-open ran 600ms rotate + 300ms zoom + 700ms detail-show sequences anyway. Vestibular-disorder users got full motion despite the OS preference
3 `static/theme-toggle.js` Sync `aria-pressed` + `aria-label` to rendered theme on load and per click Toggle button announced state-less to screen readers; icon swap was visual-only
4 `templates/projects.html` mobile media query `.face-btn { min-height: 44px; padding: 0.6rem 0.9rem; font-size: 0.875rem }` Was ~28px tall — under iOS 44×44 hit-target guideline

Test plan

  • `zola build` clean (23 pages)
  • Compiled CSS confirms `--text-faint: #586273` in `[data-theme=light]` block
  • CI passes
  • After merge: visit /projects/ in light mode with DevTools → check that face-tool descriptions are legibly contrasted; with prefers-reduced-motion forced, click a face button and confirm no rotation/zoom animation; on a 375px viewport the face buttons are at least 44px tall; with VoiceOver/NVDA, the theme toggle announces "Switch to light theme, button, not pressed" or equivalent

Out of scope (per multi-persona review)

The bigger findings — ecosystem-claim hygiene, "Start here" / About page, proofs-manifest publication, AI-velocity case-study post — are separate work items the user is reviewing.

🤖 Generated with Claude Code

…target

Four UX blockers from a multi-persona review of the new light mode and
3D projects cube. Each fix is small, isolated, and ships ahead of the
overdoing post going live (which would land more eyes on this surface).

1. Bump `--text-faint` in light tokens from `#6b7280` → `#586273`.
   The previous value computed to ~4.4:1 on cream `#f4efe4`, failing
   WCAG AA 4.5:1 for body text. The new value clears AA. This was the
   smallest text on the page (`.face-tool__desc`, `.face-edge`,
   `.cube-hint`, `.cube-detail__panel p`) — and the whole "summer /
   sunlight visibility" thesis hinged on it being legible.

2. cube.js: honor prefers-reduced-motion in openFace / closeFace.
   Previously the global flag killed the auto-spin but the click-to-open
   path still ran the 600ms rotate + 300ms zoom-out + 700ms detail-show
   sequence. Users with vestibular disorders got the full motion anyway.
   Now both functions short-circuit when reduceMotion is set: snap the
   rotation, skip the scale animation, open the detail panel
   synchronously.

3. theme-toggle.js: sync aria-pressed and aria-label to the rendered
   theme. aria-pressed="true" when light is active (the non-default
   state). aria-label describes the action a click would take, which
   is what assistive tech announces. Runs once at load (after the
   bootstrapper has set data-theme) and again on every click.

4. projects.html mobile media query: `.face-btn { min-height: 44px;
   padding: 0.6rem 0.9rem; font-size: 0.875rem; }`. The previous
   ~28px-tall buttons were under iOS's 44×44 hit-target guideline.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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