Fluid Interaction Review
Use this only for direct-manipulation surfaces. It complements motion-review-gate; it is not a general visual-style or Apple-look preset.
Best Fit
- drawers, sheets, swipe actions, carousels, sliders, scrubbers, and draggable panels;
- gesture code using Pointer Events, Motion, Framer Motion, or a library with equivalent primitives;
- reviews where a transition looks acceptable after release but feels disconnected during manipulation.
Do Not Use For
- ordinary buttons, forms, tables, or static marketing sections;
- adding glass, bounce, sound, or haptics as decoration;
- replacing stable library behavior without a reproduced interaction defect;
- imposing universal spring constants or visual styling.
Interaction Contract
- Continuous tracking — while dragging or swiping, the surface follows the pointer 1:1. Preserve the offset from the point where the user grabbed it; do not jump to the element center.
- Pointer ownership — use Pointer Events and
setPointerCapture(pointerId) when implementing custom gestures so tracking survives leaving the element bounds. Release or cancel capture cleanly.
- Interruptibility — a moving surface can be grabbed and redirected immediately. Retarget from the current on-screen value and current velocity, not from a stale logical target. Never lock input until an animation finishes.
- Velocity handoff — sample a short, timestamped movement history and pass release velocity into the settling spring. Guard zero distance, sparse events, and extreme velocity.
- Momentum projection — when a flick can cross snap points, select the destination from a bounded projection of release velocity, then settle with the handed-off velocity. Do not choose solely from release position.
- Hysteresis — keep the gesture undecided until movement exceeds a small, input-appropriate threshold. Resolve axis and intent before suppressing native scrolling or committing an action.
- Soft boundaries — beyond a real bound, apply progressively increasing resistance. Do not hard-stop while the pointer is still moving. Clamp the final resting state to a valid target.
- Spatial continuity — enter and exit use the same spatial path unless product meaning requires otherwise. Popovers and panels originate from their trigger or manipulation source; reversible motion preserves direction and velocity continuity.
Prefer a mature interaction library when it already satisfies the contract. Custom physics requires focused tests and browser evidence.
Accessibility Fallbacks
Treat these as independent modes; test combinations, not only each mode alone:
prefers-reduced-motion: reduce: remove momentum, elastic overshoot, parallax, and large spatial travel; retain state feedback through static change or a short non-spatial fade;
prefers-reduced-transparency: reduce: replace translucent surfaces with a sufficiently opaque or solid surface when the browser supports the query; keep a solid default/fallback where it does not;
prefers-contrast: more: strengthen surface separation, focus indication, controls, and text contrast without depending on blur or transparency.
Pointer behavior must retain keyboard, focus, click/tap, cancellation, and native-scroll semantics. Visual press feedback may start on pointer-down; destructive or committed actions still follow the component's accessible activation contract.
Review Procedure
- Identify the gesture state machine: idle, possible, active, settling, cancelled.
- Trace pointer position, grab offset, timestamps, velocity, projected target, and bounds.
- Interrupt the interaction during settling and reverse direction.
- Test slow drag, fast flick, boundary overshoot, pointer cancellation, axis ambiguity, and repeated rapid input.
- Test mouse/touch or faithful emulation, keyboard operation, native scrolling, and the three fallback modes.
- Run
motion-review-gate for general purpose, frequency, timing, GPU-property, and reduced-motion checks.
Required Evidence
- browser and route/component tested;
- input modes tested;
- current-value interruption and reversal result;
- velocity/projection and boundary result;
- keyboard, focus, cancellation, and native-scroll result;
- reduced motion, transparency, and contrast result, including unsupported-query fallback;
- targeted automated tests, or an explicit reason they are not practical.
Source inspection or a successful build alone is insufficient interaction evidence.
Output
Return findings first:
| Severity |
Evidence |
Contract breach |
Smallest fix |
| block / high / medium / low |
file:line plus observed behavior |
named rule |
bounded correction |
Then include:
- Decision:
Block, Needs changes, or Approve.
- Interaction evidence: tested gesture and fallback matrix.
- Unverified: any input, browser, accessibility mode, or device not tested.
Attribution
Adapted from Emil Kowalski's MIT-licensed apple-design skill, chiefly its direct-manipulation, interruptibility, velocity, momentum, hysteresis, resistance, spatial-consistency, and accessibility guidance. Re-shaped into a bounded ABVX web-interaction contract; it does not adopt Apple visual styling or universal physics constants.
1---2name: fluid-interaction-review3description: Build or review gesture-driven web interactions such as drag, swipe, sheets, carousels, and draggable panels. Use when pointer tracking, interruption, velocity handoff, momentum projection, hysteresis, rubber-banding, spatial continuity, or motion/transparency/contrast fallbacks materially affect the interaction.4license: MIT5---67# Fluid Interaction Review89Use this only for direct-manipulation surfaces. It complements `motion-review-gate`; it is not a general visual-style or Apple-look preset.1011## Best Fit1213- drawers, sheets, swipe actions, carousels, sliders, scrubbers, and draggable panels;14- gesture code using Pointer Events, Motion, Framer Motion, or a library with equivalent primitives;15- reviews where a transition looks acceptable after release but feels disconnected during manipulation.1617## Do Not Use For1819- ordinary buttons, forms, tables, or static marketing sections;20- adding glass, bounce, sound, or haptics as decoration;21- replacing stable library behavior without a reproduced interaction defect;22- imposing universal spring constants or visual styling.2324## Interaction Contract25261. **Continuous tracking** — while dragging or swiping, the surface follows the pointer 1:1. Preserve the offset from the point where the user grabbed it; do not jump to the element center.272. **Pointer ownership** — use Pointer Events and `setPointerCapture(pointerId)` when implementing custom gestures so tracking survives leaving the element bounds. Release or cancel capture cleanly.283. **Interruptibility** — a moving surface can be grabbed and redirected immediately. Retarget from the current on-screen value and current velocity, not from a stale logical target. Never lock input until an animation finishes.294. **Velocity handoff** — sample a short, timestamped movement history and pass release velocity into the settling spring. Guard zero distance, sparse events, and extreme velocity.305. **Momentum projection** — when a flick can cross snap points, select the destination from a bounded projection of release velocity, then settle with the handed-off velocity. Do not choose solely from release position.316. **Hysteresis** — keep the gesture undecided until movement exceeds a small, input-appropriate threshold. Resolve axis and intent before suppressing native scrolling or committing an action.327. **Soft boundaries** — beyond a real bound, apply progressively increasing resistance. Do not hard-stop while the pointer is still moving. Clamp the final resting state to a valid target.338. **Spatial continuity** — enter and exit use the same spatial path unless product meaning requires otherwise. Popovers and panels originate from their trigger or manipulation source; reversible motion preserves direction and velocity continuity.3435Prefer a mature interaction library when it already satisfies the contract. Custom physics requires focused tests and browser evidence.3637## Accessibility Fallbacks3839Treat these as independent modes; test combinations, not only each mode alone:4041- `prefers-reduced-motion: reduce`: remove momentum, elastic overshoot, parallax, and large spatial travel; retain state feedback through static change or a short non-spatial fade;42- `prefers-reduced-transparency: reduce`: replace translucent surfaces with a sufficiently opaque or solid surface when the browser supports the query; keep a solid default/fallback where it does not;43- `prefers-contrast: more`: strengthen surface separation, focus indication, controls, and text contrast without depending on blur or transparency.4445Pointer behavior must retain keyboard, focus, click/tap, cancellation, and native-scroll semantics. Visual press feedback may start on pointer-down; destructive or committed actions still follow the component's accessible activation contract.4647## Review Procedure48491. Identify the gesture state machine: idle, possible, active, settling, cancelled.502. Trace pointer position, grab offset, timestamps, velocity, projected target, and bounds.513. Interrupt the interaction during settling and reverse direction.524. Test slow drag, fast flick, boundary overshoot, pointer cancellation, axis ambiguity, and repeated rapid input.535. Test mouse/touch or faithful emulation, keyboard operation, native scrolling, and the three fallback modes.546. Run `motion-review-gate` for general purpose, frequency, timing, GPU-property, and reduced-motion checks.5556## Required Evidence5758- browser and route/component tested;59- input modes tested;60- current-value interruption and reversal result;61- velocity/projection and boundary result;62- keyboard, focus, cancellation, and native-scroll result;63- reduced motion, transparency, and contrast result, including unsupported-query fallback;64- targeted automated tests, or an explicit reason they are not practical.6566Source inspection or a successful build alone is insufficient interaction evidence.6768## Output6970Return findings first:7172| Severity | Evidence | Contract breach | Smallest fix |73| --- | --- | --- | --- |74| block / high / medium / low | `file:line` plus observed behavior | named rule | bounded correction |7576Then include:7778- **Decision:** `Block`, `Needs changes`, or `Approve`.79- **Interaction evidence:** tested gesture and fallback matrix.80- **Unverified:** any input, browser, accessibility mode, or device not tested.8182## Attribution8384Adapted from Emil Kowalski's MIT-licensed `apple-design` skill, chiefly its direct-manipulation, interruptibility, velocity, momentum, hysteresis, resistance, spatial-consistency, and accessibility guidance. Re-shaped into a bounded ABVX web-interaction contract; it does not adopt Apple visual styling or universal physics constants.