convert into Hugo module theme

This commit is contained in:
Ben Goldsworthy 2025-01-04 20:22:41 +01:00
parent b07a2a6cf5
commit 04abc92ae5
Signed by: Rumperuu
SSH key fingerprint: SHA256:e5XfzNOr9UvWpEzyLfw0GtTMZWIFh3NmxH+/qQIi3xE
98 changed files with 2137 additions and 15971 deletions

19
.gitignore vendored
View file

@ -1,19 +0,0 @@
# ---> Hugo
# Generated files by hugo
/public/
/resources/_gen/
/assets/jsconfig.json
hugo_stats.json
# Executable may be added to repository
hugo.exe
hugo.darwin
hugo.linux
# Temporary lock file while building
/.hugo_build.lock
# TEMP - until I figure out licensing
/js/
/css/openlayers.css
/css/leaflet.css

View file

@ -0,0 +1,13 @@
@mixin mq($width, $type: min) {
@if map_has_key($breakpoints, $width) {
$width: map_get($breakpoints, $width);
@if $type == max {
$width: $width - 1px;
}
@media only screen and (#{$type}-width: $width) {
@content;
}
}
}

View file

@ -0,0 +1,20 @@
// Colours
$dark: #020202;
$light: #fffff0;
// Fonts
$default-font: "Domitian", "Palatino Linotype", "Book Antiqua", palatino,
garamond, serif;
$code-font: "Input Mono", "Lucida Console", monaco, monospace;
// Breakpoints
$breakpoints: (
"small": 480px,
"medium": 768px,
"large": 1248px,
);
// Old Site Versions
$ohwhatohjeez: #ff8900;
$oldphaloskepsis: #003d52;
$omphaloskepsis: #fffff0;

View file

@ -0,0 +1,352 @@
/*
* Fonts
*/
/*
* Commented out until I decide to buy a licence for Input Mono.
*
* @font-face {
* font-family: "Input Mono";
* src: url(/fonts/InputMono-Regular.ttf);
* }
*/
@font-face {
font-family: Domitian;
src: url("/fonts/Domitian-Roman.woff2") format("woff2");
}
@font-face {
font-family: Domitian;
src: url("/fonts/Domitian-Bold.woff2") format("woff2");
font-weight: bold;
}
@font-face {
font-family: Domitian;
src: url("/fonts/Domitian-Italic.woff2") format("woff2");
font-style: italic;
}
@font-face {
font-family: Domitian;
src: url("/fonts/Domitian-BoldItalic.woff2") format("woff2");
font-weight: bold;
font-style: italic;
}
/*
* Base
*/
html {
font-size: 16px;
color: $dark;
background-color: $light;
font-family: $default-font;
font-variant-numeric: 'oldstyle-nums slashed-zero';
writing-mode: horizontal-tb;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-weight: normal;
margin: 0;
}
a {
text-decoration-skip-ink: auto;
color: $dark;
text-decoration: underline;
opacity: 0.8;
&:hover {
text-decoration: none;
opacity: 1;
}
}
/*
* Quotations
*/
q:lang(en) {
quotes: "" "" "" "";
}
/*
* Citations
*/
// Legacy citations
cite,
cite.book,
cite.film,
cite.tv-show,
cite.comic,
cite.podcast,
cite.album,
cite.report {
font-style: italic;
}
cite.book--proper-noun {
font-style: inherit;
}
cite.legislation,
cite.smallcite,
cite.comic-strip,
cite.short-story,
cite.article,
cite.episode,
cite.video,
cite.chapter,
cite.poem,
cite.software,
cite.website,
cite.campaign,
cite.song,
cite.speech,
cite.course,
cite.presentation {
font-style: normal;
}
cite.smallcite::before,
cite.article::before,
cite.comic-strip::before,
cite.short-story::before,
cite.episode::before,
cite.video::before,
cite.chapter::before,
cite.song::before,
cite.poem::before,
cite.campaign::before,
cite.speech::before,
cite.course::before,
cite.presentation::before {
content: "";
}
cite.smallcite::after,
cite.article::after,
cite.comic-strip::after,
cite.short-story::after,
cite.episode::after,
cite.video::after,
cite.chapter::after,
cite.song::after,
cite.poem::after,
cite.campaign::after,
cite.speech::after,
cite.course::after,
cite.presentation::after {
content: "";
}
cite.article--shortcite::before,
cite.article--shortcite::after {
content: none;
}
// Schema.org citations
cite,
.cite {
font-style: italic;
&[itemtype$="Code"],
&[itemtype$="SocialMediaPosting"],
&[itemtype$="SoftwareApplication"],
&[itemtype$="WebApplication"],
&[itemtype$="MobileApplication"],
&[itemtype$="WebSite"],
&[itemtype$="WebContent"],
&[itemtype$="Comment"],
&[itemtype$="Statement"],
&[itemtype$="CreativeWorkSeason"],
&[itemtype$="PodcastSeason"],
&[itemtype$="RadioSeason"],
&[itemtype$="TVSeason"],
&[itemtype$="CreativeWorkSeries"],
&[itemtype$="BookSeries"],
&[itemtype$="MovieSeries"],
&[itemtype$="VideoGameSeries"],
&[itemtype$="Legislation"],
&--inherit {
font-style: inherit;
}
&[itemtype$="Article"],
&[itemtype$="BlogPosting"],
&[itemtype$="NewsArticle"],
&[itemtype$="AnalysisNewsArticle"],
&[itemtype$="ReportageNewsArticle"],
&[itemtype$="OpinionNewsArticle"],
&[itemtype$="ScholarlyArticle"],
&[itemtype$="TechArticle"],
&[itemtype$="Event"],
&[itemtype$="Chapter"],
&[itemtype$="Clip"],
&[itemtype$="MovieClip"],
&[itemtype$="RadioClip"],
&[itemtype$="TVClip"],
&[itemtype$="VideoGameClip"],
&[itemtype$="Course"],
&[itemtype$="DigitalDocument"],
&[itemtype$="NoteDigitalDocument"],
&[itemtype$="PresentationDigitalDocument"],
&[itemtype$="TextDigitalDocument"],
&[itemtype$="Episode"],
&[itemtype$="PodcastEpisode"],
&[itemtype$="RadioEpisode"],
&[itemtype$="TVEpisode"],
&[itemtype$="MusicRecording"],
&[itemtype$="MusicComposition"],
&[itemtype$="Message"],
&--enquote {
font-style: inherit;
&::before {
content: "";
}
&::after {
content: "";
}
}
&--normal {
font-style: normal !important;
&::before {
content: none !important;
}
&::after {
content: none !important;
}
}
}
/*
* Code
*/
pre {
padding-inline-start: 1em;
border-inline-start: 2px outset $dark;
display: inline-block;
overflow: hidden;
max-inline-size: 80%;
overflow: scroll;
@include mq("large") {
margin-block: 1em;
margin-inline: 2em;
}
}
code,
samp,
var,
pre {
font-family: $code-font;
font-size: 1em;
}
code,
samp,
var {
background-color: #d1d1d1;
border-radius: 5px;
padding: 2px;
}
samp {
display: block;
inline-size: 80ch;
margin-block: 1em;
margin-inline: 4em;
border-inline-start: 2px solid #ccc;
color: #333;
}
h1 code,
pre code,
pre samp,
pre var,
h1 samp,
h1 var,
.post-title code,
.post-title samp,
.post-title var {
background-color: transparent;
padding: 0;
}
.heading code,
.subheading code {
background-color: transparent;
}
// Source: Stack Overflow Stylesheet
kbd {
padding-block: 0.1em;
padding-inline: 0.6em;
border: 1px solid #ccc;
font-size: 11px;
font-family: Arial, Helvetica, sans-serif;
background-color: #f7f7f7;
color: #333;
box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 2px white inset;
border-radius: 3px;
display: inline-block;
margin-block: 0;
margin-inline: 0.1em;
text-shadow: 0 1px 0 white;
line-height: 1.4;
white-space: nowrap;
}
/*
* Special Text
*/
.pre-nominals,
.post-nominals {
font-size: 0.6em;
font-variant: small-caps;
}
.sic::after {
content: " [sic]";
font-style: italic;
}
.latex {
display: inline !important;
}
.MathJax {
font-size: 1em !important;
}
:where([title]) {
text-decoration: underline;
text-decoration: underline dotted;
&:not(a *) {
cursor: help;
}
}
dfn {
font-variant: small-caps;
}

View file

View file

