phaios v0.1
DSC_0421.NEF
6048 × 4024 · ISO 200 · 1/250 s · f/5.6
CHANNEL MIXER · FIT

Design rationale

The image is the only thing on screen that should compete for attention.

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.

Component inventory

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”

Tokens

--bg-window
--bg-panel
--bg-raised
--bg-preview
--text-primary
--text-secondary
--text-disabled
--accent
--border-hairline
--border-strong

Spacing scale: 4 · 8 · 12 · 16 · 20 · 24 · 32px  ·  Type scale: 11 · 12 · 13 · 15 · 18px  ·  Control height: 28px  ·  Radius: 4px