feat: initial import

This commit is contained in:
Iain Learmonth 2026-01-10 13:42:14 +00:00
commit 03ab1091b1
50 changed files with 1146 additions and 0 deletions

26
.gitignore vendored Normal file
View file

@ -0,0 +1,26 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
dist
dist-ssr
*.local
_gen
/public
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

5
archetypes/default.md Normal file
View file

@ -0,0 +1,5 @@
+++
date = '{{ .Date }}'
draft = true
title = '{{ replace .File.ContentBaseName "-" " " | title }}'
+++

8
archetypes/posts.md Normal file
View file

@ -0,0 +1,8 @@
+++
date = '{{ .Date }}'
draft = true
name = '{{ replace .File.ContentBaseName "-" " " | title }}'
tags = ['red','green','blue']
[params]
author = ''
+++

10
archetypes/team.md Normal file
View file

@ -0,0 +1,10 @@
+++
date = '{{ .Date }}'
draft = true
name = '{{ replace .File.ContentBaseName "-" " " | title }}'
[params]
pronoun = '(he/him)(she/her)'
education = 'MSc'
role = 'DevOps Engineer'
avatar = 'team/images/{{ replace .File.ContentBaseName "-" "" | title }}.jpg'
+++

63
assets/css/contact.scss Normal file
View file

@ -0,0 +1,63 @@
@use "hugo:vars" as v;
.contact-page {
margin-bottom: 2rem;
h3, h4 {
margin-top: 3rem;
margin-bottom: 0.4rem;
& + * {
margin-top: 0;
}
}
address {
white-space: pre;
font-style: normal;
}
form {
input:not([type=checkbox]),
textarea {
min-width: 425px;
}
label {
display: block;
}
button {
width: fit-content;
min-width: 100px;
max-height: 55px;
border-radius: 6px;
padding: 13px 20px;
background-color: v.$color_primary;
color: v.$color_primary_contrast;
display: flex;
align-items: center;
justify-content: center;
&:hover {
opacity: 0.7;
cursor: pointer;
}
}
}
}
.contact-method {
display: flex;
align-items: center;
flex-direction: column;
padding: 0 20px;
}
.contact-method__name {
color: v.$color_tertiary;
margin-bottom: 0.25rem;
}
.contact-method__content {
color: v.$color_primary;
font-size: 1.118rem;
}

View file

@ -0,0 +1,35 @@
@use "hugo:vars" as v;
.flex-section {
margin: 48px 95px;
}
.flex-section__title {
font-family: "Assistant";
font-size: 31px;
font-weight: 400;
background-clip: text;
background-image: linear-gradient(to right, rgb(1, 72, 111), rgb(0, 168, 112));
color: transparent;
text-align: center;
}
.flex-section__content {
display: flex;
flex-direction: row;
flex-wrap: wrap;
align-items: center;
justify-content: space-around;
font-family: "Assistant";
font-size: 17px;
font-weight: 400;
max-width: v.$max_content_width;
margin-left: auto;
margin-right: auto;
@media (max-width: v.$bp_mobile) {
&>* {
flex: 0 0 100%;
}
}
}

104
assets/css/footer.scss Normal file
View file

@ -0,0 +1,104 @@
@use "hugo:vars" as v;
footer {
border-top: 1px solid #D9E2EF;
background-color: #F1F4F8;
}
.footer__content {
max-width: v.$max_content_width;
display: flex;
text-align: start;
flex-wrap: wrap;
gap: 4px;
align-items: start;
justify-content: start;
padding: 20px 1.25rem;
margin-top: 1rem;
margin-left: auto;
margin-right: auto;
margin-bottom: 0 auto 1rem auto;
font-family: "Assistant";
font-size: 17px;
font-weight: 500;
.footer__column {
flex: 1 1 33%;
}
.footer__column-right-aligned {
flex: 1 1 33%;
justify-items: end;
a {
display: block;
}
}
.footer__logo {
flex: 0 0 250px;
max-width: 250px;
}
.footer__address {
font-style: normal;
color: v.$color_tertiary;
white-space: pre;
margin-bottom: 1rem;
}
.footer__duns {
color: v.$color_muted;
white-space: pre;
font-size: 0.88rem;
margin-bottom: 1rem;
}
.footer__menu__title {
color: v.$color_tertiary;
display: block;
text-transform: uppercase;
margin: 0 0 0.5rem 0;
}
.footer__menu__link {
display: block;
color: v.$color_muted;
}
.footer__menu__caption {
color: v.$color_tertiary;
display: block;
font-size: 0.59rem;
}
.footer__menu__logo {
display: block;
max-width: 180px;
margin: 16px 0;
}
.footer__menu__link__icon {
width: 0.9rem;
height: 0.9rem;
}
.footer__menu__link+.footer__menu__title {
margin-top: 1rem;
}
.footer__legal {
margin-top: 2rem;
color: v.$color_tertiary;
font-size: 0.88rem;
flex: 0 0 100%;
white-space: pre-wrap;
a {
color: v.$color_primary;
}
a:hover {
text-decoration: underline;
}
}
}