@ -0,0 +1,81 @@
.blockquote {
padding-inline-start: 1em;
border-inline-start: 2px outset $dark;
display: inline-block;
max-inline-size: 85%;
@media only screen and (min-width: 1024px) {
margin-block: 0.5em;
margin-inline: 1em;
}
&__body {
& p:first-child {
margin-block-start: 0;
}
& p:last-of-type {
margin-block-end: 0.5em;
}
}
&__caption {
display: none;
text-align: end;
font-style: normal;
margin-inline-start: 5em;
inline-size: 80%;
orphans: 3;
&::before {
content: "";
}
}
&--epigram {
font-size: 1.1em;
text-align: center;
display: block;
margin-block: 0;
margin-inline: auto;
border-inline-start: 0;
padding-inline-start: 0;
inline-size: 100%;
padding-block-start: 1em;
padding-block-end: 1.2em;
border-block-start: 2px outset $dark;
border-block-end: 2px inset $dark;
& .blockquote {
&__caption {
display: block;
}
}
}
&--script {
& .blockquote__body {
display: grid;
grid-template-columns: auto 1fr 0.2fr;
padding-block-end: 0.4em;
text-align: start;
& > p::before,
& > p::after {
content: none !important;
}
& > .script-line__character {
margin-inline: 2em 0.5em;
margin-block: 0.5em;
font-style: italic;
}
& > .script-line__text {
grid-column-start: 2;
grid-column-end: 4;
margin: 0.5em;
}
}
}
}

View file

@ -0,0 +1,17 @@
.label--button {
cursor: pointer;
display: block;
inline-size: fit-content;
margin-inline: auto;
}
.button {
border: 2px solid $dark;
background-color: $light;
padding: 0.4em 1em;
cursor: pointer;
&:hover {
box-shadow: 2px 2px gray;
}
}

View file

@ -0,0 +1,22 @@
.chart-container {
position: relative;
margin-inline: auto;
block-size: 50vh;
inline-size: 95vw;
display: flex;
justify-content: center;
@media (orientation: landscape) {
block-size: 75vh;
inline-size: 95vw;
}
@include mq("large") {
block-size: 50vh;
inline-size: 50vw;
}
& + .chart-container {
margin-block-start: 1em;
}
}

View file

@ -0,0 +1,35 @@
.comment {
&__header {
}
&__author {
display: inline;
font-weight: bold;
margin-inline-end: 0.5em;
}
&__publish-date {
display: inline;
font-style: italic;
}
&__source {
font-style: italic;
font-size: 0.8em;
}
&__subheading {
font-weight: bold;
margin-block-end: 1em;
margin-block-start: 1em;
}
&__thread,
&__subthread {
list-style: none;
margin-block-start: 1em;
padding-inline-start: 1em;
border-inline-start: 1px dotted $dark;
margin-inline-start: 0;
}
}

View file

@ -0,0 +1,5 @@
details {
& summary {
cursor: pointer;
}
}

View file

@ -0,0 +1,55 @@
.figure {
inline-size: fit-content;
margin: 16px auto;
&__caption {
block-size: auto;
margin: auto;
text-align: center;
&--no-height {
height: 0;
}
& .figcaption {
&__caption {
font-size: 0.9em;
font-style: italic;
}
&__title {
font-size: 0.95em;
font-weight: bold;
}
&__attr {
background-color: $dark;
font-size: 0.7em;
color: $light;
inline-size: fit-content;
inset-block-start: -2em;
position: relative;
padding: 0.2em 0.5em;
opacity: 0.8;
margin: 0 auto;
}
&__attr + .figcaption__caption {
margin-block-start: -0.5em;
}
&__full-size-link {
font-size: 0.6em;
padding-inline-start: 1em;
&::before {
content: "[";
}
&::after {
content: "]";
}
}
}
}
}

View file

@ -0,0 +1,12 @@
.gallery {
display: grid;
grid-gap: 10px;
grid-template-columns: repeat(auto-fill, minmax(20%, 1fr));
grid-template-rows: 1fr auto;
overflow-inline: scroll;
&__caption {
grid-column-end: -1;
grid-column-start: 1;
}
}

View file

@ -0,0 +1,10 @@
.feed-icon {
display: inline-block;
block-size: 1em;
inline-size: 1em;
margin-block-end: 0.2em;
}
.site-header__icons a {
text-decoration: none;
}

View file

@ -0,0 +1,109 @@
.link--tile {
text-decoration: none;
box-sizing: border-box;
border: 2px solid transparent;
&:hover {
border-color: $dark;
}
}
.site-container--section .item-tile.lazy {
background-image: none !important;
}
.item-tile {
display: grid;
min-block-size: 180px;
grid-template-columns: 5% auto 5%;
grid-template-rows: 2.5% auto 2.5%;
grid-template-areas:
". . ."
". tile-details ."
". . .";
background-size: cover;
background-repeat: no-repeat;
background-position: center;
word-break: break-word;
@media (prefers-reduced-data: reduce) {
background: none !important;
}
&__header {
text-align: center;
background-color: $dark;
opacity: 0.9;
display: grid;
grid-area: tile-details;
grid-template-columns: 5px auto 5px;
grid-template-rows: 0 1.8em auto auto;
grid-template-areas:
". . ."
". banner ."
". tile-title ."
". tile-subtitle .";
}
&--heading {
font-size: 3em;
& .item-tile__header,
& .item-tile__redacted {
opacity: 1;
grid-template-rows: auto;
grid-template-areas: ". tile-title .";
}
}
&--ohwhatohjeez {
border: 2px solid $ohwhatohjeez;
}
&--oldphaloskepsis {
border: 2px solid $oldphaloskepsis;
}
&--omphaloskepsis {
border: 2px solid $omphaloskepsis;
}
&__banner {
padding-inline: 0.75em;
grid-area: banner;
inline-size: auto;
margin-inline: auto;
border-start-start-radius: 0;
border-start-end-radius: 0;
border-end-end-radius: 10px;
border-end-start-radius: 10px;
text-align: center;
text-decoration: none !important;
line-height: 1.8em;
background-color: #ebebeb;
}
&__title,
&__subtitle {
color: $light;
margin: 0;
font-weight: normal;
}
&__title {
font-size: 1.4em;
line-height: 1em;
grid-area: tile-title;
align-self: center;
&--long {
font-size: 1em;
}
}
&__subtitle {
font-size: 1em;
grid-area: tile-subtitle;
align-self: start;
}
}

View file

@ -0,0 +1,19 @@
// TODO: remove once replaced in content with figures
img,
video {
max-inline-size: 100%;
block-size: auto;
inline-size: auto;
max-block-size: 50vh;
margin: auto;
display: block;
}
.picture {
display: block;
inline-size: auto;
max-inline-size: 100%;
margin: auto;
block-size: auto;
max-block-size: 50vh;
}

View file

@ -0,0 +1,44 @@
/* TODO: Not currently used */
@media screen and (max-width: 480px) {
.table-scroller {
overflow-inline: auto;
inline-size: 320px;
}
}
table {
border: 1px solid $dark;
margin: auto;
& thead {
background-color: #808080;
color: $light;
z-index: 1;
position: sticky;
vertical-align: middle;
inset-block-start: 0;
max-block-size: 1.8em;
& th {
font-weight: bold;
text-align: start;
padding: 1em;
font-size: 1.4em;
border: 1px solid $dark;
}
}
& tbody {
& tr {
&:nth-child(2n) {
background-color: #DDDDD0;
}
& td {
padding: 0.5em 1em;
border: 1px solid $dark;
}
}
}
}

View file

@ -0,0 +1,3 @@
video {
background-color: black;
}

View file

@ -0,0 +1,23 @@
.site-footer {
grid-area: footer;
display: block;
inline-size: 100%;; /* Overflows right of viewport otherwise */
position: fixed;
inset-block-end: 0;
& p {
text-align: center;
background: $light;
padding: 0.4em;
margin-block-end: unset;
border-block-end: none;
font-size: 1em;
border-block-start: 2px solid black;
@include mq("medium") {
inline-size: fit-content;
margin: auto;
border-inline: 2px solid black;
}
}
}

View file

@ -0,0 +1,42 @@
.site-container {
display: grid;
grid-template-columns: 2.5% 1fr 2.5%;
grid-template-rows: auto 1fr 2.5%;
grid-template-areas:
"header header header"
"page-container page-container page-container"
"footer footer footer";
min-block-size: calc(100vh - 4em);
border-block-start: 0;
@include mq("large") {
margin-block-end: 2em;
grid-template-areas:
"header header header"
". page-container ."
"footer footer footer";
border: 2px solid black;
margin-inline: 2em;
}
&--homepage {
align-items: center;
grid-template-rows: auto 2.5%;
grid-template-areas:
"page-container page-container page-container"
"footer footer footer";
margin: 2em;
@include mq("large") {
border: 2px solid black;
grid-template-areas:
". page-container ."
"footer footer footer";
}
}
&--list,
&--section {
align-items: center;
}
}

View file

@ -0,0 +1,89 @@
.site-header {
display: grid;
grid-area: header;
grid-gap: 0;
grid-template-columns: 1fr;
grid-template-rows: auto auto auto auto;
grid-template-areas:
"header-title"
"header-tagline"
"header-icons"
"header-nav";
inset-block-start: 0;
inset-inline-start: 0;
inline-size: 100%;
text-align: center;
z-index: 1;
&__title,
&__tagline,
&__icons,
&__nav {
background-color: $light;
margin: 0;
}
&__title,
&__tagline,
&__icons {
padding-block: 5px;
padding-inline: 0;
}
&__title {
font-weight: normal;
grid-area: header-title;
}
&__tagline {
grid-area: header-tagline;
}
&__icons {
grid-area: header-icons;
border-block-end: 2px solid $dark;
margin-block-end: 0;
}
&__nav {
grid-area: header-nav;
margin: auto;
inline-size: 100%;
@include mq("large") {
inline-size: 60%;
}
& ul {
margin-block: 0;
& li {
inline-size: calc(100% / 3);
display: block;
float: inline-start;
border-block-end: 2px solid black;
border-inline: 1px solid black;
padding: 0.4em;
background-color: inherit;
&:hover {
background-color: #ffffd0;
}
& a {
inline-size: 100%;
block-size: 100%;
display: block;
}
}
& a:first-child li {
border-inline-start: 2px solid black;
}
& a:last-child li {
border-inline-start: 2px solid black;
}
}
}
}

View file

@ -0,0 +1,7 @@
.site-content {
grid-area: page-container;
@include mq("large") {
margin: 2em;
}
}

View file

31
assets/css/main.scss Normal file
View file

@ -0,0 +1,31 @@
@import "abstracts/variables";
@import "abstracts/mixins";
@import "base/typography";
@import "layout/grid";
@import "layout/header";
@import "layout/footer";
@import "layout/main";
@import "components/audio";
@import "components/blockquote";
@import "components/button";
@import "components/chart";
@import "components/comment";
@import "components/details";
@import "components/figure";
@import "components/gallery";
@import "components/picture";
@import "components/icons";
@import "components/item-tile";
@import "components/table";
@import "components/video";
@import "pages/home";
@import "pages/collection";
@import "pages/single";
@import "pages/organisations-list";
@import "pages/single-organisation";
/* @import "themes/dark"; */

View file

@ -0,0 +1,113 @@
.site-content--section,
.site-content--list {
display: grid;
grid-gap: 10px;
grid-template-columns: 0.2fr 1fr 0.2fr;
grid-template-rows: auto auto auto;
justify-items: center;
align-items: center;
grid-template-areas:
"list-page-header list-page-header list-page-header"
"list-page-grid list-page-grid list-page-grid"
"list-page-footer list-page-footer list-page-footer";
margin-block-start: 5em;
@include mq("large") {
grid-template-areas:
". list-page-header ."
"list-page-grid list-page-grid list-page-grid"
". list-page-footer .";
}
& .site-content__header {
grid-area: list-page-header;
text-align: center;
& .page-header__minor-links {
text-align: center;
overflow: auto;
& ul {
list-style: none;
& li {
float: inline-start;
margin-block: 0;
margin-inline: 1em;
& * {
display: inline-block;
}
}
}
& .minor-links {
&__categories {
inline-size: fit-content;
margin: auto;
display: block;
overflow: auto;
@include mq("large") {
font-size: 1em !important;
}
}
&__years {
display: block;
margin: auto;
inline-size: fit-content;
& li {
inline-size: fit-content;
min-inline-size: fit-content;
padding: 0.5em;
@include mq("large") {
padding: 0;
}
}
}
}
}
}
& .site-content__body {
inline-size: 100%;
display: grid;
grid-gap: 10px;
grid-area: list-page-grid;
grid-template-columns: 1fr;
grid-template-rows: repeat(8, 1fr);
justify-items: stretch;
align-items: stretch;
@include mq("medium") {
grid-template-columns: repeat(2, 1fr);
grid-template-rows: repeat(4, 1fr);
}
@include mq("large") {
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(2, 1fr);
}
&--list {
grid-template-columns: 1fr auto 1fr;
grid-template-rows: auto;
grid-template-areas: ". sections-list .";
}
&--chart {
grid-template-columns: 1em 100% 1fr;
grid-template-rows: auto auto;
grid-template-areas:
". section-chart ."
". section-content .";
}
}
& .site-content__footer {
grid-area: list-page-footer;
}
}

View file

@ -0,0 +1,16 @@
.site-content--homepage {
text-align: center;
& .page-title {
font-size: 2.5em;
margin-block-end: 1em;
@include mq("large") {
font-size: 4em;
}
& span {
display: block !important;
}
}
}

View file

@ -0,0 +1,14 @@
.organisations-table {
grid-column-start: 1;
grid-column-end: 5;
&__items-icon {
text-align: center;
float: inline-start;
padding-inline-end: 1em;
&--none {
opacity: 0.4;
}
}
}

View file

@ -0,0 +1,205 @@
.organisation {
&__description {
margin-block-end: 2em;
details {
margin-inline-start: 1em;
padding-inline-start: 1em;
border-inline-start: 2px solid $dark;
summary {
font-style: italic;
}
}
}
&__timeline {
margin-block-end: 1em;
& #timeline {
clear: both;
& > div > div {
block-size: unset !important;
& > div {
position: unset !important;
inline-size: unset !important;
block-size: unset !important;
& > div:first-of-type {
overflow: unset !important;
position: unset !important;
}
}
}
}
}
&__related {
& .related-section {
text-align: center;
&--list {
text-align: start;
inline-size: 50%;
display: inline-block;
vertical-align: top;
padding-block: 0;
padding-inline: 2em;
}
& .related-items {
margin-block: 2em;
&--tiles {
& .index {
display: grid;
grid-gap: 1em;
grid-template-columns: repeat(4, 1fr);
}
}
&--collapsible {
margin-block-end: 1em;
& summary {
text-align: center;
cursor: pointer;
padding-block-end: 1em;
&::marker {
font-size: 2em;
padding-inline-start: 2em;
display: inline-block;
}
}
}
&--list {
.related-item {
&__expiry,
&__grade {
font-size: 0.8em;
display: block;
margin-inline-start: 0.5em;
}
}
}
&-title {
border-block-end: none;
display: inline-block;
}
& .related-item {
&--expired {
opacity: 0.4;
}
}
}
}
}
}
.organisation-table {
&__logo {
max-inline-size: 5em;
max-block-size: 5em;
}
}
.timeline__legend > fieldset {
inline-size: 45%;
float: inline-start;
text-align: center;
border: none;
& legend {
display: block;
inline-size: 100%;
}
}
#hierarchy ul {
list-style: none;
padding-inline-start: 1em;
& .hierarchy-item {
&::before {
content: "\21B3";
margin-block: 0;
margin-inline: 0.4em;
}
&--current {
font-weight: bold;
}
&--child::before {
content: "\2192";
}
}
}
.timeline__legend {
& .legend__button {
cursor: pointer;
& span {
margin-block: 0;
margin-inline: 1em;
display: inline-block;
&.colour-square {
inline-size: 1em;
block-size: 1em;
border-radius: 2.5px;
border: 1px solid $dark;
&--unpaid-current {
background-color: #bbbbb0;
}
&--unpaid-past {
background-color: #fffff0;
}
&--paid-current {
background-color: #bcbc7e;
}
&--paid-past {
background-color: #fcfca6;
}
}
}
&--disabled {
text-decoration: line-through;
}
}
}
.site-content__body--chart {
& #timeline,
& #map {
inline-size: 100%;
max-inline-size: 100%;
grid-area: section-chart;
}
}
.site-content__body--list {
& .site-content__sections-list {
grid-area: sections-list;
display: block;
list-style: none;
margin: auto;
padding-inline-start: 0;
& li * {
display: inline-block;
}
}
}

View file

