<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Frontend Developer Memo Blog</title>
        <link>https://frontend-dev-memo.vercel.app/field-notes</link>
        <description>Frontend Developer Memo Blog</description>
        <lastBuildDate>Tue, 27 Oct 2026 12:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Which aria-* Props Reach the Native Side in React Native 0.88]]></title>
            <link>https://frontend-dev-memo.vercel.app/field-notes/aria-props-in-react-native-0-88</link>
            <guid>https://frontend-dev-memo.vercel.app/field-notes/aria-props-in-react-native-0-88</guid>
            <pubDate>Tue, 27 Oct 2026 12:00:00 GMT</pubDate>
            <description><![CDATA[The aria-* and role props each core component accepts in its types against the ones that reach the native view]]></description>
            <content:encoded><![CDATA[<p>Every core component accepts <code>role</code> and the <code>aria-*</code> props in its types, but in
React Native 0.88 several components drop some of them without a warning, while
the <code>accessibility*</code> form of the same prop works.</p>
<!-- -->
<ul>
<li class=""><strong>Checked:</strong> 21–23 October 2026</li>
<li class=""><strong>Versions:</strong> React Native 0.88.0</li>
<li class=""><strong>Devices:</strong> iPhone, iOS 27; Samsung phone, Android 16; iOS 27.0 Simulator;
Android 17 emulator</li>
<li class=""><strong>Upstream:</strong>
<a href="https://github.com/react/react-native/issues/59377" target="_blank" rel="noopener noreferrer" class="">react/react-native#59377</a>
and more</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_lN3R" id="how-it-was-checked">How It Was Checked<a href="https://frontend-dev-memo.vercel.app/field-notes/aria-props-in-react-native-0-88#how-it-was-checked" class="hash-link" aria-label="Direct link to How It Was Checked" title="Direct link to How It Was Checked" translate="no">​</a></h2>
<ul>
<li class="">The source of every component exported from <code>react-native</code> was read on <code>main</code>
(October 2026) for the props it passes to the native view; the device checks
used 0.88.0. Not covered: the deprecated components, <code>SafeAreaView</code>,
<code>InputAccessoryView</code>, <code>VirtualView</code>.</li>
<li class="">The rows users hit were run in pairs, the <code>aria-*</code> prop next to its
<code>accessibility*</code> form: on the Simulator and the emulator in the
<a href="https://github.com/faciledictu/rn-aria-props-repro" target="_blank" rel="noopener noreferrer" class="">reproducer</a>, read with
Accessibility Inspector and <code>uiautomator dump</code>; <code>View</code> and <code>Text</code> with
VoiceOver and TalkBack on phones in
<a href="https://github.com/faciledictu/memo-lab" target="_blank" rel="noopener noreferrer" class="">Memo Lab</a>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_lN3R" id="result">Result<a href="https://frontend-dev-memo.vercel.app/field-notes/aria-props-in-react-native-0-88#result" class="hash-link" aria-label="Direct link to Result" title="Direct link to Result" translate="no">​</a></h2>
<p>How a prop gets to the native side: each JS component converts <code>aria-*</code> to
<code>accessibility*</code> itself (<code>View</code>, <code>Text</code>, <code>TextInput</code>, <code>Image</code>). The native side
reads only the <code>accessibility*</code> names and <code>role</code>, so a prop the component does
not convert is dropped.</p>
<table><thead><tr><th>Component</th><th>Dropped</th><th>Checked</th></tr></thead><tbody><tr><td><code>View</code></td><td><code>aria-modal</code></td><td><a class="" href="https://frontend-dev-memo.vercel.app/field-notes/view-aria-modal">iPhone</a></td></tr><tr><td><code>View</code></td><td><code>aria-live</code> works, but a <code>View</code> with only layout styles is flattened</td><td><a class="" href="https://frontend-dev-memo.vercel.app/field-notes/view-live-region">Android</a></td></tr><tr><td><code>Text</code></td><td><code>aria-live</code></td><td><a class="" href="https://frontend-dev-memo.vercel.app/field-notes/text-aria-live">Android</a></td></tr><tr><td><code>Switch</code>, <code>ScrollView</code>, <code>ActivityIndicator</code></td><td>Every <code>aria-*</code>, <code>id</code>, <code>tabIndex</code>; <code>role</code> works (read from the code)</td><td><a class="" href="https://frontend-dev-memo.vercel.app/field-notes/aria-on-native-components">Both</a></td></tr><tr><td><code>TouchableOpacity</code>, <code>TouchableNativeFeedback</code></td><td><code>role</code>, <code>aria-labelledby</code></td><td><a class="" href="https://frontend-dev-memo.vercel.app/field-notes/touchable-components-role">Both</a></td></tr><tr><td><code>TouchableHighlight</code></td><td><code>role</code>, <code>aria-labelledby</code>, <code>aria-busy</code>, <code>-checked</code>, <code>-disabled</code>, …</td><td><a class="" href="https://frontend-dev-memo.vercel.app/field-notes/touchable-components-role">Both</a></td></tr><tr><td><code>TouchableWithoutFeedback</code></td><td><code>role</code>, <code>aria-label</code>, <code>aria-labelledby</code></td><td><a class="" href="https://frontend-dev-memo.vercel.app/field-notes/touchable-components-role">Both</a></td></tr><tr><td><code>Text</code></td><td><code>aria-labelledby</code>, <code>aria-modal</code>, <code>aria-value*</code></td><td>Code only</td></tr><tr><td><code>TextInput</code>, <code>Image</code></td><td><code>aria-live</code>, <code>aria-modal</code>, <code>aria-value*</code></td><td>Code only</td></tr><tr><td><code>RefreshControl</code>, <code>Modal</code></td><td>Every <code>aria-*</code>, <code>id</code>, <code>tabIndex</code></td><td>Code only</td></tr></tbody></table>
<ul>
<li class=""><code>Pressable</code>, <code>Button</code>, <code>KeyboardAvoidingView</code>, <code>ImageBackground</code> and the lists
render a <code>View</code>, <code>ScrollView</code> or <code>Image</code> and have the same gaps.</li>
<li class="">Not every gap matters: <code>aria-modal</code> on an <code>Image</code> or <code>aria-live</code> on a <code>Switch</code>
make no sense. The ones that do: <code>aria-label</code> on <code>Switch</code>, <code>role</code> on
<code>Touchable*</code>, <code>aria-label</code> on <code>TouchableWithoutFeedback</code>.</li>
<li class=""><code>aria-labelledby</code> is a space-separated list of ids on the web; <code>View</code> splits
it by commas, <code>TextInput</code> and <code>Image</code> pass it as one id, and Android uses only
the first one. A web-style <code>aria-labelledby="title hint"</code> matches nothing.</li>
<li class="">What works instead: the <code>accessibility*</code> form (<code>accessibilityLabel</code>,
<code>accessibilityRole</code>, <code>accessibilityState</code>, <code>accessibilityLiveRegion</code>,
<code>accessibilityViewIsModal</code>). Two exceptions: a live region on a <code>View</code> also
needs <code>collapsable={false}</code>, and <code>ActivityIndicator</code> on iOS
<a class="" href="https://frontend-dev-memo.vercel.app/field-notes/activity-indicator-label-ios">ignores even <code>accessibilityLabel</code></a>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_lN3R" id="upstream">Upstream<a href="https://frontend-dev-memo.vercel.app/field-notes/aria-props-in-react-native-0-88#upstream" class="hash-link" aria-label="Direct link to Upstream" title="Direct link to Upstream" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://github.com/react/react-native/issues/59377" target="_blank" rel="noopener noreferrer" class="">react/react-native#59377</a>:
the issue with the whole table.</li>
<li class="">Landed in <code>main</code>, not in a release on 27 October 2026:
<a href="https://github.com/react/react-native/pull/59328" target="_blank" rel="noopener noreferrer" class="">#59328</a> (<code>aria-modal</code> on
<code>View</code>), <a href="https://github.com/react/react-native/pull/59330" target="_blank" rel="noopener noreferrer" class="">#59330</a>
(<code>aria-live</code> on <code>Text</code>),
<a href="https://github.com/react/react-native/pull/59335" target="_blank" rel="noopener noreferrer" class="">#59335</a> (a <code>View</code> live
region).</li>
<li class="">Open on 27 October 2026:
<a href="https://github.com/react/react-native/pull/59378" target="_blank" rel="noopener noreferrer" class="">#59378</a> (<code>Touchable*</code>),
<a href="https://github.com/react/react-native/pull/59379" target="_blank" rel="noopener noreferrer" class="">#59379</a> (<code>Switch</code>,
<code>ScrollView</code>, <code>ActivityIndicator</code>),
<a href="https://github.com/react/react-native/pull/59072" target="_blank" rel="noopener noreferrer" class="">#59072</a> (<code>aria-hidden</code> on
<code>ScrollView</code> and <code>ActivityIndicator</code>),
<a href="https://github.com/react/react-native/pull/58173" target="_blank" rel="noopener noreferrer" class="">#58173</a> (<code>aria-labelledby</code>
on <code>Button</code> and <code>Touchable*</code>);
<a href="https://github.com/react/react-native/issues/59380" target="_blank" rel="noopener noreferrer" class="">#59380</a> and its fix
<a href="https://github.com/react/react-native/pull/59381" target="_blank" rel="noopener noreferrer" class="">#59381</a>
(<code>ActivityIndicator</code> label on iOS).</li>
</ul>]]></content:encoded>
            <category>React Native</category>
            <category>Accessibility</category>
            <category>iOS</category>
            <category>Android</category>
        </item>
        <item>
            <title><![CDATA[ActivityIndicator Ignores Its Label on iOS]]></title>
            <link>https://frontend-dev-memo.vercel.app/field-notes/activity-indicator-label-ios</link>
            <guid>https://frontend-dev-memo.vercel.app/field-notes/activity-indicator-label-ios</guid>
            <pubDate>Tue, 27 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[In React Native 0.88 an ActivityIndicator on iOS is exposed with the label "In progress" whatever accessibilityLabel says; accessible fixes the label but loses the value]]></description>
            <content:encoded><![CDATA[<p>On iOS, <code>&lt;ActivityIndicator accessibilityLabel="Loading orders" /&gt;</code> is exposed
to VoiceOver with the label "In progress", the default label of the native
indicator. The label goes to a wrapper view that is not an accessibility
element. Android uses the label.</p>
<!-- -->
<ul>
<li class=""><strong>Checked:</strong> 22–23 October 2026</li>
<li class=""><strong>Versions:</strong> React Native 0.88.0</li>
<li class=""><strong>Devices:</strong> iOS 27.0 Simulator (Accessibility Inspector); Android 17 emulator</li>
<li class=""><strong>Upstream:</strong>
<a href="https://github.com/react/react-native/issues/59380" target="_blank" rel="noopener noreferrer" class="">react/react-native#59380</a>,
fix <a href="https://github.com/react/react-native/pull/59381" target="_blank" rel="noopener noreferrer" class="">#59381</a>: open</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_lN3R" id="how-it-was-checked">How It Was Checked<a href="https://frontend-dev-memo.vercel.app/field-notes/activity-indicator-label-ios#how-it-was-checked" class="hash-link" aria-label="Direct link to How It Was Checked" title="Direct link to How It Was Checked" translate="no">​</a></h2>
<p>The indicator D in the
<a href="https://github.com/faciledictu/rn-aria-props-repro" target="_blank" rel="noopener noreferrer" class="">reproducer</a>, read with
Accessibility Inspector:</p>
<div class="language-tsx codeBlockContainer_Bppz theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_oDf1"><pre tabindex="0" class="prism-code language-tsx codeBlock_OeUU thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_G7lF"><div class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">ActivityIndicator</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">accessibilityLabel</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Loading D</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_lN3R" id="result">Result<a href="https://frontend-dev-memo.vercel.app/field-notes/activity-indicator-label-ios#result" class="hash-link" aria-label="Direct link to Result" title="Direct link to Result" translate="no">​</a></h2>
<table><thead><tr><th>Variant</th><th>Label</th><th>Value</th><th>Element</th></tr></thead><tbody><tr><td><code>accessibilityLabel</code></td><td>"In progress"</td><td>1</td><td>The native indicator</td></tr><tr><td><code>accessible</code> + <code>accessibilityLabel</code></td><td>"Loading D"</td><td>none</td><td>The React Native wrapper view</td></tr></tbody></table>
<ul>
<li class="">With <code>accessible</code> the label is read, but the indicator's value is lost.</li>
<li class="">On Android 17 the label is used: <code>content-desc="Loading D"</code>.</li>
<li class="">The cause: the accessibility props go to the wrapper view, VoiceOver skips it
and reads the inner <code>UIActivityIndicatorView</code>. <code>Switch</code> solves the same case
by exposing the inner native view as the accessibility element.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_lN3R" id="upstream">Upstream<a href="https://frontend-dev-memo.vercel.app/field-notes/activity-indicator-label-ios#upstream" class="hash-link" aria-label="Direct link to Upstream" title="Direct link to Upstream" translate="no">​</a></h2>
<p><a href="https://github.com/react/react-native/issues/59380" target="_blank" rel="noopener noreferrer" class="">react/react-native#59380</a>
is the issue,
<a href="https://github.com/react/react-native/pull/59381" target="_blank" rel="noopener noreferrer" class="">react/react-native#59381</a> the
fix; it was checked on the Simulator with React Native built from source (the
label is used and the value kept). Open on 27 October 2026.</p>]]></content:encoded>
            <category>React Native</category>
            <category>Accessibility</category>
            <category>iOS</category>
        </item>
        <item>
            <title><![CDATA[Switch, ScrollView and ActivityIndicator Drop Every aria-* Prop]]></title>
            <link>https://frontend-dev-memo.vercel.app/field-notes/aria-on-native-components</link>
            <guid>https://frontend-dev-memo.vercel.app/field-notes/aria-on-native-components</guid>
            <pubDate>Tue, 27 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[In React Native 0.88 aria-label on a Switch gives it no name; the components that render a native view directly do not convert aria-* props]]></description>
            <content:encoded><![CDATA[<p><code>Switch</code>, <code>ScrollView</code> and <code>ActivityIndicator</code> accept all <code>View</code> props in their
types and docs, but in React Native 0.88 they pass <code>aria-*</code>, <code>id</code> and <code>tabIndex</code>
to the native side unconverted, where nothing reads them.
<code>&lt;Switch aria-label="Wi-Fi" /&gt;</code> has no name; <code>accessibilityLabel</code> works.</p>
<!-- -->
<ul>
<li class=""><strong>Checked:</strong> 22–23 October 2026</li>
<li class=""><strong>Versions:</strong> React Native 0.88.0</li>
<li class=""><strong>Devices:</strong> iOS 27.0 Simulator (Accessibility Inspector), Android 17 emulator
(<code>uiautomator dump</code>)</li>
<li class=""><strong>Upstream:</strong>
<a href="https://github.com/react/react-native/pull/59379" target="_blank" rel="noopener noreferrer" class="">react/react-native#59379</a>:
open</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_lN3R" id="how-it-was-checked">How It Was Checked<a href="https://frontend-dev-memo.vercel.app/field-notes/aria-on-native-components#how-it-was-checked" class="hash-link" aria-label="Direct link to How It Was Checked" title="Direct link to How It Was Checked" translate="no">​</a></h2>
<p>Pairs in the <a href="https://github.com/faciledictu/rn-aria-props-repro" target="_blank" rel="noopener noreferrer" class="">reproducer</a>:
the left element uses the <code>aria-*</code> prop, the right one its <code>accessibility*</code>
form. The accessibility tree was read without a screen reader.</p>
<div class="language-tsx codeBlockContainer_Bppz theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_oDf1"><pre tabindex="0" class="prism-code language-tsx codeBlock_OeUU thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_G7lF"><div class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">Switch</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">aria-label</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Wi-Fi A</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">value</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">on</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">onValueChange</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">setOn</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">Switch</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">accessibilityLabel</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Wi-Fi B</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">value</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">on</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">onValueChange</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">setOn</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_lN3R" id="result">Result<a href="https://frontend-dev-memo.vercel.app/field-notes/aria-on-native-components#result" class="hash-link" aria-label="Direct link to Result" title="Direct link to Result" translate="no">​</a></h2>
<table><thead><tr><th>Pair</th><th><code>aria-label</code></th><th><code>accessibilityLabel</code></th></tr></thead><tbody><tr><td><code>Switch</code>, Android</td><td><code>content-desc=""</code>, marked <code>NAF</code> (focusable, but no text or description)</td><td><code>content-desc="Wi-Fi B"</code></td></tr><tr><td><code>Switch</code>, iOS</td><td>No label</td><td>Label "Wi-Fi B"</td></tr><tr><td><code>ActivityIndicator</code>, Android</td><td><code>content-desc=""</code></td><td><code>content-desc="Loading D"</code></td></tr><tr><td><code>ScrollView</code>, Android</td><td><code>content-desc=""</code></td><td><code>content-desc="Photos F"</code></td></tr></tbody></table>
<ul>
<li class="">The cause: <code>View</code>, <code>Text</code>, <code>TextInput</code> and <code>Image</code> convert <code>aria-*</code> to
<code>accessibility*</code> in JS. <code>Switch</code>, <code>ScrollView</code> and <code>ActivityIndicator</code> render
a native component directly and convert nothing. <code>RefreshControl</code> and <code>Modal</code>
do the same (read from the code, not run).</li>
<li class="">On iOS a <code>ScrollView</code> is not an accessibility element, so a label does not
apply there; <code>ActivityIndicator</code> on iOS ignores even <code>accessibilityLabel</code>, see
<a class="" href="https://frontend-dev-memo.vercel.app/field-notes/activity-indicator-label-ios">a separate note</a>.</li>
<li class="">What works: the <code>accessibility*</code> form of the same prop.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_lN3R" id="upstream">Upstream<a href="https://frontend-dev-memo.vercel.app/field-notes/aria-on-native-components#upstream" class="hash-link" aria-label="Direct link to Upstream" title="Direct link to Upstream" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://github.com/react/react-native/issues/59377" target="_blank" rel="noopener noreferrer" class="">react/react-native#59377</a>:
the issue for all components.</li>
<li class=""><a href="https://github.com/react/react-native/pull/59379" target="_blank" rel="noopener noreferrer" class="">react/react-native#59379</a>
adds the conversion to the three components; open on 27 October 2026.</li>
<li class=""><a href="https://github.com/react/react-native/pull/59072" target="_blank" rel="noopener noreferrer" class="">react/react-native#59072</a>
maps only <code>aria-hidden</code> on <code>ScrollView</code> and <code>ActivityIndicator</code>; open on 27
October 2026.</li>
</ul>]]></content:encoded>
            <category>React Native</category>
            <category>Accessibility</category>
            <category>iOS</category>
            <category>Android</category>
        </item>
        <item>
            <title><![CDATA[KeyboardAvoidingView Without behavior Leaves the Input Covered on Edge-to-Edge Android]]></title>
            <link>https://frontend-dev-memo.vercel.app/field-notes/keyboard-avoiding-view-android-edge-to-edge</link>
            <guid>https://frontend-dev-memo.vercel.app/field-notes/keyboard-avoiding-view-android-edge-to-edge</guid>
            <pubDate>Tue, 27 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Expo's keyboard guide sets no behavior on Android; on an edge-to-edge app the keyboard then covers the input, padding with the header offset keeps it visible]]></description>
            <content:encoded><![CDATA[<p>Expo's keyboard guide sets
<code>behavior={Platform.OS === 'ios' ? 'padding' : undefined}</code>. An edge-to-edge app
(every Expo SDK 54+ app on Android 16, and Android 15 enforces it for apps
targeting API 35) does not shrink its window for the keyboard, so with no
<code>behavior</code> the input stays under the keyboard. <code>padding</code> or <code>height</code> with the
header offset keeps it right above the keyboard. Checked on Android 16 and 17.</p>
<!-- -->
<ul>
<li class=""><strong>Checked:</strong> 21 October 2026</li>
<li class=""><strong>Versions:</strong> React Native 0.88, Expo SDK 58</li>
<li class=""><strong>Devices:</strong> Samsung phone, Android 16; Android 17 emulator</li>
<li class=""><strong>Upstream:</strong> <a href="https://github.com/expo/expo/pull/52032" target="_blank" rel="noopener noreferrer" class="">expo/expo#52032</a>: open</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_lN3R" id="how-it-was-checked">How It Was Checked<a href="https://frontend-dev-memo.vercel.app/field-notes/keyboard-avoiding-view-android-edge-to-edge#how-it-was-checked" class="hash-link" aria-label="Direct link to How It Was Checked" title="Direct link to How It Was Checked" translate="no">​</a></h2>
<p>The <code>keyboard-avoiding-view</code> case of
<a href="https://github.com/faciledictu/memo-lab" target="_blank" rel="noopener noreferrer" class="">Memo Lab</a>: a screen under a navigation
header with a <code>KeyboardAvoidingView</code> and an input at the bottom; switches set
<code>behavior</code> (none, <code>padding</code>, <code>height</code>) and <code>keyboardVerticalOffset</code> (0 or the
header height). For each combination: tap the input, type, and look where the
input is.</p>
<div class="language-tsx codeBlockContainer_Bppz theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_oDf1"><pre tabindex="0" class="prism-code language-tsx codeBlock_OeUU thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_G7lF"><div class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">KeyboardAvoidingView</span><span class="token tag" style="color:#00009f"></span><br></div><div class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">  </span><span class="token tag attr-name" style="color:#00a4db">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f"> flex</span><span class="token tag script language-javascript operator" style="color:#393A34">:</span><span class="token tag script language-javascript" style="color:#00009f"> </span><span class="token tag script language-javascript number" style="color:#36acaa">1</span><span class="token tag script language-javascript" style="color:#00009f"> </span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag" style="color:#00009f"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token tag" style="color:#00009f">  </span><span class="token tag attr-name" style="color:#00a4db">behavior</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">behavior</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag" style="color:#00009f"> </span><span class="token tag comment" style="color:#999988;font-style:italic">// undefined, 'padding' or 'height'</span><span class="token tag" style="color:#00009f"></span><br></div><div class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">  </span><span class="token tag attr-name" style="color:#00a4db">keyboardVerticalOffset</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">withOffset </span><span class="token tag script language-javascript operator" style="color:#393A34">?</span><span class="token tag script language-javascript" style="color:#00009f"> headerHeight </span><span class="token tag script language-javascript operator" style="color:#393A34">:</span><span class="token tag script language-javascript" style="color:#00009f"> </span><span class="token tag script language-javascript number" style="color:#36acaa">0</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag" style="color:#00009f"></span><br></div><div class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f"></span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">View</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f"> flex</span><span class="token tag script language-javascript operator" style="color:#393A34">:</span><span class="token tag script language-javascript" style="color:#00009f"> </span><span class="token tag script language-javascript number" style="color:#36acaa">1</span><span class="token tag script language-javascript" style="color:#00009f"> </span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">TextInput</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">placeholder</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Message</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag class-name" style="color:#00009f">KeyboardAvoidingView</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_lN3R" id="result">Result<a href="https://frontend-dev-memo.vercel.app/field-notes/keyboard-avoiding-view-android-edge-to-edge#result" class="hash-link" aria-label="Direct link to Result" title="Direct link to Result" translate="no">​</a></h2>
<table><thead><tr><th><code>behavior</code></th><th>Android 16 and 17</th></tr></thead><tbody><tr><td>none (the guide)</td><td>The input is under the keyboard</td></tr><tr><td><code>padding</code> or <code>height</code> + header offset</td><td>Right above the keyboard</td></tr></tbody></table>
<ul>
<li class="">The window keeps its height when the keyboard opens: the keyboard comes as an
inset, not as a smaller window.</li>
<li class="">The old reason to skip <code>behavior</code> on Android was that the window shrank by
itself (<code>adjustResize</code>) and padding added a second gap. With edge-to-edge it
does not shrink, so <code>padding</code> is right on both platforms.</li>
<li class=""><code>react-native-keyboard-controller</code> behaved the same on both Android versions.</li>
<li class="">This note covers Android only: on iOS the guide already sets <code>padding</code>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_lN3R" id="upstream">Upstream<a href="https://frontend-dev-memo.vercel.app/field-notes/keyboard-avoiding-view-android-edge-to-edge#upstream" class="hash-link" aria-label="Direct link to Upstream" title="Direct link to Upstream" translate="no">​</a></h2>
<p><a href="https://github.com/expo/expo/pull/52032" target="_blank" rel="noopener noreferrer" class="">expo/expo#52032</a> changes the guide's
example to <code>behavior="padding"</code> on both platforms; open on 27 October 2026. A
minimal Expo Go app for it:
<a href="https://github.com/faciledictu/expo-kav-edge-to-edge" target="_blank" rel="noopener noreferrer" class="">expo-kav-edge-to-edge</a>.</p>]]></content:encoded>
            <category>Expo</category>
            <category>React Native</category>
            <category>Keyboard</category>
            <category>Android</category>
        </item>
        <item>
            <title><![CDATA[aria-live on Text Is Not Announced on Android]]></title>
            <link>https://frontend-dev-memo.vercel.app/field-notes/text-aria-live</link>
            <guid>https://frontend-dev-memo.vercel.app/field-notes/text-aria-live</guid>
            <pubDate>Tue, 27 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[In React Native 0.88 a Text with aria-live stays silent with TalkBack; the same Text with accessibilityLiveRegion is announced]]></description>
            <content:encoded><![CDATA[<p><code>Text</code> accepts <code>aria-live</code> in its types, but in React Native 0.88 it does not
convert it to <code>accessibilityLiveRegion</code>, as <code>View</code> does. A counter in
<code>&lt;Text aria-live="polite"&gt;</code> is never announced by TalkBack; the same counter
with <code>accessibilityLiveRegion="polite"</code> is announced on every change.</p>
<!-- -->
<ul>
<li class=""><strong>Checked:</strong> 21 October 2026</li>
<li class=""><strong>Versions:</strong> React Native 0.88.0, Expo SDK 58 (development build)</li>
<li class=""><strong>Devices:</strong> Samsung phone (SM-A276B), Android 16, TalkBack</li>
<li class=""><strong>Upstream:</strong>
<a href="https://github.com/react/react-native/pull/59330" target="_blank" rel="noopener noreferrer" class="">react/react-native#59330</a>:
merged into <code>main</code></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_lN3R" id="how-it-was-checked">How It Was Checked<a href="https://frontend-dev-memo.vercel.app/field-notes/text-aria-live#how-it-was-checked" class="hash-link" aria-label="Direct link to How It Was Checked" title="Direct link to How It Was Checked" translate="no">​</a></h2>
<p>The <code>announcements</code> case of <a href="https://github.com/faciledictu/memo-lab" target="_blank" rel="noopener noreferrer" class="">Memo Lab</a>:
counters in live regions, each changed by its own button; activate a button and
wait for the announcement.</p>
<div class="language-tsx codeBlockContainer_Bppz theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_oDf1"><pre tabindex="0" class="prism-code language-tsx codeBlock_OeUU thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_G7lF"><div class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token comment" style="color:#999988;font-style:italic">/* A: silent */</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">Text</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">aria-live</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">polite</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text">Cart A: </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">countA</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain-text"> items</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag class-name" style="color:#00009f">Text</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token comment" style="color:#999988;font-style:italic">/* B: announced on every change */</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">Text</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">accessibilityLiveRegion</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">polite</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text">Cart B: </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">countB</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain-text"> items</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag class-name" style="color:#00009f">Text</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_lN3R" id="result">Result<a href="https://frontend-dev-memo.vercel.app/field-notes/text-aria-live#result" class="hash-link" aria-label="Direct link to Result" title="Direct link to Result" translate="no">​</a></h2>
<ul>
<li class="">A is never announced, B is.</li>
<li class="">The cause: <code>Text</code> passes <code>aria-live</code> to the native side under that name, and
the native side reads only <code>accessibilityLiveRegion</code>.</li>
<li class="">Not affected: iOS, which has no live regions; there the app posts an
announcement with <code>AccessibilityInfo.announceForAccessibility</code>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_lN3R" id="upstream">Upstream<a href="https://frontend-dev-memo.vercel.app/field-notes/text-aria-live#upstream" class="hash-link" aria-label="Direct link to Upstream" title="Direct link to Upstream" translate="no">​</a></h2>
<p><a href="https://github.com/react/react-native/pull/59330" target="_blank" rel="noopener noreferrer" class="">react/react-native#59330</a>
maps <code>aria-live</code> to <code>accessibilityLiveRegion</code> in <code>Text</code>. It was merged into
<code>main</code> on 22 October 2026, after the 0.88 branch was cut; on 27 October 2026 it
is not in a release (0.88.1 does not include it).</p>]]></content:encoded>
            <category>React Native</category>
            <category>Accessibility</category>
            <category>Android</category>
        </item>
        <item>
            <title><![CDATA[Touchable* Drop role and Some aria-* Props]]></title>
            <link>https://frontend-dev-memo.vercel.app/field-notes/touchable-components-role</link>
            <guid>https://frontend-dev-memo.vercel.app/field-notes/touchable-components-role</guid>
            <pubDate>Tue, 27 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[In React Native 0.88 TouchableOpacity with role="button" has no role; TouchableWithoutFeedback drops aria-label, TouchableHighlight the aria-* state]]></description>
            <content:encoded><![CDATA[<p><code>Touchable*</code> build their native view from a fixed list of props, and in React
Native 0.88 <code>role</code> is on none of the lists. <code>&lt;TouchableOpacity role="button"&gt;</code>
has no role; <code>accessibilityRole="button"</code> works. <code>TouchableWithoutFeedback</code> also
drops <code>aria-label</code>, and <code>TouchableHighlight</code> drops <code>aria-checked</code> and the other
<code>aria-*</code> state props.</p>
<!-- -->
<ul>
<li class=""><strong>Checked:</strong> 22–23 October 2026</li>
<li class=""><strong>Versions:</strong> React Native 0.88.0</li>
<li class=""><strong>Devices:</strong> iOS 27.0 Simulator (Accessibility Inspector), Android 17 emulator
(<code>uiautomator dump</code>)</li>
<li class=""><strong>Upstream:</strong>
<a href="https://github.com/react/react-native/pull/59378" target="_blank" rel="noopener noreferrer" class="">react/react-native#59378</a>:
open</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_lN3R" id="how-it-was-checked">How It Was Checked<a href="https://frontend-dev-memo.vercel.app/field-notes/touchable-components-role#how-it-was-checked" class="hash-link" aria-label="Direct link to How It Was Checked" title="Direct link to How It Was Checked" translate="no">​</a></h2>
<p>Pairs in the <a href="https://github.com/faciledictu/rn-aria-props-repro" target="_blank" rel="noopener noreferrer" class="">reproducer</a>,
the <code>aria-*</code> or <code>role</code> prop next to its <code>accessibility*</code> form:</p>
<div class="language-tsx codeBlockContainer_Bppz theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_oDf1"><pre tabindex="0" class="prism-code language-tsx codeBlock_OeUU thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_G7lF"><div class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">TouchableOpacity</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">role</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">button</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">onPress</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">save</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">Text</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text">Save G</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag class-name" style="color:#00009f">Text</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">  </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag class-name" style="color:#00009f">TouchableOpacity</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">TouchableOpacity</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">accessibilityRole</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">button</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">onPress</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">save</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">Text</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text">Save H</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag class-name" style="color:#00009f">Text</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">  </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag class-name" style="color:#00009f">TouchableOpacity</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_lN3R" id="result">Result<a href="https://frontend-dev-memo.vercel.app/field-notes/touchable-components-role#result" class="hash-link" aria-label="Direct link to Result" title="Direct link to Result" translate="no">​</a></h2>
<table><thead><tr><th>Component</th><th>Prop</th><th>Android 17</th><th>iOS 27</th></tr></thead><tbody><tr><td><code>TouchableOpacity</code></td><td><code>role="button"</code></td><td><code>android.view.ViewGroup</code></td><td>No Button trait</td></tr><tr><td><code>TouchableWithoutFeedback</code></td><td><code>aria-label="Close I"</code></td><td><code>content-desc="×"</code> (the child)</td><td>Label "×"</td></tr><tr><td><code>TouchableHighlight</code></td><td><code>aria-checked</code></td><td><code>checkable="false"</code></td><td>No "checked" in the value</td></tr></tbody></table>
<p>With the <code>accessibility*</code> form each of them is right: <code>android.widget.Button</code>
and the Button trait, the label "Close J", <code>checked="true"</code>.</p>
<ul>
<li class=""><code>TouchableNativeFeedback</code> drops <code>role</code> too (read from the code, not run).</li>
<li class=""><code>aria-labelledby</code> is dropped by all four (read from the code).</li>
<li class=""><code>Pressable</code> does not have these gaps: it passes its props on to a <code>View</code>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_lN3R" id="upstream">Upstream<a href="https://frontend-dev-memo.vercel.app/field-notes/touchable-components-role#upstream" class="hash-link" aria-label="Direct link to Upstream" title="Direct link to Upstream" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://github.com/react/react-native/pull/59378" target="_blank" rel="noopener noreferrer" class="">react/react-native#59378</a>
passes <code>role</code> from all four and maps the missing <code>aria-*</code>; open on 27
October 2026.</li>
<li class=""><a href="https://github.com/react/react-native/pull/58173" target="_blank" rel="noopener noreferrer" class="">react/react-native#58173</a>
passes <code>aria-labelledby</code> through <code>Button</code> and <code>Touchable*</code>; open on 27
October 2026.</li>
</ul>]]></content:encoded>
            <category>React Native</category>
            <category>Accessibility</category>
            <category>iOS</category>
            <category>Android</category>
        </item>
        <item>
            <title><![CDATA[aria-modal on View Does Nothing on iOS]]></title>
            <link>https://frontend-dev-memo.vercel.app/field-notes/view-aria-modal</link>
            <guid>https://frontend-dev-memo.vercel.app/field-notes/view-aria-modal</guid>
            <pubDate>Tue, 27 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[The View docs list aria-modal, but in React Native 0.88 VoiceOver still reaches the views behind a custom dialog; accessibilityViewIsModal works]]></description>
            <content:encoded><![CDATA[<p>The <code>View</code> docs list <code>aria-modal</code> as an iOS prop that takes precedence over
<code>accessibilityViewIsModal</code>. In React Native 0.88 <code>View</code> does not pass it to the
native view: with <code>aria-modal</code> VoiceOver still reaches the background of a
custom dialog, with <code>accessibilityViewIsModal</code> it does not.</p>
<!-- -->
<ul>
<li class=""><strong>Checked:</strong> 21 October 2026</li>
<li class=""><strong>Versions:</strong> React Native 0.88.0, Expo SDK 58 (development build)</li>
<li class=""><strong>Devices:</strong> iPhone, iOS 27, VoiceOver</li>
<li class=""><strong>Upstream:</strong>
<a href="https://github.com/react/react-native/pull/59328" target="_blank" rel="noopener noreferrer" class="">react/react-native#59328</a>:
landed in <code>main</code></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_lN3R" id="how-it-was-checked">How It Was Checked<a href="https://frontend-dev-memo.vercel.app/field-notes/view-aria-modal#how-it-was-checked" class="hash-link" aria-label="Direct link to How It Was Checked" title="Direct link to How It Was Checked" translate="no">​</a></h2>
<p>The <code>modal</code> case of <a href="https://github.com/faciledictu/memo-lab" target="_blank" rel="noopener noreferrer" class="">Memo Lab</a>: a
screen with three background buttons and a custom overlay that is their sibling.
With the dialog open, swipe right through all elements, then touch where a
background button is.</p>
<div class="language-tsx codeBlockContainer_Bppz theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_oDf1"><pre tabindex="0" class="prism-code language-tsx codeBlock_OeUU thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_G7lF"><div class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">View</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f"> flex</span><span class="token tag script language-javascript operator" style="color:#393A34">:</span><span class="token tag script language-javascript" style="color:#00009f"> </span><span class="token tag script language-javascript number" style="color:#36acaa">1</span><span class="token tag script language-javascript" style="color:#00009f"> </span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">View</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f"> flex</span><span class="token tag script language-javascript operator" style="color:#393A34">:</span><span class="token tag script language-javascript" style="color:#00009f"> </span><span class="token tag script language-javascript number" style="color:#36acaa">1</span><span class="token tag script language-javascript punctuation" style="color:#393A34">,</span><span class="token tag script language-javascript" style="color:#00009f"> padding</span><span class="token tag script language-javascript operator" style="color:#393A34">:</span><span class="token tag script language-javascript" style="color:#00009f"> </span><span class="token tag script language-javascript number" style="color:#36acaa">48</span><span class="token tag script language-javascript punctuation" style="color:#393A34">,</span><span class="token tag script language-javascript" style="color:#00009f"> gap</span><span class="token tag script language-javascript operator" style="color:#393A34">:</span><span class="token tag script language-javascript" style="color:#00009f"> </span><span class="token tag script language-javascript number" style="color:#36acaa">16</span><span class="token tag script language-javascript" style="color:#00009f"> </span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'One'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Two'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Three'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">map</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">title</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">Pressable</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">key</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">title</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">role</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">button</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">        </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">Text</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text">Background item </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">title</span><span class="token punctuation" style="color:#393A34">}</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag class-name" style="color:#00009f">Text</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag class-name" style="color:#00009f">Pressable</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">  </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag class-name" style="color:#00009f">View</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">View</span><span class="token tag" style="color:#00009f"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token tag" style="color:#00009f">    </span><span class="token tag attr-name" style="color:#00a4db">aria-modal</span><span class="token tag" style="color:#00009f"> </span><span class="token tag comment" style="color:#999988;font-style:italic">// or accessibilityViewIsModal</span><span class="token tag" style="color:#00009f"></span><br></div><div class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">    </span><span class="token tag attr-name" style="color:#00a4db">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f"> position</span><span class="token tag script language-javascript operator" style="color:#393A34">:</span><span class="token tag script language-javascript" style="color:#00009f"> </span><span class="token tag script language-javascript string" style="color:#e3116c">'absolute'</span><span class="token tag script language-javascript punctuation" style="color:#393A34">,</span><span class="token tag script language-javascript" style="color:#00009f"> inset</span><span class="token tag script language-javascript operator" style="color:#393A34">:</span><span class="token tag script language-javascript" style="color:#00009f"> </span><span class="token tag script language-javascript number" style="color:#36acaa">0</span><span class="token tag script language-javascript punctuation" style="color:#393A34">,</span><span class="token tag script language-javascript" style="color:#00009f"> justifyContent</span><span class="token tag script language-javascript operator" style="color:#393A34">:</span><span class="token tag script language-javascript" style="color:#00009f"> </span><span class="token tag script language-javascript string" style="color:#e3116c">'center'</span><span class="token tag script language-javascript" style="color:#00009f"> </span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag" style="color:#00009f"></span><br></div><div class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">  </span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">Text</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">role</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">heading</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text">Dialog</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag class-name" style="color:#00009f">Text</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">Pressable</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">role</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">button</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">onPress</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">close</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">Text</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text">Close</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag class-name" style="color:#00009f">Text</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag class-name" style="color:#00009f">Pressable</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">  </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag class-name" style="color:#00009f">View</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag class-name" style="color:#00009f">View</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_lN3R" id="result">Result<a href="https://frontend-dev-memo.vercel.app/field-notes/view-aria-modal#result" class="hash-link" aria-label="Direct link to Result" title="Direct link to Result" translate="no">​</a></h2>
<ul>
<li class=""><code>aria-modal</code>: swiping goes past "Close" to the background buttons, and
touching them focuses them.</li>
<li class=""><code>accessibilityViewIsModal</code>: focus stays inside the dialog.</li>
<li class="">The cause: <code>View</code> converts the other <code>aria-*</code> props to <code>accessibility*</code>, but
not <code>aria-modal</code>, and the native side reads only <code>accessibilityViewIsModal</code>.
<code>Pressable</code> and <code>Touchable*</code> do map it.</li>
<li class="">Not affected: Android has no modal prop at all, there the background is hidden
with <code>aria-hidden</code> (<code>importantForAccessibility="no-hide-descendants"</code>).</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_lN3R" id="upstream">Upstream<a href="https://frontend-dev-memo.vercel.app/field-notes/view-aria-modal#upstream" class="hash-link" aria-label="Direct link to Upstream" title="Direct link to Upstream" translate="no">​</a></h2>
<p><a href="https://github.com/react/react-native/pull/59328" target="_blank" rel="noopener noreferrer" class="">react/react-native#59328</a>
maps <code>aria-modal</code> to <code>accessibilityViewIsModal</code> in <code>View</code>. It landed in <code>main</code>
on 23 October 2026; on 27 October 2026 it is not in a release (0.88.1 does not
include it).</p>]]></content:encoded>
            <category>React Native</category>
            <category>Accessibility</category>
            <category>iOS</category>
        </item>
        <item>
            <title><![CDATA[A View Live Region With Only Layout Styles Is Flattened Away]]></title>
            <link>https://frontend-dev-memo.vercel.app/field-notes/view-live-region</link>
            <guid>https://frontend-dev-memo.vercel.app/field-notes/view-live-region</guid>
            <pubDate>Tue, 27 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[In React Native 0.88 Fabric removes a View that has aria-live or accessibilityLiveRegion and nothing that keeps it, so TalkBack never announces it]]></description>
            <content:encoded><![CDATA[<p>A <code>View</code> with <code>aria-live</code> or <code>accessibilityLiveRegion</code> and no style (or only
layout styles) is removed from the native tree by view flattening in React
Native 0.88, so the live region does not exist and TalkBack announces nothing.
<code>collapsable={false}</code> keeps the view and the live region works.</p>
<!-- -->
<ul>
<li class=""><strong>Checked:</strong> 21 October 2026</li>
<li class=""><strong>Versions:</strong> React Native 0.88.0, Expo SDK 58 (development build)</li>
<li class=""><strong>Devices:</strong> Samsung phone (SM-A276B), Android 16, TalkBack</li>
<li class=""><strong>Upstream:</strong>
<a href="https://github.com/react/react-native/issues/59329" target="_blank" rel="noopener noreferrer" class="">react/react-native#59329</a>,
fix <a href="https://github.com/react/react-native/pull/59335" target="_blank" rel="noopener noreferrer" class="">#59335</a>: landed in
<code>main</code></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_lN3R" id="how-it-was-checked">How It Was Checked<a href="https://frontend-dev-memo.vercel.app/field-notes/view-live-region#how-it-was-checked" class="hash-link" aria-label="Direct link to How It Was Checked" title="Direct link to How It Was Checked" translate="no">​</a></h2>
<p>The <code>announcements</code> case of <a href="https://github.com/faciledictu/memo-lab" target="_blank" rel="noopener noreferrer" class="">Memo Lab</a>:
counters in live regions, each changed by its own button; activate a button and
wait for the announcement. Later the
<a href="https://github.com/faciledictu/rn-live-region-repro" target="_blank" rel="noopener noreferrer" class="">reproducer</a> (plain React
Native CLI, counters that change by themselves) showed the same, and was used to
check the fix with React Native built from source.</p>
<div class="language-tsx codeBlockContainer_Bppz theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_oDf1"><pre tabindex="0" class="prism-code language-tsx codeBlock_OeUU thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_G7lF"><div class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token comment" style="color:#999988;font-style:italic">/* Silent: the View is flattened */</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">View</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">aria-live</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">polite</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">Text</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text">Cart: </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">count</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain-text"> items</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag class-name" style="color:#00009f">Text</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">  </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag class-name" style="color:#00009f">View</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token comment" style="color:#999988;font-style:italic">/* Announced */</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">View</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">aria-live</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">polite</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">collapsable</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript boolean" style="color:#36acaa">false</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">Text</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text">Cart: </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">count</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain-text"> items</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag class-name" style="color:#00009f">Text</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">  </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag class-name" style="color:#00009f">View</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_lN3R" id="result">Result<a href="https://frontend-dev-memo.vercel.app/field-notes/view-live-region#result" class="hash-link" aria-label="Direct link to Result" title="Direct link to Result" translate="no">​</a></h2>
<ul>
<li class="">Without <code>collapsable={false}</code> the counter is not announced, with it it is.
<code>View</code> converts <code>aria-live</code> to <code>accessibilityLiveRegion</code>, so a <code>View</code> with
<code>accessibilityLiveRegion</code> is flattened the same way (read from the code).</li>
<li class="">The cause: Fabric keeps a host view for <code>accessibilityViewIsModal</code>,
<code>accessibilityElementsHidden</code> and <code>importantForAccessibility</code>, but not for a
live region. A live region is announced without the view being <code>accessible</code>,
so it needs a view of its own.</li>
<li class="">A <code>View</code> with a background color, a border, <code>opacity</code>, a <code>transform</code>, <code>testID</code>
or <code>nativeID</code> is kept anyway, which is why a quick test often does not show
the problem. Layout styles such as <code>padding</code> or <code>flexDirection</code> do not keep
it.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_lN3R" id="upstream">Upstream<a href="https://frontend-dev-memo.vercel.app/field-notes/view-live-region#upstream" class="hash-link" aria-label="Direct link to Upstream" title="Direct link to Upstream" translate="no">​</a></h2>
<p><a href="https://github.com/react/react-native/pull/59335" target="_blank" rel="noopener noreferrer" class="">react/react-native#59335</a>
keeps a <code>View</code> that is a live region. It landed in <code>main</code> on 23 October 2026; on
27 October 2026 it is not in a release (0.88.1 does not include it).</p>]]></content:encoded>
            <category>React Native</category>
            <category>Accessibility</category>
            <category>Android</category>
        </item>
    </channel>
</rss>