Cards¶
Cards contain content and actions about a single subject. A card is a flexible and extensible content container, it can be formatted with components including headers and footers, titles and images.
Card content
See the Material Design and Bootstrap card descriptions for further details.
Syntax
:::{card} Card Title
Card content
:::
.. card:: Card Title
Card content
Card images¶
You can also add an image as the background of a card or at the top/bottom of the card, with the img-background, img-top, img-bottom options:
Header
Content
Header
Content
Syntax
:::::{grid} 2 3 3 4
::::{grid-item}
:::{card} Title
:img-background: images/particle_background.jpg
:class-card: sd-text-black
:img-alt: my text
Text
:::
::::
::::{grid-item-card} Title
:img-top: images/particle_background.jpg
:img-alt:
:::{card-header}
Header
:::
Content
:::{card-footer}
Footer
:::
::::
::::{grid-item-card} Title
:img-bottom: images/particle_background.jpg
:::{card-header}
Header
:::
Content
:::{card-footer}
Footer
:::
::::
:::::
.. grid:: 2 3 3 4
.. grid-item::
.. card:: Title
:img-background: images/particle_background.jpg
:class-card: sd-text-black
:img-alt: my text
Text
.. grid-item-card:: Title
:img-top: images/particle_background.jpg
:img-alt:
.. card-header::
Header
Content
.. card-footer::
Footer
.. grid-item-card:: Title
:img-bottom: images/particle_background.jpg
.. card-header::
Header
Content
.. card-footer::
Footer
Clickable cards¶
Using the link and link-type options, you can turn an entire card into a clickable link.
Try hovering over then clicking on the cards below:
The entire card can be clicked to navigate to https://example.com.
The entire card can be clicked to open https://example.com in a new tab.
The entire card can be clicked to navigate to the cards-clickable reference target.
Syntax
(cards-clickable)=
## Clickable cards
Using the `link` and `link-type` options, you can turn an entire card into a clickable link. Try hovering over then clicking on the cards below:
:::{card} Clickable Card (external)
:link: https://example.com
The entire card can be clicked to navigate to <https://example.com>.
:::
:::{card} Clickable Card (external)
:link: https://example.com
:link-alt: example.com
The entire card can be clicked to navigate to <https://example.com>.
:::
:::{card} Clickable Card (external, new tab)
:link: https://example.com
:link-alt: example.com (opens in a new tab)
:link-new-tab:
The entire card can be clicked to open <https://example.com> in a new tab.
:::
:::{card} Clickable Card (internal)
:link: cards-clickable
:link-type: ref
The entire card can be clicked to navigate to the `cards-clickable` reference target.
:::
:::{card} Clickable Card (internal)
:link: cards-clickable
:link-type: ref
:link-alt: clickable cards
The entire card can be clicked to navigate to the `cards-clickable` reference target.
:::
.. _cards-clickable:
Clickable cards
...............
Using the ``link`` and ``link-type`` options, you can turn an entire card into a clickable link. Try hovering over then clicking on the cards below:
.. card:: Clickable Card (external)
:link: https://example.com
The entire card can be clicked to navigate to https://example.com.
.. card:: Clickable Card (external)
:link: https://example.com
:link-alt: example.com
The entire card can be clicked to navigate to https://example.com.
.. card:: Clickable Card (external, new tab)
:link: https://example.com
:link-alt: example.com (opens in a new tab)
:link-new-tab:
The entire card can be clicked to open https://example.com in a new tab.
.. card:: Clickable Card (internal)
:link: cards-clickable
:link-type: ref
The entire card can be clicked to navigate to the ``cards-clickable`` reference target.
.. card:: Clickable Card (internal)
:link: cards-clickable
:link-type: ref
:link-alt: clickable cards
The entire card can be clicked to navigate to the ``cards-clickable`` reference target.
The external link created above is equivalent to using <https://example.com>
(https://example.com),
or if the link-alt option is provided, [alt text](https://example.com)
(alt text).
Tip
Using URLs as link text makes it harder
for disabled people and for search engines to digest your web page,
so it’s best to provide link text via the link-alt option.
The internal link created above is equivalent to using {ref}`cards-clickable`
(Clickable cards),
or if the link-alt option is provided, {ref}`alt text <cards-clickable>`
(alt text).
Note
You cannot add additional links to the clickable card, neither in the card title nor in the card body. The entire card becomes a single link to the destination you specify, which overrides any other links inside the card.
Aligning cards¶
You can use the text-align option to align the text in a card,
and also auto margins to align the cards horizontally.
Content
Content
Content
Card carousels¶
The card-carousel directive can be used to create a single row of fixed width, scrollable cards.
The argument should be a number between 1 and 12, to denote the number of cards to display.
When scrolling a carousel, the scroll will snap to the start of the nearest card:
content
Longer
content
Syntax
::::{card-carousel} 2
:::{card} card 1
content
:::
:::{card} card 2
Longer
content
:::
:::{card} card 3
:::
:::{card} card 4
:::
:::{card} card 5
:::
:::{card} card 6
:::
::::
.. card-carousel:: 2
.. card:: card 1
content
.. card:: card 2
Longer
content
.. card:: card 3
.. card:: card 4
.. card:: card 5
.. card:: card 6
card options¶
- width
The width that the card should take up (in %): auto, 25%, 50%, 75%, 100%.
- margin
Outer margin of grid. One (all) or four (top bottom left right) values from: 0, 1, 2, 3, 4, 5, auto.
- text-align
Default horizontal text alignment: left, right, center or justify
- img-background
A URI (relative file path or URL) to an image to be placed below the content.
- img-top
A URI (relative file path or URL) to an image to be placed above the content.
- img-bottom
A URI (relative file path or URL) to an image to be placed below the content.
- img-alt
Alternative text for the image (that will be used by screen-readers).
- link
Turn the entire card into a clickable link to an external/internal target.
- link-type
Type of link:
url(default),ref,doc,any.- link-alt
Alternative text for the link (that will be used by screen-readers).
- link-new-tab
Flag. When set, the card link opens in a new browser tab (
target="_blank",rel="noreferrer noopener"). Works with alllink-typevalues; has no effect withoutlink. Sphinx renders therelattribute only from version 7.4; browsers already treattarget="_blank"links asnoopener. It affects only HTML-based output (HTML, EPUB); other formats ignore it. Tell readers the link opens a new tab, for example inlink-alt. To open every external link in a new tab, site-wide, see the sphinx-new-tab-link extension.- shadow
The size of the shadow below the card:
none,sm(default),md,lg.- header
Inline-markup short-hand for a single-line header (equivalent to a
card-headerdirective; the two are mutually exclusive).- footer
Inline-markup short-hand for a single-line footer (equivalent to a
card-footerdirective; the two are mutually exclusive).- class-card
Additional CSS classes for the card container element.
- class-header
Additional CSS classes for the header element.
- class-body
Additional CSS classes for the body element.
- class-title
Additional CSS classes for the title element.
- class-footer
Additional CSS classes for the footer element.
- class-img-top
Additional CSS classes for the top image (if present).
- class-img-bottom
Additional CSS classes for the bottom image (if present).
Legacy separator syntax¶
Deprecated since version 0.8: Prefer the card-header / card-footer directives (above).
The ^^^ / +++ separators are deprecated: they scan the card’s raw source
lines, so a ^^^ or +++ line inside nested content (for example a code block)
is mistaken for a separator, and they have no meaning to non-Python MyST tools.
Historically, a card header and footer were delimited within the body itself:
all content before the first line of three-or-more ^^^ became the header,
and all content after the final line of three-or-more +++ became the footer.
Header
Card content
This syntax is still recognised by default, but emits a deprecation warning (once per document). The rewrite is mechanical:
Legacy separators |
Header / footer directives |
|---|---|
|
a |
|
a |
:::{card} Card Title
Header
^^^
Body
+++
Footer
:::
becomes
::::{card} Card Title
:::{card-header}
Header
:::
Body
:::{card-footer}
Footer
:::
::::
.. card:: Card Title
Header
^^^
Body
+++
Footer
becomes
.. card:: Card Title
.. card-header::
Header
Body
.. card-footer::
Footer
Important
Migrate, then flip the flag
While the legacy separators are enabled (the default), the raw-line scan runs
on every card, so a stray column-0 ^^^ or +++ — even inside a code
block, and even in a card that has already migrated to the card-header /
card-footer directives — is still treated as a separator (mis-splitting the
card and emitting a mixed-syntax warning). The single-parse robustness is only
realized once the separators are turned off.
The recommended order is therefore migrate first, then flip the flag:
convert every card to the directives, then set
sd_card_legacy_separators = False in your conf.py.
With sd_card_legacy_separators = False, ^^^ / +++ lines are no longer
scanned — but they do not reliably render as literal text, so migrate
before flipping:
in MyST, a bare
+++line is a block break and silently disappears;in reStructuredText, a
^^^/++++line can raise a docutilsCRITICAL“Unexpected section title or transition” error.
Note
Builds that treat warnings as errors
The deprecation warning is on by default, so a build run with -W
(or --fail-on-warning) fails while any document still uses ^^^ / +++.
There are two remedies:
migrate those cards to the
card-header/card-footerdirectives (above); orkeep the legacy syntax for now and silence the warning in your
conf.py:suppress_warnings = ["design.card_legacy"]
Timeline: deprecated now (default on) → default off at 1.0 → removed at 2.0.