Visual Design Accessibility
Feature Detail
Description
A design token system that enforces WCAG 2.2 AA contrast ratios, accessible type scales, and safe touch-target sizing across the entire app. All text, icons, and interactive controls must meet or exceed 4.5:1 contrast for normal text and 3:1 for large text and UI components. The design token layer makes these constraints machine-enforceable rather than dependent on designer vigilance. Specific requirements from the workshops include: scalable text that respects the OS dynamic type setting without breaking layouts, avoidance of thin or italic font weights for body copy, minimum 44×44 pt touch targets for all tappable elements, and sufficient spacing between interactive controls to prevent mis-taps. The existing design token system must codify all of these as non-overridable base values.
Analysis
Meets the WCAG 2.2 AA standard required by all partner organisations and Norwegian public-sector accessibility regulations. Reduces support burden from users struggling to read or tap UI elements, and ensures the app is usable in varying lighting conditions common in field-based peer mentor work.
Define contrast-safe colour pairs in the design token system and enforce via CI lint (e.g. flutter_accessibility_lints or a custom token validator). Use TextTheme with explicit fontWeight (FontWeight.w400 minimum for body) and never apply italic to form labels. Wrap all custom tappable widgets in a sized GestureDetector or InkWell with a minimum HitTestBehavior area of 44pt.
Components (205)
Shared Components
These components are reused across multiple features
User Interface (59)
Service Layer (52)
Data Layer (33)
Infrastructure (54)
User Stories (16)
As a As a Peer Mentor (Likeperson)
I want my organization's branding (colors, logo, terminology) to be applied to the app interface while ensuring all accessibility standards are maintained
So that I can use an app that feels like it belongs to my organization without sacrificing the contrast, text size, and interaction accessibility I depend on
- Given a peer mentor from HLF opens the app, when the HLF brand theme is applied, then HLF's brand colors replace the default palette while all contrast ratios remain at or above 4.5:1 for body text
- Given an organization administrator uploads a custom brand color via the theme-builder, when the color is applied as a primary button background, then the contrast-ratio-validator automatically selects a compliant foreground text color (white or dark) to maintain the 4.5:1 threshold
- Given a peer mentor from Blindeforbundet uses the app, when the Blindeforbundet theme is active, then all accessibility-immutable tokens (minimum touch targets, minimum font weight, spacing rules) remain unchanged by the branding customization
- +2 more
As a As a Coordinator
I want my organization's branding (colors, logo, terminology) to be applied to the app interface while ensuring all accessibility standards are maintained
So that I can use an app that feels like it belongs to my organization without sacrificing the contrast, text size, and interaction accessibility I depend on
- Given a peer mentor from HLF opens the app, when the HLF brand theme is applied, then HLF's brand colors replace the default palette while all contrast ratios remain at or above 4.5:1 for body text
- Given an organization administrator uploads a custom brand color via the theme-builder, when the color is applied as a primary button background, then the contrast-ratio-validator automatically selects a compliant foreground text color (white or dark) to maintain the 4.5:1 threshold
- Given a peer mentor from Blindeforbundet uses the app, when the Blindeforbundet theme is active, then all accessibility-immutable tokens (minimum touch targets, minimum font weight, spacing rules) remain unchanged by the branding customization
- +2 more
As a As a Peer Mentor (Likeperson)
I want the app to use clear, regular-weight, upright fonts throughout — without thin font weights or italic text in body content
So that I can comfortably read content if I have dyslexia, low vision, or cognitive processing difficulties, without having to decipher stylized text
- Given a peer mentor reads any body text, label, or navigation item in the app, when the text is rendered, then its font weight is 400 (Regular) or heavier — no Light (300) or Thin (100/200) weights are used
- Given a peer mentor reads a button label, form field label, or status badge, when the text is displayed, then it is not rendered in italic style
- Given an organization configures custom typography via theme-builder, when the selected font includes a weight below 400 for body text, then the token-accessibility-enforcer overrides it to the minimum compliant weight with a warning
- +2 more
As a As a Peer Mentor (Likeperson)
I want to navigate the app using vertical scrolling and explicit back buttons — not horizontal swipe gestures — as the primary navigation paradigm
So that I can use the app reliably if I have motor impairments that make precise swipe gestures difficult, or if I use assistive devices that do not support swipe navigation
- Given a peer mentor navigates the activity registration wizard, when moving between steps (date, duration, notes), then navigation occurs via clearly labeled Next/Back buttons — not by swiping horizontally
- Given a peer mentor is on any screen with a back option, when they want to return to the previous screen, then a visible back button is present in the header — not relying solely on swipe-back gesture
- Given a peer mentor scrolls through a long form or list, when reading content, then the scroll direction is vertical and no horizontal scrolling is required to see complete content at standard viewport width
- +2 more
As a As a Peer Mentor (Likeperson)
I want interactive controls to be spaced sufficiently apart so that tapping one element does not accidentally trigger an adjacent control
So that I can interact with the app accurately even with limited fine motor precision, reducing errors and frustration during activity registration and form completion
- Given a peer mentor views the expense type selector with multiple option chips, when any two adjacent interactive chips are rendered, then there is at least 8 dp of gap between their respective touch target boundaries
- Given a peer mentor uses the activity registration bottom sheet with Next and Back buttons, when both buttons are visible simultaneously, then their touch targets do not overlap and there is a minimum 8 dp gap between them
- Given a developer adds a row of action buttons to any screen, when the interactive-control-spacing-system tokens are applied, then the layout automatically enforces minimum gaps without manual per-screen spacing work
- +2 more
As a As a Peer Mentor (Likeperson)
I want to increase the system font size in my phone's accessibility settings and have the entire app scale text correctly without content being cut off, overlapping, or becoming unreadable
So that I can use the app comfortably if I have presbyopia, low vision, or simply prefer larger text for extended use
- Given a peer mentor sets their device font size to 200% in iOS/Android accessibility settings, when they open the app, then all text scales proportionally and no content is clipped, truncated without scroll access, or overlaps other elements
- Given a peer mentor views the activity registration bottom sheet at 150% font scale, when reading field labels and button text, then all text is fully visible and the bottom sheet scrolls to accommodate the expanded content
- Given the dynamic-type-scale-service applies a type scale, when a component uses accessible-text-style-system, then no text style uses a fixed pixel size — all sizes are responsive to the system scale factor
- +2 more
As a As a Peer Mentor (Likeperson)
I want the development team to be prevented by automated tooling from introducing accessibility regressions into the visual design as the app grows
So that the app's accessibility standards remain consistently high across all future feature releases, not just during initial development
- Given a developer creates a pull request that introduces a new color token combination, when the ci-accessibility-lint-runner executes, then token combinations violating contrast requirements cause the CI check to fail and the PR cannot be merged
- Given a developer adds a new interactive widget without applying accessible-touch-target-wrapper, when flutter-accessibility-lint-config runs, then a lint warning flags the missing touch target enforcement
- Given the accessibility-token-manifest is updated to reflect a new WCAG requirement, when the token-accessibility-enforcer runs against existing tokens, then any tokens no longer compliant with the updated manifest are flagged for remediation
- +2 more
As a As a Coordinator
I want the app to use clear, regular-weight, upright fonts throughout — without thin font weights or italic text in body content
So that I can comfortably read content if I have dyslexia, low vision, or cognitive processing difficulties, without having to decipher stylized text
- Given a peer mentor reads any body text, label, or navigation item in the app, when the text is rendered, then its font weight is 400 (Regular) or heavier — no Light (300) or Thin (100/200) weights are used
- Given a peer mentor reads a button label, form field label, or status badge, when the text is displayed, then it is not rendered in italic style
- Given an organization configures custom typography via theme-builder, when the selected font includes a weight below 400 for body text, then the token-accessibility-enforcer overrides it to the minimum compliant weight with a warning
- +2 more
As a As a Coordinator
I want to navigate the app using vertical scrolling and explicit back buttons — not horizontal swipe gestures — as the primary navigation paradigm
So that I can use the app reliably if I have motor impairments that make precise swipe gestures difficult, or if I use assistive devices that do not support swipe navigation
- Given a peer mentor navigates the activity registration wizard, when moving between steps (date, duration, notes), then navigation occurs via clearly labeled Next/Back buttons — not by swiping horizontally
- Given a peer mentor is on any screen with a back option, when they want to return to the previous screen, then a visible back button is present in the header — not relying solely on swipe-back gesture
- Given a peer mentor scrolls through a long form or list, when reading content, then the scroll direction is vertical and no horizontal scrolling is required to see complete content at standard viewport width
- +2 more
As a As a Coordinator
I want interactive controls to be spaced sufficiently apart so that tapping one element does not accidentally trigger an adjacent control
So that I can interact with the app accurately even with limited fine motor precision, reducing errors and frustration during activity registration and form completion
- Given a peer mentor views the expense type selector with multiple option chips, when any two adjacent interactive chips are rendered, then there is at least 8 dp of gap between their respective touch target boundaries
- Given a peer mentor uses the activity registration bottom sheet with Next and Back buttons, when both buttons are visible simultaneously, then their touch targets do not overlap and there is a minimum 8 dp gap between them
- Given a developer adds a row of action buttons to any screen, when the interactive-control-spacing-system tokens are applied, then the layout automatically enforces minimum gaps without manual per-screen spacing work
- +2 more
As a As a Coordinator
I want to increase the system font size in my phone's accessibility settings and have the entire app scale text correctly without content being cut off, overlapping, or becoming unreadable
So that I can use the app comfortably if I have presbyopia, low vision, or simply prefer larger text for extended use
- Given a peer mentor sets their device font size to 200% in iOS/Android accessibility settings, when they open the app, then all text scales proportionally and no content is clipped, truncated without scroll access, or overlaps other elements
- Given a peer mentor views the activity registration bottom sheet at 150% font scale, when reading field labels and button text, then all text is fully visible and the bottom sheet scrolls to accommodate the expanded content
- Given the dynamic-type-scale-service applies a type scale, when a component uses accessible-text-style-system, then no text style uses a fixed pixel size — all sizes are responsive to the system scale factor
- +2 more
As a As a Coordinator
I want the development team to be prevented by automated tooling from introducing accessibility regressions into the visual design as the app grows
So that the app's accessibility standards remain consistently high across all future feature releases, not just during initial development
- Given a developer creates a pull request that introduces a new color token combination, when the ci-accessibility-lint-runner executes, then token combinations violating contrast requirements cause the CI check to fail and the PR cannot be merged
- Given a developer adds a new interactive widget without applying accessible-touch-target-wrapper, when flutter-accessibility-lint-config runs, then a lint warning flags the missing touch target enforcement
- Given the accessibility-token-manifest is updated to reflect a new WCAG requirement, when the token-accessibility-enforcer runs against existing tokens, then any tokens no longer compliant with the updated manifest are flagged for remediation
- +2 more
As a As a Peer Mentor (Likeperson)
I want all tappable elements — buttons, navigation items, checkboxes, links — to have a minimum touch target of 44×44 dp
So that I can accurately tap controls without repeated misses, even if I have reduced fine motor control, tremors, or am using the phone with gloves or a stylus
- Given a peer mentor with motor impairments attempts to tap any button, icon, or interactive element, when the element is rendered, then its touch target is at least 44×44 dp
- Given a small icon button (e.g., edit pencil, modal close) is placed in a dense layout, when the accessible-touch-target-wrapper is applied, then the visual appearance is unchanged but the hit area expands to 44×44 dp
- Given the CI pipeline runs accessibility checks via accessibility-audit-runner, when touch target sizes are evaluated, then elements with hit areas smaller than 44×44 dp cause a lint warning or error
- +2 more
As a As a Peer Mentor (Likeperson)
I want all text, buttons, and interactive controls to meet WCAG 2.2 AA contrast requirements (4.5:1 for normal text, 3:1 for large text and UI components)
So that I can comfortably read and interact with the app even if I have low vision, are in bright sunlight, or have age-related vision decline
- Given a peer mentor views any screen in the app, when they look at body text on any background color, then the contrast ratio is at least 4.5:1 as defined by WCAG 2.2 AA
- Given a peer mentor sees a button or interactive control, when the control label or icon is rendered, then the contrast ratio against its background is at least 3:1
- Given the CI pipeline runs a build, when accessibility lint is executed by ci-accessibility-lint-runner, then any token combination failing the contrast threshold causes the build to fail
- +2 more
As a As a Coordinator
I want all tappable elements — buttons, navigation items, checkboxes, links — to have a minimum touch target of 44×44 dp
So that I can accurately tap controls without repeated misses, even if I have reduced fine motor control, tremors, or am using the phone with gloves or a stylus
- Given a peer mentor with motor impairments attempts to tap any button, icon, or interactive element, when the element is rendered, then its touch target is at least 44×44 dp
- Given a small icon button (e.g., edit pencil, modal close) is placed in a dense layout, when the accessible-touch-target-wrapper is applied, then the visual appearance is unchanged but the hit area expands to 44×44 dp
- Given the CI pipeline runs accessibility checks via accessibility-audit-runner, when touch target sizes are evaluated, then elements with hit areas smaller than 44×44 dp cause a lint warning or error
- +2 more
As a As a Coordinator
I want all text, buttons, and interactive controls to meet WCAG 2.2 AA contrast requirements (4.5:1 for normal text, 3:1 for large text and UI components)
So that I can comfortably read and interact with the app even if I have low vision, are in bright sunlight, or have age-related vision decline
- Given a peer mentor views any screen in the app, when they look at body text on any background color, then the contrast ratio is at least 4.5:1 as defined by WCAG 2.2 AA
- Given a peer mentor sees a button or interactive control, when the control label or icon is rendered, then the contrast ratio against its background is at least 3:1
- Given the CI pipeline runs a build, when accessibility lint is executed by ci-accessibility-lint-runner, then any token combination failing the contrast threshold causes the build to fail
- +2 more