uttrflow / uttrflow/uttrflow-swift

The dim text tone is 2.2–2.9:1 in both appearances and carries table headers, group titles, times and footnotes

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

Description

## What happens

`BrandPalette.Text.dim` (`Sources/Uttrflow/Brand/BrandPalette.swift:95`, `BrandTone(dark: 0x565B68, light: 0xA49DB3)`) is used for real text across the main window and Settings, and it fails WCAG AA contrast in **both** appearances.

It reaches text two ways:

- Directly as `Color.mainDim` (`Sources/Uttrflow/Main/OrbitPalette.swift:25`): the sidebar version number and badge counts (`Sources/Uttrflow/Sidebar/SidebarView.swift:67`, `:109`), every table header (`Sources/Uttrflow/Main/MainPieces.swift:467`), every Settings group title (`Sources/Uttrflow/Settings/SettingsPaneView.swift:70`), Home's row times (`Sources/Uttrflow/Main/HomePageView.swift:122`), Insights' word counts and average label (`Sources/Uttrflow/Main/InsightsPageView.swift:63`, `:124`), and the Home stage (`Sources/Uttrflow/Main/OrbitStage.swift:183`, `:234`, `:271`, `:288`, `:294`).
- As the **tertiary** style. Both windows set `.foregroundStyle(Color.mainText, Color.mainMuted, Color.mainDim)` at the root (`Sources/Uttrflow/Main/MainWindowView.swift:35`, `Sources/Uttrflow/Settings/SettingsRootView.swift:30`), so every `.foregroundStyle(.tertiary)` resolves to `dim`: page footnotes (`MainPieces.swift:95`), statistic comments (`MainPieces.swift:195`), Insights day labels (`InsightsPageView.swift:102`), the Style example headings (`StylePageView.swift:139`), Snippets and Corrections row text (`SnippetsPageView.swift:159`, `:164`, `CorrectionsPageView.swift:68`, `:72`).

Most of these are 9 to 11 pt.

Ratios, from the hex values with the WCAG 2.x formula:

| Background | Dark | Light |
|---|---|---|
| ground (`0B0C10` / `F3F2F7`) | 2.88 | 2.34 |
| card (`0E1016` / `FFFFFF`) | 2.80 | 2.61 |
| control (`12151C` / `F1F0F5`) | 2.69 | 2.30 |
| sidebar rail (`08090C` / `EAE9F0`) | 2.93 | 2.16 |

For comparison `Text.muted` passes everywhere it is used (4.39 to 6.14).

## Why it matters

Table headers, section titles, timestamps and footnotes are how a page is scanned. At 2.2 to 2.9:1 and 10 pt they are hard to read for low-vision users and for anyone in bright light, and they are the only labels some columns have.

## How to reproduce / measure

Compute the ratios above from `BrandPalette.swift`, or open History, Insights or any Settings tab and measure a table header or group title with Digital Color Meter.

## Acceptance criteria

- No text is drawn in a tone below 4.5:1 against its background in either appearance. Two ways to get there, and this is a design call:
- raise `Text.dim` for text (for instance dark `0x7A7F8E` gives 4.89:1 on ground and 4.57:1 on the raised control; light needs roughly `0x736C84` or darker, which is close to `muted`), or
- keep `dim` for non-text marks only (dividers, disabled glyphs) and move the text uses above to `muted`, including the root tertiary style.
- A palette test computes the ratio of every text tone against `Surface.ground`, `Surface.card` and `Surface.control` in both appearances and fails below 4.5:1.

Contributor guide

Open the contributing guide

Research direction

Start with Sources/Uttrflow/Brand/BrandPalette.swift and Sources/Uttrflow/Main/OrbitPalette.swift, then trace the listed direct and tertiary text uses in the main and Settings root views. Add the required palette contrast coverage for both appearances and verify that every text tone reaches at least 4.5:1 against the specified surfaces.

Written by the indexing model from the issue text.

Assessment

Tech stack
swift
Domain
accessibility, design
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
70/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.