feat(a11y): add global haptics preference and accessibility guardrails#139
Merged
RawJat merged 2 commits intoDinanathDash:mainfrom Apr 1, 2026
Conversation
Co-authored-by: Dinanath Dash <108653031+DinanathDash@users.noreply.github.com>
Co-authored-by: Dinanath Dash <108653031+DinanathDash@users.noreply.github.com>
github-actions bot
pushed a commit
that referenced
this pull request
Apr 2, 2026
## [1.28.0](v1.27.0...v1.28.0) (2026-04-02) ### Features * **a11y:** add global haptics preference and accessibility guardrails ([#139](#139)) ([5721dbf](5721dbf)), closes [#138](#138) * Implement global haptics context and dual-path iOS/Android utility ([f0c4c65](f0c4c65)) * unify keyboard UX, MDX changelog rendering, and navigation reliability ([9858364](9858364))
github-actions bot
pushed a commit
that referenced
this pull request
Apr 2, 2026
## [1.28.0](v1.27.0...v1.28.0) (2026-04-02) ### Features * **a11y:** add global haptics preference and accessibility guardrails ([#139](#139)) ([5721dbf](5721dbf)), closes [#138](#138) * **app-ui:** improve header navigation and interaction behavior ([0fc9059](0fc9059)) * **changelog:** migrate changelog pipeline from markdown to MDX ([77bd158](77bd158)) * Implement global haptics context and dual-path iOS/Android utility ([f0c4c65](f0c4c65)) * **secrets-ui:** rename variable dialog and improve masked value UX ([9be9e58](9be9e58)) ### Bug Fixes * **runtime:** guard browser view transitions and JSON-LD rendering ([576d4d4](576d4d4))
RawJat
added a commit
to RawJat/Envault
that referenced
this pull request
Apr 7, 2026
DinanathDash#139) ## Summary This PR introduces a global haptics preference so users can opt out of tactile feedback across the app. It wires the existing dual-path haptics utility into a shared React context, persists the preference in `localStorage`, and adds a user-facing toggle in settings. - closes DinanathDash#138 The implementation is intentionally scoped around accessibility: when haptics are disabled, no feedback should fire on either Android (`navigator.vibrate`) or the iOS Safari fallback path. This also establishes a stricter usage policy so haptics are reserved for meaningful, high-signal interactions only. ## What Changed - Added a global `HapticProvider` / `HapticsContext` - Persisted the haptics preference to `localStorage` - Defaulted haptics to enabled for first-time users - Updated haptics state handling so the global utility respects the user preference - Added an "Enable Haptic Feedback" toggle to settings/preferences - Applied haptics only to approved interaction categories: - `error` for validation failures, system errors, failed submissions, and unauthorized actions - `success` for major success states - `cancel` / `heavy` for destructive or high-consequence actions - Avoided haptics for routine navigation, standard button clicks, input interactions, hover states, and repetitive events ## Accessibility Notes This change is intended to reduce sensory fatigue and prevent overuse of feedback. Haptics are now treated as an accessibility-sensitive enhancement rather than a default interaction pattern to be used broadly. ## Acceptance Criteria Covered - User can disable haptics from settings - Preference persists across reloads - No Android or iOS haptics fire when disabled - iOS fallback DOM interaction does not trigger while disabled - Usage follows the defined haptic guidelines ## Testing - Verified preference persists after reload - Verified enabled state still allows expected haptic feedback - Verified disabled state suppresses all feedback paths - Verified lint passes for the provider changes --- Co-authored-by: Dinanath Dash <108653031+DinanathDash@users.noreply.github.com>
RawJat
pushed a commit
to RawJat/Envault
that referenced
this pull request
Apr 7, 2026
## [1.28.0](DinanathDash/Envault@v1.27.0...v1.28.0) (2026-04-02) ### Features * **a11y:** add global haptics preference and accessibility guardrails ([DinanathDash#139](DinanathDash#139)) ([5721dbf](DinanathDash@5721dbf)), closes [DinanathDash#138](DinanathDash#138) * **app-ui:** improve header navigation and interaction behavior ([0fc9059](DinanathDash@0fc9059)) * **changelog:** migrate changelog pipeline from markdown to MDX ([77bd158](DinanathDash@77bd158)) * Implement global haptics context and dual-path iOS/Android utility ([f0c4c65](DinanathDash@f0c4c65)) * **secrets-ui:** rename variable dialog and improve masked value UX ([9be9e58](DinanathDash@9be9e58)) ### Bug Fixes * **runtime:** guard browser view transitions and JSON-LD rendering ([576d4d4](DinanathDash@576d4d4))
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
This PR introduces a global haptics preference so users can opt out of tactile feedback across the app. It wires the existing dual-path haptics utility into a shared React context, persists the preference in
localStorage, and adds a user-facing toggle in settings.The implementation is intentionally scoped around accessibility: when haptics are disabled, no feedback should fire on either Android (
navigator.vibrate) or the iOS Safari fallback path. This also establishes a stricter usage policy so haptics are reserved for meaningful, high-signal interactions only.What Changed
HapticProvider/HapticsContextlocalStorageerrorfor validation failures, system errors, failed submissions, and unauthorized actionssuccessfor major success statescancel/heavyfor destructive or high-consequence actionsAccessibility Notes
This change is intended to reduce sensory fatigue and prevent overuse of feedback. Haptics are now treated as an accessibility-sensitive enhancement rather than a default interaction pattern to be used broadly.
Acceptance Criteria Covered
Testing
Co-authored-by: Dinanath Dash 108653031+DinanathDash@users.noreply.github.com