View file

@ -0,0 +1,59 @@
@use "hugo:vars" as v;
.full-section {
padding: 48px 95px;
display: flex;
justify-content: center;
&>div {
flex: 0 0 100%;
box-sizing: border-box;
max-width: v.$max_content_width;
}
}
.full-section__content {
font-family: "Assistant";
font-size: 17px;
font-weight: 400;
color: v.$color_panel_text;
background: v.$color_panel_background;
padding: 34px;
&>h2 {
text-align: center;
margin-top: 0;
}
ul li {
float: left;
flex: 0 0 33%;
@media (max-width: v.$bp_mobile) {
flex: 0 0 100%;
}
color: v.$color_secondary;
font-size: 1rem;
margin-bottom: 16px;
.li__icon {
width: 20.75px;
height: 20.75px;
position: relative;
top: 4px;
margin-right: 2px;
padding: 4px;
border-radius: 50%;
background-color: rgba(v.$color_secondary, 0.1);
box-sizing: border-box;
}
}
ul {
display: flex;
flex-direction: row;
list-style-type: none;
flex-wrap: wrap;
}
}

View file

@ -0,0 +1,22 @@
@use "hugo:vars" as v;
.half-section {
padding: 48px 95px;
display: flex;
justify-content: center;
&>div {
flex: 0 0 50%;
box-sizing: border-box;
max-width: calc(v.$max_content_width / 2);
}
}
.half-section__content {
font-family: "Assistant";
font-size: 17px;
font-weight: 400;
color: v.$color_panel_text;
background: v.$color_panel_background;
padding: 34px;
}

57
assets/css/header.scss Normal file
View file

@ -0,0 +1,57 @@
@use "hugo:vars" as v;
.header__content {
margin-bottom: 0 auto 1rem auto;
max-width: v.$max_content_width;
display: flex;
text-align: center;
flex-wrap: wrap;
gap: 4px;
align-items: center;
justify-content: start;
padding: 20px 1.25rem;
margin-left: auto;
margin-right: auto;
font-family: "Assistant";
font-size: 17px;
font-weight: 500;
.header__logo {
flex: 0 0 250px;
max-width: 250px;
}
.header__spacer {
flex: 1 1 auto;
}
.header__button--text {
flex: 0 0 auto;
color: v.$color_tertiary;
padding: 8px 24px;
}
.header__button {
flex: 0 0 auto;
max-height: 55px;
border-radius: 6px;
padding: 13px 20px;
background-color: v.$color_secondary;
color: v.$color_secondary_contrast;
display: flex;
align-items: center;
justify-content: center;
&:hover {
opacity: 0.7;
cursor: pointer;
}
}
.header__button__icon {
height: 17px;
}
}

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

