Changelog

Custom brand hex, and readable accent colours

Type your team's actual hex into organisation settings instead of picking the nearest of ten. A live preview shows the surfaces the colour lands on before you save it, and the app now works out the rest of what it needs from that one value, including what colour text has to be to stay readable on top of it.

#010Design
Try itAdmin, then Settings

Any hex, alongside the presets

There is a hex field under the ten swatches, and a native colour picker beside it. Short form or long form both work and are stored the same way. Leaving it empty keeps you on a preset, and clearing it later puts you back on the preset you had, so the two are not a one-way door. A preset and a custom colour are kept as separate things rather than one field holding both, because a preset is a reference into a set we might restyle later and a hex is a literal that somebody expects to still be exactly that hex in a year. Collapsing them would make the question of whether an organisation is on a preset or a custom colour unanswerable.

Picking a colour, and what it does

The contrast bug this exposed

Adding a free hex meant confronting something that was already broken. The app was applying the brand colour as a fill but leaving the text on top of that fill hard-coded to white, and white does not have enough contrast on most of the ten presets. It fails the accessibility standard for normal text on seven of them, including the default: white on our own brand orange is 3.58 to 1, where the standard asks for 4.5. Amber, lime and cyan are the ones you notice immediately. Orange is the one everybody had been looking at for months without naming it.

One colour, three values

A single hex cannot serve every surface it lands on, so the app now derives what it needs. Text on top of the colour becomes white, near black or black, whichever actually clears the standard, in that order of preference. Separately, the colour is nudged until it survives as text on the ground, once for the dark theme and once for light, because an active sidebar item is coloured text rather than a fill and that is the usage a mid-dark colour destroys. The nudge mixes toward white or black rather than draining the saturation, so a team's hue is still recognisably theirs at the end of it.

A preview of where it lands

The settings form shows the colour on the surfaces that actually use it: the active navigation item, a filled button, a focus ring, timeline markers. A hex field on its own is a trap, because plenty of perfectly reasonable colours make exactly one surface unreadable and you find out days later. The preview scopes the colour to itself rather than re-theming the settings page around whatever is currently half-typed into the field.

Warnings that explain rather than refuse

A colour that has to be adjusted to stay legible is still allowed. You get told what happened and why: that the navigation will show a slightly different shade than the button fill, or that button text went dark because white would not have held up. Refusing colours would be easier to build and worse to use, because the person picking usually has a reason for the colour and no way to argue with a form that just says no.