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
{{ message }}
Repository navigation
st.dataframe toolbar stays invisible (opacity 0) while its buttons have keyboard focus #17337
I have provided sufficient information below to help reproduce this issue.
Summary
The element toolbar above an st.dataframe (Show/hide columns, Download as CSV, Search, Fullscreen) is in the Tab order, but [data-testid="stElementToolbar"] keeps opacity: 0 while one of its buttons has keyboard focus. It only becomes visible on mouse hover. A keyboard user therefore tabs through four buttons they cannot see, which fails WCAG 2.4.7 (Focus Visible).
Related but distinct: #13332 (keyboard access to the column-header menu) and #17127 (toolbar target size, fixed).
This is an accessibility bug in the shared element toolbar (data-testid="stElementToolbar"): on st.dataframe, Show/hide columns, Download as CSV, Search, and Fullscreen stay in the tab order while the toolbar remains at opacity: 0, so keyboard users get no visible control or focus indicator (WCAG 2.4.7). The report covers 1.61.1 and 1.65.0 and does not describe a regression.
In frontend/lib/src/components/shared/Toolbar/styled-components.ts, an unlocked StyledToolbarWrapper sets opacity: 0 and top: -1rem, then reveals itself only for &:hover, &:active, and &:focus-visible (and those same states on the parent target). The wrapper div is not focusable; Tab moves focus to the inner <button>, and :focus-visible matches only the focused element, so those reveal rules never run. Hover and press still show the toolbar because :hover and :active match the wrapper. st.code and the dataframe markdown-cell toolbar already stay visible via :focus-within / :focus-within:has(:focus-visible); the shared toolbar needs that selector as well, including the top offset the hover rule applies. st.data_editor uses this same dataframe toolbar, and the shared Toolbar is also used by images, charts, and st.audio_input.
Related Issues
#13332 — Open request to make the dataframe column-header overflow menu keyboard accessible. Same dataframe chrome, separate control: that menu never receives focus, while this toolbar does receive focus and stays invisible.
#17127 — Closed. The same dataframe toolbar buttons failed WCAG 2.2 target size (22.4px) and were fixed separately. This report is focus visibility (WCAG 2.4.7).
#16148 — Open. Fullscreen buttons on this shared toolbar share one accessible name, so screen readers cannot tell which element they control. Same buttons, with a naming failure alongside this visibility failure.
This is an automated triage comment using grok-4.7-xhigh. Please verify the suggested labels and related issues.
Activity
GUI keyboard workarounds: link the upstream Streamlit issues
github-actions commentedon Oct 8, 2026
This is an accessibility bug in the shared element toolbar (
data-testid="stElementToolbar"): onst.dataframe, Show/hide columns, Download as CSV, Search, and Fullscreen stay in the tab order while the toolbar remains atopacity: 0, so keyboard users get no visible control or focus indicator (WCAG 2.4.7). The report covers 1.61.1 and 1.65.0 and does not describe a regression.In
frontend/lib/src/components/shared/Toolbar/styled-components.ts, an unlockedStyledToolbarWrappersetsopacity: 0andtop: -1rem, then reveals itself only for&:hover,&:active, and&:focus-visible(and those same states on the parenttarget). The wrapperdivis not focusable; Tab moves focus to the inner<button>, and:focus-visiblematches only the focused element, so those reveal rules never run. Hover and press still show the toolbar because:hoverand:activematch the wrapper.st.codeand the dataframe markdown-cell toolbar already stay visible via:focus-within/:focus-within:has(:focus-visible); the shared toolbar needs that selector as well, including thetopoffset the hover rule applies.st.data_editoruses this same dataframe toolbar, and the sharedToolbaris also used by images, charts, andst.audio_input.Related Issues
This is an automated triage comment using
grok-4.7-xhigh. Please verify the suggested labels and related issues.github-actions commentedon Oct 8, 2026
To help Streamlit prioritize this feature, react with a 👍 (thumbs up emoji) to the initial post.
Your vote helps us identify which enhancements matter most to our users.