{"version":3,"sources":["../../../../src/sensors/useMousePressed/core.ts"],"sourcesContent":["import { observable } from \"@legendapp/state\";\nimport type { DeepMaybeObservable, ReadonlyObservable } from \"@usels/core\";\nimport { peek } from \"@usels/core\";\nimport { type ConfigurableWindow, defaultWindow } from \"@shared/configurable\";\nimport type { MaybeEventTarget } from \"../../types\";\nimport { createEventListener } from \"../../browser/useEventListener/core\";\n\nexport type UseMousePressedSourceType = \"mouse\" | \"touch\" | null;\n\nexport interface UseMousePressedOptions extends ConfigurableWindow {\n  /** Track touch events. Default: true */\n  touch?: boolean;\n  /** Event target for press detection. Default: window */\n  target?: MaybeEventTarget;\n  /** Prevent drag — calls preventDefault on pointerdown. Default: false */\n  preventDragEvent?: boolean;\n  /** Callback fired on press */\n  onPressed?: (e: PointerEvent | TouchEvent) => void;\n  /** Callback fired on release */\n  onReleased?: (e: PointerEvent | TouchEvent) => void;\n}\n\nexport interface UseMousePressedReturn {\n  /** Current pressed state */\n  pressed$: ReadonlyObservable<boolean>;\n  /** Event source type: \"mouse\" | \"touch\" | null */\n  sourceType$: ReadonlyObservable<UseMousePressedSourceType>;\n}\n\n/**\n * Framework-agnostic mouse/touch press state tracker.\n *\n * Monitors `pointerdown`/`pointerup` and optionally `touchstart`/`touchend`/`touchcancel`\n * events on a target (default: window) and exposes reactive pressed state.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function createMousePressed(\n  options?: DeepMaybeObservable<UseMousePressedOptions>\n): UseMousePressedReturn {\n  // Wrap options in observable so event handlers can peek latest callbacks\n  const opts$ = observable(options);\n  const raw = peek(options) as UseMousePressedOptions | undefined;\n\n  const touch = raw?.touch ?? true;\n\n  // Resolve event target — read from raw options to preserve Ref$/Observable\n  // reference identity. createEventListener tracks it reactively via normalizeTargets.\n  const rawTarget = (options as UseMousePressedOptions | undefined)?.target as\n    | MaybeEventTarget\n    | undefined;\n  const win: MaybeEventTarget = (defaultWindow ?? null) as MaybeEventTarget;\n  const eventTarget: MaybeEventTarget = rawTarget ?? win;\n\n  const pressed$ = observable(false);\n  const sourceType$ = observable<UseMousePressedSourceType>(null);\n\n  // --- Pointer events (mouse) ---\n\n  const onPointerDown = (e: PointerEvent) => {\n    if (opts$.peek()?.preventDragEvent) e.preventDefault();\n    pressed$.set(true);\n    sourceType$.set(\"mouse\");\n    opts$.peek()?.onPressed?.(e);\n  };\n\n  // Release always on window (even if press was on a specific element)\n  const onPointerUp = (e: PointerEvent) => {\n    if (!pressed$.peek()) return;\n    pressed$.set(false);\n    opts$.peek()?.onReleased?.(e);\n  };\n\n  createEventListener(eventTarget, \"pointerdown\", onPointerDown);\n  createEventListener(win, \"pointerup\", onPointerUp);\n\n  // --- Touch events ---\n  const touchTarget: MaybeEventTarget = touch ? eventTarget : null;\n\n  const onTouchStart = (e: TouchEvent) => {\n    pressed$.set(true);\n    sourceType$.set(\"touch\");\n    opts$.peek()?.onPressed?.(e);\n  };\n\n  const onTouchEnd = (e: TouchEvent) => {\n    if (!pressed$.peek()) return;\n    pressed$.set(false);\n    opts$.peek()?.onReleased?.(e);\n  };\n\n  createEventListener(touchTarget, \"touchstart\", onTouchStart, { passive: true });\n  createEventListener(touch ? win : null, \"touchend\", onTouchEnd, { passive: true });\n  createEventListener(touch ? win : null, \"touchcancel\", onTouchEnd, { passive: true });\n\n  return { pressed$, sourceType$ };\n}\n"],"mappings":"AAAA,SAAS,kBAAkB;AAE3B,SAAS,YAAY;AACrB,SAAkC,qBAAqB;AAEvD,SAAS,2BAA2B;AAAA;AA+B7B,SAAS,mBACd,SACuB;AAEvB,QAAM,QAAQ,WAAW,OAAO;AAChC,QAAM,MAAM,KAAK,OAAO;AAExB,QAAM,QAAQ,KAAK,SAAS;AAI5B,QAAM,YAAa,SAAgD;AAGnE,QAAM,MAAyB,iBAAiB;AAChD,QAAM,cAAgC,aAAa;AAEnD,QAAM,WAAW,WAAW,KAAK;AACjC,QAAM,cAAc,WAAsC,IAAI;AAI9D,QAAM,gBAAgB,CAAC,MAAoB;AACzC,QAAI,MAAM,KAAK,GAAG,iBAAkB,GAAE,eAAe;AACrD,aAAS,IAAI,IAAI;AACjB,gBAAY,IAAI,OAAO;AACvB,UAAM,KAAK,GAAG,YAAY,CAAC;AAAA,EAC7B;AAGA,QAAM,cAAc,CAAC,MAAoB;AACvC,QAAI,CAAC,SAAS,KAAK,EAAG;AACtB,aAAS,IAAI,KAAK;AAClB,UAAM,KAAK,GAAG,aAAa,CAAC;AAAA,EAC9B;AAEA,sBAAoB,aAAa,eAAe,aAAa;AAC7D,sBAAoB,KAAK,aAAa,WAAW;AAGjD,QAAM,cAAgC,QAAQ,cAAc;AAE5D,QAAM,eAAe,CAAC,MAAkB;AACtC,aAAS,IAAI,IAAI;AACjB,gBAAY,IAAI,OAAO;AACvB,UAAM,KAAK,GAAG,YAAY,CAAC;AAAA,EAC7B;AAEA,QAAM,aAAa,CAAC,MAAkB;AACpC,QAAI,CAAC,SAAS,KAAK,EAAG;AACtB,aAAS,IAAI,KAAK;AAClB,UAAM,KAAK,GAAG,aAAa,CAAC;AAAA,EAC9B;AAEA,sBAAoB,aAAa,cAAc,cAAc,EAAE,SAAS,KAAK,CAAC;AAC9E,sBAAoB,QAAQ,MAAM,MAAM,YAAY,YAAY,EAAE,SAAS,KAAK,CAAC;AACjF,sBAAoB,QAAQ,MAAM,MAAM,eAAe,YAAY,EAAE,SAAS,KAAK,CAAC;AAEpF,SAAO,EAAE,UAAU,YAAY;AACjC;","names":[]}