شروع
وب کامپوننتها
کامپوننتهای کاشی بدون React؛ با یک خط script در HTML، وردپرس، Vue، Svelte و Angular. فیلدهای فارسی، تقویم شمسی، فرم نشانی، نقشهٔ ایران، جدول داده، منو، پنجره و اعلان.
پکیج @kashi-ui/elements کامپوننتهای تعاملی کاشی را بهشکل وب کامپوننت (Custom Elements استاندارد مرورگر) دارد. با هر فریمورکی کار میکنند، یا بدون فریمورک:
- HTML ساده و وردپرس: یک خط CSS و یک خط script، بدون ابزار ساخت.
- Vue، Svelte و Angular: مثل هر تگ HTML دیگری.
- فرم معمولی HTML: مقدار هر فیلد با
nameارسال میشود و فرم با مقدار نامعتبر ارسال نمیشود.
ظاهر از همان @kashi-ui/css میآید و عنصرها Shadow DOM ندارند؛ پس تم، رنگ برند، حالت روشن و تیره و CSS خودتان بیتغییر روی آنها اعمال میشود. در پروژهٔ React همان @kashi-ui/react را به کار ببرید.
این صفحه راهاندازی کلی است. نصب، نمونهٔ زنده، ویژگیها و رویدادهای هر کامپوننت در بخش «وب کامپوننت» صفحهٔ همان کامپوننت آمده است (فهرست).
نصب
بدون نصب، از CDN، در <head> صفحه:
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@kashi-ui/css/dist/kashi.css">
<script type="module" src="https://cdn.jsdelivr.net/npm/@kashi-ui/elements/dist/cdn/kashi-elements.js"></script>
یا با npm، در پروژهای که ابزار ساخت دارد (Vite، Nuxt، SvelteKit، Angular):
npm i @kashi-ui/elements @kashi-ui/css
import "@kashi-ui/css";
import "@kashi-ui/elements"; // همه؛ یا فقط یک بخش، مثل "@kashi-ui/elements/inputs.js"
صفحه را راستبهچپ کنید: <html lang="fa" dir="rtl">.
نمونه
یک فرم معمولی HTML با چند کامپوننت کاشی:
<form action="/checkout" method="post">
<kashi-national-id name="national_id" required></kashi-national-id>
<kashi-mobile name="mobile"></kashi-mobile>
<kashi-date-picker label="تاریخ تحویل" name="delivery" holidays></kashi-date-picker>
<button class="k-btn k-btn--primary">ثبت سفارش</button>
</form>کامپوننتها
۶۳ عنصر؛ روی نام هر کامپوننت بزنید تا نصب، نمونه، ویژگیها و رویدادهایش را ببینید.
| کامپوننت | عنصرها | بخش npm |
|---|---|---|
| فیلدهای فارسی | <kashi-national-id>، <kashi-legal-id>، <kashi-mobile>، <kashi-landline>، <kashi-card-number>، <kashi-iban>، <kashi-postal-code>، <kashi-price> |
inputs.js |
| ساعت و پلاک خودرو | <kashi-time-input>، <kashi-plate-input> |
forms.js |
| ویرایش نگارشی | <kashi-persian-textarea>، <kashi-keyboard-fix> |
forms.js |
| بازهٔ تاریخ شمسی | <kashi-date-range-picker> |
pickers.js |
| انتخاب ماه | <kashi-month-picker> |
pickers.js |
| انتخاب نوبت | <kashi-appointment-picker> |
appointment.js |
| هیتمپ فعالیت | <kashi-activity-heatmap> |
charts.js |
| دیتپیکر شمسی | <kashi-date-picker>، <kashi-calendar> |
calendar.js |
| کد تأیید | <kashi-otp> |
fields.js |
| انتخاب استان و شهر | <kashi-province-select>، <kashi-city-select> |
combobox.js |
| نقشهٔ ایران | <kashi-iran-map> |
map.js |
| فرم نشانی | <kashi-address-form> |
map.js |
| نمایش مبلغ | <kashi-money> |
display.js |
| شمارش معکوس | <kashi-countdown> |
display.js |
| تاریخ و زمان نسبی | <kashi-date>، <kashi-relative-time> |
display.js |
| فیلد متنی | <kashi-input>، <kashi-textarea> |
basic.js |
| بنر | <kashi-banner> |
basic.js |
| Combobox | <kashi-combobox> |
combobox.js |
| انتخاب چندتایی | <kashi-multi-select> |
forms.js |
| اسلایدر | <kashi-slider> |
forms.js |
| چیپس | <kashi-chip-group> |
forms.js |
| قدرت رمز | <kashi-password-strength> |
forms.js |
| ویرایش درجا | <kashi-inline-edit> |
forms.js |
| بارگذاری فایل | <kashi-file-upload> |
pickers.js |
| انتخاب رنگ | <kashi-color-picker> |
pickers.js |
| نمودار | <kashi-bar-chart>، <kashi-line-chart>، <kashi-pie-chart>، <kashi-bar-list>، <kashi-proportion-bar>، <kashi-sparkline> |
charts.js |
| جدول داده | <kashi-data-table> |
table.js |
| صفحهبندی | <kashi-pagination> |
controls.js |
| فیلد برچسب | <kashi-tag-input> |
controls.js |
| فیلد عدد | <kashi-number-input> |
controls.js |
| امتیاز | <kashi-rating> |
controls.js |
| پنجرهٔ گفتگو | <kashi-dialog> |
overlay.js |
| زبانهها | <kashi-tabs> |
overlay.js |
| راهنما | <kashi-tooltip> |
overlay.js |
| دکمهٔ کپی | <kashi-copy-button> |
overlay.js |
| منوی کشویی | <kashi-dropdown-menu> |
menu.js |
| پاپاور | <kashi-popover> |
menu.js |
| اعلان | <kashi-toaster> و تابع toast() |
toast.js |
| پالت فرمان | <kashi-command-palette> |
nav.js |
| منوی راستکلیک | <kashi-context-menu> |
nav.js |
| کاروسل | <kashi-carousel> |
nav.js |
| نمای درختی | <kashi-tree-view> |
nav.js |
| تور معرفی | <kashi-tour> |
nav.js |
| اسپلیتر | <kashi-splitter> |
nav.js |
| منوی کناری | <kashi-side-nav> |
nav.js |
فیلدها ویژگیهای مشترک دارند: label، name، value، hint، error (خطای دلخواه، مثلاً از سرور)، required، disabled و aria-label (بهجای برچسب دیداری).
ارسال فرم و اعتبارسنجی
هر فیلد با name مقدار خام خود را با ارقام انگلیسی ارسال میکند: کد ملی 0013542419، موبایل 09123456789، شبا IR…، مبلغ 2500000 و تاریخ 2026-03-21. قالب نمایشی (فاصلهها و ارقام فارسی) به سرور نمیرسد.
مقدار نامعتبر جلوی ارسال فرم را میگیرد و مرورگر پیام خطای فارسی همان فیلد را نشان میدهد؛ required هم مثل input معمولی کار میکند.
<form action="/checkout" method="post">
<kashi-national-id name="national_id" required></kashi-national-id>
<kashi-postal-code name="postal_code" required></kashi-postal-code>
<button class="k-btn k-btn--primary">ثبت سفارش</button>
</form>
رویدادها و JavaScript
هر فیلد با هر تغییر رویداد kashi-change میفرستد. در detail مقدار، معتبر بودن و اطلاعات اضافه میآید، مثل نام بانک یا اپراتور. ویژگیهای value و valid را هم مستقیم میشود خواند:
const card = document.querySelector("kashi-card-number");
card.addEventListener("kashi-change", (e) => {
console.log(e.detail); // { value: "6037…", valid: true, bank: "بانک ملی" }
});
card.value = "6037991234567893"; // مقدار از بیرون
card.valid; // true
رویدادها و ویژگیهای JavaScript هر عنصر در بخش «وب کامپوننت» صفحهٔ همان کامپوننت آمده است.
Vue، Svelte و Angular
Vue: به Vue بگویید تگهای kashi- کامپوننت Vue نیستند:
// vite.config.js
import vue from "@vitejs/plugin-vue";
export default {
plugins: [vue({ template: { compilerOptions: { isCustomElement: (tag) => tag.startsWith("kashi-") } } })],
};
<kashi-mobile :value="mobile" @kashi-change="mobile = $event.detail.value"></kashi-mobile>
Svelte: تنظیمی لازم ندارد:
<kashi-mobile value={mobile} on:kashi-change={(e) => (mobile = e.detail.value)}></kashi-mobile>
Angular: CUSTOM_ELEMENTS_SCHEMA را به کامپوننت اضافه کنید:
@Component({
schemas: [CUSTOM_ELEMENTS_SCHEMA],
template: `<kashi-mobile [value]="mobile" (kashi-change)="mobile = $event.detail.value"></kashi-mobile>`,
})
در TypeScript نوع همهٔ عنصرها ثبت شده است؛ document.querySelector("kashi-iban") نوع KashiIban را برمیگرداند.
کامپوننتهای دیگر
بیشتر کامپوننتهای دیگر کاشی (دکمه، کارت، نشان، هشدار، آکاردئون، مراحل، پیشرفت، فیلد متنی و…) به JavaScript نیاز ندارند و با کلاسهای @kashi-ui/css ساخته میشوند؛ کد HTML هر کدام در تب «HTML» صفحهٔ همان کامپوننت آمده است.
همهٔ کامپوننتهای تعاملی کاشی نسخهٔ وب کامپوننت دارند.
حجم
فایل CDN حدود ۳ کیلوبایت (gzip) است و هر بخش را فقط وقتی یکی از تگهایش در صفحه پیدا شود دانلود میکند؛ صفحهای که فقط فیلد کد ملی دارد، نمودار و نقشه را دانلود نمیکند. لوگوی بانکها هم فقط هنگام وارد کردن شمارهٔ کارت یا شبا میآید. اگر عنصرها را با JavaScript میسازید و میخواهید از همان اول آماده باشند، loadAll() را صدا بزنید:
import { loadAll } from "https://cdn.jsdelivr.net/npm/@kashi-ui/elements/dist/cdn/kashi-elements.js";
await loadAll();
با npm فقط بخشی را که لازم دارید وارد کنید (ستون «بخش npm» جدول بالا)؛ مثلاً فقط فیلدهای فارسی:
import "@kashi-ui/elements/inputs.js";