Skip to content

Release v3.6.0#99

Draft
eds2002 wants to merge 29 commits into
mainfrom
release/v3.6
Draft

Release v3.6.0#99
eds2002 wants to merge 29 commits into
mainfrom
release/v3.6

Conversation

@eds2002
Copy link
Copy Markdown
Owner

@eds2002 eds2002 commented May 5, 2026

Summary

Draft release branch for the v3.6 line.

This branch has been refreshed with current main and is intentionally draft until the release contents are reviewed and conflicts/checks are resolved.

Notes

  • Base: main
  • Head: release/v3.6
  • Keep as draft while validating the v3.6 release line.

eds2002 added 12 commits April 26, 2026 18:56
Port the gesture runtime from next into the v3.6 shared module while keeping v3
compatibility shims in place.

Move the gesture implementation under providers/screen/gestures so pan, pinch,
activation, ownership, scroll coordination, policies, and runtime stores live behind
one screen-scoped boundary. Pan and pinch now keep stable recognizer identity and
read the latest runtime config from a stable shared runtime object. This lets
gesture direction, enabled state, and sensitivity change without rebuilding the detector.

Add pinch support to the shared gesture runtime, race pan and pinch recognizers,
coordinate Transition.ScrollView native gestures with owning gestures, and preserve
ancestor shadowing through explicit direction-claim registration. Restore component-stack
isolation boundaries and keep useScreenGesture() returning the legacy pan ref for v3 callers.

Backport next snap behavior with a v3-safe API shape: current.snapIndex is the
target/discrete snap index, current.animatedSnapIndex is the live fractional index,
and deprecated top-level snapIndex remains the v3 fractional alias. Programmatic
snapTo now chooses expand/collapse specs from current progress and uses SharedValue.get()
for auto snap resolution.

Preserve soft-deprecated v3 surfaces while adopting the new runtime. Deprecated
gesture aliases stay hydrated, flat interpolator return keys still normalize,
styleId="config" remains usable as a style slot, gestureReleaseVelocityMax keeps
capping release velocity, and DefaultSpec keeps Reanimated v3 restSpeedThreshold
while disabling overshoot clamping.

Add regression coverage for direction ownership, scroll coordination, multi-direction
snap gestures, snap transition spec selection, runtime config stripping, snap index
semantics, gesture velocity and sensitivity, and ancestor walking.

Verification:
- bun run typecheck
- bun run lint
- bun test packages/react-native-screen-transitions/src/shared/__tests__
- bun run build
Backport the cleaned next gesture runtime onto release/v3.6, including the
merged screen gesture config hook, dynamic interpolator options, stable runtime
sensitivity, and leaner gesture builder internals.

Keep v3 behavior compatible by default: disabled non-snap gestures do not track
or claim directions unless experimental_allowDisabledGestureTracking is enabled.
Snap point gestures continue to track when gestureEnabled is false, matching
existing v3 behavior.

Preserve v3.6-specific release velocity capping and transition-state shape
while adopting the next gesture module structure.

Add focused compatibility coverage, update interpolator option tests, add
nested/dynamic gesture e2e examples, and keep TypeScript 6 builds passing by
silencing the moduleResolution deprecation.

Verified with bun run lint, bun run typecheck, bun run build, focused gesture
tests, and the full shared test suite.
Wire expandViaScrollView through the shared sheet scroll behavior resolver.
This keeps the v3 alias effective while the canonical option remains sheetScrollGestureBehavior.

Mark gestureReleaseVelocityMax as deprecated on the v3 compatibility path.
It remains wired for v3 but is removed from the next gesture runtime.

Align small gesture helper/docs drift without changing gesture behavior.
Backport the next slot-style resolver behavior to v3.
Resolved slots now track emitted style and prop keys instead of only a few known fields.

When a key disappears, the resolver materializes a concrete reset value.
This avoids stale animated style or prop values sticking around across frames.

Add regression coverage for style and prop reset materialization.
Remove the maskEnabled compatibility alias from the v3 public type surface.
navigationMaskEnabled is the supported mask option for the current line.

Drop the unused resolver and tests for maskEnabled so docs, types, and runtime behavior agree.
Keep the root and package READMEs as compact package landing pages.
Point setup, examples, and API reference to the public docs site.

Document the current v3 support line for Reanimated v3/v4 and RNGH v2.
Keep navigation zoom presenting the last measured grouped tag while a newly
active group member is still missing source bounds.

