UNPKG

mdui

Version:

实现 material you 设计规范的 Web Components 组件库

409 lines (408 loc) 18.3 kB
import '@mdui/jq/methods/css.js'; import { MduiElement } from '@mdui/shared/base/mdui-element.js'; import '@mdui/shared/icons/cancel--outlined.js'; import '@mdui/shared/icons/error.js'; import '@mdui/shared/icons/visibility-off.js'; import '@mdui/shared/icons/visibility.js'; import '../button-icon.js'; import '../icon.js'; import type { FormControl } from '@mdui/jq/shared/form.js'; import type { CSSResultGroup, TemplateResult } from 'lit'; declare const TextField_base: import("@lit/reactive-element/decorators/base.js").Constructor<import("@mdui/shared/mixins/focusable.js").FocusableMixinInterface> & typeof MduiElement; /** * @summary 文本框组件 * * ```html * <mdui-text-field label="Text Field"></mdui-text-field> * ``` * * @event focus - 获得焦点时触发 * @event blur - 失去焦点时触发 * @event change - 在文本框的值变更,且失去焦点时触发 * @event input - 在文本框的值变更时触发 * @event invalid - 表单字段验证不通过时触发 * @event clear - 在点击由 `clearable` 属性生成的清空按钮时触发。可以通过调用 `event.preventDefault()` 阻止清空文本框 * * @slot icon - 左侧图标 * @slot end-icon - 右侧图标 * @slot error-icon - 验证失败状态的右侧图标 * @slot prefix - 左侧文本 * @slot suffix - 右侧文本 * @slot clear-button - 清空按钮 * @slot clear-icon - 清空按钮中的图标 * @slot toggle-password-button - 密码显示状态切换按钮 * @slot show-password-icon - 显示密码状态下,密码显示状态切换按钮中的图标 * @slot hide-password-icon - 隐藏密码状态下,密码显示状态切换按钮中的图标 * @slot helper - 底部的帮助文本 * * @csspart container - 文本框容器 * @csspart icon - 左侧图标 * @csspart end-icon - 右侧图标 * @csspart error-icon - 验证失败状态的右侧图标 * @csspart prefix - 左侧文本 * @csspart suffix - 右侧文本 * @csspart label - 上方的标签文本 * @csspart input - 内部的 `<input>` 或 `<textarea>` 元素 * @csspart clear-button - 清空按钮 * @csspart clear-icon - 清空按钮中的图标 * @csspart toggle-password-button - 密码显示状态切换按钮 * @csspart show-password-icon - 显示密码状态下,密码显示状态切换按钮中的图标 * @csspart hide-password-icon - 隐藏密码状态下,密码显示状态切换按钮中的图标 * @csspart supporting - 底部辅助信息容器,包括 helper、error、counter * @csspart helper - 底部的帮助文本 * @csspart error - 底部的错误描述文本 * @csspart counter - 底部右侧的字数统计 */ export declare class TextField extends TextField_base<TextFieldEventMap> implements FormControl { static styles: CSSResultGroup; /** * 文本框的形状。默认为 `filled`。可选值包括: * * * `filled`:带背景色的文本框,视觉效果较强 * * `outlined`:带边框的文本框,视觉效果较弱 */ variant: /*带背景色的文本框,视觉效果较强*/ 'filled' | /*带边框的文本框,视觉效果较弱*/ 'outlined'; /** * 文本框输入类型。默认为 `text`。可选值包括: * * * `text`:默认值。文本字段 * * `number`:只能输入数字。拥有动态键盘的设备上会显示数字键盘 * * `password`:用于输入密码,其值会被遮盖 * * `url`:用于输入 URL,会验证 URL 格式。在支持动态键盘的设备上有相应的键盘 * * `email`:用于输入邮箱地址,会验证邮箱格式。在支持动态键盘的设备上有相应的键盘 * * `search`:用于搜索框。拥有动态键盘的设备上的回车图标会变成搜索图标 * * `tel`:用于输入电话号码。拥有动态键盘的设备上会显示电话数字键盘 * * `hidden`:隐藏该控件,但其值仍会提交到服务器 * * `date`:输入日期的控件(年、月、日,不包括时间)。在支持的浏览器激活时打开日期选择器或年月日的数字滚轮 * * `datetime-local`:输入日期和时间的控件,不包括时区。在支持的浏览器激活时打开日期选择器或年月日的数字滚轮 * * `month`:输入年和月的控件,没有时区 * * `time`:用于输入时间的控件,不包括时区 * * `week`:用于输入以年和周数组成的日期,不带时区 */ type: /*默认值。文本字段*/ 'text' | /*只能输入数字。拥有动态键盘的设备上会显示数字键盘*/ 'number' | /*用于输入密码,其值会被遮盖*/ 'password' | /*用于输入 URL,会验证 URL 格式。在支持动态键盘的设备上有相应的键盘*/ 'url' | /*用于输入邮箱地址,会验证邮箱格式。在支持动态键盘的设备上有相应的键盘*/ 'email' | /*用于搜索框。拥有动态键盘的设备上的回车图标会变成搜索图标*/ 'search' | /*用于输入电话号码。拥有动态键盘的设备上会显示电话数字键盘*/ 'tel' | /*隐藏该控件,但其值仍会提交到服务器*/ 'hidden' | /*输入日期的控件(年、月、日,不包括时间)。在支持的浏览器激活时打开日期选择器或年月日的数字滚轮*/ 'date' | /*输入日期和时间的控件,不包括时区。在支持的浏览器激活时打开日期选择器或年月日的数字滚轮*/ 'datetime-local' | /*输入年和月的控件,没有时区*/ 'month' | /*用于输入时间的控件,不包括时区*/ 'time' | /*用于输入以年和周数组成的日期,不带时区*/ 'week'; /** * 文本框名称,将与表单数据一起提交 */ name: string; /** * 文本框的值,将与表单数据一起提交 */ value: string; /** * 默认值。在重置表单时,将重置为该默认值。该属性只能通过 JavaScript 属性设置 */ defaultValue: string; /** * 标签文本 */ label?: string; /** * 占位符文本 */ placeholder?: string; /** * 文本框底部的帮助文本。也可以通过 `slot="helper"` 设置 */ helper?: string; /** * 是否仅在获得焦点时,显示底部的帮助文本 */ helperOnFocus: boolean; /** * 是否可清空文本框内容 */ clearable: boolean; /** * 可清空文本框时,显示在文本框右侧的清空按钮的 Material Icons 图标名。也可以通过 `slot="clear-icon"` 设置 */ clearIcon?: string; /** * 是否将文本右对齐 */ endAligned: boolean; /** * 文本框的前缀文本。只在文本框聚焦或有值时显示。也可以通过 `slot="prefix"` 设置 */ prefix: string; /** * 文本框的后缀文本。只在文本框聚焦或有值时显示。也可以通过 `slot="suffix"` 设置 */ suffix?: string; /** * 文本框的前缀图标的 Material Icons 图标名。也可以通过 `slot="icon"` 设置 */ icon?: string; /** * 文本框的后缀图标的 Material Icons 图标名。也可以通过 `slot="end-icon"` 设置 */ endIcon?: string; /** * 表单字段验证失败时,显示在文本框右侧的 Material Icons 图标名。也可以通过 `slot="error-icon"` 设置 */ errorIcon?: string; /** * 关联的 `<form>` 元素。此属性值应为同一页面中的一个 `<form>` 元素的 `id`。 * * 如果未指定此属性,则该元素必须是 `<form>` 元素的子元素。通过此属性,你可以将元素放置在页面的任何位置,而不仅仅是 `<form>` 元素的子元素。 */ form?: string; /** * 是否为只读模式 */ readonly: boolean; /** * 是否禁用输入框 */ disabled: boolean; /** * 提交表单时,是否必须填写该字段 */ required: boolean; /** * 文本框的固定显示行数 */ rows?: number; /** * 是否根据输入内容自动调整文本框高度 */ autosize: boolean; /** * `autosize` 为 `true` 时,文本框的最小行数 */ minRows?: number; /** * `autosize` 为 `true` 时,文本框的最大行数 */ maxRows?: number; /** * 允许输入的最小字符数 */ minlength?: number; /** * 允许输入的最大字符数 */ maxlength?: number; /** * 是否显示字数统计,只在 `maxlength` 被指定时有效 */ counter: boolean; /** * 当 `type` 为 `number` 时,允许输入的最小数值 */ min?: number; /** * 当 `type` 为 `number` 时,允许输入的最大数值 */ max?: number; /** * `type` 为 `number` 时,数值增减的步长 */ step?: number; /** * 用于表单验证的正则表达式 */ pattern?: string; /** * `type` 为 `password` 时,设置此属性会添加一个切换按钮,用于在明文和密文之间切换 */ togglePassword: boolean; /** * 密码切换按钮的 Material Icons 图标,当密码为明文时显示。也可以通过 `slot="show-password-icon"` 设置 */ showPasswordIcon?: string; /** * 密码切换按钮的 Material Icons 图标,当密码为密文时显示。也可以通过 `slot="hide-password-icon"` 设置 */ hidePasswordIcon?: string; /** * iOS 的非标准属性,用于控制文本首字母是否自动大写。在 iOS5 及以后的版本上有效。可选值包括: * * * `none`:禁用首字母大写 * * `sentences`:句子首字母大写 * * `words`:单词首字母大写 * * `characters`:所有字母大写 */ autocapitalize: /*禁用首字母大写*/ 'none' | /*句子首字母大写*/ 'sentences' | /*单词首字母大写*/ 'words' | /*所有字母大写*/ 'characters'; /** * `input` 元素的 `autocorrect` 属性 */ autocorrect?: string; /** * `input` 元素的 `autocomplete` 属性 */ autocomplete?: string; /** * `input` 元素的 `enterkeyhint` 属性,用于定制虚拟键盘上的 Enter 键的显示文本或图标。具体显示效果取决于用户使用的设备和语言。可选值包括: * * * `enter`:插入新行 * * `done`:完成输入,关闭虚拟键盘 * * `go`:导航到输入文本的目标 * * `next`:移动到下一个输入项 * * `previous`:移动到上一个输入项 * * `search`:导航到搜索结果 * * `send`:发送文本信息 */ enterkeyhint?: /*插入新行*/ 'enter' | /*完成输入,关闭虚拟键盘*/ 'done' | /*导航到输入文本的目标*/ 'go' | /*移动到下一个输入项*/ 'next' | /*移动到上一个输入项*/ 'previous' | /*导航到搜索结果*/ 'search' | /*发送文本信息*/ 'send'; /** * 是否启用拼写检查 */ spellcheck: boolean; /** * `input` 元素的 `inputmode` 属性,用于定制虚拟键盘的类型。可选值包括: * * * `none`:无虚拟键盘。在需要实现自己的键盘输入控件时很有用 * * `text`:标准文本输入键盘 * * `decimal`:小数输入键盘,除了数字之外可能会有小数点 `.` 或者千分符逗号 `,` * * `numeric`:显示 0-9 的数字键盘 * * `tel`:手机数字键盘,包含 0-9 数字、星号 `*` 或者井号 `#` 键 * * `search`:为搜索输入优化的虚拟键盘,提交按钮通常会显示 `search` 或者 “搜索” * * `email`:为邮件地址输入优化的虚拟键盘,通常会有 `@ .` 等键 * * `url`:为 URL 输入优化的虚拟键盘,通常会有 `. / #` 等键 */ inputmode?: /*无虚拟键盘。在需要实现自己的键盘输入控件时很有用*/ 'none' | /*标准文本输入键盘*/ 'text' | /*小数输入键盘,除了数字之外可能会有小数点 `.` 或者千分符逗号 `,`*/ 'decimal' | /*显示 0-9 的数字键盘*/ 'numeric' | /*手机数字键盘,包含 0-9 数字、星号 `*` 或者井号 `#` 键*/ 'tel' | /*为搜索输入优化的虚拟键盘,提交按钮通常会显示 `search` 或者 “搜索”*/ 'search' | /*为邮件地址输入优化的虚拟键盘,通常会有 `@ .` 等键*/ 'email' | /*为 URL 输入优化的虚拟键盘,通常会有 `. / #` 等键*/ 'url'; /** * 是否验证未通过 * * 该验证为浏览器原生验证 API,基于 `type`、`required`、`minlength`、`maxlength` 及 `pattern` 等属性的验证结果 */ private invalid; /** * 该属性设置为 true 时,则在样式上为 text-field 赋予 invalid 的状态。实际是否验证通过仍需根据 invalid 属性判断 * 该属性仅供 mdui 内部使用,当前 select 组件使用了该属性 */ private invalidStyle; /** * 该属性设置为 true 时,则在样式上为 text-field 赋予聚焦状态。实际是否聚焦仍然由 focusableMixin 控制 * 该属性仅供 mdui 内部使用,当前 select 组件使用了该属性 */ private focusedStyle; private isPasswordVisible; private hasValue; /** * 通过该属性传入了错误文案时,会优先显示该文案。需要配合 invalid=true 或 invalidStyle=true 使用 * 当前仅供 select 组件使用 */ private error; private observeResize?; private readonly inputRef; private readonly formController; private readonly hasSlotController; /** * 该属性设为 true 时,即使设置了 readonly,仍可以显示 clearable * 当前仅供 select 组件使用 */ private readonlyButClearable; /** * 表单验证状态对象,具体参见 [`ValidityState`](https://developer.mozilla.org/zh-CN/docs/Web/API/ValidityState) */ get validity(): ValidityState; /** * 如果表单验证未通过,此属性将包含提示信息。如果验证通过,此属性将为空字符串 */ get validationMessage(): string; /** * 获取当前值,并转换为 `number` 类型;或设置一个 `number` 类型的值。 * 如果值无法被转换为 `number` 类型,则会返回 `NaN`。 */ get valueAsNumber(): number; set valueAsNumber(newValue: number); protected get focusElement(): HTMLElement; protected get focusDisabled(): boolean; /** * 是否显示聚焦状态样式 */ private get isFocusedStyle(); /** * 是否渲染为 textarea。为 false 时渲染为 input */ private get isTextarea(); private onDisabledChange; private onValueChange; private onRowsChange; private onMaxRowsChange; private onMinRowsChange; connectedCallback(): void; disconnectedCallback(): void; /** * 选中文本框中的文本 */ select(): void; /** * 选中文本框中特定范围的内容 * * @param start 被选中的第一个字符的位置索引,从 `0` 开始。如果这个值比元素的 `value` 长度还大,则会被看作 `value` 最后一个位置的索引 * @param end 被选中的最后一个字符的*下一个*位置索引。如果这个值比元素的 `value` 长度还大,则会被看作 `value` 最后一个位置的索引 * @param direction 一个表示选择方向的字符串,可能的值有:`forward`、`backward`、`none` */ setSelectionRange(start: number, end: number, direction?: 'forward' | 'backward' | 'none'): void; /** * 将文本框中特定范围的文本替换为新的文本 * @param replacement 要插入的字符串 * @param start 要替换的字符的起止位置的索引。默认为当前用户选中的字符的起始位置的索引 * @param end 要替换的字符的结束位置的索引。默认为当前用户选中的字符的结束位置的索引 * @param selectMode 文本被替换后,选取的状态。可选值为: * * `select`:选择新插入的文本 * * `start`:将光标移动到新插入的文本的起始位置 * * `end`:将光标移动到新插入的文本的结束位置 * * `preserve`:默认值。尝试保留选取 */ setRangeText(replacement: string, start: number, end: number, selectMode?: 'select' | 'start' | 'end' | 'preserve'): void; /** * 检查表单字段是否通过验证。如果未通过,返回 `false` 并触发 `invalid` 事件;如果通过,返回 `true` */ checkValidity(): boolean; /** * 检查表单字段是否通过验证。如果未通过,返回 `false` 并触发 `invalid` 事件;如果通过,返回 `true`。 * * 如果验证未通过,还会在组件上显示验证失败的提示。 */ reportValidity(): boolean; /** * 设置自定义的错误提示文本。只要这个文本不为空,就表示字段未通过验证 * * @param message 自定义的错误提示文本 */ setCustomValidity(message: string): void; protected render(): TemplateResult; private setCustomValidityInternal; private onChange; private onClear; private onInput; private onInvalid; private onKeyDown; /** * textarea 不支持 pattern 属性,所以在 keyup 时执行验证 */ private onTextAreaKeyUp; private onTogglePassword; private getPatternErrorMsg; private setTextareaHeight; private renderLabel; private renderPrefix; private renderSuffix; private renderRightIcon; private renderClearButton; private renderTogglePasswordButton; private renderInput; private renderTextArea; /** * @param hasError 是否包含错误提示 * @param hasHelper 是否含 helper 属性或 helper slot */ private renderHelper; private renderCounter; } export interface TextFieldEventMap { focus: FocusEvent; blur: FocusEvent; change: CustomEvent<void>; input: CustomEvent<void>; invalid: CustomEvent<void>; clear: CustomEvent<void>; } declare global { interface HTMLElementTagNameMap { 'mdui-text-field': TextField; } } export {};