Add theme with only required fonts

This commit is contained in:
Jez Cope 2021-09-04 14:48:53 +01:00
parent 4f3e1fb4e1
commit 8995ecbb1f
83 changed files with 1474 additions and 0 deletions

20
themes/mnemosyne/LICENSE Normal file
View File

@ -0,0 +1,20 @@
The MIT License (MIT)
Copyright (c) 2021 Jez Cope
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 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.

View File

@ -0,0 +1,33 @@
# Mnemosyne: a minimal Hugo theme
This is the theme that I use for [my blog, eRambler](https://erambler.co.uk).
## Installation
In your Hugo site `themes` directory, run:
```
git clone https://tildegit.org/petrichor/theme-mnemosyne-hugo.git
```
Next, open `config.toml` in the base of the Hugo site and ensure the theme option is set to `mnemosyne`.
```
theme = "mnemosyne"
```
For more information read the official [quick start guide](https://gohugo.io/getting-started/quick-start/) of Hugo.
## Contributing
I don't really have time to test & accept contributions, but feel free to fork this theme and do your own thing with it.
## License
This theme is released under the [MIT license](https://tildegit.org/petrichor/theme-mnemosyne-hugo/src/branch/main/LICENSE).
## Acknowledgements
This theme is based on: [Blank][], a starter [Hugo](https://gohugo.io/) theme for developers. Use it to make your own theme.
[Blank]: https://themes.gohugo.io/theme/blank/

View File

@ -0,0 +1,4 @@
+++
title = "{{ replace .Name "-" " " | title }}"
date = {{ .Date }}
+++

View File

@ -0,0 +1,342 @@
/* webmention.js
Simple thing for embedding webmentions from webmention.io into a page, client-side.
(c)2018-2020 fluffy (http://beesbuzz.biz)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 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.
GitHub repo (for latest released versions, issue tracking, etc.):
https://github.com/PlaidWeb/webmention.js
Basic usage:
<script src="/path/to/webmention.js" data-param="val" ... async />
<div id="webmentions"></div>
Allowed parameters:
page-url:
The base URL to use for this page. Defaults to window.location
add-urls:
Additional URLs to check, separated by |s
id:
The HTML ID for the object to fill in with the webmention data.
Defaults to "webmentions"
wordcount:
The maximum number of words to render in reply mentions.
max-webmentions:
The maximum number of mentions to retrieve. Defaults to 30.
prevent-spoofing:
By default, Webmentions render using the mf2 'url' element, which plays
nicely with webmention bridges (such as brid.gy and telegraph)
but allows certain spoofing attacks. If you would like to prevent
spoofing, set this to a non-empty string (e.g. "true").
sort-by:
What to order the responses by; defaults to 'published'. See
https://github.com/aaronpk/webmention.io#api
sort-dir:
The order to sort the responses by; defaults to 'up' (i.e. oldest
first). See https://github.com/aaronpk/webmention.io#api
comments-are-reactions:
If set to a non-empty string (e.g. "true"), will display comment-type responses
(replies/mentions/etc.) as being part of the reactions
(favorites/bookmarks/etc.) instead of in a separate comment list.
A more detailed example:
<script src="/path/to/webmention.min.js"
data-id="webmentionContainer"
data-wordcount="30"
data-prevent-spoofing="true"
data-comments-are-reactions="true"
/>
*/
(function () {
"use strict";
function getCfg(key, dfl) {
return document.currentScript.getAttribute("data-" + key) || dfl;
}
var refurl = getCfg('page-url',
window.location.href.replace(/#.*$/, ''));
var addurls = getCfg('add-urls', undefined);
var containerID = getCfg('id', "webmentions");
var textMaxWords = getCfg('wordcount');
var maxWebmentions = getCfg('max-webmentions', 30);
var mentionSource = getCfg('prevent-spoofing') ? 'wm-source' : 'url';
var sortBy = getCfg('sort-by', 'published');
var sortDir = getCfg('sort-dir', 'up');
var commentsAreReactions = getCfg('comments-are-reactions');
var reactTitle = {
'in-reply-to': 'replied',
'like-of': 'liked',
'repost-of': 'reposted',
'bookmark-of': 'bookmarked',
'mention-of': 'mentioned',
'rsvp': 'RSVPed',
'follow-of': 'followed'
};
var reactEmoji = {
'in-reply-to': '💬',
'like-of': '❤️',
'repost-of': '🔄',
'bookmark-of': '⭐️',
'mention-of': '💬',
'rsvp': '📅',
'follow-of': '🐜'
};
var rsvpEmoji = {
'yes': '✅',
'no': '❌',
'interested': '💡',
'maybe': '💭'
};
function entities(text) {
return text.replace(/&/g, '&amp;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/"/g, '&quot;');
}
function reactImage(r, isComment) {
var who = entities((r.author && r.author.name)
? r.author.name
: r.url.split('/')[2]);
var response = reactTitle[r['wm-property']] || 'reacted';
if (!isComment && r.content && r.content.text) {
response += ": " + extractComment(r);
}
var html = '<a class="reaction" rel="nofollow ugc" title="' + who + ' ' +
response + '" href="' + r[mentionSource] + '">';
if (r.author && r.author.photo) {
html += '<img src="' + entities(r.author.photo) +
'" loading="lazy" decoding="async" alt="' + who + '">';
}
html += (reactEmoji[r['wm-property']] || '💥');
if (r.rsvp && rsvpEmoji[r.rsvp]) {
html += '<sub>' + rsvpEmoji[r.rsvp] + '</sub>';
}
html += '</a>';
return html;
}
// strip the protocol off a URL
function stripurl(url) {
return url.substr(url.indexOf('//'));
}
// Deduplicate multiple mentions from the same source URL
function dedupe(mentions) {
var filtered = [];
var seen = {};
mentions.forEach(function(r) {
// Strip off the protocol (i.e. treat http and https the same)
var source = stripurl(r.url);
if (!seen[source]) {
filtered.push(r);
seen[source] = true;
}
});
return filtered;
}
function extractComment(c) {
var text = entities(c.content.text);
if (textMaxWords) {
var words = text.replace(/\s+/g,' ')
.split(' ', textMaxWords + 1);
if (words.length > textMaxWords) {
words[textMaxWords - 1] += '&hellip;';
words = words.slice(0, textMaxWords);
text = words.join(' ');
}
}
return text;
}
function formatComments(comments) {
var html = '<h2>' + comments.length + ' Response' +
(comments.length > 1 ? 's' : '') +
'</h2><ul class="comments">';
comments.forEach(function(c) {
html += '<li>';
html += reactImage(c, true);
html += ' <a class="source" rel="nofollow ugc" href="' +
c[mentionSource] + '">';
if (c.author && c.author.name) {
html += entities(c.author.name);
} else {
html += entities(c.url.split('/')[2]);
}
html += '</a>: ';
var linkclass;
var linktext;
if (c.name) {
linkclass = "name";
linktext = c.name;
} else if (c.content && c.content.text) {
linkclass = "text";
linktext = extractComment(c);
} else {
linkclass = "name";
linktext = "(mention)";
}
html += '<span class="' + linkclass + '">' + linktext + '</span>';
html += '</li>';
});
html += '</ul>';
return html;
}
function formatReactions(reacts) {
var html = '<h2>' + reacts.length + ' Reaction' +
(reacts.length > 1 ? 's' : '') +
'</h2><ul class="reacts">';
reacts.forEach(function(r) {
html += reactImage(r);
});
return html;
}
function getData(url, callback) {
if (window.fetch) {
window.fetch(url).then(function(response) {
if (response.status >= 200 && response.status < 300) {
return Promise.resolve(response);
} else {
return Promise.reject(new Error(response.statusText));
}
}).then(function(response) {
return response.json();
}).then(callback).catch(function(error) {
console.error("Request failed", error);
});
} else {
var oReq = new XMLHttpRequest();
oReq.onload = function(data) {
callback(JSON.parse(data));
};
oReq.onerror = function(error) {
console.error("Request failed", error);
};
}
}
window.addEventListener("load", function () {
var container = document.getElementById(containerID);
if (!container) {
// no container, so do nothing
return;
}
var pages = [stripurl(refurl)];
if (!!addurls) {
addurls.split('|').forEach(function (url) {
pages.push(stripurl(url));
})
}
var apiURL = 'https://webmention.io/api/mentions.jf2?per-page=' +
maxWebmentions + '&sort-by=' + sortBy + '&sort-dir=' + sortDir;
pages.forEach(function (path) {
apiURL += '&target[]=' + encodeURIComponent('http:' + path) +
'&target[]=' + encodeURIComponent('https:' + path);
});
getData(apiURL, function(json) {
var html = '';
var comments = [];
var collects = [];
if (commentsAreReactions) {
comments = collects;
}
var mapping = {
"in-reply-to": comments,
"like-of": collects,
"repost-of": collects,
"bookmark-of": collects,
"mention-of": comments,
"rsvp": comments
};
json.children.forEach(function(c) {
var store = mapping[c['wm-property']];
if (store) {
store.push(c);
}
});
// format the comment-type things
if (comments.length > 0 && comments !== collects) {
html += formatComments(dedupe(comments));
}
// format the other reactions
if (collects.length > 0) {
html += formatReactions(dedupe(collects));
}
container.innerHTML = html;
});
});
}());

View File

@ -0,0 +1,82 @@
/* Background */ .chroma { color: #93a1a1; background-color: #002b36 }
/* Other */ .chroma .x { color: #cb4b16 }
/* Error */ .chroma .err { }
/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; }
/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; width: auto; overflow: auto; display: block; }
/* LineHighlight */ .chroma .hl { display: block; width: 100%;background-color: #ffffcc }
/* LineNumbersTable */ .chroma .lnt { margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #495050 }
/* LineNumbers */ .chroma .ln { margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #495050 }
/* Keyword */ .chroma .k { color: #719e07 }
/* KeywordConstant */ .chroma .kc { color: #cb4b16 }
/* KeywordDeclaration */ .chroma .kd { color: #268bd2 }
/* KeywordNamespace */ .chroma .kn { color: #719e07 }
/* KeywordPseudo */ .chroma .kp { color: #719e07 }
/* KeywordReserved */ .chroma .kr { color: #268bd2 }
/* KeywordType */ .chroma .kt { color: #dc322f }
/* Name */ .chroma .n { }
/* NameAttribute */ .chroma .na { }
/* NameBuiltin */ .chroma .nb { color: #b58900 }
/* NameBuiltinPseudo */ .chroma .bp { color: #268bd2 }
/* NameClass */ .chroma .nc { color: #268bd2 }
/* NameConstant */ .chroma .no { color: #cb4b16 }
/* NameDecorator */ .chroma .nd { color: #268bd2 }
/* NameEntity */ .chroma .ni { color: #cb4b16 }
/* NameException */ .chroma .ne { color: #cb4b16 }
/* NameFunction */ .chroma .nf { color: #268bd2 }
/* NameFunctionMagic */ .chroma .fm { }
/* NameLabel */ .chroma .nl { }
/* NameNamespace */ .chroma .nn { }
/* NameOther */ .chroma .nx { }
/* NameProperty */ .chroma .py { }
/* NameTag */ .chroma .nt { color: #268bd2 }
/* NameVariable */ .chroma .nv { color: #268bd2 }
/* NameVariableClass */ .chroma .vc { }
/* NameVariableGlobal */ .chroma .vg { }
/* NameVariableInstance */ .chroma .vi { }
/* NameVariableMagic */ .chroma .vm { }
/* Literal */ .chroma .l { }
/* LiteralDate */ .chroma .ld { }
/* LiteralString */ .chroma .s { color: #2aa198 }
/* LiteralStringAffix */ .chroma .sa { color: #2aa198 }
/* LiteralStringBacktick */ .chroma .sb { color: #586e75 }
/* LiteralStringChar */ .chroma .sc { color: #2aa198 }
/* LiteralStringDelimiter */ .chroma .dl { color: #2aa198 }
/* LiteralStringDoc */ .chroma .sd { }
/* LiteralStringDouble */ .chroma .s2 { color: #2aa198 }
/* LiteralStringEscape */ .chroma .se { color: #cb4b16 }
/* LiteralStringHeredoc */ .chroma .sh { }
/* LiteralStringInterpol */ .chroma .si { color: #2aa198 }
/* LiteralStringOther */ .chroma .sx { color: #2aa198 }
/* LiteralStringRegex */ .chroma .sr { color: #dc322f }
/* LiteralStringSingle */ .chroma .s1 { color: #2aa198 }
/* LiteralStringSymbol */ .chroma .ss { color: #2aa198 }
/* LiteralNumber */ .chroma .m { color: #2aa198 }
/* LiteralNumberBin */ .chroma .mb { color: #2aa198 }
/* LiteralNumberFloat */ .chroma .mf { color: #2aa198 }
/* LiteralNumberHex */ .chroma .mh { color: #2aa198 }
/* LiteralNumberInteger */ .chroma .mi { color: #2aa198 }
/* LiteralNumberIntegerLong */ .chroma .il { color: #2aa198 }
/* LiteralNumberOct */ .chroma .mo { color: #2aa198 }
/* Operator */ .chroma .o { color: #719e07 }
/* OperatorWord */ .chroma .ow { color: #719e07 }
/* Punctuation */ .chroma .p { }
/* Comment */ .chroma .c { color: #586e75 }
/* CommentHashbang */ .chroma .ch { color: #586e75 }
/* CommentMultiline */ .chroma .cm { color: #586e75 }
/* CommentSingle */ .chroma .c1 { color: #586e75 }
/* CommentSpecial */ .chroma .cs { color: #719e07 }
/* CommentPreproc */ .chroma .cp { color: #719e07 }
/* CommentPreprocFile */ .chroma .cpf { color: #719e07 }
/* Generic */ .chroma .g { }
/* GenericDeleted */ .chroma .gd { color: #dc322f }
/* GenericEmph */ .chroma .ge { font-style: italic }
/* GenericError */ .chroma .gr { color: #dc322f; font-weight: bold }
/* GenericHeading */ .chroma .gh { color: #cb4b16 }
/* GenericInserted */ .chroma .gi { color: #719e07 }
/* GenericOutput */ .chroma .go { }
/* GenericPrompt */ .chroma .gp { }
/* GenericStrong */ .chroma .gs { font-weight: bold }
/* GenericSubheading */ .chroma .gu { color: #268bd2 }
/* GenericTraceback */ .chroma .gt { }
/* GenericUnderline */ .chroma .gl { }
/* TextWhitespace */ .chroma .w { }

View File

@ -0,0 +1,3 @@
$main-font-family: 'Iosevka Etoile', sans-serif;
$header-font-family: 'Iosevka Aile', sans-serif;

View File

@ -0,0 +1,195 @@
@charset "utf-8"
@import url('../font/iosevka-aile.css')
@import url('../font/iosevka-etoile.css')
@import url('../font/iosevka.css')
@function make-light($c)
@return scale-color($c, $lightness: 30%, $saturation: -25%)
@function make-lighter($c)
@return scale-color($c, $lightness: 60%, $saturation: -50%)
$family-sans-serif: "Iosevka Aile Web", sans-serif
$family-serif: "Iosevka Etoile Web", serif
$family-monospace: "Iosevka Web", monospace
$turquoise: #236863
$blue: #2D4471
$brown: #552500
$turquoise-light: make-light($turquoise)
$turquoise-lighter: make-lighter($turquoise)
$blue-light: make-light($blue)
$blue-lighter: make-lighter($blue)
$brown-light: make-light($brown)
$brown-lighter: make-lighter($brown)
$family-primary: $family-serif
$link: $turquoise
@import '../../node_modules/bulma/bulma.sass'
@import '_code.scss'
body
font-size: 14px
h1, h2, h3, h4, h5, h6
font-family: $family-sans-serif
color: $brown
&:before
color: $brown-lighter
a
color: inherit
h1
font-size: $size-large
&:before
content: "# "
h2, .content h2
font-size: $size-medium
&:before
content: "## "
h3, .content h3
&:before
content: "### "
h3, h4, h5, h6, .content h3, .content h4, .content h5, .content h6
font-size: $body-font-size
h5, h6, .content h5, .content h6
font-style: italic
h6, .content h6
font-weight: normal
.content
strong:before, strong:after
content: "*"
em:before, em:after
content: "_"
a
text-decoration: underline
ul
*:marker
font-weight: bold
list-style-type: "* "
ul
list-style-type: "+ "
ul
list-style-type: "- "
+mobile
&.taxonomy-list.tags-list
column-count: 2
+tablet-only
&.taxonomy-list.tags-list
column-count: 3
+desktop
&.taxonomy-list.tags-list
column-count: 4
.summary
@extend .hero
@extend .my-5
@extend .px-3
@extend .py-5
.link-summary
@extend .has-background-link-light
.note-summary
@extend .has-background-info-light
.single, .list
@extend .my-5
@extend .px-3
@extend .py-5
.site-title
@extend h1
padding-left: 0
&:before
content: none
.site-description
background-color: $white-ter
#webmentions
.comments
max-height: 20em
overflow-x: hidden
overflow-y: scroll
font-size: 80%
li
.text
color: #555
font-style: italic
text-decoration: none
.name
color: #111
h2
font-size: medium
margin: 0
padding: 0.5em
&:first-child
border-top-left-radius: 0.5em
border-top-right-radius: 0.5em
.reacts img
margin: 3px -1ex 1px 0
vertical-align: baseline
ul
list-style-type: none
margin: 0
padding: 4px
li
text-indent: -3em
padding-left: 3em
padding-bottom: 0.5em
a.reaction
position: relative
margin-right: 0
margin-right: 1ex
text-decoration: none
text-shadow: 0px 0px 3px white
img
max-height: 2em
margin-right: -1ex
border-radius: 3px
sub
font-size: 50%
.reacts a.reaction
display: inline-block
ul
@extend .menu-list
#current
font-weight: bold

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

View File

@ -0,0 +1,174 @@
[buildPlans.iosevka-mnemosyne]
family = "Iosevka"
spacing = "fixed"
serifs = "sans"
no-cv-ss = true
[buildPlans.iosevka-mnemosyne.weights.regular]
shape = 400
menu = 400
css = 400
[buildPlans.iosevka-mnemosyne.weights.bold]
shape = 700
menu = 700
css = 700
[buildPlans.iosevka-mnemosyne.slopes.upright]
angle = 0
shape = "upright"
menu = "upright"
css = "normal"
[buildPlans.iosevka-mnemosyne.slopes.italic]
angle = 9.4
shape = "italic"
menu = "italic"
css = "italic"
[buildPlans.iosevka-aile-mnemosyne]
family = "Iosevka Aile"
desc = "Sans-serif"
spacing = "quasi-proportional"
snapshotFamily = 'iosevka-aile'
snapshotFeature = '"NWID" off'
export-glyph-names = true
[buildPlans.iosevka-aile-mnemosyne.variants.design]
capital-i = "serifless"
capital-j = "serifless"
capital-k = "straight-serifless"
capital-m = "flat-bottom"
capital-w = "straight-flat-top"
a = "double-storey-serifless"
d = "toothed-serifless"
e = "flat-crossbar"
f = "flat-hook"
g = "single-storey-serifless"
i = "serifless"
j = "flat-hook-serifless"
k = "straight-serifless"
l = "serifless"
r = "compact"
t = "flat-hook"
u = "toothed"
w = "straight-flat-top"
y = "straight"
long-s = "flat-hook"
eszet = "longs-s-lig"
lower-iota = "flat-tailed"
lower-lambda = "straight-turn"
cyrl-ef = "serifless"
cyrl-capital-ka = "symmetric-connected-serifless"
cyrl-ka = "symmetric-connected-serifless"
cyrl-capital-u = "straight"
at = "fourfold"
percent = "rings-continuous-slash"
# Letterform control for U+1D670 ... U+1D6A3
[buildPlans.iosevka-aile-mnemosyne.derivingVariants.mathtt.design]
capital-i = "serifed"
capital-j = "serifless"
capital-k = "straight-serifless"
capital-m = "flat-bottom"
capital-w = "straight-flat-top"
a = "double-storey-serifless"
d = "toothed-serifless"
e = "flat-crossbar"
f = "flat-hook"
g = "single-storey-serifless"
i = "serifed"
j = "flat-hook-serifed"
k = "straight-serifless"
l = "serifed"
r = "compact"
t = "flat-hook"
u = "toothed"
w = "straight-flat-top"
y = "straight"
long-s = "flat-hook"
eszet = "longs-s-lig"
lower-iota = "flat-tailed"
lower-lambda = "straight-turn"
cyrl-ef = "serifless"
cyrl-capital-ka = "symmetric-connected-serifless"
cyrl-ka = "symmetric-connected-serifless"
cyrl-capital-u = "straight"
at = "fourfold"
percent = "rings-continuous-slash"
[buildPlans.iosevka-aile-mnemosyne.widths.normal]
shape = 600
menu = 5
css = "normal"
[buildPlans.iosevka-aile-mnemosyne.weights.regular]
shape = 400
menu = 400
css = 400
[buildPlans.iosevka-aile-mnemosyne.weights.bold]
shape = 700
menu = 700
css = 700
[buildPlans.iosevka-aile-mnemosyne.slopes.upright]
angle = 0
shape = "upright"
menu = "upright"
css = "normal"
[buildPlans.iosevka-aile-mnemosyne.slopes.italic]
angle = 9.4
shape = "italic"
menu = "italic"
css = "italic"
[buildPlans.iosevka-etoile-mnemosyne]
family = "Iosevka Etoile"
desc = "Slab-serif"
spacing = "quasi-proportional"
serifs = 'slab'
snapshotFamily = 'iosevka-etoile'
snapshotFeature = '"NWID" off'
export-glyph-names = true
[buildPlans.iosevka-etoile-mnemosyne.variants.design]
at = 'fourfold'
capital-w = 'straight-flat-top'
f = "flat-hook-serifed"
j = 'flat-hook-serifed'
t = "flat-hook"
w = 'straight-flat-top'
[buildPlans.iosevka-etoile-mnemosyne.variants.italic]
f = "flat-hook-tailed"
[buildPlans.iosevka-etoile-mnemosyne.widths.normal]
shape = 600
menu = 5
css = "normal"
[buildPlans.iosevka-etoile-mnemosyne.weights.regular]
shape = 400
menu = 400
css = 400
[buildPlans.iosevka-etoile-mnemosyne.weights.bold]
shape = 700
menu = 700
css = 700
[buildPlans.iosevka-etoile-mnemosyne.slopes.upright]
angle = 0
shape = "upright"
menu = "upright"
css = "normal"
[buildPlans.iosevka-etoile-mnemosyne.slopes.italic]
angle = 9.4
shape = "italic"
menu = "italic"
css = "italic"

View File

@ -0,0 +1,26 @@
{{ define "main" }}
<section class="hero is-warning is-medium">
<div class="hero-body">
<div class="container">
<div class="columns">
<main class="column is-8 is-offset-2">
<p class="title">
Page not found
</p>
<div class="content">
<p>
You could:
</p>
<ul>
<li><a href="{{ "/" | relURL }}">Go back to the home page</a></li>
<li><a href="{{ "/tags/" | relURL }}">Take a look at the list of tags</a></li>
<li><a href="https://duckduckgo.com">Try searching for what you're looking for</a></li>
</ul>
</div>
</main>
</div>
</div>
</div>
</section>
{{ end }}

View File

@ -0,0 +1,32 @@
<!DOCTYPE html>
<html lang="{{ .Site.LanguageCode | default "en-us" }}">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>{{ .Title }}</title>
{{ .Scratch.Set "desc" slice }}
{{ with .Site.Params.description }}{{ $.Scratch.Add "desc" (slice .) }}{{ end }}
{{ with .Site.Params.topics }}{{ $.Scratch.Add "desc" (slice (delimit . " & ")) }}{{ end }}
{{ if gt (len (.Scratch.Get "desc")) 0 }}
<meta name="description" content="{{ delimit (.Scratch.Get "desc") " " }}">
{{ end }}
{{ with .Site.Params.author }}<meta name="author" content="{{ . }}">{{ end }}
{{ $style := resources.Get "style/main.sass" | resources.ToCSS }}
<link rel="stylesheet" href="{{ $style.RelPermalink }}">
{{ with .Site.Params.comments.webmention }}<link rel="webmention" href="{{ . }}" />{{ end }}
{{ with .Site.Params.comments.pingback }}<link rel="pingback" href="{{ . }}" />{{ end }}
{{ if .Site.Params.comments.cactus }}<link rel="stylesheet" href="https://latest.cactus.chat/style.css" type="text/css">{{ end }}
{{ with .OutputFormats.Get "RSS" -}}
{{ printf `<link rel="%s" type="%s" href="%s" title="%s">` .Rel .MediaType.Type .RelPermalink $.Site.Title | safeHTML }}
{{- end }}
</head>
<body>
{{ partial "header" . }}
{{ block "main" . }}{{ end }}
{{ partial "footer" . }}
{{ partial "scripts" . }}
</body>
</html>

View File

@ -0,0 +1,7 @@
{{ partial "status" . }}
<div class="page-date">
<strong>Date:</strong>
<time>{{ .Date.Format .Site.Params.DateFormat }}</time>
</div>
{{ partial "series.html" .Params.series }}
{{ partial "tags.html" .Params.tags }}

View File

@ -0,0 +1,4 @@
{{ .Summary }}
{{ if .Truncated }}
<a href="{{ .RelPermalink }}">Read more...</a>
{{ end }}

View File

@ -0,0 +1 @@
[{{ .Type | upper }}] {{ .Title }}

View File

@ -0,0 +1,6 @@
<li>
{{ .Date.Format .Site.Params.DateFormat }}:
<a href="{{ .RelPermalink }}">
{{ .Title }}
</a>
</li>

View File

@ -0,0 +1,25 @@
{{ define "main" }}
<main class="list">
<div class="container">
{{ if or .Title .Content }}
<div class="columns">
<div class="column is-8 is-offset-2">
{{ with .Title }}<h1 class="mb-5">{{ . }}</h1>{{ end }}
{{ with .Content }}<div class="content">{{ . }}<hr /></div>{{ end }}
</div>
</div>
{{ end }}
<div class="columns mb-6">
<div class="column is-8 is-offset-2 content">
<ul class="list {{ .Kind }}-list{{ with .Data.Plural }} {{.}}-list{{ end }}">
{{ $sort_field := "Date" }}
{{ if eq .Kind "taxonomy" }}{{ $sort_field = "Title" }}{{ end }}
{{ range sort .Pages $sort_field "asc" }}
{{ .Render "li" }}
{{ end }}
</ul>
</div>
</div>
</div>
</main>
{{ end }}

View File

@ -0,0 +1,24 @@
{{ define "main" }}
<main class="single">
<article class="container">
<div class="columns">
<div class="column is-8 is-offset-2">
<h1>{{ .Render "frag/title" }}</h1>
</div>
</div>
<div class="columns">
<div class="column is-2">
{{ .Render "frag/metadata" }}
</div>
<div class="column is-8">
{{ partial "series-items" . }}
{{ partial "toc" . }}
<div class="content">
{{ .Content }}
</div>
</div>
</div>
{{ partial "comments" . }}
</article>
</main>
{{ end }}

View File

@ -0,0 +1,20 @@
<article class="summary {{ .Type }}-summary">
<div class="container">
{{ if ne .Type "note" }}
<div class="columns">
<div class="column is-8 is-offset-2">
<h2><a href="{{ with .Params.link }}{{.}}{{ else }}{{ .RelPermalink }}{{ end }}">
{{ .Render "frag/title" }}</a></h2>
</div>
</div>
{{ end }}
<div class="columns">
<div class="column is-2">
{{ .Render "frag/metadata" }}
</div>
<div class="column is-8 content">
{{ .Render "frag/summary-content" }}
</div>
</div>
</div>
</article>

View File

@ -0,0 +1,28 @@
{{ define "main" }}
<section class="hero px-3 site-description">
<div class="hero-body">
<div class="container">
<div class="columns">
<div class="column is-8 is-offset-2">
{{ with .Site.Params.Description }}{{.}}{{ end }}
{{ with .Site.Params.Topics }}
{{ $last := sub (len .) 1 }}
{{ range $i, $x := . }}
<a href="/tags/{{ $x | urlize }}/">{{ $x }}</a>
{{ if lt $i $last }}<span class="ampersand">&</span>{{ end }}
{{ end }}
{{ end }}
</div>
</div>
</div>
</div>
</section>
<main class="mt-6">
{{ $paginator := .Paginate (where .Site.RegularPages "Type" "in" .Site.Params.mainSections) }}
{{ range $paginator.Pages }}
{{ .Render "summary" }}
{{ end }}
{{ partial "pagination" . }}
</main>
{{ end }}

View File

@ -0,0 +1,4 @@
{{ .Content }}
<p>
<a href="{{ .Params.link }}">&gt;&gt;&gt;</a>
</p>

View File

@ -0,0 +1 @@
{{ .Content }}

View File

@ -0,0 +1,2 @@
{{ partial "status" . }}
{{ partial "tags" .Params.tags }}

View File

@ -0,0 +1 @@
{{ .Title }}

View File

@ -0,0 +1,13 @@
<div class="container">
<div class="columns">
<div class="column is-8 is-offset-2">
{{ partial "comments/webmention" . }}
{{ partial "comments/cactus" . }}
{{ with .Site.DisqusShortname }}
<div>
{{ template "_internal/disqus.html" . }}
</div>
{{ end }}
</div>
</div>
</div>

View File

@ -0,0 +1,10 @@
{{ if .Site.Params.comments.cactus }}
<hr />
<div class="content">
<h2>Comments</h2>
</div>
<div id="cactus-comments"></div>
<p>
<em>Powered by <a href="https://cactus.chat/">Cactus Comments 🌵</a></em>
</p>
{{ end }}

View File

@ -0,0 +1,17 @@
{{ if .Site.Params.comments.webmention }}
<hr />
<div class="content">
<h2>Webmentions</h2>
<p>
You can respond to this post, <a href="{{ .Permalink }}">"{{ .Title }}"</a>, by:
liking, boosting or replying to a tweet or <a href="https://joinmastodon.org/">toot</a> that mentions it; or
sending a <a href="https://indieweb.org/Webmention">webmention</a> from your own site to <code>{{ .Permalink }}</code>
</p>
</div>
<div id="webmentions">
Comments &amp; reactions haven't loaded yet. You might have JavaScript disabled but that's cool 😎.
</div>
{{ end }}

View File

@ -0,0 +1,26 @@
<div class="footer">
<div class="container">
<div class="columns">
<footer class="column is-8 is-offset-2 has-text-centered">
{{ partial "social" . }}
<p>
&copy; {{ now.Year }}
<a href="{{ .Site.BaseURL }}">{{ .Site.Params.Author }}</a>
| Built by: <a href="https://gohugo.com/">Hugo</a>
| Theme: <a href="https://tildegit.org/petrichor/theme-mnemosyne-hugo">Mnemosyne</a>
</p>
{{ with .Site.Params.netlify }}
<p class="mt-4">
<a href="https://app.netlify.com/sites/{{.name}}/deploys">
Build status: <img src="https://api.netlify.com/api/v1/badges/{{.id}}/deploy-status">
</a>
</p>
{{ end }}
{{ with .Site.Copyright | safeHTML }}
<hr />
<p>{{.}}</p>
{{ end }}
</footer>
</div>
</div>
</div>

View File

@ -0,0 +1,29 @@
<div class="container p-3">
<div class="columns">
<div class="column is-8 is-offset-2">
<nav class="navbar" role="navigation" aria-label="main navigation">
<div class="navbar-brand">
{{- if .IsHome -}}<h1 class="site-title navbar-item">{{- else -}}<div class="site-title navbar-item">{{- end -}}
<a href="{{ .Site.BaseURL }}">{{ .Site.Title }}</a>
{{- if .IsHome -}}</h1>{{- else -}}</div>{{- end -}}
<a role="button" class="navbar-burger" aria-label="menu" aria-expanded="false" data-target="nav-menu">
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
</a>
</div>
{{ with .Site.Menus.main }}
<div class="navbar-menu" id="nav-menu">
<div class="navbar-end">
{{ range . }}
<a class="navbar-item" href="{{ .URL | relURL }}">{{ .Name }}</a>
{{ end }}
</div>
</div>
{{ end }}
</nav>
</div>
</div>
</div>

View File

@ -0,0 +1,11 @@
<footer class="columns mb-3">
<div class="column is-8 is-offset-2 has-text-centered">
{{ if .Paginator.HasPrev }}
<a href="{{ .Paginator.Prev.URL }}">Previous Page</a>
{{ end }}
{{ .Paginator.PageNumber }} of {{ .Paginator.TotalPages }}
{{ if .Paginator.HasNext }}
<a href="{{ .Paginator.Next.URL }}">Next Page</a>
{{ end }}
</div>
</footer>

View File

@ -0,0 +1,19 @@
<script type="text/javascript" src="/js/navbar.js"></script>
{{ if .File }}
{{ $page_id := .File.BaseFileName }}
{{ if .Site.Params.comments.webmention }}
{{ $webmention_js := resources.Get "js/webmention.js" | minify }}
<script src="{{ $webmention_js.RelPermalink }}"
data-page-url="{{ .Permalink }}"
async></script>
{{ end }}
{{ with .Site.Params.comments.cactus }}
<script type="text/javascript" src="https://latest.cactus.chat/cactus.js"
data-default-homeserver-url="https://matrix.cactus.chat:8448"
data-server-name="cactus.chat"
data-site-name="{{ . }}"
data-node="#cactus-comments"
data-comment-section-id="{{ $page_id }}"></script>
{{ end }}
{{ end }}

View File

@ -0,0 +1,27 @@
{{ $page := . }}
{{ with .Params.series }}
{{ $series := (site.GetPage "/series").GetPage . }}
<div class="card mb-5">
<header class="card-header has-background-primary has-text-white">
<p class="card-header-title has-text-white">
Series
</p>
</header>
<div class="card-content content is-size-7">
{{ with $series.Params.on }}
<p>This post is part of <a href="{{ $series.RelPermalink }}">a series on {{.}}</a>.</p>
{{ else }}
<p>This post is part of the series <a href="{{ $series.RelPermalink }}" class="has-text-white">{{ $series.Title }}</a></p>
{{ end }}
<ul>
{{ range $series.Pages }}
<li>
{{ if ne . $page }}<a href="{{ .RelPermalink }}">{{ else }}<span id="current">&gt; {{ end }}
{{ .Title }}
{{ if ne . $page }}</a>{{ else }} &lt;</span>{{ end }}
</li>
{{ end }}
</ul>
</div>
</div>
{{ end }}

View File

@ -0,0 +1,7 @@
{{ with . }}
{{ $series := (site.GetPage "/series").GetPage . }}
<div>
<strong>Series:</strong>
<a href="{{ $series.RelPermalink }}">{{ $series.Title }}</a>
</div>
{{ end }}

View File

@ -0,0 +1,14 @@
<aside>
<div>
<div>
<h3>LATEST POSTS</h3>
</div>
<div>
<ul>
{{ range first 5 (where .Site.RegularPages "Type" "in" .Site.Params.mainSections) }}
<li><a href="{{ .RelPermalink }}">{{ .Title }}</a></li>
{{ end }}
</ul>
</div>
</div>
</aside>

View File

@ -0,0 +1,34 @@
{{ with .Site.Params.Social }}
<p>
me elsewhere ::
{{ $last := sub (len .) 1 }}
{{ range $i, $x := . }}
{{ $url := $x.info }}
{{ $text := $x.kind }}
{{ if eq $x.kind "github" }}
{{ $url = printf "https://github.com/%s" $x.info }}
{{ else if eq $x.kind "gitlab" }}
{{ $url = printf "https://gitlab.com/%s" $x.info }}
{{ else if eq $x.kind "linkedin" }}
{{ $url = printf "https://linkedin.com/in/%s" $x.info }}
{{ else if eq $x.kind "twitter" }}
{{ $url = printf "https://twitter.com/%s" $x.info }}
{{ else if eq $x.kind "mastodon" }}
{{ $url = printf "https://%s/@%s" (index $x.info 1) (index $x.info 0) }}
{{ else if eq $x.kind "orcid" }}
{{ $url = printf "https://orcid.org/%s" $x.info }}
{{ else if eq $x.kind "keybase" }}
{{ $url = printf "https://keybase.io/%s" $x.info }}
{{ else if eq $x.kind "keyoxide" }}
{{ $url = printf "https://keyoxide.org/%s" $x.info }}
{{ else if eq $x.kind "matrix" }}
{{ $url = printf "https://matrix.to/#/%s" $x.info }}
{{ else if eq $x.kind "pypi" }}
{{ $url = printf "https://pypi.org/user/%s" $x.info }}
{{ end }}
<a href="{{$url}}" rel="me">{{$text}}</a>
{{ if ne $i $last }}|{{ end }}
{{ end }}
</p>
<hr />
{{ end }}

View File

@ -0,0 +1 @@
{{ if .Params.draft }}<div><strong>Status:</strong> DRAFT ✏️</div>{{ end }}

View File

@ -0,0 +1,8 @@
<div class="page-tags">
<strong>Tags:</strong>
{{ range . }}
<a href="{{ "/tags/" | relLangURL }}{{ . | urlize }}">[{{ . }}]</a>
{{ else }}
<em>None</em>
{{ end }}
</div>

View File

@ -0,0 +1,10 @@
{{ if .Params.ShowTOC }}
<div class="card mb-5">
<div class="card-header has-background-light">
<p class="card-header-title">Contents</p>
</div>
<div class="card-content content is-size-7">
{{ .TableOfContents }}
</div>
</div>
{{ end }}

View File

@ -0,0 +1 @@
{{ .Title }}

View File

@ -0,0 +1,4 @@
<li>
<a href="{{ .RelPermalink }}">{{ .Title }} ({{ .Data.series | len }} posts)</a>
{{- with .Params.summary }}: {{.}}{{ end }}
</li>

View File

@ -0,0 +1,10 @@
<div class="card mb-5">
<header class="card-header{{ with .Get 1 }} has-background-{{.}} has-text-white{{ end }}">
<p class="card-header-title">
{{ .Get 0 | title }}
</p>
</header>
<div class="card-content content">
{{ .Inner | markdownify }}
</div>
</div>

View File

@ -0,0 +1,5 @@
<li>
<a href="{{ .RelPermalink }}">
{{ .Title }}
</a>
</li>

View File

@ -0,0 +1,5 @@
{
"dependencies": {
"bulma": "^0.9.2"
}
}

View File

View File

@ -0,0 +1,36 @@
@font-face {
font-family: 'Iosevka Aile Web';
font-display: swap;
font-weight: 400;
font-stretch: normal;
font-style: normal;
src: url('woff2/iosevka-aile-mnemosyne-regular.woff2') format('woff2'), url('ttf/iosevka-aile-mnemosyne-regular.ttf') format('truetype');
}
@font-face {
font-family: 'Iosevka Aile Web';
font-display: swap;
font-weight: 400;
font-stretch: normal;
font-style: italic;
src: url('woff2/iosevka-aile-mnemosyne-italic.woff2') format('woff2'), url('ttf/iosevka-aile-mnemosyne-italic.ttf') format('truetype');
}
@font-face {
font-family: 'Iosevka Aile Web';
font-display: swap;
font-weight: 700;
font-stretch: normal;
font-style: normal;
src: url('woff2/iosevka-aile-mnemosyne-bold.woff2') format('woff2'), url('ttf/iosevka-aile-mnemosyne-bold.ttf') format('truetype');
}
@font-face {
font-family: 'Iosevka Aile Web';
font-display: swap;
font-weight: 700;
font-stretch: normal;
font-style: italic;
src: url('woff2/iosevka-aile-mnemosyne-bolditalic.woff2') format('woff2'), url('ttf/iosevka-aile-mnemosyne-bolditalic.ttf') format('truetype');
}

View File

@ -0,0 +1,36 @@
@font-face {
font-family: 'Iosevka Etoile Web';
font-display: swap;
font-weight: 400;
font-stretch: normal;
font-style: normal;
src: url('woff2/iosevka-etoile-mnemosyne-regular.woff2') format('woff2'), url('ttf/iosevka-etoile-mnemosyne-regular.ttf') format('truetype');
}
@font-face {
font-family: 'Iosevka Etoile Web';
font-display: swap;
font-weight: 400;
font-stretch: normal;
font-style: italic;
src: url('woff2/iosevka-etoile-mnemosyne-italic.woff2') format('woff2'), url('ttf/iosevka-etoile-mnemosyne-italic.ttf') format('truetype');
}
@font-face {
font-family: 'Iosevka Etoile Web';
font-display: swap;
font-weight: 700;
font-stretch: normal;
font-style: normal;
src: url('woff2/iosevka-etoile-mnemosyne-bold.woff2') format('woff2'), url('ttf/iosevka-etoile-mnemosyne-bold.ttf') format('truetype');
}
@font-face {
font-family: 'Iosevka Etoile Web';
font-display: swap;
font-weight: 700;
font-stretch: normal;
font-style: italic;
src: url('woff2/iosevka-etoile-mnemosyne-bolditalic.woff2') format('woff2'), url('ttf/iosevka-etoile-mnemosyne-bolditalic.ttf') format('truetype');
}

View File

@ -0,0 +1,72 @@
@font-face {
font-family: 'Iosevka Web';
font-display: swap;
font-weight: 400;
font-stretch: normal;
font-style: normal;
src: url('woff2/iosevka-mnemosyne-regular.woff2') format('woff2'), url('ttf/iosevka-mnemosyne-regular.ttf') format('truetype');
}
@font-face {
font-family: 'Iosevka Web';
font-display: swap;
font-weight: 400;
font-stretch: expanded;
font-style: normal;
src: url('woff2/iosevka-mnemosyne-extended.woff2') format('woff2'), url('ttf/iosevka-mnemosyne-extended.ttf') format('truetype');
}
@font-face {
font-family: 'Iosevka Web';
font-display: swap;
font-weight: 400;
font-stretch: normal;
font-style: italic;
src: url('woff2/iosevka-mnemosyne-italic.woff2') format('woff2'), url('ttf/iosevka-mnemosyne-italic.ttf') format('truetype');
}
@font-face {
font-family: 'Iosevka Web';
font-display: swap;
font-weight: 400;
font-stretch: expanded;
font-style: italic;
src: url('woff2/iosevka-mnemosyne-extendeditalic.woff2') format('woff2'), url('ttf/iosevka-mnemosyne-extendeditalic.ttf') format('truetype');
}
@font-face {
font-family: 'Iosevka Web';
font-display: swap;
font-weight: 700;
font-stretch: normal;
font-style: normal;
src: url('woff2/iosevka-mnemosyne-bold.woff2') format('woff2'), url('ttf/iosevka-mnemosyne-bold.ttf') format('truetype');
}
@font-face {
font-family: 'Iosevka Web';
font-display: swap;
font-weight: 700;
font-stretch: expanded;
font-style: normal;
src: url('woff2/iosevka-mnemosyne-extendedbold.woff2') format('woff2'), url('ttf/iosevka-mnemosyne-extendedbold.ttf') format('truetype');
}
@font-face {
font-family: 'Iosevka Web';
font-display: swap;
font-weight: 700;
font-stretch: normal;
font-style: italic;
src: url('woff2/iosevka-mnemosyne-bolditalic.woff2') format('woff2'), url('ttf/iosevka-mnemosyne-bolditalic.ttf') format('truetype');
}
@font-face {
font-family: 'Iosevka Web';
font-display: swap;
font-weight: 700;
font-stretch: expanded;
font-style: italic;
src: url('woff2/iosevka-mnemosyne-extendedbolditalic.woff2') format('woff2'), url('ttf/iosevka-mnemosyne-extendedbolditalic.ttf') format('truetype');
}

View File

@ -0,0 +1,25 @@
document.addEventListener('DOMContentLoaded', () => {
// Get all "navbar-burger" elements
const $navbarBurgers = Array.prototype.slice.call(document.querySelectorAll('.navbar-burger'), 0);
// Check if there are any navbar burgers
if ($navbarBurgers.length > 0) {
// Add a click event on each of them
$navbarBurgers.forEach( el => {
el.addEventListener('click', () => {
// Get the target from the "data-target" attribute
const target = el.dataset.target;
const $target = document.getElementById(target);
// Toggle the "is-active" class on both the "navbar-burger" and the "navbar-menu"
el.classList.toggle('is-active');
$target.classList.toggle('is-active');
});
});
}
});

View File

@ -0,0 +1,12 @@
name = "Blank"
license = "MIT"
licenselink = "https://github.com/vimux/blank/blob/master/LICENSE"
description = "Starter Hugo theme for developers."
homepage = "https://github.com/vimux/blank/"
tags = ["blog", "plain", "blank", "starter", "development"]
features = ["blog"]
min_version = "0.20"
[author]
name = "Vimux"
homepage = "https://github.com/vimux"

View File

@ -0,0 +1,8 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
bulma@^0.9.2:
version "0.9.2"
resolved "https://registry.yarnpkg.com/bulma/-/bulma-0.9.2.tgz#340011e119c605f19b8ca886bfea595f1deaf23c"
integrity sha512-e14EF+3VSZ488yL/lJH0tR8mFWiEQVCMi/BQUMi2TGMBOk+zrDg4wryuwm/+dRSHJw0gMawp2tsW7X1JYUCE3A==