الانتقال إلى المحتوى
الأقسام
اللغة، حاليًا العربية
نظام تصميم Rastrillo

الاختيارات والإجراءات

عناصر التحكّم التي تختار من بين الخيارات، والصفوف التي تختم النموذج. وكلٌّ منها داخل ‎rst-box‎ ذي حشو، لأن هذه هي القاعدة التي تفترضها هذه الأجزاء.

كل مثال يعمل فعلًا، لكن روابطه لا تؤدي إلى أي مكان. يعرض HTML الترميز الجاهز للنسخ.

field-select

غلاف field حول عنصر select أصلي. فإذا تجاوزت الخيارات عشرة فعّل الـ select صندوق التحرير والسرد القابل للتصفية في ‎select.js‎؛ ومع ذلك يظل ما يرسله النموذج هو الـ select الأصلي.

ثلاثة خيارات: عنصر select الأصلي

معاينة

ضع هذا داخل <section rst-box><form rst-form>.

<div rst-field>
  <label rst-field-label for="sel_few">الدور</label>
  <select rst-input id="sel_few" name="sel_few">
    <option value="admin" selected>مسؤول</option>
    <option value="editor">محرر</option>
    <option value="member">عضو</option>
  </select>
</div>

ضع هذا داخل <section rst-box><form rst-form>.

{{template "field-select" dict
    "ID" "sel_few"
    "Name" "sel_few"
    "Label" "الدور"
    "Options" (list
        (dict "Label" "مسؤول" "Selected" true "Value" "admin")
        (dict "Label" "محرر" "Value" "editor")
        (dict "Label" "عضو" "Value" "member"))}}

اثنا عشر خيارًا: مربّع الاختيار القابل للتصفية

معاينة

ضع هذا داخل <section rst-box><form rst-form>.

<div rst-field>
  <label rst-field-label for="sel_many">المدينة</label>
  <select rst-input id="sel_many" name="sel_many" data-rst-select data-rst-select-filter="اكتب للتصفية" data-rst-select-results="{n} نتائج" data-rst-select-result-one="نتيجة واحدة" data-rst-select-no-matches="لا توجد نتائج مطابقة" aria-describedby="sel_many-help">
    <option value="dublin" selected>دبلن</option>
    <option value="lisbon">لشبونة</option>
    <option value="madrid">مدريد</option>
    <option value="berlin">برلين</option>
    <option value="rome">روما</option>
    <option value="athens">أثينا</option>
    <option value="helsinki">هلسنكي</option>
    <option value="reykjavík">ريكيافيك</option>
    <option value="warsaw">وارسو</option>
    <option value="zagreb">زغرب</option>
    <option value="tallinn">تالين</option>
    <option value="valletta">فاليتا</option>
  </select>
  <p rst-field-help id="sel_many-help">ابدأ الكتابة للتصفية.</p>
</div>

ضع هذا داخل <section rst-box><form rst-form>.

{{template "field-select" dict
    "ID" "sel_many"
    "Name" "sel_many"
    "Label" "المدينة"
    "Options" (list
        (dict "Label" "دبلن" "Selected" true "Value" "dublin")
        (dict "Label" "لشبونة" "Value" "lisbon")
        (dict "Label" "مدريد" "Value" "madrid")
        (dict "Label" "برلين" "Value" "berlin")
        (dict "Label" "روما" "Value" "rome")
        (dict "Label" "أثينا" "Value" "athens")
        (dict "Label" "هلسنكي" "Value" "helsinki")
        (dict "Label" "ريكيافيك" "Value" "reykjavík")
        (dict "Label" "وارسو" "Value" "warsaw")
        (dict "Label" "زغرب" "Value" "zagreb")
        (dict "Label" "تالين" "Value" "tallinn")
        (dict "Label" "فاليتا" "Value" "valletta"))
    "Help" "ابدأ الكتابة للتصفية."}}

إذا تجاوزت الخيارات عشرة فعّل الجزء select.js، وإن قلّت عن عشرة فلا: البحث بين حفنة عناصر أثاث لا عون.

اثنا عشر خيارًا، Plain: مع رفض التحسين

معاينة

ضع هذا داخل <section rst-box><form rst-form>.

