hugo-theme-readable

Fork of https://github.com/cjtheham/hugo-theme-readable
git clone https://git.eamoncaddigan.net/hugo-theme-readable.git
Log | Files | Refs | README | LICENSE

commit e27fbc792dbcff9cde20175bcad2e0517f66a4d3
parent dad292e2fd703dcfb55074e7f2e13743271c969e
Author: cjtheham <cjtheham@protonmail.com>
Date:   Mon, 30 Jan 2023 13:14:33 -0600

old work pushed

Diffstat:
MLICENSE | 3++-
MREADME.md | 3+++
Aarchetypes/default.md | 2++
Alayouts/404.html | 0
Alayouts/_default/baseof.html | 26++++++++++++++++++++++++++
Alayouts/_default/list.html | 10++++++++++
Alayouts/_default/single.html | 7+++++++
Alayouts/index.html | 6++++++
Alayouts/partials/footer.html | 3+++
Alayouts/partials/head.html | 9+++++++++
Alayouts/partials/header.html | 3+++
Alayouts/partials/metadata.html | 14++++++++++++++
Astatic/css/readable.css | 246+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Astatic/js/typewriter.js | 42++++++++++++++++++++++++++++++++++++++++++
Atheme.toml | 16++++++++++++++++
15 files changed, 389 insertions(+), 1 deletion(-)

