{"version":3,"file":"PinInputInput.cjs","sources":["../../src/PinInput/PinInputInput.vue"],"sourcesContent":["<script lang=\"ts\">\nimport { Primitive, type PrimitiveProps, usePrimitiveElement } from '@/Primitive'\nimport { injectPinInputRootContext } from './PinInputRoot.vue'\nimport { getActiveElement, useArrowNavigation } from '@/shared'\n\nexport interface PinInputInputProps extends PrimitiveProps {\n  /** Position of the value this input binds to. */\n  index: number\n  /** When `true`, prevents the user from interacting with the pin input */\n  disabled?: boolean\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, nextTick, onMounted, onUnmounted, watch } from 'vue'\n\nconst props = withDefaults(defineProps<PinInputInputProps>(), {\n  as: 'input',\n})\n\nconst context = injectPinInputRootContext()\nconst inputElements = computed(() => Array.from(context.inputElements!.value))\nconst currentValue = computed(() => context.currentModelValue.value[props.index])\n\nconst disabled = computed(() => props.disabled || context.disabled.value)\nconst isOtpMode = computed(() => context.otp.value)\nconst isNumericMode = computed(() => context.type.value === 'number')\nconst isPasswordMode = computed(() => context.mask.value)\n\nconst { primitiveElement, currentElement } = usePrimitiveElement()\nfunction handleInput(event: InputEvent) {\n  const target = event.target as HTMLInputElement\n\n  if ((event.data?.length ?? 0) > 1) {\n    handleMultipleCharacter(target.value)\n    return\n  }\n\n  if (isNumericMode.value && !/^\\d*$/.test(target.value)) {\n    target.value = target.value.replace(/\\D/g, '')\n    return\n  }\n\n  target.value = target.value.slice(-1)\n  updateModelValueAt(props.index, target.value)\n\n  const nextEl = inputElements.value[props.index + 1]\n  if (nextEl)\n    nextEl.focus()\n}\n\nfunction resetPlaceholder() {\n  const target = currentElement.value as HTMLInputElement\n  nextTick(() => {\n    if (target && !target.value)\n      target.placeholder = context.placeholder.value\n  })\n}\n\nfunction handleKeydown(event: KeyboardEvent) {\n  useArrowNavigation(event, getActiveElement() as HTMLElement, undefined, {\n    itemsArray: inputElements.value,\n    focus: true,\n    loop: false,\n    arrowKeyOptions: 'horizontal',\n    dir: context.dir.value,\n  })\n}\n\nfunction handleBackspace(event: KeyboardEvent) {\n  event.preventDefault()\n  const target = event.target as HTMLInputElement\n  const value = target.value\n\n  if (value) {\n    updateModelValueAt(props.index, '')\n  }\n  else {\n    const prevEl = inputElements.value[props.index - 1]\n    if (prevEl) {\n      prevEl.focus()\n      updateModelValueAt(props.index - 1, '')\n    }\n  }\n}\n\nfunction handleDelete(event: KeyboardEvent) {\n  if (event.key === 'Delete') {\n    event.preventDefault()\n    updateModelValueAt(props.index, '')\n  }\n}\n\nfunction handleFocus(event: FocusEvent) {\n  const target = event.target as HTMLInputElement\n  target.setSelectionRange(1, 1)\n\n  if (!target.value)\n    target.placeholder = ''\n}\n\nfunction handleBlur(event: FocusEvent) {\n  resetPlaceholder()\n}\n\nfunction handlePaste(event: ClipboardEvent) {\n  event.preventDefault()\n  const clipboardData = event.clipboardData\n  if (!clipboardData)\n    return\n\n  const values = clipboardData.getData('text')\n  handleMultipleCharacter(values)\n}\n\nfunction handleMultipleCharacter(values: string) {\n  const tempModelValue = [...context.currentModelValue.value]\n  const initialIndex = values.length >= inputElements.value.length ? 0 : props.index\n  const lastIndex = Math.min(initialIndex + values.length, inputElements.value.length)\n  for (let i = initialIndex; i < lastIndex; i++) {\n    const input = inputElements.value[i]\n    const value = values[i - initialIndex]\n    if (isNumericMode.value && !/^\\d*$/.test(value))\n      continue\n\n    tempModelValue[i] = value\n    input.focus()\n  }\n  context.modelValue.value = tempModelValue\n  inputElements.value[lastIndex]?.focus()\n}\n\nfunction removeTrailingEmptyStrings(input: string[]) {\n  let i = input.length - 1\n\n  while (i >= 0 && input[i] === '') {\n    input.pop()\n    i--\n  }\n\n  return input\n}\n\nfunction updateModelValueAt(index: number, value: string) {\n  const tempModelValue = [...context.currentModelValue.value]\n  tempModelValue[index] = value\n  context.modelValue.value = removeTrailingEmptyStrings(tempModelValue)\n}\n\nwatch(currentValue, () => {\n  if (!currentValue.value) {\n    resetPlaceholder()\n  }\n})\n\nonMounted(() => {\n  context.onInputElementChange(currentElement.value as HTMLInputElement)\n})\nonUnmounted(() => {\n  context.inputElements?.value.delete(currentElement.value as HTMLInputElement)\n})\n</script>\n\n<template>\n  <Primitive\n    ref=\"primitiveElement\"\n    autocapitalize=\"none\"\n    :as=\"as\"\n    :as-child=\"asChild\"\n    :autocomplete=\"isOtpMode ? 'one-time-code' : 'false'\"\n    :type=\"isPasswordMode ? 'password' : 'text'\"\n    :inputmode=\"isNumericMode ? 'numeric' : 'text'\"\n    :pattern=\"isNumericMode ? '[0-9]*' : undefined\"\n    :placeholder=\"context.placeholder.value\"\n    :value=\"currentValue\"\n    :disabled=\"disabled\"\n    :data-disabled=\"disabled ? '' : undefined\"\n    :data-complete=\"context.isCompleted.value ? '' : undefined\"\n    :aria-label=\"`pin input ${index + 1} of ${inputElements.length}`\"\n    @input=\"handleInput($event as InputEvent)\"\n    @keydown.left.right.up.down.home.end=\"handleKeydown\"\n    @keydown.backspace=\"handleBackspace\"\n    @keydown.delete=\"handleDelete\"\n    @focus=\"handleFocus\"\n    @blur=\"handleBlur\"\n    @paste=\"handlePaste\"\n  >\n    <slot />\n  </Primitive>\n</template>\n"],"names":["injectPinInputRootContext","computed","usePrimitiveElement","nextTick","useArrowNavigation","getActiveElement","watch","onMounted","onUnmounted"],"mappings":"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"}