The down-state inset is now 20pt on all three edges rather than the bottom
safe area, so the pill only changes width by 4pt per side on the way down.
The gradient is 12pt tall, just reaching the pill's bottom edge.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QoggCVt9XgpKbjrTZjoJD9
- Blend the bar's top border away from the pill's own visibility rather than
a per-screen border contribution. The latter was faded on a spring when a
screen was popped, so the border flashed back mid-pop between two screens
that both show the pill.
- Give the current label a small head start when picking the most present
screen, so the two cannot trade places repeatedly as they cross.
- Grow the up-state side inset to 16pt so the pill changes width less on its
way down to the safe-area inset.
- Add a half-strength tint to the clear glass.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QoggCVt9XgpKbjrTZjoJD9
Tapping back pops the route from JS, so react-native-screens swaps the
outgoing screen for a snapshot for the pop animation and it stops reporting
transition progress. The pill entry for that screen was then faded out on its
own spring, which ran ahead of the native pop, so the summed visibility dipped
below the glass threshold and the pill dissolved and re-materialized during
every pop between two pill screens. Swipe-back never showed it because the
screen stays mounted through the gesture.
Add a screen coverage registry to the presence system: the summed presence of
every mounted native-stack screen, which is exactly 1 at rest and while all
screens in a transition are still mounted. A pill entry that has left fills
in whatever coverage is missing, which is the incoming screen's complement,
so the total stays pinned at 1 between two pill screens and follows the real
transition when leaving for a screen without one. Its own spring remains as a
floor for a screen whose config switches off while still on screen.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QoggCVt9XgpKbjrTZjoJD9
- Draw the fade behind the pill as part of the bottom bar, from transparent
to the bar's background, so it meets the bar seamlessly and slides and
fades with it instead of travelling with the pill.
- Sit the pill almost on the bar, as the thread prompt did.
- Use the clear glass style without a tint.
- Drop the scale and the drop-while-fading motion; the pill now only
translates down into the bar's space, keeping its equal edge insets there.
- Sample each screen's presence directly in the registry instead of via a
mirrored shared value per screen. The mirrors updated a frame apart, so the
summed visibility dipped mid-transition between two screens that both show
the pill, which read as a jitter.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QoggCVt9XgpKbjrTZjoJD9
## Summary
- Remove the compose FAB, the new chat FAB, the "load latest" button and the
Discover/Following inline composer prompt. The new chat entry point still
needs a replacement.
- Add `features/composePrompt`: screens register a pill config (label,
accessibility text, an `open` callback) and the bottom bar renders a single
pill driven by that context. Registration follows the screen's presence, so
the pill fades in and out with pushes, pops and swipe-back, and the label
switches to whichever screen is most present mid-transition. The bar's top
border hides while a pill is registered.
- The pill is a Liquid Glass view with `isInteractive`, toggling its glass
style with the system animation as it comes and goes, with a gradient behind
it that fades further than the thread version so content shows through the
glass. It includes the camera and gallery buttons from the old feed prompt.
- When the bottom bar hides, the pill drops into the bar's space and scales
down, inset equally from the left, right and bottom edges so its corners sit
concentric with the device bevels; while the bar shows it hugs the edges.
- Home, Notifications, Feeds, custom feeds and lists open the composer; a
profile pre-fills a mention as the FAB did; a thread opens the reply
composer, including media picked from the pill.
## Test plan
- [ ] Home: pill above the bar; tap opens composer; camera/gallery open with media
- [ ] Home: scroll down hides the bar and the pill drops, shrinks and sits inset from the bevels; scroll up restores it
- [ ] Push a thread from Home: label crossfades to "Write your reply" mid-transition; tap opens the reply composer
- [ ] Thread with replies disabled: pill fades out on push and back in on pop
- [ ] Profile of another user: composer opens with their handle
- [ ] Search tab / Messages tab: pill fades out; pill fades back when returning
- [ ] Conversation screen: pill fades out while the bar slides away
- [ ] Android / iOS < 26: plain pill fallback fades in and out
- [ ] Mobile web: pill shows above the web bottom bar
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QoggCVt9XgpKbjrTZjoJD9
The header and bottom bar were being handed the same `withSpring()` animation
object. Animation objects carry their own state, so the second shared value
to receive it could stop partway, leaving the bar stuck half hidden after a
slow scroll on Home. Each shared value now gets its own animation.
Shell show/hide springs now share one config based on Reanimated 4's default
critically damped curve, with the perceptual duration shortened from 550ms to
400ms.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JWQciPDiipBhqiW922Nivs
## Summary
- Hook the bottom bar up to react-native-screens' transition progress. Every `Layout.Screen` now exposes a `presence` shared value (via `useScreenPresence`) that follows the native push/pop/swipe frame by frame, so screens with `minimalShell` hide and reveal the bar in sync with the transition instead of after it. Fixes the delayed tab bar when leaving a conversation.
- Replace the minimal-shell and hide-border refcounts with a small registry that sums 0..1 contributions on the UI thread. The bottom bar border now fades with the screen rather than toggling.
- Bring back the scroll-linked bottom bar on Home (removed in #5203). The header and footer share the same drag-linked value, and the bar is revealed on feed change, blur, and app foreground so badges aren't missed. Web included.
## Test plan
- [ ] Swipe back from a conversation: bar tracks the swipe, including a cancelled swipe
- [ ] Back button from a conversation: bar animates with the pop
- [ ] Push a profile over a conversation and pop back
- [ ] Post thread: bottom bar border fades in/out with the screen
- [ ] Home: scroll down hides header and bar together, scroll up shows them
- [ ] Home: scrolled down, swipe into a convo and back - no jump
- [ ] Home: bar reappears on feed switch, on leaving Home, and on foregrounding the app
- [ ] Deep link / notification into a conversation from another tab
- [ ] Mobile web: bar hides/shows on scroll and on conversation screen
- [ ] Rapid swipe-back and swipe-back while scrolling (software-mansion/react-native-reanimated#9402, software-mansion/react-native-screens#2659)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JWQciPDiipBhqiW922Nivs