@ -0,0 +1,455 @@
.site-content--single {
display: grid;
column-gap: 2em;
grid-template-columns: 0.4fr 0.6fr;
grid-template-rows: auto auto auto auto 60px;
@include mq("large") {
grid-template-rows: auto auto auto auto;
}
& .site-content__header,
& .site-content__footer {
display: grid;
grid-column-start: 1;
grid-column-end: 3;
background-color: $light;
filter: brightness(80%);
@include mq("large") {
border: 2px solid $dark;
grid-column-end: 2;
padding: 2em;
}
}
& .site-content__header {
grid-row-start: 1;
grid-row-end: 2;
overflow: auto;
border-block-end: 2px solid $dark;
margin-block-end: 2em;
padding-inline: 1em;
& .article-header {
text-align: center;
background-color: $dark;
opacity: 0.8;
color: $light;
display: grid;
grid-area: post-header-details;
grid-template-columns: 1fr;
padding: 20px;
grid-template-rows: 1fr auto auto 1fr;
justify-items: center;
align-items: center;
grid-template-areas: "." "post-title" "post-subtitle" ".";
&__series {
margin-block: 0 1em;
margin-inline: auto;
font-size: 1.2em;
}
&__featured-image {
display: grid;
grid-template-columns: 15% 1fr 15%;
grid-template-rows: 20% 1fr 20%;
grid-template-areas: ". . ." ". post-header-details ." ". . .";
background-position: center center;
background-repeat: no-repeat;
background-size: cover;
block-size: 40vh;
min-block-size: 380px;
inline-size: 100%;
border: 2px solid $dark;
& .attr {
background-color: $dark;
font-size: 0.7em;
color: $light;
inline-size: fit-content;
position: fixed;
padding-block: 0.2em;
padding-inline: 0.5em;
opacity: 0.8;
margin-block: 0;
margin-inline: auto;
& a {
color: $light;
}
}
}
&__title,
&__subtitle {
border-block-end: 2px inset $dark;
margin-block: 0;
line-height: 1.2em;
}
&__subtitle {
font-size: 1.5em;
}
&__title-wrapper {
display: grid;
grid-area: post-header-details;
background-color: $dark;
opacity: 0.8;
text-align: center;
grid-template-columns: 1fr;
padding: 20px;
grid-template-rows: 1fr auto auto 1fr;
justify-items: center;
align-items: center;
grid-template-areas: "." "post-title" "post-subtitle" ".";
&--no-title {
visibility: hidden;
}
& .article-header__title,
& .article-header__subtitle {
color: $light;
}
& .article-header__title {
grid-area: post-title;
font-weight: bold;
&--long {
font-size: 1.5em;
}
}
& .article-header__subtitle {
grid-area: post-subtitle;
}
}
&__word-count,
&__publish-date,
&__modified-date {
font-size: 1.2em;
margin-block: 0.2rem;
margin-inline: auto;
}
&__word-count {
margin-block-start: 1rem;
}
&__warnings,
&__notes {
inline-size: 90%;
margin-block: 1.6em;
margin-inline: auto;
display: block;
padding-inline-end: 1em;
& ul {
list-style: circle;
& li {
margin-block: 0.5em;
margin-inline: 0;
}
}
}
&__warnings {
border: 4px solid darkred;
background-color: #fc3a3a;
color: $light;
font-weight: 500;
& ul {
list-style: disc;
}
& + .article-header__notes {
margin-block-start: 0;
}
}
&__notes {
background-color: $light;
filter: brightness(70%);
border: 1px solid gray;
}
&__table-of-contents {
& ul {
list-style-type: arabic;
padding-inline-start: 2em;
margin-block-end: 0;
&.toc-list--appendices,
&.toc-list--corrigenda {
list-style-type: circle;
margin-block-start: 0;
& ol {
padding-inline-start: 2em;
list-style-type: upper-latin !important;
}
}
& li {
padding-block: 0.8em;
padding-inline: 0;
@include mq("large") {
padding: 0;
}
}
}
}
}
}
& .site-content__body {
grid-column-start: 1;
grid-column-end: 3;
grid-row-start: 2;
grid-row-end: 3;
padding-inline: 1em;
@include mq("large") {
grid-row-start: 1;
grid-row-end: 5;
grid-column-start: 2;
}
/* Temporary until I've fixed all the figures */
overflow-inline: clip;
& .article__links {
background-color: $light;
filter: brightness(80%);
inline-size: 60%;
margin-inline: auto;
margin-block: auto 1em;
border: 2px solid $dark;
padding: 1em;
}
.article-body {
&__summary {
display: none;
}
}
.heading {
text-align: center;
font-size: 2em;
font-weight: bold;
&::before,
&::after {
content: " ~ ";
}
}
.heading-anchor {
font-size: 0.6em;
line-height: 1em;
text-decoration: none;
vertical-align: middle;
}
.subheading {
font-size: 1.6em;
border-block-end: 2px inset $dark;
margin-block: 0.5em;
line-height: 1.2em;
text-align: center;
&--appendices,
&--comments {
text-decoration: underline;
border-block-end: none;
font-size: 2em;
padding-block-start: 1em;
border-block-start: 1px dashed $dark;
}
&__subtitle {
font-size: 1em;
border-block-end: 1px dashed $dark;
line-height: 1em;
text-align: center;
font-weight: bold;
inline-size: fit-content;
margin-block: 0 1em;
margin-inline: auto;
padding-block: 0 0.5em;
padding-inline: 3em 0.4em;
}
}
.subsubheading {
font-size: 1.4em;
border-block-end: 1px dashed $dark;
margin-block-start: 1em;
margin-block-end: 1em;
padding-block-end: 0.5em;
line-height: 1em;
text-align: start;
font-weight: bold;
}
.subsubsubheading {
font-size: 1.2em;
margin-block-start: 1em;
margin-block-end: 1em;
line-height: 1em;
text-align: start;
font-weight: bold;
}
.article-body__content > blockquote {
padding-inline-start: 1em;
border-inline-start: 2px outset $dark;
display: inline-block;
max-inline-size: 85%;
& footer {
text-align: end;
font-style: normal;
display: inline-block;
margin-inline-start: 5em;
&::before {
content: "";
}
}
& p:first-child {
margin-block-start: 0;
}
& p:last-of-type {
margin-block-end: 0.5em;
}
&.script {
display: grid;
grid-template-columns: auto 1fr 0.2fr;
padding-block-end: 0.4em;
text-align: end;
& > p::before,
& > p::after {
content: none !important;
}
& > .script-line__character {
grid-column: 1;
margin: 0.5em 2em 0.5em 0.5em;
font-style: italic;
}
& > .script-line__text {
grid-column-start: 2;
grid-column-end: 4;
margin: 0.5em;
}
& footer {
grid-column-start: 1;
grid-column-end: 3;
}
}
}
.article-body__content > blockquote:not(.blockquote):first-child {
font-size: 1.2em;
text-align: center;
display: block;
margin: 0 auto;
border-inline-start: 0;
padding-inline-start: 0;
inline-size: 100%;
padding-block-start: 1em;
padding-block-end: 1.2em;
border-block-start: 2px outset $dark;
border-block-end: 2px inset $dark;
}
@media only screen and (min-width: 1024px) {
blockquote {
margin: 1em 2em;
}
}
}
& .site-content__comments {
grid-column-start: 1;
grid-column-end: 3;
grid-row-start: 3;
grid-row-end: 4;
font-size: 0.8em;
padding-inline-start: 1em;
padding-inline-end: 1em;
margin-block-end: 2em;
@include mq("large") {
grid-column-end: 2;
grid-row-start: 2;
grid-row-end: 3;
padding: 1em 3em 1em 2em;
border-inline-end: 2px solid $dark;
}
& + .site_content__footer {
grid-row-start: 4;
grid-row-end: 5;
@include mq("large") {
margin-block-end: 2em;
grid-row-start: 3;
grid-row-end: 4;
}
}
}
& .site-content__footer {
grid-row-start: 3;
grid-row-end: 4;
border-block-start: 2px solid $dark;
padding-inline-start: 1em;
padding-inline-end: 1em;
@include mq("large") {
margin-block-end: 2em;
grid-row-start: 2;
grid-row-end: 3;
}
& h2 {
margin: 1rem 0;
}
& ul {
margin: 0;
& li {
padding: 0.8em 0;
@include mq("large") {
padding: 0;
}
}
}
& section {
margin: 1rem 0;
}
#map {
border: 2px solid $dark;
}
}
}

41
assets/css/print.scss Normal file
View file

@ -0,0 +1,41 @@
@media print {
html {
font-size: 12pt;
}
/*
a::after {
content: " (" attr(href) ")";
}
*/
.site-header,
.site-footer {
display: none;
}
.site-content {
column-width: 17em;
column-gap: 3em;
widows: 3;
orphans: 3;
&--single {
& .site-content {
&__header,
&__footer,
& .article__links {
background-color: none;
}
}
}
& .figure {
break-inside: avoid;
&--gallery {
break-inside: auto;
}
}
}
}

View file

@ -0,0 +1,34 @@
@media (prefers-color-scheme: dark) {
html,
.site-header {
color: $light;
background-color: $dark;
}
.site-header__nav li {
color: $light;
border-color: $light;
&:hover {
background-color: $dark;
}
}
.site-header__title a {
color: $light;
}
.item-tile {
&--heading,
&__header {
background-color: $light;
}
&--heading,
&__header,
&__title,
&__subtitle {
color: $dark;
}
}
}