<div rst-field>
  <label rst-field-label for="sel_plain">المدينة</label>
  <select rst-input id="sel_plain" name="sel_plain">
    <option value="dublin" selected>دبلن</option>
    <option value="lisbon">لشبونة</option>
    <option value="madrid">مدريد</option>
    <option value="berlin">برلين</option>
    <option value="rome">روما</option>
    <option value="athens">أثينا</option>
    <option value="helsinki">هلسنكي</option>
    <option value="reykjavík">ريكيافيك</option>
    <option value="warsaw">وارسو</option>
    <option value="zagreb">زغرب</option>
    <option value="tallinn">تالين</option>
    <option value="valletta">فاليتا</option>
  </select>
</div>

ضع هذا داخل <section rst-box><form rst-form>.

{{template "field-select" dict
    "ID" "sel_plain"
    "Name" "sel_plain"
    "Label" "المدينة"
    "Options" (list
        (dict "Label" "دبلن" "Selected" true "Value" "dublin")
        (dict "Label" "لشبونة" "Value" "lisbon")
        (dict "Label" "مدريد" "Value" "madrid")
        (dict "Label" "برلين" "Value" "berlin")
        (dict "Label" "روما" "Value" "rome")
        (dict "Label" "أثينا" "Value" "athens")
        (dict "Label" "هلسنكي" "Value" "helsinki")
        (dict "Label" "ريكيافيك" "Value" "reykjavík")
        (dict "Label" "وارسو" "Value" "warsaw")
        (dict "Label" "زغرب" "Value" "zagreb")
        (dict "Label" "تالين" "Value" "tallinn")
        (dict "Label" "فاليتا" "Value" "valletta"))
    "Plain" true}}

مطلوب، مع خطأ

معاينة

ضع هذا داخل <section rst-box><form rst-form>.

<div rst-field>
  <label rst-field-label for="sel_error">الدور</label>
  <select rst-input id="sel_error" name="sel_error" required aria-invalid="true" aria-describedby="sel_error-error">
    <option value="admin" selected>مسؤول</option>
    <option value="editor">محرر</option>
    <option value="member">عضو</option>
  </select>
  <p rst-field-error id="sel_error-error" role="alert">اختر دورًا لهذا الشخص.</p>
</div>

ضع هذا داخل <section rst-box><form rst-form>.

{{template "field-select" dict
    "ID" "sel_error"
    "Name" "sel_error"
    "Label" "الدور"
    "Options" (list
        (dict "Label" "مسؤول" "Selected" true "Value" "admin")
        (dict "Label" "محرر" "Value" "editor")
        (dict "Label" "عضو" "Value" "member"))
    "Required" true
    "Error" "اختر دورًا لهذا الشخص."}}

مكتوب يدويًا، مع optgroup

معاينة

ضع هذا داخل <section rst-box><form rst-form>.

<div rst-field>
  <label rst-field-label for="sel_grouped">المنطقة</label>
  <select rst-input id="sel_grouped" name="sel_grouped" data-rst-select data-rst-select-filter="اكتب للتصفية" data-rst-select-results="{n} نتائج" data-rst-select-result-one="نتيجة واحدة" data-rst-select-no-matches="لا توجد نتائج مطابقة">
    <optgroup label="أوروبا">
      <option value="dublin" selected>دبلن</option>
      <option value="lisbon">لشبونة</option>
      <option value="warsaw">وارسو</option>
    </optgroup>
    <optgroup label="الأمريكتان">
      <option value="montreal">مونتريال</option>
      <option value="lima">ليما</option>
      <option value="austin">أوستن</option>
    </optgroup>
    <optgroup label="آسيا">
      <option value="osaka">أوساكا</option>
      <option value="hanoi">هانوي</option>
      <option value="dhaka">دكا</option>
    </optgroup>
    <optgroup label="أفريقيا">
      <option value="accra">أكرا</option>
      <option value="nairobi">نيروبي</option>
      <option value="tunis">تونس</option>
    </optgroup>
  </select>
</div>

Options هنا قائمة مسطّحة، فالخيارات المجمّعة شيفرة يكتبها التطبيق نفسه. ويرسم select.js المجموعات بدل إسقاطها، كما يمكن لـ select مكتوب يدويًا أن يرفض التحسين كلّيًا بـ ‎data-rst-select="false"‎.

field-check

آلية التبديل الوحيدة: مربّع تأشير حقيقي بمظهر مفتاح، مع بقاء لوحة المفاتيح وقارئ الشاشة على حالهما.

مُشغَّل

معاينة

ضع هذا داخل <section rst-box><form rst-form>.

<label rst-switch>
  <input type="checkbox" name="notify_on" checked>
  <span rst-switch-track aria-hidden="true"></span>
  راسلني عند وصول الردود
</label>

ضع هذا داخل <section rst-box><form rst-form>.

{{template "field-check" dict
    "Name" "notify_on"
    "Label" "راسلني عند وصول الردود"
    "Checked" true}}

مُطفأ

معاينة

ضع هذا داخل <section rst-box><form rst-form>.

<label rst-switch>
  <input type="checkbox" name="notify_off">
  <span rst-switch-track aria-hidden="true"></span>
  راسلني عند الإشارة إليّ
</label>

ضع هذا داخل <section rst-box><form rst-form>.

{{template "field-check" dict
    "Name" "notify_off"
    "Label" "راسلني عند الإشارة إليّ"}}

معطَّل

معاينة

ضع هذا داخل <section rst-box><form rst-form>.

<label rst-switch>
  <input type="checkbox" name="notify_disabled" disabled>
  <span rst-switch-track aria-hidden="true"></span>
  أرسل لي ملخصًا أسبوعيًا
</label>

ضع هذا داخل <section rst-box><form rst-form>.

{{template "field-check" dict
    "Name" "notify_disabled"
    "Label" "أرسل لي ملخصًا أسبوعيًا"
    "Disabled" true}}

choice-field

بطاقات الخيارات، الشكل المفضّل لمجموعة أزرار الاختيار أو مربّعات التأشير. يبقى Title قصيرًا، ويتولّى Desc الشرح.

اختر واحدًا

معاينة

ضع هذا داخل <section rst-box><form rst-form>.

<fieldset rst-choice>
  <legend>الخطة</legend>
  <div rst-choice-cards>
    <label>
      <input type="radio" name="plan" value="free">
      <span>
        <span rst-choice-title>مجاني</span>
        <span rst-choice-desc>مشروع واحد، ودعم من المجتمع.</span>
      </span>
    </label>
    <label>
      <input type="radio" name="plan" value="pro" checked>
      <span>
        <span rst-choice-title>احترافي</span>
        <span rst-choice-desc>مشاريع بلا حدود وصندوق بريد للدعم.</span>
      </span>
    </label>
  </div>
</fieldset>

ضع هذا داخل <section rst-box><form rst-form>.

{{template "choice-field" dict
    "Legend" "الخطة"
    "Name" "plan"
    "Options" (list
        (dict "Desc" "مشروع واحد، ودعم من المجتمع." "Title" "مجاني" "Value" "free")
        (dict "Checked" true "Desc" "مشاريع بلا حدود وصندوق بريد للدعم." "Title" "احترافي" "Value" "pro"))}}

اختر ما شئت

معاينة

ضع هذا داخل <section rst-box><form rst-form>.

<fieldset rst-choice>
  <legend>أرسل إليّ</legend>
  <div rst-choice-cards>
    <label>
      <input type="checkbox" name="digest" value="replies" checked>
      <span>
        <span rst-choice-title>الردود</span>
        <span rst-choice-desc>فور حدوثها.</span>
      </span>
    </label>
    <label>
      <input type="checkbox" name="digest" value="weekly">
      <span>
        <span rst-choice-title>ملخص أسبوعي</span>
        <span rst-choice-desc>صباح كل اثنين.</span>
      </span>
    </label>
  </div>
</fieldset>

ضع هذا داخل <section rst-box><form rst-form>.

{{template "choice-field" dict
    "Legend" "أرسل إليّ"
    "Name" "digest"
    "Type" "checkbox"
    "Options" (list
        (dict "Checked" true "Desc" "فور حدوثها." "Title" "الردود" "Value" "replies")
        (dict "Desc" "صباح كل اثنين." "Title" "ملخص أسبوعي" "Value" "weekly"))}}

form-foot

صف الختام في النموذج: زر إرسال رئيسي واحد ورابط إلغاء اختياري. الإلغاء رابط لأن مغادرة النموذج تنقُّل بين الصفحات.

الحفظ والإلغاء

معاينة

ضع هذا داخل <section rst-box><form rst-form>.

<div rst-form-foot>
  <button rst-btn="primary lg" type="submit">حفظ المنشور</button>
  <a rst-btn="lg" href="/posts">العودة إلى المنشورات</a>
</div>

ضع هذا داخل <section rst-box><form rst-form>.

{{template "form-foot" dict
    "Submit" "حفظ المنشور"
    "CancelHref" "/posts"
    "CancelLabel" "العودة إلى المنشورات"}}

الإرسال فقط

معاينة

ضع هذا داخل <section rst-box><form rst-form>.

<div rst-form-foot>
  <button rst-btn="primary lg" type="submit">إرسال الدعوة</button>
</div>

ضع هذا داخل <section rst-box><form rst-form>.

{{template "form-foot" dict "Submit" "إرسال الدعوة"}}

في السكون: الزر قبل أن يحدث أي شيء

معاينة

ضع هذا داخل <section rst-box><form rst-form>.

<div rst-form-foot>
  <button rst-btn="primary lg" type="submit">نشر</button>
  <a rst-btn="lg" href="/posts">العودة إلى المنشورات</a>
</div>

ضع هذا داخل <section rst-box><form rst-form>.

{{template "form-foot" dict
    "Submit" "نشر"
    "CancelHref" "/posts"
    "CancelLabel" "العودة إلى المنشورات"}}

الزر الذي يُغيّر شيئًا يحصل على حالة تحميل، أما الزر الذي يكشف شيئًا فقط — كطيّ أو قائمة منسدلة أو تبويب — فلا. يطبّق rastrillo.js هذه القاعدة على كل زر إرسال في كل نموذج، دون أي شيء تفعّله.

قيد العمل: ما يكتبه rastrillo.js عند خروج النموذج

معاينة

ضع هذا داخل <section rst-box><form rst-form>.

<div rst-form-foot>
  <button rst-btn="primary lg" type="submit" aria-busy="true" disabled>
    <span rst-spin aria-hidden="true"></span>
    نشر
  </button>
  <a rst-btn="lg" href="/posts">العودة إلى المنشورات</a>
</div>

الزر الذي نُقر عليه وحده: تحتفظ بقية أزرار الإرسال في النموذج باسمها وقيمتها، والنموذج نفسه محميّ من إرسال ثانٍ. تُلغي data-busy="false" القاعدة، على النموذج أو على زر واحد؛ وتستبدل data-busy-label النص. مع إيقاف السكربتات لا يحدث أي من هذا ويُرسَل النموذج كما كان دائمًا، فتبقى الحيادية عند التكرار من مهام الخادم.

confirm-form

صف الإجراءات في صفحة التأكيد. للإجراءات المُتلِفة مسار خاص بها لا مربّع حوار، فلا شيء يحتاج إلى برمجة.

إجراء مُتلِف

معاينة

ضع هذا داخل <section rst-box>.

<form rst-form-actions method="post" action="/posts/1/delete">
  <input type="hidden" name="csrf" value="tok-123">
  <input type="hidden" name="id" value="1">
  <a rst-btn="ghost lg" href="/posts/1">إلغاء</a>
  <button type="submit" rst-btn="danger lg">حذف هذا المنشور</button>
</form>

ضع هذا داخل <section rst-box>.

{{template "confirm-form" dict
    "Action" "/posts/1/delete"
    "Label" "حذف هذا المنشور"
    "Danger" true
    "Hidden" (list (list "csrf" "tok-123") (list "id" "1"))
    "CancelHref" "/posts/1"}}

الحالة العادية، بصياغة الإلغاء الافتراضية

معاينة

ضع هذا داخل <section rst-box>.

<form rst-form-actions method="post" action="/posts/1/publish">
  <a rst-btn="ghost lg" href="/posts/1">إلغاء</a>
  <button type="submit" rst-btn="primary lg">نشر</button>
</form>

ضع هذا داخل <section rst-box>.

{{template "confirm-form" dict
    "Action" "/posts/1/publish"
    "Label" "نشر"
    "CancelHref" "/posts/1"}}

لا يوجد CancelLabel، فتأتي صياغة رابط الإلغاء من الفهرس.