کامپوننت‌ها

کتابخانه کامپوننت NOVAADMIN شامل ۳۹ کامپوننت آماده است. همه از توکن‌های Design System ساخته شده‌اند، در هر شش چیدمان و هر دو جهت درست کار می‌کنند و در صفحات ui/* قابل مشاهده‌اند.

فهرست کامپوننت‌ها

دستهکامپوننتصفحه نمایش
پایهدکمه، دکمه آیکون، گروه دکمه، segmentedui/buttons.html
پایهنشان، چیپ وضعیت، آواتار، نشان‌گر آنلاینui/badges.html, ui/avatars.html
پایهکارت، کارت آماری، کارت رسانه، کاشیui/cards.html
فرمورودی، انتخاب، چند‌انتخابی، سوییچ، اسلایدر، آپلود، OTP، جستجوui/forms.html, ui/inputs.html
ناوبریتب، آکاردئون، دراپ‌دان، بردکرامب، صفحه‌بندی، سایدبار تو در توui/tabs.html, ui/dropdowns.html
دادهجدول، جدول داده، درخت، فهرست گروهی، تایم‌لاینui/tables.html, ui/timeline.html
بازخوردپیام، توست، مودال، تأییدیه، حالت خالی، حالت خطا، اسکلتونui/alerts.html, ui/toasts.html, ui/states.html
نمایشنمودار، پیشرفت، رتبه‌بندی، تقویم، کانبان، چتui/charts.html, ui/progress.html
چیدمانگرید، دو ستونی، جعبه، ابزارکui/grid.html
تایپوگرافیسرتیترها، پاراگراف، لینک، بلوک کدui/typography.html

نمونه‌های کد

دکمه‌ها

<button class="btn btn-primary">ذخیره</button>
<button class="btn btn-light">انصراف</button>
<button class="btn btn-soft-success">تأیید</button>
<button class="btn btn-danger btn-sm">حذف</button>
<button class="icon-btn" aria-label="ویرایش"><i class="bi bi-pencil"></i></button>

کارت آماری

<article class="stat-card">
  <div class="stat-card__head">
    <span class="stat-card__label">درآمد ماه</span>
    <span class="stat-card__icon stat-card__icon--primary"><i class="bi bi-cash-stack"></i></span>
  </div>
  <p class="stat-card__value numeric">۲٫۴ میلیارد</p>
  <span class="stat-card__trend"><i class="bi bi-arrow-up-right"></i> ۱۲٫۴٪</span>
</article>

جعبه‌های بازخورد

<div class="callout callout--info"><i class="bi bi-info-circle"></i><div><strong>نکته</strong><p class="mb-0">متن راهنما</p></div></div>
<div class="callout callout--warning"><i class="bi bi-exclamation-triangle"></i><div><strong>هشدار</strong><p class="mb-0">متن هشدار</p></div></div>

پیام (Toast) از جاوااسکریپت

import { toast } from './js/core/toast.js';

toast.success('ذخیره شد', 'تغییرات با موفقیت ثبت شد.');
toast.warning('توجه', 'دو فیلد الزامی خالی است.');
toast.danger('خطا', 'ارتباط با سرور برقرار نشد.');
toast.info('اطلاع', 'نسخه جدید در دسترس است.');

موقعیت پیام‌ها قابل انتخاب است: data-toast-host="top-start", top-end, bottom-start, bottom-end؛ در حالت RTL آینه می‌شوند.

گفتگو و تأییدیه

import { modal } from './js/core/modal.js';

await modal.confirm({ title: 'حذف محصول', text: 'این عمل بازگشت‌پذیر نیست.', tone: 'danger', confirmText: 'حذف کن' });
modal.alert({ title: 'اطلاع', text: 'فایل آماده دانلود است.' });

تب و آکاردئون

<div class="tabs" data-tabs>
  <nav class="nav nav-tabs" role="tablist">
    <button class="nav-link active" data-tab="a" role="tab">بخش اول</button>
    <button class="nav-link" data-tab="b" role="tab">بخش دوم</button>
  </nav>
  <div class="tab-content">
    <div class="tab-pane active" data-tab-panel="a">…</div>
    <div class="tab-pane" data-tab-panel="b" hidden>…</div>
  </div>
</div>

رفتارها در src/js/core/ui.js ثبت می‌شوند؛ صفحاتی که محتوایشان را با جاوااسکریپت می‌سازند باید پس از رندر، initUi(root) را صدا بزنند (کنترل‌کننده‌های قالب این کار را انجام می‌دهند).

ساختار کلاس‌ها

.block               پایه
.block__element      بخش داخلی
.block--modifier     حالت یا اندازه
.is-*                حالت رفتاری که با JS عوض می‌شود (is-active، is-loading)
نکته: رنگ‌ها فقط از توکن‌ها می‌آیند؛ برای ساختن حالت جدید از --nv-* استفاده کنید، نه کد رنگ مستقیم
هشدار: کلاس‌های رفتاری is-* را در HTML ثابت نگذارید

اگر عنصری در حالت فعال باید باشد، از کنترل‌کننده یا [data-tabs] استفاده کنید تا منطق در یک جا بماند.

Components

The NOVAADMIN component library contains 39 ready-made components. All of them are built from the Design System tokens, work correctly in every layout and in both directions, and can be seen on the ui/* pages.

Component list

CategoryComponentsDemo page
BasicsButton, icon button, button group, segmentedui/buttons.html
BasicsBadge, status chip, avatar, online indicatorui/badges.html, ui/avatars.html
BasicsCard, stat card, media card, tileui/cards.html
FormsInput, select, multi-select, switch, slider, upload, OTP, searchui/forms.html, ui/inputs.html
NavigationTabs, accordion, dropdown, breadcrumb, pagination, nested sidebarui/tabs.html, ui/dropdowns.html
DataTable, data table, tree, grouped list, timelineui/tables.html, ui/timeline.html
FeedbackAlert, toast, modal, confirmation, empty state, error state, skeletonui/alerts.html, ui/toasts.html, ui/states.html
DisplayChart, progress, rating, calendar, kanban, chatui/charts.html, ui/progress.html
LayoutGrid, two-column, box, widgetui/grid.html
TypographyHeadings, paragraph, link, code blockui/typography.html

Code samples

Buttons

<button class="btn btn-primary">Save</button>
<button class="btn btn-light">Cancel</button>
<button class="btn btn-soft-success">Approve</button>
<button class="btn btn-danger btn-sm">Delete</button>
<button class="icon-btn" aria-label="Edit"><i class="bi bi-pencil"></i></button>

Stat card

<article class="stat-card">
  <div class="stat-card__head">
    <span class="stat-card__label">Monthly revenue</span>
    <span class="stat-card__icon stat-card__icon--primary"><i class="bi bi-cash-stack"></i></span>
  </div>
  <p class="stat-card__value numeric">2.4 billion</p>
  <span class="stat-card__trend"><i class="bi bi-arrow-up-right"></i> 12.4%</span>
</article>

Callouts

<div class="callout callout--info"><i class="bi bi-info-circle"></i><div><strong>Tip</strong><p class="mb-0">Help text</p></div></div>
<div class="callout callout--warning"><i class="bi bi-exclamation-triangle"></i><div><strong>Warning</strong><p class="mb-0">Warning text</p></div></div>

Toasts from JavaScript

import { toast } from './js/core/toast.js';

toast.success('Saved', 'Your changes were saved successfully.');
toast.warning('Heads up', 'Two required fields are empty.');
toast.danger('Error', 'Could not connect to the server.');
toast.info('Info', 'A new version is available.');

The toast position is selectable: data-toast-host="top-start", top-end, bottom-start, bottom-end; they are mirrored in RTL mode.

Dialogs and confirmations

import { modal } from './js/core/modal.js';

await modal.confirm({ title: 'Delete product', text: 'This action cannot be undone.', tone: 'danger', confirmText: 'Delete' });
modal.alert({ title: 'Info', text: 'The file is ready to download.' });

Tabs and accordion

<div class="tabs" data-tabs>
  <nav class="nav nav-tabs" role="tablist">
    <button class="nav-link active" data-tab="a" role="tab">First section</button>
    <button class="nav-link" data-tab="b" role="tab">Second section</button>
  </nav>
  <div class="tab-content">
    <div class="tab-pane active" data-tab-panel="a">…</div>
    <div class="tab-pane" data-tab-panel="b" hidden>…</div>
  </div>
</div>

Behaviours are registered in src/js/core/ui.js; pages that build their content with JavaScript must call initUi(root) after rendering (the template's controllers already do this).

Class structure

.block               base
.block__element      inner part
.block--modifier     state or size
.is-*                behavioural state toggled by JS (is-active, is-loading)
Tip: colours come from tokens only; to create a new state use --nv-*, not a raw colour code
Warning: do not hard-code the behavioural is-* classes in HTML

If an element must start active, use a controller or [data-tabs] so the logic stays in one place.

المكونات

تضم مكتبة مكونات NOVAADMIN ٣٩ مكوّناً جاهزاً. جميعها مبنية من رموز نظام التصميم، وتعمل بشكل صحيح في كل التخطيطات وفي الاتجاهين، ويمكن مشاهدتها في صفحات ui/*.

قائمة المكونات

الفئةالمكوناتصفحة العرض
أساسيةزر، زر أيقونة، مجموعة أزرار، segmentedui/buttons.html
أساسيةشارة، رقاقة حالة، صورة رمزية، مؤشر الاتصالui/badges.html, ui/avatars.html
أساسيةبطاقة، بطاقة إحصائية، بطاقة وسائط، مربعui/cards.html
النماذجحقل إدخال، قائمة اختيار، اختيار متعدد، مفتاح، منزلق، رفع، OTP، بحثui/forms.html, ui/inputs.html
التنقلتبويبات، أكورديون، قائمة منسدلة، مسار التنقل، ترقيم الصفحات، شريط جانبي متداخلui/tabs.html, ui/dropdowns.html
البياناتجدول، جدول بيانات، شجرة، قائمة مجمّعة، خط زمنيui/tables.html, ui/timeline.html
التغذية الراجعةتنبيه، رسالة منبثقة، نافذة، تأكيد، حالة فارغة، حالة خطأ، هيكل تحميلui/alerts.html, ui/toasts.html, ui/states.html
العرضمخطط، تقدّم، تقييم، تقويم، كانبان، دردشةui/charts.html, ui/progress.html
التخطيطشبكة، عمودان، صندوق، أداةui/grid.html
الطباعةالعناوين، الفقرة، الرابط، كتلة الشيفرةui/typography.html

أمثلة الشيفرة

الأزرار

<button class="btn btn-primary">حفظ</button>
<button class="btn btn-light">إلغاء</button>
<button class="btn btn-soft-success">موافقة</button>
<button class="btn btn-danger btn-sm">حذف</button>
<button class="icon-btn" aria-label="تعديل"><i class="bi bi-pencil"></i></button>

البطاقة الإحصائية

<article class="stat-card">
  <div class="stat-card__head">
    <span class="stat-card__label">إيراد الشهر</span>
    <span class="stat-card__icon stat-card__icon--primary"><i class="bi bi-cash-stack"></i></span>
  </div>
  <p class="stat-card__value numeric">٢٫٤ مليار</p>
  <span class="stat-card__trend"><i class="bi bi-arrow-up-right"></i> ١٢٫٤٪</span>
</article>

صناديق التنبيه

<div class="callout callout--info"><i class="bi bi-info-circle"></i><div><strong>ملاحظة</strong><p class="mb-0">نص إرشادي</p></div></div>
<div class="callout callout--warning"><i class="bi bi-exclamation-triangle"></i><div><strong>تحذير</strong><p class="mb-0">نص التحذير</p></div></div>

الرسائل المنبثقة (Toast) من جافاسكريبت

import { toast } from './js/core/toast.js';

toast.success('تم الحفظ', 'تم تسجيل التغييرات بنجاح.');
toast.warning('انتباه', 'حقلان إلزاميان فارغان.');
toast.danger('خطأ', 'تعذّر الاتصال بالخادم.');
toast.info('معلومة', 'يتوفر إصدار جديد.');

موضع الرسائل قابل للاختيار: data-toast-host="top-start" وtop-end وbottom-start وbottom-end؛ وتنعكس في وضع RTL.

الحوار والتأكيد

import { modal } from './js/core/modal.js';

await modal.confirm({ title: 'حذف المنتج', text: 'لا يمكن التراجع عن هذا الإجراء.', tone: 'danger', confirmText: 'احذف' });
modal.alert({ title: 'معلومة', text: 'الملف جاهز للتنزيل.' });

التبويبات والأكورديون

<div class="tabs" data-tabs>
  <nav class="nav nav-tabs" role="tablist">
    <button class="nav-link active" data-tab="a" role="tab">القسم الأول</button>
    <button class="nav-link" data-tab="b" role="tab">القسم الثاني</button>
  </nav>
  <div class="tab-content">
    <div class="tab-pane active" data-tab-panel="a">…</div>
    <div class="tab-pane" data-tab-panel="b" hidden>…</div>
  </div>
</div>

تُسجَّل السلوكيات في src/js/core/ui.js؛ والصفحات التي تبني محتواها بجافاسكريبت يجب أن تستدعي initUi(root) بعد العرض (متحكمات القالب تفعل ذلك).

بنية الفئات

.block               الأساس
.block__element      جزء داخلي
.block--modifier     حالة أو حجم
.is-*                حالة سلوكية تغيّرها JS (is-active، is-loading)
ملاحظة: تأتي الألوان من الرموز فقط؛ لإنشاء حالة جديدة استخدم --nv-* لا رمز لون مباشراً
تحذير: لا تثبّت فئات is-* السلوكية في HTML

إذا كان يجب أن يبدأ عنصر في الحالة النشطة، فاستخدم متحكماً أو [data-tabs] ليبقى المنطق في مكان واحد.