New Delhi · September 2026
Preceda

05 Marks

Marks

The sealed P, the PRECEDA wordmark and the lockup, drawn as Newsreader outlines in currentColor, the icons generated from them, and the head and preview card every page ships.

  1. Seal
  2. Wordmark
  3. Lockup
  4. Clear space, minimum sizes and misuse
  5. Favicon, app icons and splash
  6. Head and preview

01

Seal

The sealed P is the only pictorial mark Preceda has. It replaces the scales, the graph tile and ⚖. It is drawn, not typeset: Newsreader’s P as outlines inside a ring and an inner ring, nudged 4% right and 6% down so it sits on its ink, not its line box. One drawing, filled with currentColor, so Paper and Lamp need no second file.

Anatomy

ring
Outer ring, 3.4% of the diameter.
inner ring
Inset 7% inside the ring, 1.2% stroke. Dropped in the small master, where it would be noise.
P
Newsreader wght 400 at opsz 24, 56% of the diameter, optically centred (PR #1249).
small master
Below 28 px: Newsreader wght 500 at opsz 12, an 8% ring, no inner ring, a 62% P. <Seal> switches automatically when it knows its size.

Variants

Ink

The default. The seal takes the text colour: ink on Paper, lamp ink on Lamp. Sizes in CSS px; “small” marks the small optical master.

Paper

16small
20small
32
64
180

Lamp

16small
20small
32
64
180

Gilt

The edition colour, for admission and letterhead moments. Gilt-ink, never the decorative gilt, so a standalone seal still holds contrast.

Paper

16small
20small
32
64
180

Lamp

16small
20small
32
64
180

State matrix

StatePaperLamp
Default · named link
Focus-visible

At 390 px

The seal does not change at 390 px. In the compact running head it sits at 24 px (small master) as the home link inside a 44 px target; the target is the link, not the drawing.

390 px

Accessibility

  • Beside the PRECEDA wordmark the seal is decorative: aria-hidden, focusable="false". Omit title.
  • Standing alone as a link or brand, name it: <Seal title="Preceda" /> or aria-label on the link.
  • Filled with currentColor, so forced-colours mode draws it in CanvasText with no extra rule.
  • Ink and gilt-ink both exceed 3:1 against every Paper and Lamp surface (WCAG 1.4.11 for meaningful graphics).

Do

  • Inline the SVG (or use <Seal>) wherever it must follow the theme.
  • Let <Seal size> choose the small master below 28 px; force optical="text" only for print.
  • Keep a quarter of the diameter clear on every side.

Don’t

  • Do not typeset the P with a font: every file is outlines, no <text>, no font-family.
  • Do not fill the ring, add a shadow, bevel, or a gilt gradient.
  • Do not set the seal in oxblood. Oxblood is the binding accent; the seal is ink or gilt.
  • Do not place ⚖, a gavel or a graph tile beside or instead of it.

Usage

HTML
<!-- Inline the file (e.g. import seal from '@luvkapur/preceda-design-system/mark/seal.svg?raw') -->
<svg class="preceda-seal" viewBox="0 0 100 100" fill="currentColor" aria-hidden="true" focusable="false">
  <path fill-rule="evenodd" d="…ring…"/>
  <path fill-rule="evenodd" d="…inner ring…"/>
  <path d="…P…"/>
</svg>
<!-- Size with the custom property, not width/height: -->
<style>.letterhead .preceda-seal { --preceda-seal-size: 2.75rem; }</style>
React
import { Seal } from '@luvkapur/preceda-design-system/react';

<Seal size={32} />                  // decorative, beside the wordmark
<Seal size={44} gilt title="Preceda" /> // standing alone
<Seal size={16} />                  // small optical master, automatically

02

Wordmark

PRECEDA, in Newsreader small caps tracked .22em, as the front page sets it. It is outlines, so it renders identically where the fonts have not loaded, in email and in images. It sizes like type: set a font-size and the wordmark takes the height PRECEDA would have in that size. The name is Preceda. Never “Preceda AI”.

Anatomy

letters
Seven capitals at 0.7 of the font size (synthesised small caps), kerned, ligatures off.
tracking
.22em of the font size between letters; none after the A, so the box ends on ink.
box
Cap top to baseline overshoot. Its bottom sits on the text baseline (vertical-align is generated).

Variants

Plain · 40 px (masthead)

Paper

Preceda

Lamp

Preceda

Plain · 17 px (app header)

Paper

Preceda

Lamp

Preceda

Sealed · 40 px

The seal before PRECEDA at masthead proportions: seal diameter = the small-cap size, gap = half of it, centred on the cap height.

Paper

Preceda

Lamp

Preceda

Sealed · 24 px

Below a 28 px seal the lockup switches to the small master.

Paper

Preceda

Lamp

Preceda

In running text

Sized from the surrounding font-size; it sits on the baseline like a word.

Paper

Letters from Preceda are signed by chambers, not by a model.

Lamp

Letters from Preceda are signed by chambers, not by a model.

At 390 px

At 390 px the masthead wordmark steps down to 30 px type (the title role) and the header keeps 17 px. Never below 12 px type (54 px wide).

390 px

Preceda

Accessibility

  • Always named: role="img" with a <title> “Preceda”. Override title only to add context, e.g. “Preceda, home”.
  • Inside a link that already has text, keep the wordmark as the link’s only content so the name is read once.
  • currentColor: ink on Paper, lamp ink on Lamp; both far above 4.5:1.

Do

  • Size it with font-size (or <Wordmark size>) and let the geometry follow.
  • Use the plain wordmark where the seal already appears nearby.
  • Keep one cap height clear around it.

Don’t

  • Do not write “Preceda AI”, “PRECEDA.AI” or add a tagline to the lockup.
  • Do not retype PRECEDA in a font as a substitute: the letter-spacing and kerning are part of the mark.
  • Do not set the wordmark in gilt. Gilt never carries text.
  • Do not stretch, outline, italicise or re-track it.

Usage

HTML
<!-- Inline wordmark.svg; it sizes from font-size. -->
<span style="font-size: var(--preceda-type-size-40)">
  <svg class="preceda-wordmark" viewBox="0 -1407.556 12816.762 1466" fill="currentColor" role="img" aria-labelledby="wm">
    <title id="wm">Preceda</title>
    <path d="…"/> <!-- seven letters -->
  </svg>
</span>
<!-- Sealed: wordmark-sealed.svg with class="preceda-wordmark preceda-wordmark--sealed" -->
React
import { Wordmark } from '@luvkapur/preceda-design-system/react';

<Wordmark size={40} />
<Wordmark variant="sealed" size={40} />
<Wordmark title="Preceda, home" /> // sized by the parent's font-size

03

Lockup

The seal and PRECEDA set together as the home link. Three settings and no others: the header (app chrome), the masthead (front page, letterhead) and stacked (gate, splash). The lockup is chrome, not a heading: the page H1 is the page’s subject.

Anatomy

.preceda-lockup
The link. Inline-flex, centred on the cap height, never underlined; --preceda-lockup-size sets the type size.
.preceda-lockup__seal
A decorative <Seal>, sized by --preceda-seal-size: 24 px in the header, 0.7em in the masthead, 1.1em stacked.
.preceda-lockup__word
The named <Wordmark>, sized from the lockup’s font-size.
--masthead · --stacked
40 px type (30 px below 640 px). Masthead gap 0.35em; stacked gap 0.55em, seal above.

Variants

Header

App chrome: a 24 px seal, a 12 px gap, PRECEDA at 17 px. Sits at the left of the Masthead.

Masthead

The front page and the letterhead. Proportions from the specimen: a 28 px seal beside 40 px type.

Stacked

The gate and splash: the seal centred above PRECEDA.

State matrix

At 390 px

The header lockup keeps 17 px and a 24 px seal; its link target is padded to 44 px by the compact head. Masthead and stacked step to 30 px type below 640 px.

Accessibility

  • One link, one name: the seal is aria-hidden and the wordmark is named “Preceda, home”.
  • Focus ring: 2 px focus colour, offset 8 px so it clears the seal’s ring.
  • No hover colour change: the lockup is a quiet mark; the cursor and focus ring say it is a link.
  • It is not the H1. On the front page the promise is the H1; in the app, the matter or page title.

Do

  • Use exactly one lockup per page, at the top.
  • Keep one cap height of clear space around the whole lockup (larger in the masthead: the seal’s diameter).
  • Use the plain wordmark when the lockup would repeat a seal already on screen.

Don’t

  • Do not add “AI”, a tagline, a beta badge or an emoji to the lockup.
  • Do not change the seal-to-word ratio, or put the seal after the word.
  • Do not underline or colour the lockup on hover.
  • Do not use the lockup as the page heading.

Usage

HTML
<a class="preceda-lockup" href="/">
  <svg class="preceda-seal preceda-lockup__seal" viewBox="0 0 100 100" fill="currentColor" aria-hidden="true" focusable="false">…</svg>
  <svg class="preceda-wordmark preceda-lockup__word" viewBox="…" fill="currentColor" role="img" aria-labelledby="home">
    <title id="home">Preceda, home</title>…
  </svg>
</a>
<!-- Front page / letterhead: class="preceda-lockup preceda-lockup--masthead" -->
<!-- Gate / splash:           class="preceda-lockup preceda-lockup--stacked" -->
React
import { Seal, Wordmark } from '@luvkapur/preceda-design-system/react';

// Header (24 px seal: the small master)
<a className="preceda-lockup" href="/">
  <Seal className="preceda-lockup__seal" optical="small" />
  <Wordmark className="preceda-lockup__word" title="Preceda, home" />
</a>

// Masthead
<a className="preceda-lockup preceda-lockup--masthead" href="/">
  <Seal className="preceda-lockup__seal" />
  <Wordmark className="preceda-lockup__word" title="Preceda, home" />
</a>

04

Clear space, minimum sizes and misuse

The marks are quiet because they are left alone. Clear space is measured in the mark’s own units, minimum sizes are where each drawing stops reading, and the misuses below are the ones the old brand made.

Anatomy

Seal clear space
A quarter of the diameter on every side.
Wordmark clear space
One cap height on every side.
Lockup clear space
One cap height; in the masthead, the seal’s diameter above and below the rule.
Minimum sizes
Seal 16 px (small master below 28 px). Wordmark 12 px type, 54 px wide. Sealed wordmark 23 px type, where its seal reaches 16 px; below that use the header lockup.

Variants

Clear space

Paper

Seal · ¼ of the diameter
Preceda
Wordmark · one cap height

Lamp

Seal · ¼ of the diameter
Preceda
Wordmark · one cap height

Minimum sizes

Paper

Seal · 16 px
Preceda
Wordmark · 12 px type
Preceda
Sealed · 23 px type

Lamp

Seal · 16 px
Preceda
Wordmark · 12 px type
Preceda
Sealed · 23 px type

Misuse

Shown so they can be recognised in review. Each is labelled in words.

Paper

PrecedaAI
Not this · “Preceda AI”. The name is Preceda.
Preceda
Not this · Scales, gavels or ⚖ beside or instead of the seal.
Preceda
Not this · Gilt text. Gilt is for edition marks, never for words.
Not this · Oxblood seal. Oxblood binds; the seal is ink or gilt.

Lamp

PrecedaAI
Not this · “Preceda AI”. The name is Preceda.
Preceda
Not this · Scales, gavels or ⚖ beside or instead of the seal.
Preceda
Not this · Gilt text. Gilt is for edition marks, never for words.
Not this · Oxblood seal. Oxblood binds; the seal is ink or gilt.

At 390 px

Clear space scales with the mark; minimum sizes are absolute. At 390 px the header lockup is the smallest lockup allowed.

Accessibility

  • Misuse demos carry a visible “Not this” label; colour is never the only signal.
  • Below the minimum sizes the marks stop being legible for low-vision readers; use the name in text instead.

Do

  • Measure clear space from the mark’s own box, not from the surrounding padding.
  • Put the name in text (“Preceda”) wherever a mark would fall below its minimum.

Don’t

  • No “Preceda AI”, anywhere a user can see it.
  • No ⚖, scales, gavel, graph tile or emoji alongside the marks.
  • No gilt text, gilt wordmark or gilt gradient.
  • No mark inside a box, chip, pill or coloured tile in product chrome.

Usage

HTML
<!-- Clear space is layout, not a class: give the lockup's container
     padding of at least one cap height (0.49em of the lockup's font-size). -->
<header style="padding-block: 0.49em"> <a class="preceda-lockup" href="/">…</a> </header>

05

Favicon, app icons and splash

Every raster is generated from the same outlines by scripts/build-icons.mjs; nobody exports a PNG by hand. The script owns the background, the safe zone and the file list, and a rebuild is byte-identical (tests/marks.test.mjs). Tabs get the small master in ink on a Paper disc; home screens get the canonical seal in gilt on Paper; splashes stack the seal over PRECEDA.

Anatomy

favicon.svg
Small master on a Paper disc; switches to Lamp under prefers-color-scheme: dark.
favicon.ico · favicon-32.png
16, 32 and 48 px in one ICO (PNG payloads); 16 and 32 use the small master.
apple-touch-icon.png
180 px, full-bleed Paper (iOS rounds the corners), seal at two thirds.
icon-192/512.png
Purpose “any”: the seal as a coin on transparency.
icon-maskable-192/512.png
Full-bleed Paper; the seal is 60% wide, inside the 80% safe circle for every mask shape.
manifest.webmanifest
Name, the four PWA icons (any and maskable) and Paper as theme and background colour; icon URLs resolve beside it.
splash-*.png
1170×2532, 1179×2556, 1290×2796, 2048×2732: Paper, stacked seal and wordmark on the optical centre.

Variants

Browser tab

Shown at 1×. The 16 px render is the acceptance check: it must still read as the seal.

Paper

favicon.svg
16 px
favicon.svg
32 px
favicon-32.png
32 px raster

Lamp

favicon.svg
16 px
favicon.svg
32 px
favicon-32.png
32 px raster

Home screen

Paper

apple-touch-icon.png
Apple touch, 180 px at ½
icon-192.png
PWA any, 192 px at ½
icon-maskable-192.png
Maskable, circle mask
icon-maskable-192.png
Maskable, squircle mask

Lamp

apple-touch-icon.png
Apple touch, 180 px at ½
icon-192.png
PWA any, 192 px at ½
icon-maskable-192.png
Maskable, circle mask
icon-maskable-192.png
Maskable, squircle mask

Splash

Paper

splash-1170x2532.png
splash-2048x2732.png

Lamp

splash-1170x2532.png
splash-2048x2732.png

At 390 px

Installed from Safari or Chrome at 390 px the home-screen icon is the maskable or touch icon and the launch image is the matching splash. The app manifest and <link> tags adopt these files in a later slice (WP-B adoption).

Accessibility

  • Raster icons are named by the page title and manifest name (“Preceda”), not alt text.
  • The tab icon keeps a Paper disc so it reads on both light and dark browser chrome.

Do

  • Link these generated files; regenerate with npm run build and commit new hashes with npm run build:icons:record.
  • Keep theme_color and background_color at Paper (#F4EFE4) in the manifest.

Don’t

  • Do not hand-edit or re-export a PNG; change the outlines or the script.
  • Do not reuse the scales favicon or the graph-tile OG mark.
  • Do not put the wordmark in a favicon: seven letters do not survive 16 px.

Usage

HTML
<!-- Written by headTags(meta, { assetBase: '/mark/' }) from ./head; see Head and preview. -->
<link rel="icon" href="/mark/favicon.ico" sizes="32x32">
<link rel="icon" href="/mark/favicon.svg" type="image/svg+xml">
<link rel="apple-touch-icon" href="/mark/apple-touch-icon.png" sizes="180x180">
<link rel="manifest" href="/mark/manifest.webmanifest">

06

Head and preview

Every page is a published page. Whatever a link pastes into a chat, a brief or a search result is part of the product, so every Preceda surface ships a complete head and a preview card, from one typed PageMeta. headTags writes the head, renderPreviewCard draws the card, and validateHead fails the build when a page is incomplete.

Anatomy

PageMeta
Required: title, description, canonical (https), image { url (https), width 1200, height 630, alt }. Optional: siteName, type, robots, locale. A missing field is a type error and a runtime error.
headTags(meta, { assetBase })
The head as HTML. headDescriptors returns the same tags as TanStack Start head() arrays.
renderPreviewCard({ kicker, title, description?, host })
Node only (./preview). 1200 × 630 PNG: oxblood binding, small-caps kicker over an ink rule, Newsreader title in up to three lines, a deck, the sealed lockup and the address. Byte-deterministic.
renderSealCard({ line, host })
Node only (./preview). The sealed card for a link whose subject must not travel with it (a private or shared matter): the seal, PRECEDA and one neutral small-caps line (“A matter in chambers”) over the bare host. No title, deck or path; a host with a path is refused. Byte-deterministic.
validateHead(html) · preceda-validate-head
Lists every violation; the CLI walks built HTML and exits 1. CI runs it on every published surface.

Variants

The preview card

This page’s own card, as a link to it arrives. Title and deck share four lines; longer text ends in an ellipsis.

Paper

Preview card: Design language 05, Marks, on Paper with the oxblood binding, the sealed PRECEDA lockup and the page address.
marks/og.png · rendered at build by renderPreviewCard from the package’s Newsreader and the seal outlines.

Lamp

Preview card: Design language 05, Marks, on Paper with the oxblood binding, the sealed PRECEDA lockup and the page address.
marks/og.png · rendered at build by renderPreviewCard from the package’s Newsreader and the seal outlines.

Required tags

What headTags writes and validateHead checks.

Paper

Required head

15 rows

Tag and rule
<meta charset> · viewportFirst in the head.
<title>1–70 characters; also the preview headline.
<meta name="description">50–200 characters; also the preview deck.
<link rel="canonical">Absolute https; the one URL the page is published at.
<link rel="icon"> ×2favicon.ico (32) and favicon.svg from the package’s mark/.
<link rel="apple-touch-icon">apple-touch-icon.png, 180 px.
<link rel="manifest">manifest.webmanifest (icons, Paper theme colour).
<meta name="theme-color"> ×2Paper for prefers-color-scheme: light, Lamp for dark.
og:type · og:site_name · og:localewebsite or article · “Preceda” · en_IN unless given.
og:title · og:descriptionThe title and description, once each.
og:urlEqual to the canonical URL.
og:image · :width · :height · :altAbsolute https, 1200 × 630, alt says what the card says.
twitter:cardsummary_large_image.
twitter:title · :description · :image · :image:altMirror the Open Graph values.
<meta name="robots">Only when given, e.g. noindex for review sites.

Lamp

Required head

15 rows

Tag and rule
<meta charset> · viewportFirst in the head.
<title>1–70 characters; also the preview headline.
<meta name="description">50–200 characters; also the preview deck.
<link rel="canonical">Absolute https; the one URL the page is published at.
<link rel="icon"> ×2favicon.ico (32) and favicon.svg from the package’s mark/.
<link rel="apple-touch-icon">apple-touch-icon.png, 180 px.
<link rel="manifest">manifest.webmanifest (icons, Paper theme colour).
<meta name="theme-color"> ×2Paper for prefers-color-scheme: light, Lamp for dark.
og:type · og:site_name · og:localewebsite or article · “Preceda” · en_IN unless given.
og:title · og:descriptionThe title and description, once each.
og:urlEqual to the canonical URL.
og:image · :width · :height · :altAbsolute https, 1200 × 630, alt says what the card says.
twitter:cardsummary_large_image.
twitter:title · :description · :image · :image:altMirror the Open Graph values.
<meta name="robots">Only when given, e.g. noindex for review sites.

At 390 px

Chat apps show the card at about 300–400 px wide: the title is set at 56–72 px on a 1200 px card so it still reads at a third of the size, and the address stays legible in the footer.

Accessibility

  • og:image:alt and twitter:image:alt say what the card says, for readers who cannot see it.
  • The card is Paper with ink text at 4.5:1 or better; the kicker and address use the secondary and tertiary inks tested on Paper.
  • theme-color follows the reader’s colour scheme, so the browser chrome matches Paper or Lamp.

Do

  • Build the head from PageMeta with headTags or headDescriptors; never hand-write a partial head.
  • Give every route its own title, description, canonical and card.
  • Run preceda-validate-head on built output in CI.

Don’t

  • Do not ship relative og:image, twitter:image or canonical URLs; crawlers do not resolve them.
  • Do not put matter content in a card, title or description; a matter link shows the seal and nothing else (renderSealCard).
  • Do not add gradients, stock imagery or “AI” to a card.

Usage

HTML
import { headTags } from '@luvkapur/preceda-design-system/head';

const head = headTags({
  title: 'Arnesh Kumar v. State of Bihar',
  description: 'Arrest under s. 41 CrPC only on recorded reasons: the checklist the Supreme Court laid down in 2014.',
  canonical: 'https://app.preceda.ai/case/2014-sc-arnesh-kumar-v-state-of-bihar',
  image: { url: 'https://app.preceda.ai/og/case/2014-sc-arnesh-kumar.png', width: 1200, height: 630,
           alt: 'Supreme Court of India: Arnesh Kumar v. State of Bihar, (2014) 8 SCC 273.' },
}, { assetBase: '/mark/' });

// Node: the card
import { renderPreviewCard } from '@luvkapur/preceda-design-system/preview';
const png = await renderPreviewCard({ kicker: 'Supreme Court of India', title: 'Arnesh Kumar v. State of Bihar',
  description: '(2014) 8 SCC 273', host: 'preceda.ai/case/2014-sc-arnesh-kumar-v-state-of-bihar' });

// CI
// npx preceda-validate-head dist/
React
// TanStack Start route
import { headDescriptors } from '@luvkapur/preceda-design-system/head';

export const Route = createFileRoute('/case/$slug')({
  head: ({ loaderData }) => headDescriptors(loaderData.pageMeta, { assetBase: '/mark/' }),
});