diff --git a/_vendor/git.sandpoints.org/Drawwell/SandpointsTheme/customizations/Dotawo/assets/css/site.css b/_vendor/git.sandpoints.org/Drawwell/SandpointsTheme/customizations/Dotawo/assets/css/site.css
new file mode 100644
index 0000000..e1ccddc
--- /dev/null
+++ b/_vendor/git.sandpoints.org/Drawwell/SandpointsTheme/customizations/Dotawo/assets/css/site.css
@@ -0,0 +1,700 @@
+html,
+body,
+dl,
+dt,
+dd,
+blockquote,
+figure,
+fieldset,
+legend,
+textarea,
+pre,
+iframe,
+hr {
+ margin: 0;
+ padding: 0;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ font-size: 100%;
+ font-weight: normal;
+}
+
+ul {
+ list-style: none;
+}
+
+button,
+input,
+select,
+textarea {
+ margin: 0;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+img,
+video {
+ height: auto;
+ max-width: 100%;
+}
+
+iframe {
+ border: 0;
+}
+
+strong del {
+ /* font-weight: normal; */
+ display: inline;
+ text-decoration: none;
+ margin-left: 1rem;
+ box-decoration-break: clone;
+ -webkit-box-decoration-break: clone;
+}
+
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+ background-color: #fff9f9;
+ border-left: 1px red solid;
+ margin-left: 1rem;
+}
+
+td,
+th {
+ padding: 0;
+ vertical-align: top;
+ padding-right: 1rem;
+ padding-left: 1rem;
+ padding-bottom: 0.5rem;
+}
+
+td:not([align]),
+th:not([align]) {
+ text-align: left;
+}
+
+@font-face {
+ font-family: "Gentium Plus";
+ font-style: normal;
+ src: url("../fonts/GentiumPlus-R.woff"),
+ url("../fonts/GentiumPlus-R.woff") format("woff");
+}
+
+@font-face {
+ font-family: "Gentium Plus";
+ font-style: italic;
+ src: url("../fonts/GentiumPlus-I.woff"),
+ url("../fonts/GentiumPlus-I.woff") format("woff");
+}
+
+@font-face {
+ font-family: "Great Vibes";
+ font-style: normal;
+ font-weight: 400;
+ src: url("../fonts/great-vibes-v7-latin-ext_latin-regular.eot");
+ /* IE9 Compat Modes */
+ src: local("Great Vibes"), local("GreatVibes-Regular"),
+ url("../fonts/great-vibes-v7-latin-ext_latin-regular.eot?#iefix")
+ format("embedded-opentype"),
+ /* IE6-IE8 */ url("../fonts/great-vibes-v7-latin-ext_latin-regular.woff2")
+ format("woff2"),
+ /* Super Modern Browsers */
+ url("../fonts/great-vibes-v7-latin-ext_latin-regular.woff") format("woff"),
+ /* Modern Browsers */
+ url("../fonts/great-vibes-v7-latin-ext_latin-regular.ttf")
+ format("truetype"),
+ /* Safari, Android, iOS */
+ url("../fonts/great-vibes-v7-latin-ext_latin-regular.svg#GreatVibes")
+ format("svg");
+ /* Legacy iOS */
+}
+
+@font-face {
+ font-family: "Antinoou";
+ font-style: normal;
+ src: url("../fonts/Antinoou.ttf"),
+ url("../fonts/Antinoou.ttf") format("truetype");
+ unicode-range: U+2C80–U+2CFF, U+0370–U+03FF, U+102E0–U+102FF;
+}
+
+@font-face {
+ font-family: "Antinoou";
+ font-style: italic;
+ src: url("../fonts/AntinoouItalic.ttf"),
+ url("../fonts/AntinoouItalic.ttf") format("truetype");
+ unicode-range: U+2C80–U+2CFF, U+0370–U+03FF, U+102E0–U+102FF;
+}
+
+html {
+ line-height: 1.5;
+}
+
+body {
+ font-family: "Gentium Plus", "Antinoou", serif;
+ max-width: 1024px;
+ font-size: 1.4rem;
+ padding-left: 3rem;
+ padding-top: 0.5rem;
+ padding-right: 2rem;
+ color: black;
+}
+
+#preview {
+ display: none;
+}
+
+sup,
+sub {
+ vertical-align: baseline;
+ position: relative;
+ top: -0.4em;
+}
+
+sub {
+ top: 0.4em;
+}
+
+.headiter {
+ display: flex;
+ justify-content: space-between;
+ border-bottom: 0.3rem solid red;
+ border-top: 0.1rem solid red;
+ padding-top: 1rem;
+ padding-bottom: 0.5rem;
+ padding-left: 1rem;
+ padding-right: 1rem;
+ margin-bottom: 1rem;
+}
+
+a.edit-button {
+ color: #000;
+ text-decoration: none;
+}
+
+a.edit-button:hover {
+ text-decoration: underline;
+ -webkit-text-decoration-color: red;
+ text-decoration-color: red;
+ font-weight: bold;
+ /* font-size: 0.95em; */
+ cursor: pointer;
+}
+
+.header {
+ display: grid;
+ grid-template-columns: auto;
+ grid-auto-flow: column;
+ position: sticky;
+ top: 0;
+ padding-top: 0.5rem;
+ font-size: 1.1rem;
+ background-color: white;
+ z-index: 10;
+}
+
+.mantlebar {
+ display: none;
+}
+
+.breadcrumbs {
+ grid-column: 1;
+}
+
+.bibliotheke {
+ width: 2.4rem;
+ grid-column: 2;
+ margin-left: auto;
+}
+
+.bibliotheke:hover {
+ text-decoration: none;
+ font-size: 1rem;
+}
+
+.alsoin {
+ font-weight: bold;
+ display: inline-flex;
+ padding-left: 0.2rem;
+ padding-right: 0.3rem;
+}
+
+.ddmenu {
+ cursor: pointer;
+ display: inline-grid;
+}
+
+.ddmenu input {
+ display: none;
+}
+
+.ddmenu li {
+ list-style-type: none;
+}
+
+.ddmenu .hiddendiv {
+ display: none;
+ margin-top: -0.9rem;
+}
+
+input:focus,
+select:focus,
+textarea:focus,
+label:focus,
+button:focus {
+ outline: none;
+}
+
+.ddmenu input:checked ~ .hiddendiv {
+ display: block;
+}
+
+.logolink {
+ width: 2.4rem;
+ margin-left: auto;
+}
+
+.sandpointlogo {
+ border-radius: 50%;
+ border: 0.3em solid red;
+ display: inline-flex;
+ font-family: "Great Vibes", cursive;
+ font-size: 1.2rem;
+ font-weight: bold;
+ color: white;
+ background-color: red;
+ position: relative;
+ padding-left: 1em;
+ padding-right: 0.3em;
+ padding-bottom: 1.2em;
+ max-width: 0em;
+ max-height: 0em;
+}
+
+.sandpointF {
+ position: absolute;
+ font-size: 1.2em;
+ margin-top: -0.2em;
+ margin-left: -0.4em;
+}
+
+.sandpointN {
+ position: absolute;
+ font-size: 0.7em;
+ margin-top: 0.4em;
+ color: red;
+ margin-left: -0.5em;
+}
+
+.sandpointC {
+ position: absolute;
+ font-size: 1em;
+ margin-left: -0.37em;
+}
+
+footer {
+ display: flex;
+ margin-bottom: 1rem;
+ margin-top: 4rem;
+}
+
+li {
+ list-style-type: "› ";
+}
+
+li[role="doc-endnote"] {
+ list-style-type: decimal;
+}
+
+ol li {
+ list-style-type: decimal;
+}
+
+.supt {
+ display: inline-flex;
+ flex-wrap: nowrap;
+ font-family: "Great Vibes", cursive;
+ font-size: 0.9em;
+ font-style: normal;
+ color: rgba(0, 0, 0, 0.8);
+ vertical-align: baseline;
+ position: relative;
+ top: -0.3em;
+}
+
+.sup {
+ display: inline-flex;
+ flex-wrap: nowrap;
+ font-family: "Great Vibes", cursive;
+ font-size: 0.9em;
+ font-style: normal;
+ color: red;
+ vertical-align: baseline;
+ position: relative;
+ top: -0.3em;
+}
+
+.sup:hover {
+ font-weight: normal !important;
+}
+
+.nosup a {
+ color: red;
+}
+
+.nosup a span.sup {
+ display: none;
+}
+
+.syllabustitle,
+.coretitle {
+ margin-top: 4rem;
+ font-style: italic;
+ font-size: 4rem;
+ margin-bottom: 4rem;
+}
+
+.mantletitle,
+.crusttitle {
+ margin-top: 4rem;
+ font-style: italic;
+ font-size: 2rem;
+ margin-bottom: 4rem;
+}
+
+.grid {
+ padding-left: 3rem;
+ margin-bottom: 2rem;
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+}
+
+.leftcolumn {
+ grid-column: 1;
+ padding-right: 1.2rem;
+ position: relative;
+}
+
+#TableOfContents {
+ margin-left: -2rem;
+ margin-top: -1.5rem;
+}
+
+#TableOfContents li {
+ list-style: decimal inside;
+ padding-left: 0.5rem;
+ color: rgba(0, 0, 0, 0.4);
+ margin: 0;
+ padding: 0;
+}
+
+#TableOfContents li a {
+ font-family: "Gentium Plus";
+ font-size: 1.4rem;
+ font-weight: bold;
+}
+
+.counters {
+ color: rgba(0, 0, 0, 0.4);
+}
+/* #TableOfContents > ol:first-child > span > li > a::after { */
+/* content: "¶"; */
+/* color: rgba(0, 0, 0, 0.2); */
+/* font-size: 1.3em; */
+/* padding-left: 0.1em; */
+/* } */
+
+.rightcolumn {
+ /* display: grid;
+ grid-column: 2;
+ grid-template-columns: auto 1fr;
+ grid-auto-rows: max-content; */
+ padding-left: 0.5rem;
+}
+
+.has {
+ display: inline-grid;
+ grid-column: 2;
+ grid-auto-rows: max-content;
+ font-size: 1.4rem;
+ font-style: italic;
+ margin-bottom: 0.8rem;
+}
+
+.hasauthors {
+ font-size: 1.6rem !important;
+ display: flex;
+}
+
+.hassup {
+ grid-column: 1;
+ font-family: "Great Vibes", cursive;
+ font-size: 0.9em;
+ font-style: normal;
+ color: red;
+ vertical-align: baseline;
+ position: relative;
+ /* top: -0.3em; */
+}
+
+.afterhas {
+ grid-column: 2;
+}
+
+.content {
+ margin-top: 4rem;
+ padding-left: 3rem;
+ padding-right: 10rem;
+ max-width: 720px;
+}
+
+a {
+ color: black;
+ text-decoration: none;
+}
+
+a:hover {
+ text-decoration: underline;
+ text-decoration-color: red;
+ font-weight: bold;
+ /* font-size: 0.95em; */
+ cursor: pointer;
+}
+
+h1 {
+ display: none;
+}
+
+h2 {
+ font-weight: bold;
+ font-size: 1.6rem;
+}
+
+h3 {
+ font-weight: bold;
+ font-size: 1.4rem;
+}
+
+h4 {
+ font-weight: bold;
+ font-size: 1.2rem;
+}
+
+h5 {
+ font-weight: bold;
+ font-size: 1.1rem;
+}
+
+h6 {
+ font-weight: bold;
+ font-size: 1rem;
+}
+
+.abstract {
+ font-style: italic;
+ border-left: 1px solid rgb(0, 0, 0);
+ margin-left: 5rem;
+ margin-right: 2rem;
+ margin-bottom: 1.2rem;
+ padding-left: 1rem;
+ padding-right: 2rem;
+ padding-top: 1.2rem;
+ padding-bottom: 1.2rem;
+ background-color: rgba(0, 0, 0, 0.05);
+ max-width: 70ch;
+}
+
+.authors {
+ display: inline-block;
+ font-size: 1.8rem;
+ margin-left: 5rem;
+ margin-right: 2rem;
+ padding-left: 1rem;
+}
+
+.keywords {
+ display: inline-block;
+ font-size: 1.2rem;
+ margin-left: 5rem;
+ margin-right: 2rem;
+ padding-left: 1rem;
+ padding-right: 2rem;
+ margin-bottom: 2.2rem;
+ max-width: 72ch;
+}
+
+blockquote {
+ border-left: 1px red solid;
+ margin-left: 1rem;
+ margin-right: 2rem;
+ padding-left: 1rem;
+ padding-right: 2rem;
+ padding-top: 0.1rem;
+ padding-bottom: 0.1rem;
+ background-color: #fff9f9;
+}
+
+.hx {
+ position: relative;
+}
+
+.hpar {
+ display: none;
+ /* position: absolute; */
+ /* font-size: 1.7em; */
+ /* font-style: normal; */
+ /* color: rgba(0, 0, 0, 0.1); */
+ /* top: 0; */
+ /* margin-top: -0.4em; */
+}
+
+.smallcaps {
+ font-family: "Gentium Plus", serif;
+ font-variant: small-caps;
+}
+details {
+ padding-left: 1rem;
+}
+
+#toggleAllLinks {
+ font-size: 0.8rem;
+}
+
+#toggleAllLinks:hover {
+ cursor: pointer;
+ text-decoration: underline;
+ text-decoration-color: red;
+}
+
+.glosscontainer {
+ display: grid;
+ grid-template-columns: auto 1fr;
+ grid-template-rows: 1fr;
+ gap: 0px 0px;
+ grid-template-areas: "glossnumber gloss";
+ border-left: 1px red solid;
+ background-color: #fff9f9;
+ padding-top: 0.4em;
+ margin-top: 1rem;
+ margin-bottom: 1rem;
+ margin-left: 1rem;
+ margin-right: 2rem;
+ padding-bottom: 0.4em;
+ padding-left: 1rem;
+ padding-right: 2rem;
+}
+
+.gloss {
+ grid-area: gloss;
+}
+
+.glossnumber {
+ grid-area: glossnumber;
+ padding-right: 0.6rem;
+}
+
+.glossnumberAuto::before {
+ counter-increment: glossN;
+ content: "(" counter(glossN) ")";
+}
+
+/* .glossline {
+ border-bottom: lightgray solid 1px;
+ border-top: lightgray solid 1px;
+} */
+
+.glosswords {
+ display: inline-block;
+ padding-left: -0.3rem;
+ padding-right: 1rem;
+}
+
+.sitemap {
+ padding-left: 3rem;
+ font-size: 1.2rem;
+}
+
+.sitemap a {
+ color: rgba(0, 0, 0, 0.4);
+}
+.sitemap .sup {
+ color: rgba(255, 0, 0, 0.7);
+}
+
+.highline a,
+.sitemap a:hover {
+ color: rgba(0, 0, 0, 1);
+}
+
+.highline .sup,
+.sitemap .sup:hover {
+ color: red;
+}
+
+.highline {
+ font-size: 1.6rem;
+ color: rgb(0, 0, 0);
+ border-left: 1px red solid;
+ padding-left: 1rem;
+ padding-top: 0.1rem;
+ padding-bottom: 0.1rem;
+ background-color: #fff9f9;
+}
+
+.affiliation {
+ font-size: smaller;
+}
+
+@media (max-width: 767px) {
+ html {
+ box-sizing: border-box;
+ max-width: 767px;
+ margin: 0 auto;
+ padding: 0;
+ }
+ body {
+ font-size: 1rem;
+ padding-left: 10px;
+ padding-right: 10px;
+ }
+ .grid {
+ display: inline;
+ }
+ .coretitle {
+ margin-top: 3rem;
+ margin-bottom: 2rem;
+ font-size: 2.2rem;
+ }
+ .leftcolumn {
+ display: none;
+ }
+ .has,
+ .afterhas {
+ font-size: 1.1rem;
+ }
+ .mantle,
+ .crust {
+ margin-bottom: 0.2em;
+ }
+ .content {
+ padding: 0px;
+ margin: 0 auto;
+ margin-top: 4rem;
+ }
+ .hpar {
+ display: none;
+ }
+ .mantletitle {
+ font-size: 1.7rem;
+ }
+ .sessiongrid {
+ display: none;
+ }
+}
diff --git a/_vendor/git.sandpoints.org/Drawwell/SandpointsTheme/customizations/Dotawo/layouts/_default/_markup/render-image.html b/_vendor/git.sandpoints.org/Drawwell/SandpointsTheme/customizations/Dotawo/layouts/_default/_markup/render-image.html
new file mode 100644
index 0000000..fad8dcd
--- /dev/null
+++ b/_vendor/git.sandpoints.org/Drawwell/SandpointsTheme/customizations/Dotawo/layouts/_default/_markup/render-image.html
@@ -0,0 +1,60 @@
+{{- $text_link := .Text -}}
+
+{{ $_ := newScratch }}
+{{- range $k, $v := .Page.Site.Data.sandpointsnamegraph -}}
+ {{ $_.Add "triads" $k }}
+{{- end -}}
+
+{{- if strings.HasPrefix .Destination "img:" -}}
+ {{- $img_params := (substr .Destination 4) -}}
+ {{- $img_src := index (split $img_params " ") 0 -}}
+ {{- $img_attr := index (split $img_params $img_src) 1 -}}
+
+{{- else if strings.HasPrefix .Destination "vid:" -}}
+ {{- $vid_params := (substr .Destination 4) -}}
+ {{- $vid_src := index (split $vid_params " ") 0 -}}
+ {{- $vid_attr := index (split $vid_params $vid_src) 1 -}}
+
+{{- else if strings.HasPrefix .Destination "bib:" -}}
+ {{- $destination := (substr .Destination 4) -}}
+ {{- $c_prefix := .Page.Site.Params.sandpointsCatalogPrefix | default "/library/" -}}
+ {{- if index $.Page.Site.Data.books.catalog $destination -}}
+ {{- $b := index $.Page.Site.Data.books.catalog $destination -}}
+ {{- $bibhref := printf "%sBROWSE_LIBRARY.html#/book/%s" (safeURL ($c_prefix)) $destination }}
+ {{ $bibtitle := "" }}
+ {{ with $b.title }}
+ {{- $bibtitle = printf "%s" $b.title }}
+ {{ end }}
+ {{ .Page.Scratch.Add "bibs" (slice (slice $bibhref $bibtitle)) }}
+ {{- if not $text_link -}}
+ {{- delimit $b.authors ", " " & " -}}{{- with $b.pubdate -}}, {{- substr . 0 4}}{{- end -}}.bib⁄‘{{- $b.title -}}’. {{- with $b.publisher -}}{{- . -}}.{{- end -}}
+ {{- else -}}
+ bib⁄{{- $text_link -}}
+ {{- end -}}
+ {{- else -}}
+ {{- $text_link -}}⦚bib:{{- $destination -}} not found
+ {{- end -}}
+{{- else if in ($_.Get "triads") (index (split .Destination ":") 0) -}}
+ {{- if $.Page.Site.GetPage (printf "/%s" (replace .Destination ":" "/")) -}}
+ {{- $session := $.Page.Site.GetPage (printf "/%s" (replace .Destination ":" "/")) -}}
+ {{ .Page.Scratch.Add "links" (slice $session) }}
+ {{- if not $text_link -}}
+ {{- index (split .Destination ":") 0 -}}⁄{{- $session.Title -}}
+ {{- else -}}
+ {{- index (split .Destination ":") 0 -}}⁄{{- $text_link -}}
+ {{- end -}}
+ {{- else -}}
+ {{- $text_link -}}⦚{{- .Destination -}} not found
+ {{- end -}}
+{{- else if strings.HasPrefix .Destination "audio:" -}}
+ {{- $a_destination := (substr .Destination 6) -}}
+ {{- if findRE "^.*static" $a_destination -}}
+ {{ .Text }}
+ {{- else -}}
+ {{ .Text }}
+ {{- end -}}
+{{- else if findRE "^.*static" .Destination -}}
+
+{{- else -}}
+
+{{- end -}}
diff --git a/_vendor/git.sandpoints.org/Drawwell/SandpointsTheme/customizations/Dotawo/layouts/_default/_markup/render-link.html b/_vendor/git.sandpoints.org/Drawwell/SandpointsTheme/customizations/Dotawo/layouts/_default/_markup/render-link.html
new file mode 100644
index 0000000..b81c7a4
--- /dev/null
+++ b/_vendor/git.sandpoints.org/Drawwell/SandpointsTheme/customizations/Dotawo/layouts/_default/_markup/render-link.html
@@ -0,0 +1 @@
+{{- .Page.Scratch.Add "urls" (slice .Destination) -}}{{- $t := .Text -}}{{- $sup := "" -}}{{- if and (strings.HasPrefix .Destination "{") (.Destination | strings.Count "}") -}}{{- range first 1 (split .Destination "}") -}}{{- range $frmt := (split (substr . 1) ",") -}}{{- if eq $frmt "sc" -}}{{- $t -}}{{- end -}}{{- end -}}{{- end -}}{{- else }}{{- if strings.HasPrefix .Destination "http" -}}{{- $sup = "www" -}}{{- end -}}{{- if strings.HasPrefix .Destination "#" -}}{{- $sup = "§" -}}{{- end -}}{{- $sup -}}⁄{{ .Text | safeHTML }}{{- end -}}
diff --git a/_vendor/git.sandpoints.org/Drawwell/SandpointsTheme/customizations/Dotawo/layouts/partials/header.html b/_vendor/git.sandpoints.org/Drawwell/SandpointsTheme/customizations/Dotawo/layouts/partials/header.html
new file mode 100644
index 0000000..c88addd
--- /dev/null
+++ b/_vendor/git.sandpoints.org/Drawwell/SandpointsTheme/customizations/Dotawo/layouts/partials/header.html
@@ -0,0 +1,114 @@
+{{ $s := partialCached "scratch.html" . }}
+
+{{ $currentDir := "" }}
+{{ with .File }}
+ {{ $currentDir = .Dir }}
+{{ end }}
+
+{{ $currentFile := (printf "/%s" .File) }}
+{{ $scratch := $s.Get $currentFile }}
+
+{{ $is_in_ := newScratch }}
+{{ with eq $scratch.depth "crust" }}
+ {{ range $scratch.is_in }}
+ {{ range $k,$v := $s.Get (printf "/%s" .File) }}
+ {{ if eq $k "is_in" }}
+ {{ range $v }}
+ {{ $is_in_.Set (printf "/%s" .File) (printf "/%s" .File) }}
+ {{ end }}
+ {{ end }}
+ {{ end }}
+ {{ end }}
+{{ end }}
+
+{{ $is_in_is_in := (slice) }}
+{{ range $is_in_.Values }}
+ {{ $is_in_is_in = $is_in_is_in | append ($.GetPage .) }}
+{{ end }}
+
+{{ if eq hugo.Environment "gitea" }}
+