@ -0,0 +1,114 @@
@use "hugo:vars" as v;
html,
body {
font-size: v.$text_size;
}
body {
color: #222;
font-family: sans-serif;
line-height: 1.5;
margin: 0rem;
}
h1 {
font-size: 2.82rem;
font-weight: 400;
line-height: 1.2;
}
h2 {
font-size: 1.9375rem;
font-weight: 400;
}
h3 {
font-size: 1.235rem;
font-weight: 400;
}
h6 {
font-size: 0.706rem;
font-weight: 400;
text-transform: uppercase;
}
a {
text-decoration: none;
color: currentColor;
}
.no-top-margin {
margin-top: 0;
}
.no-bottom-margin {
margin-bottom: 0;
}
.divider {
width: 100%;
height: 5px;
margin: 0;
padding: 0;
background: linear-gradient(to right, v.$color_gradient_start, v.$color_gradient_end);
}
.primary-button {
width: fit-content;
min-width: 100px;
max-height: 55px;
border-radius: 6px;
padding: 13px 20px;
background-color: v.$color_primary;
color: v.$color_primary_contrast;
display: flex;
align-items: center;
justify-content: center;
&:hover {
opacity: 0.7;
cursor: pointer;
}
}
.primary-button__icon {
margin-left: 12px;
height: 17px;
}
main {
color: v.$color_primary;
.main__content {
max-width: v.$max_content_width;
margin-left: auto;
margin-right: auto;
padding: 1rem 1.25rem;
}
}
.page__title {
font-size: 2.53rem;
margin-bottom: 8px;
color: black;
}
.page__author {
font-size: 0.8rem;
color: v.$color_tertiary;
margin-bottom: 1rem;
}
.page__date {
color: v.$color_tertiary;
&::after {
display: block;
content: " ";
width: 100%;
height: 1px;
background-color: v.$color_hr;
margin: 32px 0px;
}
}

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

@ -0,0 +1,31 @@
@use "hugo:vars" as v;
.team-member {
font-family: "Assistant";
font-size: 17px;
font-weight: 400;
display: flex;
align-items: center;
flex-direction: column;
padding: 0 20px;
margin-bottom: 2rem;
}
.team-member__photo {
width: 100%;
max-width: 300px;
aspect-ratio: 1;
border-radius: 50%;
background-color: lightblue;
}
.team-member__name {
font-weight: 700;
}
.team-member__education {
font-size: 13px;
font-variant: small-caps;
}
.team-member__pronoun {}

5
assets/js/main.js Normal file
View file

@ -0,0 +1,5 @@
console.log('This site was generated by Hugo.');
window.addEventListener("load", () => {
feather.replace();
});

9
content/_index.md Normal file
View file

@ -0,0 +1,9 @@
+++
title = 'Home'
date = 2023-01-01T08:00:00-07:00
draft = false
+++
Laborum voluptate pariatur ex culpa magna nostrud est incididunt fugiat
pariatur do dolor ipsum enim. Consequat tempor do dolor eu. Non id id anim anim
excepteur excepteur pariatur nostrud qui irure ullamco.

7
content/posts/_index.md Normal file
View file

@ -0,0 +1,7 @@
+++
title = 'Posts'
date = 2023-01-01T08:30:00-07:00
draft = false
+++
Tempor est exercitation ad qui pariatur quis adipisicing aliquip nisi ea consequat ipsum occaecat. Nostrud consequat ullamco laboris fugiat esse esse adipisicing velit laborum ipsum incididunt ut enim. Dolor pariatur nulla quis fugiat dolore excepteur. Aliquip ad quis aliqua enim do consequat.

10
content/posts/post-1.md Normal file
View file

@ -0,0 +1,10 @@
+++
title = 'Post 1'
date = 2023-01-15T09:00:00-07:00
draft = false
tags = ['red']
+++
Tempor proident minim aliquip reprehenderit dolor et ad anim Lorem duis sint eiusmod. Labore ut ea duis dolor. Incididunt consectetur proident qui occaecat incididunt do nisi Lorem. Tempor do laborum elit laboris excepteur eiusmod do. Eiusmod nisi excepteur ut amet pariatur adipisicing Lorem.
Occaecat nulla excepteur dolore excepteur duis eiusmod ullamco officia anim in voluptate ea occaecat officia. Cillum sint esse velit ea officia minim fugiat. Elit ea esse id aliquip pariatur cupidatat id duis minim incididunt ea ea. Anim ut duis sunt nisi. Culpa cillum sit voluptate voluptate eiusmod dolor. Enim nisi Lorem ipsum irure est excepteur voluptate eu in enim nisi. Nostrud ipsum Lorem anim sint labore consequat do.

10
content/posts/post-2.md Normal file
View file

