Vercel の UI SDK 0.1.0-beta.2 上に構築。API は変わる可能性があります。
Password input
Vercel の UI SDK で作るパスワード欄。表示・非表示の切り替え、Caps Lock の通知、強度メーター、パスワードマネージャー向けの正しい autocomplete を備えます。
- フォームのコンポーネント
- 6 個のパーツ
- 10 個の例
@tabler/icons-react@ui-sdk/core@ui-sdk/react
pnpm dlx shadcn@latest add https://hextaui.com/r/ui-sdk-password-input.jsonコンポーネント、HextaUIのテーマトークン、依存するHextaUIコンポーネントを追加します。
まだ追加していない場合は、グローバルCSSにテーマトークンを追加してください。
依存関係をインストールします。
pnpm add @ui-sdk/react@0.1.0-beta.2 @ui-sdk/core@0.1.0-beta.2 @tabler/icons-react cn次のコードをコピーしてプロジェクトに貼り付けてください。
components/ui/ui-sdk-password-input.tsx インポートパスは、お使いのプロジェクト構成に合わせて更新してください。
UI SDK は ui-sdk というカスケードレイヤーに少しだけ独自の CSS を追加します。自分のクラスが優先されるよう、グローバルスタイルシートの先頭、Tailwind の import より上でこのレイヤーを宣言してください。
コントロールはネイティブのパスワード欄のままなので、パスワードマネージャー、自動入力、フォーム送信はほかと同じように動きます。name、required、autoComplete などのフォーム設定は PasswordInput に、id や placeholder などの input 属性は PasswordInputControl に付けます。
autoComplete の既定はサインイン用の current-password です。登録やパスワード変更では new-password を使うとブラウザが強いパスワードを提案し、アカウントのパスワードではない秘密には off を使います。
PasswordInputStrength は入力に合わせてパスワードを 0〜4 で採点します。チェックリストは同じ値を usePasswordInputValue() で読みます。ルールは例のもので、コンポーネント自体はパスワードポリシーを課しません。
autoComplete="username" を付けたメール欄と組み合わせます。パスワード欄で Enter を押すとフォームが送信され、送信時には表示中のパスワードが再び隠れて、ブラウザが保存を提案できます。
defaultVisible は、Wi-Fi のパスワードのように読む必要がある秘密のために、最初からテキストを表示します。
createPasswordInputController() のコントローラーは、どのボタンからでも欄の値の設定、表示、非表示、消去、フォーカスができます。書き込みは入力と同じく onValueChange を通ります。
visible と onVisibleChange を渡します。理由を見れば、ボタン操作か、フォーム送信か、リセットか、ページが隠れたのかがわかります。
invalid は欄に印を付け、input に aria-invalid を設定します。その aria-describedby をメッセージに向けてください。必須の欄は、空のまま離れたときにも赤くなります。
読み取り専用の欄はフォーカス、表示、コピーはできますが変更はできず、送信には含まれます。
切り替えボタンは左に置かれ、強度メーターは右から満ちます。ラベルは自分の言語で渡してください。
| キー | アクション |
|---|---|
| Tab | 欄から切り替えボタンへ移動します。 |
| SpaceEnter | 切り替えボタンでパスワードを表示・非表示にし、フォーカスはボタンに残します。 |
| Enter | 欄からフォームを送信します。切り替えボタンが押されることはありません。 |
切り替えボタンは「Show password」という固定の名前を持つトグルボタンで、aria-pressed がパスワードの表示状態をスクリーンリーダーに伝えます。ほかの秘密や言語に合わせて名前を変えてください。ポインターでボタンを押しても、欄のキャレット位置はそのままです。
PasswordInputCapsLock は Caps Lock がオンで欄にフォーカスがある間、欄の下に開き、ステータス領域で知らせます。PasswordInputStrength は強度ラベルを値テキストに持つメーターで、キーごとに読み上げず、必要なときに読まれます。表示中のパスワードはスペルチェック、自動修正、自動大文字化の対象外です。
パスワードを data-* 属性に書き込むパーツはありません。ルートとコントロールが持つのは data-filled のような真偽値だけで、メーターはスコアを持ちます。ただし制御された value を使うと React が DOM に value 属性を残すので、パスワードは onValueChange か usePasswordInputValue() で読んでください。
各パーツは同名の UI SDK パーツをラップし、render やパーツの状態を受け取る関数にもできる className を含むすべての props を受け付けます。
| プロパティ | 型 | デフォルト |
|---|---|---|
value | string | – |
defaultValue | string | – |
onValueChange | (value: string, details) => void | – |
visible | boolean | – |
defaultVisible | boolean | false |
onVisibleChangedetails.reason は toggle-press、form-submit、reset、page-hide、imperative のいずれかです。 | (visible: boolean, details) => void | – |
autoComplete | "current-password" | "new-password" | "off" | string | "current-password" |
invalid | boolean | false |
disabled | boolean | false |
readOnly | boolean | false |
required | boolean | false |
name | string | – |
form | string | – |
controllercreatePasswordInputController() で作成。 | PasswordInputController | – |
| 属性 | 説明 |
|---|---|
data-slot="password-input" | CSS でパスワード入力を指定します。 |
data-visible | パスワードが表示されている間、付与されます。 |
data-capslock | Caps Lock がオンで欄にフォーカスがある間に付きます。 |
data-filled | 欄に文字があるときに付きます。 |
data-invalid | 無効なときに付きます。 |
data-disabled | 無効のときに存在します。 |
data-readonly | 読み取り専用のときに付与されます。 |
data-required | パスワードが必須のときに付きます。 |
欄と切り替えボタンを囲むボックス。欄にフォーカスがあるとフォーカスリングを描きます。
| プロパティ | 型 | デフォルト |
|---|---|---|
id | string | – |
placeholder | string | – |
render | ReactElement | (props, state) => ReactElement | – |
| 属性 | 説明 |
|---|---|
data-slot="password-input-control" | CSS でネイティブの input を指定します。 |
data-visible | テキスト欄になっている間に付きます。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
aria-label | string | "Show password" |
children既定は、閉じた目へクロスフェードする目のアイコンです。 | ReactNode | (state) => ReactNode | – |
render | ReactElement | (props, state) => ReactElement | – |
| 属性 | 説明 |
|---|---|
data-slot="password-input-toggle" | CSS で切り替えボタンを指定します。 |
aria-pressed | パスワード表示中は true。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
children | ReactNode | "Caps Lock is on" |
| 属性 | 説明 |
|---|---|
data-slot="password-input-capslock" | CSS でヒントを指定します。 |
data-active | Caps Lock がオンの間に付きます。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
getStrengthパスワードを採点します。既定の採点は長さ、文字の種類、繰り返し、よくあるパスワードを考慮します。本番のポリシーには zxcvbn のような強力な推定器を使ってください。 | (password: string) => 0 | 1 | 2 | 3 | 4 | scorePassword |
labels | [string, string, string, string, string] | ["", "Weak", "Fair", "Good", "Strong"] |
label | string | "Password strength" |
| 属性 | 説明 |
|---|---|
data-slot="password-input-strength" | CSS でメーターを指定します。 |
data-score | スコア。空なら 0、最大 4。 |
- Calendar単一、範囲、複数選択に対応する日付グリッドです。月のスライド、範囲のプレビュー、タッチしやすいサイズの日付セルを備えています。
- Checkboxチェックが描かれるように表示されるチェックボックスです。中間状態の親、グループ、ホバーを共有するラベルに対応します。
- Comboboxチップ、グループ、非同期の結果に対応した、絞り込み可能なセレクトです。入力に合わせてポップアップのサイズが変わります。
- Date picker押すとポップオーバーでカレンダーを開くボタンです。スマートフォンではボトムシートになり、単一の日付も範囲も選べます。
- Fieldコントロールに紐付いたラベル、説明、エラーです。バリデーション状態とフォーム向けのレイアウトを備えています。
- Input3つのサイズ、無効状態と読み取り専用状態、ネイティブのバリデーションスタイル、スマートフォンでズームされない16pxのタッチ用フォントを備えたテキスト入力です。