From 033200ff4276c3d070512675cd653d819a2eb08a Mon Sep 17 00:00:00 2001 From: Jelte Homminga Date: Sun, 25 Oct 2026 08:21:47 +0100 Subject: [PATCH] Map role="slider" to the adjustable accessibility trait on iOS `role="slider"` resolves to no accessibility traits on iOS, so VoiceOver does not treat the view as adjustable, while `accessibilityRole="adjustable"` does. Before the ARIA roles moved to native, the JS mapping turned `role: 'slider'` into `accessibilityRole: 'adjustable'`. Add `slider` to the `adjustable` case of the traits `fromString`, the same way `img`/`image` and `heading`/`header` share a case. --- .../components/view/accessibilityPropsConversions.h | 2 +- .../components/view/tests/AccessibilityPropsTest.cpp | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/accessibilityPropsConversions.h b/packages/react-native/ReactCommon/react/renderer/components/view/accessibilityPropsConversions.h index bcb3d915c098..4af4d8fc9240 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/accessibilityPropsConversions.h +++ b/packages/react-native/ReactCommon/react/renderer/components/view/accessibilityPropsConversions.h @@ -71,7 +71,7 @@ inline void fromString(const std::string &string, AccessibilityTraits &result) result = AccessibilityTraits::StartsMediaSession; return; } - if (string == "adjustable") { + if (string == "adjustable" || string == "slider") { result = AccessibilityTraits::Adjustable; return; } diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/tests/AccessibilityPropsTest.cpp b/packages/react-native/ReactCommon/react/renderer/components/view/tests/AccessibilityPropsTest.cpp index 38c1d82b9694..b66d498b85d1 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/tests/AccessibilityPropsTest.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/view/tests/AccessibilityPropsTest.cpp @@ -44,6 +44,13 @@ TEST(AccessibilityPropsTest, derives_traits_from_role) { EXPECT_TRUE(hasTrait(props.accessibilityTraits, AccessibilityTraits::Button)); } +TEST(AccessibilityPropsTest, derives_adjustable_trait_from_slider_role) { + auto props = parse(folly::dynamic::object("role", "slider")); + + EXPECT_TRUE( + hasTrait(props.accessibilityTraits, AccessibilityTraits::Adjustable)); +} + TEST(AccessibilityPropsTest, derives_traits_from_accessibility_role) { auto props = parse(folly::dynamic::object("accessibilityRole", "image"));