@ -0,0 +1,10 @@
+++
title = 'Post 2'
date = 2023-02-15T10:00:00-07:00
draft = false
tags = ['red','green']
+++
Anim eiusmod irure incididunt sint cupidatat. Incididunt irure irure irure nisi ipsum do ut quis fugiat consectetur proident cupidatat incididunt cillum. Dolore voluptate occaecat qui mollit laborum ullamco et. Ipsum laboris officia anim laboris culpa eiusmod ex magna ex cupidatat anim ipsum aute. Mollit aliquip occaecat qui sunt velit ut cupidatat reprehenderit enim sunt laborum. Velit veniam in officia nulla adipisicing ut duis officia.
Exercitation voluptate irure in irure tempor mollit Lorem nostrud ad officia. Velit id fugiat occaecat do tempor. Sit officia Lorem aliquip eu deserunt consectetur. Aute proident deserunt in nulla aliquip dolore ipsum Lorem ut cupidatat consectetur sit sint laborum. Esse cupidatat sit sint sunt tempor exercitation deserunt. Labore dolor duis laborum est do nisi ut veniam dolor et nostrud nostrud.

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View file

@ -0,0 +1,14 @@
+++
title = 'Post 3'
date = 2023-03-15T11:00:00-07:00
draft = false
tags = ['red','green','blue']
[params]
author = 'John Smith'
+++
Occaecat aliqua consequat laborum ut ex aute aliqua culpa quis irure esse magna dolore quis. Proident fugiat labore eu laboris officia Lorem enim. Ipsum occaecat cillum ut tempor id sint aliqua incididunt nisi incididunt reprehenderit. Voluptate ad minim sint est aute aliquip esse occaecat tempor officia qui sunt. Aute ex ipsum id ut in est velit est laborum incididunt. Aliqua qui id do esse sunt eiusmod id deserunt eu nostrud aute sit ipsum. Deserunt esse cillum Lorem non magna adipisicing mollit amet consequat.
![Bryce Canyon National Park](bryce-canyon.jpg)
Sit excepteur do velit veniam mollit in nostrud laboris incididunt ea. Amet eu cillum ut reprehenderit culpa aliquip labore laborum amet sit sit duis. Laborum id proident nostrud dolore laborum reprehenderit quis mollit nulla amet veniam officia id id. Aliquip in deserunt qui magna duis qui pariatur officia sunt deserunt.

39
hugo.toml Normal file
View file

@ -0,0 +1,39 @@
baseURL = 'https://example.org/'
languageCode = 'en-US'
[params.styles]
text_size = '17px'
max_content_width = '1024px'
color_primary = '#01486f'
color_primary_contrast = '#fff'
color_secondary = '#00a870'
color_secondary_contrast = '#fff'
color_tertiary = '#506690'
color_muted = '#869AB8'
color_hr = '#f1f4f8'
color_panel_background = 'rgba(0,0,0,0.8)'
color_panel_text = '#fff'
color_gradient_start = '#01486f'
color_gradient_end = '#00a870'
bp_mobile = '768px'
[params.stylespro]
text_size = '17px'
max_content_width = '1024px'
color_primary = '#2830d7'
color_primary_contrast = '#fff'
color_secondary = '#2887d7'
color_secondary_contrast = '#fff'
color_tertiary = '#506690'
color_muted = '#869AB8'
color_hr = '#f1f4f8'
color_panel_background = 'rgba(255,255,255,0.9)'
color_panel_text = '#2830d7'
color_gradient_start = '#7828d7'
color_gradient_end = '#2887d7'
bp_mobile = '768px'
[module]
[module.hugoVersion]
extended = false
min = '0.146.0'

3
i18n/en.toml Normal file
View file

@ -0,0 +1,3 @@
Published = 'Published'
By = 'By %s'
'Show larger map' = 'Show larger map'

3
i18n/se.toml Normal file
View file

@ -0,0 +1,3 @@
Published = 'Publicerad'
By = 'Av %s'
'Show larger map' = 'Visa större karta'

View file

@ -0,0 +1,6 @@
{{ range site.Params.contact.methods }}
<div class="contact-method">
<h6 class="contact-method__name">{{ T .name }}</h6>
<a class="contact-method__content" href="{{ .link | safeURL }}">{{ .display }}</a>
</div>
{{ end }}

View file

@ -0,0 +1,9 @@
<div class="flex-section">
<div class="flex-section__title">
{{ .title }}
</div>
<div class="flex-section__content">
{{ .content }}
</div>
</div>

View file

