Input 使用手册
v1.2.0 · @snowui-design-system/components
许可阅读:首次阅读组件文档、源码或 npm 使用流程,先读完整 LICENSE;同任务同版本去重。公开 API 配置与内部实现修改分别按许可处理;全部组件使用统一运行包,源码权益以许可为准。
组件介绍
提供单行输入,支持文本、搜索、密码、数字、日期时间与颜色,可组合标签、图标和校验反馈。
使用选择
用于单行文本输入。搜索用 SearchInput,多行输入用 Textarea;需要 label、帮助和错误时组合 Field。
bind:value同步编辑值,显式 value 优先于 defaultValue;数字类型输入后的值仍需业务自行转换。name 用于表单提交,受控表单重置时恢复绑定初值;bind:element 得到外层元素,不能当作原生 input。
file / range 不提供上传或滑杆能力;附件用 leading / trailing 角色,清除按钮可接管 trailing。
快速开始
以下示例展示推荐的基本组合。更多场景与组合限制见后文。
API
未重新声明的继承能力请查所属基础组件文档;本表只列本组件源码具名公开属性。
使用边界与详细说明
表单组合与间距
基础节奏统一:
Field默认padding = 12 / 16,gap = 8Input单独使用时:组件自身带12 / 16padding 和8gapicon 位置由
Input自己控制:leading / trailing icon 到最近可见内边界默认都是16px错误态内建 warning icon 也走同一条 trailing icon 规则,不额外使用 overlay 偏移
放进
Field后,先看有没有as="segment"没有
as="segment":由外层Field负责12 / 16padding 与8gap;Input去掉自身 padding,但保留自身 gap有
as="segment":这是连续字段表面的一段;保留Input自身的 padding 与 gap,同时继续由Input保证 icon 到边框 / 分割线的距离为16pxsegment之间才有分割线:横向是左右分割线,纵向是上下分割线相邻
segment之间只能有一条分割线,不能重复画线label / description / error不负责 padding、gap、分割线,它们只是内容元素普通
label + host + error:不作为 padding、gap 的判断依据,只负责文字内容Field row或Field column里,如果是连续输入段,子项要显式写as="segment"
组件定位
Input 现在的推荐定位是字段宿主,而不是完整字段外壳:
单独使用时,仍可保持兼容性的默认输入框表现
放进
Field容器后,未标segment时由外层Field接管 padding 与 gap;只有标记为segment时才保留Input自身留白因此
Input可以和Icon / Text / Checkbox / Switch / Badge / Frame as="row"一起组合成更复杂的表单表面其中
text直接使用可见原生<input>;date/color仍保留“可见展示层 + 隐藏原生宿主同步值”的结构
Frame 能力继承
Input 仍然通过外层 Frame 承接通用能力,因此可以继续使用:
responsive / stateStyle / customStates / variants / stylesHover / Click / Focus / whileAppear / timeline / orchestrateloading / skeleton / renderHintsas / use / layoutId / itemId / scope / access
Input 的职责不是替代 Frame,而是在 Frame 外壳内承接输入协议。 对于 text,组件直接复用原生 <input> 的可见渲染与事件链路;对于 date / color,组件会把“值同步、表单归属、picker 打开”交给隐藏原生宿主,把“可见文本/颜色展示”交给自定义展示层。
错误反馈 Shake
invalid 表示稳定错误视觉:红色边框、aria-invalid 与内建 warning icon。输入错误时的一次性 shake 已默认接入,消费方不需要传额外 prop,也不需要知道内部 CSS 类名。
推荐写法保持为普通错误态:
独立 Input 遇到 invalid / aria-invalid 会自动播放 shake。进入 Field 后,Input 不单独抖动,由外层 Field 汇总错误态并整体反馈,避免嵌套位移叠加。
错误态与 shake 不会自动聚焦,也不会模拟 focus-within;焦点态只来自用户真实聚焦、显式 autofocus 或业务代码主动调用 focus()。
组件特有属性 (Component-Specific Props)
下表逐项对应具名 Props;未重新声明的通用能力见 Frame。
布局模型
主布局模型:槽位宿主布局。定义见 ../../../specs/maintainers/LayoutProtocol.md §12.3(源码参考:specs/maintainers/LayoutProtocol.md)。
根宿主固定采用单行内容协议,Leading / Control / Trailing 之间的有效间距至少为 4 CSS px;显式 gap={0}、根字号或间距缩放不会压低该下限,较大的原有首选间距保持。Field 只编排外部区域与连续字段表面,不改写 Input 自己的内部布局或附件间距。日期分段、颜色文本与绘制结构的内部零间距不受影响。
Input 的根布局固定按 Leading / Control / Trailing 三段组织:
根节点是
Frame row,并在组件内部固定启用enableAutoLayout;外部传入enableAutoLayout={false}不关闭 Input 的内部槽位协议。直系
as="leading"/as="trailing"支持复杂结构,Leading 与 Trailing 为 Hug。原生
<input>或自定义 date/color 可见层是 Content,负责 Fill,必须保持min-width: 0。自定义 trailing 存在时替换默认日期/清除等末位槽;内建 warning icon 仍按组件内部 trailing 规则处理。
进入
Field后,Field 只接管字段表面、padding 与分割线;Input 内部 icon / control 的最终落列仍由 Input 自己维护。
浮层搜索输入模式
将 <Input as="search"> 放入任意提供 header portal 的浮层容器(<Listbox> / <Popover>)内,Input 自动:
通过
LISTBOX_HEADER_PORTAL_KEYcontext 读取 headerEl,挂载后appendChild到固定头部(不参与下方滚动);应用紧凑浮层规格(
padding/gap/radius);:focus-within时关闭外扩 focus ring(--snowui-field-focus-ring-width: 0rem);未显式
maxlength时默认 100。
Listbox 场景额外接通 ListboxOwnerContext.setFilterText 过滤逻辑(由 listboxOwner 派生量 isListboxSearch 控制);Popover 场景仅承担"固定头部输入框"的视觉与移位,无过滤副作用。
样式选择器统一为 :where(.snowui-quick-action-panel-header > .snowui-input, .snowui-listbox-header > .snowui-input, .snowui-listbox > .snowui-input, ...),避免各浮层重复覆盖。
行为说明
搜索文本通过
oninput实时写入ListboxOwnerContext.filterText,由 Select 的filteredOptionsderived 做大小写不敏感过滤自定义项(
allowCustomValue添加的)不参与过滤,始终显示Listbox 关闭时 Input 值与 filterText 同步清零
自定义项 hover 时,✔ 图标位置替换为 × 圆形删除按钮(复用 Input 的清除按钮 SVG);点击 × 删除该自定义项,若该项为当前选中值则同时清空选中
使用示例
原生能力边界
Input 负责:
原生
<input>属性透传value / defaultValue解析bind:value同步aria-invalid与组件invalid汇总
Input 不负责:
label / description 的完整字段排版(可组合 Field);error 可由公开 error 属性生成内置反馈
自动补全数据源生成
表单规则中心
业务级错误文案
使用示例
展示可打开、可复制的链接
“链接输入框 / 链接 input / 可复制链接”不是可编辑输入。使用 CopyLink,无边框和输入框 hover 动效;链接文字 hover 显示下划线、点击在新标签页打开,其余区域点击复制。完整组合约定见 自然语言映射(源码参考:specs/reference/NaturalLanguageToSnowUI.md)。Input 保留给需要编辑地址或只读选择值的场景。
无障碍与表单建议
需要自动填充时,优先传
name + autocomplete需要原生建议列表时,使用
list关联datalist需要错误提示时,外部通过
aria-describedby指向Field内的描述/错误节点需要 schema/业务校验时,应在
Field或表单层处理,再把结果回传为invalid或aria-invalid
Input 样式覆盖
先阅读 完整 LICENSE;同任务、同版本、同范围去重。
优先用组件公开 Props 匹配合适样式,尽可能保留原有视觉。确需改写时按 样式选择与改写顺序 使用自己的 class(含项目已有 Tailwind)或实例 style。以下名称来自源码实际消费的公开 override;先核对目标作用域,不修改私有 DOM。采用 SnowUI Token 时选择正确类别,外部应用不被要求安装一方 utilities。
Input 类型与状态
必填属性:无具名必填属性。
可双向绑定:bind:value、bind:element。
继承声明:Omit<FrameProps, "tag">。继承能力以基类公开文档为准;Omit 中的字段已排除,不能按基类原样使用。
以下为公开属性实际引用的类型声明,来自源码;Svelte Snippet 表示内容片段,ComponentProps 表示对应组件的 Props。
InputValue
来源:components/src/components/Input.svelte
ComponentPartsOf
来源:components/src/logic/component-parts.svelte.ts
ConfigurableComponentPartProps
来源:components/src/logic/component-parts.svelte.ts
ComponentPartControlledKey
来源:components/src/logic/component-parts.svelte.ts
外部类型来源:
HTMLInputAttributes — svelte/elements