This prevents mask and content styles from collapsing during paged grouped zoom
flows where the active id can change before the new boundary pair is ready.

Move zoom helpers out of build.ts so the presented-tag fallback can share the
same worklet-safe helpers, and add regression coverage for retargeting to an
unmeasured group member.
Remove the TypeScript 6 deprecation suppression from the v3.6 package
config because this branch is pinned to TypeScript 5.8, where the value is
invalid.

Wrap scroll gesture shared-value mutation in a typed helper so the current
Reanimated SharedValue.modify signature accepts the state update callbacks.
This keeps bun run typecheck green after the gesture backport.
Replace the reaction-built frame snapshot with a persistent shared frame
that is hydrated in place from the current transition states.

The derived version signal gives downstream worklets a scalar invalidation
source while preserving stable object identity for the frame graph.

This also moves snap-index derivation and optional content layout hydration
onto persistent slots, so interpolators read live focus, neighbor, and
layout state without rebuilding the frame object each tick.
…-transitions into release/v3.6

# Conflicts:
#	packages/react-native-screen-transitions/src/shared/utils/bounds/zoom/build.ts
@netlify
Copy link
Copy Markdown

netlify Bot commented May 5, 2026

Deploy Preview for rnst-docs canceled.

Name Link
🔨 Latest commit 93fc51f
🔍 Latest deploy log https://app.netlify.com/projects/rnst-docs/deploys/6a04e1f6452dd400084ad1c0

eds2002 added 17 commits May 6, 2026 02:40
Rework runtime screen options to use a single shared snapshot object.

Gesture worklets now read the latest screen option snapshot directly.

This avoids passing nested shared values through gesture builders.

Add gesture as the canonical active gesture field.

Deprecate direction as a pan-only compatibility field.

Pan gestures write both gesture and legacy direction.

Pinch gestures write pinch-in or pinch-out to gesture.

Transition hydration, reset paths, snap behavior, and zoom presets prefer gesture.

Tighten gesture direction helpers to stay worklet-safe.

Update tests for interpolator options, snap behavior, hydration, and velocity.

Verified with bun run typecheck.

Verified with bun run lint.

Verified with bun test packages/react-native-screen-transitions/src/shared/__tests__.
Add the container reveal bounds preset, refreshed docs, and dynamic e2e examples.

Stabilize shared-bound measurement and link resolution for nested/group flows.

Normalize overscrolled measurements, detach close-time scroll listeners, and model gesture settling.
Rework boundary measurement so source and destination capture only handle initial links.

Refresh existing bounds only after coherent source and destination links are available.

Keep grouped bounds bare while tracking the active id and the id that started a link.

Expose coherent link handles with initialSource, initialDestination, and link.compute().

Use selected links inside reveal and zoom so derived styles do not re-resolve live state.

Consolidate shared navigation geometry math and trim duplicate reveal and zoom helpers.

Fix gesture lifecycle state so no-op pan releases do not leave animating stuck on.

Clear gesture settling from actual resting values instead of an animateMany callback latch.

Keep logicallySettled false while gesture translations or pinch scale are still resetting.

Apply Boundary.Target prepared styles when a nested target drives measurement.

Keep focused reveal target opacity explicit for the public style contract.

Update bounds examples to cover style-id list targets and simplify zoom demo stress cases.
Remove ancestor and navigator-key matching from the bounds store.

Bounds now match and clean up by concrete screen keys only.

Add transition({ depth }) for ancestor and descendant transition scopes.

Keep useScreenAnimation compatible with its shipped ancestor targets.

Expose bounds and transition accessors outside the animation pipeline.

Add nested transition-scope examples, including a third-level route.

Guard initial destination blocking on an attachable source link.

Update bounds, transition, cleanup, and public API type tests.
Remove unused shared debounce and scroll-settle modules so they no longer ship.

Clean package output before builds and exclude typecheck/test folders from packs.

Collapse duplicate constants and type aliases, and rename gesture-local empty claims.

Keep runtime option helpers private to their module.

Includes the current reveal handoff and style-id spring tuning already in the tree.
Squash merge the better animation state work into release/v3.6.

Modularize transition hydration around progress, settle, and snap state rules.

Scope interpolator runtime options to the selected current or next route.

Preserve freeform dismiss displacement and avoid stale close lifecycle state.

Refine reveal gesture handoff, mask collapse, and style-id alpha behavior.

Reduce baseline animated mapper work for mask, surface, and backdrop layers.

Add focused unit coverage for gesture lifecycle, reveal, and transition state rules.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant