You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The command palette (Cmd/Ctrl+K) gets the hard parts right — role="dialog", focus moved inside, the rest of the page inert, Escape closes — but the combobox and listbox inside it are not valid ARIA. Four Level A violations fire the moment it opens.
axe-core on the open palette:
Rule
Impact
Detail
aria-required-children
critical
role="listbox" contains a <footer>
aria-required-attr
critical
role="combobox" has no usable aria-controls
aria-input-field-name
serious
the listbox has no accessible name
scrollable-region-focusable
serious
the results viewport scrolls but cannot take focus
Put tabindex="0" on the scrollable results viewport so keyboard users can scroll it.
Related: the empty aria-controls here is the same defect reported separately for comboboxes and popovers.
Environment
EnvironmentLaravel Version: 13.30.1PHP Version: 8.4.23Composer Version: 2.10.2Environment: localDebug Mode: ENABLEDMaintenance Mode: OFFTimezone: UTCLocale: enCacheConfig: NOT CACHEDEvents: NOT CACHEDRoutes: NOT CACHEDViews: CACHEDDriversBroadcasting: logCache: fileDatabase: sqliteLogs: stack / singleMail: logQueue: syncSession: fileStoragepublic/storage: NOT LINKEDStatamicAddons: 0License Key: Not setSites: 1Stache Watcher: Enabled (auto)Static Caching: DisabledVersion: 6.31.0 PRO
Installation
Fresh statamic/statamic site via CLI
Additional details
Found during a WCAG 2.1 AA audit of a vanilla composer create-project statamic/statamic install with no addons and no custom code. Tested with axe-core 4.x on Chromium 153 at 1440x1000, plus manual keyboard traversal. Source references point at v6.31.0.
Correction (see comment below): I originally described the aria-required-children failure as an empty listbox and aria-required-attr as an unnamed missing attribute. Both were imprecise; the table and suggested fixes above have been updated with axe's actual output.
Bug description
The command palette (Cmd/Ctrl+K) gets the hard parts right —
role="dialog", focus moved inside, the rest of the page inert, Escape closes — but the combobox and listbox inside it are not valid ARIA. Four Level A violations fire the moment it opens.axe-core on the open palette:
aria-required-childrenrole="listbox"contains a<footer>aria-required-attrrole="combobox"has no usablearia-controlsaria-input-field-namescrollable-region-focusableOffending elements:
The dialog also has no
aria-modal="true":https://github.com/statamic/cms/blob/v6.31.0/resources/js/components/command-palette/CommandPalette.vue#L302
Because the palette is the primary keyboard navigation affordance in the CP, this is the one place where broken ARIA hurts keyboard-first users most.
WCAG 2.1 SC 4.1.2 Name, Role, Value (Level A). The scrollable region is SC 2.1.1 Keyboard.
How to reproduce
composer create-project statamic/statamic, log inSuggested fix
<footer>outsideComboboxContentso therole="listbox"element only contains option/group children, and give the listbox an accessible name.aria-required-attrfailure is the emptyaria-controlsreported in aria-controls is emitted as an empty string on comboboxes, popovers and date pickers #15400, not a separate defect. Fixing that fixes this too.aria-modal="true"to the dialog.tabindex="0"on the scrollable results viewport so keyboard users can scroll it.Related: the empty
aria-controlshere is the same defect reported separately for comboboxes and popovers.Environment
Installation
Fresh statamic/statamic site via CLI
Additional details
Found during a WCAG 2.1 AA audit of a vanilla
composer create-project statamic/statamicinstall with no addons and no custom code. Tested with axe-core 4.x on Chromium 153 at 1440x1000, plus manual keyboard traversal. Source references point atv6.31.0.Correction (see comment below): I originally described the
aria-required-childrenfailure as an empty listbox andaria-required-attras an unnamed missing attribute. Both were imprecise; the table and suggested fixes above have been updated with axe's actual output.