المكونات
الزر
مُشغّل إجراء قابل للنقر يُرسل بيانات أو ينفّذ حدثا. زر بشكل حبّة، مبني بالكامل من رموز الأساس. زر أساسي واحد فقط لكل شاشة.
- النضج
- جاهز
- الإصدار
- 1.0
- المالك
- فريق نظام التصميم
- المنصّة
- الويب، React Native
نظرة عامة
الزر هو الطريقة الأساسية لتنفيذ إجراء: إرسال نموذج، تأكيد خطوة، أو تشغيل حدث. شكله حبّة كاملة الاستدارة، وتعبئته الزرقاء هي لون العلامة. اختر صيغته حسب أهميته على الشاشة.
الاستخدام الأساسي في التطبيق: زر عريض بعرض الحاوية.
جرّبه
بدّل الصيغة والحجم والحالة والنص. الزر حيّ ويتكيّف مع السمة.
التركيب
كل خاصية بصرية للزر تأتي من طبقة أساس، لا قيمة ثابتة واحدة: الشكل حبّة (الاستدارة)، والتعبئة والنص (الألوان)، والحشو (المسافات)، والخط (الطباعة)، والحد وحلقة التركيز (الحدود)، والضغط (الحركة).
| الجزء | الطبقة والرمز |
|---|---|
| الشكل | Radius · shape.rounded |
| التعبئة | Color · bg.action.accent.primary.* |
| النص | Color · fg.action.accent.on-color |
| الخط | Typography · label / strong |
| الحشو | Spacing · inset.xs / inset.lg |
| الحد | Border · base + action.secondary |
| التركيز | Border · focus + Color · focus.default |
| الضغط | Motion · feedback |
الصيغ
| الصيغة | متى تستخدمها |
|---|---|
| primary | الإجراء الرئيسي على الشاشة، واحد فقط. تعبئة زرقاء. |
| secondary | إجراء مهم لكن ليس الرئيسي. حبّة محدّدة الإطار. |
| destructive | إجراء مدمّر مثل الحذف. تعبئة حمراء. |
| plain | إجراء خفيف منخفض التأكيد. نص فقط. |
زر الحالة الفارغة
صيغة inverse: زر داكن ناعم الاستدارة مع ظلّ خفيف وأيقونة. تُستخدم فقط كإجراء استرداد على شاشات الحالة الفارغة والأخطاء (مثل: لا نتائج) لتوجيه المستخدم لخطوة تالية. لا تستخدمها في التدفّقات العادية.
لا نتائج مطابقة
ابحث عن الدواء باسمه العلمي أو بالأعراض التي تظهر عليك.
نطاق الاستخدام
الحالات
خمس حالات: الافتراضية، والتحويم، والنشطة (ضغط بحركة feedback)، والمعطّلة، والتحميل.
الفعل يبقى في التحميل
السلوك
الزر قابل للتركيز بلوحة المفاتيح، ويُفعّل بمفتاحي Enter وSpace. عند التحويم أو الضغط تتبدّل التعبئة عبر رموز الحركة (feedback)، ويظهر مخطط تركيز واضح عند التنقّل بلوحة المفاتيح. أثناء التحميل يصير الزر غير قابل للنقر مع بقاء أبعاده ثابتة فلا تقفز الشاشة، وعند التعطيل يفقد التفاعل ويخفت إلى النصف.
عرض ثابت أثناء التحميل
افعل ولا تفعل
- استخدم زرا أساسيا واحدا لكل شاشة.
- ابدأ التسمية بفعل يصف ما سيحدث.
- ضع الإجراء المدمّر آخرا، أبعد ما يكون عن الإجراء الرئيسي.
- لا تستخدم زرا عاديا بديلا عن الرابط.
- لا تضع أكثر من صيغة أساسية على الشاشة نفسها.
- لا تستخدم نعم/لا كتسمية.
إمكانية الوصول
- مساحة اللمس 44×44 بكسل على الأقل (مضمونة بالحد الأدنى للارتفاع).
- تسمية وصول عربية مطلوبة، بما في ذلك صيغة الأيقونة فقط.
- حلقة تركيز واضحة من طبقتَي الحدود والألوان؛ المدمّر يستخدم focus.negative.
- حين يشير الزر إلى حالة (مثل المدمّر) اقرن اللون بتسمية نصية، لا لون وحده.
الشيفرة
الزر يُستورد من حزمة المكوّنات، ويُنسّق بالكامل من الرموز الدلالية، لا من قيم خام. الاستخدام في React أولا، ثم عقد CSS الذي يربط كل صيغة وحالة برمزها.
import { Button } from "@mercato/components";
<Button variant="primary">إرسال الطلبية</Button>
<Button variant="secondary" icon="add">إضافة</Button>
<Button variant="destructive">حذف</Button>
<Button variant="primary" loading>إرسال</Button>
<Button variant="primary" iconOnly icon="add" aria-label="إضافة" />/* Pill button, authored from semantic tokens only. */
.btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: var(--spacing-inline-sm);
min-height: 44px; /* accessible touch target */
padding: var(--spacing-inset-xs) var(--spacing-inset-lg);
border: var(--border-base) solid transparent;
border-radius: var(--shape-rounded); /* Mercato buttons are pills */
font-family: var(--type-label-md-strong-family);
font-weight: var(--type-label-md-strong-weight);
font-size: var(--type-label-md-strong-size);
line-height: var(--type-label-md-strong-line-height);
transition:
background-color var(--motion-feedback-duration) var(--motion-feedback-easing),
border-color var(--motion-feedback-duration) var(--motion-feedback-easing);
}
/* variant x state -> token */
.btn-primary { background: var(--color-bg-action-accent-primary-default); color: var(--color-fg-action-accent-on-color); }
.btn-primary:hover:not(:disabled) { background: var(--color-bg-action-accent-primary-hover); }
.btn-primary:active:not(:disabled) { background: var(--color-bg-action-accent-primary-pressed); }
.btn-secondary { background: transparent; color: var(--color-fg-action-accent-default);
border-color: var(--color-border-action-accent-secondary-default); }
.btn-secondary:hover:not(:disabled){ background: var(--color-bg-action-accent-secondary-hover); }
.btn-destructive { background: var(--color-bg-action-negative-primary-default); color: var(--color-fg-action-negative-on-color); }
.btn-destructive:hover:not(:disabled){ background: var(--color-bg-action-negative-primary-hover); }
.btn:disabled { opacity: 0.5; cursor: not-allowed; }
.btn:focus-visible { outline: var(--border-focus) solid var(--color-focus-default); outline-offset: 2px; }لا يحمل الزر قيمة لون أو استدارة أو مسافة مباشرة: تبديل الوضع الداكن أو إعادة العلامة يسري تلقائيا لأن كل شيء يمرّ عبر الرموز.
| الخطأ | ما يفسد | الصواب |
|---|---|---|
| لون أزرق ثابت (#1B79F5) | يكسر الوضع الداكن وإعادة العلامة | var(--color-bg-action-accent-primary-default) |
| border-radius: 999px مباشرة | ينحرف عن سلّم الأشكال | var(--shape-rounded) |
| إزالة مخطط التركيز | يفشل الوصول بلوحة المفاتيح | أبقِ outline بـ --color-focus-default |
| أكثر من زر أساسي على الشاشة | يميّع التسلسل الهرمي | زر أساسي واحد، والبقية ثانوية أو سادة |