Gestures

Reference for touch, pointer, and haptic interaction patterns across iOS, macOS, and web. Use these gestures as building blocks for consistent, platform-appropriate behavior.

The gesture taxonomy

Gestures are the primary input for touch and spatial interfaces. Sitka defines gesture semantics that map to native platform APIs while degrading gracefully to the web. Each gesture has clear recognition thresholds, haptic feedback profiles, and platform-specific mapping.

Tap

Brief touch contact, single point. Used for selection, activation, and precise interaction.

●●

Double Tap

Two quick successive taps. Used for zoom, favorite, or alternate action.

Long Press

Press and hold for 500ms+. Triggers context menus, drag initiation, or haptic confirmation.

Swipe

Quick horizontal or vertical flick. Used for navigation, dismissal, or reveal actions.

Pan / Drag

Continuous tracking of finger movement. Used for scrolling, repositioning, and drawing.

Pinch

Two-finger scale gesture. Used for zoom in/out in maps, galleries, document viewers.

Rotate

Two-finger rotation. Used for image rotation, compass, map orientation.

Force Touch / 3D Touch

Pressure-sensitive interaction. Peek (light) and Pop (deep) on iOS; Force Click on macOS.

Gesture reference

Tap

UITapGestureRecognizer

iOS

UITapGestureRecognizer
hapticUIFeedbackStyle.light
velocityN/A
thresholdTouch up inside

macOS

NSClickGestureRecognizer
hapticNSHapticFeedbackPattern.generic
velocityN/A
thresholdMouse up inside

Web

eventclick / touchend
hapticNavigator.vibrate(8) for light
thresholdPointer down/up within 8px tolerance

Usage guidance

  • Use for buttons, links, toggles, and single-selection controls
  • Minimum target size 44×44 pt (iOS HIG)
  • Double-tap rate limit is 0.3s between taps
  • Avoid nesting tappable elements

Quick reference

HapticUIFeedbackStyle.light
VelocityN/A
ThresholdTouch up inside
Related tokens
UIFeedbackStyle.ligh...N/ATouch up inside

Double Tap

UITapGestureRecognizer (numberOfTapsRequired = 2)

iOS

UITapGestureRecognizer (numberOfTapsRequired = 2)
hapticUIImpactFeedbackStyle.medium
velocityN/A
thresholdTwo tap events within 300ms

macOS

NSClickGestureRecognizer ( numberOfClicksRequired = 2)
hapticNone
velocityN/A
thresholdTwo click events within 300ms

Web

eventCustom via click/touch timing
hapticNavigator.vibrate(15)
thresholdTwo clicks within 300ms

Usage guidance

  • Should not conflict with scroll gesture
  • Provide visual feedback on first tap
  • Disable on form controls to prevent accidental double-submit
  • iOS Maps zoom, Photos favorite are canonical examples

Quick reference

HapticUIImpactFeedbackStyle.medium
VelocityN/A
ThresholdTwo tap events within 300ms
Related tokens
UIImpactFeedbackStyl...N/ATwo tap events withi...

Long Press

UILongPressGestureRecognizer

iOS

UILongPressGestureRecognizer
hapticUIImpactFeedbackStyle.heavy
velocityN/A
threshold0.5s minimum press duration

macOS

NSPressGestureRecognizer
hapticNSHapticFeedbackPattern.generic
velocityN/A
threshold0.5s minimum press duration

Web

eventtouchstart / mousedown + timer
hapticNavigator.vibrate(50) on recognition
threshold500ms hold, optional movement tolerance 10px

Usage guidance

  • Provides haptic confirmation on recognition
  • Shows contextual menu or drag handle after recognition
  • Allow 10px movement tolerance to avoid canceling slight shifts
  • Disambiguation: differentiate from force touch on capable devices

Quick reference

HapticUIImpactFeedbackStyle.heavy
VelocityN/A
Threshold0.5s minimum press duration
Related tokens
UIImpactFeedbackStyl...N/A0.5s minimum press d...

Swipe

UISwipeGestureRecognizer

iOS

UISwipeGestureRecognizer
hapticUISelectionFeedbackGenerator for edge swipe
velocity800px/s minimum
threshold30px translation

macOS

NSPanGestureRecognizer with velocity tracking
hapticNone
velocityPoints/s equivalent
thresholdVelocity threshold + minimum translation

Web

eventpointermove with velocity tracking
hapticNone typically
thresholdVelocity > 0.5px/ms OR translation > 50px

Usage guidance

  • Direction matters: left/right for deck navigation, up/down for dismiss
  • iOS swipe-to-delete/archive pattern (~75% screen width swipe)
  • Should feel decisive — rapid acceleration, not dragging
  • Show arrow/chevron hints for discoverability

Quick reference

