-
+ {%- for child in entry.children %}{{ renderNavListItem(child) }}{% endfor -%}
+
-
+ {%- for entry in navPages %}{{ renderNavListItem(entry) }}{%- endfor -%}
+
-## How-to guides
+## Getting started
- * [Set up backups with borgmatic](https://torsion.org/borgmatic/docs/how-to/set-up-backups/) ⬅ *Start here!*
- * [Make per-application backups](https://torsion.org/borgmatic/docs/how-to/make-per-application-backups/)
- * [Make backups redundant](https://torsion.org/borgmatic/docs/how-to/make-backups-redundant/)
- * [Deal with very large backups](https://torsion.org/borgmatic/docs/how-to/deal-with-very-large-backups/)
- * [Inspect your backups](https://torsion.org/borgmatic/docs/how-to/inspect-your-backups/)
- * [Monitor your backups](https://torsion.org/borgmatic/docs/how-to/monitor-your-backups/)
- * [Extract a backup](https://torsion.org/borgmatic/docs/how-to/extract-a-backup/)
- * [Backup your databases](https://torsion.org/borgmatic/docs/how-to/backup-your-databases/)
- * [Add preparation and cleanup steps to backups](https://torsion.org/borgmatic/docs/how-to/add-preparation-and-cleanup-steps-to-backups/)
- * [Backup to a removable drive or an intermittent server](https://torsion.org/borgmatic/docs/how-to/backup-to-a-removable-drive-or-an-intermittent-server/)
- * [Upgrade borgmatic](https://torsion.org/borgmatic/docs/how-to/upgrade/)
- * [Develop on borgmatic](https://torsion.org/borgmatic/docs/how-to/develop-on-borgmatic/)
+Your first step is to [install and configure
+borgmatic](https://torsion.org/borgmatic/docs/how-to/set-up-backups/).
-
-## Reference guides
-
- * [borgmatic configuration reference](https://torsion.org/borgmatic/docs/reference/configuration/)
- * [borgmatic command-line reference](https://torsion.org/borgmatic/docs/reference/command-line/)
+For additional documentation, check out the links above for borgmatic how-to and
+reference guides.
## Hosting providers
diff --git a/docs/Dockerfile b/docs/Dockerfile
index 42bfade2..56857ed6 100644
--- a/docs/Dockerfile
+++ b/docs/Dockerfile
@@ -16,6 +16,7 @@ WORKDIR /source
RUN npm install @11ty/eleventy \
@11ty/eleventy-plugin-syntaxhighlight \
@11ty/eleventy-plugin-inclusive-language \
+ @11ty/eleventy-navigation \
markdown-it \
markdown-it-anchor \
markdown-it-replace-link
diff --git a/docs/_includes/components/lists.css b/docs/_includes/components/lists.css
index 202e711a..d8bdc997 100644
--- a/docs/_includes/components/lists.css
+++ b/docs/_includes/components/lists.css
@@ -1,8 +1,7 @@
/* Buzzwords */
@keyframes rainbow {
0% { background-position: 0% 50%; }
- 50% { background-position: 100% 50%; }
- 100% { background-position: 0% 50%; }
+ 100% { background-position: 100% 50%; }
}
.buzzword-list,
.inlinelist {
@@ -25,6 +24,7 @@
margin: 4px 4px 4px 0;
transition: .15s linear outline;
}
+
.inlinelist .inlinelist-item.active {
background-color: #222;
color: #fff;
@@ -36,6 +36,38 @@
}
.inlinelist .inlinelist-item code {
background-color: transparent;
+ font-size: 80%;
+ margin-left: 6px;
+ padding-left: 6px;
+ display: inline-block;
+ position: relative;
+}
+@media (max-width: 26.8125em) { /* 429px */
+ .inlinelist .inlinelist-item {
+ overflow: hidden;
+ }
+ .inlinelist .inlinelist-item code {
+ float: right;
+ line-height: 1.75;
+ }
+}
+@media (min-width: 26.875em) { /* 430px */
+ .inlinelist .inlinelist-item code {
+ float: none;
+ }
+ .inlinelist .inlinelist-item code:before {
+ content: " ";
+ border-left: 1px solid rgba(255,255,255,.8);
+ position: absolute;
+ left: -2px;
+ top: -2px;
+ bottom: 2px;
+ }
+ @media (prefers-color-scheme: dark) {
+ .inlinelist .inlinelist-item code:before {
+ border-left-color: rgba(0,0,0,.8);
+ }
+ }
}
a.buzzword {
text-decoration: underline;
@@ -59,44 +91,74 @@ a.buzzword {
.buzzword {
background-color: #f7f7f7;
}
+@media (prefers-color-scheme: dark) {
+ .buzzword-list li,
+ .buzzword {
+ background-color: #080808;
+ }
+}
.inlinelist .inlinelist-item {
background-color: #e9e9e9;
}
+@media (prefers-color-scheme: dark) {
+ .inlinelist .inlinelist-item {
+ background-color: #000;
+ }
+ .inlinelist .inlinelist-item a {
+ color: #fff;
+ }
+ .inlinelist .inlinelist-item code {
+ color: inherit;
+ }
+}
.inlinelist .inlinelist-item:hover,
.inlinelist .inlinelist-item:focus,
.buzzword-list li:hover,
.buzzword-list li:focus,
.buzzword:hover,
-.buzzword:focus {
+.buzzword:focus,
+.rainbow-active:hover,
+.rainbow-active:focus {
position: relative;
background-image: linear-gradient(238deg, #ff0000, #ff8000, #ffff00, #80ff00, #00ff00, #00ff80, #00ffff, #0080ff, #0000ff, #8000ff, #ff0080);
background-size: 1200% 1200%;
+ background-position: 2% 80%;
color: #fff;
text-shadow: 0 0 2px rgba(0,0,0,.9);
- animation: rainbow 1.6s infinite;
+ animation: rainbow 4s ease-out alternate infinite;
+}
+.rainbow-active-noanim {
+ animation: none !important;
}
.inlinelist .inlinelist-item:hover a,
.inlinelist .inlinelist-item:focus a,
.buzzword-list li:hover a,
.buzzword-list li:focus a,
a.buzzword:hover,
-a.buzzword:focus {
+a.buzzword:focus,
+a.rainbow-active:hover,
+a.rainbow-active:focus {
color: #fff;
text-decoration: none;
}
-/*
-I wish there were a PE friendly way to do this but media queries don’t work work with @supports
-@media (prefers-reduced-motion: no-preference) {
+@media (prefers-reduced-motion: reduce) {
+ .inlinelist .inlinelist-item:hover,
+ .inlinelist .inlinelist-item:focus,
+ .buzzword-list li:hover,
+ .buzzword-list li:focus,
.buzzword:hover,
- .buzzword:focus {
- animation: rainbow 1s infinite;
+ .buzzword:focus,
+ .rainbow-active:hover,
+ .rainbow-active:focus {
+ animation: none;
}
-}*/
+}
+
.buzzword-list li:hover:after,
.buzzword-list li:focus:after,
.buzzword:hover:after,
.buzzword:focus:after {
- font-family: system-ui, sans-serif;
+ font-family: system-ui, -apple-system, sans-serif;
content: "Buzzword alert!!!";
position: absolute;
left: 0;
@@ -123,4 +185,94 @@ main h2 a.buzzword,
main h3 a.buzzword,
main p a.buzzword {
text-decoration: underline;
-}
\ No newline at end of file
+}
+
+/* Small viewport */
+@media (max-width: 26.8125em) { /* 429px */
+ .inlinelist .inlinelist-item {
+ display: block;
+ width: auto;
+ padding: 0;
+ line-height: 1.4;
+ }
+ .inlinelist .inlinelist-item > a {
+ display: block;
+ padding: .2em .5em;
+ }
+}
+@media (min-width: 26.875em) { /* 430px */
+ .inlinelist .inlinelist-item > a {
+ display: inline-block;
+ white-space: nowrap;
+ }
+}
+
+.numberflag {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ background-color: #dff7ff;
+ border-radius: 50%;
+ width: 1.75em;
+ height: 1.75em;
+ font-weight: 600;
+}
+@media (prefers-color-scheme: dark) {
+ .numberflag {
+ background-color: #00bcd4;
+ color: #222;
+ }
+}
+h1 .numberflag,
+h2 .numberflag,
+h3 .numberflag,
+h4 .numberflag,
+h5 .numberflag {
+ width: 1.25em;
+ height: 1.25em;
+}
+h2 .numberflag {
+ position: relative;
+ margin-right: 0.25em; /* 10px /40 */
+}
+h2 .numberflag:after {
+ content: " ";
+ position: absolute;
+ bottom: -1px;
+ left: 0;
+ height: 1px;
+ background-color: #fff;
+ width: calc(100% + 0.4em); /* 16px /40 */
+}
+@media (prefers-color-scheme: dark) {
+ h2 .numberflag:after {
+ background-color: #222;
+ }
+}
+
+/* Super featured list on home page */
+.list-superfeatured .avatar {
+ width: calc(30px + 5vw);
+ height: calc(30px + 5vw);
+ max-width: 60px;
+ max-height: 60px;
+ margin-left: 0;
+}
+@media (max-width: 26.8125em) { /* 429px */
+ .list-superfeatured .inlinelist-item > a {
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+}
+@media (min-width: 26.875em) { /* 430px */
+ .list-superfeatured .inlinelist-item {
+ font-size: 110%;
+ }
+}
+
+/* Only top level */
+.inlinelist-no-nest ul,
+.inlinelist-no-nest ol {
+ display: none;
+}
diff --git a/docs/_includes/components/minilink.css b/docs/_includes/components/minilink.css
index 916a4de0..395b3b95 100644
--- a/docs/_includes/components/minilink.css
+++ b/docs/_includes/components/minilink.css
@@ -10,7 +10,20 @@
font-weight: 500;
margin: 0 0.4285714285714em 0.07142857142857em 0; /* 0 6px 1px 0 /14 */
line-height: 1.285714285714; /* 18px /14 */
- font-family: system-ui, sans-serif;
+ font-family: system-ui, -apple-system, sans-serif;
+}
+@media (prefers-color-scheme: dark) {
+ .minilink {
+ background-color: #222;
+ /*
+ !important to override .elv-callout a
+ see _includes/components/callout.css
+ */
+ color: #fff !important;
+ }
+}
+table .minilink {
+ margin-top: 6px;
}
.minilink[href] {
box-shadow: 0 1px 1px 0 rgba(0,0,0,.5);
@@ -19,6 +32,12 @@
.minilink[href]:focus {
background-color: #bbb;
}
+@media (prefers-color-scheme: dark) {
+ .minilink[href]:hover,
+ .minilink[href]:focus {
+ background-color: #444;
+ }
+}
pre + .minilink {
color: #fff;
border-radius: 0 0 0.2857142857143em 0.2857142857143em; /* 4px /14 */
@@ -35,6 +54,54 @@ p.minilink {
margin-left: 2em;
margin-bottom: 2em;
}
+h1 .minilink,
+h2 .minilink,
+h3 .minilink,
+h4 .minilink {
+ font-size: 0.9375rem; /* 15px /16 */
+ vertical-align: middle;
+ margin-left: 1em;
+}
+h3 .minilink,
+h4 .minilink {
+ font-size: 0.8125rem; /* 13px /16 */
+}
.minilink + pre[class*=language-] {
clear: both;
-}
\ No newline at end of file
+}
+
+.minilink-addedin {
+ text-transform: none;
+ box-shadow: 0 0 0 1px rgba(0,0,0,0.3);
+}
+@media (prefers-color-scheme: dark) {
+ .minilink-addedin {
+ box-shadow: 0 0 0 1px rgba(255,255,255,0.3);
+ }
+}
+.minilink-addedin:not(:first-child) {
+ margin-left: .5em;
+}
+.minilink-addedin.minilink-inline {
+ margin: 0 4px;
+ background-color: #fff;
+}
+
+.minilink-lower {
+ text-transform: none;
+ background-color: transparent;
+}
+.minilink-lower[href] {
+ box-shadow: 0 0 0 1px rgba(0,0,0,0.5);
+}
+.minilink-lower[href]:hover,
+.minilink-lower[href]:focus {
+ background-color: #eee;
+}
+
+.minilink > .minilink {
+ margin: -.125em .375em -.125em -.375em;
+ box-shadow: none;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
diff --git a/docs/_includes/components/toc.css b/docs/_includes/components/toc.css
index c70a08b0..6fa4252f 100644
--- a/docs/_includes/components/toc.css
+++ b/docs/_includes/components/toc.css
@@ -1,63 +1,111 @@
.elv-toc {
font-size: 1rem; /* Reset */
}
+.elv-toc details {
+ --details-force-closed: (max-width: 63.9375em); /* 1023px */
+}
+.elv-toc details > summary {
+ font-size: 1.375rem; /* 22px /16 */
+ margin-bottom: .5em;
+}
@media (min-width: 64em) { /* 1024px */
.elv-toc {
position: absolute;
- left: -17rem;
+ left: 3rem;
width: 16rem;
+ z-index: 1;
+ }
+ .elv-toc details > summary {
+ margin-top: 0;
+ }
+ .js .elv-toc details > summary {
+ display: none;
}
}
-
.elv-toc-list {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: space-between;
padding-left: 0;
padding-right: 0;
+ margin: 0 0 2.5em;
list-style: none;
}
+.elv-toc-list li {
+ font-size: 0.9375em; /* 15px /16 */
+ line-height: 1.466666666667; /* 22px /15 */
+}
/* Nested lists */
.elv-toc-list ul {
- padding: 0;
- display: none;
- margin-bottom: 1.5em;
+ padding: 0 0 .75em 0;
+ margin: 0;
list-style: none;
}
-.elv-toc-list ul li {
- padding-left: 0.875em; /* 14px /16 */
+
+/* Menus nested 2 or more deep */
+.elv-toc-list ul ul {
+ padding-bottom: 0;
+ padding-left: 0.625rem; /* 10px /16 */
}
-@media (min-width: 64em) and (min-height: 48em) { /* 1024 x 768px */
- .elv-toc-list ul {
- display: block;
- }
+/* Hide inactive menus 3 or more deep */
+.elv-toc-list ul ul > li:not(.elv-toc-active) > ul > li:not(.elv-toc-active) {
+ display: none;
}
/* List items */
+.elv-toc summary,
+.elv-toc-list a {
+ padding: .15em .25em;
+}
+.elv-toc-list a {
+ display: block;
+}
.elv-toc-list a:not(:hover) {
text-decoration: none;
}
.elv-toc-list li {
- padding-top: 0;
- padding-bottom: 0;
- margin: .1em 0 .5em;
+ margin: 0;
+ padding: 0;
+}
+.elv-toc-list > li {
+ flex-grow: 1;
+ flex-basis: 14.375rem; /* 230px /16 */
}
/* Top level links */
.elv-toc-list > li > a {
- font-weight: 400;
- font-size: 1.0625em; /* 17px /16 */
color: #222;
+ font-weight: 600;
+ border-bottom: 1px solid #ddd;
+ margin-bottom: 0.25em; /* 4px /16 */
+}
+@media (prefers-color-scheme: dark) {
+ .elv-toc-list > li > a {
+ color: #fff;
+ border-color: #444;
+ }
}
/* Active links */
.elv-toc-list li.elv-toc-active > a {
- font-weight: 700;
- text-decoration: underline;
+ background-color: #dff7ff;
}
-.elv-toc-active > a:after {
- content: " ⬅";
- line-height: .5;
+@media (prefers-color-scheme: dark) {
+ .elv-toc-list li.elv-toc-active > a {
+ background-color: #353535;
+ }
}
+.elv-toc-list ul .elv-toc-active > a:after {
+ content: "";
+}
+
/* Show only active nested lists */
.elv-toc-list ul.elv-toc-active,
.elv-toc-list li.elv-toc-active > ul {
display: block;
-}
\ No newline at end of file
+}
+
+/* Footer catgory navigation */
+.elv-cat-list-active {
+ font-weight: 600;
+}
diff --git a/docs/_includes/index.css b/docs/_includes/index.css
index 7393f7e2..40bf5d63 100644
--- a/docs/_includes/index.css
+++ b/docs/_includes/index.css
@@ -234,6 +234,9 @@ pre + .note {
max-width: 42rem;
clear: both;
}
+header.elv-layout {
+ padding: 0 1rem;
+}
footer.elv-layout {
margin-bottom: 5em;
}
@@ -242,7 +245,7 @@ footer.elv-layout {
}
@media (min-width: 64em) { /* 1024px */
.elv-layout-toc {
- margin-left: 18rem;
+ padding-left: 15rem;
max-width: 60rem;
margin-right: 1rem;
position: relative;
@@ -254,7 +257,6 @@ footer.elv-layout {
/* Header */
.elv-header {
- color: #222;
position: relative;
}
.elv-header-default {
@@ -262,6 +264,13 @@ footer.elv-layout {
flex-direction: column;
justify-content: center;
align-items: center;
+ padding-top: 0;
+}
+.elv-header-c {
+ width: 100%;
+}
+.elv-header-docs .elv-header-c {
+ padding: 1rem 0;
}
.elv-header-docs:before,
.elv-header-docs:after {
@@ -272,53 +281,89 @@ footer.elv-layout {
clear: both;
}
/* Header Hero */
-.elv-hero img {
- max-width: 80vw;
- max-height: 60vh;
+.elv-hero {
+ background-color: #222;
}
+@media (prefers-color-scheme: dark) {
+ .elv-hero {
+ background-color: #292929;
+ }
+}
+.elv-hero img,
+.elv-hero svg {
+ width: 42.95774646vh;
+ height: 60vh;
+}
+.elv-hero:hover img,
+.elv-hero:hover svg {
+ background-color: inherit;
+}
+.elv-header-default .elv-hero {
+ display: flex;
+ justify-content: center;
+ width: calc(100% + 2rem);
+ margin-left: -1rem;
+ margin-right: -1rem;
+}
+.elv-hero:hover {
+ background-color: #333;
+}
+
.elv-header-docs .elv-hero {
float: left;
- margin-right: 1.5em;
+ margin-right: .5em;
}
-.elv-header-docs .elv-hero img {
+.elv-header-default .elv-hero img,
+.elv-header-default .elv-hero svg {
+ position: relative;
+ background-color: transparent;
+ z-index: 1;
+}
+.elv-header-docs .elv-hero img,
+.elv-header-docs .elv-hero svg {
+ width: auto;
height: 3em;
}
-@media (min-width: 37.5em) { /* 600px */
- .elv-header-docs .elv-hero img {
+@media (min-width: 43.75em) { /* 700px */
+ .elv-header-docs .elv-hero {
+ margin-right: 1em;
+ }
+ .elv-header-docs .elv-hero img,
+ .elv-header-docs .elv-hero svg {
width: 4.303125em; /* 68.85px /16 */
height: 6em;
}
}
/* Header Possum */
+.elv-possum-anchor {
+ display: block;
+}
.elv-possum {
- display: none;
position: absolute;
- right: 1em;
- top: 1em;
- width: 16vmin;
+ right: .5rem;
+ top: 1rem;
+ transition: .3s opacity ease-out;
}
-@media (min-width: 31.25em) { /* 500px */
- .elv-possum {
- display: block;
- }
+.elv-header-docs .elv-possum {
+ width: 15vw;
+ max-width: 6.25rem; /* 100px /16 */
}
-
-/* Header Heading */
-.elv-hed {
- font-size: 3em;
- margin-top: 1.5em;
- margin-bottom: .25em;
- text-align: center;
- text-transform: none;
+.elv-header-default {
+ overflow: hidden;
}
-.elv-header-docs .elv-hed {
- font-size: 2.3em;
- margin: 0;
- text-align: left;
+.elv-header-default .elv-possum {
+ pointer-events: none;
+ width: auto;
+ height: calc((60vh - 2rem) / 1.6);
+ top: 36%;
+ left: 1vw;
+ right: auto;
+ animation-duration: 180s;
+ animation-name: balloonFloat;
}
-@media (min-width: 37.5em) { /* 600px */
- .elv-header-docs .elv-hed {
- font-size: 3em;
+@media (prefers-reduced-motion: reduce) {
+ .elv-header-default .elv-possum {
+ display: none;
}
}
diff --git a/docs/_includes/layouts/main.njk b/docs/_includes/layouts/main.njk
index fc320ea3..e1d839aa 100644
--- a/docs/_includes/layouts/main.njk
+++ b/docs/_includes/layouts/main.njk
@@ -6,9 +6,27 @@ headerClass: elv-header-default
{% include "header.njk" %}