@ -0,0 +1,96 @@
<div class="footer__content">
<div class="footer__column">
{{ with site.Params.logo.small }}
{{ with resources.Get . }}
<img
class="footer__logo"
src="{{ .RelPermalink }}"
width="{{ .Width }}"
alt="{{ site.Params.logo.smallAlt }}" />
{{ else }}
{{ errorf "Unable to find %s in assets directory" . }}
{{ end }}
{{ end }}
<address class="footer__address">{{ site.Params.address }}</address>
<div class="footer__duns">{{ site.Params.duns }}</div>
</div>
<div
{{ if and (site.Params.footer.col2.align) (eq site.Params.footer.col2.align "right") }}
class="footer__column-right-aligned"
{{ else }}
class="footer__column"
{{ end }}>
{{ range site.Params.footer.col2.items }}
{{ if .title }}
<h6 class="footer__menu__title">{{ .title }}</h6>
{{ else if .text }}
<a class="footer__menu__link" href="{{ .href | safeURL }}">
{{ if .icon }}
<i class="footer__menu__link__icon" data-feather="{{ .icon }}"></i>
{{ end }}
{{ .text }}</a
>
{{ else if .caption }}
<div class="footer__menu__caption">{{ .caption }}</div>
{{ else if .logo }}
{{ $alt := .alt }}
{{ $href := .href }}
{{ $size := .size }}
{{ with resources.Get .logo }}
<a {{ if $href }}href="{{ $href | safeURL }}"{{ end }}>
<img
class="footer__menu__logo"
src="{{ .RelPermalink }}"
width="{{ compare.Conditional ($size) $size .Width }}"
alt="{{ $alt }}" />
</a>
{{ else }}
{{ errorf "Unable to find %s in assets directory" . }}
{{ end }}
{{ end }}
{{ end }}
</div>
<div
{{ if and (site.Params.footer.col3.align) (eq site.Params.footer.col3.align "right") }}
class="footer__column-right-aligned"
{{ else }}
class="footer__column"
{{ end }}>
{{ range site.Params.footer.col3.items }}
{{ if .title }}
<h6 class="footer__menu__title">{{ .title }}</h6>
{{ else if .text }}
<a class="footer__menu__link" href="{{ .href | safeURL }}">
{{ if .icon }}
<i class="footer__menu__link__icon" data-feather="{{ .icon }}"></i>
{{ end }}
{{ .text }}</a
>
{{ else if .caption }}
<div class="footer__menu__caption">{{ .caption }}</div>
{{ else if .logo }}
{{ $alt := .alt }}
{{ $href := .href }}
{{ $size := .size }}
{{ with resources.Get .logo }}
<a {{ if $href }}href="{{ $href | safeURL }}"{{ end }}>
<img
class="footer__menu__logo"
src="{{ .RelPermalink }}"
width="{{ compare.Conditional ($size) $size .Width }}"
alt="{{ $alt }}" />
</a>
{{ else }}
{{ errorf "Unable to find %s in assets directory" . }}
{{ end }}
{{ end }}
{{ end }}
</div>
<div class="footer__legal">
{{- partial "legal.html" }}
</div>
</div>

View file

@ -0,0 +1,19 @@
{{ $back := "" }}
{{ if .Params.background }}
{{ with resources.Get .Params.background }}
{{ $back = .RelPermalink }}
{{ else }}
{{ errorf "Unable to find %s in assets directory" . }}
{{ end }}
{{ end }}
{{ $Content := replace .Content "<li>" "<li><i class='li__icon' data-feather='check'></i>" }}
<div
class="full-section"
style="background-image:url({{ $back }});background-size:cover;background-repeat:no-repeat;background-position:center center;">
<div class="full-section__content">
{{ $Content | safeHTML }}
</div>
</div>

View file

@ -0,0 +1,17 @@
{{ $back := "" }}
{{ if .Params.background }}
{{ with resources.Get .Params.background }}
{{ $back = .RelPermalink }}
{{ else }}
{{ errorf "Unable to find %s in assets directory" . }}
{{ end }}
{{ end }}
<div
class="half-section"
style="background-image:url({{ $back }});background-size:cover;background-repeat:no-repeat;background-position:center center;">
<div class="half-section__content">
{{ .Content }}
</div>
<div>&nbsp;</div>
</div>

View file

