New Delhi · September 2026
Preceda

07 Navigation

Navigation

How counsel moves: links in four forms, the masthead and its phone counterparts, the breadcrumb, desk and utility tabs, and the foot of a long register.

  1. Link
  2. Masthead
  3. Compact head
  4. Bottom nav
  5. Breadcrumb
  6. Tabs
  7. Load more
  8. Pager

§ Composed

The masthead and the desk tabs of the matter workspace, as in the chambers plates: serif sections, one binding rule for where counsel is, and nothing else.

01

Link

Links go somewhere. They are binding ink on a printed underline; inside a sentence they take the sentence’s voice, on their own they are set in the serif, and the way back is a single guillemet.

Anatomy

.preceda-link
The 0.1 chrome link: Inter 14 in binding ink, rule-strong underline that darkens to the ink on hover.
--inline
Inherits the family, size and weight of the sentence (a judgment, a letter).
--standalone
A destination on its own line: serif 15, 40px target, a hairline rule under the words (__text).
--back
“‹ Matters”: ink serif at the reading size; the guillemet (__glyph) is aria-hidden.
--subdued
A secondary destination in tertiary ink (“Request an introduction”). Never a disabled link.
.preceda-link-list
Next steps on one line between drawn middots, with an optional small-caps lead.
external
A trailing arrow and “(opens in a new tab)” for assistive technology; target=_blank rel=noopener.

Variants

Inline

Paper

No notice under Section 35(3) BNSS was served, contrary to Arnesh Kumar v. State of Bihar, (2014) 8 SCC 273, reaffirmed in Satender Kumar Antil v. CBI, (2022) 10 SCC 51.

Lamp

No notice under Section 35(3) BNSS was served, contrary to Arnesh Kumar v. State of Bihar, (2014) 8 SCC 273, reaffirmed in Satender Kumar Antil v. CBI, (2022) 10 SCC 51.

Next steps

After a letter from the associate.

State matrix

StatePaperLamp
default
Members sign inMattersOpen the judgment

Contrary to the directions in Arnesh Kumar v. State of Bihar, (2014) 8 SCC 273.

Members sign inMattersOpen the judgment

Contrary to the directions in Arnesh Kumar v. State of Bihar, (2014) 8 SCC 273.

hover
Members sign inMattersOpen the judgment

Contrary to the directions in Arnesh Kumar v. State of Bihar, (2014) 8 SCC 273.

Members sign inMattersOpen the judgment

Contrary to the directions in Arnesh Kumar v. State of Bihar, (2014) 8 SCC 273.

focus-visible
Members sign inMattersOpen the judgment

Contrary to the directions in Arnesh Kumar v. State of Bihar, (2014) 8 SCC 273.

Members sign inMattersOpen the judgment

Contrary to the directions in Arnesh Kumar v. State of Bihar, (2014) 8 SCC 273.

active
Members sign inMattersOpen the judgment

Contrary to the directions in Arnesh Kumar v. State of Bihar, (2014) 8 SCC 273.

Members sign inMattersOpen the judgment

Contrary to the directions in Arnesh Kumar v. State of Bihar, (2014) 8 SCC 273.

At 390 px

Standalone and back links are 44px tall on touch; next steps get extra block padding so each is its own target, and the line wraps at middots rather than mid-phrase.

Accessibility

  • A link navigates; an act that changes something is a button (button.preceda-link for a text-styled act).
  • Underlines are kept: in running text the underline, not the colour, marks the link.
  • The back guillemet is aria-hidden; the link text names the destination (“Matters”).
  • Router links keep their behaviour through asChild.

Do

  • Name the destination, not the gesture: “Open the judgment”, not “Click here”.
  • Use the back link for one level up; the breadcrumb for deeper trails.

Don’t

  • Remove the underline from inline links.
  • Style a link as a button because it looks more important.

Usage

HTML
<a class="preceda-link preceda-link--standalone" href="/login"><span class="preceda-link__text">Members sign in</span></a>
<a class="preceda-link preceda-link--back" href="/matters"><span class="preceda-link__glyph" aria-hidden="true">‹</span><span class="preceda-link__text">Matters</span></a>
<ul class="preceda-link-list" aria-label="Next">
  <li class="preceda-link-list__label" aria-hidden="true">Next</li>
  <li class="preceda-link-list__item"><a class="preceda-link preceda-link--inline" href="#">Draft the application</a></li>
</ul>
React
import { Link, LinkList } from '@luvkapur/preceda-design-system/react';

