fix(mobile): frequency carousel arrows outside the card + surface chat voice errors - #176
Conversation
…h errors - Frequency carousel: move the prev/next arrows out of the card into a flex row that flanks it, so they no longer overlap the card content. The disabled end-state dims the arrow instead of hiding it (no layout shift). - Chat voice: surface every speech-recognition error, not just mic-denied. Non-permission errors (no-speech, language-not-supported, service errors) were computed in the hook but never rendered, so a failing recognizer looked like a silent no-op. Now matches web, which already routes speech errors to the notice area. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
There was a problem hiding this comment.
Two clean bugfixes. The frequency carousel refactor correctly moves the arrows out of absolute-overlay position and into a flanking flex row, with the onLayout handler migrated to the ScrollView so pageWidth measures the scrollable area (not the full container including arrows) — slides now size to the right width. Dimming arrows at the boundary (0.3 opacity) rather than hiding them is the right call for the flex-row layout: no layout shift, but the affordance stays visible. On the chat side, the generic speechError text block is properly inserted above the micDenied-specific settings button, so all speech error variants (no-speech, network, language-not-supported) now surface to the user — matching web, which already routes speechError → sendError. Removed styles (frequencyArrowHidden, frequencyArrowRow, frequencyCarousel) have zero remaining references.
|
…th mobile) (#177) The web frequency carousel positioned its prev/next arrows absolutely over the card (absolute left-1 / right-1), so they overlapped the card's icon and text. Restructure into a flex row that flanks the card: [arrow][scroll track flex-1][arrow]. Arrows are now flex siblings — they cannot overlap the card. Disabled end-state dims the arrow (opacity-30) instead of hiding it, matching the mobile carousel fixed in #176. End state: both platforms use the identical flanking layout. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>



Follow-up to #175 (the UX/QA batch), from on-device testing.
Frequency carousel — arrows were overlapping the card
The prev/next arrows were absolutely positioned over the card, so they sat on top of the card's icon and text. Moved them into a flex row that flanks the card (
‹ [card] ›); the card shrinks to fit between them. The disabled end-state now dims the arrow instead of hiding it, so there's no layout shift at the first/last card.Chat voice — failures were silent
The chat surfaced speech-recognition errors only for the mic-denied case; every other error (
no-speech,language-not-supported, service /networkerrors) was computed in the hook but never rendered. So when the device recognizer started but produced no transcript, it looked like a silent no-op. Now all speech errors render in the notice area, matching web (which already routes them throughsendError).Note: this surfaces why recognition fails on a given device; it doesn't change the recognizer. The underlying "starts but emits no result" behavior is device/OS-level and needs the now-visible error text (or logcat) to pin down the root cause.
Verification
🤖 Generated with Claude Code