Tabs (tabs
)
Defines the map of options for Platen’s tabs markup. The existing value is a map that includes whether or not to enable the codeblock render hook and the style definition for it.
When this markup is enabled, you can create tabbed content on a page with a codeblock.
Note that Platen is migrating from the legacy template to a new template that uses Shoelace to add a more customizable and extensible element to your site.
The legacy template has a more limited set of options than the new default template and it will eventually be
removed. We strongly recommend you set use_legacy
to false
and migrate your site’s custom styling
and scripting to use the new template.
For now, Platen defaults to using the legacy template but warns you that the legacy template will eventually be
removed. You can silence this warning by setting warn_on_legacy
to false
.
You can add new keys or replace the values for existing ones. You don’t need to keep the full list of all properties in your own configuration file. Only specify the values you want to add or replace.
JSON Schema
Definition
{
"$id": "https://platen.io/modules/platen/config/site/markup/tabs/schema.json",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"description": "Defines the options for Platen's tabs markup\n\nhttps://platen.io/modules/platen/config/site/markup/tabs/",
"properties": {
"activation": {
"default": "auto",
"description": "Specify whether tabs should be automatically shown on navigation or require manual activation to show.\n\nhttps://platen.io/modules/platen/config/site/markup/tabs/#activation",
"enum": [
"auto",
"manual"
],
"title": "Default Activation Mode",
"type": "string"
},
"aliases": {
"description": "Defines additional language IDs for the codeblock render hook.\n\nhttps://platen.io/modules/platen/config/site/markup/tabs/#aliases",
"oneOf": [
{
"items": {
"oneOf": [
{
"description": "A map defining either/both an alias for the grouping and entry codeblock language ID.\n\nhttps://platen.io/modules/platen/config/site/markup/tabs/",
"properties": {
"entry": {
"description": "Alias for the nested codeblock language ID, (default is 'tab').\n\nhttps://platen.io/modules/platen/config/site/markup/tabs/#entry",
"title": "Entry Alias",
"type": "string"
},
"group": {
"description": "Alias for the top-level codeblock language ID, (default is 'tabs').\n\nhttps://platen.io/modules/platen/config/site/markup/tabs/#group",
"title": "Group Alias",
"type": "string"
}
},
"type": "object"
},
{
"type": "string"
}
]
},
"type": "array"
},
{
"description": "A map defining either/both an alias for the grouping and entry codeblock language ID.\n\nhttps://platen.io/modules/platen/config/site/markup/tabs/",
"properties": {
"entry": {
"description": "Alias for the nested codeblock language ID, (default is 'tab').\n\nhttps://platen.io/modules/platen/config/site/markup/tabs/#entry",
"title": "Entry Alias",
"type": "string"
},
"group": {
"description": "Alias for the top-level codeblock language ID, (default is 'tabs').\n\nhttps://platen.io/modules/platen/config/site/markup/tabs/#group",
"title": "Group Alias",
"type": "string"
}
},
"type": "object"
},
{
"type": "string"
}
],
"title": "Aliases"
},
"classes": {
"default": [],
"description": "Add classes to tabs containers unless overridden in the markup.\n\nhttps://platen.io/modules/platen/config/site/markup/tabs/#classes",
"items": {
"type": "string"
},
"title": "Default Classes",
"type": "array"
},
"custom": {
"default": false,
"description": "Choose whether tabs rendering uses a custom template.\n\nhttps://platen.io/modules/platen/config/site/markup/tabs/#custom",
"oneOf": [
{
"type": "boolean"
},
{
"type": "string"
}
],
"title": "Use Custom Rendering Template"
},
"enabled": {
"default": true,
"description": "Choose whether tabs codeblock rendering is available for the site.\n\nhttps://platen.io/modules/platen/config/site/markup/tabs/#enabled",
"title": "Enable the markup",
"type": "boolean"
},
"no_scroll_controls": {
"default": false,
"description": "Specify whether tab groups should display arrows when the tabs overflow.\n\nhttps://platen.io/modules/platen/config/site/markup/tabs/#no_scroll_controls",
"title": "Disable Scroll Controls for Tab Groups",
"type": "boolean"
},
"partials": {
"description": "Define a map of partials for Platen to inject as needed.\n\nhttps://platen.io/modules/platen/config/site/markup/tabs/#partials",
"properties": {
"renderers": {
"description": "Registers one or more partials that act as render hooks.\n\nhttps://platen.io/modules/platen/config/site/markup/tabs/#renderers",
"properties": {
"codeblock": {
"default": "platen/markup/tabs/codeblock",
"description": "Adds a partial to call when processing the codeblock render hook.\n\nhttps://platen.io/modules/platen/config/site/markup/tabs/#codeblock",
"title": "Codeblock Render Hook Partial",
"type": "string"
}
},
"title": "Renderer Partials",
"type": "object"
}
},
"title": "Markup Partials",
"type": "object"
},
"placement": {
"default": "top",
"description": "Specify where the tabs should be rendered relative to their content.\n\nhttps://platen.io/modules/platen/config/site/markup/tabs/#placement",
"enum": [
"top",
"bottom",
"start",
"end"
],
"title": "Default Tabs Placement",
"type": "string"
},
"preset": {
"description": "Specify the dot-path to a preset to use as the default for this markup.\n\nhttps://platen.io/modules/platen/config/site/markup/tabs/#preset",
"title": "Default Preset",
"type": "string"
},
"standardize_height": {
"default": false,
"description": "Specify whether the tabs in a group should be rendered with the same height as the tallest tab panel.\n\nhttps://platen.io/modules/platen/config/site/markup/tabs/#standardize_height",
"title": "Standardize Tab Heights",
"type": "boolean"
},
"style": {
"default": "tabs",
"description": "Defines the art markup's simple style module\n\nhttps://platen.io/modules/platen/config/site/markup/tabs/#style",
"title": "Markup Simple Style Module",
"type": "string"
},
"use_legacy": {
"default": true,
"description": "Set whether rendered tabs use the legacy template by default.\n\nhttps://platen.io/modules/platen/config/site/markup/tabs/#use_legacy",
"title": "Use Legacy Template",
"type": "boolean"
},
"warn_on_legacy": {
"default": true,
"description": "Set whether Platen warns when you use the legacy template.\n\nhttps://platen.io/modules/platen/config/site/markup/tabs/#warn_on_legacy",
"title": "Warn When Using the Legacy Template",
"type": "boolean"
}
},
"title": "Tabs",
"type": "object"
}
Enable the markup (enabled
)
Choose whether the site renders codeblocks with the tabs
language ID as a group of tabs.
If this setting is set to true
, content inside the codeblock is added inside a <div>
that renders child divs as tabs. If this setting is false
, the content is rendered as an
unhighlighted codeblock.
Aliases (aliases
)
Define one or more language IDs to use in addition to the default language IDs for
codeblocks that render their content in a group of divs as tabs. The default for the
top-level codeblock for the column group is tabs
. The default for the nested codeblock
defining a single column is tab
.
You can specify a string, a map, or an array of strings or maps for this value. If the value is an array, each item in the array is added as an alias.
String values are added as valid language IDs for the top-level codeblock in addition to
tabs
.
Map values must have either the group
or entry
key with a string value. If you
define a value for group
, it becomes a valid language ID for the top-level codeblock. If
you define a value for entry
, it becomes a valid language ID for the nested codeblock. You
can specify both in a single map but don’t have to.
Use Custom Rendering Template (custom
)
Choose whether tabs are rendered with a custom template. The default value is false
. When this value is
true
, Platen uses the platen/markup/tabs/templates/custom/group.html
partial template for rendering the
tabs container and tab.html
in the same folder for rendering individual tabs. When this value is a string,
Platen uses that value as the name of the folder in the platen/markup/tabs/templates
folder to look for the
group.html
and tabs.html
partial templates.
If a tabs markup defines the custom
option, the value defined on the markup overrides this setting.
For more information, see Custom Templates.
Default Classes (classes
)
You can add any number of classes to rendered tabs containers by default. Specify one or more strings as items
in an array. They’re inserted for all tabs containers as if they had been specified with the class
attribute or option in the markup.
If the attribute or option are specified for a tab group, those values override the list defined by this setting.
Default Activation Mode (activation
)
You can define a default activation mode for a tab group. When the tab group is focused, keyboard users can press the kbd:Left and kbd:Right keys to select the desired tab.
When the value of this option is auto
, the selected tab is shown immediately.
To require the user to press kbd:Space or kbd:Enter to show the tab, set this value to manual
.
If the activation
option is specified for a tab group in the markup, that value override this setting.
Disable Scroll Controls for Tab Groups (no_scroll_controls
)
Specify whether the scroll arrows should be visible when tabs overflow. Set this value to true
to disable the
scroll arrows.
If the no_scroll_controls
option is specified for a tab group in the markup, that value override this
setting.
Default Tabs Placement (placement
)
Specify where the tabs should be rendered relative to their content. When the placement is top
or bottom
and the tabs overflow the available horizontal width, they can be scrolled. You can disable the scroll arrows
displayed when the tabs overflow by setting no_scroll_controls
in your site settings or in the
options for a tab group.
If the placement
option is specified for a tab group in the markup, that value override this setting.
Standardize Tab Heights (standardize_height
)
Specify whether the tabs in every group should be rendered with the same height as the tallest tab panel in the
group. This can help to reduce how much the page’s layout updates when a reader switches between tabs in a
group. Set this value to true
to standardize the height of the tabs.
If the standardize_height
option is specified for a tab group in the markup, that value overrides this
setting.
Default Preset (preset
)
You can define any number of preset tab groups and tabs reusably in your site’s data. Any YAML files you add in
the data/platen/tabs
folder are available for use. You can use folders to group presets together. For more
information about presets, see Presets in the reference documentation for the markup.
Use Legacy Template (use_legacy
)
Use this setting to configure whether Platen uses the legacy template for tabs markup. The default
value is true
. Set this value to false
to use the new template by default.
The legacy template has a more limited set of options than the new default template and it will eventually
be removed. We strongly recommend you set this value to true
and migrate your site’s custom styling and
scripting to use the new template.
If you use the legacy
option for tabs markup in your content, this value is overriden by that
option.
For more information, see Legacy Template in the reference documentation for this markup.
Warn When Using the Legacy Template (warn_on_legacy
)
Use this setting to configure whether Platen raises a warning when you use a legacy template for your
tabs markup. Set this value to false
to disable the warning. The default value is true
.
The legacy template has a more limited set of options than the new default template and it will eventually be
removed. We strongly recommend you set use_legacy
to false
and migrate your site’s custom
styling and scripting to use the new template.
For more information, see Legacy Template in the reference documentation for this markup.
Markup Partials (partials
)
Define a map of partials for Platen to inject as needed. These partials are only
injected when enabled
is set to true
.
Renderer Partials (renderers
)
Defines a map of partials to use as Markdown render hooks. Like all partials, these are
only processed when enabled
is set to true
.
Supported renderer partials include:
codeblock
, processed for fenced code blocks with a language IDheading
, processed for headingsimage
, processed for image linkslink
, processed for non-image links
In all cases, all renderer partials for enabled features and markup options are checked one after the other unless they return a render string. Only the first applicable partial that returns a render string is processed and rendered.
Codeblock Render Hook Partial (codeblock
)
Adds support for rendering codeblocks as tabs in Platen. This render hook is only
called if the language ID for the codeblock (i.e. ```languageID
) is
tabs
. If a codeblock does include the language ID, the renderer looks for any
nested codeblocks with the tab
language ID to render as tabs in a shared
group.
For more information about using the codeblock to add tabbed content, see the reference documentation.
This value defaults to platen/markup/tabs/codeblock
. You can replace it with a
different value and defining a new partial, or override the existing partial by
creating the file layouts/partials/platen/markup/tabs/codeblock.html
in your
own site or module.
For more information about defining codeblock render hook partials, see Defining a Codeblock Render Hook Partial in the Theme Guide.
Markup Simple Style Module (style
)
Defines default styling for tabs created by the codeblock.
When you use the tabs
codeblock, the following SCSS is applied:
.markdown .platen-tabs {
margin-top: $padding-large;
margin-bottom: $padding-large;
border: $padding-minimal solid var(--gray-200);
border-radius: $border-radius;
overflow: hidden;
display: flex;
flex-wrap: wrap;
label {
display: inline-block;
padding: $padding-medium $padding-large;
border-bottom: $padding-minimal transparent;
cursor: pointer;
}
.platen-tabs-content {
order: 999; //Move content blocks to the end
width: 100%;
border-top: $padding-minimal solid var(--gray-100);
padding: $padding-large;
display: none;
}
input[type="radio"]:checked + label {
border-bottom: $padding-minimal solid var(--color-link);
}
input[type="radio"]:checked + label + .platen-tabs-content {
display: block;
}
input[type="radio"]:focus + label {
@include outline;
}
}
When you use the tabs codeblock, the content is placed in a div
container with the
platen-tabs
class. Each tab uses a radio input with its label used as the
selectable tab. Each tab’s content is placed in a div with the platen-tabs-content
and
markdown-inner
classes.
Tab Container #
margin-top: $padding-large;
margin-bottom: $padding-large;
border: $padding-minimal solid var(--gray-200);
border-radius: $border-radius;
overflow: hidden;
display: flex;
flex-wrap: wrap;
The container is uses $padding-large
to set the vertical margins. It adds a solid
border with the width set to $padding-minimal
, the border radius to
[sref:theme.variables.light_css.color-link
], and the color to
theme.variables.light_css.gray-200
or theme.variables.light_css.gray-200
depending on the value of the theme.config.mode
setting.
Is sets the overflow
attribute to hidden, which keeps any content that doesn’t fit
the container from displaying.
It uses flex box to display the tabs and their labels and uses flex-wrap
.
Tab Labels #
label {
display: inline-block;
padding: $padding-medium $padding-large;
border-bottom: $padding-minimal transparent;
cursor: pointer;
}
input[type="radio"]:checked + label {
border-bottom: $padding-minimal solid var(--color-link);
}
input[type="radio"]:focus + label {
@include outline;
}
The labels are added as inline blocks, allowing them to display side-by-side. They’re use
the value of $padding-medium
for the vertical padding
and $padding-large
for the horizontal padding.
They get a transparent bottom border with the width set to $padding-minimal
and have their cursor always display as a normal pointer.
When the input for a label is checked, the label’s border color switches from being
transparent to the value of [sref:theme.variables.light_css.color-link
] or
[sref:theme.variables.light_css.color-link
] depending on the theme.config.mode
.
When the input for a label is focused, the label uses the theme.styles.utils.outline
mixin to add a full box outline to the label.
Tab Content #
.platen-tabs-content {
order: 999; //Move content blocks to the end
width: 100%;
border-top: $padding-minimal solid var(--gray-100);
padding: $padding-large;
display: none;
}
input[type="radio"]:checked + label + .platen-tabs-content {
display: block;
}
The tabs are all set to have an order
of 999, putting them together at the end of
the flex box. They’re set to have a width of 100% of their container and given a solid top
border with a width of $padding-minimal
and their color set to either
theme.variables.light_css.gray-200
or theme.variables.dark_css.gray-200
depending on the theme.config.mode
. Their padding is set to
$padding-large
.
Finally, their display is set to none
so they’re hidden until selected. When a tab is
selected, the display is changed block
, making it visible.
Overriding #
You can overwrite this definition for your own site or theme by creating the file
styles/markup/_tabs.scss
in your assets folder, which defaults to assets
in your
project root.
You can also create a new style module in the styles/markup
folder and set this value to
that module’s name. If you do, omit the leading _
and trailing .scss
. For example, the
name for the style module assets/styles/markup/_foo.scss
is foo
.
Note that if you override the style module or this setting,you entirely overwrite the default from the theme.
For more information on authoring SCSS, see the learning guide.