View file

View file

@ -0,0 +1,14 @@
import * as params from '@params';
import L from 'leaflet';
var map = L.map('map').setView([55, -3], 13);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
maxZoom: 19,
attribution: '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>'
}).addTo(map);
var lonLats = [];
params.locations.forEach((location) => {
lonLats.push(L.marker([location.lat, location.lon]).addTo(map));
});

162
assets/js/roles-chart.gojs Normal file
View file

@ -0,0 +1,162 @@
const display = {
"past-unpaid": false,
"past-paid": true,
"current-unpaid": true,
"current-paid": true,
}
Object.keys(display).forEach(key => {
if (!display[key]) document.getElementById(key).classList.add("legend__button--disabled")
});
google.charts.load('current', {'packages':['timeline']});
google.charts.setOnLoadCallback(drawChart);
Array.from(document.getElementsByClassName("legend__button")).forEach(
el => el.addEventListener('click', toggleView, false)
);
/**
* Changes the filters to apply to the timeline chart.
*/
function toggleView() {
if (this.classList.contains("legend__button--disabled")) {
this.classList.remove("legend__button--disabled");
} else {
this.classList.add("legend__button--disabled");
}
display[this.id] = !display[this.id];
drawChart();
}
/**
* Updates the roles displayed within the timeline chart.
*/
function drawChart() {
var container = document.getElementById('timeline');
var chart = new google.visualization.Timeline(container);
var rolesTable = new google.visualization.DataTable();
{{- $past_unpaid := "#FFFFF0" -}}
{{- $past_paid := "#FCFCA6" -}}
{{- $current_unpaid := "#BBBBB0" -}}
{{- $current_paid := "#BCBC7E" -}}
rolesTable.addColumn({ type: 'string', id: 'Type' });
rolesTable.addColumn({ type: 'string', id: 'Job Title' });
rolesTable.addColumn({ type: 'string', id: 'style', role: 'style' });
rolesTable.addColumn({ type: 'date', id: 'Start' });
rolesTable.addColumn({ type: 'date', id: 'End' });
rolesTable.addRows([
{{ $cvPages := ( where $.Site.Pages "Type" "cv" ) -}}
{{- range .Pages -}}
{{- $site_show_redacted := eq $.Site.Params.redact "show" -}}
{{- $.Scratch.Set "parents" ( slice ) -}}
{{- /* Concatenates all role parent(s) and organisations(s) */ -}}
{{- with .Params.organisations -}}
{{- range . -}}
{{- range ( where $cvPages "Title" . ) -}}
{{- $add_redacted := and ( and ( .Params.redact ) ( not $site_show_redacted ) ) ( eq $.Site.Params.redact "black" ) -}}
{{- if $add_redacted -}}
{{- $.Scratch.Set "parents" ( $.Scratch.Get "parents" | append "███████████████" ) -}}
{{- else -}}
{{- $.Scratch.Set "parents" ( $.Scratch.Get "parents" | append ( ( partial "cv/organisation/get_top_level_ancestor.html.tmpl" . ) | plainify ) ) -}}
{{- end -}}
{{- else -}}
{{ erroridf "missing-organisation" "Could not find organisation %q (%q)" . $.File.Path }}
{{- end -}}
{{- end -}}
{{- $.Scratch.Set "parents_string" ( delimit ( ( $.Scratch.Get "parents" ) | uniq | sort ) " & " ) -}}
{{- $.Scratch.Set "organisations_string" ( delimit . " & " ) -}}
{{- end -}}
{{- /* Prints a `dataRow` for each role, redacting organisations if necessary */ -}}
{{- $has_no_parents := le ( len ( $.Scratch.Get "parents" ) ) 0 -}}
{{- $show_role := not ( and ( or .Params.redact $has_no_parents ) ( not $site_show_redacted ) ) -}}
{{- $show_role_organisations := not ( eq ( $.Scratch.Get "parents_string" ) ( $.Scratch.Get "organisations_string" ) ) -}}
{{- if $show_role -}}
[
{{- /* Top-level parent organisation(s) */ -}}
"
{{- with .Params.organisations -}}
{{- $.Scratch.Get "parents_string" -}}
{{- end -}}
",
{{- /* Role and (optional) organisation string */ -}}
"
{{- if ( and ( .Params.redact ) ( not $site_show_redacted ) ) -}}
{{- if ( eq $.Site.Params.redact "black" ) -}}
███████████████
{{- end -}}
{{- else -}}
{{- .Title | plainify -}}
{{- if $show_role_organisations -}}
, {{ $.Scratch.Get "organisations_string" -}}
{{- end -}}
{{- end -}}
",
{{- /* Role type (paid/unpaid) */ -}}
"{{ if .Params.end_date -}}
{{- if .Params.paid -}}
{{- $past_paid -}}
{{- else -}}
{{- $past_unpaid -}}
{{- end -}}
{{- else -}}
{{- if .Params.paid -}}
{{- $current_paid -}}
{{- else -}}
{{- $current_unpaid -}}
{{- end -}}
{{- end }}",
{{- /* Role start date */ -}}
new Date("{{ .Date.Format "2006-01-02" }}"),
{{- /* Role end date */ -}}
new Date("
{{- if .Params.end_date -}}
{{- .Params.end_date -}}
{{- else -}}
{{- now.Format "2006-01-02" -}}
{{- end -}}
")
],
{{- end -}}
{{- $.Scratch.Delete "parents" -}}
{{ end -}}
]);
var rolesFilteredView = new google.visualization.DataView(rolesTable);
var toShow = [];
if (display["past-unpaid"]) toShow.push("{{ $past_unpaid }}");
if (display['past-paid']) toShow.push("{{ $past_paid }}");
if (display['current-unpaid']) toShow.push("{{ $current_unpaid }}");
if (display['current-paid']) toShow.push("{{ $current_paid }}");
rolesFilteredView.setRows(rolesFilteredView.getFilteredRows([{ column: 2, test: (value, rowId, columnId, datatable) => {
return toShow.includes(value);
}}]));
var options = {
title: 'Roles Timeline',
height: '100%',
chartArea: {
width: '94%'
},
width: '100%',
}
chart.draw(rolesFilteredView, options);
container.setAttribute("style",`height:${document.querySelector("#timeline > div > div > div > div").offsetHeight}px`);
}

5
config.toml Normal file
View file

@ -0,0 +1,5 @@
[module]
[module.hugoVersion]
extended = true
min = "0.140.0"
max = "0.140.2"

View file

@ -1,363 +0,0 @@
/* Document
* ========================================================================== */
/**
* 1. Add border box sizing in all browsers (opinionated).
* 2. Backgrounds do not repeat by default (opinionated).
*/
*,
::before,
::after {
box-sizing: border-box; /* 1 */
background-repeat: no-repeat; /* 2 */
}
/**
* 1. Add text decoration inheritance in all browsers (opinionated).
* 2. Add vertical alignment inheritance in all browsers (opinionated).
*/
::before,
::after {
text-decoration: inherit; /* 1 */
vertical-align: inherit; /* 2 */
}
/**
* 1. Use the default cursor in all browsers (opinionated).
* 2. Change the line height in all browsers (opinionated).
* 3. Breaks words to prevent overflow in all browsers (opinionated).
* 4. Use a 4-space tab width in all browsers (opinionated).
* 5. Remove the grey highlight on links in iOS (opinionated).
* 6. Prevent adjustments of font size after orientation changes in iOS.
*/
:where(:root) {
cursor: default; /* 1 */
line-height: 1.5; /* 2 */
overflow-wrap: break-word; /* 3 */
-moz-tab-size: 4; /* 4 */
tab-size: 4; /* 4 */
-webkit-tap-highlight-color: transparent; /* 5 */
-webkit-text-size-adjust: 100%; /* 6 */
}
/* Sections
* ========================================================================== */
/**
* Remove the margin in all browsers (opinionated).
*/
:where(body) {
margin: 0;
}
/**
* Correct the font size and margin on `h1` elements within `section` and
* `article` contexts in Chrome, Edge, Firefox, and Safari.
*/
:where(h1) {
font-size: 2em;
margin: 0.67em 0;
}
/* Grouping content
* ========================================================================== */
/**
* Remove the margin on nested lists in Chrome, Edge, and Safari.
*/
:where(dl, ol, ul) :where(dl, ol, ul) {
margin: 0;
}
/**
* 1. Correct the inheritance of border color in Firefox.
* 2. Add the correct box sizing in Firefox.
*/
:where(hr) {
color: inherit; /* 1 */
height: 0; /* 2 */
}
/**
* Remove the list style on navigation lists in all browsers (opinionated).
*/
:where(nav) :where(ol, ul) {
list-style-type: none;
padding: 0;
}
/**
* Prevent VoiceOver from ignoring list semantics in Safari (opinionated).
*/
:where(nav li)::before {
content: "\200B";
float: left;
}
/**
* 1. Correct the inheritance and scaling of font size in all browsers.
* 2. Correct the odd `em` font sizing in all browsers.
* 3. Prevent overflow of the container in all browsers (opinionated).
*/
:where(pre) {
font-family: monospace, monospace; /* 1 */
font-size: 1em; /* 2 */
overflow: auto; /* 3 */
}
/* Text-level semantics
* ========================================================================== */
/**
* Add the correct text decoration in Safari.
*/
:where(abbr[title]) {
text-decoration: underline;
text-decoration: underline dotted;
}
/**
* Add the correct font weight in Chrome, Edge, and Safari.
*/
:where(b, strong) {
font-weight: bolder;
}
/**
* 1. Correct the inheritance and scaling of font size in all browsers.
* 2. Correct the odd `em` font sizing in all browsers.
*/
:where(code, kbd, samp) {
font-family: monospace, monospace; /* 1 */
font-size: 1em; /* 2 */
}
/**
* Add the correct font size in all browsers.
*/
:where(small) {
font-size: 80%;
}
/* Embedded content
* ========================================================================== */
/*
* Change the alignment on media elements in all browsers (opinionated).
*/
:where(audio, canvas, iframe, img, svg, video) {
vertical-align: middle;
}
/**
* Remove the border on iframes in all browsers (opinionated).
*/
:where(iframe) {
border-style: none;
}
/**
* Change the fill color to match the text color in all browsers (opinionated).
*/
:where(svg:not([fill])) {
fill: currentColor;
}
/* Tabular data
* ========================================================================== */
/**
* 1. Collapse border spacing in all browsers (opinionated).
* 2. Correct table border color inheritance in all Chrome, Edge, and Safari.
* 3. Remove text indentation from table contents in Chrome, Edge, and Safari.
*/
:where(table) {
border-collapse: collapse; /* 1 */
border-color: inherit; /* 2 */
text-indent: 0; /* 3 */
}
/* Forms
* ========================================================================== */
/**
* Remove the margin on controls in Safari.
*/
:where(button, input, select) {
margin: 0;
}
/**
* Correct the inability to style buttons in iOS and Safari.
*/
:where(button, [type="button" i], [type="reset" i], [type="submit" i]) {
-webkit-appearance: button;
}
/**
* Change the inconsistent appearance in all browsers (opinionated).
*/
:where(fieldset) {
border: 1px solid #a0a0a0;
}
/**
* Add the correct vertical alignment in Chrome, Edge, and Firefox.
*/
:where(progress) {
vertical-align: baseline;
}
/**
* 1. Remove the margin in Firefox and Safari.
* 3. Change the resize direction in all browsers (opinionated).
*/
:where(textarea) {
margin: 0; /* 1 */
resize: vertical; /* 3 */
}
/**
* 1. Correct the odd appearance in Chrome, Edge, and Safari.
* 2. Correct the outline style in Safari.
*/
:where([type="search" i]) {
-webkit-appearance: textfield; /* 1 */
outline-offset: -2px; /* 2 */
}
/**
* Correct the cursor style of increment and decrement buttons in Safari.
*/
::-webkit-inner-spin-button,
::-webkit-outer-spin-button {
height: auto;
}
/**
* Correct the text style of placeholders in Chrome, Edge, and Safari.
*/
::-webkit-input-placeholder {
color: inherit;
opacity: 0.54;
}
/**
* Remove the inner padding in Chrome, Edge, and Safari on macOS.
*/
::-webkit-search-decoration {
-webkit-appearance: none;
}
/**
* 1. Correct the inability to style upload buttons in iOS and Safari.
* 2. Change font properties to `inherit` in Safari.
*/
::-webkit-file-upload-button {
-webkit-appearance: button; /* 1 */
font: inherit; /* 2 */
}
/* Interactive
* ========================================================================== */
/*
* Add the correct styles in Safari.
*/
:where(dialog) {
background-color: white;
border: solid;
color: black;
height: -moz-fit-content;
height: fit-content;
left: 0;
margin: auto;
padding: 1em;
position: absolute;
right: 0;
width: -moz-fit-content;
width: fit-content;
}
:where(dialog:not([open])) {
display: none;
}
/*
* Add the correct display in Safari.
*/
:where(details > summary:first-of-type) {
display: list-item;
}
/* Accessibility
* ========================================================================== */
/**
* Change the cursor on busy elements in all browsers (opinionated).
*/
:where([aria-busy="true" i]) {
cursor: progress;
}
/*
* Change the cursor on control elements in all browsers (opinionated).
*/
:where([aria-controls]) {
cursor: pointer;
}
/*
* Change the cursor on disabled, not-editable, or otherwise
* inoperable elements in all browsers (opinionated).
*/
:where([aria-disabled="true" i], [disabled]) {
cursor: not-allowed;
}
/*
* Change the display on visually hidden accessible elements
* in all browsers (opinionated).
*/
:where([aria-hidden="false" i][hidden]) {
display: initial;
}
:where([aria-hidden="false" i][hidden]:not(:focus)) {
clip: rect(0, 0, 0, 0);
position: absolute;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 618 B

View file

@ -1,22 +0,0 @@
@media print {
html {
font-size: 12pt; }
/*
a::after {
content: " (" attr(href) ")";
}
*/
.site-header,
.site-footer {
display: none; }
.site-content {
column-width: 17em;
column-gap: 3em;
widows: 3;
orphans: 3; }
.site-content--single .site-content__header, .site-content--single .site-content__footer, .site-content--single .site-content .article__links {
background-color: none; }
.site-content .figure {
break-inside: avoid; }
.site-content .figure--gallery {
break-inside: auto; } }

3
go.mod Normal file
View file

@ -0,0 +1,3 @@
module code.bengoldsworthy.net/Rumperuu/Omphaloskepsis-2
go 1.22.10

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 618 B

View file

@ -1,11 +0,0 @@
MathJax = {
tex: {
inlineMath: [['$', '$'], ['\\(', '\\)']],
displayMath: [['$$','$$'], ['\\[', '\\]']],
processEscapes: true,
processEnvironments: true
},
options: {
skipHtmlTags: ['script', 'noscript', 'style', 'textarea', 'pre']
}
};

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

View file

@ -1,64 +0,0 @@
{{ define "title" }}
CV by Location | {{ .Site.Title }}
{{ end }}
{{ define "main-class" }}--section location-map{{ end }}
{{ define "header-scripts" }}
<link rel="stylesheet" href="/css/leaflet.css"/>
{{ end }}
{{ define "footer-scripts" }}
<script src="/js/leaflet.js"></script>
<script src="/js/leaflet-heat.js"></script>
<script>
var map = L.map('map').setView([55, -3], 3);
L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
maxZoom: 19,
attribution: '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>'
}).addTo(map);
{{- range $.Site.Data.locations -}}
/* L.marker([{{ .lat }}, {{ .lon }}]).addTo(map); */
{{- end -}}
L.heatLayer(
[
{{- range .Site.AllPages -}}
{{- with .Params.locations -}}
{{- range . -}}
{{- with ( index $.Site.Data.locations . ) -}}
[ {{ .lat }}, {{ .lon }} ],
{{- end -}}
{{- end -}}
{{- end -}}
{{- end -}}
],
{
minOpacity: 0.5,
gradient: {0.2: 'blue', 0.5: 'lime', 1: 'red'}
}
).addTo(map);
</script>
{{ end }}
{{ define "main-header" }}
<header class="site-content__header">
<h1 class="page-title">{{ .Title | safeHTML }}.</h1>
{{ .Content }}
</header>
{{ end }}
{{ define "main-body" }}
<article class="site-content__body site-content__body--chart">
<div id="map" style="width: 100%; height: 500px; margin: 0; display: block;"></div>
<ul style="grid-area: section-content">
{{- range $key, $value := $.Site.Data.locations -}}
<li itemscope itemtype="https://schema.org/Place">{{ $key }}</li>
{{- end -}}
</ul>
</article>
{{ end }}

