phaios v0.1 is a single window with one job: take a RAW file, decide how to convert it to monochrome, and write a 16-bit TIFF. The layout reflects that hierarchy literally — a ~70% preview on the left, a ~30% adjustment column on the right, a 44px toolbar above. Nothing else.
The palette is three neutrals — window, panel, raised — with a single muted blue accent reserved for active state. A dark theme is non-negotiable for monochrome work: a light chrome would bias the eye's adaptation and compress the apparent dynamic range of the preview. The accent is never decorative; it only marks “this is the value I have committed to” on the slider fill, the active radio dot, and the segmented control. Every active state also carries a non-colour cue — a filled dot, a bold label, an outlined border — so the interface degrades cleanly for users with protanopia or deuteranopia, and meets WCAG AA against the chrome.
Typography is IBM Plex Sans for labels and IBM Plex Mono with tabular figures for every number. Tabular figures matter here: the exposure readout updates in real time as a slider drags, and digits jittering between widths reads as a bug, not a feature.
Trade-off considered and rejected: a collapsible “Method comparison” tray that would let the user A/B the three conversion methods side-by-side. Useful, but it pulls v0.1 toward the compare-views feature surface explicitly deferred to v0.2 — and adds a modal-ish state to a workflow that should remain strictly linear. Cut.
| Control | Shown | Shortcut | a11y notes | objectName · gettext key · label |
|---|---|---|---|---|
| Open RAW | Always | Ctrl+O | Icon + label; aria-keyshortcuts; focus ring on accent |
open_button · “Open” |
| Save | Always | Ctrl+S | Disabled state inherits --text-disabled; tooltip mirrors label |
save_button · “Save” |
| Exposure slider | Always | ←/→ · Shift+← coarse | role=slider, aria-valuemin/max/now/text; numeric readout in EV |
exposure_slider · “Exposure compensation” |
| Method selector | Always | 1 / 2 / 3 | role=radiogroup; arrow-key roving tab-index; dot & background state |
method_group · “B&W Conversion” |
| Colourspace segments | Luminance only | — | Segmented control; active state = accent fill + bolder weight (non-colour cue) | colorspace_group · “Coefficients” (BT.601 / BT.709 / BT.2020) |
| Channel sliders | Mixer only | R / G / B focus + ←→ | Each slider self-labelled by channel letter tile + word; tabular numeric readout | mixer_r, mixer_g, mixer_b |
| Filter presets | Filter only | ←/→ to cycle | Swatch + name + Wratten code; aria-checked; chip outline = non-colour state |
filter_group · “Coloured filter” |
| Format dropdown | Always | — | Native <select> for OS-native keyboard semantics |
format_select · “Format” |
| Save action | Always | Ctrl+Shift+S | Primary button; only coloured surface in panel; copy expands for FR/ES | save_action · “Save converted image” |
Spacing scale: 4 · 8 · 12 · 16 · 20 · 24 · 32px · Type scale: 11 · 12 · 13 · 15 · 18px · Control height: 28px · Radius: 4px