@ -0,0 +1,39 @@
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<title>
{{ if .IsHome }}
{{ site.Title }}
{{ else }}
{{ printf "%s | %s" .Title site.Title }}
{{ end }}
</title>
{{ partialCached "head/css.html" . }}
{{ partialCached "head/js.html" . }}
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=Assistant:wght@200..800&display=swap"
rel="stylesheet" />
{{ if not .IsHome }}
<meta property="og:title" content="{{ .Title }}" />
<meta property="og:url" content="{{ .RelPermalink }}" />
<meta property="og:description" content="{{ .Description }}" />
<meta property="og:type" content="website" />
{{ end }}
{{ if eq .Name "Contact" }}
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script
id="zammad_form_script"
src="https://help.sr2.uk/assets/form/form.js"></script>
<script>
$(function () {
$("#zammad-feedback-form").ZammadForm({
agreementMessage: {{ site.Params.feedback.agreementMessage }},
messageSubmit:{{ site.Params.feedback.messageSubmit }},
messageThankYou:{{ site.Params.feedback.messageThankYou }},
showTitle: false,
noCSS: true,
});
});
</script>
{{ end }}

View file

@ -0,0 +1,21 @@
{{ range resources.Match "css/*.scss" }}
{{ with resources.Get . }}
{{ $name := . }}
{{ $opts := dict
"enableSourceMap" hugo.IsDevelopment
"outputStyle" (cond hugo.IsDevelopment "expanded" "compressed")
"targetPath" (replace $name ".scss" ".css")
"transpiler" "dartsass"
"vars" site.Params.styles
}}
{{ with . | toCSS $opts }}
{{ if hugo.IsDevelopment }}
<link rel="stylesheet" href="{{ .RelPermalink }}">
{{ else }}
{{ with . | fingerprint }}
<link rel="stylesheet" href="{{ .RelPermalink }}" integrity="{{ .Data.Integrity }}" crossorigin="anonymous">
{{ end }}
{{ end }}
{{ end }}
{{ end }}
{{ end }}

View file

@ -0,0 +1,18 @@
{{- with resources.Get "js/main.js" }}
{{- $opts := dict
"minify" (not hugo.IsDevelopment)
"sourceMap" (cond hugo.IsDevelopment "external" "")
"targetPath" "js/main.js"
}}
{{- with . | js.Build $opts }}
{{- if hugo.IsDevelopment }}
<script src="{{ .RelPermalink }}"></script>
{{- else }}
{{- with . | fingerprint }}
<script src="{{ .RelPermalink }}" integrity="{{ .Data.Integrity }}" crossorigin="anonymous"></script>
{{- end }}
{{- end }}
{{- end }}
{{- end }}
<script src="https://unpkg.com/feather-icons"></script>

View file

@ -0,0 +1,29 @@
<div class="header__content">
{{ with site.Params.logo.main }}
{{ with resources.Get . }}
<a href="/">
<img
class="header__logo"
src="{{ .RelPermalink }}"
width="{{ .Width }}"
alt="{{ site.Params.logo.mainAlt }}" />
</a>
{{ else }}
{{ errorf "Unable to find %s in assets directory" . }}
{{ end }}
{{ end }}
{{ if site.Params.header.buttons }}
<div class="header__spacer">&nbsp;</div>
{{ range site.Params.header.buttons }}
<a
class="{{ compare.Conditional (compare.Eq .type "text") "header__button--text" "header__button" }}"
href="{{ .url | safeURL }}">
{{ if .icon }}
<i class="header__button__icon" data-feather="{{ .icon }}"></i>
{{ end }}
{{ .name }}
</a>
{{ end }}
{{ end }}
</div>

View file

@ -0,0 +1,51 @@
{{- /*
Renders a menu for the given menu ID.
@context {page} page The current page.
@context {string} menuID The menu ID.
@example: {{ partial "menu.html" (dict "menuID" "main" "page" .) }}
*/}}
{{- $page := .page }}
{{- $menuID := .menuID }}
{{- with index site.Menus $menuID }}
<nav>
<ul>
{{- partial "inline/menu/walk.html" (dict "page" $page "menuEntries" .) }}
</ul>
</nav>
{{- end }}
{{- define "_partials/inline/menu/walk.html" }}
{{- $page := .page }}
{{- range .menuEntries }}
{{- $attrs := dict "href" .URL }}
{{- if $page.IsMenuCurrent .Menu . }}
{{- $attrs = merge $attrs (dict "class" "active" "aria-current" "page") }}
{{- else if $page.HasMenuCurrent .Menu .}}
{{- $attrs = merge $attrs (dict "class" "ancestor" "aria-current" "true") }}
{{- end }}
{{- $name := .Name }}
{{- with .Identifier }}
{{- with T . }}
{{- $name = . }}
{{- end }}
{{- end }}
<li>
<a
{{- range $k, $v := $attrs }}
{{- with $v }}
{{- printf " %s=%q" $k $v | safeHTMLAttr }}
{{- end }}
{{- end -}}
>{{ $name }}</a>
{{- with .Children }}
<ul>
{{- partial "inline/menu/walk.html" (dict "page" $page "menuEntries" .) }}
</ul>
{{- end }}
</li>
{{- end }}
{{- end }}

View file

@ -0,0 +1,21 @@
{{- /*
For a given taxonomy, renders a list of terms assigned to the page.
@context {page} page The current page.
@context {string} taxonomy The taxonomy.
@example: {{ partial "terms.html" (dict "taxonomy" "tags" "page" .) }}
*/}}
{{- $page := .page }}
{{- $taxonomy := .taxonomy }}
{{- with $page.GetTerms $taxonomy }}
{{- $label := (index . 0).Parent.LinkTitle }}
<div>
<span>{{ $label }}: </span>
{{- range . }}
<a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a>
{{- end }}
</div>
{{- end }}

View file

@ -0,0 +1,25 @@
{{ range (where site.RegularPages "Section" "eq" "team").ByDate }}
<div class="team-member">
{{ $altName := .Params.name }}
{{ if .Param "photo" }}
{{ $photo := .Params.photo }}
{{ with resources.Get $photo }}
<img
class="team-member__photo"
src="{{ .RelPermalink }}"
width="{{ .Width }}"
alt="{{ $altName }}" />
{{ else }}
{{ errorf "Unable to find %s in assets directory" . }}
{{ end }}
{{ else }}
<div class="team-member__photo" alt="{{ $altName }}"></div>
{{ end }}
<div>
<strong class="team-member__name">{{ .Param "name" }}</strong>
<span class="team-member__education">{{ .Param "education" }}</span>
<span class="team-member__pronoun">{{ .Param "pronoun" }}</span>
</div>
<div class="team-member__role">{{ .Param "role" }}</div>
</div>
{{ end }}

View file

@ -0,0 +1,23 @@
{{- /*
For a given taxonomy, renders a list of terms assigned to the page.
@context {page} page The current page.
@context {string} taxonomy The taxonomy.
@example: {{ partial "terms.html" (dict "taxonomy" "tags" "page" .) }}
*/}}
{{- $page := .page }}
{{- $taxonomy := .taxonomy }}
{{- with $page.GetTerms $taxonomy }}
{{- $label := (index . 0).Parent.LinkTitle }}
<div>
<div>{{ $label }}:</div>
<ul>
{{- range . }}
<li><a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a></li>
{{- end }}
</ul>
</div>
{{- end }}

View file

@ -0,0 +1,11 @@
<iframe
width="425"
height="350"
src="https://www.openstreetmap.org/export/embed.html?bbox=-2.1135646104812627%2C57.14209426300935%2C-2.1091255545616154%2C57.14353930050775&amp;layer=mapnik&amp;marker=57.142816788811984%2C-2.1113450825214386"
style="border: 1px solid black"></iframe
><br /><small
><a
href="https://www.openstreetmap.org/?mlat=57.142817&amp;mlon=-2.111345#map=19/57.142817/-2.111345"
>{{ T "Show larger map" }}</a
></small
>

View file

@ -0,0 +1,3 @@
{{ if site.Params.address }}
<address>{{ site.Params.address }}</address>
{{ end }}

View file

@ -0,0 +1,6 @@
{{ range site.Params.contact.methods }}
<div class="contact-page__method">
<h6 class="no-bottom-margin">{{ T .name }}</h6>
<a class="contact-page__method__content" href="{{ .link | safeURL }}">{{ .display }}</a>
</div>
{{ end }}

View file

@ -0,0 +1 @@
<div id="zammad-feedback-form">{{ .Params.fallback }}</div>

View file

@ -0,0 +1,6 @@
<a class="primary-button" href="{{ .Params.url }}">
{{ .Params.name }}
{{ if .Params.icon }}
<i class="primary-button__icon" data-feather="{{ .Params.icon }}"></i>
{{ end }}
</a>

22
layouts/baseof.html Normal file
View file