HapticUISelectionFeedbackGenerator for edge swipe
Velocity800px/s minimum
Threshold30px translation
Related tokens
UISelectionFeedbackG...800px/s minimum30px translation

Pan / Drag

UIPanGestureRecognizer

iOS

UIPanGestureRecognizer
hapticOptional tick feedback on grid alignment
velocityN/A
threshold3–5px minimum translation before began

macOS

NSPanGestureRecognizer
hapticNone
velocityN/A
threshold3–5pt minimum translation

Web

eventpointerdown + pointermove
hapticOptional on alignment
threshold3px before drag begins

Usage guidance

  • Uses inertia/flick for deceleration ending (native scroll)
  • Should maintain 1:1 touch fidelity (no lag)
  • Boundary bounces and rubber-banding for overscroll
  • Disable text selection during drag on interactive elements

Quick reference

HapticOptional tick feedback on grid alignment
VelocityN/A
Threshold3–5px minimum translation before began
Related tokens
Optional tick feedba...N/A3–5px minimum transl...

Pinch

UIPinchGestureRecognizer

iOS

UIPinchGestureRecognizer
hapticNone by default; optional on scale thresholds
velocityN/A
thresholdScale factor 1.0 baseline

macOS

NSPinchGestureRecognizer
hapticNone
velocityN/A
thresholdScale 1.0 baseline

Web

eventgesturestart / gesturechange / gestureend (touch)
hapticNone
thresholdTrack scale relative to initial distance

Usage guidance

  • Scale factor typically clamped 0.5x–3x
  • Pinch center point tracks focal point for zoom origin
  • Provide double-tap to zoom alternative
  • Sync with semantic zoom levels (e.g., 100%, 150%, 200%)

Quick reference

HapticNone by default; optional on scale thresholds
VelocityN/A
ThresholdScale factor 1.0 baseline
Related tokens
None by default; opt...N/AScale factor 1.0 bas...

Rotate

UIRotationGestureRecognizer

iOS

UIRotationGestureRecognizer
hapticNone
velocityN/A
thresholdRotation in radians from start angle

macOS

NSRotationGestureRecognizer
hapticNone
velocityN/A
thresholdRadians from start

Web

eventgesturestart / gesturechange (rotate)
hapticNone
thresholdAngle delta from initial touch down

Usage guidance

  • Often combined with pinch for freeform transform tools
  • Provide 0°, 90°, 180°, 270° snap points for precision tools
  • Display rotation value as overlay during gesture
  • Can conflict with pinch — prefer combined gesture recognizer delegate

Quick reference

HapticNone
VelocityN/A
ThresholdRotation in radians from start angle
Related tokens
NoneN/ARotation in radians ...

Force Touch / 3D Touch

UIForceTouchGestureRecognizer / traitCollection.forceTouchCapability

iOS

UIForceTouchGestureRecognizer / traitCollection.forceTouchCapability
hapticUIFeedbackStyle.medium (peek), .heavy (pop)
velocityN/A
thresholdPeek at 0.5 force, Pop at 1.0+ (device-dependent)

macOS

NSPressureGestureRecognizer / trackpad force click
hapticTaptic Engine feedback
velocityN/A
thresholdForce > 1.0 (trackpad click depth)

Web

eventpointerdown with pressure property (webkit)
hapticNone
thresholdpressure >= 0.5 (normalized 0–1)

Usage guidance

  • Peek shows preview; Pop commits action
  • Provide alternative long-press for devices without pressure sensitivity
  • Disable on accessibility zoom areas
  • Deprecated in iOS 13+ in favor of context menus, but still relevant for macOS trackpad

Quick reference

HapticUIFeedbackStyle.medium (peek), .heavy (pop)
VelocityN/A
ThresholdPeek at 0.5 force, Pop at 1.0+ (device-dependent)
Related tokens
UIFeedbackStyle.medi...N/APeek at 0.5 force, P...

Haptic feedback taxonomy

Sitka defines three haptic categories that map to device Taptic Engine capabilities. Use them consistently to create a coherent tactile language.

Impact

Physical-like collisions and taps

  • lightLight taps, selection changes
  • mediumStandard actions, button press
  • heavyDestructive actions, confirmations

Notification

Event-driven signals

  • successTask completed, save confirmed
  • warningNon-critical issue, attention needed
  • errorFailed action, validation error

Selection

Continuous feedback during manipulation

  • clickPicker wheel selection
  • pickItem chosen from list

Implementation

// iOS Swift: UIImpactFeedbackGenerator for tap
let generator = UIImpactFeedbackGenerator(style: .medium)
generator.prepare()
generator.impactOccurred()

// Web: Navigator.vibrate for tactile feedback
element.addEventListener("click", () => {
  navigator.vibrate?.(15)  // Light tap
})

// React Native: React Native Haptics
import * as Haptics from 'expo-haptics';
Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium);