or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

constants-utilities.mdindex.mdinput.mdmanager.mdrecognizers.md
tile.json

recognizers.mddocs/

Gesture Recognizers

Complete set of gesture recognizers for detecting touch patterns including tap, pan, swipe, pinch, rotation, and press gestures.

Capabilities

Base Recognizer

Base class for all gesture recognizers providing core recognition functionality.

/**
 * Base class for all gesture recognizers
 * @param {object} [options] - Recognizer configuration options
 */
class Recognizer {
  constructor(options);
  
  /** Update recognizer options */
  set(options);
  
  /** Allow simultaneous recognition with another recognizer */
  recognizeWith(otherRecognizer);
  
  /** Drop simultaneous recognition */
  dropRecognizeWith(otherRecognizer);
  
  /** Require another recognizer to fail first */
  requireFailure(otherRecognizer);
  
  /** Drop failure requirement */
  dropRequireFailure(otherRecognizer);
  
  /** Check if has failure requirements */
  hasRequireFailures();
  
  /** Check if can recognize simultaneously */
  canRecognizeWith(otherRecognizer);
  
  /** Emit gesture events */
  emit(input);
  
  /** Try to emit after checks */
  tryEmit(input);
  
  /** Check if can emit events */
  canEmit();
  
  /** Process input data */
  recognize(inputData);
  
  /** Reset recognizer state */
  reset();
}

Tap Recognizer

Recognizes tap and multi-tap gestures with configurable timing and position thresholds.

/**
 * Recognizes tap and multi-tap gestures
 * @param {object} [options] - Tap recognizer options
 */
class TapRecognizer extends Recognizer {
  constructor(options);
}

// Default options for tap recognizer
const TapDefaults = {
  event: 'tap',
  pointers: 1,
  taps: 1,
  interval: 300,
  time: 250,
  threshold: 9,
  posThreshold: 10
};

// Aliases
const Tap = TapRecognizer;

Usage Examples:

import Hammer from "hammerjs";

// Single tap
const singleTap = new Hammer.Tap();
mc.add(singleTap);

// Double tap
const doubleTap = new Hammer.Tap({
  event: 'doubletap',
  taps: 2
});
mc.add(doubleTap);

// Custom tap with longer timeout
const longTap = new Hammer.Tap({
  time: 500,
  threshold: 15
});
mc.add(longTap);

// Listen to tap events
mc.on('tap', function(ev) {
  console.log('Taps:', ev.tapCount);
});

Pan Recognizer

Recognizes pan/drag gestures with directional control and threshold settings.

/**
 * Recognizes pan/drag gestures
 * @param {object} [options] - Pan recognizer options
 */
class PanRecognizer extends AttrRecognizer {
  constructor(options);
}

// Default options for pan recognizer
const PanDefaults = {
  event: 'pan',
  threshold: 10,
  pointers: 1,
  direction: Hammer.DIRECTION_ALL
};

// Aliases
const Pan = PanRecognizer;

Usage Examples:

// Horizontal pan only
const horizontalPan = new Hammer.Pan({
  direction: Hammer.DIRECTION_HORIZONTAL
});
mc.add(horizontalPan);

// Vertical pan with custom threshold
const verticalPan = new Hammer.Pan({
  direction: Hammer.DIRECTION_VERTICAL,
  threshold: 20
});
mc.add(verticalPan);

// Listen to pan events
mc.on('panstart panmove panend', function(ev) {
  console.log('Pan:', ev.type, ev.deltaX, ev.deltaY, ev.direction);
});

// Directional pan events
mc.on('panleft panright panup pandown', function(ev) {
  console.log('Directional pan:', ev.type);
});

Swipe Recognizer

Recognizes swipe gestures with velocity and direction requirements.

/**
 * Recognizes swipe gestures with velocity
 * @param {object} [options] - Swipe recognizer options
 */
class SwipeRecognizer extends AttrRecognizer {
  constructor(options);
}

// Default options for swipe recognizer
const SwipeDefaults = {
  event: 'swipe',
  threshold: 10,
  velocity: 0.3,
  direction: Hammer.DIRECTION_HORIZONTAL | Hammer.DIRECTION_VERTICAL,
  pointers: 1
};

// Aliases
const Swipe = SwipeRecognizer;

Usage Examples:

// Horizontal swipe only
const horizontalSwipe = new Hammer.Swipe({
  direction: Hammer.DIRECTION_HORIZONTAL,
  velocity: 0.5
});
mc.add(horizontalSwipe);

// Custom swipe with higher velocity requirement
const fastSwipe = new Hammer.Swipe({
  velocity: 0.8,
  threshold: 20
});
mc.add(fastSwipe);

// Listen to swipe events
mc.on('swipe', function(ev) {
  console.log('Swipe:', ev.direction, ev.velocity);
});

// Directional swipe events
mc.on('swipeleft swiperight swipeup swipedown', function(ev) {
  console.log('Directional swipe:', ev.type);
});

Press Recognizer

Recognizes press and hold gestures with configurable hold time.

/**
 * Recognizes press and hold gestures
 * @param {object} [options] - Press recognizer options
 */
class PressRecognizer extends Recognizer {
  constructor(options);
}

// Default options for press recognizer
const PressDefaults = {
  event: 'press',
  pointers: 1,
  time: 251,
  threshold: 9
};

// Aliases
const Press = PressRecognizer;

Usage Examples:

// Long press with 1 second hold
const longPress = new Hammer.Press({
  time: 1000
});
mc.add(longPress);

// Sensitive press with smaller movement threshold
const sensitivePress = new Hammer.Press({
  threshold: 5,
  time: 200
});
mc.add(sensitivePress);

// Listen to press events
mc.on('press', function(ev) {
  console.log('Press started');
});

mc.on('pressup', function(ev) {
  console.log('Press ended');
});

Pinch Recognizer

Recognizes pinch/zoom gestures for multi-touch scaling interactions.

/**
 * Recognizes pinch/zoom gestures
 * @param {object} [options] - Pinch recognizer options
 */
class PinchRecognizer extends AttrRecognizer {
  constructor(options);
}

// Default options for pinch recognizer
const PinchDefaults = {
  event: 'pinch',
  threshold: 0,
  pointers: 2
};

// Aliases
const Pinch = PinchRecognizer;

Usage Examples:

// Basic pinch
const pinch = new Hammer.Pinch();
mc.add(pinch);

// Pinch with scale threshold
const thresholdPinch = new Hammer.Pinch({
  threshold: 0.1
});
mc.add(thresholdPinch);

// Listen to pinch events
mc.on('pinchstart pinchmove pinchend', function(ev) {
  console.log('Pinch:', ev.type, ev.scale, ev.rotation);
});

// Directional pinch events
mc.on('pinchin pinchout', function(ev) {
  console.log('Scale direction:', ev.type, ev.scale);
});

Rotate Recognizer

Recognizes rotation gestures for multi-touch rotation interactions.

/**
 * Recognizes rotation gestures
 * @param {object} [options] - Rotate recognizer options
 */
class RotateRecognizer extends AttrRecognizer {
  constructor(options);
}

// Default options for rotate recognizer
const RotateDefaults = {
  event: 'rotate',
  threshold: 0,
  pointers: 2
};

// Aliases
const Rotate = RotateRecognizer;

Usage Examples:

// Basic rotation
const rotate = new Hammer.Rotate();
mc.add(rotate);

// Rotation with angle threshold
const thresholdRotate = new Hammer.Rotate({
  threshold: 15  // Minimum 15 degrees
});
mc.add(thresholdRotate);

// Listen to rotate events
mc.on('rotatestart rotatemove rotateend', function(ev) {
  console.log('Rotate:', ev.type, ev.rotation);
});

Recognizer Relationships

Methods for defining relationships between recognizers.

/**
 * Set up recognizer relationships for complex gesture patterns
 */

// Simultaneous recognition
panRecognizer.recognizeWith(rotateRecognizer);

// Require failure (one must fail for other to succeed)
tapRecognizer.requireFailure(doubleTapRecognizer);

// Drop relationships
panRecognizer.dropRecognizeWith(rotateRecognizer);
tapRecognizer.dropRequireFailure(doubleTapRecognizer);

Usage Examples:

// Allow pan and rotate simultaneously
const pan = new Hammer.Pan();
const rotate = new Hammer.Rotate();
pan.recognizeWith(rotate);
mc.add([pan, rotate]);

// Single tap waits for double tap to fail
const singleTap = new Hammer.Tap({ event: 'singletap' });
const doubleTap = new Hammer.Tap({ event: 'doubletap', taps: 2 });
singleTap.requireFailure(doubleTap);
mc.add([singleTap, doubleTap]);

Types

interface RecognizerOptions {
  event?: string;
  pointers?: number;
  threshold?: number;
  time?: number;
  interval?: number;
  taps?: number;
  posThreshold?: number;
  velocity?: number;
  direction?: number;
  enable?: boolean;
}

interface AttrRecognizer extends Recognizer {
  attrTest(input): boolean;
  process(input): number;
}