Mercato

المكونات

الزر

مُشغّل إجراء قابل للنقر يُرسل بيانات أو ينفّذ حدثا. زر بشكل حبّة، مبني بالكامل من رموز الأساس. زر أساسي واحد فقط لكل شاشة.

جاهز، مؤكّد من فيغماإجراءاتجاه منطقي
النضج
جاهز
الإصدار
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: زر داكن ناعم الاستدارة مع ظلّ خفيف وأيقونة. تُستخدم فقط كإجراء استرداد على شاشات الحالة الفارغة والأخطاء (مثل: لا نتائج) لتوجيه المستخدم لخطوة تالية. لا تستخدمها في التدفّقات العادية.

لا نتائج مطابقة

ابحث عن الدواء باسمه العلمي أو بالأعراض التي تظهر عليك.

نطاق الاستخدام

صيغة inverse محجوزة لشاشات الحالة الفارغة والأخطاء فقط. في التدفّقات العادية استخدم الأساسي (الحبّة الزرقاء) أو الثانوي.

الحالات

خمس حالات: الافتراضية، والتحويم، والنشطة (ضغط بحركة feedback)، والمعطّلة، والتحميل.

الفعل يبقى في التحميل

عند التحميل تحلّ الدوّامة محل النص مع بقاء نفس الفعل، فلا يتبدّل "إرسال" إلى "جارٍ الإرسال".

السلوك

الزر قابل للتركيز بلوحة المفاتيح، ويُفعّل بمفتاحي Enter وSpace. عند التحويم أو الضغط تتبدّل التعبئة عبر رموز الحركة (feedback)، ويظهر مخطط تركيز واضح عند التنقّل بلوحة المفاتيح. أثناء التحميل يصير الزر غير قابل للنقر مع بقاء أبعاده ثابتة فلا تقفز الشاشة، وعند التعطيل يفقد التفاعل ويخفت إلى النصف.

عرض ثابت أثناء التحميل

الدوّامة تحلّ محل النص داخل نفس الصندوق، فلا يتغيّر عرض الزر بين الحالة العادية وحالة التحميل.

افعل ولا تفعل

افعل
  • استخدم زرا أساسيا واحدا لكل شاشة.
  • ابدأ التسمية بفعل يصف ما سيحدث.
  • ضع الإجراء المدمّر آخرا، أبعد ما يكون عن الإجراء الرئيسي.
لا تفعل
  • لا تستخدم زرا عاديا بديلا عن الرابط.
  • لا تضع أكثر من صيغة أساسية على الشاشة نفسها.
  • لا تستخدم نعم/لا كتسمية.

إمكانية الوصول

  • مساحة اللمس 44×44 بكسل على الأقل (مضمونة بالحد الأدنى للارتفاع).
  • تسمية وصول عربية مطلوبة، بما في ذلك صيغة الأيقونة فقط.
  • حلقة تركيز واضحة من طبقتَي الحدود والألوان؛ المدمّر يستخدم focus.negative.
  • حين يشير الزر إلى حالة (مثل المدمّر) اقرن اللون بتسمية نصية، لا لون وحده.

الشيفرة

الزر يُستورد من حزمة المكوّنات، ويُنسّق بالكامل من الرموز الدلالية، لا من قيم خام. الاستخدام في React أولا، ثم عقد CSS الذي يربط كل صيغة وحالة برمزها.

React
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="إضافة" />
CSS
/* 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
أكثر من زر أساسي على الشاشةيميّع التسلسل الهرميزر أساسي واحد، والبقية ثانوية أو سادة