[BUG] dcc.Dropdown: hidden focus-target input is focusable inside aria-hidden and can overflow its wrapper
I maintainer di solito rispondono entro 2 giorni
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 56/100
- Tipo di issue
- Bug
- Chiarezza
- Abbastanza chiara
- Stato di attività
- Attiva
- Stack tecnologico
- css, playwright, python, react, typescript
- Ambito
- accessibility, frontend
Direzione di ricerca
Parti da components/dash-core-components/src/fragments/Dropdown.tsx (l'input.dash-dropdown-focus-target nascosto con aria-hidden e tabIndex) e src/components/css/dropdown.css (il suo posizionamento absolute, larghezza illimitata). Riproduci con il layout minimale indicato nell'issue, controllando document.documentElement.scrollWidth ed eseguendo axe-core per la violazione aria-hidden-focus. Si considera completato quando il target di focus non allarga più la pagina e all'interno di aria-hidden non siede alcun contenuto focalizzabile, mantenendo il comportamento di ordine di tabulazione di Safari a cui la soluzione alternativa punta; verifica che i test Dropdown esistenti nella suite di test di dash-core-components continuino a superarsi.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Thank you for Dash!
Describe your context
dash 4.5.0rc0
(the same code is on dev today: components/dash-core-components/src/fragments/Dropdown.tsx and src/components/css/dropdown.css)
- OS: Linux
- Browser: Chromium 151 (headless, via Playwright) with axe-core
Describe the bug
The hidden input.dash-dropdown-focus-target that dcc.Dropdown renders (the Safari tab-order workaround) causes two problems:
-
It is focusable inside
aria-hidden. It hasaria-hidden="true"andtabIndex={0}(while the trigger<button>istabIndex={-1}), so the only tab stop for every dropdown is hidden from assistive technology. axe-core reportsaria-hidden-focus(serious) once perdcc.Dropdownon the page: "Focusable content should be disabled or be removed from the DOM". -
It can widen the page. Its CSS is only
position: absolute; opacity: 0; pointer-events: none;, so it keeps the browser's default input width (about 215px in Chromium) and is anchored atleft: 0of the wrapper. A dropdown narrower than that, near the right edge of a flex row, pushes the input past the viewport: in our app a 600px-wide viewport gotdocument.documentElement.scrollWidth === 648(horizontal scrolling on mobile). Addingmax-width: 100%(orwidth: 100%/inset: 0) to.dash-dropdown-focus-targetfixes it; we use this override for now:.dash-dropdown-wrapper .dash-dropdown-focus-target { max-width: 100%; }
Minimal example:
from dash import Dash, dcc, html
app = Dash(__name__)
app.layout = html.Div(
[html.Div(style={"flex": "1"}), dcc.Dropdown(["a", "b"], placeholder="Pick", style={"width": "140px"})],
style={"display": "flex", "width": "100%"},
)
if __name__ == "__main__":
app.run()
At a 200px-wide viewport, document.documentElement.scrollWidth is 237 because of the focus input, and axe-core reports one aria-hidden-focus violation on it.
Expected behavior
- No focusable element inside
aria-hidden. For example, droparia-hiddenfrom the workaround input and give it the dropdown's accessible name, or make the trigger button itself the tab stop where the browser supports it. I don't know which works best with the Safari behaviour the workaround targets. - The hidden input never takes more space than its wrapper (
max-width: 100%indropdown.css).
Screenshots
n/a
- Lingua principale
- Python
- Stelle
- 24.4k
- Fork
- 2.3k
- Merge medio
- 2g 13h
- PR unite (30g)
- 20
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di plotly/dash
-
P2 plotly-internal size: 1 task
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 2 giorni
-
Extract graph schema validation into properly named testForse già presa @Nice6042 l’ha presa 55 giorni fa. Apertagood first issue P3 size: 1 task
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
plotly/dash#3735 · 3 commenti ·
I maintainer di solito rispondono entro 2 giorni
-
P3 plotly-internal size: 10+ task
Difficoltà 5/5 Più di una settimana Idoneità per principianti 30/100
plotly/dash#4040 · 3 commenti ·
I maintainer di solito rispondono entro 2 giorni
-
Drop Python 3.9 SupportApertaP2 plotly-internal size: 5 task
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
plotly/dash#4038 · 2 commenti ·
I maintainer di solito rispondono entro 2 giorni
-
[BUG] Setting children to None leaves removed components registered: their callbacks keep firing and the subtree can never be mounted againForse già presa @0d00ciallo0721 l’ha presa 2 giorni fa. Apertabug P3 size: 3
Difficoltà 4/5 3-5 giorni Idoneità per principianti 62/100
plotly/dash#4033 · 1 commento ·
I maintainer di solito rispondono entro 2 giorni
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
pyjanitor-devs/pyjanitor#1758 ·
I maintainer di solito rispondono entro 1 giorno
-
bug ready for review
Difficoltà 2/5 1-3 ore Idoneità per principianti 86/100
odysseus-dev/odysseus#6641 ·
I maintainer di solito rispondono entro 1 giorno
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
happypawspillaro/happypaws#78 ·
I maintainer di solito rispondono entro 4 giorni
-
pydanty:is-working
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
pydantic/pydantic-ai#10020 ·
I maintainer di solito rispondono entro 1 giorno
-
stdlib type-bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
python/cpython#159044 · 4 commenti ·
I maintainer di solito rispondono entro 1 giorno