定价

OTPInput 使用手册

v1.1.0<br> · @snowui-design-system/components

许可阅读:首次阅读组件文档、源码或 npm 使用流程,先读完整 LICENSE;同任务同版本去重。

组件介绍

提供 4–8 位数字一次性验证码输入,支持整码粘贴、短信自动填充、原生表单提交与重置。

使用选择

用于输入已经由业务或身份服务发送的一次性数字验证码。组件只负责输入,不负责发送短信、倒计时或验证验证码。

  • 默认 6 位,可选 4、5、6、7、8 位;普通输入会过滤非数字并限制长度;粘贴严格校验,规则见下文。

  • oncomplete 仅在用户输入产生一个新的完整值时触发;初始化、外部赋值和相同完整值重复同步不触发。

  • name、form、required、disabled、readonly 与 autocomplete="one-time-code" 均落到真实 input。

快速开始

<script lang="ts">    import { OTPInput } from "@snowui-design-system/components";    let code = $state("");</script> <OTPInput bind:value={code} aria-label="Verification code" oncomplete={(value) => console.log(value)} />

API

关键字 类型 默认值 描述
value string "" 过滤后的数字值,支持 bind:value;外部更新会同步显示。
defaultValue string — 未提供 value 时的初始值,也是原生表单 reset 的恢复值;同时提供两者时 value 决定当前显示,defaultValue 决定 reset 基线。
length OTPLength 6 验证码位数;改变时立即按新长度截断值并重建格数。
oncomplete (value: string) => void — 用户输入首次形成新的完整值时回调;初始化、外部赋值和重复相同值不触发。
name string — 原生字段名;启用时由 FormData 收集过滤后的完整或部分值。
form string — 按 id 关联外部 form。
disabled boolean false 禁止聚焦与编辑;字段不参与 FormData。
readonly boolean false 允许聚焦、选择与提交,但禁止编辑。
required boolean false 启用原生必填校验。
autocomplete HTMLInputAttributes["autocomplete"] "one-time-code" 默认启用短信验证码自动填充语义。
autofocus boolean — 请求页面加载后聚焦;应避免与其他自动聚焦控件竞争。
tabindex number — 原生焦点顺序。
id string — 真实 input id,可由 label 的 for 关联。
title string — 原生提示;不替代可访问名称。
invalid boolean false 调用方控制的持续错误态,输出 aria-invalid、Input 同款边框/聚焦环/错误文字与 shake;不会被内置 2 秒计时器清除。
error string | Snippet locale 文案 错误文字或内容;显式值优先于 locale 默认文案。
oninput (event: Event) => void — 用户输入已归一化或有效粘贴已写入后回调;拒绝粘贴不会触发。
onchange (event: Event) => void — 转发真实 input 的原生 change 事件。
onfocus (event: FocusEvent) => void — 真实 input 获得焦点、同步活动格后回调。
onblur (event: FocusEvent) => void — 真实 input 失去焦点、隐藏激活框后回调。
onkeydown (event: KeyboardEvent) => void — 原生按键处理前回调,可通过 preventDefault 取消默认行为。
onpaste (event: ClipboardEvent) => void — 校验粘贴内容前回调;preventDefault 可取消整次组件粘贴处理。
class / style / Frame Props FrameProps — 适用能力应用于公开根 Frame;tag、children 和 F-03B enableScaleObserver 不公开,合法原生属性由共享分流器只传给 input。

公开样式覆盖:--snowui-otp-input-gap-override、--snowui-otp-input-size-override、--snowui-otp-input-radius-override、--snowui-otp-input-font-size-override、--snowui-otp-input-line-height-override。

使用边界与详细说明

  • 单一真实 <input type="text" inputmode="numeric"> 负责键盘、选择、删除、替换、自动填充、表单和辅助技术;根 role="group" 与 input 共享显式可访问名称,分格为 aria-hidden 视觉层。错误通过 aria-describedby 关联,并由 polite 状态区播报。

  • 点击任意格会选择对应字符,因此下一次键入替换该格;活动格跟随 input 的真实 selection。原生方向键、Home、End、Backspace、Delete、选择替换与撤销行为保持可用。

  • 普通输入只保留 ASCII 数字 0–9,自动激活右侧下一格;点击或方向键不能跳到第一未填格之后。已填格可点击选择并替换。

  • 粘贴先检查全部内容,空白、分隔符、字母、全角数字等均视为非数字,不做静默过滤。

  • 粘贴长度恰好等于 length 时,无论当前激活位置都从首格完整覆盖。

  • 在后续格(index > 0)粘贴,只要已有连续前缀且不超过右侧剩余格数,就从当前格补入;允许未填满。例如 4 位码已有 12,第三格粘贴 34 得到 1234,粘贴 3 得到 123。

  • 在首格粘贴不足/超长数字时清空全部内容并报错;在后续格粘贴超出剩余格数,或粘贴非数字时,拒绝整次粘贴并保留原值。

  • 内置粘贴错误使用 Input 同款边框、聚焦环、shake 和错误文字,持续 2 秒后恢复;再次无效粘贴重新计时。reset、卸载清理 timer;错误期间不锁定输入。外部 invalid 仍由调用方负责。

  • 激活框通过 TAB_INDICATOR_MOTION 平移,数字出现/替换通过 NUMBER_POP_APPEAR_MOTION;reduced-motion 保持值、语义和焦点,直接呈现最终位置。

  • 调用方必须提供 aria-label、aria-labelledby 或关联 <label>。disabled 不提交,readonly 仍提交。

  • form reset 默认恢复 defaultValue,未提供时恢复首次 value;取消的 reset 保留当前值。监听按当前 input.form 判定,因此 form 改变后自动关联新表单。reset 的零延迟收尾 timer 在重复 reset 或卸载时清理。

OTPInput 样式覆盖

先阅读 完整 LICENSE;同任务、同版本、同范围去重。

优先用组件公开 Props 匹配合适样式,尽可能保留原有视觉。确需改写时按 样式选择与改写顺序 使用自己的 class(含项目已有 Tailwind)或实例 style。以下名称来自源码实际消费的公开 override;先核对目标作用域,不修改私有 DOM。采用 SnowUI Token 时选择正确类别,外部应用不被要求安装一方 utilities。

变量 用途与默认参考
--snowui-otp-input-font-size-override default: var(--text-16)
--snowui-otp-input-gap-override default: var(--gap-2)
--snowui-otp-input-line-height-override default: var(--leading-14)
--snowui-otp-input-radius-override default: var(--radius-3)
--snowui-otp-input-size-override default: var(--size-10)

设计指南 · Token · 组合边界

OTPInput 类型与状态

必填属性:无具名必填属性。

可双向绑定:bind:value。

继承声明:Omit<FrameProps, "tag" | "children" | "enableScaleObserver" | "oninput" | "onchange" | "onfocus" | "onblur" | "onkeydown" | "onpaste">。继承能力以基类公开文档为准;Omit 中的字段已排除,不能按基类原样使用。

共享 Frame API · 返回 API

以下为公开属性实际引用的类型声明,来自源码;Svelte Snippet 表示内容片段,ComponentProps 表示对应组件的 Props。

OTPLength

来源:components/src/components/OTPInput.svelte

export type OTPLength = 4 | 5 | 6 | 7 | 8;

外部类型来源:

  • HTMLInputAttributes — svelte/elements