From 8d6a5260c9febba7486d17b9422a9416b92982c2 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 8 Nov 2026 07:56:14 -0500 Subject: [PATCH 1/3] Mobile: screen reader structure (M25) Spoken labels, roles and states for buttons (symbol buttons named: Back, Forward, Settings, zoom), Mosaic tiles, canvas cards, minimap, timeline items, keyword chips, results, tab rows and address suggestions. Sheet titles and timeline sessions are headings; Timeline/Canvas/Replay are tabs. Gesture-only actions get screen-reader actions (next/previous trail, hide keyword, close tab). The capture note is announced (VoiceOver) and is a polite live region (TalkBack). Only mobile/ changes. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01X9wDmS5VvrWmyHhcWA9MoL --- mobile/App.js | 23 ++++++++++++++------- mobile/README.md | 1 + mobile/src/components/AddressSuggestions.js | 2 +- mobile/src/components/Button.js | 7 ++++++- mobile/src/components/Sheet.js | 2 +- mobile/src/components/SuggestionsSheet.js | 16 +++++++++++--- mobile/src/components/TabsSheet.js | 8 +++++-- mobile/src/components/TrailCanvas.js | 11 +++++++--- mobile/src/components/TrailHome.js | 22 ++++++++++++++++---- mobile/src/components/TrailTimeline.js | 5 ++++- 10 files changed, 73 insertions(+), 24 deletions(-) diff --git a/mobile/App.js b/mobile/App.js index cf70493..4dd3f21 100644 --- a/mobile/App.js +++ b/mobile/App.js @@ -2,7 +2,7 @@ // browser behind it keeps its tabs of WebViews, address bar, and the shared // suggestion engine from core/. import { useCallback, useEffect, useMemo, useRef, useState } from "react"; -import { ActivityIndicator, BackHandler, Keyboard, PanResponder, Platform, Pressable, Text, TextInput, View, useWindowDimensions } from "react-native"; +import { AccessibilityInfo, ActivityIndicator, BackHandler, Keyboard, PanResponder, Platform, Pressable, Text, TextInput, View, useWindowDimensions } from "react-native"; import { StatusBar } from "expo-status-bar"; import { SafeAreaProvider, SafeAreaView } from "react-native-safe-area-context"; @@ -217,6 +217,7 @@ function Browser({ services }) { // recorded as a capture card. No screen change; a note with Undo shows. const showToast = (t) => { clearTimeout(toastTimer.current); + AccessibilityInfo.announceForAccessibility?.(t.text); // VoiceOver reads the note; TalkBack uses the live region setToast(t); toastTimer.current = setTimeout(() => setToast(null), 6000); }; @@ -397,8 +398,8 @@ function Browser({ services }) { {/* Address bar, with suggestions from history and Wikipedia while typing */} -