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

شاشة القائمة

شاشة قائمة عامة فيها عنوان وشريط أدوات وصفوف، تعمل على سطح المكتب وعلى الهاتف.

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

page-header

شريط عنوان الشاشة: عنصر h1، وعنوان فرعي اختياري، وإجراء رئيسي.

عنوان وعنوان فرعي وإجراء رئيسي

معاينة
<header rst-page-header>
  <div rst-page-header-titles>
    <h1>المنشورات</h1>
    <p rst-page-header-sub>كل ما كتبته، الأحدث أولًا.</p>
  </div>
  <a rst-btn="primary" href="/posts/new">
    <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14"/><path d="M12 5v14"/></svg>
    اكتب منشورًا
  </a>
</header>
{{template "page-header" dict
    "Title" "المنشورات"
    "Sub" "كل ما كتبته، الأحدث أولًا."
    "ActionHref" "/posts/new"
    "ActionLabel" "اكتب منشورًا"
    "ActionIcon" "plus"}}

العنوان وحده

معاينة
<header rst-page-header>
  <div rst-page-header-titles>
    <h1>الإعدادات</h1>
  </div>
</header>
{{template "page-header" dict "Title" "الإعدادات"}}

list-bar

شريط الأدوات أعلى بطاقة القائمة، مع البحث والتصفية.

بحث مع قائمة تصفية منسدلة

معاينة

ضع هذا داخل <div rst-list>.

<div rst-lbar>
  <search>
    <form rst-search method="get" action="/posts">
      <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="11" cy="11" r="8"/><path d="m21 21-4.3-4.3"/></svg>
      <input type="search" name="q" value="إصدار" placeholder="ابحث في المنشورات" aria-label="ابحث في المنشورات">
      <a rst-search-clear href="/posts?sort=newest" aria-label="مسح البحث">
        <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M18 6 6 18"/><path d="m6 6 12 12"/></svg>
      </a>
      <input type="hidden" name="sort" value="newest">
      <button class="rst-sr-only" type="submit">بحث</button>
    </form>
  </search>
  <details rst-dropdown name="rst-menus">
    <summary rst-btn aria-label="التصفية حسب الحالة: مدفوع">
      مدفوع
      <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"/></svg>
    </summary>
    <div rst-dropdown-menu>
      <a href="/posts">الكل</a>
      <a href="/posts?status=paid" aria-current="true">مدفوع <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"/></svg></a>
      <a href="/posts?status=free">مجاني</a>
    </div>
  </details>
</div>

ضع هذا داخل <div rst-list>.

{{template "list-bar" dict
    "Filter" (dict "Aria" "التصفية حسب الحالة: مدفوع" "Items" (list (dict "Href" "/posts" "Label" "الكل") (dict "Current" true "Href" "/posts?status=paid" "Label" "مدفوع") (dict "Href" "/posts?status=free" "Label" "مجاني")) "Label" "مدفوع")
    "Hidden" (list (list "sort" "newest"))
    "Placeholder" "ابحث في المنشورات"
    "Query" "إصدار"
    "SearchAction" "/posts"}}

list-search-submit

زر الإرسال الحقيقي لنموذج البحث: مخفيّ بصريًّا، لكنه ضمن ترتيب Tab، ويظهر حين يصله تركيز لوحة المفاتيح.

التسمية الافتراضية

معاينة

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

<button class="rst-sr-only" type="submit">بحث</button>

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

{{template "list-search-submit" dict}}

لا يظهر هنا شيء إلى أن تصل إليه بمفتاح Tab.

list-row-action

صف واحد من القائمة: اسم السجل رابطًا رئيسيًا، وسطر معلومات، وإجراء ثانوي.

علامة في المقدّمة وحالة وإجراء واحد

معاينة

ضع هذا داخل <div rst-list>.

<div rst-row>
  <span rst-row-lead data-lead="accent" aria-hidden="true">RN</span>
  <span rst-row-main><a href="/posts/1">ملاحظات الإصدار، أغسطس</a>
    <small rst-row-sub>نُشر في 2 أغسطس · قراءة 4 دقائق</small>
  </span>
  <span rst-status rst-tone="positive">منشور</span>
  <a rst-row-action href="/posts/1/edit" aria-label="تعديل ملاحظات الإصدار، أغسطس">تعديل</a>
</div>

ضع هذا داخل <div rst-list>.

{{template "list-row-action" dict
    "Href" "/posts/1"
    "Main" "ملاحظات الإصدار، أغسطس"
    "Sub" "نُشر في 2 أغسطس · قراءة 4 دقائق"
    "ActionHref" "/posts/1/edit"
    "ActionLabel" "تعديل"
    "ActionAria" "تعديل ملاحظات الإصدار، أغسطس"
    "StatusTone" "positive"
    "StatusLabel" "منشور"
    "Lead" "accent"
    "LeadInitial" "RN"}}

الاسم وسطر البيانات الفرعية فقط

معاينة

ضع هذا داخل <div rst-list>.

<div rst-row>
  <span rst-row-main><a href="/posts/2">لماذا تركنا المشغّل القديم</a>
    <small rst-row-sub>مسودة · حُفظت قبل 20 دقيقة</small>
  </span>
</div>

ضع هذا داخل <div rst-list>.

{{template "list-row-action" dict
    "Href" "/posts/2"
    "Main" "لماذا تركنا المشغّل القديم"
    "Sub" "مسودة · حُفظت قبل 20 دقيقة"}}

row-menu

بقية إجراءات الصف، خلف زر ⋮. الإجراء الهدّام رابط إلى صفحة التأكيد الخاصة به.

روابط ونموذج وعنصر هدّام

معاينة
<details rst-row-menu name="rst-menus">
  <summary aria-label="إجراءات Grace Hopper">
    <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="1"/><circle cx="12" cy="5" r="1"/><circle cx="12" cy="19" r="1"/></svg>
  </summary>
  <div rst-row-menu-panel>
    <a href="/orders/AB3PX/edit">تعديل</a>
    <form method="post" action="/orders/AB3PX/archive">
      <input type="hidden" name="state" value="archived">
      <button type="submit">أرشفة</button>
    </form>
    <hr>
    <a class="rst-danger" href="/orders/AB3PX/delete">حذف الطلب…</a>
  </div>
</details>
{{template "row-menu" dict
    "Name" "Grace Hopper"
    "Items" (list
        (dict "Href" "/orders/AB3PX/edit" "Label" "تعديل")
        (dict "Action" "/orders/AB3PX/archive" "Hidden" (list (list "state" "archived")) "Label" "أرشفة")
        (dict "Danger" true "Href" "/orders/AB3PX/delete" "Label" "حذف الطلب…"))}}

ضع العنصر الهدّام في الآخر واختم تسميته بـ …. يفتح صفحة تسأل قبل حذف أي شيء.

روابط فقط، لقائمة داخل نموذج تحديد

معاينة
<details rst-row-menu name="rst-menus">
  <summary aria-label="إجراءات Alan Turing">
    <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="1"/><circle cx="12" cy="5" r="1"/><circle cx="12" cy="19" r="1"/></svg>
  </summary>
  <div rst-row-menu-panel>
    <a href="/orders/CD4QY/edit">تعديل</a>
    <hr>
    <a class="rst-danger" href="/orders/CD4QY/delete">حذف الطلب…</a>
  </div>
</details>
{{template "row-menu" dict
    "Name" "Alan Turing"
    "Items" (list
        (dict "Href" "/orders/CD4QY/edit" "Label" "تعديل")
        (dict "Danger" true "Href" "/orders/CD4QY/delete" "Label" "حذف الطلب…"))}}

داخل النموذج، يجب أن يكون كل عنصر رابطًا. الإجراء الذي يرسل بيانات يمر عبر صفحة خاصة به.

seg-tabs

عنصر تحكّم مقسّم مكوّن من روابط تُبنى في الخادم. التبويب الحالي هو aria-current على رابط.

قسمان

معاينة
<nav rst-seg-tabs aria-label="أقسام المنشور">
  <a href="?tab=basics" aria-current="page">الأساسيات</a>
  <a href="?tab=advanced">متقدم</a>
</nav>
{{template "seg-tabs" dict
    "Label" "أقسام المنشور"
    "Items" (list
        (dict "Current" true "Href" "?tab=basics" "Label" "الأساسيات")
        (dict "Href" "?tab=advanced" "Label" "متقدم"))}}

dropdown

عنصر يُفتح ويُغلق بلا أي JavaScript: زر summary فوق لوحة من روابط عادية.

قائمة تصفية بخيار واحد مطبَّق

معاينة
<details rst-dropdown name="rst-menus">
  <summary rst-btn aria-label="ترتيب المنشورات: الأحدث أولًا">
    الأحدث
    <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"/></svg>
  </summary>
  <div rst-dropdown-menu>
    <a href="/posts?sort=newest" aria-current="true">الأحدث <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"/></svg></a>
    <a href="/posts?sort=oldest">الأقدم</a>
    <a href="/posts?sort=title">حسب العنوان</a>
  </div>
</details>
{{template "dropdown" dict
    "Label" "الأحدث"
    "Aria" "ترتيب المنشورات: الأحدث أولًا"
    "Items" (list
        (dict "Current" true "Href" "/posts?sort=newest" "Label" "الأحدث")
        (dict "Href" "/posts?sort=oldest" "Label" "الأقدم")
        (dict "Href" "/posts?sort=title" "Label" "حسب العنوان"))}}

bulk-bar

شريط ترويسة وضع التحديد، يحلّ محل شريط القائمة: العدد، ورابط لتوسيع التحديد، وقائمة الإجراءات.

ثلاثة صفوف محدَّدة

معاينة

ضع هذا داخل <div rst-list>.

<div rst-bulkbar>
  <a rst-bulkbar-close href="/posts" aria-label="تم التحديد">
    <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M18 6 6 18"/><path d="m6 6 12 12"/></svg>
  </a>
  <span rst-bulkbar-selection><span rst-bulkbar-count>تم تحديد 3</span><a rst-bulkbar-escalate href="/posts?select=all">تحديد كل النتائج المطابقة وعددها 412</a></span>
  <details rst-dropdown name="rst-menus">
    <summary>
      الإجراءات
      <span rst-caret aria-hidden="true">
        <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"/></svg>
      </span>
    </summary>
    <div rst-dropdown-menu>
      <button type="submit" name="action" value="export">تصدير</button>
      <button type="submit" name="action" value="unpublish">إلغاء النشر</button>
      <button type="submit" name="action" value="delete" class="rst-danger">حذف…</button>
    </div>
  </details>
</div>

ضع هذا داخل <div rst-list>.

{{template "bulk-bar" dict
    "DoneHref" "/posts"
    "Count" "تم تحديد 3"
    "EscalateHref" "/posts?select=all"
    "EscalateLabel" "تحديد كل النتائج المطابقة وعددها 412"
    "Actions" (list
        (dict "Label" "تصدير" "Value" "export")
        (dict "Label" "إلغاء النشر" "Value" "unpublish")
        (dict "Danger" true "Label" "حذف…" "Value" "delete"))
    "MenuLabel" "الإجراءات"}}

العنصر المُتلِف يأتي أخيرًا: فالمدخل الأول هو ما يشغّله النموذج المحيط ضمنيًّا عند ضغط Enter.

media-grid

شبكة من بلاطات الصور. كل إطار بنسبة 4:3، فتستقر لقطات الشاشة الطويلة واللافتات العريضة في شبكة واحدة منتظمة.

لقطات شاشة وشعار ولافتة

معاينة

ضع هذا داخل <div rst-list>.

<div rst-media>
  <div rst-media-tile>
    <div rst-media-frame>
      <img src="/images/checkout.png" alt="" loading="lazy" decoding="async" width="1280" height="3200">
    </div>
    <div rst-media-caption>
      <div rst-media-name>
        <a href="/images/1">الدفع، الخطوة 2</a>
        <details rst-row-menu name="rst-menus">
          <summary aria-label="إجراءات الدفع، الخطوة 2">
            <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="1"/><circle cx="12" cy="5" r="1"/><circle cx="12" cy="19" r="1"/></svg>
          </summary>
          <div rst-row-menu-panel>
            <a href="/images/1/edit">تعديل</a>
            <hr>
            <a class="rst-danger" href="/images/1/delete">حذف…</a>
          </div>
        </details>
      </div>
      <p rst-media-desc>خطوة الدفع، ونموذج البطاقة مفتوح.</p>
      <p rst-media-meta>1280 × 3200 · 412 KB</p>
    </div>
  </div>
  <div rst-media-tile>
    <div rst-media-frame>
      <img src="/images/pricing.png" alt="" loading="lazy" decoding="async" width="1280" height="2400">
    </div>
    <div rst-media-caption>
      <div rst-media-name>
        <a href="/images/2">صفحة الأسعار</a>
        <details rst-row-menu name="rst-menus">
          <summary aria-label="إجراءات صفحة الأسعار">
            <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="1"/><circle cx="12" cy="5" r="1"/><circle cx="12" cy="19" r="1"/></svg>
          </summary>
          <div rst-row-menu-panel>
            <a href="/images/2/edit">تعديل</a>
            <hr>
            <a class="rst-danger" href="/images/2/delete">حذف…</a>
          </div>
        </details>
      </div>
      <p rst-media-desc="none">لا يوجد وصف</p>
      <p rst-media-meta>1280 × 2400 · 318 KB</p>
    </div>
  </div>
  <div rst-media-tile>
    <div rst-media-frame="contain">
      <img src="/images/logo.svg" alt="Harbour" loading="lazy" decoding="async" width="240" height="240">
    </div>
    <div rst-media-caption>
      <div rst-media-name>
        <a href="/images/3">شعار Harbour</a>
        <details rst-row-menu name="rst-menus">
          <summary aria-label="إجراءات شعار Harbour">
            <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="1"/><circle cx="12" cy="5" r="1"/><circle cx="12" cy="19" r="1"/></svg>
          </summary>
          <div rst-row-menu-panel>
            <a href="/images/3/edit">تعديل</a>
            <hr>
            <a class="rst-danger" href="/images/3/delete">حذف…</a>
          </div>
        </details>
      </div>
      <p rst-media-desc>العلامة وحدها، للخلفيات الداكنة والفاتحة.</p>
      <p rst-media-meta>240 × 240 · 3 KB</p>
    </div>
  </div>
  <div rst-media-tile>
    <div rst-media-frame="contain">
      <img src="/images/banner.png" alt="" loading="lazy" decoding="async" width="1200" height="200">
    </div>
    <div rst-media-caption>
      <div rst-media-name>
        <a href="/images/4">لافتة الربيع</a>
        <details rst-row-menu name="rst-menus">
          <summary aria-label="إجراءات لافتة الربيع">
            <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="1"/><circle cx="12" cy="5" r="1"/><circle cx="12" cy="19" r="1"/></svg>
          </summary>
          <div rst-row-menu-panel>
            <a href="/images/4/edit">تعديل</a>
            <hr>
            <a class="rst-danger" href="/images/4/delete">حذف…</a>
          </div>
        </details>
      </div>
      <p rst-media-desc>الشريط أعلى المتجر في مارس.</p>
      <p rst-media-meta>1200 × 200 · 64 KB</p>
    </div>
  </div>
</div>

ضع هذا داخل <div rst-list>.

{{template "media-grid" dict
    "Items" (list
        (dict "Desc" "خطوة الدفع، ونموذج البطاقة مفتوح." "Height" 3200 "Href" "/images/1" "Menu" (list (dict "Href" "/images/1/edit" "Label" "تعديل") (dict "Danger" true "Href" "/images/1/delete" "Label" "حذف…")) "Meta" "1280 × 3200 · 412 KB" "Name" "الدفع، الخطوة 2" "Src" "/images/checkout.png" "Width" 1280)
        (dict "Desc" "" "Height" 2400 "Href" "/images/2" "Menu" (list (dict "Href" "/images/2/edit" "Label" "تعديل") (dict "Danger" true "Href" "/images/2/delete" "Label" "حذف…")) "Meta" "1280 × 2400 · 318 KB" "Name" "صفحة الأسعار" "Src" "/images/pricing.png" "Width" 1280)
        (dict "Alt" "Harbour" "Desc" "العلامة وحدها، للخلفيات الداكنة والفاتحة." "Fit" "contain" "Height" 240 "Href" "/images/3" "Menu" (list (dict "Href" "/images/3/edit" "Label" "تعديل") (dict "Danger" true "Href" "/images/3/delete" "Label" "حذف…")) "Meta" "240 × 240 · 3 KB" "Name" "شعار Harbour" "Src" "/images/logo.svg" "Width" 240)
        (dict "Desc" "الشريط أعلى المتجر في مارس." "Fit" "contain" "Height" 200 "Href" "/images/4" "Menu" (list (dict "Href" "/images/4/edit" "Label" "تعديل") (dict "Danger" true "Href" "/images/4/delete" "Label" "حذف…")) "Meta" "1200 × 200 · 64 KB" "Name" "لافتة الربيع" "Src" "/images/banner.png" "Width" 1200))}}

اضبط Fit على "contain" للشعار أو اللافتة. تبقى لقطة الشاشة على الإعداد الافتراضي وتعرض جزءها العلوي. البلاطة التي بلا Desc تقول "لا يوجد وصف".

وضع التحديد، بلاطة واحدة محدَّدة

معاينة

ضع هذا داخل <div rst-list>.

<div rst-media>
  <div rst-media-tile>
    <div rst-media-frame>
      <img src="/images/checkout.png" alt="" loading="lazy" decoding="async" width="1280" height="3200">
      <label rst-selbox>
        <input type="checkbox" name="id" value="1" checked aria-label="تحديد الدفع، الخطوة 2">
      </label>
    </div>
    <div rst-media-caption>
      <div rst-media-name>
        <a href="/images/1">الدفع، الخطوة 2</a>
        <details rst-row-menu name="rst-menus">
          <summary aria-label="إجراءات الدفع، الخطوة 2">
            <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="1"/><circle cx="12" cy="5" r="1"/><circle cx="12" cy="19" r="1"/></svg>
          </summary>
          <div rst-row-menu-panel>
            <a href="/images/1/edit">تعديل</a>
            <hr>
            <a class="rst-danger" href="/images/1/delete">حذف…</a>
          </div>
        </details>
      </div>
      <p rst-media-desc>خطوة الدفع، ونموذج البطاقة مفتوح.</p>
      <p rst-media-meta>1280 × 3200 · 412 KB</p>
    </div>
  </div>
  <div rst-media-tile>
    <div rst-media-frame>
      <img src="/images/pricing.png" alt="" loading="lazy" decoding="async" width="1280" height="2400">
      <label rst-selbox>
        <input type="checkbox" name="id" value="2" aria-label="تحديد صفحة الأسعار">
      </label>
    </div>
    <div rst-media-caption>
      <div rst-media-name>
        <a href="/images/2">صفحة الأسعار</a>
        <details rst-row-menu name="rst-menus">
          <summary aria-label="إجراءات صفحة الأسعار">
            <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="1"/><circle cx="12" cy="5" r="1"/><circle cx="12" cy="19" r="1"/></svg>
          </summary>
          <div rst-row-menu-panel>
            <a href="/images/2/edit">تعديل</a>
            <hr>
            <a class="rst-danger" href="/images/2/delete">حذف…</a>
          </div>
        </details>
      </div>
      <p rst-media-desc="none">لا يوجد وصف</p>
      <p rst-media-meta>1280 × 2400 · 318 KB</p>
    </div>
  </div>
</div>

ضع هذا داخل <div rst-list>.

{{template "media-grid" dict
    "Items" (list
        (dict "Desc" "خطوة الدفع، ونموذج البطاقة مفتوح." "Height" 3200 "Href" "/images/1" "Menu" (list (dict "Href" "/images/1/edit" "Label" "تعديل") (dict "Danger" true "Href" "/images/1/delete" "Label" "حذف…")) "Meta" "1280 × 3200 · 412 KB" "Name" "الدفع، الخطوة 2" "Select" "1" "Selected" true "Src" "/images/checkout.png" "Width" 1280)
        (dict "Desc" "" "Height" 2400 "Href" "/images/2" "Menu" (list (dict "Href" "/images/2/edit" "Label" "تعديل") (dict "Danger" true "Href" "/images/2/delete" "Label" "حذف…")) "Meta" "1280 × 2400 · 318 KB" "Name" "صفحة الأسعار" "Select" "2" "Src" "/images/pricing.png" "Width" 1280))}}

ضع الشبكة وشريط bulk-bar في نموذج واحد. يرسل كل مربع اختيار قيمة Select الخاصة ببلاطته تحت الاسم "id"؛ اضبط SelectName لتغييره. داخل النموذج، يجب أن تكون عناصر القائمة روابط.

pagination

شريط من روابط عادية مرقّمة، حتى يظل التنقّل بين الصفحات يعمل مع تعطيل JavaScript.

في وسط قائمة طويلة

معاينة
<nav rst-pagination aria-label="صفحات المنشورات">
  <a href="/posts?page=3" rst-pagination-step="prev"><svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"/></svg><span rst-pagination-word>السابق</span></a>
  <a href="/posts?page=1">١</a>
  <span rst-pagination-gap aria-hidden="true">…</span>
  <a href="/posts?page=3" rst-pagination-wide>٣</a>
  <span aria-current="page">٤</span>
  <a href="/posts?page=5" rst-pagination-wide>٥</a>
  <span rst-pagination-gap aria-hidden="true">…</span>
  <a href="/posts?page=9">٩</a>
  <a href="/posts?page=5" rst-pagination-step="next"><svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"/></svg><span rst-pagination-word>التالي</span></a>
</nav>
{{template "pagination" dict
    "Items" (list
        (dict "Href" "/posts?page=3" "Label" "السابق" "Rel" "prev")
        (dict "Href" "/posts?page=1" "Label" "1")
        (dict "Gap" true)
        (dict "Href" "/posts?page=3" "Label" "3")
        (dict "Current" true "Label" "4")
        (dict "Href" "/posts?page=5" "Label" "5")
        (dict "Gap" true)
        (dict "Href" "/posts?page=9" "Label" "9")
        (dict "Href" "/posts?page=5" "Label" "التالي" "Rel" "next"))
    "Label" "صفحات المنشورات"}}

الصفحة الأولى، بالاسم الوصفي الافتراضي

معاينة
<nav rst-pagination aria-label="ترقيم الصفحات">
  <span rst-pagination-disabled rst-pagination-step="prev"><svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"/></svg><span rst-pagination-word>السابق</span></span>
  <span aria-current="page">١</span>
  <a href="/posts?page=2">٢</a>
  <a href="/posts?page=2" rst-pagination-step="next"><svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"/></svg><span rst-pagination-word>التالي</span></a>
</nav>
{{template "pagination" dict
    "Items" (list
        (dict "Disabled" true "Label" "السابق" "Rel" "prev")
        (dict "Current" true "Label" "1")
        (dict "Href" "/posts?page=2" "Label" "2")
        (dict "Href" "/posts?page=2" "Label" "التالي" "Rel" "next"))}}

لا يوجد Label، فيأتي الاسم الوصفي لعنصر nav من الفهرس.

empty-state

بطاقة الحالة الفارغة. حالة فارغة مع مداخل للخطوات الأولى.

مع دعوة إلى إجراء عبر POST

معاينة
<div rst-empty>
  <h2 rst-empty-title>لا شيء هنا بعد</h2>
  <p rst-empty-body>لا توجد منشورات بعد. منشورك الأول بداية جيدة.</p>
  <form rst-empty-cta method="post" action="/posts/seed">
    <input type="hidden" name="csrf" value="tok-123">
    <button rst-btn="primary" type="submit">أضف منشورات نموذجية</button>
  </form>
</div>
{{template "empty-state" dict
    "Body" "لا توجد منشورات بعد. منشورك الأول بداية جيدة."
    "Title" "لا شيء هنا بعد"
    "ActionLabel" "أضف منشورات نموذجية"
    "PostAction" "/posts/seed"
    "Hidden" (list (list "csrf" "tok-123"))}}

الجملة وحدها

معاينة
<div rst-empty>
  <p rst-empty-body>لا توجد تعليقات على هذا المنشور بعد.</p>
</div>
{{template "empty-state" dict "Body" "لا توجد تعليقات على هذا المنشور بعد."}}