No keyboard focus indicator on most components, and the three that have one each did it differently
Los mantenedores suelen responder en 2 días
Evaluación
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Aptitud para principiantes
- 45/100
- Tipo de issue
- Error
- Claridad
- Bastante claro
- Estado de actividad
- Activo
- Stack tecnológico
- react-native, typescript
- Área
- accessibility, frontend, mobile
Línea de trabajo
Empieza leyendo src/theme/tokens/sys/state.ts, src/utils/isKeyboardFocusEvent.ts y el manejo de foco existente en FAB, Checkbox y Switch; reproduce el comportamiento con cd example && yarn start. Revisa los componentes interactivos indicados y su manejo de foco actual antes de decidir cómo debe funcionar el comportamiento compartido. Se considera terminado cuando la navegación con teclado muestra un indicador MD3 coherente en los componentes afectados en Android y la web, sin anillos activados por el ratón ni los problemas documentados de recorte y contraste.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Current behaviour
Most interactive components have no MD3 keyboard focus indicator.
| has a ring | no ring |
|---|---|
FAB, FAB.Menu, Checkbox, Switch |
RadioButton, Chip, SegmentedButtons, List.Item, pressable Card, Button, IconButton, Menu.Item, Drawer.Item, DataTable rows |
On Android a keyboard user gets nothing. On web you get the browser's default
outline, so not invisible, just not MD3 and different per browser.
The three that do have one each did it their own way. FAB has a local
useFocusRing hook with a reanimated SharedValue and checks
document.activeElement. Checkbox uses useState plus
src/utils/isKeyboardFocusEvent.ts. Switch uses a SharedValue plus the same
util. All three also carry their own copy of
const webNoOutline = { outline: "none" } as unknown as ViewStyle;
src/theme/tokens/sys/state.ts already has focusIndicator: { thickness: 3, outerOffset: 2 }. It is just not used in most places.
One thing to know before testing on iOS: onFocus never fires there for a View or
Pressable. RCTViewComponentView.mm emits it from becomeFirstResponder only
behind the enableImperativeFocus flag, which defaults off. Android has no such
gate. So the FAB/Checkbox/Switch rings are already inert on iOS, and this is a web
and Android fix.
Expected behaviour
A focus indicator on every interactive component, from one shared implementation and
the existing tokens.
Easy to get wrong:
- Keyboard only. A mouse click must not light it.
Pressable's ownfocusedstate
fires for clicks too, see necolas/react-native-web#1849. - Placement. MD3 puts the ring outside, hence
outerOffset. But outside gets
trimmed by a clipping ancestor sized to its content, and lands on the neighbour for
things that sit flush. Chips in a horizontalScrollVieware the obvious case.
material-web hits the same thing and has aninwardvariant for it. - Colour. MD3 tonal palettes are luminance matched by tone, so a
secondaryring
drawn on top of another role at the same tone is about 1:1 and disappears. It needs
to land somewhere with real contrast.
How to reproduce?
cd example && yarn start- Android, hardware keyboard or
adb shell input keyevent KEYCODE_TAB. Tab through
the Chip screen. Nothing. Same on List.Item, Segmented Buttons, Radio Button, a
pressable Card. - FAB and Checkbox do show a ring, so focus itself works.
- Web, same screens, you get the browser outline instead.
Android drops keyboard focus the moment you touch the screen. Tab again to get back.
Preview
Nothing to show as a still, it only exists while something is focused.
What have you tried so far?
- Read every component for existing focus handling to get the table, rather than
trusting the ticket this came from. - RN has
outlineWidth/outlineColor/outlineStyle/outlineOffsetsince
0.77, implemented on both platforms. Measured on iOS sim, android-35 emulator and
expo web: paints on all three, costs no layout, takes its radius from the view it
sits on, survives that view's ownoverflow: 'hidden', negative offset draws
inside. An ancestor'soverflow: 'hidden'does clip it. - Version floor is fine. The
react-native-reanimated >= 4.3.0peer dep already
declaresreact-native: "0.81 - 0.85".
Your Environment
| software | version |
|---|---|
| ios | 18.3 (simulator) |
| android | 15 / API 35 (emulator) |
| react-native | 0.85.3 |
| react-native-web | 0.21.2 |
| react-native-paper | 6.0.0-alpha.0 (main) |
| node | 24.13.0 |
- Lenguaje dominante
- TypeScript
- Estrellas
- 14.5k
- Forks
- 2.2k
- Merge medio
- 3 d 22 h
- PR fusionados (30 d)
- 8
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de callstack/react-native-paper
-
Menu ignores the keyboard when it mounts while the keyboard is already openPosiblemente ocupada @manchoudhary la tomó hace 19 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
callstack/react-native-paper#5096 ·
Los mantenedores suelen responder en 2 días
-
Color Picker Popup Is Obscured On "Guides -> Theming -> Creating Dynamic Theme Colors" Documentation On Both v5 and v6Posiblemente ocupada @fatihcvs la tomó hace 14 días. Abiertobug
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
callstack/react-native-paper#5093 ·
Los mantenedores suelen responder en 2 días
-
Tooltip: onPress event object is not propagated to parent component on nativePosiblemente ocupada @Shevilll la tomó hace 106 días. Abiertobug
Dificultad 2/5 1-3 horas Aptitud para principiantes 74/100
callstack/react-native-paper#5003 ·
Los mantenedores suelen responder en 2 días
-
Snackbar stays mounted after `visible=false` under new architecture (iOS + Android)Posiblemente ocupada @momomuchu la tomó hace 94 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
callstack/react-native-paper#4951 ·
Los mantenedores suelen responder en 2 días
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
callstack/react-native-paper#4881 ·
Los mantenedores suelen responder en 2 días
Todos los issues de callstack/react-native-paper
Issues similares
-
skills.mdx: ReadResourceDirectoryRequest does not type-check against the 2026-07-28 base schemaAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 85/100
modelcontextprotocol/ext-skills#156 ·
Los mantenedores suelen responder en 1 día
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
MystenLabs/MemWal#1104 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
Effect-TS/effect#8728 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
account-pool bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
lidge-jun/opencodex#6571 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Add: CanalPlusSport8SK.skAbiertocheck:passed streams:add
Dificultad 2/5 1-3 horas Aptitud para principiantes 66/100
Los mantenedores suelen responder en 1 día