Tokenizer
Field gom vài giá trị ngắn thành các Token: địa chỉ email, tag, label. Gõ rồi nhấn Enter hoặc dấu phẩy thì thêm một token; mỗi token có button xóa, và Backspace trong field trống thì xóa token cuối. Hộp sunken dùng góc container vẫn hữu hạn ở preset pill, và cao thêm khi các token xuống dòng.
Xem trước
import { Field, FieldControl, FieldDescription, FieldLabel } from "@/components/ui/field"
import { Tokenizer } from "@/components/ui/tokenizer"
<Field className="w-full max-w-md">
<FieldLabel>Mời mọi người</FieldLabel>
<FieldControl>
<Tokenizer placeholder="Thêm email" defaultValue={["ada@example.com", "grace@example.com"]} />
</FieldControl>
<FieldDescription>Nhấn Enter hoặc dấu phẩy sau mỗi địa chỉ.</FieldDescription>
</Field>Cách dùng
Khi nào dùng
- Gom vài giá trị ngắn cùng loại trong một field: địa chỉ email, tag.
- Các giá trị người dùng gõ tự do, mỗi giá trị hiện như một chip có thể xóa.
Khi nào không dùng
- Một value. Dùng Input.
- Chọn từ danh sách đã biết. Dùng Combobox, hoặc Checkbox cho danh sách ngắn.
- Hiện các giá trị người dùng không đổi được. Dùng Token.
Biến thể
size
Chiều cao tối thiểu của hộp lấy từ size-element-*: sm 28px, md 32px (mặc định), lg 36px, xl 44px với chuột; trên cảm ứng md là 36px, lg 44px và xl 48px. Hộp cao thêm khi token xuống dòng. Khớp Input hoặc Button bên cạnh: md trong form, sm chỉ trong UI dày ưu tiên chuột, lg hoặc xl cho field chính của một màn hình.
import { Field, FieldControl, FieldDescription, FieldLabel } from "@/components/ui/field"
import { Tokenizer } from "@/components/ui/tokenizer"
<Field className="w-full max-w-md">
<FieldLabel>Mời mọi người</FieldLabel>
<FieldControl>
<Tokenizer placeholder="Thêm email" size="sm" defaultValue={["ada@example.com", "grace@example.com"]} />
</FieldControl>
<FieldDescription>Nhấn Enter hoặc dấu phẩy sau mỗi địa chỉ.</FieldDescription>
</Field>
<Field className="w-full max-w-md">
<FieldLabel>Mời mọi người</FieldLabel>
<FieldControl>
<Tokenizer placeholder="Thêm email" defaultValue={["ada@example.com", "grace@example.com"]} />
</FieldControl>
<FieldDescription>Nhấn Enter hoặc dấu phẩy sau mỗi địa chỉ.</FieldDescription>
</Field>
<Field className="w-full max-w-md">
<FieldLabel>Mời mọi người</FieldLabel>
<FieldControl>
<Tokenizer placeholder="Thêm email" size="lg" defaultValue={["ada@example.com", "grace@example.com"]} />
</FieldControl>
<FieldDescription>Nhấn Enter hoặc dấu phẩy sau mỗi địa chỉ.</FieldDescription>
</Field>
<Field className="w-full max-w-md">
<FieldLabel>Mời mọi người</FieldLabel>
<FieldControl>
<Tokenizer placeholder="Thêm email" size="xl" defaultValue={["ada@example.com", "grace@example.com"]} />
</FieldControl>
<FieldDescription>Nhấn Enter hoặc dấu phẩy sau mỗi địa chỉ.</FieldDescription>
</Field>Ví dụ
Mời bằng email
import { Field, FieldControl, FieldDescription, FieldLabel } from "@/components/ui/field"
import { Tokenizer } from "@/components/ui/tokenizer"
<Field className="w-full max-w-md">
<FieldLabel>Mời mọi người</FieldLabel>
<FieldControl>
<Tokenizer defaultValue={["ada@example.com", "grace@example.com"]} placeholder="Thêm email" />
</FieldControl>
<FieldDescription>Nhấn Enter hoặc dấu phẩy sau mỗi địa chỉ.</FieldDescription>
</Field>Có giới hạn
max dừng việc thêm ở ba tag.
import { Field, FieldControl, FieldLabel } from "@/components/ui/field"
import { Tokenizer } from "@/components/ui/tokenizer"
<Field className="w-full max-w-md">
<FieldLabel>Thẻ</FieldLabel>
<FieldControl>
<Tokenizer size="sm" max={3} defaultValue={["design", "tokens"]} placeholder="Thêm thẻ" />
</FieldControl>
</Field>Nên và không nên
Nên
- Dùng cho vài giá trị ngắn cùng loại: email, tag.
- Nói trong placeholder hoặc description phím nào thêm một value.
- Kiểm tra mỗi value trong onValueChange và giải thích value bị từ chối trong một FieldError.
Không nên
- Đừng dùng để chọn từ danh sách đã biết; dùng Combobox hoặc Checkbox.
- Đừng dùng cho một value; dùng Input.
- Đừng đặt chữ dài trong một token.
Props
| Tên | Kiểu | Giá trị | Mặc định | Mô tả |
|---|---|---|---|---|
| defaultValue | string | - | - | Các value ở lần render đầu, dạng mảng: ["ada@example.com"]. |
| value | string | - | - | Các value dạng mảng, khi bạn control chúng. Đi cùng onValueChange. |
| onValueChange | function | - | - | Được gọi với mọi value sau khi một value được thêm hoặc xóa. |
| placeholder | string | - | - | Chữ cần gõ, hiện khi chưa có token: Thêm một email. Không phải label. |
| size | enum | sm | md | lg | xl | md | Chiều cao tối thiểu của hộp lấy từ size-element-*: sm 28px, md 32px (mặc định), lg 36px, xl 44px với chuột; trên cảm ứng md là 36px, lg 44px và xl 48px. Hộp cao thêm khi token xuống dòng. Khớp Input hoặc Button bên cạnh: md trong form, sm chỉ trong UI dày ưu tiên chuột, lg hoặc xl cho field chính của một màn hình. |
| max | number | - | - | Số value tối đa nó nhận. Khi đầy, field không nhận thêm chữ, và Backspace vẫn xóa. |
| disabled | boolean | - | false | Không gõ được, và các token mất button xóa. |
| name | string | - | - | Tên form. Mỗi value được submit dưới tên này. |
| removeLabel | function | - | - | Đặt tên mỗi button xóa từ value của nó: (value) => `Remove ${value}` theo mặc định. |
Cấu tạo
| Phần | Mô tả |
|---|---|
| root | Tokenizer: hộp field và những gì nó chứa. |
| group | Hộp field: nền sunken và viền control của Input, với góc radius-container, cao ít nhất bằng size-element, gap-xs giữa các token, py-xs. Nó hiện focus ring của field chữ, kiểu disabled và viền danger. |
| token | Một Token cho mỗi value, với button xóa được đặt tên kèm value. Token disabled không có button. |
| placeholder | Chữ placeholder trong field chữ, chỉ khi chưa có token. |
Khả năng truy cập
Role: textbox
| Phím | Hành động |
|---|---|
| Enter, comma | Biến chữ đã gõ thành một token. Enter khi không có chữ thì submit form như thường. |
| Backspace | Trong field trống, xóa token cuối. |
| Tab | Chuyển qua các button xóa của token và field. |
- Đặt tên field bằng label của Field, hoặc aria-label: các token được đọc trước field, theo thứ tự.
- Mỗi button xóa được đặt tên Remove cùng value; removeLabel đổi các từ. Sau khi xóa, focus trở về field.
- Hộp chỉ hiện focus ring khi field chữ đang focus; button xóa vẽ vòng của riêng nó.
- Value đã có trong danh sách, hoặc value vượt max, không được thêm.
- Khi có name, mỗi value được submit dưới tên đó trong một input ẩn.
Cài đặt
npx werewolf-ui add tokenizerChạy npx werewolf-ui init một lần trong app trước khi thêm component. Init cài token, thêm CSS import và luật cho agent. Add cài component này cùng các dependency và giữ nguyên theme của bạn. Xem Cài đặt để biết yêu cầu và cách cài qua registry.