# Kashi (کاشی)
> Kashi is an open-source, RTL-first Persian design system: accessible React components (@kashi-ui/react), framework-agnostic CSS (@kashi-ui/css), design tokens, 4500 icons in six styles and Persian utilities such as Jalali dates and national ID, IBAN and card validation. MIT licensed.
Setup: `npm i @kashi-ui/react @kashi-ui/css`, import "@kashi-ui/css" once at the app root and set ``. Without React, use the `k-*` CSS classes from each page's HTML example. In Tailwind projects, `@kashi-ui/tailwind` exposes the same tokens as classes (`bg-secondary`, `border-brand`, `rounded-lg`).
For coding assistants, the Kashi MCP server gives the same docs plus icon search, tokens and Persian utilities as tools: `npx -y @kashi-ui/mcp` (https://kashi.sepantapouya.com/docs/ai/).
---
# آکاردئون (Accordion, AccordionItem)
URL: https://kashi.sepantapouya.com/docs/components/accordion/
بخشهای جمعشونده برای محتوای طولانی، مثل پرسشهای متداول؛ روی details بومی.
```tsx
import { Accordion, AccordionItem } from "@kashi-ui/react";
```
## نمونه
با `type="single"` باز شدن هر بخش بقیه را میبندد.
```tsx
بله. …بله؛ …بله، …
```
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| type | "single" \| "multiple" | "multiple" | فقط یک بخش باز یا چند بخش (Accordion) |
| flush | boolean | false | بدون حاشیه (Accordion) |
| title | ReactNode | — | عنوان بخش (AccordionItem) |
| defaultOpen | boolean | false | باز در ابتدا (AccordionItem) |
## دسترسپذیری
روی `` و `` بومی ساخته شده: بدون JavaScript کار میکند، با Enter و Space باز و بسته میشود و صفحهخوان وضعیت باز یا بسته را اعلام میکند. جستجوی صفحه (Ctrl+F) محتوای بخشهای بسته را هم پیدا و باز میکند.
---
# هشدار (Alert)
URL: https://kashi.sepantapouya.com/docs/components/alert/
پیامی مهم دربارهٔ وضعیت سیستم یا نتیجهٔ یک عمل، با آیکون شاخص و عملهای اختیاری.
```tsx
import { Alert } from "@kashi-ui/react";
```
## رنگها
سطح هشدار خنثی است و رنگ فقط در آیکون شاخص دیده میشود؛ این کار صفحه را آرام نگه میدارد.
```tsx
کاشی ۰.۲ با هفت کامپوننت تازه در دسترس است.برای جلوگیری از قطع سرویس، اشتراک را تمدید کنید.موجودی کارت کافی نیست. کارت دیگری را امتحان کنید.
```
## عملها و بستن
```tsx
>}
onClose={() => setOpen(false)}
>
نسخهٔ جدید بهبودهای امنیتی دارد.
```
## پسزمینهٔ رنگی
برای پیامهایی که باید بیشتر دیده شوند، از `tinted` استفاده کنید.
```tsx
سرویس امشب از ساعت ۲ تا ۴ در دسترس نیست.
```
## نوار بالای صفحه و فشرده
```tsx
…
```
**ویژگیهای جدید**
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| layout | "card" \| "banner" | "card" | نوار تمامعرض بالای صفحه |
| size | "sm" \| "md" | "md" | نسخهٔ فشرده برای داخل فرم |
| classNames | { root, icon, title, description, actions } | — | کلاس دلخواه برای هر بخش |
## ویژگیها
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| tone | "neutral" \| "brand" \| "info" \| "success" \| "warning" \| "error" | "neutral" | رنگ و آیکون پیشفرض |
| title | ReactNode | — | عنوان |
| children | ReactNode | — | توضیح |
| icon | ReactNode \| false | — | آیکون سفارشی؛ false برای حذف |
| actions | ReactNode | — | دکمهها یا لینکهای زیر متن |
| onClose | () => void | — | با دادن این تابع دکمهٔ بستن نمایش داده میشود |
| closeLabel | string | "بستن" | نام دسترسپذیر دکمهٔ بستن |
| tinted | boolean | false | پسزمینهٔ رنگی کمرنگ |
| role | string | خودکار | پیشفرض alert برای خطا و هشدار، status برای بقیه |
## متغیرهای CSS
| متغیر CSS | پیشفرض | توضیح |
|---|---|---|
| --k-alert-radius | var(--k-radius-xl) | گردی گوشهها |
| --k-alert-padding | 1rem × density | فاصلهٔ داخلی |
| --k-alert-bg | var(--k-bg-secondary) | پسزمینه |
## دسترسپذیری
- هشدارهای `error` و `warning` نقش `alert` دارند و صفحهخوان آنها را فوراً اعلام میکند؛ بقیه با نقش `status` بدون قطع کاربر خوانده میشوند.
- فقط هشدارهایی را که پس از بارگذاری صفحه اضافه میشوند `alert` کنید؛ هشدار ثابت صفحه را با `role="note"` نمایش دهید.
- آیکون تزئینی است و از صفحهخوان پنهان است؛ عنوان باید معنا را کامل برساند.
---
# آواتار (Avatar, AvatarGroup)
URL: https://kashi.sepantapouya.com/docs/components/avatar/
نمایش تصویر یا حروف اول یک شخص، با وضعیت حضور و گروهبندی.
```tsx
import { Avatar, AvatarGroup } from "@kashi-ui/react";
```
## تصویر و حروف اول
اگر تصویر نباشد یا بارگذاری نشود، حروف اول نام نمایش داده میشود. بین حروف فارسی نیمفاصله قرار میگیرد تا به هم نچسبند. در اندازههای `xs` و `sm` فقط حرف اول نمایش داده میشود تا خوانا بماند.
```tsx
```
## اندازهها
```tsx
```
## وضعیت
```tsx
```
## گروه
```tsx
```
## رنگ خودکار
با `color="auto"` هر نام همیشه یک رنگ ثابت میگیرد (در هر دستگاه یکسان)؛ فهرست اعضا خواناتر و رنگارنگتر میشود.
```tsx
{members.map((m) => )}
```
**ویژگیهای جدید**
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| color | "auto" \| "neutral" \| "brand" \| "info" \| "success" \| "warning" \| "error" | "neutral" | رنگ حروف اول؛ همهٔ رنگها کنتراست AA دارند |
## ویژگیها
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| name | string | — | نام شخص (الزامی)؛ برای نام دسترسپذیر و حروف اول |
| src | string | — | آدرس تصویر |
| size | "xs" \| "sm" \| "md" \| "lg" \| "xl" \| "2xl" | "md" | ۲۴ تا ۶۴ پیکسل |
| status | "online" \| "offline" \| "busy" \| "away" | — | نشانگر وضعیت حضور |
| statusLabels | Partial> | فارسی | متن وضعیت برای صفحهخوان |
| square | boolean | false | شکل مربعی برای سازمانها و پروژهها |
| brand | boolean | false | رنگ برند برای حالت حروف اول |
**ویژگیهای AvatarGroup**
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| max | number | — | حداکثر تعداد نمایش؛ بقیه به شکل «+۲» |
| size | AvatarSize | "md" | اندازهٔ آواتار باقیمانده |
| moreLabel | (count: number) => string | "۲ نفر دیگر" | متن صفحهخوان برای باقیمانده |
## متغیرهای CSS
| متغیر CSS | پیشفرض | توضیح |
|---|---|---|
| --k-avatar-size | 2.5rem | اندازه |
| --k-avatar-radius | var(--k-radius-full) | گردی گوشهها |
| --k-avatar-bg | var(--k-bg-tertiary) | پسزمینهٔ حروف اول |
| --k-avatar-fg | var(--k-text-secondary) | رنگ حروف اول |
## دسترسپذیری
- آواتار نقش `img` دارد و نام شخص بههمراه وضعیت («سارا احمدی، آنلاین») اعلام میشود. تصویر داخلی تزئینی است.
- وضعیت فقط با رنگ نمایش داده نمیشود؛ متن آن برای صفحهخوان در دسترس است.
---
# بج (Badge)
URL: https://kashi.sepantapouya.com/docs/components/badge/
برچسب کوچک برای وضعیت، دستهبندی یا شمارش.
```tsx
import { Badge } from "@kashi-ui/react";
```
## رنگها
رنگ را بر اساس معنا انتخاب کنید، نه سلیقه؛ کاربر رنگها را در کل محصول یکسان تفسیر میکند.
```tsx
پیشنویسجدیدفعالدر انتظاررد شدهبتا
```
## اندازه و شکل
```tsx
کوچکمتوسطبزرگمربعی
```
## سبکها و برچسبهای حذفشدنی
```tsx
پرداختشدهبتا}>۱۲ عضو
// فیلترهای فعال
{tags.map((t) => remove(t)}>{t})}
```
**ویژگیهای جدید**
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| variant | "soft" \| "solid" \| "outline" | "soft" | سبک |
| icon | ReactNode | — | آیکون ابتدای متن |
| onRemove / removeLabel | () => void / string | «حذف {متن}» | دکمهٔ حذف با نام برای صفحهخوان |
## ویژگیها
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| tone | "neutral" \| "brand" \| "error" \| "warning" \| "success" \| "info" | "neutral" | رنگ معنایی |
| size | "sm" \| "md" \| "lg" | "md" | اندازه |
| dot | boolean | false | نقطهٔ رنگی ابتدای متن |
| square | boolean | false | گوشهٔ کم بهجای گرد |
## متغیرهای CSS
| متغیر CSS | پیشفرض | توضیح |
|---|---|---|
| --k-badge-radius | var(--k-radius-full) | گردی گوشهها |
| --k-badge-font-weight | 500 | وزن متن |
## دسترسپذیری
- همهٔ ترکیبهای رنگ متن و پسزمینه کنتراست حداقل ۴٫۵ به ۱ دارند.
- رنگ نباید تنها حامل معنا باشد؛ متن نشان باید بهتنهایی وضعیت را برساند.
- اگر عدد نشان (مثلاً تعداد پیامها) تغییر میکند، تغییر را با یک ناحیهٔ `aria-live` اعلام کنید.
---
# بنر (Banner)
URL: https://kashi.sepantapouya.com/docs/components/banner/
پیام سطح صفحه مثل نسخهٔ جدید، پایان اشتراک یا اختلال سرویس، با دکمهٔ عمل و بستن.
```tsx
import { Banner } from "@kashi-ui/react";
```
برای پیامی که به کل صفحه یا حساب مربوط است. پیام مربوط به یک بخش یا فرم را با `Alert` و پیام گذرا را با `Toast` نشان دهید.
## نمونه
```tsx
} onClose={dismiss}
actions={}>
نسخهٔ ۰٫۱۰ منتشر شد. هفت کامپوننت تازه…
} actions={}>
اشتراک شما ۳ روز دیگر تمام میشود. …
```
برای چسباندن به بالای صفحه، `flush` را بدهید تا حاشیه و گوشهٔ گرد حذف شود.
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| tone | "neutral" \| "brand" \| "warning" \| "error" | "neutral" | رنگ |
| icon | ReactNode | — | آیکون شاخص |
| actions | ReactNode | — | دکمه یا لینکها |
| onClose | () => void | — | با آن دکمهٔ بستن نمایش داده میشود |
| flush | boolean | false | بدون حاشیه، برای بالای صفحه |
| label / closeLabel | string | «اطلاعیه» / «بستن اطلاعیه» | نام ناحیه و دکمه |
## دسترسپذیری
ناحیهٔ `role="region"` با نام «اطلاعیه»، تا کاربر صفحهخوان بتواند به آن پرش کند. نوار بهعمد `aria-live` ندارد، چون هنگام بارگذاری صفحه نمایش داده میشود؛ برای پیامهایی که بعداً ظاهر میشوند از `Toast` استفاده کنید.
---
# بردکرامب (Breadcrumb)
URL: https://kashi.sepantapouya.com/docs/components/breadcrumb/
نشان میدهد کاربر کجای ساختار سایت است.
```tsx
import { Breadcrumb } from "@kashi-ui/react";
```
## نمونه
خانه فقط با آیکون نمایش داده میشود و برچسبش برای صفحهخوان میماند.
```tsx
, hideLabel: true },
{ label: "تنظیمات", href: "/settings" },
{ label: "امنیت" },
]} />
```
## مسیر بلند
با `maxItems` وسط مسیر به «…» جمع میشود؛ با زدن آن، مسیر کامل باز میشود. نامهای بلند هم کوتاه میشوند و متن کامل در `title` است.
```tsx
, hideLabel: true },
{ label: "پروژهها", href: "/projects" },
{ label: "فروشگاه آنلاین", href: "/projects/shop" },
{ label: "تنظیمات", href: "/projects/shop/settings" },
{ label: "امنیت و ورود دو مرحلهای" },
]} />
```
## جداکنندهٔ «/»
```tsx
```
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| items | { label, href?, icon?, hideLabel? }[] | — | آخرین مورد صفحهٔ فعلی است |
| maxItems | number | — | جمع کردن وسط مسیرهای بلند |
| separator | "chevron" \| "slash" | "chevron" | شکل جداکننده |
| label | string | "مسیر" | نام nav برای صفحهخوان |
| expandLabel | string | "نمایش مسیر کامل" | نام دکمهٔ «…» |
## متغیرهای CSS
`--k-breadcrumb-max-item` (پیشفرض `14rem`): بیشترین عرض هر مورد پیش از کوتاه شدن.
## دسترسپذیری
داخل `