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
- 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
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