View file

@ -110,7 +110,7 @@
}
</script>
{{- else -}}
{{ $js := resources.Get "js/roles-chart.js" | resources.ExecuteAsTemplate "/js/render-roles-timeline.js" ( .GetPage "cv/roles" ) | resources.Fingerprint }}
{{ $js := resources.Get "js/roles-chart.gojs" | resources.ExecuteAsTemplate "/js/render-roles-timeline.js" ( .GetPage "cv/roles" ) | resources.Fingerprint }}
<script src="{{ $js.RelPermalink }}" integrity="{{ $js.Data.Integrity }}"></script>
{{- end -}}
{{ end }}

View file

@ -1,38 +0,0 @@
{{- $itemType := default "CreativeWork" ( .Params.schemaType ) -}}
{{- if ( or ( in $.Site.Data.itemtypes $itemType ) ( eq .Params.suppress "true" ) ) -}}
{{- with .Params.href -}}
<a href="{{ if eq . "asCite" }}{{ $.Params.cite }}{{ else }}{{ . }}{{ end }}">
{{- end -}}
<cite
class="cite{{ with .Params.citeStyle }} cite--{{ . }}{{ end }}"
itemscope
itemprop="citation"
itemtype="https://schema.org/{{- $itemType -}}"
{{- if .Params.titleLang -}}
lang="{{- .Params.titleLang -}}"
title="{{- .Params.titleTr -}}"
{{- end -}}>
{{- with .Params.cite -}}
<meta itemprop="url" content="{{ . }}">
{{- end -}}
<span itemprop="name">
{{- if .Params.titleLang -}}
<i lang="{{ .Params.titleLang }}" title="{{ .Params.titleTr }}">
{{- end -}}
{{- if .Params.shortTitle -}}
{{- .Params.shortTitle | markdownify | safeHTML -}}
{{- else -}}
{{- .Params.title | markdownify | safeHTML -}}
{{- end -}}
{{- if .Params.titleLang -}}
</i>
{{- end -}}
</span>{{- /**/ -}}
</cite>
{{- with .Params.href -}}
</a>
{{- end -}}
{{- else -}}
{{- erroridf "invalid-schema-type" "Invalid Schema.org type value %q for %q" $itemType .Params.title -}}
{{- end -}}

