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.
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.
Adv. R. MehraIntroductions remaining: 2
Adv. R. MehraIntroductions remaining: 2
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.
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.
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
Adv. R. MehraIntroductions remaining: 2
Lamp
Adv. R. MehraIntroductions remaining: 2
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.
A read-only link: the wordmark leaves Preceda for the front page; no sections.
Paper
Shared by Adv. R. MehraRead only
Lamp
Shared by Adv. R. MehraRead only
State matrix
StatePaperLamp
current section
Adv. R. MehraIntroductions remaining: 2
Adv. R. MehraIntroductions remaining: 2
item hover
Adv. R. MehraIntroductions remaining: 2
Adv. R. MehraIntroductions remaining: 2
item focus-visible
Adv. R. MehraIntroductions remaining: 2
Adv. R. MehraIntroductions remaining: 2
no current
Adv. R. MehraIntroductions remaining: 2
Adv. R. MehraIntroductions remaining: 2
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
Adv. R. MehraIntroductions remaining: 2
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.
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.
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.
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
Member sections
Paper
Lamp
Search current
Paper
Lamp
State matrix
StatePaperLamp
current
hover
focus-visible
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.
390 px
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.
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.
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.
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).
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
default
hover
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.