# Bricks UI 组件技术文档
> **版本**: 1.0
> **作者**: Bricks Framework Team
> **描述**: `bricks.UiType` 及其子类构成了一套用于构建表单输入控件的组件体系,支持文本、密码、数字、日期、文件上传、选择框等多种输入类型。所有组件均继承自统一基类 `bricks.UiType`,并可通过工厂模式动态创建。
---
## 目录
- [概述](#概述)
- [核心基类](#核心基类)
- [`bricks.UiType`](#bricksuitype)
- [`bricks.UiHide`](#bricksuihide)
- [基础输入控件](#基础输入控件)
- [`bricks.UiStr`](#bricksuistr)
- [`bricks.UiPassword`](#bricksuipassword)
- [`bricks.UiInt`](#bricksuiint)
- [`bricks.UiFloat`](#bricksuifloat)
- [`bricks.UiTel`](#bricksuitel)
- [`bricks.UiEmail`](#bricksuiemail)
- [`bricks.UiDate`](#bricksuidate)
- [`bricks.UiText`](#bricksuitext)
- [`bricks.UiCode`](#bricksuicode)
- [复合与特殊控件](#复合与特殊控件)
- [`bricks.UiCheck`](#bricksuicheck)
- [`bricks.UiCheckBox`](#bricksuicheckbox)
- [`bricks.UiSearch`](#bricksuisearch)
- [多媒体输入控件](#多媒体输入控件)
- [`bricks.UiFile`](#bricksuifile)
- [`bricks.UiImage`](#bricksuiimage)
- [`bricks.UiAudio`](#bricksuiaudio)
- [`bricks.UiVideo`](#bricksuivideo)
- [工厂系统](#工厂系统)
- [`bricks._Input`](#bricks_input)
- [`Input` 工厂实例](#input-工厂实例)
---
## 概述
该模块提供了一个可扩展的 UI 输入组件框架,基于 JavaScript 类和 DOM 封装,实现以下特性:
- 统一接口:所有输入控件都实现了 `getValue()`, `setValue()`, `reset()`, `resultValue()` 等方法。
- 表单集成:支持通过 `set_formdata(formData)` 方法将值附加到 `FormData` 对象中。
- 值校验与格式化:通过正则表达式(`pattern`)进行输入过滤。
- 动态数据加载:如 `UiCode` 和 `UiCheckBox` 支持从 URL 异步加载选项数据。
- 用户交互事件:支持 `focus`, `blur`, `changed`, `keydown` 等事件绑定。
- 国际化支持:标签文本使用 `bricks.app.i18n._()` 进行翻译。
- 多媒体录制支持:图像、音频、视频可通过摄像头/麦克风直接采集。
---
## 核心基类
### `bricks.UiType`
**继承自**: `bricks.Layout`
**用途**: 所有输入控件的抽象基类,定义通用行为。
#### 构造函数
```js
new bricks.UiType(opts)
```
| 参数 | 类型 | 必需 | 描述 |
|------|------|------|------|
| `opts.name` | String | 是 | 控件名称(对应表单字段名) |
| `opts.value` / `opts.defaultvalue` | Any | 否 | 初始值或默认值 |
| `opts.required` | Boolean | 否 | 是否为必填项 |
#### 属性
| 属性 | 类型 | 描述 |
|------|------|------|
| `name` | String | 字段名称 |
| `value` | Any | 当前值 |
| `required` | Boolean | 是否必填 |
| `ctype` | String | 内部类型标识,默认 `'text'` |
| `dom_element` | HTMLElement | 渲染后的 DOM 元素 |
#### 方法
| 方法 | 说明 |
|------|------|
| `getValue()` → Object | 返回 `{ name: value }`,若存在用户数据则合并返回 |
| `set_formdata(formData)` | 将当前值添加到 `FormData` 中 |
| `resultValue()` → Any | 获取实际提交值(子类重写) |
| `focus()` | 聚焦输入元素 |
| `reset()` | 重置为初始值 |
| `setValue(v)` | 设置值并更新 DOM |
| `set_disabled(f)` | 设置禁用状态 |
| `set_readonly(f)` | 设置只读状态 |
| `set_required(f)` | 设置是否必填 |
---
### `bricks.UiHide`
**继承自**: `bricks.UiType`
**用途**: 隐藏字段,不显示但可携带数据。
#### 特性
- `uitype = 'hide'`
- 自动设置 `display: none` 样式
#### 示例
```js
new bricks.UiHide({ name: 'user_id', value: '12345' })
```
---
## 基础输入控件
### `bricks.UiStr`
**继承自**: `bricks.UiType`
**用途**: 单行文本输入框。
#### 支持配置项 (`opts`)
| 属性 | 类型 | 说明 |
|------|------|------|
| `align` | String | 文本对齐方式:`left`, `center`, `right` |
| `length` | Number | 最大字符数(maxlength) |
| `minlength` | Number | 最小字符数 |
| `tip` | String | 提示信息(暂未使用) |
| `width` | String | 宽度(CSS 单位) |
| `readonly` | Boolean/String | 是否只读 |
| `required` | Boolean | 是否必填 |
| `placeholder` | String | 占位符文本(自动国际化) |
| `css` | String | 自定义 CSS 类名 |
| `dynsize` | Boolean | 是否启用动态字体适配 |
| `cfontsize` | Number | 字体缩放比例 |
#### 方法扩展
- `create()`:创建 ``
- `check_pattern(value)`:用正则校验输入
- `set_value_from_input(event)`:输入时触发值更新与事件派发
- `onfocus/onblur`:焦点处理,添加高亮样式
#### 示例
```js
new bricks.UiStr({
name: 'username',
placeholder: 'Enter your username',
required: true,
width: '200px'
})
```
---
### `bricks.UiPassword`
**继承自**: `bricks.UiStr`
**用途**: 密码输入框。
#### 特性
- `type="password"`
- `uitype='password'`
#### 示例
```js
new bricks.UiPassword({ name: 'password', placeholder: '******' })
```
---
### `bricks.UiInt`
**继承自**: `bricks.UiStr`
**用途**: 整数输入。
#### 特性
- `type="number"`
- `textAlign: right`
- 正则匹配:`\d*`
- `resultValue()` 返回 `parseInt(value)`
#### 示例
```js
new bricks.UiInt({ name: 'age', length: 3 })
```
---
### `bricks.UiFloat`
**继承自**: `bricks.UiInt`
**用途**: 浮点数输入。
#### 特性
- 正则匹配:`\d*\.?\d+`
- 支持小数位控制(`dec_len`)
- 自动设置 `step` 属性以限制精度
| 参数 | 默认值 | 说明 |
|------|--------|------|
| `dec_len` | 2 | 小数位数 |
#### 示例
```js
new bricks.UiFloat({ name: 'price', dec_len: 2 })
```
---
### `bricks.UiTel`
**继承自**: `bricks.UiStr`
**用途**: 电话号码输入。
#### 特性
- `type="tel"`
- 默认正则:`[+]?\\d+`
- 支持自定义 `pattern`
#### 示例
```js
new bricks.UiTel({ name: 'phone', pattern: '[0-9]{11}' })
```
---
### `bricks.UiEmail`
**继承自**: `bricks.UiStr`
**用途**: 邮箱地址输入。
#### 特性
- `type="email"`
- 可选自定义 `pattern`
#### 示例
```js
new bricks.UiEmail({ name: 'email', required: true })
```
---
### `bricks.UiDate`
**继承自**: `bricks.UiStr`
**用途**: 日期选择器。
#### 支持配置
| 属性 | 说明 |
|------|------|
| `max_date` | 最大允许日期(字符串格式 YYYY-MM-DD) |
| `min_date` | 最小允许日期 |
#### 特性
- `type="date"`
- 若值为空,`resultValue()` 返回 `null`
#### 示例
```js
new bricks.UiDate({
name: 'birth_date',
min_date: '1900-01-01',
max_date: '2024-12-31'
})
```
---
### `bricks.UiText`
**继承自**: `bricks.UiType`
**用途**: 多行文本域(textarea)。
#### 支持配置
| 属性 | 类型 | 说明 |
|------|------|------|
| `rows` | Number | 行数 |
| `cols` | Number | 列数 |
| `height` | String | 高度(默认 `'200px'`) |
#### 特性
- 支持 Tab 缩进(每 4 空格)
- Shift+Tab 删除缩进
- Enter 换行(阻止默认行为)
- 支持代码编辑风格缩进逻辑
#### 方法
| 方法 | 说明 |
|------|------|
| `handle_tab_indent(erase)` | 处理 Tab 缩进或反向删除 |
| `handle_enter()` | 插入换行并保持光标位置 |
#### 示例
```js
new bricks.UiText({ name: 'description', rows: 6, cols: 50 })
```
---
### `bricks.UiCode`
**继承自**: `bricks.UiType`
**用途**: 下拉选择框(类似 `