{"version":3,"file":"verification-code.mjs","sources":["../../../../../../packages/components/verification-code/src/verification-code.vue"],"sourcesContent":["<template>\n  <div :class=\"ns.b()\">\n    <template v-for=\"(c, i) in innerValue\" :key=\"i\">\n      <LtInput\n        :ref=\"(el: any) => (inputRefList[i] = el)\"\n        :type=\"type\"\n        :class=\"inputCls\"\n        :model-value=\"c\"\n        :size=\"size\"\n        :error=\"error\"\n        :disabled=\"disabled\"\n        :readonly=\"readonly\"\n        @focus=\"() => focusFirstEmptyInput(i)\"\n        @input=\"(v) => handleInput(i, v)\"\n        @keydown=\"(e) => handleKeydown(i, e)\"\n        @paste=\"(e: ClipboardEvent) => handlePaste(e, i)\"\n      />\n      {{ separator?.(i, c) }}\n    </template>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { computed, ref, watch } from 'vue'\nimport { useNamespace, useSizeProp } from '@lit-element/hooks'\nimport LtInput from '@lit-element/components/input'\nimport { isFunction, isString } from '@lit-element/utils'\nimport { ArrowLeft, ArrowRight, Backspace } from './keycode'\nimport type { PropType, VNode } from 'vue'\n\ndefineOptions({ name: 'LtVerificationCode' })\n\nconst props = defineProps({\n  modelValue: String, // 绑定值\n  defaultValue: String, // 默认值（非受控状态）\n  // 验证码的长度，根据长度渲染对应个数的输入框\n  length: {\n    type: Number,\n    default: 6,\n  },\n  /**\n   * @zh 输入框大小\n   * @values 'mini','small','medium','large'\n   * @defaultValue 'medium'\n   */\n  size: useSizeProp,\n  disabled: Boolean, // 是否禁用\n  masked: Boolean, // 是否密码模式\n  readonly: Boolean, //只读\n  //是否为错误状态\n  error: {\n    type: Boolean,\n    default: false,\n  },\n  // 分隔符。可在不同索引的输入框后自定义渲染分隔符\n  separator: {\n    type: Function as PropType<(index: number, character: string) => VNode>,\n  },\n  // 格式化函数，当用户输入值改变时触发\n  formatter: {\n    type: Function as PropType<\n      (inputValue: string, index: number, value: string) => string | boolean\n    >,\n  },\n})\n\nconst emits = defineEmits(['update:modelValue', 'change', 'finish', 'input'])\n\nconst ns = useNamespace('verification-code')\nconst ns2 = useNamespace('input')\n\nconst inputRefList = ref([] as HTMLElement[])\n\nconst mergedValue = computed(() => props.modelValue ?? props.defaultValue)\nconst type = computed(() => (props.masked ? 'password' : 'text'))\nconst inputCls = computed(() => [\n  ns2.b(),\n  {\n    [ns2.b(`size-${props.size}`)]: props.size,\n  },\n])\n\nconst filledValue = computed(() => {\n  const newVal = String(mergedValue.value).split('')\n  return Array.from({ length: props.length })\n    .fill('')\n    .map((_, index) => (newVal[index] ? String(newVal[index]) : '')) as string[]\n})\n\nconst innerValue = ref(filledValue.value)\n\nwatch(mergedValue, () => {\n  innerValue.value = filledValue.value\n})\n\nconst updateValue = () => {\n  const value = innerValue.value.join('').trim()\n  emits('update:modelValue', value)\n  emits('change', value)\n  if (value.length === props.length) {\n    emits('finish', value)\n  }\n  focusFirstEmptyInput()\n}\n\nconst handleFocus = (index: number) => inputRefList?.value[index].focus()\nconst focusFirstEmptyInput = (index?: number) => {\n  if ((index || index === 0) && innerValue.value[index as number]) {\n    return\n  }\n  for (let i = 0; i < innerValue.value.length; i++) {\n    if (!innerValue.value[i]) {\n      handleFocus(i)\n      break\n    }\n  }\n}\n\nconst handlePaste = (e: ClipboardEvent, index: number) => {\n  e.preventDefault()\n  const { clipboardData } = e\n  const text = clipboardData?.getData('text')\n  if (!text) return\n\n  text.split('').forEach((char, i) => {\n    if (index + i >= props.length) return\n\n    if (isFunction(props.formatter)) {\n      const result = props.formatter(char, index + i, innerValue.value.join(''))\n      if (result === false) {\n        index -= 1\n        return\n      }\n      if (isString(result)) {\n        char = result.charAt(0)\n      }\n    }\n\n    innerValue.value[index + i] = char\n  })\n  updateValue()\n}\n\nconst handleKeydown = (index: number, e: any) => {\n  const keyCode = e.code || e.key\n\n  if (keyCode === Backspace.code && !innerValue.value[index]) {\n    e.preventDefault()\n    innerValue.value[Math.max(index - 1, 0)] = ''\n    updateValue()\n  } else if (keyCode === ArrowLeft.code && index > 0) {\n    e.preventDefault()\n    handleFocus(index - 1)\n  } else if (\n    keyCode === ArrowRight.code &&\n    innerValue.value[index] &&\n    index < props.length - 1\n  ) {\n    e.preventDefault()\n    handleFocus(index + 1)\n  }\n}\n\nconst handleInput = (index: number, value: string) => {\n  let char = (value || '').trim().charAt(value.length - 1)\n  emits('input', char, index)\n\n  if (isFunction(props.formatter)) {\n    const result = props.formatter(char, index, innerValue.value.join(''))\n    if (result === false) return\n    if (isString(result)) {\n      char = result.charAt(0)\n    }\n  }\n\n  innerValue.value[index] = char\n  updateValue()\n}\n</script>\n"],"names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_Fragment","_renderList","_createVNode"],"mappings":"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"}