View file

@ -1,52 +0,0 @@
<section class="site-content__body">
<table class="organisations-table">
<thead>
<tr>
<th>Logo</th>
<th>Title</th>
<th>Children</th>
<th>Items</th>
</tr>
</thead>
<tbody>
{{- range .Pages -}}
{{- if ( not ( and ( .Params.redact ) ( ne $.Site.Params.redact "show" ) ) ) -}}
<tr>
<td>
{{- if ( and ( .Params.redact ) ( ne $.Site.Params.redact "show" ) ) -}}
{{- if ( eq $.Site.Params.redact "black" ) -}}
{{- partialCached "redact-black.html" . -}}
{{- end -}}
{{- else -}}
{{- if .Params.featured_image -}}
<img class="organisation-table__logo" loading="lazy" src="
{{- if .Resources.GetMatch .Params.featured_image -}}
{{- ( .Resources.GetMatch .Params.featured_image ).RelPermalink -}}
{{- else -}}
{{- .Params.featured_image -}}
{{- end -}}
">
{{- end -}}
{{- end -}}
</td>
<td>
{{- if ( and ( .Params.redact ) ( ne $.Site.Params.redact "show" ) ) -}}
{{- if ( eq $.Site.Params.redact "black" ) -}}
{{- partialCached "redact-black.html" . -}}
{{- end -}}
{{- else -}}
<a href="{{ .RelPermalink }}">
{{- if .Params.TitleLang -}}<i lang="{{ .Params.TitleLang }}" title="{{ .Params.TitleTrans }}"}>{{- end -}}
{{- with .Params.markup_title -}}{{- . | safeHTML -}}{{- else -}}{{- .Title | safeHTML -}}{{- end -}}
{{- if .Params.TitleLang -}}</i>{{- end -}}
</a>
{{- end -}}
</td>
<td>{{- if gt (len .Sections) 0 -}}&#10004;{{- end -}}</td>
<td></td>
</tr>
{{- end -}}
{{- end -}}
</tbody>
</table>
</section>

View file

@ -1,26 +0,0 @@
{{ if gt ( len .content ) 4 }}
<details id="{{ .section_title | anchorize }}" class="org-items row">
<summary>
<h2 class="subheading">{{ .section_title }} ({{ len .content }})</h2>
<div class="index">
{{ range first 4 .content }}
{{ partial "item-tile.html" . }}
{{ end }}
</div>
</summary>
<div class="index">
{{ range after 4 .content }}
{{ partial "item-tile.html" . }}
{{ end }}
</div>
</details>
{{ else }}
<div id="{{ .section_title | anchorize }}" class="org-items row">
<h2 class="subheading">{{ .section_title }} ({{ len .content }})</h2>
<div class="index">
{{ range first 4 .content }}
{{ partial "item-tile.html" . }}
{{ end }}
</div>
</div>
{{ end }}

View file

@ -1,16 +0,0 @@
<aside class="timeline__legend">
<div>
<label for="legend__past">Past</label>
<div id="legend__past">
<button id="past-unpaid" class="legend__button"><p><span class="colour-square colour-square--unpaid-past"></span> Unpaid</p></button>
<button id="past-paid" class="legend__button"><p><span class="colour-square colour-square--paid-past"></span> Paid</p></button>
</div>
</div>
<div>
<label for="legend__current">Current</label>
<div id="legend__current">
<button id="current-unpaid" class="legend__button"><p><span class="colour-square colour-square--unpaid-current"></span> Unpaid</p></button>
<button id="current-paid" class="legend__button"><p><span class="colour-square colour-square--paid-current"></span> Paid</p></button>
</div>
</div>
</aside>

View file

@ -1,7 +0,0 @@
<nav class="site-header__nav">
<ul>
{{ range ( where .Site.Sections.ByTitle "Type" "in" site.Params.mainSections ) }}
<li><a href="{{ .RelPermalink }}">{{ .Title | safeHTML }}</a></li>
{{ end }}
</ul>
</nav>

View file

@ -1,11 +0,0 @@
<!--
Given a top-level section title slug [blog|cv|portfolio], returns all
`Pages` within that top-level section.
@param sc The site content (`$`)
@param section_slug The slug of the section to use [blog|cv|portfolio]
@returns Pages|nil
-->
{{- where ( ( .sc.GetPage "cv" ).Sections ) "Title" .section_title -}}

View file

@ -1,81 +0,0 @@
<figure class="figure--gallery gallery" itemscope itemtype="http://schema.org/ImageGallery">
{{- if or ( .Get "caption" ) ( .Get "title" ) -}}
<figcaption class="figure__caption gallery__caption{{ if not ( or ( .Get "caption" ) ( .Get "title" ) ) }} figure__caption--no-height{{ end }}">
{{- with .Get "title" -}}<h4 class="figcaption__title">{{ . | markdownify | safeHTML }}</h4>{{- end -}}
{{- with .Get "caption" -}}
<p class="figcaption__caption">{{ . | markdownify | safeHTML }}</p>
{{- end -}}
</figcaption>
{{- end -}}
{{- with (.Get "dir") -}}
<!-- If a directory was specified, generate figures for all of the images in the directory -->
{{- $images := $.Page.Resources.Match ( print . "/*" ) }}
{{- range $images -}}
{{- $caption := .Name | replaceRE "\\..*" "" | humanize }}<!-- humanized filename without extension -->
{{- $linkURL := print $.Page.Permalink ($.Get "dir") "/" .Name | absURL }}<!-- absolute URL to hi-res image -->
<figure class="figure gallery__figure" itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject">
<a href="{{ .RelPermalink }}" itemprop="contentUrl">
<picture class="figure__picture"
itemprop="image">
<img itemprop="thumbnail"
class="u-photo gallery__thumbnail"
{{ if ( or ( eq .MediaType.SubType "svg" ) ( eq .MediaType.SubType "gif" ) ) }}
src="{{ .RelPermalink }}"
{{ else }}
{{ with .Resize "600x webp" }}
src="{{ .RelPermalink }}"
{{ end }}
width="{{ .Width }}"
height="{{ .Height }}"
{{ end }}
{{- with .Params.alt }}
alt="{{ . }}"
{{- end -}}
{{- with .Params.title }} title="{{ . }}" {{ end -}}
loading="lazy"
>
</picture>
</a>
{{- if or ( .Params.title ) ( .Params.attr ) -}}
<figcaption class="figure__caption{{ if not .Params.title }} figure__caption--no-height{{ end }}">
{{ if .Params.attrlink -}}
<a class="figcaption__attrlink" href="{{ .Params.attrlink }}"
{{- with .Params.attrtarget }} target="{{ . }}"{{ end -}}
{{- with .Params.attrrel }} rel="{{ . }}"{{ end -}}
>
{{- end -}}
{{- if .Params.attr -}}<p class="figcaption__attr">{{ .Params.attr | safeHTML }}{{ with .Params.attrlicence }} <span class="figcaption__licence">{{ . | safeHTML }}</span>{{ end }}</p>{{- end -}}
{{- if .Params.attrlink -}}
</a>
{{- end -}}
{{- if .Params.href -}}
<a href="{{- if ( eq .Params.href "asCite" ) -}}{{ .Params.cite }}{{- else -}}{{ .Params.href }}{{- end -}}">
{{- end -}}
{{- if .Params.title -}}
<h5 class="figcaption__title">
{{- if .Params.titleLang -}}
<i lang="{{ .Params.titleLang }}" title="{{ .Params.titleTr }}">
{{- end -}}
{{ .Params.title | safeHTML }}
{{- if .Params.titleLang -}}
</i>
{{- end -}}
</h5>
{{- else -}}
{{- with .Params.href -}}
<p class="figcaption__title">Link</p>
{{- end -}}
{{- end -}}
{{- if .Params.href -}}
</a>
{{- end -}}
</figcaption>
{{- end -}}
</figure>
{{- end }}
{{- else -}}
<!-- If no directory was specified, include any figure shortcodes called within the gallery -->
{{ .Inner }}
{{- end }}
</figure>

