In a design system's functional palette, how should hover, pressed, focus and disabled colors be derived, and why is focus treated differently from hover?
answer
- no pointer on a TV remote
- courtesy state versus required state
- translucent layer versus ramp steps
- Focus Visible, Level AA
- inactive controls exempt from contrast
basics
~20 sHover and pressed are usually derived by rule: a darker step or a translucent layer over the base. Focus gets its own strong, non-hue indicator, because WCAG 2.4.7 requires it and a TV-remote user has no other position cue.
solid answer
~50 sInteraction states belong in the functional palette so every control changes the same way. Hover and pressed are commonly derived by rule: either one or two steps along the role's tonal ramp, or a translucent **state layer** of the content color stacked over the base, which works on any role and surface and composes when states combine. Focus is treated separately because it carries obligations hover does not: WCAG 2.2 `2.4.7` Focus Visible (AA) requires a visible indicator, `1.4.11` asks 3:1 against adjacent colors for state information, and a focus shown only by a background hue change would not pass `1.4.1`. So focus usually gets a dedicated ring, often two-tone so it shows on any surface. On a TV with a directional pad there is no pointer, so focus is the navigation model. Disabled is exempt from contrast criteria but gets one neutral role that never borrows a status hue.
go deeper
Name the interaction states and say which one tells a keyboard or TV-remote user where they are.
Compare discrete ramp steps with a translucent state layer, and explain why focus and disabled get dedicated roles with their WCAG 2.4.7, 1.4.11 and 1.4.3 reasons.
Design one focus treatment that survives light pages, dark players and poster art, and define how combined states stack so TV and web stay consistent.
Judge how much of the state model to encode centrally versus leave to components, balancing consistency against platforms whose input models differ.
## States are part of the functional palette A control is never just one color. It has a resting state and several **interaction states**: **hover** (a pointer is over it), **pressed** (it is being activated), **focus** (it will receive keyboard or remote input), **selected** (it is the current choice) and **disabled** (it exists but cannot be used). A functional palette defines the colors for these states as roles, so every button, tile and row in the product changes in the same way. For a video-streaming service that ships on TV and web, this matters twice over. On the web, a mouse user sees hover, a keyboard user sees focus and a touch user sees pressed. On a TV, the user usually moves a highlight with a remote's directional pad: there is no pointer, so there is nothing to hover, and **focus is the state that tells the user where they are**. ## Two ways to derive state colors | Approach | How it works | Strength | Weakness | |---|---|---|---| | **Discrete steps** | Each state picks a neighbouring step on the role's tonal ramp, for example one step darker for hover and two for pressed | Precise and easy to reason about for one role | Needs a value per role, per state, per surface; combined states multiply the table | | **State layer** | A translucent layer of the control's content color is drawn over the base at a fixed strength per state, lighter for hover and stronger for pressed | One rule works on every role and surface, and combined states simply stack | Results depend on the base color, so each resulting pair still has to be checked | Many systems mix the two: a state layer for hover and pressed, and a dedicated role for focus and for disabled, because those two carry obligations the others do not. ## Why focus gets its own role Hover is a courtesy. The pointer's position already tells a mouse user what they are over, and WCAG's guidance on Success Criterion 1.4.11 Non-text Contrast treats author-supplied hover effects as supplemental: they do not themselves need 3:1 contrast, provided they do not make the control or its other state indicators lose contrast against adjacent colors. Focus is different: - **It is required.** WCAG 2.2 Success Criterion **2.4.7 Focus Visible** (Level AA) requires that keyboard-operable interfaces have a mode in which the focus indicator is visible. - **It must be seen against adjacent colors.** Under 1.4.11 (Level AA), visual information needed to identify a component's state, focus included, needs at least 3:1 contrast against adjacent colors. - **A hue swap alone is weak.** The Understanding document for 1.4.11 notes that a focus state that only changes a button's background color is outside that criterion's scope, but would not pass 1.4.1 Use of Color. A ring, a thicker border or a change in size gives focus a cue that is not hue. - **On TV it is the whole navigation model.** A viewer across the room must find the focused tile instantly, so a strong ring plus a scale or lift change is common practice. Because focus must show on every surface - a light page, a dark player, a colorful poster - systems often define a **two-tone focus ring**, an inner and an outer band of contrasting colors. WCAG's guidance lists a two-color focus indicator as a technique for staying visible against any adjacent color. ## Disabled: exempt, but still designed WCAG exempts inactive components from the contrast criteria: under 1.4.3, text in an inactive user interface component has no contrast requirement, and 1.4.11 excludes inactive components. That is not a licence to make them invisible. The functional palette usually defines a single **disabled role** - a low-contrast neutral applied regardless of the control's role - so disabled looks the same everywhere and never borrows a status hue. Whether a control should be disabled at all is a component decision, not a palette one. ## Combined states States overlap: a tile can be focused and selected, a row can be hovered and pressed. The palette should state the order in which they combine, for example: 1. Apply the base role color. 2. Apply the selected treatment if the item is the current choice. 3. Apply the hover or pressed layer. 4. Draw the focus ring on top, never replacing the others. Writing this down once prevents every team from inventing its own precedence. The TV app and the web app then differ only in which states occur, not in what a given state looks like.
- Why do hover styles not need to meet 3:1 contrast under WCAG 2.2?WCAG's guidance for 1.4.11 treats author-supplied hover effects as supplemental: the pointer's position already shows what the user is over, so the hover treatment is not required to identify the state. The effect must still not make the control, or its focus or selection indicators, lose contrast against adjacent colors.
- How should a palette handle a tile that is focused and selected at the same time?Define a stacking order once: base role, then selected, then the hover or pressed layer, with the focus ring drawn on top without replacing anything. Each state stays readable, and TV and web show the same combination instead of each team inventing its own precedence.
- If disabled controls are exempt from contrast criteria, can they be nearly invisible?Exempt is not the same as encouraged. A disabled control should still read as a control that exists but is unavailable, and a single low-contrast neutral role gives that consistently. Whether a control should be disabled rather than explained is a separate, component-level decision.
saying these in an interview costs you the question
- Hover and focus can share one color because both just mean attention.
- A background hue change on its own is a sufficient focus indicator.
- Disabled controls must meet the 4.5:1 text contrast minimum like any text.
- Author-supplied hover styles must themselves reach 3:1 against the background.
- Each component's state colors can be picked by eye, one component at a time.