# 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`): بیشترین عرض هر مورد پیش از کوتاه شدن. ## دسترس‌پذیری داخل `