Skip to content

v-long-press

Detect long press gestures on elements.

Since: 1.1.0

Usage

Basic

vue
<template>
  <button v-long-press="handleLongPress">Long Press Me</button>
</template>

<script setup>
function handleLongPress(event) {
  console.log('Long press triggered!')
}
</script>

With Options

vue
<template>
  <button v-long-press="{
    handler: handleLongPress,
    duration: 1000,
    onStart: handleStart,
    onCancel: handleCancel
  }">
    1 Second Press
  </button>
</template>

<script setup>
function handleLongPress(event) {
  console.log('Long press triggered!')
}

function handleStart(event) {
  console.log('Press started')
}

function handleCancel(event) {
  console.log('Press canceled')
}
</script>

API

Types

typescript
type LongPressHandler = (event: MouseEvent | TouchEvent) => void

interface LongPressOptions {
  /** Callback when long press is triggered */
  handler: LongPressHandler
  /** Duration in milliseconds */
  duration?: number
  /** Disable the directive */
  disabled?: boolean
  /** Maximum movement before canceling */
  distance?: number
  /** Callback when press starts */
  onStart?: (event: MouseEvent | TouchEvent) => void
  /** Callback when press is canceled */
  onCancel?: (event: MouseEvent | TouchEvent) => void
  /** Callback during press (for progress) */
  onTick?: (remaining: number) => void
  /** Interval for onTick callback */
  tickInterval?: number
  /** Prevent default behavior */
  prevent?: boolean
  /** Stop event propagation */
  stop?: boolean
}

type LongPressBinding = LongPressHandler | LongPressOptions

Options

OptionTypeDefaultDescription
handlerFunction-Callback when long press triggers (required)
durationnumber500Duration in milliseconds
distancenumber10Max movement before canceling
disabledbooleanfalseDisable the directive
preventbooleantruePrevent default behavior
stopbooleanfalseStop event propagation
onStartFunction-Callback when press starts
onCancelFunction-Callback when press is canceled
onTickFunction-Callback during press
tickIntervalnumber100Interval for onTick callback

Examples

Context Menu

vue
<template>
  <div
    v-long-press="showContextMenu"
    class="item"
  >
    Long press for options
  </div>
</template>

<script setup>
function showContextMenu(event) {
  // Show context menu at event position
  console.log('Show menu at:', event.clientX, event.clientY)
}
</script>

Progress Indicator

vue
<template>
  <button v-long-press="{
    handler: deleteItem,
    duration: 2000,
    onTick: updateProgress
  }">
    Hold to delete ({{ progress }}%)
  </button>
</template>

<script setup>
import { ref } from 'vue'

const progress = ref(0)

function updateProgress(remaining) {
  progress.value = Math.round((2000 - remaining) / 2000 * 100)
}

function deleteItem() {
  progress.value = 0
  console.log('Item deleted!')
}
</script>

Composable API

For programmatic use, you can use the useLongPress composable:

typescript
import { useLongPress } from 'directix'

const { isPressing, start, stop, bind } = useLongPress({
  duration: 500,
  distance: 10,
  onStart: (event) => console.log('Press started'),
  onTrigger: (event) => console.log('Long press triggered!'),
  onCancel: (event) => console.log('Press canceled'),
  onTick: (remaining) => console.log('Remaining:', remaining),
  tickInterval: 100,
  prevent: true
})

// Bind to element
onMounted(() => {
  const unbind = bind(buttonRef.value)
  onUnmounted(unbind)
})

UseLongPressOptions

OptionTypeDefaultDescription
durationnumber | Ref<number>500Duration in milliseconds to trigger
distancenumber | Ref<number>10Maximum movement before canceling
onStart(event: MouseEvent | TouchEvent) => void-Callback when press starts
onTrigger(event: MouseEvent | TouchEvent) => void-Callback when long press triggers
onCancel(event: MouseEvent | TouchEvent) => void-Callback when press is canceled
onTick(remaining: number) => void-Callback during press
tickIntervalnumber100Interval for onTick callback
preventbooleantruePrevent default behavior

UseLongPressReturn

PropertyTypeDescription
isPressingReadonly<Ref<boolean>>Whether a long press is in progress
start(event: MouseEvent | TouchEvent) => voidStart long press detection
stop(event: MouseEvent | TouchEvent) => voidStop long press detection
bind(element: HTMLElement) => () => voidBind long press detection to an element

Example

vue
<script setup>
import { ref } from 'vue'
import { useLongPress } from 'directix'

const buttonRef = ref(null)
const { isPressing, bind } = useLongPress({
  onTrigger: (event) => {
    console.log('Long press triggered!')
  },
  duration: 800
})

onMounted(() => bind(buttonRef.value))
</script>

<template>
  <button ref="buttonRef" :class="{ pressing: isPressing }">
    Long Press Me
  </button>
</template>

Code Generator

Quick Code Generator
<template>
  <div v-long-press="{ duration: 500, disabled: false }">
    <!-- Detect long press gestures on elements. directive -->
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue'

// Configure your options here
const options = { duration: 500, disabled: false }
</script>

Released under the MIT License.