<Link asChild variant="back"><RouterLink to="/matters">Matters</RouterLink></Link>
<LinkList label="Next">
  {actions.map((a) => <button key={a.id} className="preceda-link preceda-link--inline" onClick={() => run(a)}>{a.label}</button>)}
</LinkList>

02

Masthead

The app header, set like the head of a report: PRECEDA at the start, the sections centred in the serif, and who is reading at the end. One hairline beneath it; no fill, no avatar, no badge.

Anatomy

.preceda-masthead
The <header>: a size container with one rule beneath, on paper. --sticky pins it (layer: sticky).
__bar
44px grid: brand | sections | account. Below a 640px masthead, sections move to their own scrolling row.
__brand-link
MastheadBrand: the home link around T2’s outlined Wordmark, set at 17px type in currentColor. `sealed` sets the header lockup (seal + PRECEDA) instead.
__nav / __item
nav[aria-label="Primary"]: serif 15 in secondary ink; the current section in ink over a 1px binding rule, aria-current="page".
__account
Small Inter in tertiary ink, parts between middots; links in secondary ink. A quiet MenuTrigger here (the account menu) is set at the line’s size. Only the first part stays on a narrow masthead.
__skip
“Skip to content”, visible only on keyboard focus.

Variants

Member

Resize the window: the masthead reflows by its own width, not the viewport’s.

Paper

Lamp

Account menu

The member’s name opens the account menu (Report an issue, Keyboard shortcuts); the trigger is set at the account line’s size.

Paper

Lamp

With lighting

Sealed brand

The header lockup (seal + PRECEDA) for surfaces where no other seal is on screen. The workspace plates set PRECEDA alone; this is the alternative.

Shared matter

A read-only link: the wordmark leaves Preceda for the front page; no sections.

Paper

Lamp

State matrix

StatePaperLamp
current section
item hover
item focus-visible
no current

At 390 px

Inside the workspace below desk width, use CompactHead instead. Elsewhere at 390px the masthead keeps the wordmark and the first account part on one line, and moves the sections to a scrolling row beneath.

390 px

Accessibility

  • header (banner) > nav “Primary”; the current section carries aria-current="page", drawn as a rule as well as ink.
  • The brand link is named by the wordmark’s <title>, “Preceda, home” (override with label).
  • Pass skipTo with the main region’s id to render a skip link that appears on focus.
  • Section links are 44px tall; the focus ring is drawn inside the header so it is never clipped.

Do

  • Keep to three or four sections.
  • Say something true in the account line (name, introductions remaining); keep it short.

Don’t

  • Add icons, avatars or counts to the sections.
  • Use the masthead for page actions; they belong to the page.

Usage

HTML
<header class="preceda-masthead">
  <div class="preceda-masthead__bar">
    <div class="preceda-masthead__brand">
      <a class="preceda-masthead__brand-link" href="/">
        <svg class="preceda-wordmark" viewBox="…" fill="currentColor" role="img" aria-labelledby="wm"><title id="wm">Preceda, home</title>…</svg>
      </a>
    </div>
    <nav class="preceda-masthead__nav" aria-label="Primary">
      <ul class="preceda-masthead__list">
        <li><a class="preceda-masthead__item" href="/matters" aria-current="page"><span class="preceda-masthead__item-text">Matters</span></a></li>
      </ul>
    </nav>
    <div class="preceda-masthead__account">
      <span class="preceda-masthead__account-part">Adv. R. Mehra</span>
      <span class="preceda-masthead__account-part">Introductions remaining: 2</span>
    </div>
  </div>
</header>
React
import { Masthead, MastheadAccount, MastheadBrand, MastheadNav, MastheadNavItem } from '@luvkapur/preceda-design-system/react';

<Masthead
  skipTo="main"
  brand={<MastheadBrand asChild><RouterLink to="/" /></MastheadBrand>}
  nav={
    <MastheadNav>
      <MastheadNavItem asChild current={inMatters}><RouterLink to="/matters">Matters</RouterLink></MastheadNavItem>
    </MastheadNav>
  }
  account={<MastheadAccount><span>{name}</span><span>Introductions remaining: {n}</span></MastheadAccount>}
/>

03

Compact head

On the phone the chrome shrinks to one 44px running head: the way back, the wordmark, one act. When the matter’s title block scrolls away, its title takes the wordmark’s place, so counsel always knows which matter is on the desk.

Anatomy

