uttrflow / uttrflow/uttrflow-swift

The palette ignores Increase Contrast: hairlines stay at 1.2–1.3:1 and nothing resolves a high-contrast appearance

Open
#522 0 comments 0 reactions 0 assignees View on GitHub
accessibility area:general enhancement P2
Dominant language
Swift
Stars
4
Forks
17
Avg merge
3h 32m
Merged PRs (30d)
277

Description

## What happens

When a user turns on **Increase Contrast** (System Settings, Accessibility, Display), every colour Uttrflow draws stays the same. The palette resolves a colour by appearance, and only as light or dark:

- `NSColor.orbit(dark:light:)` (`Sources/Uttrflow/Main/OrbitPalette.swift:40-44`) picks between two hex values with `appearance.isDark`.
- `isDark` (`OrbitPalette.swift:88-90`) is `bestMatch(from: [.aqua, .darkAqua]) == .darkAqua`. It correctly maps the high-contrast appearances onto light or dark (pinned by `Tests/UttrflowTests/OrbitPaletteTests.swift:78-84`), but nothing asks for `.accessibilityHighContrastAqua` / `.accessibilityHighContrastDarkAqua` to get stronger values.
- Nothing in `Sources/` reads `accessibilityDisplayShouldIncreaseContrast` or SwiftUI's `colorSchemeContrast` (a grep for either returns nothing).

The colours that would need a stronger variant are the ones that are weakest now:

- hairlines `Line.separator` at 1.31:1 (light, on the card) and 1.18:1 (dark), which are the only edges of cards, keycaps and the Settings switches' off track (`SettingsControlStyles.swift:22`);
- the `Text.dim` tone at 2.2 to 2.9:1;
- the 5 to 10% white or black washes that mark a hovered or selected row (`OrbitPalette.swift:15`, `:19`).

Standard AppKit controls thicken borders and darken separators under this setting. Uttrflow's custom-drawn controls don't.

## Why it matters

People turn on Increase Contrast because they can't see low-contrast edges and greys. Uttrflow's cards, switches and selection states are drawn almost entirely with those.

## How to reproduce

Turn on System Settings, Accessibility, Display, Increase Contrast, then open the main window and Settings. The cards, row separators, switch tracks and sidebar selection look the same as with it off.

## Acceptance criteria

- `BrandTone` (or the `orbit` helpers) can carry a high-contrast value, resolved with `bestMatch(from: [.aqua, .darkAqua, .accessibilityHighContrastAqua, .accessibilityHighContrastDarkAqua])`, falling back to the ordinary value when none is given.
- At minimum the separator, the dim and muted text tones, the control fill and the selection wash get high-contrast values. Separators and control edges should reach 3:1 against their surface.
- A test in `OrbitPaletteTests.swift` resolves those colours under the two high-contrast appearances and checks they differ from, and are stronger than, the ordinary ones.

Contributor guide

Open the contributing guide

Research direction

Start in Sources/Uttrflow/Main/OrbitPalette.swift, especially the BrandTone or orbit helpers and the separator, text, control-fill, and selection-wash definitions. Read Tests/UttrflowTests/OrbitPaletteTests.swift and run the existing palette tests before adding coverage for the two high-contrast appearances. Done means the specified colours resolve to stronger high-contrast values, with separators and control edges reaching 3:1 against their surfaces.

Written by the indexing model from the issue text.

Assessment

Tech stack
swift
Domain
accessibility, desktop
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Active
Clarity
Clearly specified
Newbie friendliness
76/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.