Reference
This page lists what project.type: atelier sets on your behalf and the keys you can set yourself.
Extension options
These go under extensions.atelier in _quarto.yml. Each icon and manifest tag is emitted only when its key is set, while theme-color also follows the brand.
| Option | Description |
|---|---|
site-url |
Base URL for <meta property="og:url">. Anchor it to website.site-url. |
icon |
Path to an SVG icon, emitted as rel="icon" with type="image/svg+xml". |
apple-touch-icon |
Path to a 180x180 PNG, emitted as rel="apple-touch-icon". |
manifest |
Path to a web app manifest, emitted as rel="manifest". |
theme-color |
Browser UI tint (Safari toolbar, Android address bar, installed web app title bar), one colour per scheme, each emitted with a prefers-color-scheme media query. Each scheme falls back to color.background of the _brand.yml for that mode, which is the page background of the matching bundle; set a scheme only to override it. |
Paths are relative to the site root. Quarto’s website resource resolver prefixes each page’s offset to the project root, so the same value resolves at the root, from a subdirectory such as this page, and from the 404 page.
website:
site-url: &site-url https://example.com/my-project
extensions:
atelier:
site-url: *site-url
icon: assets/icons/icon.svg
apple-touch-icon: assets/icons/apple-touch-icon.png
manifest: site.webmanifest
theme-color:
light: "#F5F7FA"
dark: "#0B1220"The anchor is needed because Quarto keeps the website block out of the metadata it hands to Lua filters.
Website defaults
The project type sets these under website, and any of them can be overridden in your own _quarto.yml.
| Key | Value |
|---|---|
repo-actions |
[edit, issue] |
repo-link-target, repo-link-rel |
_blank, noopener noreferrer |
open-graph.locale |
en_GB, matching the format’s lang |
twitter-card.card-style |
summary_large_image |
page-navigation, back-to-top-navigation |
true |
llms-txt |
true |
search |
Overlay search in the navbar |
navbar, page-footer |
On, with the footer border on |
It also sets project.output-dir to _site.
Neither bar sets background or foreground: the chrome palette drives both, and $atelier-chrome decides whether it follows the colour scheme or is pinned to light or dark.
A website.sidebar of your own is styled rather than configured: a style: docked sidebar is painted from the --atelier-sidebar-* tokens, which default to the navbar ones, while a style: floating sidebar takes the chrome background and foreground alone. This site sets navbar: false and gives the docked sidebar the navigation and the search; --profile navbar renders the same pages with the navbar instead.
Format defaults
The project type sets format: atelier-html. Configure it by that name: declaring format: html replaces it rather than configuring it.
| Key | Value |
|---|---|
lang |
en-GB |
date-format |
dddd[, the] Do [of] MMMM, YYYY |
theme |
The chrome palette, brand, and the Atelier stylesheet, light and dark |
syntax-highlighting |
arrow-light and arrow-dark |
toc, toc-depth |
true, 3 |
anchor-sections |
true |
code-copy, code-overflow |
true, wrap |
code-link |
false |
link-external-newwindow |
true |
respect-user-color-scheme |
true |
canonical-url |
true |
grid |
300px sidebar, 1000px body, 300px margin |
It also bundles six scripts into every page: a skip link before the body, and after it the current year, the external-link marks, the ordinal dates, the accessibility fixes, and the navbar tooltips. Replacing the format with html drops all six, which is what the id="navbar-tooltips" check on the home page looks for.
Code blocks show on a tinted surface, with a border and an inset. If you set code-block-bg: false under format.atelier-html, the tint is not shown and code blocks show as outlines. A block with a filename keeps the surface of its code window. The border and the inset stay, so the code stays separate from the text around it. The tint always comes from the brand colours, so a colour value for code-block-bg has no effect. The same is true for typography.monospace.background-color and typography.monospace-block.background-color in _brand.yml, which set code-block-bg. The code surface comes from the brand colours, so the contrast of the syntax highlighting colours on it depends on your brand.
The muted text that Quarto styles on the page, such as the previous and next page links, comes from the page colours and has a contrast of at least 4.5:1 against the page. To change it, set $atelier-text-muted in a project stylesheet under format.atelier-html.theme.
Embedded extensions
Atelier contains five extensions, so you do not install them yourself. The atelier-html format runs their filters and shortcodes on each HTML page. The shortcodes work on HTML pages only: on a page in another format, such as Typst, Quarto stops with “Shortcode ‘iconify’ not found”. Atelier needs the highest Quarto version that its embedded extensions need, so its own minimum version follows theirs.
| Extension | What it does | Options under |
|---|---|---|
| iconify | Adds the {{< iconify >}} shortcode, for icons from the Iconify sets. |
extensions.iconify |
| gitlink | Shows a repository widget in place of a navbar item or sidebar tool with the href #gitlink-widget. |
extensions.gitlink |
| code-window | Shows a code block that has a filename in a window frame with a title bar. |
extensions.code-window |
| toc-depth | Sets the table of contents depth below a heading, with the toc-depth attribute. |
extensions.toc-depth |
| collapse-output | Puts cell output in a collapsible block, with the output-fold cell option. |
extensions.collapse-output |
Each extension keeps its own defaults, and its repository lists its options. Atelier changes two defaults. gitlink shows only its widget, and does not change the references in your text. Code Window shows a window only for a block that has a filename, and does not make a label from the language of the other blocks. To turn reference rewriting on, or to give every block a window, set:
extensions:
gitlink:
enabled: true
code-window:
auto-filename: trueUpgrade from separate copies
If your project has its own copy of one of these five extensions, remove it from _extensions/ and remove its name from your filters list. Quarto looks up the names in your filters list in your own _extensions/ only, so it then runs your copy and the embedded copy, and your copy’s shortcodes replace the embedded ones. Keep your options under extensions:: the embedded copies read them.
Page keys
| Key | Effect |
|---|---|
description |
Fills <meta name="description"> and Quarto’s og:description. |
subtitle |
Used for the description tags when description is absent. |
description-meta |
Used as written, in preference to both. |
canonical-url: false |
Drops the canonical link. Set it on a page served from more than one URL, like 404.qmd. |
A page with none of the first three gets no description tag at all, so give every page a description or a subtitle.
og:url is emitted for every page except 404.html, which is served from any URL depth and so claims none of its own.
Framed embeds
.embed-art frames an embedded document or an image as a tilted card, centred without a wrapper.
{.embed-art loading="lazy" title="Typst PDF rendered from the demo source"}Pandoc writes an image whose target is not an image as a bare <embed> carrying the attributes, so the class applies to <embed> and <img> alike and every declaration lands on the element itself. On an <embed>, title is what gives it an accessible name; loading="lazy" is honoured on an <img> but has no effect there.
The card takes the shape of what it frames, never wider than the column, with the same padding on all four sides. An <img> is framed at its own dimensions, and an <embed> at whatever width and height you give it:
{.embed-art width=800 height=600}An <embed> is the one case with nothing to follow when you give it no size, because a nested browsing context does not report the dimensions of the document inside it. These two properties are what it falls back to, and they have no effect on an image or on an <embed> with a width.
| Property | Default | Effect |
|---|---|---|
--atelier-embed-art-width |
560px |
Width of an <embed> with no width of its own. |
--atelier-embed-art-ratio |
1.5 |
Shape of that fallback, as width over height. |
One property applies to every card.
| Property | Default | Effect |
|---|---|---|
--atelier-embed-art-tilt |
-1.25deg |
Resting rotation, relaxed toward straight on hover. |
The frame, the offset shadow, and the card background are drawn from the page ink and paper, so they follow the colour scheme. Under prefers-reduced-motion: reduce, the card holds its resting angle and does not react to hover at all.
Landing page
Atelier has opt-in classes for a landing page: a hero, feature rows and a card grid. Write each block as a fenced div, on a page with page-layout: full and title-block-style: none. The Landing page guide shows each block and its Markdown, and the home page of this site uses them.
::: {.atelier-landing}
::: {.atelier-hero .gradient}
::: {.atelier-hero-text}
# Project name
[One sentence that says what the project does.]{.atelier-lead}
:::
:::
:::| Block | Classes | Modifiers |
|---|---|---|
| Container | .atelier-landing |
None. |
| Hero | .atelier-hero, with the parts .atelier-hero-text, .atelier-hero-figure, .atelier-eyebrow, .atelier-lead and .atelier-actions |
.split, .centred, .banner, .gradient and .glow |
| Feature row | .atelier-feature, with the parts .atelier-feature-text and .atelier-feature-figure |
.reverse |
| Legend | .atelier-legend around an ordered list, with .atelier-detail spans |
None. |
| Cards | .atelier-cards, which holds .atelier-card divs |
.compact |
| Modifier | Effect |
|---|---|
.split |
Puts the text part and the figure part side by side. A hero has this layout when it has no other layout modifier. |
.centred |
Centres the text part, in one column. A centred hero has no figure part. |
.banner |
Puts the hero on a tinted surface with a border. |
.gradient |
Fills the hero title (the h1 or the h2) with a gradient that starts at the primary colour. |
.glow |
Puts a soft glow of the primary colour behind the figure. |
.reverse |
Puts the figure part of a feature row on the left. |
.compact |
Makes smaller cards, with the icon and the heading on one line. |
The container sets the width of the blocks. On a page that has the container, Atelier hides the title block, because the hero shows the h1. The title of the hero is an h1, or an h2 on a page that has its own h1. Each block stacks into one column below the md breakpoint, and a reversed feature row shows its text part first.
Each colour of the gradient has a contrast of 4.5:1 or more against the page, in each colour scheme. If a colour cannot have this contrast, the hero title uses the primary colour only. In print and in forced colours mode, the hero title is plain text and the glow is removed. Nothing in the blocks moves, so the reduced motion setting has no effect on them.
A card holds an icon, a heading, one sentence and one link. The link covers the whole card, and the focus ring of the link goes around the card. Put only one link in a card, and write link text that says where the link goes. A compact card has no sentence: put its link in the heading.
These Sass variables set the geometry. Set them in the defaults layer of a project stylesheet.
| Variable | Default | Effect |
|---|---|---|
$atelier-landing-max-width |
1140px |
Maximum width of the container. |
$atelier-landing-gap |
3rem |
Space between the two parts of a hero or a feature row. |
$atelier-hero-title-size |
clamp(2.2rem, 5vw, 3.4rem) |
Font size of the hero title. |
$atelier-hero-figure-max-width |
320px |
Maximum width of the image in the hero figure. |
$atelier-hero-gradient-shift |
40deg |
Hue difference between the first and the last gradient colour. |
$atelier-card-min-width |
13rem |
Minimum width of a card column. |
These Sass variables set the colours. Atelier calculates each default from the brand for each colour scheme. The gradient check above also applies to gradient colours that you set.
| Variable | Default | Effect |
|---|---|---|
$atelier-landing-accent |
$primary, moved to 4.5:1 against the page |
Eyebrow, legend numbers, card hover. |
$atelier-landing-muted |
$text-muted, moved to 4.5:1 against the page |
Lead and legend detail text. |
$atelier-landing-surface |
body-mix(95%) |
Card and banner surface. |
$atelier-landing-border |
body-mix(85%) |
Card, banner and feature row borders. |
$atelier-card-muted |
$text-muted, moved to 4.5:1 against the card surface |
Card text. |
$atelier-card-link |
$link-color, moved to 4.5:1 against the card surface |
Card link. |
$atelier-hero-gradient-start |
$atelier-landing-accent |
First colour of the title gradient. |
$atelier-hero-gradient-middle |
The mix of the first and last colours, moved to 4.5:1 | Middle colour of the title gradient. |
$atelier-hero-gradient-end |
$primary with the hue shift, moved to 4.5:1 |
Last colour of the title gradient. |
$atelier-hero-glow-color |
$primary at 25% opacity |
Colour of the glow behind the figure. |