{"version":3,"file":"number-input.vue2.mjs","sources":["../../../components/number-input/number-input.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { Icon } from '@/components/icon'\nimport { Renderer } from '@/components/renderer'\nimport { useFieldStore } from '@/components/form'\n\nimport { computed, onMounted, ref, toRef, watch } from 'vue'\n\nimport { useHover, useModifier, useTimerRecord } from '@vexip-ui/hooks'\nimport {\n  createIconProp,\n  createSizeProp,\n  createStateProp,\n  emitEvent,\n  useIcons,\n  useLocale,\n  useNameHelper,\n  useProps\n} from '@vexip-ui/config'\nimport {\n  boundRange,\n  debounce,\n  getGlobalCount,\n  isNull,\n  isValidNumber,\n  minus,\n  plus,\n  throttle,\n  toFixed,\n  toNumber\n} from '@vexip-ui/utils'\nimport { numberInputProps } from './props'\n\nimport type { NumberInputSlots } from './symbol'\n\ntype InputEventType = 'input' | 'change'\n\nconst isEmpty = (value: unknown) => !value && value !== 0\nconst isNullOrNaN = (value: unknown) => isNull(value) || Number.isNaN(value)\n\ndefineOptions({ name: 'NumberInput' })\n\nconst {\n  idFor,\n  labelId,\n  state,\n  disabled,\n  loading,\n  size,\n  validateField,\n  clearField,\n  getFieldValue,\n  setFieldValue\n} = useFieldStore<number>(focus)\n\nconst _props = defineProps(numberInputProps)\nconst props = useProps('numberInput', _props, {\n  size: createSizeProp(size),\n  state: createStateProp(state),\n  locale: null,\n  prefix: createIconProp(),\n  prefixColor: '',\n  suffix: createIconProp(),\n  suffixColor: '',\n  // 格式化后显示\n  formatter: {\n    default: null,\n    isFunc: true\n  },\n  value: {\n    default: () => getFieldValue(),\n    static: true\n  },\n  min: -Infinity,\n  max: Infinity,\n  placeholder: null,\n  autofocus: false,\n  spellcheck: false,\n  autocomplete: false,\n  precision: -1,\n  readonly: false,\n  step: 1,\n  ctrlStep: 100,\n  shiftStep: 10,\n  altStep: 0.1,\n  disabled: () => disabled.value,\n  controlClass: null,\n  debounce: false,\n  delay: null,\n  clearable: false,\n  loading: () => loading.value,\n  loadingIcon: createIconProp(),\n  loadingLock: false,\n  loadingEffect: null,\n  sync: false,\n  syncStep: false,\n  controlType: 'right',\n  emptyType: 'NaN',\n  controlAttrs: null,\n  name: {\n    default: '',\n    static: true\n  },\n  slots: () => ({})\n})\n\nconst emit = defineEmits(['update:value'])\n\nconst slots = defineSlots<NumberInputSlots>()\n\nconst nh = useNameHelper('number-input')\nconst locale = useLocale('numberInput', toRef(props, 'locale'))\nconst icons = useIcons()\n\nconst { timeout, interval } = useTimerRecord()\n\nconst focused = ref(false)\nconst currentValue = ref<string | number>(isEmpty(props.value) ? getEmptyValue() : props.value)\nconst inputting = ref(false)\nconst plusHolding = ref(false)\nconst minusHolding = ref(false)\n\nconst control = ref<HTMLInputElement>()\nconst { wrapper, isHover } = useHover()\n\nuseModifier({\n  target: control,\n  passive: false,\n  onKeyDown: (event, modifier) => {\n    emitEvent(props.onKeyDown, event)\n\n    if (modifier.up || modifier.down) {\n      event.preventDefault()\n      event.stopPropagation()\n\n      if ((modifier.up && plusDisabled.value) || (modifier.down && minusDisabled.value)) {\n        return\n      }\n\n      changeStep(\n        modifier.up ? 'plus' : 'minus',\n        event.ctrlKey ? 'ctrl' : event.shiftKey ? 'shift' : event.altKey ? 'alt' : undefined\n      )\n      modifier.resetAll()\n    } else if (modifier.enter) {\n      event.preventDefault()\n      event.stopPropagation()\n      emitChangeEvent('change')\n      modifier.resetAll()\n    }\n  },\n  onKeyUp: event => {\n    emitEvent(props.onKeyUp, event)\n\n    if (event.key === 'Enter') {\n      handleEnter()\n    }\n  }\n})\n\nconst idIndex = `${getGlobalCount()}`\n\nlet lastValue: number\n\nconst controlId = computed(() => `${nh.bs(idIndex)}__control`)\nconst outOfRange = computed(() => {\n  return (\n    !isNullOrNaN(currentValue.value) &&\n    (toNumber(currentValue.value) > props.max || toNumber(currentValue.value) < props.min)\n  )\n})\nconst isReadonly = computed(() => (props.loading && props.loadingLock) || props.readonly)\nconst plusDisabled = computed(() => {\n  return (\n    props.disabled ||\n    isReadonly.value ||\n    (!isNullOrNaN(currentValue.value) && toNumber(currentValue.value) >= props.max)\n  )\n})\nconst minusDisabled = computed(() => {\n  return (\n    props.disabled ||\n    isReadonly.value ||\n    (!isNullOrNaN(currentValue.value) && toNumber(currentValue.value) <= props.min)\n  )\n})\nconst className = computed(() => {\n  const [display, fade] = (props.controlType || 'right').split('-')\n\n  return [\n    nh.b(),\n    nh.bs('vars'),\n    nh.ns('input-vars'),\n    {\n      [nh.bm('inherit')]: props.inherit,\n      [nh.bm('focused')]: inputting.value,\n      [nh.bm('disabled')]: props.disabled,\n      [nh.bm('readonly')]: isReadonly.value,\n      [nh.bm('loading')]: props.loading,\n      [nh.bm(props.size)]: props.size !== 'default',\n      [nh.bm(props.state)]: props.state !== 'default',\n      [nh.bm(`control-${display}`)]: display !== 'right',\n      [nh.bm('control-fade')]: fade,\n      [nh.bm('out-of-range')]: outOfRange.value\n    }\n  ]\n})\nconst hasPrefix = computed(() => {\n  return !!(slots.prefix || props.prefix || props.slots.prefix)\n})\nconst hasSuffix = computed(() => {\n  return !!(slots.suffix || props.suffix || props.slots.suffix)\n})\nconst preciseNumber = computed(() => {\n  return !inputting.value &&\n    typeof currentValue.value === 'number' &&\n    !Number.isNaN(currentValue.value) &&\n    props.precision >= 0\n    ? toFixed(currentValue.value, props.precision)\n    : currentValue.value\n})\nconst formattedValue = computed(() => {\n  if (isNullOrNaN(preciseNumber.value) || typeof preciseNumber.value !== 'number')\n    return preciseNumber.value ?? ''\n\n  return !inputting.value && typeof props.formatter === 'function'\n    ? props.formatter(preciseNumber.value as number)\n    : preciseNumber.value.toString()\n})\nconst hasValue = computed(() => !!(currentValue.value || currentValue.value === 0))\nconst showClear = computed(() => {\n  return !props.disabled && !isReadonly.value && props.clearable && isHover.value && hasValue.value\n})\nconst autoComplete = computed(() => {\n  return typeof props.autocomplete === 'boolean'\n    ? props.autocomplete\n      ? 'on'\n      : 'off'\n    : props.autocomplete\n})\n\nconst delay = toNumber(props.delay)\nconst handleInput = props.debounce\n  ? debounce(handleChange, delay || 100)\n  : throttle(handleChange, delay || 16)\n\nwatch(\n  () => props.value,\n  value => {\n    if (value !== lastValue) {\n      parseValue()\n    }\n  },\n  { immediate: true }\n)\nwatch(inputting, value => {\n  if (!value) {\n    setInputValue(inputting.value ? currentValue.value : formattedValue.value)\n  }\n})\n\nonMounted(() => {\n  setInputValue(inputting.value ? currentValue.value : formattedValue.value)\n})\n\ndefineExpose({\n  idFor,\n  focused,\n  isHover,\n  outOfRange,\n  preciseNumber,\n  formattedValue,\n  isReadonly,\n  wrapper,\n  input: control,\n  focus,\n  blur: () => control.value?.blur()\n})\n\nfunction setInputValue(value?: number | string | null) {\n  if (control.value) {\n    control.value.value = isNullOrNaN(value) ? '' : value!.toString()\n  }\n}\n\nfunction boundValueRange(value: number) {\n  return boundRange(value, props.min, props.max)\n}\n\nfunction parseValue() {\n  let value = props.value\n  value = inputting.value ? value : isValidNumber(value, true) ? toNumber(value) : getEmptyValue()\n\n  if (props.precision >= 0 && !isNullOrNaN(value)) {\n    value = toFixed(boundValueRange(value), props.precision)\n  }\n\n  currentValue.value = value\n  lastValue = value\n\n  setInputValue(inputting.value ? value : formattedValue.value)\n}\n\nfunction focus(options?: FocusOptions) {\n  control.value?.focus(options)\n}\n\nfunction handleFocus(event: FocusEvent) {\n  focused.value = true\n  inputting.value = true\n  emitEvent(props.onFocus, event)\n}\n\nfunction handleBlur(event: FocusEvent) {\n  focused.value = false\n\n  setTimeout(() => {\n    if (!focused.value) {\n      inputting.value = false\n      emitEvent(props.onBlur, event)\n      emitChangeEvent('change')\n    }\n  }, 120)\n}\n\nfunction handleHold(type: 'plus' | 'minus', event: PointerEvent) {\n  const disabled = type === 'plus' ? plusDisabled : minusDisabled\n  const change = type === 'plus' ? plusNumber : minusNumber\n\n  if (event.button !== 0 || disabled.value) return\n\n  change(event)\n  document.addEventListener('pointerup', cancelStep)\n  document.addEventListener('touchend', cancelStep)\n  clearTimeout(timeout.step)\n  clearInterval(interval.step)\n  ;(type === 'plus' ? plusHolding : minusHolding).value = true\n\n  timeout.step = setTimeout(() => {\n    interval.step = setInterval(() => {\n      disabled.value ? cancelStep() : change(event)\n    }, 32)\n  }, 500)\n}\n\nfunction cancelStep() {\n  document.removeEventListener('pointerup', cancelStep)\n  document.removeEventListener('touchend', cancelStep)\n  clearTimeout(timeout.step)\n  clearInterval(interval.step)\n\n  plusHolding.value = false\n  minusHolding.value = false\n}\n\nfunction plusNumber(event: PointerEvent) {\n  !focused.value && focus()\n  changeStep(\n    'plus',\n    event.ctrlKey ? 'ctrl' : event.shiftKey ? 'shift' : event.altKey ? 'alt' : undefined\n  )\n}\n\nfunction minusNumber(event: PointerEvent) {\n  !focused.value && focus()\n  changeStep(\n    'minus',\n    event.ctrlKey ? 'ctrl' : event.shiftKey ? 'shift' : event.altKey ? 'alt' : undefined\n  )\n}\n\nfunction changeStep(type: 'plus' | 'minus', modifier?: 'ctrl' | 'shift' | 'alt') {\n  if (props.disabled || isReadonly.value) return\n\n  let value = currentValue.value || 0\n  let step!: number\n\n  switch (modifier) {\n    case 'ctrl':\n      step = props.ctrlStep\n      break\n    case 'shift':\n      step = props.shiftStep\n      break\n    case 'alt':\n      step = props.altStep\n      break\n    default:\n      step = props.step\n  }\n\n  const stringValue = value.toString().trim()\n\n  if (stringValue.endsWith('.')) {\n    value = toNumber(stringValue.slice(0, -1))\n  }\n\n  if (type === 'plus') {\n    value = plus(value, step)\n  } else {\n    value = minus(value, step)\n  }\n\n  setValue(value, props.syncStep && !props.sync ? 'change' : 'input')\n}\n\nfunction handleChange(event: Event) {\n  const type = event.type as InputEventType\n  const stringValue = (event.target as HTMLInputElement).value\n\n  let value = stringValue.trim()\n\n  // to rollback invalid value to empty in `<input>` when change\n  if (type === 'change' && stringValue && !isValidNumber(stringValue, true)) {\n    const floatValue = parseFloat(stringValue)\n\n    if (Number.isNaN(floatValue)) {\n      value = ''\n    } else {\n      value = floatValue.toString()\n    }\n  }\n\n  inputting.value = type === 'input'\n\n  setValue(value, type)\n}\n\nfunction setValue(value: string | number, type: InputEventType, sync = props.sync) {\n  if (type !== 'input') {\n    currentValue.value = isEmpty(value) ? getEmptyValue() : toNumber(value)\n  } else {\n    currentValue.value = value\n  }\n\n  setInputValue(currentValue.value)\n  emitChangeEvent(type, sync)\n}\n\nfunction getEmptyValue() {\n  switch (props.emptyType) {\n    case 'undefined':\n      return undefined! as number\n    case 'null':\n      return null! as number\n    default:\n      return NaN\n  }\n}\n\nfunction emitChangeEvent(type: InputEventType, sync = props.sync) {\n  type = type === 'input' ? 'input' : 'change'\n\n  if (type === 'change') {\n    const empty = isEmpty(currentValue.value)\n    const value = empty ? getEmptyValue() : toNumber(currentValue.value)\n\n    let boundValue = empty ? value : boundValueRange(toNumber(value))\n\n    if (!empty && props.precision >= 0) {\n      boundValue = toFixed(boundValue, props.precision)\n    }\n\n    const changed = !Object.is(boundValue, value)\n\n    if (!empty) {\n      currentValue.value = boundValue\n    }\n\n    if (!sync && Object.is(lastValue, boundValue)) {\n      !Object.is(props.value, value) && emit('update:value', boundValue)\n      return\n    }\n\n    lastValue = boundValue\n\n    if (!sync || changed) {\n      emit('update:value', boundValue)\n      setFieldValue(boundValue)\n    }\n\n    emitEvent(props.onChange, boundValue)\n\n    if (!sync || changed) {\n      validateField()\n    }\n  } else {\n    const value = parseFloat(currentValue.value as string)\n    const empty = Number.isNaN(value)\n\n    let boundValue = empty ? getEmptyValue() : boundValueRange(toNumber(value))\n\n    if (!empty && props.precision >= 0) {\n      boundValue = toFixed(boundValue, props.precision)\n    }\n\n    const emitUpdate = sync && !Object.is(lastValue, boundValue)\n\n    if (emitUpdate) {\n      lastValue = boundValue\n\n      emit('update:value', boundValue)\n      setFieldValue(boundValue)\n    }\n\n    emitEvent(props.onInput, value)\n\n    if (emitUpdate) {\n      validateField()\n    }\n  }\n}\n\nfunction handleClear() {\n  if (props.disabled || isReadonly.value) return\n\n  setValue(NaN, 'change', false)\n  emitEvent(props.onClear)\n  clearField()\n  focus()\n}\n\nfunction handleEnter() {\n  emitEvent(props.onEnter)\n}\n\nfunction handlePrefixClick(event: MouseEvent) {\n  emitEvent(props.onPrefixClick, event)\n}\n\nfunction handleSuffixClick(event: MouseEvent) {\n  emitEvent(props.onSuffixClick, event)\n}\n\nfunction handleKeyPress(event: KeyboardEvent) {\n  emitEvent(props.onKeyPress, event)\n}\n</script>\n\n<template>\n  <div\n    :id=\"idFor\"\n    ref=\"wrapper\"\n    :class=\"className\"\n    role=\"group\"\n    @click=\"control?.focus()\"\n  >\n    <div\n      v-if=\"hasPrefix\"\n      :class=\"[nh.be('icon'), nh.be('prefix')]\"\n      :style=\"{ color: props.prefixColor }\"\n      @click=\"handlePrefixClick\"\n    >\n      <slot name=\"prefix\">\n        <Renderer :renderer=\"props.slots.prefix\">\n          <Icon :icon=\"props.prefix\"></Icon>\n        </Renderer>\n      </slot>\n    </div>\n    <input\n      v-bind=\"props.controlAttrs\"\n      :id=\"controlId\"\n      ref=\"control\"\n      :class=\"[nh.be('control'), props.controlAttrs?.class, props.controlClass]\"\n      type=\"text\"\n      :autofocus=\"props.autofocus\"\n      :autocomplete=\"autoComplete\"\n      :spellcheck=\"props.spellcheck\"\n      :disabled=\"props.disabled\"\n      :readonly=\"isReadonly\"\n      :placeholder=\"props.placeholder ?? locale.placeholder\"\n      :name=\"props.name || props.controlAttrs?.name\"\n      role=\"spinbutton\"\n      :title=\"outOfRange ? locale.outOfRange : undefined\"\n      :aria-valuenow=\"preciseNumber\"\n      :aria-valuemin=\"props.min !== -Infinity ? props.min : undefined\"\n      :aria-valuemax=\"props.max !== Infinity ? props.max : undefined\"\n      :aria-labelledby=\"labelId\"\n      @submit.prevent\n      @blur=\"handleBlur\"\n      @focus=\"handleFocus\"\n      @keypress=\"handleKeyPress\"\n      @input=\"handleInput\"\n      @change=\"handleChange\"\n    />\n    <div\n      v-if=\"hasSuffix\"\n      :class=\"[nh.be('icon'), nh.be('suffix')]\"\n      :style=\"{\n        color: props.suffixColor,\n        opacity: showClear || props.loading ? '0%' : ''\n      }\"\n      @click=\"handleSuffixClick\"\n    >\n      <slot name=\"suffix\">\n        <Renderer :renderer=\"props.slots.suffix\">\n          <Icon :icon=\"props.suffix\"></Icon>\n        </Renderer>\n      </slot>\n    </div>\n    <div\n      v-else-if=\"props.clearable || props.loading\"\n      :class=\"[nh.be('icon'), nh.bem('icon', 'placeholder'), nh.be('suffix')]\"\n    ></div>\n    <Transition :name=\"nh.ns('fade')\" appear>\n      <button\n        v-if=\"showClear\"\n        :class=\"[nh.be('icon'), nh.be('clear')]\"\n        type=\"button\"\n        tabindex=\"-1\"\n        :aria-label=\"locale.ariaLabel.clear\"\n        @click.stop=\"handleClear\"\n      >\n        <Icon v-bind=\"icons.clear\" label=\"clear\"></Icon>\n      </button>\n      <div v-else-if=\"props.loading\" :class=\"[nh.be('icon'), nh.be('loading')]\">\n        <Icon\n          v-bind=\"icons.loading\"\n          :effect=\"props.loadingEffect || icons.loading.effect\"\n          :icon=\"props.loadingIcon || icons.loading.icon\"\n          label=\"loading\"\n        ></Icon>\n      </div>\n    </Transition>\n    <template v-if=\"props.controlType !== 'none'\">\n      <div\n        :class=\"{\n          [nh.be('plus')]: true,\n          [nh.bem('plus', 'disabled')]: plusDisabled,\n          [nh.bem('plus', 'holding')]: plusHolding\n        }\"\n        role=\"button\"\n        :aria-label=\"locale.ariaLabel.increase\"\n        :aria-labelledby=\"labelId\"\n        :aria-controls=\"controlId\"\n        @pointerdown.prevent=\"handleHold('plus', $event)\"\n        @mousedown.prevent\n        @touchstart.prevent\n      >\n        <Icon v-bind=\"icons.angleUp\" :scale=\"+(icons.angleUp.scale || 1) * 0.8\"></Icon>\n      </div>\n      <div\n        :class=\"{\n          [nh.be('minus')]: true,\n          [nh.bem('minus', 'disabled')]: minusDisabled,\n          [nh.bem('minus', 'holding')]: minusHolding\n        }\"\n        :aria-label=\"locale.ariaLabel.decrease\"\n        :aria-labelledby=\"labelId\"\n        :aria-controls=\"controlId\"\n        @pointerdown.prevent=\"handleHold('minus', $event)\"\n        @mousedown.prevent\n        @touchstart.prevent\n      >\n        <Icon v-bind=\"icons.angleDown\" :scale=\"+(icons.angleDown.scale || 1) * 0.8\"></Icon>\n      </div>\n    </template>\n  </div>\n</template>\n"],"names":["isEmpty","value","isNullOrNaN","isNull","idFor","labelId","state","disabled","loading","size","validateField","clearField","getFieldValue","setFieldValue","useFieldStore","focus","props","useProps","__props","createSizeProp","createStateProp","createIconProp","emit","__emit","slots","_useSlots","nh","useNameHelper","locale","useLocale","toRef","icons","useIcons","timeout","interval","useTimerRecord","focused","ref","currentValue","getEmptyValue","inputting","plusHolding","minusHolding","control","wrapper","isHover","useHover","useModifier","event","modifier","emitEvent","plusDisabled","minusDisabled","changeStep","emitChangeEvent","handleEnter","idIndex","getGlobalCount","lastValue","controlId","computed","outOfRange","toNumber","isReadonly","className","display","fade","hasPrefix","hasSuffix","preciseNumber","toFixed","formattedValue","hasValue","showClear","autoComplete","delay","handleInput","debounce","handleChange","throttle","watch","parseValue","setInputValue","onMounted","__expose","_a","boundValueRange","boundRange","isValidNumber","options","handleFocus","handleBlur","handleHold","type","change","plusNumber","minusNumber","cancelStep","step","stringValue","plus","minus","setValue","floatValue","sync","empty","boundValue","changed","emitUpdate","handleClear","handlePrefixClick","handleSuffixClick","handleKeyPress"],"mappings":"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"}