.preceda-compact-head
<header> grid: start | centre | end, 44px plus the top safe-area inset, one rule beneath. --sticky pins it.
__start
A back link (“‹ Matters”), padded to a 44px target.
__center
The wordmark (an unlinked MastheadBrand, T2’s outlined PRECEDA); with data-collapsed="true", the matter title in the serif, truncated.
__end
One or two acts: “More” (⋯), or the member’s initials (__initials) linking to the account or, as a MenuTrigger, opening the account menu.

Variants

Matter

Paper

Preceda

Lamp

Preceda

Collapsed

After the title/meta block scrolls out; the tabs stay pinned beneath (product layout).

Paper

Anticipatory bail, brother-in-law

Lamp

Anticipatory bail, brother-in-law

Register

The matters list: no way back; the initials open the account.

Paper

Preceda

Lamp

Preceda

Register, account menu

The initials open the account menu (Account, the tour, Report an issue): the phone’s form of the masthead’s account line.

Paper

Preceda

Lamp

Preceda

State matrix

StatePaperLamp
default
Preceda
Preceda
back hover
Preceda
Preceda
back focus-visible
Preceda
Preceda
collapsed

Anticipatory bail, brother-in-law

Anticipatory bail, brother-in-law

At 390 px

This is the mobile form. It respects env(safe-area-inset-*) so it clears the notch in a standalone PWA; the collapse is scroll-driven with a plain fade and never changes the active tab.

390 px

Preceda

Accessibility

  • A header landmark; the back link names its destination and the “More” act has a label.
  • Collapsing swaps visible text only; the page’s h1 (the matter title) stays in the document.
  • Every target is 44 × 44px.

Do

  • Keep one act at the end; move the rest into its menu (T4 Menu).
  • Truncate the title, never wrap it.

Don’t

  • Put the sections here; the phone’s sections are the BottomNav, or the desk tabs.
  • Animate the collapse with a spring.

Usage

HTML
<header class="preceda-compact-head preceda-compact-head--sticky" data-collapsed="false">
  <div class="preceda-compact-head__start"><a class="preceda-link preceda-link--back" href="/matters">…Matters</a></div>
  <div class="preceda-compact-head__center"><span class="preceda-masthead__brand-link"><svg class="preceda-wordmark" role="img" …><title>Preceda</title>…</svg></span></div>
  <div class="preceda-compact-head__end"><button class="preceda-button preceda-button--quiet preceda-button--icon" aria-label="More actions">…</button></div>
</header>
React
import { CompactHead, IconButton, Link, Menu, MenuItem, MenuList, MenuTrigger } from '@luvkapur/preceda-design-system/react';

<CompactHead
  sticky
  collapsed={!titleInView}
  back={<Link asChild variant="back"><RouterLink to="/matters">Matters</RouterLink></Link>}
  title={matter.title}
  actions={<IconButton icon="more" label="More actions on this matter" onClick={openMenu} />}
/>

04

Bottom nav

The phone’s sections at the thumb. Each is a glyph over its word; the current one is set in ink under a binding rule on the top edge. Inside a matter it gives way to the correspondence dock.

Anatomy

.preceda-bottom-nav
nav[aria-label="Primary"] on paper with a rule above; pads for the home indicator (safe-area bottom).
--fixed
Fixed to the viewport (layer: dock). Give the page .preceda-bottom-nav-clearance.
__item
48px target: 20px icon over the small-role word, secondary ink; aria-current="page" sets ink and a 1px binding rule on top.
__count
A figure in binding ink by the glyph (“1”), read with its words (“question waiting”).

Variants

State matrix

At 390 px

Phone only; hide from desk width up (the Masthead takes over). Do not show it inside the matter workspace: the dock and CompactHead own that screen.

Accessibility

  • A second “Primary” navigation landmark only exists when the masthead’s is not rendered, so there is never two.
  • The word is always visible; the icon is decorative.
  • The count is not colour alone: it is a figure with hidden words.

Do

  • Three to five sections, the same as the masthead.
  • Keep counts for things that wait on counsel.

Don’t

  • Put acts (New matter) in the bar.
  • Hide the words to save space.

Usage

HTML
<nav class="preceda-bottom-nav preceda-bottom-nav--fixed" aria-label="Primary">
  <ul class="preceda-bottom-nav__list">
    <li><a class="preceda-bottom-nav__item" href="/matters" aria-current="page">
      <svg class="preceda-icon preceda-icon--20" aria-hidden="true"><use href="/icons.svg#preceda-icon-document"/></svg>
      <span class="preceda-bottom-nav__label">Matters</span>
    </a></li>
  </ul>
