Cette page est publiée en anglais et en ukrainien ; la version anglaise figure ci-dessous.
Sliders, segments and dropdowns
For developers, in code: sliders in standard markup only, how a value is reached rather than set, segmented choices, dropdowns, and the aria-expanded a popover trigger needs.
Sliders
A slider is recognised by standard markup alone: role="slider" — what every component
library renders for its thumb — or a native <input type="range">. No library selector, no
class name.
What the manifest carries: the range (min/max from aria-valuemin/aria-valuemax or the
input’s own attributes; HTML’s 0–100 for a native range that states none) and step only where
the element states one — ARIA has no attribute for it. What the slider currently reads
(now, and now_text from aria-valuetext) leaves the browser only under the same
page_read_values gate as a text field’s value.
It is written with fill and a number (or a string that is nothing but one; a decimal comma
is accepted):
- a native range goes through the native setter plus
input/changeevents; the browser snaps the value to the element’s step; - an ARIA slider is driven the way a keyboard user drives it: focus, then
Home/Endwhen the target is exactly an end of the range, otherwiseArrowRight/ArrowLeftone press at a time, re-readingaria-valuenowafter each and giving the page a frame when it has not moved yet. No pointer or drag event is synthesised. Which key increases is observed — a first press that moves the wrong way flips the pair (right-to-left pages), and a slider that ignores Left/Right is tried once with Up/Down.
It must take focus. A slider that will not — no tabindex, the way a component disables a
thumb without saying so — is not_actionable and gets no key at all.
The result names the value reached, never merely the one sent: 0.32 on a 0.1 slider stays
on the nearest position and the result says nearest: true, wanted: 0.32. Out of range is
refused with min/max, never clamped. More than 200 presses away is too_many_presses,
with moved: true when it got part of the way — the form is then changed although the step
failed.
Not handled: a two-thumb range slider is listed as two sliders with nothing saying which is which; a slider with no keyboard support cannot be set at all.
Segmented choices
A segmented control — tone, size, a language switcher — is a set of buttons with aria-pressed
inside a role="group", radiogroup, tablist or toolbar. Each option scans as a choice:
pressing one runs inline with fills, never held for consent, because it changes what is being
edited rather than acting on the world. The selected option carries selected: true, and the
assistant is told that clicking a selected option turns it off — «make the tone friendlier»
must not remove the friendly tone.
A standalone aria-pressed button with no such container is ARIA’s «button that performs an
action» (Publish, Mute) and stays behind the consent gate.
Dropdowns
A native <select> and an ARIA combobox (role="combobox" — PrimeNG, MUI, React-Select,
anything on the APG pattern) both scan as a select. The select op matches the option by its
visible label — exact, then contains, case-insensitive — and for a combobox opens it, clicks
the option and waits for the page to render. On no match it reports the options available, so the
assistant can correct the label rather than guess. A role="option" present while an overlay is
open scans as a clickable option, so the assistant can also open a dropdown and re-read it to
enumerate the choices.
append is refused on a dropdown.
Popover triggers need aria-expanded
A button named by its current value — Period: last 30 days — that declares nothing reads as a
command called «last 30 days»: the assistant may say the screen has no 7-day filter, or try to
select into the button, or have the press held and then report the period as changed. Give the
trigger aria-expanded (kept current on every open and close) and, where it opens a dialog,
aria-haspopup="dialog". With a component library, pass the attributes through to the inner
<button> — bound on the host element they land where neither the assistant nor a screen
reader reads them.
Disclosures
A collapsed section’s controls are not rendered, so they are not in the manifest. The disclosure
toggle with aria-expanded="false" is listed as (collapsed — press to open) and pressing it
runs inline — which is also the answer to «why is that field missing?».