import { buildProps, definePropType, iconPropType, isString, mutable, } from '@element-plus/utils' import { UPDATE_MODEL_EVENT } from '@element-plus/constants' import { useAriaProps, useSizeProp } from '@element-plus/hooks' import { CircleClose } from '@element-plus/icons-vue' import type { ExtractPropTypes, HTMLAttributes, StyleValue, __ExtractPublicPropTypes, } from 'vue' export type InputModelModifiers = { lazy?: boolean number?: boolean trim?: boolean } export type InputAutoSize = { minRows?: number; maxRows?: number } | boolean // Some commonly used values for input type export type InputType = | 'text' | 'textarea' | 'number' | 'password' | 'email' | 'search' | 'tel' | 'url' | (string & NonNullable) export const inputProps = buildProps({ /** * @description native input id */ id: { type: String, default: undefined, }, /** * @description input box size */ size: useSizeProp, /** * @description whether to disable */ disabled: Boolean, /** * @description binding value */ modelValue: { type: definePropType([ String, Number, Object, ]), default: '', }, /** * @description v-model modifiers, reference [Vue modifiers](https://vuejs.org/guide/essentials/forms.html#modifiers) */ modelModifiers: { type: definePropType(Object), default: () => ({}), }, /** * @description same as `maxlength` in native input */ maxlength: { type: [String, Number], }, /** * @description same as `minlength` in native input */ minlength: { type: [String, Number], }, /** * @description type of input, see more in [MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Form_%3Cinput%3E_types) */ type: { type: definePropType(String), default: 'text', }, /** * @description control the resizability */ resize: { type: String, values: ['none', 'both', 'horizontal', 'vertical'], }, /** * @description whether textarea has an adaptive height */ autosize: { type: definePropType([Boolean, Object]), default: false, }, /** * @description native input autocomplete */ autocomplete: { type: definePropType(String), default: 'off', }, /** * @description format content */ formatter: { type: Function, }, /** * @description parse content */ parser: { type: Function, }, /** * @description placeholder */ placeholder: { type: String, }, /** * @description native input form */ form: { type: String, }, /** * @description native input readonly */ readonly: Boolean, /** * @description whether to show clear button */ clearable: Boolean, /** * @description custom clear icon component */ clearIcon: { type: iconPropType, default: CircleClose, }, /** * @description toggleable password input */ showPassword: Boolean, /** * @description word count */ showWordLimit: Boolean, /** * @description word count position, valid when `show-word-limit` is true */ wordLimitPosition: { type: String, values: ['inside', 'outside'], default: 'inside', }, /** * @description suffix icon */ suffixIcon: { type: iconPropType, }, /** * @description prefix icon */ prefixIcon: { type: iconPropType, }, /** * @description container role, internal properties provided for use by the picker component */ containerRole: { type: String, default: undefined, }, /** * @description input tabindex */ tabindex: { type: [String, Number], default: 0, }, /** * @description whether to trigger form validation */ validateEvent: { type: Boolean, default: true, }, /** * @description input or textarea element style */ inputStyle: { type: definePropType([Object, Array, String]), default: () => mutable({} as const), }, /** * @description native input autofocus */ autofocus: Boolean, rows: { type: Number, default: 2, }, ...useAriaProps(['ariaLabel']), /** * @description native input mode for virtual keyboards */ inputmode: { type: definePropType(String), default: undefined, }, /** * @description same as `name` in native input */ name: String, } as const) export type InputProps = ExtractPropTypes export type InputPropsPublic = __ExtractPublicPropTypes export const inputEmits = { [UPDATE_MODEL_EVENT]: (value: string) => isString(value), input: (value: string) => isString(value), change: (value: string, evt?: Event) => isString(value) && (evt instanceof Event || evt === undefined), focus: (evt: FocusEvent) => evt instanceof FocusEvent, blur: (evt: FocusEvent) => evt instanceof FocusEvent, clear: () => true, mouseleave: (evt: MouseEvent) => evt instanceof MouseEvent, mouseenter: (evt: MouseEvent) => evt instanceof MouseEvent, // NOTE: when autofill by browser, the keydown event is instanceof Event, not KeyboardEvent // relative bug report https://github.com/element-plus/element-plus/issues/6665 keydown: (evt: KeyboardEvent | Event) => evt instanceof Event, compositionstart: (evt: CompositionEvent) => evt instanceof CompositionEvent, compositionupdate: (evt: CompositionEvent) => evt instanceof CompositionEvent, compositionend: (evt: CompositionEvent) => evt instanceof CompositionEvent, } export type InputEmits = typeof inputEmits