Customization
Table of contents
- Color schemes
- Custom schemes
- Override and define new variables
- Override and completely custom styles
- Override includes
- Custom layouts and includes
Color schemes
New
Just the HM Docs supports two color schemes: light (default), and dark.
To enable a color scheme, set the color_scheme
parameter in your site’s _config.yml
file:
Example
# Color scheme supports "light" (default) and "dark"
color_scheme: dark
Custom schemes
Define a custom scheme
You can add custom schemes. If you want to add a scheme named foo
(can be any name) just add a file _sass/color_schemes/foo.scss
(replace foo
by your scheme name) where you override theme variables to change colors, fonts, spacing, etc.
Since the default color scheme is light
, your custom scheme is implicitly based on the variable settings used by the light
scheme.
If you want your custom scheme to be based on the dark
scheme, you need to start your file with the following line:
@import "./color_schemes/dark";
You can define custom schemes based on other custom schemes in the same way.
Available variables are listed in the _variables.scss file.
For example, to change the link color from the purple default to blue, include the following inside your scheme file:
Example
$link-color: $blue-000;
Keep in mind that changing a variable will not automatically change the value of other variables that depend on it. For example, the default link color ($link-color
) is set to $purple-000
. However, redefining $purple-000
in a custom color scheme will not automatically change $link-color
to match it. Instead, each variable that relies on previously-cascaded values must be manually reimplemented by copying the dependent rules from _variables.scss
— in this case, rewriting $link-color: $purple-000;
.
Note: Editing the variables directly in _sass/support/variables.scss
is not recommended and can cause other dependencies to fail. Please use scheme files.
Use a custom scheme
To use the custom color scheme, only set the color_scheme
parameter in your site’s _config.yml
file:
color_scheme: foo
Switchable custom scheme
If you want to be able to change the scheme dynamically, for example via javascript, just add a file assets/css/just-the-hm-docs-foo.scss
(replace foo
by your scheme name) with the following content:
---
---
{% include css/just-the-docs.scss.liquid color_scheme="foo" %}
This allows you to switch the scheme via the following javascript.
jtd.setTheme("foo")
Override and define new variables
New (v0.4.0)
To define new SCSS variables, functions, or override existing theme variables, place SCSS code in _sass/custom/setup.scss
. This should not be used for defining custom styles (see the next section).
This is most commonly-used to define custom callout colors. For example,
// _sass/custom/setup.scss
$pink-000: #f77ef1;
$pink-100: #f967f1;
$pink-200: #e94ee1;
$pink-300: #dd2cd4;
In particular: this file is imported after the theme’s variables and functions are defined, but before any CSS classes are emitted.
Override and completely custom styles
For styles that aren’t defined as SCSS variables, you may want to modify specific CSS classes. Additionally, you may want to add completely custom CSS specific to your content. To do this, put your styles in the file _sass/custom/custom.scss
. This will allow for all overrides to be kept in a single file, and for any upstream changes to still be applied.
For example, if you’d like to add your own styles for printing a page, you could add the following styles.
Example
// Print-only styles.
@media print {
.side-bar,
.page-header {
display: none;
}
.main-content {
max-width: auto;
margin: 1em;
}
}
Override includes
You can customize the theme by overriding any of the custom Jekyll includes files that it provides.
To do this, create an _includes
directory and make a copy of the specific file you wish to modify. The content in this file will override the theme defaults. You can learn more about this process in the Jekyll docs for Overriding theme defaults.
Just the HM Docs provides the following custom includes files:
Custom TOC Heading
_includes/toc_heading_custom.html
If the page has any child pages, and has_toc
is not set to false
, this content appears as a heading above the auto-generating list of child pages after the page’s content.
Example
To change the default TOC heading to “Contents”, create _includes/toc_heading_custom.html
and add:
<h2 class="text-delta">Contents</h2>
The (optional) text-delta
class makes the heading appear as Contents .
Custom Footer
_includes/footer_custom.html
This content appears at the bottom of every page’s main content. More info for this include can be found in the Configuration - Footer content.
Custom Head
_includes/head_custom.html
Any HTML added to this file will be inserted before the closing <head>
tag. This might include additional <meta>
, <link>
, or <script>
tags.
The <head>
tag automatically includes a link to an existing favicon if you set favicon_ico
to the corresponding path in your configuration, or if the path to the favicon is /favicon.ico
.
Custom Header
_includes/header_custom.html
Content added to this file appears at the top of every page’s main content between the site search and auxiliary links if they are enabled. If search_enabled
were set to false and aux_links
were removed, the content of header_custom.html
would occupy the space at the top of every page.
Custom Nav Footer
_includes/nav_footer_custom.html
Any content added to this file will appear at the bottom left of the page below the site’s navigation. By default an attribution to Just the HM Docs is displayed which reads, This site uses Just the HM Docs, a documentation theme for Jekyll.
.
Custom Search Placeholder
_includes/search_placeholder_custom.html
Content added to this file will replace the default placeholder text in the search bar (and its aria-label
), after stripping HTML and leading/trailing whitespace. By default, the content of the include is:
Search {{site.title}}
Override this file to render a custom placeholder. One common use-case is internationalization; for example,
Chercher notre site
would make the placeholder text “Chercher notre site”. Liquid code (including Jekyll variables) is also supported.
Custom layouts and includes
New (v0.4.0)
Advanced
Just the HM Docs uses Jekyll’s powerful layouts and includes features to generate and compose various elements of the site. Jekyll users and developers can extend or replace existing layouts and includes to customize the entire site layout.
Default layout and includable components
The default
layout is inherited by most of the “out-of-the-box” pages provided by Just the HM Docs. It composes various re-usable components of the site, including the sidebar, navbar, footer, breadcrumbs, and various imports. Most users who create new pages or layouts will inherit from default
.
Here is a simplified code example of what it looks like:
<!-- a simplified version of _layouts/default.html -->
<html>
{% include head.html %}
<body>
{% include icons/icons.html %}
{% include components/sidebar.html %}
{% include components/header.html %}
{% include components/breadcrumbs.html %}
{% if site.heading_anchors != false %}
{% include vendor/anchor_headings.html html=content ... %}
{% else %}
{{ content }}
{% endif %}
{% if page.has_children == true and page.has_toc != false %}
{% include components/children_nav.html %}
{% endif %}
{% include components/footer.html %}
{% if site.search_enabled != false %}
{% include components/search_footer.html %}
{% endif %}
{% if site.mermaid %}
{% include components/mermaid.html %}
{% endif %}
</body>
</html>
Component summary
Defining a new _includes
with the same name as any of these components will significantly change the existing layout. Please proceed with caution when adjusting them.
To briefly summarize each component:
_includes/head.html
is the entire<head>
tag for the site; this imports stylesheets, various JavaScript files (ex: analytics, mermaid, search, and Just the HM Docs code), and SEO / meta information._includes/icons/icons.html
imports all SVG icons that are used throughout the site. Some, such as those relating to search or code snippet copying, are only loaded when those features are enabled._includes/components/sidebar.html
renders the sidebar, containing the site header, navigation links, external links, collections, and nav footer._includes/components/header.html
renders the navigation header, containing the search bar, custom header, and aux links_includes/components/breadcrumbs.html
renders the breadcrumbs featurevendor/anchor_headings.html
is a local copy of Vladimir Jimenez’s jekyll-anchor-headings snippet_includes/components/children_nav.html
renders a list of nav links to child pages on parent pages_includes/components/footer.html
renders the bottom-of-page footer_includes/components/search_footer.html
renders DOM elements that are necessary for the search bar to work_includes/components/mermaid.html
initializes mermaid if the feature is enabled
Each of these components can be overridden individually using the same process described in the Override includes section. In particular, the granularity of components should allow users to replace certain components (such as the sidebar) without having to adjust the rest of the code.
Future versions may subdivide components further; we guarantee that we will only place them in folders (ex components/
, icons/
, or a new js/
) to avoid top-level namespace collisions.
Alternative layouts and example (minimal
)
Users can develop custom layouts that compose, omit, or add components differently. We provide one first-class example titled minimal
, inspired by Kevin Lin’s work in just-the-class. This minimal
layout does not render the sidebar, header, or search. To see an example, visit the minimal layout test page.
Here is a simplified code example of what it looks like:
<!-- a simplified version of _layouts/minimal.html -->
<html>
{% include head.html %}
<body>
{% include icons/icons.html %}
{% comment %} Bandaid fix for breadcrumbs here! {% endcomment %}
{% include components/breadcrumbs.html %}
{% if site.heading_anchors != false %}
{% include vendor/anchor_headings.html html=content ... %}
{% else %}
{{ content }}
{% endif %}
{% if page.has_children == true and page.has_toc != false %}
{% include components/children_nav.html %}
{% endif %}
{% include components/footer.html %}
{% if site.mermaid %}
{% include components/mermaid.html %}
{% endif %}
</body>
</html>
This layout is packaged in Just the HM Docs. Users can indicate this alternative layout in page front matter:
---
layout: minimal
title: Minimal layout test
---
Similarly, users and developers can create other alternative layouts using Just the HM Docs’ reusable includable components.
Default layout and inheritance chain
Under the hood,
default
andminimal
inherit from thetable_wrappers
layout, which wraps all HTML<table>
tags with adiv .table-wrapper
table_wrappers
inherits fromvendor/compress
, which is a local copy of Anatol Broder’s jekyll-compress-html Jekyll plugin
Note that as of now, minimal
and default
have no inheritance relationship.
Overridden default Jekyll layouts
By default, Jekyll (and its default theme minima
) provide the about
, home
, page
, and post
layouts. In Just the HM Docs, we override all of these layouts with the default
layout. Each of those layouts is simply:
---
layout: default
---
{{ content }}
Defining a default layout
To properly load a layout template with all of its includes and styles, you must define which layout you wish to use. Just the HM Docs does this by defining the layout in page front matter, as shown above. If you wish to set a default layout and not explicitly state the layout in each template, you must add the following Front Matter defaults to your _config.yml
file:
defaults:
-
scope:
path: "" # an empty string here means all files in the project
values:
layout: "default"