{"version":3,"file":"utils.js","sources":["../../src/NumberField/utils.ts"],"sourcesContent":["import type { MaybeComputedElementRef } from '@vueuse/core'\nimport type { Ref } from 'vue'\nimport { NumberFormatter, NumberParser } from '@internationalized/number'\nimport { unrefElement, useEventListener } from '@vueuse/core'\nimport { createEventHook, isClient, reactiveComputed } from '@vueuse/shared'\nimport { computed, ref } from 'vue'\n\nexport function usePressedHold(options: { target?: MaybeComputedElementRef, disabled: Ref }) {\n const { disabled } = options\n const timeout = ref()\n const triggerHook = createEventHook()\n const resetTimeout = () => window.clearTimeout(timeout.value)\n\n const onIncrementPressStart = (delay: number) => {\n resetTimeout()\n if (disabled.value)\n return\n\n triggerHook.trigger()\n\n timeout.value = window.setTimeout(() => {\n onIncrementPressStart(60)\n }, delay)\n }\n\n const handlePressStart = () => {\n onIncrementPressStart(400)\n }\n\n const handlePressEnd = () => {\n resetTimeout()\n }\n\n // Handle press event, modified version of useMousePressed\n const isPressed = ref(false)\n const target = computed(() => unrefElement(options.target))\n\n const onPressStart = (event: PointerEvent) => {\n // Only handle left clicks, and ignore events that bubbled through portals.\n if (event.button !== 0 || isPressed.value)\n return\n\n event.preventDefault()\n isPressed.value = true\n handlePressStart()\n }\n\n const onPressRelease = () => {\n isPressed.value = false\n handlePressEnd()\n }\n\n if (isClient) {\n useEventListener(target || window, 'pointerdown', onPressStart)\n useEventListener(window, 'pointerup', onPressRelease)\n useEventListener(window, 'pointercancel', onPressRelease)\n }\n\n return {\n isPressed,\n onTrigger: triggerHook.on,\n }\n}\n\nexport function useNumberFormatter(locale: Ref, options: Ref = ref({})) {\n return reactiveComputed(() => new NumberFormatter(locale.value, options.value))\n}\n\nexport function useNumberParser(locale: Ref, options: Ref = ref({})) {\n return reactiveComputed(() => new NumberParser(locale.value, options.value))\n}\n\nexport function handleDecimalOperation(operator: '-' | '+', value1: number, value2: number): number {\n let result = operator === '+' ? value1 + value2 : value1 - value2\n\n // Check if we have decimals\n if (value1 % 1 !== 0 || value2 % 1 !== 0) {\n const value1Decimal = value1.toString().split('.')\n const value2Decimal = value2.toString().split('.')\n const value1DecimalLength = (value1Decimal[1] && value1Decimal[1].length) || 0\n const value2DecimalLength = (value2Decimal[1] && value2Decimal[1].length) || 0\n const multiplier = 10 ** Math.max(value1DecimalLength, value2DecimalLength)\n\n // Transform the decimals to integers based on the precision\n value1 = Math.round(value1 * multiplier)\n value2 = Math.round(value2 * multiplier)\n\n // Perform the operation on integers values to make sure we don't get a fancy decimal value\n result = operator === '+' ? value1 + value2 : value1 - value2\n\n // Transform the integer result back to decimal\n result /= multiplier\n }\n\n return result\n}\n"],"names":[],"mappings":"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"}