Tag
عرض شاملimport { Tag, TagGroup } from '@nili/ui';هذه صفحة العرض الشامل الخاصة بالمكتبة، معروضة حيّة. غيّر اللغة أو السمة من الأعلى وسَتتبعك.
المظاهر
معالجتان — stroke على أبيض، أو gray على شريحة معبّأة.
import { Tag } from "@nili/ui"
export function Example() {
return (
<>
<Tag appearance="stroke">Stroke</Tag>
<Tag appearance="gray">Gray</Tag>
</>
)
}الحالات
يشير selected إلى وسم مطبَّق ويضيف aria-pressed حين يكون الوسم قابلًا للاختيار. أما disabled فيجعله رماديًا ويخرجه من ترتيب التنقّل.
import { Tag } from "@nili/ui"
export function Example() {
const [selected, setSelected] = useState<string[]>([])
return (
<>
<Tag
selected={selected.includes("design")}
onSelect={() => toggle("design")}
>
Design
</Tag>
<Tag disabled>{t('states.disabled')}</Tag>
</>
)
}الفتحة المتقدّمة
يغطّي startAdornment كل أنواع فيجما في خاصية واحدة — أيقونة أو صورة رمزية أو علم أو شعار. ولو كانت قائمة ثابتة لصارت متنافية، ولاحتاج النوع السابع إلى إصدار جديد من المكتبة.
import { Tag, Avatar, CountryFlag, Icon } from "@nili/ui"
import { RiPriceTag3Line } from "@remixicon/react"
export function Example() {
return (
<>
<Tag startAdornment={<Icon icon={RiPriceTag3Line} />}>
{t('slot.icon')}
</Tag>
<Tag startAdornment={<Avatar size="3xs" name="Ada Lovelace" tone="blue" />}>
Ada Lovelace
</Tag>
<Tag startAdornment={<CountryFlag code="ir" size="xs" />}>
{t('slot.iran')}
</Tag>
<Tag sublabel="24">{t('slot.withSublabel')}</Tag>
</>
)
}قابل للإزالة
يُظهر onDismiss زرّ الإزالة. وdismissLabel مطلوبة معه — فعلامة ✕ بلا اسم وصفي، وكل ما سيسمعه قارئ الشاشة هو «زر».
import { Tag, TagGroup } from "@nili/ui"
export function Example() {
const [tags, setTags] = useState(["Design", "Engineering"])
return (
<TagGroup label={t('group.filters')}>
{tags.map((tag) => (
<Tag
key={tag}
onDismiss={() => setTags((c) => c.filter((t) => t !== tag))}
dismissLabel={`Remove ${tag}`}
>
{tag}
</Tag>
))}
</TagGroup>
)
}Tag
extends Omit< ComponentPropsWithoutRef<'span'>, 'onSelect' >
محاور التنويع — من تعريف cva للمكوّن
| الخاصيّة | النوع | الافتراضي | ملاحظات |
|---|---|---|---|
| appearance | stroke | gray | stroke | |
| disabled | boolean | false | |
| selected | boolean | false | The tag is currently applied — adds `aria-pressed` when selectable. |
| dismissible | 'true' | 'false' | false |
باقي الخصائص
| الخاصيّة | النوع | الافتراضي | ملاحظات |
|---|---|---|---|
| children | ReactNode | — | |
| aria-label | string | — | |
| startAdornment | ReactNode | — | Leading slot. Covers all six of Figma's `Type` values — Left Icon, Avatar, Country, Brand, Company — without making them mutually exclusive. |
| sublabel | ReactNode | — | Muted text after the label. Figma's "Sublabel". |
| onSelect | () => void | — | Makes the label a button — a filter chip you can toggle. |
| onDismiss | () => void | — | Shows the remove button. |
| dismissLabel | string | — | Accessible name for the remove button. Required alongside `onDismiss`: an ✕ has no accessible name, and "button" is all a screen reader would get. |
TagContent
داخليمحاور التنويع — من تعريف cva للمكوّن
| الخاصيّة | النوع | الافتراضي | ملاحظات |
|---|---|---|---|
| interactive | 'true' | 'false' | false |
TagDismiss
داخليTagGroup
extends ComponentPropsWithoutRef<'div'>
باقي الخصائص
| الخاصيّة | النوع | الافتراضي | ملاحظات |
|---|---|---|---|
| children | ReactNode | — | |
| aria-label | string | — | |
| label | string | — | Accessible name for the set, e.g. `'Tags'`. |