This section covers our primary patterns for differentiating and organizing content based on user needs. The organizing principle to follow throughout: Choose typographic and proximity-based organization patterns first, reach for visible containers only when called for.
What a user needs to learn determines the right organizational pattern to employ for any group of content. Use the four questions below as a starting point. Each question has a test and a set of patterns that answer it. Most content will fit under one of these questions. Have an edge case? Discuss it with the design team.
The address or the item changes.
Directing user attention.
The content swaps in place.
Before choosing components, decide what the page is for and which content is primary. Everything else is arranged so it does not push the primary content down.
refresh-cw). An explanation of the figures is secondary: see Where secondary content goes..ds-btn-group--split around the two). The row is close to the list and clearly apart from the text above it.Each kind of secondary content has a home that keeps the main content high and wide. Compare at least two homes for each piece, and keep the one that leaves the main content highest and widest.
Every page sits in .ds-container. It centres the content in a
column at the standard reading width, 850px at most, with a margin of at least 24px on each side.
For a band that runs edge to edge, see Page zones.
<main class="ds-container">…</main>
.ds-container places every direct child in the reading column and puts
--ds-space-section (48px) between them, so a section has no margin of its own.
getComputedStyle.A sidebar sits to the right of the main column and contains supplementary content. If the content is secondary, distinct from the main content, and it is important that it not be pushed far down the page, then a sidebar is appropriate.
The sidebar has no background and no border. Space alone separates it from the reading column and separates its blocks from each other.
We study the convergence of stochastic gradient methods when the gradient noise is heavy-tailed, and show that the step size must shrink with the tail index.
<div>
<article>…</article>
<aside class="ds-sidebar" aria-label="Paper details">
<details class="ds-acc" open>
<summary>Versions</summary>
<div class="ds-acc-body">
<dl>
<dt>v3 · current</dt><dd>24 Apr 2026</dd>
<dt>v2</dt><dd><a href="#">2 Mar 2026</a></dd>
</dl>
</div>
</details>
<details class="ds-acc">
<summary>Paper information</summary>
<div class="ds-acc-body">…</div>
</details>
</aside>
</div>
<aside> with an aria-label that names what it holds:
a complementary landmark. Its parent becomes the two-column layout, with the main content
taking the spare width, the sidebar 17rem wide, and --ds-space-section between
them. Blocks inside the sidebar are 24px apart (--ds-space-6). Nothing in it is
sticky.A rule between things. It belongs in the same conversation as the card, because both answer the same question and the answer is usually neither: this system groups with space first, and a line drawn where space would have done adds noise without adding meaning.
Standard gap
A section of content.
The next section.
And the one after it.
<p>A section of content.</p>
<hr>
<p>The next section.</p>
<hr>
<p>And the one after it.</p>
--ds-space-8), no class needed, and it includes
role="separator" for free.Tight gap
An item in a group.
The next item in the same group.
And the one after it.
<p>An item in a group.</p>
<hr class="ds-divider ds-divider--tight">
<p>The next item in the same group.</p>
<hr class="ds-divider ds-divider--tight">
<p>And the one after it.</p>
--ds-space-block). It works on an
<hr>, which keeps the separator meaning.Vertical dividers in a row of controls
<div class="ds-btn-group">
<span>Search</span>
<span class="ds-divider ds-divider--vertical" aria-hidden="true"></span>
<span>Submit</span>
<span class="ds-divider ds-divider--vertical" aria-hidden="true"></span>
<span>Donate</span>
</div>
<hr> will not fit:
inside a flex row, or on an element that is already there. It is
decorative, so mark it aria-hidden — a real separator should be an
<hr>.em, so it
follows the row's own text instead of needing a value per context.At wide screen widths, our max content width leaves enough gutter space on the sides for marginalia. A short note beside the block it belongs to is appropriate for annotation-style content. At narrower widths, it is hidden in an info icon in the block’s top-right corner. Try it by widening and narrowing your screen.
A margin note is one or two sentences. Anything longer belongs in the main content.
The block the note belongs to: a paragraph, a figure, a table or a card. Any block works once it is positioned (position: relative); a card already is.
<div class="ds-card">
<details class="ds-marginalia">
<summary><svg aria-hidden="true">…</svg><span class="is-sr-only">Note</span></summary>
<p class="ds-marginalia-body ds-annotation">The note.</p>
</details>
…
</div>
<details>. Its first child in the block, so it is read
before the thing it annotates. The block supplies position: relative;
.ds-card already does..ds-annotation for the voice. In the margin it has no
chrome; folded, it opens as a small panel under the mark.aria-hidden, so without it the control
announces as nothing.<main>. A page with two, or with none, gives a screen-reader user nothing to
jump to.<aside> with an
aria-label that says what it holds, so it announces as a complementary landmark
with a name, not as part of the article.<details> and <summary>: the summary is focusable and
toggles with Enter and Space for free. Do not rebuild them from <div>
elements and click handlers.The default page background is white, and that is the color that primary page content sits on. The secondary zone is a tinted band for what introduces or supports that content: the opening of the page, and any closing material. The zone is named for its role, because the ground changes in dark mode.
A zone is optional. Without one, the whole page is on the page ground, --ds-canvas
(white in light mode).
The secondary zone is a full band: a direct child of the container marked .ds-full,
which runs edge to edge while its own content lines up with the reading column. Note that
.ds-full adds no background colour. A band is coloured only by a page zone, or by a
component with its own background such as the TOC bar. On this page you are looking at, the tinted
band behind the title and the TOC bar are .ds-full bands.
The thing the page is about, on the page ground.
<div class="ds-container">
<div class="ds-full ds-zone-secondary"> <!-- tinted: introduces -->
<header class="ds-page-header">…</header>
</div>
<section>…</section> <!-- page ground: the thing itself -->
<div class="ds-full ds-zone-secondary"> <!-- tinted: supports -->
<section>…</section>
</div>
</div>
.ds-full band and gives it the tinted ground and its own top and
bottom padding. A band that opens or closes the page runs to the container’s edge. The
colour is the token --ds-zone-secondary-bg: the class is what you write, and
the token is the colour the class applies, which changes in dark mode..ds-container. The child runs across all three
columns, from edge to edge, and its padding brings its own content back in line with the
centre column. It has no background of its own..ds-full works on
children of .ds-container; nested deeper it does nothing.100vw.
100vw includes the scrollbar, so a band built that way is wider than the page, and
the page scrolls sideways on Windows and Linux. .ds-full measures the container
instead, so it fits exactly.A dense internal tool can use a wider page: 1080px instead of 850px. Use it for tables and filters that do not fit the standard width, not for prose.
<main class="ds-container ds-container--wide">…</main>
.ds-container--wide sets the reading column to --ds-width-wide (1080px). Full-width bands follow it.