</nav>
React
import { BottomNav, BottomNavItem } from '@luvkapur/preceda-design-system/react';

<BottomNav fixed>
  <BottomNavItem asChild icon="document" current={inMatters} count={waiting} countLabel="questions waiting">
    <RouterLink to="/matters">Matters</RouterLink>
  </BottomNavItem>
</BottomNav>

05

Breadcrumb

Where a page sits in the record — an act, its chapter, the section; a court and its judgment. Small, tertiary, quiet enough to sit above a case title without competing with it.

Anatomy

nav[aria-label="Breadcrumb"] > ol
An ordered list; separators “›” are drawn by CSS, not read.
__link
Ancestors: small Inter in tertiary ink with a rule underline; binding ink on hover.
__current
The page itself, secondary ink, aria-current="page"; truncates with an ellipsis.
__fold
Past maxItems (4) the middle folds into “…”, a button that expands the trail in place.

Variants

Case

Paper

Lamp

Legislation (folded)

Five levels, folded to four; press “…” to expand.

Paper

Lamp

Legislation (full)

Paper

Lamp

State matrix

StatePaperLamp
default
hover
focus-visible
folded

At 390 px

At 390px the trail wraps at separators and the current page truncates; below three levels prefer a single back link (“‹ BNSS”) in the CompactHead.

390 px

Accessibility

  • nav “Breadcrumb” with an ordered list; the current page is aria-current="page" and not a link.
  • Separators are CSS content and are not announced.
  • The fold is a button named “Show 2 more levels”.

Do

  • Mirror the record’s own hierarchy (act › chapter › section).
  • Use short labels; the page title carries the full name.

Don’t

  • Use a breadcrumb as the only way back on the phone.
  • Repeat the page title at full length in the trail and the heading.

Usage

HTML
<nav class="preceda-breadcrumb" aria-label="Breadcrumb">
  <ol class="preceda-breadcrumb__list">
    <li class="preceda-breadcrumb__item"><a class="preceda-breadcrumb__link" href="/">Search</a></li>
    <li class="preceda-breadcrumb__item"><span class="preceda-breadcrumb__current" aria-current="page">Legislation</span></li>
  </ol>
</nav>
React
import { Breadcrumb } from '@luvkapur/preceda-design-system/react';

<Breadcrumb items={[
  { label: 'Search', link: <RouterLink to="/" /> },
  { label: 'Legislation', link: <RouterLink to="/legislation" /> },
  { label: act.shortTitle },
]} />

06

Tabs

Tabs orient within one surface. The desk’s tabs are sections of the matter, set in the serif with the current one in ink over a binding rule; utility tabs are small Inter for tool panes. On the phone the row scrolls and the panes swipe.

Anatomy

.preceda-tabs
role="tablist" over one rule. Overflows sideways with scroll-snap; the scrollbar is hidden.
.preceda-tab
Utility (0.1): Inter 13, tertiary ink; selected in binding ink over a 2px binding rule.
--desk
Serif 15 (17 on the phone) in secondary ink; hover draws a rule-strong line; selected is ink over a 1px binding rule.
__count
A figure after the label (“Authorities 4”), in the folio role.
__item + __close
A transient tab (an opened judgment) with a labelled cross beside it; Delete also closes it.
.preceda-tab-panel
role="tabpanel", labelled by its tab, focusable.
.preceda-tab-panels--swipe
Panes side by side with mandatory snap; a swipe selects the tab, a tab scrolls the pane in. Off-screen panes are inert.
<TabList>
0.1 roving focus for consumer-owned tabs (still exported; now forwards ref and takes variant).

Variants

Desk (interactive)

Arrow keys move and select; Delete closes the Case tab.

Paper

Application under Section 482 BNSS for grant of anticipatory bail on behalf of Applicant No. 2.

Lamp

Application under Section 482 BNSS for grant of anticipatory bail on behalf of Applicant No. 2.

Utility

Paper

Bail granted in 61% of 318 orders.

Lamp

Bail granted in 61% of 318 orders.

Swipe

Swipe the pane (or scroll it sideways with a trackpad).

Paper

Application under Section 482 BNSS for grant of anticipatory bail on behalf of Applicant No. 2.

Arnesh Kumar v. State of Bihar, (2014) 8 SCC 273 · Satender Kumar Antil v. CBI, (2022) 10 SCC 51 · 2 more.

Abroad 3 March – 19 August 2026 (passport, A-3). No notice under s. 35(3) BNSS served.

12 August 2026 · FIR No. 214 registered at PS Saket under ss. 498-A and 406 IPC.

Arnesh Kumar v. State of Bihar & Anr. · Supreme Court of India · 2 July 2014.

Lamp

Application under Section 482 BNSS for grant of anticipatory bail on behalf of Applicant No. 2.

Arnesh Kumar v. State of Bihar, (2014) 8 SCC 273 · Satender Kumar Antil v. CBI, (2022) 10 SCC 51 · 2 more.

Abroad 3 March – 19 August 2026 (passport, A-3). No notice under s. 35(3) BNSS served.

12 August 2026 · FIR No. 214 registered at PS Saket under ss. 498-A and 406 IPC.

Arnesh Kumar v. State of Bihar & Anr. · Supreme Court of India · 2 July 2014.

State matrix

StatePaperLamp
desk · selected
desk · hover
desk · focus-visible
utility · selected
utility · hover
disabled

At 390 px

Pinned directly under the CompactHead. The desk row is set at 17px and scrolls sideways, snapping to a tab; it never wraps. With swipe, the panes sit side by side and a horizontal swipe changes the tab without changing the scroll position of the desk.

390 px

Application under Section 482 BNSS for grant of anticipatory bail on behalf of Applicant No. 2.

Arnesh Kumar v. State of Bihar, (2014) 8 SCC 273 · Satender Kumar Antil v. CBI, (2022) 10 SCC 51 · 2 more.

Abroad 3 March – 19 August 2026 (passport, A-3). No notice under s. 35(3) BNSS served.

12 August 2026 · FIR No. 214 registered at PS Saket under ss. 498-A and 406 IPC.

Arnesh Kumar v. State of Bihar & Anr. · Supreme Court of India · 2 July 2014.

Accessibility

  • WAI-ARIA tabs: one tab stop (the selected tab); ArrowLeft/Right (and Up/Down) move, Home/End jump; the focused tab scrolls into view.
  • Automatic activation selects on focus for loaded panes; pass activation="manual" when a pane fetches, so Enter or Space selects.
  • Each tab has aria-controls; each panel aria-labelledby. Only the selected panel is in the tab order and the accessibility tree (others are hidden, or inert while swiping).
  • The selected tab is marked by ink and a rule, not colour alone. A disabled tab is aria-disabled and struck through.
  • Closable tabs: the cross is labelled (“Close Case”) and skipped by Tab; Delete on the tab closes it and the product moves selection.

Do

  • Keep desk tabs to the four sections plus a transient Case.
  • Show a count only when it tells counsel something (authorities to verify).

Don’t

  • Use tabs as site navigation; that is the masthead.
  • Nest a button inside a tab.

Usage

HTML
<div class="preceda-tabs preceda-tabs--desk" role="tablist" aria-label="Desk">
  <button class="preceda-tab" role="tab" id="t-draft" aria-controls="p-draft" aria-selected="true">Draft</button>
  <button class="preceda-tab" role="tab" id="t-auth" aria-controls="p-auth" aria-selected="false" tabindex="-1">
    Authorities <span class="preceda-tab__count">4</span>
  </button>
</div>
<div class="preceda-tab-panel" role="tabpanel" id="p-draft" aria-labelledby="t-draft" tabindex="0">…</div>
React
import { Tabs } from '@luvkapur/preceda-design-system/react';

<Tabs
  label="Desk"
  variant="desk"
  swipe={isPhone}
  value={activeTab}
  onValueChange={setActiveTab}
  onClose={() => { setViewingCaseId(null); setActiveTab('draft'); }}
  items={[
    { value: 'draft', label: 'Draft', panel: <DraftPane />, tabProps: { 'data-testid': 'tab-draft' } },
    { value: 'authorities', label: 'Authorities', count: toVerify, panel: <AuthoritiesPane /> },
    …(viewingCaseId ? [{ value: 'case', label: 'Case', closable: true, panel: <CaseViewer /> }] : []),
  ]}
/>

07

Load more

The foot of a long register. Say how much is shown, offer the next page as one act, and close with a short rule and the total — like the last page of a report.

Anatomy

.preceda-load-more
Centred foot over a hairline: count, status, act.
__count
“Showing 30 of 1,284 judgments” in the small role, tabular figures.
__status
role="status": announces “Loading…” (visually hidden; the button shows it) and states a failure in binding ink.
act
A small secondary Button (“Load 30 more”); loading shows the working point; after a failure it reads “Try again”.
__sentinel
With auto, an IntersectionObserver target 400px ahead of the act fetches the next page before counsel reaches it.
--end
No more pages: the total between two short rules.

Variants

Register (interactive)

Load twice: the second fetch fails once, then retries.

Paper

Arnesh Kumar v. State of Bihar, (2014) 8 SCC 273

Satender Kumar Antil v. CBI, (2022) 10 SCC 51

Sushila Aggarwal v. State (NCT of Delhi), (2020) 5 SCC 1

Showing 3 of 96 judgments

Lamp

Arnesh Kumar v. State of Bihar, (2014) 8 SCC 273

Satender Kumar Antil v. CBI, (2022) 10 SCC 51

Sushila Aggarwal v. State (NCT of Delhi), (2020) 5 SCC 1

Showing 3 of 96 judgments

Automatic

Infinite scroll with a button kept for keyboard users.

Paper

Showing 60 of 1,284 judgments

Lamp

Showing 60 of 1,284 judgments

State matrix

StatePaperLamp
more

Showing 30 of 1,284 judgments

Showing 30 of 1,284 judgments

loading

Showing 30 of 1,284 judgments

Loading…

Showing 30 of 1,284 judgments

Loading…

error

Showing 30 of 1,284 judgments

Could not load the next 30. Check the connection.

Showing 30 of 1,284 judgments

Could not load the next 30. Check the connection.

end

1,284 judgments · end of the register

1,284 judgments · end of the register

At 390 px

The act stays a full 44px target; with auto the next page is usually in place before the thumb reaches the foot. Keep the count so counsel knows where they are in a long list.

390 px

Showing 30 of 412 judgments

Accessibility

  • Automatic loading never removes the button; keyboard and screen-reader users can always ask for the next page.
  • Loading, failure and the end are announced politely; the page does not move focus.
  • The product should move focus to the first new row only when the act (not the sentinel) loaded it.

Do

  • Say the page size in the act (“Load 30 more”).
  • Keep what has loaded when a fetch fails.

Don’t

  • Fetch past the end (check hasMore before a request; it avoids a full-table scan on the server).
  • Show a spinner in place of the rows.

Usage

HTML
<div class="preceda-load-more">
  <p class="preceda-load-more__count">Showing 30 of 1,284 judgments</p>
  <p class="preceda-load-more__status" role="status" aria-live="polite"></p>
  <button class="preceda-button preceda-button--secondary preceda-button--sm" type="button">Load 30 more</button>
</div>
React
import { LoadMore } from '@luvkapur/preceda-design-system/react';

<LoadMore
  auto
  onLoadMore={fetchNextPage}
  loading={loadingMore}
  hasMore={hasMore}
  error={pageError}
  count={`Showing ${results.length} of ${total} judgments`}
  label="Load 30 more"
/>

08

Pager

Previous and next page of a paged register or a long text, with the position between them in folio figures. Links, not buttons: every page keeps its own URL, so a crawler and a colleague reach the same page.

Anatomy

nav.preceda-pager
A labelled nav landmark on a hairline.
__link--previous / --next
The product’s own link element (a router link or <a href>), given the class, rel and words.
__status
“Page 2 of 221” in folio figures; a text may say “Part 2 of 26”.

Variants

Middle page

Paper

Lamp

First page

Paper

Lamp

Parts of a long text

Paper

Lamp

State matrix

StatePaperLamp
focus-visible

At 390 px

Below 640 px the position takes its own row above the two links.

Accessibility

  • A nav landmark named by the product (“Judgment pages”, “Text pages”); rel="prev" and rel="next" on the links.
  • With one page the pager renders nothing; a missing previous or next leaves an aria-hidden spacer.

Do

  • Use for server-paged registers whose pages have URLs.
  • Format figures the way the page does (en-IN grouping).

Don’t

  • Do not use for an in-place fetch; that is LoadMore.
  • Do not draw a row of numbered boxes.

Usage

HTML
<nav class="preceda-pager" aria-label="Judgment pages">
  <a class="preceda-pager__link preceda-pager__link--previous" rel="prev" href="?page=1">Previous page</a>
  <p class="preceda-pager__status">Page 2 of 221</p>
  <a class="preceda-pager__link preceda-pager__link--next" rel="next" href="?page=3">Next page</a>
</nav>
React
<Pager page={page} pages={pages} previous={<Link search={{ page: page - 1 }} />} next={<Link search={{ page: page + 1 }} />} />