17
static/.htaccess Normal file
View file

@ -0,0 +1,17 @@
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
RedirectMatch 301 /weblog/? /blog/
RewriteRule ^[0-9]{4}/[0-9]{2}/(.*)$ /blog/posts/$1 [R=301,L]
</IfModule>
Header always unset X-Powered-By
Header always set Strict-Transport-Security: "max-age=31536000; includeSubdomains; preload" env=HTTPS
Header always set Content-Security-Policy "upgrade-insecure-requests"
Header always set X-Content-Type-Options "nosniff"
Header always set X-XSS-Protection "1; mode=block"
Header always append X-Frame-Options SAMEORIGIN
Header always set Expect-CT "max-age=7776000, enforce"
Header always set Referrer-Policy: "no-referrer-when-downgrade"
Header always set Permissions-Policy "geolocation=();midi=();notifications=();push=();sync-xhr=();microphone=();camera=();magnetometer=();gyroscope=();speaker=(self);vibrate=();fullscreen=(self);payment=();interest-cohort=();"

View file

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

View file

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View file

Before

Width:  |  Height:  |  Size: 618 B

After

Width:  |  Height:  |  Size: 618 B

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View file

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

View file

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

Before

Width:  |  Height:  |  Size: 696 B

After

Width:  |  Height:  |  Size: 696 B

1
static/js/chart/chart.js Normal file

File diff suppressed because one or more lines are too long

49
static/js/lazy-images.js Normal file
View file

@ -0,0 +1,49 @@
// Source: https://css-tricks.com/the-complete-guide-to-lazy-loading-images/
document.addEventListener("DOMContentLoaded", function() {
var lazyloadImages;
if ("IntersectionObserver" in window) {
lazyloadImages = document.querySelectorAll(".lazy");
var imageObserver = new IntersectionObserver(function(entries, observer) {
entries.forEach(function(entry) {
if (entry.isIntersecting) {
var image = entry.target;
image.classList.remove("lazy");
imageObserver.unobserve(image);
}
});
});
lazyloadImages.forEach(function(image) {
imageObserver.observe(image);
});
} else {
var lazyloadThrottleTimeout;
lazyloadImages = document.querySelectorAll(".lazy");
function lazyload () {
if(lazyloadThrottleTimeout) {
clearTimeout(lazyloadThrottleTimeout);
}
lazyloadThrottleTimeout = setTimeout(function() {
var scrollTop = window.pageYOffset;
lazyloadImages.forEach(function(img) {
if(img.offsetTop < (window.innerHeight + scrollTop)) {
img.src = img.dataset.src;
img.classList.remove('lazy');
}
});
if(lazyloadImages.length == 0) {
document.removeEventListener("scroll", lazyload);
window.removeEventListener("resize", lazyload);
window.removeEventListener("orientationChange", lazyload);
}
}, 20);
}
document.addEventListener("scroll", lazyload);
window.addEventListener("resize", lazyload);
window.addEventListener("orientationChange", lazyload);
}
});

Binary file not shown.

After

Width:  |  Height:  |  Size: 299 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 420 B

View file

@ -0,0 +1 @@
L.Control.Fullscreen=L.Control.extend({options:{position:"topleft",title:{"false":"View Fullscreen","true":"Exit Fullscreen"}},onAdd:function(map){var container=L.DomUtil.create("div","leaflet-control-fullscreen leaflet-bar leaflet-control");this.link=L.DomUtil.create("a","leaflet-control-fullscreen-button leaflet-bar-part",container);this.link.href="#";this._map=map;this._map.on("fullscreenchange",this._toggleTitle,this);this._toggleTitle();L.DomEvent.on(this.link,"click",this._click,this);return container},_click:function(e){L.DomEvent.stopPropagation(e);L.DomEvent.preventDefault(e);this._map.toggleFullscreen(this.options)},_toggleTitle:function(){this.link.title=this.options.title[this._map.isFullscreen()]}});L.Map.include({isFullscreen:function(){return this._isFullscreen||false},toggleFullscreen:function(options){var container=this.getContainer();if(this.isFullscreen()){if(options&&options.pseudoFullscreen){this._disablePseudoFullscreen(container)}else if(document.exitFullscreen){document.exitFullscreen()}else if(document.mozCancelFullScreen){document.mozCancelFullScreen()}else if(document.webkitCancelFullScreen){document.webkitCancelFullScreen()}else if(document.msExitFullscreen){document.msExitFullscreen()}else{this._disablePseudoFullscreen(container)}}else{if(options&&options.pseudoFullscreen){this._enablePseudoFullscreen(container)}else if(container.requestFullscreen){container.requestFullscreen()}else if(container.mozRequestFullScreen){container.mozRequestFullScreen()}else if(container.webkitRequestFullscreen){container.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT)}else if(container.msRequestFullscreen){container.msRequestFullscreen()}else{this._enablePseudoFullscreen(container)}}},_enablePseudoFullscreen:function(container){L.DomUtil.addClass(container,"leaflet-pseudo-fullscreen");this._setFullscreen(true);this.invalidateSize();this.fire("fullscreenchange")},_disablePseudoFullscreen:function(container){L.DomUtil.removeClass(container,"leaflet-pseudo-fullscreen");this._setFullscreen(false);this.invalidateSize();this.fire("fullscreenchange")},_setFullscreen:function(fullscreen){this._isFullscreen=fullscreen;var container=this.getContainer();if(fullscreen){L.DomUtil.addClass(container,"leaflet-fullscreen-on")}else{L.DomUtil.removeClass(container,"leaflet-fullscreen-on")}},_onFullscreenChange:function(e){var fullscreenElement=document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement;if(fullscreenElement===this.getContainer()&&!this._isFullscreen){this._setFullscreen(true);this.fire("fullscreenchange")}else if(fullscreenElement!==this.getContainer()&&this._isFullscreen){this._setFullscreen(false);this.fire("fullscreenchange")}}});L.Map.mergeOptions({fullscreenControl:false});L.Map.addInitHook(function(){if(this.options.fullscreenControl){this.fullscreenControl=new L.Control.Fullscreen(this.options.fullscreenControl);this.addControl(this.fullscreenControl)}var fullscreenchange;if("onfullscreenchange"in document){fullscreenchange="fullscreenchange"}else if("onmozfullscreenchange"in document){fullscreenchange="mozfullscreenchange"}else if("onwebkitfullscreenchange"in document){fullscreenchange="webkitfullscreenchange"}else if("onmsfullscreenchange"in document){fullscreenchange="MSFullscreenChange"}if(fullscreenchange){var onFullscreenChange=L.bind(this._onFullscreenChange,this);this.whenReady(function(){L.DomEvent.on(document,fullscreenchange,onFullscreenChange)});this.on("unload",function(){L.DomEvent.off(document,fullscreenchange,onFullscreenChange)})}});L.control.fullscreen=function(options){return new L.Control.Fullscreen(options)};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,14 +1,14 @@
# theme.toml template for a Hugo theme
# See https://github.com/gohugoio/hugoThemes#themetoml for an example
name = "Omphaloskepsis 2"
license = "MIT"
licenselink = "https://code.bengoldsworthy.net/Rumperuu/Omphaloskepsis-2/blob/main/LICENSE"
description = ""
homepage = "https://bengoldsworthy.net/"
tags = []
features = []
min_version = "0.41.0"
license = "CC0"
licenselink = "https://code.bengoldsworthy.net/Rumperuu/Omphaloskepsis-2/blob/main/LICENSE"
description = "A theme for my personal static site incorporating a blog, various portfolios and a CV searcher."
demosite = "https://bengoldsworthy.net"
homepage = "https://bengoldsworthy.net/"
tags = ["blog", "cv", "portfolio"]
features = []
[author]
name = "Ben Goldsworthy"