The arXiv public-page header sets the tone for the entire platform: simple, straightforward, and utilitarian. It consists of a dark band with logo on the left, and navigation, search, and account links on the right. An optional, dismissible announcement banner can be displayed above the header. Absolute consistency across all pages is critical.
The header is in transition. Pages on arxiv.org use the transitional header from templates/ now, and will move to the aspirational header after the migration.
Internal pages have their own header and variations, see Internal header for an example.
The bars under the header, such as secondary navigation and steps, are on Navigation.
The header in production now. A page includes it from templates/ rather than copying its markup; the templates README says how to install it and what each variable does. The examples are a copy of the template’s markup taken on 21 October 2026; when they differ from the template, the template is right. In production, the navigation folds behind the menu button when the window is narrower than 600px, as the phone example shows.
Signed out
Signed in
Phone width
With page actions
<div id="ds-announcement"></div>
<script src="https://static.arxiv.org/static/design-system/latest/chrome/banner.js" defer></script>
<script src="https://static.arxiv.org/static/design-system/latest/chrome/header.js" defer></script>
<header class="ds-site-header ">
<a aria-hidden="true" tabindex="-1" href="https://arxiv.org/IgnoreMe" class="is-sr-only"></a>
<a href="https://arxiv.org/" class="ds-site-header-logo" aria-label="archive home">
<img src="https://static.arxiv.org/static/design-system/latest/logos/arxiv-logo.svg" alt="archive">
</a>
<a id="ds-search-toggle" class="ds-site-header-search-link" href="https://arxiv.org/search" aria-controls="ds-search-overlay" aria-expanded="false">
<svg class="ds-nav-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false">
<circle cx="11" cy="11" r="8"/>
<line x1="21" y1="21" x2="16.65" y2="16.65"/>
</svg>
<span>Search</span>
</a>
<button type="button" id="ds-nav-toggle" class="ds-site-header-nav-toggle"
aria-label="Open menu" aria-controls="ds-site-header-nav" aria-expanded="false">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false">
<line x1="3" y1="6" x2="21" y2="6"/><line x1="3" y1="12" x2="21" y2="12"/><line x1="3" y1="18" x2="21" y2="18"/>
</svg>
</button>
<nav class="ds-site-header-nav" id="ds-site-header-nav" aria-label="Main navigation">
<a href="https://arxiv.org/submit">Submit</a>
<a href="https://info.arxiv.org/about/donate.html">Donate</a>
<span class="ds-site-header-divider" aria-hidden="true"></span>
<a href="https://arxiv.org/login" class="ds-site-header-login">Log in</a>
</nav>
</header>
<div class="ds-search-overlay" id="ds-search-overlay" hidden>
<div class="ds-search-overlay-panel" role="search">
<form method="GET" action="https://arxiv.org/search">
<label for="ds-search-input" class="is-sr-only">Search arXiv</label>
<input type="text" name="query" id="ds-search-input" class="ds-input" autocomplete="off"
placeholder="Search papers by title, author, abstract, or ID...">
<input type="hidden" name="searchtype" value="all">
<input type="hidden" name="source" value="header">
</form>
<p class="ds-hint">
Press Enter to search · <a href="https://arxiv.org/search/advanced">Advanced search</a>
</p>
</div>
</div>
The header arxiv.org will move to. It differs from the transitional header in three ways: the bar has a theme control after the navigation; Log in and Account sit outside the navigation, in the account area; and signed in, the bar shows a greeting and an Account menu that holds Log out.
Every header has the same regions, in this order: Logo, Search, Nav, Tools, and Account. Tools currently holds only the theme control but is a flexible region for future use.
<!-- First focusable element on the page -->
<a class="ds-skip-link" href="#main">Skip to main content</a>
<header class="ds-site-header">
<a href="/" class="ds-site-header-logo" aria-label="archive home">
<img src="logo_arxiv-primary.svg" alt="archive">
</a>
<a id="ds-search-toggle" class="ds-site-header-search-link" href="/search" aria-controls="ds-search-overlay" aria-expanded="false">
<svg class="ds-nav-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false">
<circle cx="11" cy="11" r="8"/>
<line x1="21" y1="21" x2="16.65" y2="16.65"/>
</svg>
<span>Search</span>
</a>
<nav class="ds-site-header-nav" id="ds-site-header-nav" aria-label="Main navigation">
<a href="/submit">Submit</a>
<a href="/about/donate">Donate</a>
</nav>
<div class="ds-site-header-tools">
<button type="button" class="ds-theme-toggle"></button>
<span id="ds-theme-status" class="is-sr-only" role="status"></span>
</div>
<span class="ds-site-header-divider" aria-hidden="true"></span>
<div class="ds-site-header-account">
<a href="/login" class="ds-site-header-login">Log in</a>
</div>
</header>
href is the id of the main content.margin-right: auto. On arxiv.org it
is the logo image, never the word typed out; its alt text says “archive”.<a href="/search"> before the navigation and
outside it, so it stays in the bar when the navigation folds. JavaScript upgrades it to open
the search overlay; without JavaScript it goes to the search page.<nav> with an
aria-label.aria-hidden="true"; the label gives the name.aria-hidden="true". Hidden while the navigation is folded
away.#ds-theme-status. See
The theme control.<nav>, because an account menu is not a site section.<summary>.<details>. See
Header dropdown menus.header.js opens it from
the Search link or Ctrl/Cmd+K, and closes it on Escape, a click outside the panel, or focus
leaving it..ds-input and
.ds-hint.Signed in, the account area shows a greeting with the reader’s given name and an Account menu that holds Log out. A long name is cut to 14 characters.
Short name
Long name
<span class="ds-site-header-divider" aria-hidden="true"></span>
<div class="ds-site-header-account">
<span class="ds-site-header-greeting">Welcome <b>Ada</b></span>
<details class="ds-site-header-dropdown">
<summary class="ds-site-header-login">Account</summary>
<div class="ds-site-header-menu">
<a href="/account">Your account</a>
<form method="post" action="/logout">
<button type="submit">Log out</button>
</form>
</div>
</details>
</div>
When the header does not fit on one row, it folds. The greeting goes first. Then the navigation, tools and account area fold into one menu, leaving the logo, Search and the menu button. Internal headers keep their search fields in the bar while they fit, then open them from a Search button. The transitional header folds when the window is narrower than 600px.
The script answers to the width of the bar, not of the window, so the phone example folds inside a narrower box on a wide screen. Open the menu to see the folded rows.
Phone width
<!-- Once per page, after the header. Nothing else changes. -->
<script src="header.js" defer></script>
docs/header.js, once per page. It finds
every .ds-site-header and keeps each one on a single row, with no breakpoint to
choose. Without JavaScript the bar wraps onto more rows instead, so nothing is hidden. The
templates load their own script, so a page that uses them adds none.aria-expanded and aria-controls, and Escape
closes the open region and returns focus to its button..is-single-menu marks a bar with an account area, whose menu holds
the navigation, the tools and the account area.
.is-overfull lets the bar wrap when even the folded bar is too wide for its
space.A property whose sections need grouping adds .ds-site-header-dropdown, built on <details> so it opens and closes with no JavaScript. A page may add close-on-outside-click and Esc as enhancement. The Account menu is the same component.
<header class="ds-site-header ds-site-header--light">
<a href="/" class="ds-site-header-logo">arXiv Design System</a>
<nav class="ds-site-header-nav" aria-label="Design system">
<details class="ds-site-header-dropdown">
<summary>Design Patterns</summary>
<div class="ds-site-header-menu">
<span class="ds-panel-label">Components</span>
<a href="colors.html">Colors</a>
<a href="header.html" aria-current="page">Site header</a>
<!-- … -->
</div>
</details>
<details class="ds-site-header-dropdown">
<summary>Docs</summary>
<div class="ds-site-header-menu">
<a href="using.html">Using the system</a>
<!-- … -->
</div>
</details>
</nav>
</header>
<details> group in the bar. Optional. The summary sits in the bar
and takes the surface tokens, so it is correct on either variant..ds-skip-link is the first
focusable element on the page, visible only on keyboard focus, and it goes to the main
content.<nav>
with an aria-label, such as “Main navigation”, so a screen reader user can tell
it from the other landmarks on the page.<nav>, so a screen reader user who lists landmarks finds only
site sections there.<form role="search"> with a <label>, hidden with
.is-sr-only if needed, that says what it searches. The placeholder is not the
name: it disappears as soon as someone types.aria-current="page" on the current link in the secondary navigation and in
header menus.When arXiv has something to say to everyone, an announcement band shows above the bar, and the two scroll away together. See Announcement band.
<a class="ds-skip-link" href="#main">Skip to main content</a>
<div id="ds-announcement"></div>
<header class="ds-site-header">…</header>
banner.js draws the band into it; the host writes only the skip link
and the include. The band’s parts are on Special
messages.For pages about arXiv from outside it, such as this documentation. .ds-site-header--light re-points the seven surface tokens and nothing else. Every page that is part of arXiv, public or internal, uses the standard bar.
The bar at the top of this page is the light variant, with dropdown groups.
<header class="ds-site-header ds-site-header--light">
<a href="/" class="ds-site-header-logo">arXiv Design System</a>
<nav class="ds-site-header-nav" aria-label="Site navigation">
<a href="/patterns">Patterns</a>
<a href="/mockups">Mockups</a>
<a href="/docs">Docs</a>
</nav>
</header>
Each internal tool chooses the search fields, navigation and wordmark its users need; the regions, their order and the rules stay the same. Internal headers use a compact account area, one icon button that opens the account menu, not the greeting and Account menu of the public header. Every internal tool uses an internal logo, not the public one, so the reader can tell they are in an internal tool. The internal stylesheet may re-point the bar’s colour tokens and nothing else.
Full width
Tablet width
Phone width
<div class="ds-internal">
<header class="ds-site-header">
<a href="/" class="ds-site-header-logo">
<img src="logo_arxiv-admin-light.svg" alt="archive Admin Console">
</a>
<form class="ds-site-header-search" role="search" action="/users">
<label class="is-sr-only" for="search-users">Search users</label>
<input class="ds-input" type="search" id="search-users" name="q" placeholder="Search users">
</form>
<form class="ds-site-header-search" role="search" action="/documents">
<label class="is-sr-only" for="search-docs">Search submissions and documents</label>
<input class="ds-input" type="search" id="search-docs" name="q" placeholder="Search submissions">
</form>
<nav class="ds-site-header-nav" aria-label="Admin Console">
<a href="/resources">Resources</a>
<a href="/submission">Submission</a>
<a href="/support">User Support</a>
<a href="/students">Students</a>
</nav>
<div class="ds-site-header-tools">
<button type="button" class="ds-theme-toggle"></button>
</div>
<span class="ds-site-header-divider" aria-hidden="true"></span>
<div class="ds-site-header-account ds-site-header-account--compact">
<details class="ds-site-header-dropdown">
<summary class="ds-site-header-login">
<svg …>…</svg> <!-- Lucide circle-user -->
<span class="is-sr-only">Account, signed in as Shamsi</span>
</summary>
<div class="ds-site-header-menu">
<p>Signed in as <b>Shamsi</b></p>
<a href="/account">Your account</a>
<form method="post" action="/logout">
<button type="submit">Log out</button>
</form>
</div>
</details>
</div>
</header>
</div>
assets/images/logos/. Its alt text
names the tool in spoken form, such as “archive Admin Console”.<form role="search"> holding one .ds-input and its label,
before the navigation, where public pages have the Search link. Two kinds of search are two
of these. They stay in the bar while they fit, after the navigation and the account area
have folded into the menu; on a phone they open from a Search button..is-sr-only text; the menu’s first line shows the name, so a
person on a shared computer can check whose account they are in. On a phone it folds into
the menu, where the name shows beside the icon.Internal tools only. Adding .ds-site-header--sticky keeps the bar at the top of the viewport while the page scrolls, and the stylesheet sets scroll-padding-top on the page so a link to a section does not land under the bar. A page that uses it keeps no other sticky bar. It is not applied to the examples on this page, which already keeps the TOC bar in view.
A page includes the header from templates/ and writes the skip link before it,
pointing at its own main content. The templates
README says how to install the header, which variables a host sets, and how the stylesheet,
scripts and logo are published and cached. Banner
announcements says how to put up an announcement.
How the bar is coloured, and how a variant changes it.
.ds-site-header declares seven --ds-hdr-* tokens on itself: background,
text, emphasis text, hover, focus ring, bottom border and divider. Every rule in the bar reads one
of them, so a variant is a re-pointing of tokens and never a property override:
.ds-site-header--light sets all seven and nothing else. A property with its own
colours does the same.
The focus ring is the one to notice: the standard Link Blue ring is invisible against Repository Brown, so the dark surface needs its own. Because it is a token rather than a rule, a property that switches surface gets the correct ring without knowing that it needed to.