@ -0,0 +1,22 @@
<!doctype html>
<html
lang="{{ site.Language.LanguageCode }}"
dir="{{ or site.Language.LanguageDirection `ltr` }}">
<head>
{{ partial "head.html" . }}
</head>
<body>
<header>
{{ partial "header.html" . }}
</header>
<main>
<div class="main__content">
{{ block "main" . }}{{ end }}
</div>
{{ block "main-fullwidth" . }}{{ end }}
</main>
<footer>
{{ partial "footer.html" . }}
</footer>
</body>
</html>

View file

@ -0,0 +1,13 @@
{{ define "main" }}
<h1 class="page__title">{{ .Title }}</h1>
{{ $dateMachine := .Lastmod | time.Format "2006-01-02T15:04:05-07:00" }}
{{ $dateHuman := .Lastmod | time.Format ":date_long" }}
{{ $dateMachineP := .PublishDate | time.Format "2006-01-02T15:04:05-07:00" }}
{{ $dateHumanP := .PublishDate | time.Format ":date_long" }}
<div class="page__date">
</div>
<div class="contact-page">
{{ .Content }}
</div>
{{ end }}

6
layouts/home.html Normal file
View file

@ -0,0 +1,6 @@
{{ define "main" }}
{{ .Content }}
{{ end }}
{{ define "main-fullwidth" }}
{{ partial "home.html" . }}
{{ end }}

12
layouts/page.html Normal file
View file

@ -0,0 +1,12 @@
{{ define "main" }}
<h1 class="page__title">{{ .Title }}</h1>
{{ $dateMachine := .Lastmod | time.Format "2006-01-02T15:04:05-07:00" }}
{{ $dateHuman := .Lastmod | time.Format ":date_long" }}
<div class="page__date">
{{ T "Updated" }} <time datetime="{{ $dateMachine }}">{{ $dateHuman }}</time>
</div>
{{ .Content }}
{{ partial "terms.html" (dict "taxonomy" "tags" "page" .) }}
{{ end }}

23
layouts/posts/page.html Normal file
View file

@ -0,0 +1,23 @@
{{ define "main" }}
<h1 class="page__title">{{ .Title }}</h1>
{{ $dateMachine := .Lastmod | time.Format "2006-01-02T15:04:05-07:00" }}
{{ $dateHuman := .Lastmod | time.Format ":date_long" }}
{{ $dateMachineP := .PublishDate | time.Format "2006-01-02T15:04:05-07:00" }}
{{ $dateHumanP := .PublishDate | time.Format ":date_long" }}
{{ if .Params.author }}
<div class="page__author">{{ printf (T "By") .Params.author }}</div>
{{ end }}
<div class="page__date">
{{ T "Published" }} <time datetime="{{ $dateMachineP }}">{{ $dateHumanP }}</time>
<br/>
{{ T "Updated" }} <time datetime="{{ $dateMachine }}">{{ $dateHuman }}</time>
<div class="page__tag">
{{ partial "page-tags.html" (dict "taxonomy" "tags" "page" .) }}
</div>
</div>
{{ .Content }}
{{ end }}

View file

@ -0,0 +1,11 @@
{{ define "main" }}
<h1>{{ .Title }}</h1>
{{ .Content }}
{{ range .Pages }}
<section>
<h2 class="no-bottom-margin"><a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a></h2>
<h4 class="no-top-margin">{{ .PublishDate }}</h4>
{{ .Summary }}
</section>
{{ end }}
{{ end }}

10
layouts/section.html Normal file
View file

@ -0,0 +1,10 @@
{{ define "main" }}
<h1>{{ .Title }}</h1>
{{ .Content }}
{{ range .Pages }}
<section>
<h2><a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a></h2>
{{ .Summary }}
</section>
{{ end }}
{{ end }}

7
layouts/taxonomy.html Normal file
View file

@ -0,0 +1,7 @@
{{ define "main" }}
<h1>{{ .Title }}</h1>
{{ .Content }}
{{ range .Pages }}
<h2><a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a></h2>
{{ end }}
{{ end }}

7
layouts/term.html Normal file
View file

@ -0,0 +1,7 @@
{{ define "main" }}
<h1>{{ .Title }}</h1>
{{ .Content }}
{{ range .Pages }}
<h2><a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a></h2>
{{ end }}
{{ end }}

BIN
static/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB