মূল বিষয়ে যান
বিভাগসমূহ
ভাষা, এখন বাংলা
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}}

ট্যাব দিয়ে এখানে না আসা পর্যন্ত কিছুই দেখা যায় না।

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 একই ফর্মে রাখুন। প্রতিটি চেকবক্স "id" নামে তার টাইলের Select মান পাঠায়; বদলাতে 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" "এই পোস্টে এখনও কোনো মন্তব্য নেই।"}}