{"version":3,"file":"textarea.vue2.mjs","sources":["../../../../../packages/components/textarea/src/textarea.vue"],"sourcesContent":["<template>\n  <div\n    :class=\"[\n      ns.b(),\n      ns.is('disabled', inputDisabled),\n      ns.is('exceed', inputExceed),\n\n      $attrs.class\n    ]\"\n    :style=\"containerStyle\"\n    @mouseenter=\"onMouseEnter\"\n    @mouseleave=\"onMouseLeave\"\n  >\n    <textarea\n      ref=\"textarea\"\n      :class=\"ns.e('inner')\"\n      v-bind=\"attrs\"\n      :tabindex=\"tabindex\"\n      :disabled=\"inputDisabled\"\n      :readonly=\"readonly\"\n      :autocomplete=\"autocomplete\"\n      :style=\"computedTextareaStyle\"\n      :aria-label=\"label\"\n      :placeholder=\"placeholder\"\n      @compositionstart=\"handleCompositionStart\"\n      @compositionupdate=\"handleCompositionUpdate\"\n      @compositionend=\"handleCompositionEnd\"\n      @input=\"handleInput\"\n      @focus=\"handleFocus\"\n      @blur=\"handleBlur\"\n      @change=\"handleChange\"\n      @keydown=\"handleKeydown\"\n    />\n    <span v-if=\"isWordLimitVisible\" :class=\"ns.e('count')\">\n      {{ textLength }} / {{ attrs.maxlength }}\n    </span>\n  </div>\n</template>\n\n<script lang=\"ts\">\nimport {\n  defineComponent,\n  computed,\n  watch,\n  nextTick,\n  ref,\n  shallowRef,\n  onMounted\n} from 'vue'\nimport { isClient } from '@vueuse/core'\nimport { ElIcon } from '@element-ultra/components/icon'\nimport { CircleClose, View as IconView } from 'icon-ultra'\nimport { isObject } from '@element-ultra/utils'\nimport {\n  useAttrs,\n  useDisabled,\n  useFormItem,\n  useNamespace\n} from '@element-ultra/hooks'\nimport { UPDATE_MODEL_EVENT } from '@element-ultra/shared'\nimport { calcTextareaHeight } from './calc-textarea-height'\nimport { textareaProps, textareaEmits } from './textarea'\n\nimport type { StyleValue } from 'vue'\n\ntype TargetElement = HTMLInputElement | HTMLTextAreaElement\n\nexport default defineComponent({\n  name: 'ElTextarea',\n\n  components: { ElIcon, CircleClose, IconView },\n\n  inheritAttrs: false,\n\n  props: textareaProps,\n  emits: textareaEmits,\n\n  setup(props, { slots, emit, attrs: rawAttrs }) {\n    const attrs = useAttrs()\n\n    const { formItem } = useFormItem()\n    const inputDisabled = useDisabled({ props })\n    const ns = useNamespace('textarea')\n\n    const textarea = ref<HTMLTextAreaElement>()\n    const focused = ref(false)\n    const hovering = ref(false)\n    const isComposing = ref(false)\n    const _textareaCalcStyle = shallowRef(props.innerStyle)\n\n    const containerStyle = computed(() => rawAttrs.style as StyleValue)\n    const computedTextareaStyle = computed<StyleValue>(() => [\n      props.innerStyle,\n      _textareaCalcStyle.value,\n      { resize: props.resize }\n    ])\n    const nativeInputValue = computed(() =>\n      props.modelValue === null || props.modelValue === undefined\n        ? ''\n        : String(props.modelValue)\n    )\n\n    const isWordLimitVisible = computed(\n      () =>\n        props.showWordLimit &&\n        !!attrs.value.maxlength &&\n        !inputDisabled.value &&\n        !props.readonly\n    )\n    const textLength = computed(() => Array.from(nativeInputValue.value).length)\n    const inputExceed = computed(\n      () =>\n        // show exceed style if length of initial value greater then maxlength\n        !!isWordLimitVisible.value &&\n        textLength.value > Number(attrs.value.maxlength)\n    )\n\n    const resizeTextarea = () => {\n      const { autosize } = props\n\n      if (!isClient) return\n\n      if (autosize) {\n        const minRows = isObject(autosize) ? autosize.minRows : undefined\n        const maxRows = isObject(autosize) ? autosize.maxRows : undefined\n        _textareaCalcStyle.value = {\n          ...calcTextareaHeight(textarea.value!, minRows, maxRows)\n        }\n      } else {\n        _textareaCalcStyle.value = {\n          minHeight: calcTextareaHeight(textarea.value!).minHeight\n        }\n      }\n    }\n\n    const setNativeInputValue = () => {\n      const input = textarea.value\n      if (!input || input.value === nativeInputValue.value) return\n      input.value = nativeInputValue.value\n    }\n\n    const handleInput = (event: Event) => {\n      const { value } = event.target as TargetElement\n\n      // should not emit input during composition\n      // see: https://github.com/ElemeFE/element/issues/10516\n      if (isComposing.value) return\n\n      // hack for https://github.com/ElemeFE/element/issues/8548\n      // should remove the following line when we don't support IE\n      if (value === nativeInputValue.value) return\n\n      emit(UPDATE_MODEL_EVENT, value)\n      emit('input', value)\n\n      // ensure native input value is controlled\n      // see: https://github.com/ElemeFE/element/issues/12850\n      nextTick(setNativeInputValue)\n    }\n\n    const handleChange = (event: Event) => {\n      emit('change', (event.target as TargetElement).value)\n    }\n\n    const focus = () => {\n      // see: https://github.com/ElemeFE/element/issues/18573\n      nextTick(() => {\n        textarea.value?.focus()\n      })\n    }\n\n    const blur = () => {\n      textarea.value?.blur()\n    }\n\n    const handleFocus = (event: FocusEvent) => {\n      focused.value = true\n      emit('focus', event)\n    }\n\n    const handleBlur = (event: FocusEvent) => {\n      focused.value = false\n      emit('blur', event)\n      formItem?.validate()\n    }\n\n    const select = () => {\n      textarea.value?.select()\n    }\n\n    const handleCompositionStart = (event: CompositionEvent) => {\n      emit('compositionstart', event)\n      isComposing.value = true\n    }\n\n    const handleCompositionUpdate = (event: CompositionEvent) => {\n      emit('compositionupdate', event)\n      isComposing.value = true\n    }\n\n    const handleCompositionEnd = (event: CompositionEvent) => {\n      emit('compositionend', event)\n      if (isComposing.value) {\n        isComposing.value = false\n        handleInput(event)\n      }\n    }\n\n    watch(\n      () => props.modelValue,\n      () => {\n        nextTick(resizeTextarea)\n      }\n    )\n\n    // native input value is set explicitly\n    // do not use v-model / :value in template\n    // see: https://github.com/ElemeFE/element/issues/14521\n    watch(nativeInputValue, () => setNativeInputValue())\n\n    onMounted(() => {\n      setNativeInputValue()\n      nextTick(resizeTextarea)\n    })\n\n    const onMouseLeave = (evt: MouseEvent) => {\n      hovering.value = false\n      emit('mouseleave', evt)\n    }\n\n    const onMouseEnter = (evt: MouseEvent) => {\n      hovering.value = true\n      emit('mouseenter', evt)\n    }\n\n    const handleKeydown = (evt: KeyboardEvent) => {\n      emit('keydown', evt)\n    }\n\n    return {\n      textarea,\n      attrs,\n      containerStyle,\n      computedTextareaStyle,\n      inputDisabled,\n      isWordLimitVisible,\n      textLength,\n      hovering,\n      inputExceed,\n      resizeTextarea,\n      handleInput,\n      handleChange,\n      handleFocus,\n      handleBlur,\n      handleCompositionStart,\n      handleCompositionUpdate,\n      handleCompositionEnd,\n      select,\n      focus,\n      blur,\n      onMouseLeave,\n      onMouseEnter,\n      handleKeydown,\n      ns\n    }\n  }\n})\n</script>\n"],"names":["IconView"],"mappings":"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"}