From an app built on core-v2:
Scrolling (#3, #4, #14)
- Each recognizer locks onto a touch within its first 6px: along its axis
and direction it holds the touch, otherwise it lets go. A new
onTouchmove binding cancels native scrolling only while a recognizer
holds the touch, so hosts use touch-action: manipulation and one
vertical gesture no longer disables vertical scrolling. Several
gestures on one host share touches through the same rule.
- .from.scrollEdge(scroller, edge) admits drag-to-dismiss only while a
scroller is at the edge (#5).
Feel
- recognition.distance sets what counts as full progress: pixels, a CSS
length, or a measuring function (#6).
- Choreographies receive overshoot, the drag past either end of the
clamped progress, and the settling spring starts from it (#7).
- Velocity is the least-squares trend of the last 100ms (#8).
- Defaults retuned to commitThreshold 0.25 and commitVelocity 0.2; the
slide presets use them (#9).
- Choreographies may set spring stiffness and damping (#10).
Hooks and helpers
- .onArm()/.onDisarm() run during a drag when releasing would start or
stop committing (#12).
- startedIn, nearEdge, atScrollEdge, anyOf, allOf start predicates (#15).
- Development builds warn when an operation's first frame moves a node
that was visibly at rest, the one-frame "pop" of mismatched open and
close choreographies (#16).
Docs: scrolling, ignored elements, animation performance, haptics, and
operating-system edge gestures including CloseWatcher/popstate for PWAs
(#11, #17, #18).
Verification: a Chromium harness with emulated touch (verify/browser)
checks swipes over scrollers, native scrolling beside gestures,
scroll-edge dismissal, onCommit inside pointerup, and the continuity
warning. Reverting the earlier capture fix makes it fail exactly as
reported ("none of the handles work").
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Faarh2Ts6StJPcz2mRiHiR
- Only the host's own lostpointercapture cancels a gesture. Taking
capture makes the touched child lose its implicit touch capture, and
that bubbling event was cancelling every touch gesture immediately.
- A flick at least commitVelocity fast now decides by its direction:
backward cancels even past the distance threshold, forward commits.
Slower releases still decide by distance.
- Pointer-up finishes an already-begun operation without awaiting, so
onCommit runs inside the pointer-up event, where iOS still allows
haptics, audio, and clipboard writes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Faarh2Ts6StJPcz2mRiHiR
Tests no longer sit next to the implementation. They import the package
through ../src, the root tsconfig still type-checks them, and the
package build and declarations cover only src/.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Faarh2Ts6StJPcz2mRiHiR