diff --git a/LICENSE b/LICENSE @@ -21,4 +21,4 @@ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -For more information, please refer to <https://unlicense.org> +For more information, please refer to <https://unlicense.org> +\ No newline at end of file diff --git a/README.md b/README.md @@ -1,2 +1,4 @@ # hugo-theme-readable Hugo theme built using readable.css from Freedom to Write + +https://codeberg.org/Freedom-to-Write/readable.css +\ No newline at end of file diff --git a/archetypes/default.md b/archetypes/default.md @@ -0,0 +1,2 @@ ++++ ++++ diff --git a/layouts/404.html b/layouts/404.html diff --git a/layouts/_default/baseof.html b/layouts/_default/baseof.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<html> + {{- partial "head.html" . -}} + <body> + <header> + {{- partial "header.html" . -}} + </header> + + <nav> + {{ range .Site.Menus.main -}} + <span> + <a href="{{ .URL | absLangURL }}">{{ .Name }}</a> + </span> + {{- end }} + </nav> + + <main> + {{- block "main" . }}{{- end }} + </main> + + + <footer> + {{- partial "footer.html" . -}} + </footer> + </body> +</html> diff --git a/layouts/_default/list.html b/layouts/_default/list.html @@ -0,0 +1,9 @@ +{{ define "main" }} +<h1>{{ .Title }}</h1> +{{ range .Pages.ByPublishDate.Reverse }} +<p> + <h3><a class="title" href="{{ .RelPermalink }}">{{ .Title }}</a></h3> + {{ partial "metadata.html" . }} +</p> +{{ end }} +{{ end }} +\ No newline at end of file diff --git a/layouts/_default/single.html b/layouts/_default/single.html @@ -0,0 +1,6 @@ +{{ define "main" }} +<h1>{{ .Title }}</h1> +{{ partial "metadata.html" . }} +<!-- <br><br> --> +{{ .Content }} +{{ end }} +\ No newline at end of file diff --git a/layouts/index.html b/layouts/index.html @@ -0,0 +1,5 @@ +{{ define "main" }} +{{ partial "metadata.html" . }} +<!-- <br><br> --> +{{ .Content }} +{{ end }} +\ No newline at end of file diff --git a/layouts/partials/footer.html b/layouts/partials/footer.html @@ -0,0 +1,3 @@ +<p><a href="/policies/privacy/">Privacy Policy</a> | <a href="/policies/cookies/">Cookie Policy</a> | <a href="/policies/terms/">Terms of Use</a></p> <!-- We like putting links in a paragraph separated by pipe ("|") characters --> +<p>© 2023 {{ $.Site.Params.author }}</p> <!-- While not legally required, it's nice to put copyright and/or license info here. Also, it looks nice to break up the links with a line of text --> +<a href={{ $.Site.Params.Mastodon }} rel="me" target="blank">Mastodon</a> | <a href="/contact/">Contact Me</a></p> <!-- This is the kind of thing people look for in footers: contact info and legal info. Make sure you include both! --> diff --git a/layouts/partials/head.html b/layouts/partials/head.html @@ -0,0 +1,8 @@ +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- This ensures your site looks right on mobile devices --> + <link rel="stylesheet" type="text/css" href="/css/readable.css?v=1.0.0"> + {{ $title := print .Site.Title " | " .Title }} + {{ if .IsHome }}{{ $title = .Site.Title }}{{ end }} + <title>{{ $title }}</title> +</head> +\ No newline at end of file diff --git a/layouts/partials/header.html b/layouts/partials/header.html @@ -0,0 +1,2 @@ +<h1>{{ $.Site.Title }}</h1> +<p>{{ $.Site.Params.subtitle }}</p> +\ No newline at end of file diff --git a/layouts/partials/metadata.html b/layouts/partials/metadata.html @@ -0,0 +1,13 @@ +{{ $dateTime := .PublishDate.Format "2006-01-02" }} +{{ $dateFormat := .Site.Params.dateFormat | default "Jan 2, 2006" }} +<i data-feather="calendar"></i> +{{ if .PublishDate }} + <time datetime="{{ $dateTime }}">{{ .PublishDate.Format $dateFormat }}</time> +{{ end }} +{{ with .Params.tags }} +<i data-feather="tag"></i> +{{ range . }} +{{ $href := print (absURL "tags/") (urlize .) }} +<a class="btn btn-sm btn-outline-dark tag-btn" href="{{ $href }}">{{ . }}</a> +{{ end }} +{{ end }} +\ No newline at end of file diff --git a/static/css/readable.css b/static/css/readable.css @@ -0,0 +1,245 @@ +/* readable.css 1.0.0 */ + +/* Code from Benjamin Hollon (benjaminhollon@fosstodon.org) */ + +#typewriter::after { + content: '_'; + width: 0; + display: inline-block; + animation: cursor-blink 1s infinite; +} + +/* Font family support */ +html, html[data-font-family="serif"] { + --font-family: serif; + } + html[data-font-family="sans-serif"] { + --font-family: sans-serif; + } + html[data-font-family="monospace"] { + --font-family: monospace; + } + + /* Color scheme support */ + html, html[data-theme="light"] { + --background-color: snow; + --color: #000; + } + + html[data-theme="dark"] { + --background-color: #222830; + --color: #fff; + } + + @media (prefers-color-scheme: dark) { + html { + --background-color: #222830; + --color: #fff; + } + } + + /* Generic styles */ + :root { + --column-width: 67ch; + --form-width: 50ch; + --line-width: 0.125rem; + --line-height: 1.5; + + --one-line: calc(var(--line-height) * 1rem); + --half-line: calc(var(--one-line) * 0.5); + + font-family: var(--font-family); + + background-color: var(--background-color); + color: var(--color); + } + + a { + color: inherit; + } + + a:active { + color: red; + } + + header, footer, h1, h2 { + text-align: center; + } + + footer:not(.exclude) { + border-top: var(--line-width) solid; + } + + summary { + cursor: pointer; + } + + blockquote:not(.exclude) { + padding-left: var(--one-line); + border-left: var(--line-width) solid; + } + + ul, ol { + padding-left: calc(var(--line-height) * 2rem); + } + + :is(body, article, main, figure) > img:not(.exclude) { + max-width: 100%; + } + + figure:not(.exclude) { + text-align: center; + } + + figure:not(.exclude) > * ~ figcaption { + margin-top: 0; + font-style: italic; + } + + article > aside:not(.exclude) { + border: var(--line-width) solid; + padding: 0 var(--one-line); + border-radius: var(--half-line); + } + + pre { + max-width: 100%; + overflow: auto; + } + + hr { + color: inherit; + border: 0; + border-top: var(--line-width) solid; + } + + /* Vertical Rhythm */ + p, ul, ol, figcaption, nav, td, th, label { + line-height: var(--line-height); + } + + h1, h2, h3, h4, h5, h6, p, blockquote, hr, footer, header, nav, figure, figcaption, ul, ol, :is(body, article, main) > img:not(.exclude), table, article > aside, article > aside { + margin: var(--one-line) 0; + } + + /* Headings */ + + header h1 { + font-weight: normal; + } + + h1, h2 { + line-height: calc(var(--line-height) * 2rem); + } + + h1 { + font-size: 2.5rem; + } + + h2 { + font-size: 1.75rem; + } + + h3, h4, h5, h6 { + line-height: var(--one-line); + padding-top: calc(var(--line-height) * 0.75rem); + margin-bottom: calc(var(--line-height) * 0.25rem); + } + + :is(h3, h4, h5, h6) ~ * { + margin-top: 0; + } + + /* Navbar */ + + body > nav:first-of-type:not(.exclude) { /* This styling only affects the first nav element that is the direct child of the body */ + text-align: center; + border-width: var(--line-width) 0; + border-style: solid; + line-height: var(--line-height); + padding: calc((var(--line-height) * 0.5rem) - var(--line-width)); /* Put half a line's height on both top and bottom, then remove the width of the border */ + display: flex; + flex-flow: row wrap; + } + + body > nav:first-of-type:not(.exclude) > * { + flex-grow: 1; + margin: 0 var(--half-line); + text-transform: uppercase; + } + + @media (prefers-reduced-motion: no-preference) { + body > nav:first-of-type:not(.exclude) a { + text-decoration: none; + display: inline-block; + } + + body > nav:first-of-type:not(.exclude) a::after { + content: ''; + width: 0; + height: var(--line-width); + display: block; + background: var(--color); + transition: 150ms; + } + + body > nav:first-of-type:not(.exclude) a:is(:hover, :focus)::after { + width: 100%; + } + } + + /* Column */ + body { + margin: 0 auto; + width: min(95%, var(--column-width)); + } + + /* Justification (default off; use data-justify="on" on <html> to enable) */ + /* 67ch (var(--column-width) / 95% (column max-width) === 70.526315789ch */ + @media (min-width: 70.5ch) { + [data-justify="on"] body { + text-align: justify; + text-justify: inter-character; + } + } + + /* Tables */ + table:not(.exclude) { + display: block; + width: 100%; + overflow: auto; + border-collapse: collapse; + } + + table:not(.exclude) :is(td, th) { + padding: calc(var(--line-height) * 0.25rem); + border: var(--line-width) solid; + } + + table:not(.exclude) td { + word-wrap: break-word; + } + + /* Forms */ + form { + max-width: var(--form-width) + } + + form:not(.exclude) :is(label:not(input:is([type="checkbox"], [type="radio"]) ~ label), input:not([type="checkbox"], [type="radio"]), textarea, select) { + display: block; + margin: var(--half-line) 0; + } + + form:not(.exclude) :is(input:not([type="checkbox"], [type="radio"]), textarea, select) { + box-sizing: border-box; + padding: var(--half-line); + background: transparent; + border: var(--line-width) solid; + color: inherit; + font: inherit; + width: 100%; + } + + form:not(.exclude) label:not(input:is([type="checkbox"], [type="radio"]) ~ label) { + font-weight: bold; + } +\ No newline at end of file diff --git a/static/js/typewriter.js b/static/js/typewriter.js @@ -0,0 +1,42 @@ +// Code from Benjamin Hollon (benjaminhollon@fosstodon.org) + +const addCharDelay = 75; +const removeCharDelay = 45; +const wordDelay = 1500; + +const typewriterElement = document.getElementById('typewriter'); +const typewriterPrompts = [ + 'Amateur Radio Operator', + 'Electrical Engineering Student', + 'Film Enjoyer' +]; +let currentTypewriterIndex = 0; + +function typeNextPrompt() { + function typeChar(char) { + if (char !== '~') typewriterElement.innerText += char; + } + function removeChar() { + typewriterElement.innerText = typewriterElement.innerText.slice(0, -1); + } + + const word = typewriterPrompts[currentTypewriterIndex]; + let delaySoFar = 0; + // Type it + for (const char of word) { + setTimeout(typeChar.bind(this, char), delaySoFar); + delaySoFar += addCharDelay; + } + + delaySoFar += wordDelay; + + for (const char of word.split('').reverse()) { + setTimeout(removeChar, delaySoFar); + delaySoFar += removeCharDelay; + } + + currentTypewriterIndex = (currentTypewriterIndex + 1) % typewriterPrompts.length; + setTimeout(typeNextPrompt, delaySoFar); +} + +setTimeout(typeNextPrompt, wordDelay / 2); diff --git a/theme.toml b/theme.toml @@ -0,0 +1,15 @@ +# theme.toml template for a Hugo theme +# See https://github.com/gohugoio/hugoThemes#themetoml for an example + +name = "Readable" +license = "Unlicense" +licenselink = "https://github.com/cjtheham/hugo-theme-readable/blob/main/LICENSE" +description = "A theme using Freedom to Write's Readable.css" +homepage = "https://github.com/cjtheham/hugo-theme-readable" +tags = [] +features = [] +min_version = "0.41.0" + +[author] + name = "RogueFoam" + homepage = "" +\ No newline at end of file