Working with a specific static site generator? Customize CloudCannon's documentation to suit your SSG.
Select your preferred SSG
Showing docs
{
selected_name = 'Astro';
selected_icon = '/documentation/static/ssgs/astro.svg';
$store.conditionals.select('ssg-name', selected_name);
$store.conditionals.select('ssg-icon', selected_icon);
open = false;
$dispatch('ssgchange');
}" aria-controls="docs-ssg-selector-astro" aria-label="Astro" aria-selected="false" class="c-docs-ssg-selector__item" role="tab" x-init="$store.conditionals.registerValue('ssg', {'name': 'Astro', 'icon': '/documentation/static/ssgs/astro.svg'})" x-show="selected_name !== 'Astro'">
Astro
{
selected_name = 'Bridgetown';
selected_icon = '/documentation/static/ssgs/bridgetown.svg';
$store.conditionals.select('ssg-name', selected_name);
$store.conditionals.select('ssg-icon', selected_icon);
open = false;
$dispatch('ssgchange');
}" aria-controls="docs-ssg-selector-bridgetown" aria-label="Bridgetown" aria-selected="false" class="c-docs-ssg-selector__item" role="tab" x-init="$store.conditionals.registerValue('ssg', {'name': 'Bridgetown', 'icon': '/documentation/static/ssgs/bridgetown.svg'})" x-show="selected_name !== 'Bridgetown'">
Bridgetown
{
selected_name = 'Docusaurus';
selected_icon = '/documentation/static/ssgs/docusaurus.svg';
$store.conditionals.select('ssg-name', selected_name);
$store.conditionals.select('ssg-icon', selected_icon);
open = false;
$dispatch('ssgchange');
}" aria-controls="docs-ssg-selector-docusaurus" aria-label="Docusaurus" aria-selected="false" class="c-docs-ssg-selector__item" role="tab" x-init="$store.conditionals.registerValue('ssg', {'name': 'Docusaurus', 'icon': '/documentation/static/ssgs/docusaurus.svg'})" x-show="selected_name !== 'Docusaurus'">
Docusaurus
{
selected_name = 'Eleventy';
selected_icon = '/documentation/static/ssgs/eleventy.svg';
$store.conditionals.select('ssg-name', selected_name);
$store.conditionals.select('ssg-icon', selected_icon);
open = false;
$dispatch('ssgchange');
}" aria-controls="docs-ssg-selector-eleventy" aria-label="Eleventy" aria-selected="false" class="c-docs-ssg-selector__item" role="tab" x-init="$store.conditionals.registerValue('ssg', {'name': 'Eleventy', 'icon': '/documentation/static/ssgs/eleventy.svg'})" x-show="selected_name !== 'Eleventy'">
Eleventy
{
selected_name = 'Gatsby';
selected_icon = '/documentation/static/ssgs/gatsby.svg';
$store.conditionals.select('ssg-name', selected_name);
$store.conditionals.select('ssg-icon', selected_icon);
open = false;
$dispatch('ssgchange');
}" aria-controls="docs-ssg-selector-gatsby" aria-label="Gatsby" aria-selected="false" class="c-docs-ssg-selector__item" role="tab" x-init="$store.conditionals.registerValue('ssg', {'name': 'Gatsby', 'icon': '/documentation/static/ssgs/gatsby.svg'})" x-show="selected_name !== 'Gatsby'">
Gatsby
{
selected_name = 'Hugo';
selected_icon = '/documentation/static/ssgs/hugo.svg';
$store.conditionals.select('ssg-name', selected_name);
$store.conditionals.select('ssg-icon', selected_icon);
open = false;
$dispatch('ssgchange');
}" aria-controls="docs-ssg-selector-hugo" aria-label="Hugo" aria-selected="false" class="c-docs-ssg-selector__item" role="tab" x-init="$store.conditionals.registerValue('ssg', {'name': 'Hugo', 'icon': '/documentation/static/ssgs/hugo.svg'})" x-show="selected_name !== 'Hugo'">
Hugo
{
selected_name = 'Jekyll';
selected_icon = '/documentation/static/ssgs/jekyll.svg';
$store.conditionals.select('ssg-name', selected_name);
$store.conditionals.select('ssg-icon', selected_icon);
open = false;
$dispatch('ssgchange');
}" aria-controls="docs-ssg-selector-jekyll" aria-label="Jekyll" aria-selected="false" class="c-docs-ssg-selector__item" role="tab" x-init="$store.conditionals.registerValue('ssg', {'name': 'Jekyll', 'icon': '/documentation/static/ssgs/jekyll.svg'})" x-show="selected_name !== 'Jekyll'">
Jekyll
{
selected_name = 'Lume';
selected_icon = '/documentation/static/ssgs/lume.svg';
$store.conditionals.select('ssg-name', selected_name);
$store.conditionals.select('ssg-icon', selected_icon);
open = false;
$dispatch('ssgchange');
}" aria-controls="docs-ssg-selector-lume" aria-label="Lume" aria-selected="false" class="c-docs-ssg-selector__item" role="tab" x-init="$store.conditionals.registerValue('ssg', {'name': 'Lume', 'icon': '/documentation/static/ssgs/lume.svg'})" x-show="selected_name !== 'Lume'">
Lume
{
selected_name = 'MkDocs';
selected_icon = '/documentation/static/ssgs/mkdocs.svg';
$store.conditionals.select('ssg-name', selected_name);
$store.conditionals.select('ssg-icon', selected_icon);
open = false;
$dispatch('ssgchange');
}" aria-controls="docs-ssg-selector-mkdocs" aria-label="MkDocs" aria-selected="false" class="c-docs-ssg-selector__item" role="tab" x-init="$store.conditionals.registerValue('ssg', {'name': 'MkDocs', 'icon': '/documentation/static/ssgs/mkdocs.svg'})" x-show="selected_name !== 'MkDocs'">
MkDocs
{
selected_name = 'Next.js';
selected_icon = '/documentation/static/ssgs/nextjs.svg';
$store.conditionals.select('ssg-name', selected_name);
$store.conditionals.select('ssg-icon', selected_icon);
open = false;
$dispatch('ssgchange');
}" aria-controls="docs-ssg-selector-nextjs" aria-label="Next.js" aria-selected="false" class="c-docs-ssg-selector__item" role="tab" x-init="$store.conditionals.registerValue('ssg', {'name': 'Next.js', 'icon': '/documentation/static/ssgs/nextjs.svg'})" x-show="selected_name !== 'Next.js'">
Next.js
{
selected_name = 'Nuxt';
selected_icon = '/documentation/static/ssgs/nuxtjs.svg';
$store.conditionals.select('ssg-name', selected_name);
$store.conditionals.select('ssg-icon', selected_icon);
open = false;
$dispatch('ssgchange');
}" aria-controls="docs-ssg-selector-nuxt" aria-label="Nuxt" aria-selected="false" class="c-docs-ssg-selector__item" role="tab" x-init="$store.conditionals.registerValue('ssg', {'name': 'Nuxt', 'icon': '/documentation/static/ssgs/nuxtjs.svg'})" x-show="selected_name !== 'Nuxt'">
Nuxt
{
selected_name = 'Static';
selected_icon = '/documentation/static/ssgs/statik.svg';
$store.conditionals.select('ssg-name', selected_name);
$store.conditionals.select('ssg-icon', selected_icon);
open = false;
$dispatch('ssgchange');
}" aria-controls="docs-ssg-selector-static" aria-label="Static" aria-selected="false" class="c-docs-ssg-selector__item" role="tab" x-init="$store.conditionals.registerValue('ssg', {'name': 'Static', 'icon': '/documentation/static/ssgs/statik.svg'})" x-show="selected_name !== 'Static'">
Static
{
selected_name = 'SvelteKit';
selected_icon = '/documentation/static/ssgs/sveltekit.svg';
$store.conditionals.select('ssg-name', selected_name);
$store.conditionals.select('ssg-icon', selected_icon);
open = false;
$dispatch('ssgchange');
}" aria-controls="docs-ssg-selector-sveltekit" aria-label="SvelteKit" aria-selected="false" class="c-docs-ssg-selector__item" role="tab" x-init="$store.conditionals.registerValue('ssg', {'name': 'SvelteKit', 'icon': '/documentation/static/ssgs/sveltekit.svg'})" x-show="selected_name !== 'SvelteKit'">
SvelteKit
{
selected_name = 'Custom';
selected_icon = '/documentation/static/ssgs/custom.svg';
$store.conditionals.select('ssg-name', selected_name);
$store.conditionals.select('ssg-icon', selected_icon);
open = false;
$dispatch('ssgchange');
}" aria-controls="docs-ssg-selector-other" aria-label="Custom" aria-selected="false" class="c-docs-ssg-selector__item" role="tab" x-init="$store.conditionals.registerValue('ssg', {'name': 'Custom', 'icon': '/documentation/static/ssgs/custom.svg'})" x-show="selected_name !== 'Custom'">
Custom
Great! We'll show you documentation relevant to . You can change this any time using the dropdown in the navigation bar.
How you configure inputs in CloudCannon has changed. We recommend updating, but the previous configuration will continue to work . There's now a consolidated key called _inputs
that encompasses our previous keys:
_options
_comments
_instance_values
_select_data
_structures
(renamed from _array_structures
)
Having the configuration keys at the top level forced you to redefine your input key multiple times, and spread the configuration for an input across multiple places. This proved to be progressively harder to maintain as you configured more inputs.
The _inputs
configuration flips the input and configuration keys from the previous convention, allowing you to define everything for an input in one place .
We've also introduced two new configuration settings, type
and label
. These let you choose which kind of input you want, and what label text is shown separately from the naming conventions.
YAML JSON TOML
anything :
_inputs :
anything :
type : markdown
label : Main Content
{
"anything" : null ,
"_inputs" : {
"anything" : {
"type" : "markdown" ,
"label" : "Main Content"
}
}
}
[ _inputs.anything ]
type = "markdown"
label = "Main Content"
It's often easier to just see the before and after. Here are some examples covering the previous and current configurations:
Now set with the comment
key.
YAML JSON TOML
brand_color : '#034ad8'
_comments :
brand_color : Use a bold color here
{
"brand_color" : "#034ad8" ,
"_comments" : {
"brand_color" : "Use a bold color here"
}
}
brand_color = "#034ad8"
[ _comments ]
brand_color = "Use a bold color here"
YAML JSON TOML
brand_color : '#034ad8'
_inputs :
brand_color :
comment : Use a bold color here
{
"brand_color" : "#034ad8" ,
"_inputs" : {
"brand_color" : {
"comment" : "Use a bold color here"
}
}
}
brand_color = "#034ad8"
[ _inputs.brand_color ]
comment = "Use a bold color here"
Now set with the options
key.
YAML JSON TOML
hero_image : /uploads/hero.png
_options :
hero_image :
width : 500
height : 600
{
"hero_image" : "/uploads/hero.png" ,
"_options" : {
"hero_image" : {
"width" : 500 ,
"height" : 600
}
}
}
hero_image = "/uploads/hero.png"
[ _options.hero_image ]
width = 500
height = 600
YAML JSON TOML
hero_image : /uploads/hero.png
_inputs :
hero_image :
options :
width : 500
height : 600
{
"hero_image" : "/uploads/hero.png" ,
"_inputs" : {
"hero_image" : {
"options" : {
"width" : 500 ,
"height" : 600
}
}
}
}
hero_image = "/uploads/hero.png"
[ _inputs.hero_image.options ]
width = 500
height = 600
Now set with the instance_value
key.
YAML JSON TOML
_instance_values :
_uuid : UUID
created_at : NOW
{
"_instance_values" : {
"_uuid" : "UUID" ,
"created_at" : "NOW"
}
}
[ _instance_values ]
_uuid = "UUID"
created_at = "NOW"
YAML JSON TOML
_inputs :
_uuid :
instance_value : UUID
created_at :
instance_value : NOW
{
"_inputs" : {
"_uuid" : {
"instance_value" : "UUID"
} ,
"created_at" : {
"instance_value" : "NOW"
}
}
}
[ _inputs._uuid ]
instance_value = "UUID"
[ _inputs.created_at ]
instance_value = "NOW"
There are no changes to _select_data
itself:
YAML JSON TOML
animal : Cow
_select_data :
animals :
- Cat
- Cow
{
"animal" : "Cow" ,
"_select_data" : {
"animals" : [
"Cat" ,
"Cow"
]
}
}
animal = "Cow"
[ _select_data ]
animals = [ "Cat" , "Cow" ]
You can now choose the select values (separately from the naming convention) for a select or multiselect input with values
. Either define the values directly:
YAML JSON TOML
animal : Cow
_inputs :
animal :
type : select
options :
values :
- Cat
- Cow
{
"animal" : "Cow" ,
"_inputs" : {
"animal" : {
"type" : "select" ,
"options" : {
"values" : [
"Cat" ,
"Cow"
]
}
}
}
}
animal = "Cow"
[ _inputs.animal ]
type = "select"
[ _inputs.animal.options ]
values = [ "Cat" , "Cow" ]
Or reference _select_data
defined anywhere in the configuration cascade :
YAML JSON TOML
animal : Cow
_inputs :
animal :
type : select
options :
values : _select_data.mammals
_select_data :
mammals :
- Cat
- Cow
{
"animal" : "Cow" ,
"_inputs" : {
"animal" : {
"type" : "select" ,
"options" : {
"values" : "_select_data.mammals"
}
}
} ,
"_select_data" : {
"mammals" : [
"Cat" ,
"Cow"
]
}
}
animal = "Cow"
[ _inputs.animal ]
type = "select"
[ _inputs.animal.options ]
values = "_select_data.mammals"
[ _select_data ]
mammals = [ "Cat" , "Cow" ]
Array Structures are now called Structures , and configured with _structures
instead of _array_structures
. Outside of this rename, there are no changes to the configuration itself:
YAML JSON TOML
gallery :
_structures :
gallery :
style : modal
values :
- label : Image
icon : image
value :
image : /uploads/placeholder.png
caption :
- label : External link
icon : link
value :
url :
title :
{
"gallery" : null ,
"_structures" : {
"gallery" : {
"style" : "modal" ,
"values" : [
{
"label" : "Image" ,
"icon" : "image" ,
"value" : {
"image" : "/uploads/placeholder.png" ,
"caption" : null
}
} ,
{
"label" : "External link" ,
"icon" : "link" ,
"value" : {
"url" : null ,
"title" : null
}
}
]
}
}
}
[ _structures.gallery ]
style = "modal"
[ [ _structures.gallery.values ] ]
label = "Image"
icon = "image"
[ _structures.gallery.values.value ]
image = "/uploads/placeholder.png"
[ [ _structures.gallery.values ] ]
label = "External link"
icon = "link"
[ _structures.gallery.values.value ]
You can now choose the structures (separately from the naming convention) for an array input with structures. Either define the values directly:
YAML JSON TOML
gallery :
_inputs :
gallery :
type : array
options :
structures :
style : modal
values :
- label : Image
icon : image
value :
image : /uploads/placeholder.png
caption :
- label : External link
icon : link
value :
url :
title :
{
"gallery" : null ,
"_inputs" : {
"gallery" : {
"type" : "array" ,
"options" : {
"structures" : {
"style" : "modal" ,
"values" : [
{
"label" : "Image" ,
"icon" : "image" ,
"value" : {
"image" : "/uploads/placeholder.png" ,
"caption" : null
}
} ,
{
"label" : "External link" ,
"icon" : "link" ,
"value" : {
"url" : null ,
"title" : null
}
}
]
}
}
}
}
}
[ _inputs.gallery ]
type = "array"
[ _inputs.gallery.options.structures ]
style = "modal"
[ [ _inputs.gallery.options.structures.values ] ]
label = "Image"
icon = "image"
[ _inputs.gallery.options.structures.values.value ]
image = "/uploads/placeholder.png"
[ [ _inputs.gallery.options.structures.values ] ]
label = "External link"
icon = "link"
[ _inputs.gallery.options.structures.values.value ]
Or reference _structures
defined anywhere in the configuration cascade :
YAML JSON TOML
gallery :
_inputs :
gallery :
type : array
options :
structures : _structures.media_items
_structures :
media_items :
style : modal
values :
- label : Image
icon : image
value :
image : /uploads/placeholder.png
caption :
- label : External link
icon : link
value :
url :
title :
{
"gallery" : null ,
"_inputs" : {
"gallery" : {
"type" : "array" ,
"options" : {
"structures" : "_structures.media_items"
}
}
} ,
"_structures" : {
"media_items" : {
"style" : "modal" ,
"values" : [
{
"label" : "Image" ,
"icon" : "image" ,
"value" : {
"image" : "/uploads/placeholder.png" ,
"caption" : null
}
} ,
{
"label" : "External link" ,
"icon" : "link" ,
"value" : {
"url" : null ,
"title" : null
}
}
]
}
}
}
[ _inputs.gallery ]
type = "array"
[ _inputs.gallery.options ]
structures = "_structures.media_items"
[ _structures.media_items ]
style = "modal"
[ [ _structures.media_items.values ] ]
label = "Image"
icon = "image"
[ _structures.media_items.values.value ]
image = "/uploads/placeholder.png"
[ [ _structures.media_items.values ] ]
label = "External link"
icon = "link"
[ _structures.media_items.values.value ]
The _inputs
configuration is set alongside the inputs in the examples above. You can set it anywhere in the configuration cascade , just as the previous keys allowed. The keys inside _inputs
entries are merged across the cascade, allowing you to overwrite or combine more specific configurations (e.g. setting comments globally and options per file).
_select_data
and _structures
are defined in the configuration cascade as well, so you can set them with or separately to _inputs
.
Color inputs have new format
and alpha
options, falling back to the naming convention if these options are not set.
Hiding inputs is now set with hidden
in an _inputs
entry rather than an option, since it's available for any input type. This key also supports a string where the input is hidden based on the value of another input. This can start with a !
to reverse the value.
Object structures are now supported . These allow you to configure objects between an empty state (null
) and a selection of object formats. Useful if you have components with a limited number of sub-components.
Two new inputs: Range number input and a Switch boolean input . These are only available with the new inputs config. More input types coming soon, contact support if you have specific requests.
Comments now support a limited set of Markdown: links, bold, italic, subscript, superscript and inline code elements are allowed. Links in this block also support Editor Links .