AddThisFeature

High-Contrast Theme

Offer a stronger-separation theme for users the default palette does not serve.

involved Accessibility & Internationalization

What it adds

An additional theme raising the separation between text, surfaces, borders, and every interactive state.

What your agent is told to do

5
  1. 1

    Build the mode as another theme on the app's existing token layer so it inherits every component automatically. An override stylesheet layered on top will drift the moment a new component ships.

  2. 2

    Raise non-text contrast alongside text: icon strokes, input borders, table rules, chart lines, focus rings, and the boundary between a card and the page all need to survive the change.

  3. 3

    Keep focus, selection, hover, error, and disabled visually distinct from one another in the high-contrast theme. Cranking everything to maximum separation is a common way to make selected and focused look identical.

  4. 4

    Detect and honour the operating system's forced-colours setting where it exists, and let the system palette win rather than fighting it with the app's own colours.

  5. 5

    Do not reach for contrast by thickening borders alone. Heavier borders change the box size and reflow the layout, and they do nothing for the text sitting inside the box.

Edge cases it handles

7
  • Focus, selection, and error must stay tellable apart, which means differing in more than intensity — position, thickness, and shape carry the distinction when colour has been pushed to its limits.
  • The system forced-colours mode replaces the app's colours wholesale, so anything drawn with backgrounds, shadows, or gradients disappears there and needs a border or outline to remain visible.
  • Thicker borders alone are not sufficient and are actively harmful when they shift layout; contrast must come from the colours themselves.
  • Charts and icons must remain interpretable, which usually means direct labels and pattern fills rather than a legend keyed to twelve near-identical high-contrast hues.
  • Images, logos, and screenshots carry their own contrast and cannot be themed — supply an alternative asset or a bounding outline so they do not float on the background.
  • Shadows used as the only boundary between an overlay and the page vanish in high contrast; give every overlay a real border in this theme.
  • The choice must persist per user and apply before first paint, or every reload flashes the default theme at the person least able to tolerate it.

Definition of done

8
  • The high-contrast mode is defined as a theme in the token layer and covers every component with no per-screen patching.
  • Text and non-text elements both meet the raised contrast target, including borders, icons, and chart strokes.
  • Focus, selection, hover, error, and disabled remain mutually distinguishable in the mode.
  • The app renders correctly under the operating system's forced-colours setting.
  • Every overlay and card has a visible boundary that does not depend on a shadow.
  • The preference persists and is applied before the first paint.
  • The feature matches the existing design system.
  • No existing functionality is broken.

Related features

How it works

  1. 1

    Copy the link

    Grab the Markdown instruction URL for this feature.

  2. 2

    Give it to your AI

    Paste it into Claude Code, Cursor, v0, Lovable — whatever you build with.

  3. 3

    It inspects, then implements

    Your agent reads your existing app first, then adds the feature to fit it.

Works with your stack

These instructions are written to adapt. They tell the agent to detect your framework, match your existing design system, and reuse what you already have — rather than assuming a particular stack.

Need it tighter than that? Customize the feature and tell it exactly what you're running.