---
title: "Content blocks"
description: "One thing a page states, alone or in a set."
canonical: content.html
navigation-title: "Content blocks"
---

<a id="content-blocks"></a>

# Content blocks

- [card](#card)
- [stat](#stat)
- [surface](#surface)
- [quote](#quote)
- [byline](#byline)
- [checks](#checks)
- [logos](#logos)
- [logo](#logo)

One thing a page states, alone or in a set.

<a id="directive-card"></a>

<a id="card"></a>

## card

One card: a title that goes somewhere, and what is behind it.

Chapter · **[Installation](../installation.md)**
What the package needs, and the commands that
render a project with it.

For a desk

<a id="confval-card-href"></a>

**`href`**

- Type: string

A document, as a `:doc:` reference spells it, resolved per page. It is
the same thing the title's own reference says, for a card whose title is
plain text. Where both stand, this one wins.

<a id="confval-label"></a>

**`label`**

- Type: string

The tracked-out line over the title. The name or number of a set of
cards, `CHAPTER 02`, `FOR EDITORS`, or the date of an entry. The same
register and the same line.

<a id="confval-tag"></a>

**`tag`**

- Type: string

What kind of thing the card is, in the badge beside the label. A fact
about the card, not a result, so it carries no tone and no glyph. The
row drops where neither this nor the label stands.

<a id="confval-icon"></a>

**`icon`**

- Type: string

A glyph above the title, for a set a reader tells apart before a read.
The name is an icon of this system; see [Icons](../../design-system/brand-and-imagery/icons.md).

<a id="confval-card-sign"></a>

**`sign`**

- Type: string

The state of what the card stands for, measured: `yes`, `partly`,
`no` or `unknown`. The element draws the sign the drawings use for
it, at the end of the line over the title, and says its meaning in words.

<a id="confval-card-src"></a>

**`src`**

- Type: string

The picture, flush at the top of the card. The render copies a path in
the documentation source into the output and resolves it per page. A URL
somewhere else stays as it is. Either way it is one `<img>`, so a
drawing arrives in the colours its file declares.
[Illustrations and artwork](../../design-system/brand-and-imagery/illustrations.md) says why, and what the file has to be ready
for.

The name is `src` here and on the element, because everything in this
system that takes a file has that name.

<a id="confval-card-alt"></a>

**`alt`**

- Type: string

What the picture shows, for a reader who cannot see it. Written and
empty says decorative, a card whose art only repeats the title. Left out
entirely says nobody decided, which reads very differently.

<a id="confval-footer"></a>

**`footer`**

- Type: string

One line under a hairline at the foot of the card: what the reader gets
there, who it is for, what state it is in.

<a id="confval-action"></a>

**`action`**

- Type: string

The call to action, in words: `Read it`. Not a button and not a second
link. The whole card already goes there, so this is the line that says
so, and the arrow after it leans out under the pointer. Drawn only where
the card has somewhere to go.

**The title carries the target.**
`` .. card:: :ref:`Introduction <introduction>` `` is how a TYPO3 manual writes a card. The words of the
reference become the heading, and the reference becomes where the card
goes. A plain title with `:href:` says the same thing the other way round.

**The whole card is the link, and there is exactly one.** The title's anchor
stretches over the frame. So a screen reader announces the title, while a
pointer hits the card. A second anchor inside it is a second destination
under one frame, which is why there is no option for a button. A link in
the prose of a card still works, and is a card that asks to be two cards.

**The options are the properties of** `sds-card`, **all of them, spelt the way
the element spells them.** A directive that draws a component and answers for
half of it sends the author to their own stylesheet for the other half.
That is the one thing this system exists to prevent.

One that renames what it carries makes them translate a card they have
already read. `href` links and
`src` takes a file here for the reason they do everywhere else. What the
element gains, this gains. Its reference is `sds-card` in
[Content](../../frontend/components/content.md).

The node is `sds-card` itself and not a `div` with its classes. The
element is the front door here as everywhere else. So the card draws in one
file, and a rendered page cannot drift from one a product wrote. The template
writes none of the card. It sets the options above and lets the element
draw its own markup, which is what makes the card the component's to
change.

A reader with no JavaScript gets the whole of it anyway. Every element in
the site renders before the publish. So the picture, the row, the title and
the summary are in the document with no script. In a browser the element
upgrades over that rendering. This is the theme-wide arrangement,
not the card's own; see [Core markup, and what it becomes](../markup.md).

<a id="directive-stat"></a>

<a id="stat"></a>

## stat

One number as a fact: the figure, what the count is of, and the line that
bounds it.

**240 ms** — median answer
Measured over the last release, on a warm index.

**2 of 3** — sources answering
One is slow and one is unreachable from the checker.

<a id="confval-stat-value"></a>

**`the argument`**

- Type: string
- Required

The figure, `5`, `240`, `12.4+`, never "many". It is the argument
and not an option because it is what the line is about.

<a id="confval-stat-unit"></a>

**`unit`**

- Type: string

What the figure is in: `ms`, `%`, `kB`. The element sets it a step
down. It joins it to the number with the narrow no-break space a figure
must not split from, so no page has to know that character.

<a id="confval-stat-label"></a>

**`label`**

- Type: string

What the count is of, under the figure and in the label register.

<a id="confval-stat-of"></a>

**`of`**

- Type: string

The whole the figure is a part of, after it: `2 of 3`. Only where the
figure is a part. A measurement is out of nothing. It is words and not a
bar, so every figure in a set keeps the same shape and their notes start
on one line.

<a id="confval-stat-bar"></a>

**`bar`**

- Type: flag

With `:of:`, the share as a bar under the figure, so the proportion
reads before the numbers. Give it to every figure of a set or to none,
so the notes still start on one line.

<a id="confval-stat-list"></a>

**`list`**

- Type: flag

With `:of:`, one share of a list. The label and the count stand on one
line over the bar, and the body under it. For a set of shares where the
proportion is the point and the figure only its read-out.

<a id="confval-stat-icon"></a>

**`icon`**

- Type: string

A glyph on the figure's line, before the number. Muted and never in a
status colour, for the reason a card's is. A figure is a subject, not a
result.

**The body is the bound, and in practice it is mandatory.** "5 sources" says
nothing until it says which five. A figure with no bound is a claim, not a
fact, which is the whole reason `sds-stat` is a component. It stands
between the tags, not as an option, because out of a document that line
carries links.

**A set of figures is a set**, so it goes in `grid` like any other. At
`dense`, the width a number and the line under it hold. `flush` works
too. There the figures share a hairline, and the wall gives each its ground.

The frame in a wall is the wall's. So a figure anywhere else stays bare, and
a row of numbers on a page is not a row of boxes. The element is
`sds-stat` in [Content](../../frontend/components/content.md), beside its grid.

<a id="directive-surface"></a>

<a id="surface"></a>

## surface

One filled plane, with a statement in place.

The tool reads every source. It writes nothing back.

**Rule 02**

Their origins tell two answers that disagree

apart.

<a id="confval-surface-heading"></a>

**`the argument`**

- Type: string
- Required

The title of the plane, in the quieter register. This is not a
destination, and a title that looks like one is a promise the box does
not keep.

<a id="confval-surface-plane"></a>

**`plane`**

- Type: string

The fill. `raised` sits on the canvas and reads as a plane. `sunken`
is machine output: code, logs, structured content. Named for the fill,
because in a system with no shadows that is what tells two planes apart.
`raised` is the default.

<a id="confval-surface-label"></a>

**`label`**

- Type: string

The tracked-out line over the title, where a set has numbers or sources:
`AUDIENCE 01`, `SOURCE`, `STEP 02`. Over the title, not in it. A
title with its own number reads as part of the sentence.

<a id="confval-surface-icon"></a>

**`icon`**

- Type: string

A glyph above the title, where a reader tells a set apart before a read.
It stands beside the plane's own title, never alone, and takes the muted
ink for the reason a card's does. A plane is a subject, not a result.

**A plane states, a card goes somewhere.** That is the whole line between
the two, and it decides which one a page wants. A card's frame is the link
and its title is the anchor, so a set of planes claims nothing to click.
Neither is what `.. topic::` is. A digression in the reading flow that the
outline does not list stays an `<aside>`, and is not one of a set.

**It goes in a** `grid` **like any other set**, at the width the
statements hold. A plane on its own is a plane in the flow and renders, but
a single one says nothing the paragraph above it did not. The element is
`sds-surface` in [Content](../../frontend/components/content.md).

<a id="directive-quote"></a>

<a id="quote"></a>

## quote

A sentence from somewhere else, with its source.

> The fallback was never the problem. *Not saying*
> it was a fallback was the problem.
>
> — 24 July 2026

<a id="confval-quote-by"></a>

**`the argument`**

- Type: string
- Required

Who said it: a person, a document, a release note. It is the argument and
not an option because the element demands it. A quotation with no source
in a product's own writing reads as the product quoting itself. A
mandatory thing as an option is a thing authors leave out.

<a id="confval-quote-as"></a>

**`as`**

- Type: string

What they are to the subject, where the name alone does not say it: a
maintainer, a reviewer, the documentation. Spelt `as` and not `role`,
because `role` is the global ARIA attribute and claims a role that does
not exist.

<a id="confval-quote-meta"></a>

**`meta`**

- Type: string

When, and anything else in the label register: a date, a release, a
revision.

<a id="confval-quote-initials"></a>

**`initials`**

- Type: string

Their initials, and the monogram draws only with these given. A byline
derives them from a name. A quotation does not, because half of what is
worth a quote is a document. A monogram of a filename is a person
invented for a source with none.

<a id="confval-quote-href"></a>

**`href`**

- Type: string

Where to read it in full. The attribution becomes that link. A target
outside the site stays as it is, and one inside it resolves like any
other reference.

**The sentence goes between the tags**, because out of a document it carries
links and emphasis, which an attribute cannot hold. A block quote is the
spelling to reach for, and it is not available. The parser resolves an
indented block with an attribution line into a definition list, so
`<blockquote>` never reaches a template. This directive is how a manual
quotes anything. The element is `sds-quote` in
[Content](../../frontend/components/content.md). The attribution it draws is
`sds-byline`, which is why there is no option here for the order of that
row.

<a id="directive-byline"></a>

<a id="byline"></a>

## byline

Who wrote the page, what they are to it, and when. A paper has it under its
title.

Benjamin Kott · responsible for the content · version 1.0

The name is the argument. The options are the ones `quote` has: `:as:`,
`:meta:`, `:initials:` and `:href:`. The monogram comes
from the name, and `:initials:` says it where the name does not. The
element is `sds-byline` in [Content](../../frontend/components/content.md). The
Markdown twin writes the three parts on one line.

<a id="directive-checks"></a>

<a id="checks"></a>

## checks

A list whose items each carry a check. The glyph is `actions-check` of the icon
set. The body is an ordinary list, so a reader with no script gets the same list.

- **One overview:** One module shows all applications with access.
- **Known standards:** The API uses OAuth 2.0 and OpenAPI.

<a id="confval-checks-tone"></a>

**`tone`**

- Type: ok

`ok` draws the checks in the status green. Without it they take the ink of
the text.

<a id="directive-logos"></a>

<a id="logos"></a>

## logos

A wall of marks, with one `logo` per mark in the body. Before a mark goes in,
make sure that the licence of the mark lets the page show it.

**Used by**

![Soul](../../_images/signet.svg)

![Soul, at the large size](../../_images/signet-l.svg)

[Soul, at the large size](../../design-system/brand-and-imagery/brand.md)

The argument says what the marks have in common, and it is optional. The wall
grows by rows and has no limit. A short last row keeps the width of the cells.

<a id="directive-logo"></a>

<a id="logo"></a>

## logo

One mark of a wall. The argument is the file.

<a id="confval-logo-alt"></a>

**`alt`**

- Type: string
- Required

The name the mark stands for. A mark says nothing to a reader who cannot
see it.

<a id="confval-logo-href"></a>

**`href`**

- Type: string

Where the mark goes.
