first commit
This commit is contained in:
17
layouts/_default/baseof.html
Normal file
17
layouts/_default/baseof.html
Normal file
@@ -0,0 +1,17 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="{{ .Site.LanguageCode | default "en" }}" class="no-js">
|
||||
<head>
|
||||
{{ partial "head.html" . }}
|
||||
</head>
|
||||
<body>
|
||||
{{- partial "header.html" . -}}
|
||||
|
||||
<div class="site-wrapper">
|
||||
{{- block "main" . }}{{- end }}
|
||||
</div>
|
||||
|
||||
{{- partial "footer.html" . -}}
|
||||
|
||||
<script src="{{ "js/main.js" | relURL }}"></script>
|
||||
</body>
|
||||
</html>
|
||||
139
layouts/_default/list.html
Normal file
139
layouts/_default/list.html
Normal file
@@ -0,0 +1,139 @@
|
||||
{{ define "main" }}
|
||||
<div class="content-grid">
|
||||
|
||||
<main id="main-content">
|
||||
|
||||
<!-- Section Header -->
|
||||
<div style="margin-bottom:1.5rem; padding-bottom:1rem; border-bottom:2px solid var(--border-dim);">
|
||||
<h1 style="font-family:var(--font-terminal); font-size:1.8rem; color:var(--amber-light); letter-spacing:0.06em; text-shadow: 0 0 10px var(--glow-amber);">
|
||||
{{ if .IsHome }}ARCHIVE{{ else }}{{ .Title | upper }}{{ end }}
|
||||
</h1>
|
||||
<p class="taxonomy-header">
|
||||
<span style="color:var(--forest-light);">~/{{ .Section | default "posts" }} $</span>
|
||||
ls -la •
|
||||
<span style="color:var(--amber);">{{ len .Pages }} entries</span>
|
||||
</p>
|
||||
</div>
|
||||
{{- $tags := .Site.Taxonomies.tags }}
|
||||
{{- $currentTag := .Data.Term }}
|
||||
{{- with $tags }}
|
||||
<div style="display:flex; flex-wrap:wrap; gap:0.4rem; margin-bottom:1.5rem; align-items:center;">
|
||||
<span style="font-family:var(--font-terminal); font-size:0.8rem; color:var(--forest-light); letter-spacing:0.08em; margin-right:0.25rem;">FILTER:</span>
|
||||
<a href="{{ "posts/" | relURL }}"
|
||||
class="tag"
|
||||
style="{{ if not $currentTag }}color:var(--amber); border-color:var(--amber-dark);{{ end }}">
|
||||
all
|
||||
</a>
|
||||
{{- range $name, $pages := $tags }}
|
||||
<a href="{{ "tags/" | relURL }}{{ $name | urlize }}/"
|
||||
class="tag"
|
||||
style="{{ if eq $name $currentTag }}color:var(--amber); border-color:var(--amber-dark);{{ end }}">
|
||||
{{ $name }}
|
||||
<span style="color:var(--text-dim); font-size:0.75em;">({{ len $pages }})</span>
|
||||
</a>
|
||||
{{- end }}
|
||||
</div>
|
||||
{{- end }}
|
||||
|
||||
{{- if .Pages }}
|
||||
|
||||
{{/* Group posts by year */}}
|
||||
{{- range (.Pages.GroupByDate "2006") }}
|
||||
<div style="margin-bottom:2.5rem;">
|
||||
|
||||
<!-- Year marker -->
|
||||
<div style="
|
||||
font-family: var(--font-terminal);
|
||||
font-size: 0.8rem;
|
||||
color: var(--text-dim);
|
||||
letter-spacing: 0.15em;
|
||||
padding: 0.3rem 0;
|
||||
margin-bottom: 1rem;
|
||||
border-bottom: 1px solid var(--border-dim);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.75rem;
|
||||
">
|
||||
<span style="color:var(--orange);">▶</span>
|
||||
<span>YEAR://{{ .Key }}</span>
|
||||
<span>({{ len .Pages }} entries)</span>
|
||||
</div>
|
||||
|
||||
<ul class="post-list">
|
||||
{{- range .Pages }}
|
||||
<li class="post-card pixel-border" data-index="{{ .Date.Format "01-02" }}">
|
||||
|
||||
<div class="post-card__meta">
|
||||
<span class="prompt">$ cat</span>
|
||||
<span class="post-card__date">{{ .Date.Format "Jan 02" }}</span>
|
||||
</div>
|
||||
|
||||
<h2 class="post-card__title">
|
||||
<a href="{{ .Permalink }}">{{ .Title }}</a>
|
||||
</h2>
|
||||
|
||||
{{- with .Params.subtitle }}
|
||||
<p class="post-subtitle" style="font-family:var(--font-body); font-style:italic; color:var(--text-muted); font-size:0.88rem; margin-bottom:0.5rem; margin-top:-0.3rem;">{{ . }}</p>
|
||||
{{- end }}
|
||||
|
||||
{{- with .Summary }}
|
||||
<p class="post-card__summary">{{ . }}</p>
|
||||
{{- end }}
|
||||
|
||||
{{- with .Params.tags }}
|
||||
<div class="post-card__tags">
|
||||
{{- range . }}
|
||||
<a href="{{ "tags/" | relURL }}{{ . | urlize }}/" class="tag">{{ . }}</a>
|
||||
{{- end }}
|
||||
</div>
|
||||
{{- end }}
|
||||
|
||||
</li>
|
||||
{{- end }}
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
{{- end }}
|
||||
|
||||
{{- else }}
|
||||
<div class="pixel-border" style="padding:2rem; font-family:var(--font-terminal); color:var(--text-dim); text-align:center; line-height:2;">
|
||||
<p>// QUERY RETURNED 0 RESULTS</p>
|
||||
<p style="color:var(--text-muted); font-style:italic; font-family:var(--font-body); margin-top:0.5rem;">
|
||||
The archive is silent. Return when manuscripts have been added.
|
||||
</p>
|
||||
</div>
|
||||
{{- end }}
|
||||
|
||||
<!-- Pagination -->
|
||||
{{- template "partials/pagination.html" . }}
|
||||
|
||||
</main>
|
||||
|
||||
<!-- Sidebar -->
|
||||
{{ partial "sidebar.html" . }}
|
||||
|
||||
</div>
|
||||
{{ end }}
|
||||
|
||||
{{- define "partials/pagination.html" }}
|
||||
{{- $pager := .Paginate .Pages }}
|
||||
{{- if gt $pager.TotalPages 1 }}
|
||||
<nav class="pagination" aria-label="Pagination">
|
||||
{{- if $pager.HasPrev }}
|
||||
<a href="{{ $pager.Prev.URL }}"><< PREV</a>
|
||||
{{- end }}
|
||||
|
||||
{{- range $pager.Pagers }}
|
||||
{{- if eq . $pager }}
|
||||
<span class="current">{{ .PageNumber }}</span>
|
||||
{{- else }}
|
||||
<a href="{{ .URL }}">{{ .PageNumber }}</a>
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{- if $pager.HasNext }}
|
||||
<a href="{{ $pager.Next.URL }}">NEXT >></a>
|
||||
{{- end }}
|
||||
</nav>
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
113
layouts/_default/single.html
Normal file
113
layouts/_default/single.html
Normal file
@@ -0,0 +1,113 @@
|
||||
{{ define "main" }}
|
||||
<div class="content-grid">
|
||||
|
||||
<!-- Article -->
|
||||
<article id="main-content">
|
||||
|
||||
<!-- Post Header -->
|
||||
<header class="post-header">
|
||||
|
||||
<!-- Breadcrumb -->
|
||||
<nav class="post-breadcrumb" aria-label="Breadcrumb">
|
||||
<a href="{{ .Site.BaseURL }}">~/</a>
|
||||
<span aria-hidden="true">/</span>
|
||||
{{- with .Section }}
|
||||
<a href="{{ $.Site.BaseURL }}{{ . }}/">{{ . }}</a>
|
||||
<span aria-hidden="true">/</span>
|
||||
{{- end }}
|
||||
<span>{{ .File.BaseFileName }}</span>
|
||||
</nav>
|
||||
|
||||
<!-- Title -->
|
||||
<h1 class="post-title">{{ .Title }}</h1>
|
||||
{{- with .Params.subtitle }}
|
||||
<p class="post-subtitle">{{ . }}</p>
|
||||
{{- end }}
|
||||
<!-- Meta -->
|
||||
<div class="post-meta">
|
||||
<div class="post-meta__item">
|
||||
<span class="post-meta__label">DATE</span>
|
||||
<time class="post-meta__value" datetime="{{ .Date.Format "2006-01-02" }}">
|
||||
{{ .Date.Format "January 2, 2006" }}
|
||||
</time>
|
||||
</div>
|
||||
|
||||
{{- with .Params.author }}
|
||||
<div class="post-meta__item">
|
||||
<span class="post-meta__label">BY</span>
|
||||
<span class="post-meta__value">{{ . }}</span>
|
||||
</div>
|
||||
{{- else }}
|
||||
{{- with $.Site.Params.author }}
|
||||
<div class="post-meta__item">
|
||||
<span class="post-meta__label">BY</span>
|
||||
<span class="post-meta__value">{{ . }}</span>
|
||||
</div>
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
<div class="post-meta__item">
|
||||
<span class="post-meta__label">READ</span>
|
||||
<span class="post-reading-time">~{{ .ReadingTime }} min</span>
|
||||
</div>
|
||||
|
||||
{{- if .Params.lastmod }}
|
||||
<div class="post-meta__item">
|
||||
<span class="post-meta__label">UPDATED</span>
|
||||
<time class="post-meta__value" datetime="{{ .Lastmod.Format "2006-01-02" }}">
|
||||
{{ .Lastmod.Format "2006-01-02" }}
|
||||
</time>
|
||||
</div>
|
||||
{{- end }}
|
||||
</div>
|
||||
|
||||
</header>
|
||||
|
||||
<!-- Body -->
|
||||
<div class="post-body">
|
||||
{{ .Content }}
|
||||
</div>
|
||||
|
||||
<!-- Footer -->
|
||||
<footer class="post-footer">
|
||||
|
||||
{{- with .Params.tags }}
|
||||
<div class="post-tags-section">
|
||||
<span class="post-tags-section__label">TAGS ›</span>
|
||||
{{- range . }}
|
||||
<a href="{{ "tags/" | relURL }}{{ . | urlize }}/" class="tag">{{ . }}</a>
|
||||
{{- end }}
|
||||
</div>
|
||||
{{- end }}
|
||||
|
||||
<!-- Prev / Next -->
|
||||
{{- if or .PrevInSection .NextInSection }}
|
||||
<nav class="post-nav" aria-label="Post navigation">
|
||||
{{- if .PrevInSection }}
|
||||
<a href="{{ .PrevInSection.Permalink }}" class="post-nav__item pixel-border post-nav__item--prev">
|
||||
<span class="post-nav__label"><< PREV ENTRY</span>
|
||||
<span class="post-nav__title">{{ .PrevInSection.Title }}</span>
|
||||
</a>
|
||||
{{- else }}
|
||||
<div></div>
|
||||
{{- end }}
|
||||
|
||||
{{- if .NextInSection }}
|
||||
<a href="{{ .NextInSection.Permalink }}" class="post-nav__item pixel-border post-nav__item--next">
|
||||
<span class="post-nav__label">NEXT ENTRY >></span>
|
||||
<span class="post-nav__title">{{ .NextInSection.Title }}</span>
|
||||
</a>
|
||||
{{- end }}
|
||||
</nav>
|
||||
{{- end }}
|
||||
|
||||
</footer>
|
||||
|
||||
{{ partial "comments.html" . }}
|
||||
</article>
|
||||
|
||||
<!-- Sidebar -->
|
||||
{{ partial "sidebar.html" . }}
|
||||
|
||||
</div>
|
||||
{{ end }}
|
||||
194
layouts/donate/single.html
Normal file
194
layouts/donate/single.html
Normal file
@@ -0,0 +1,194 @@
|
||||
{{ define "main" }}
|
||||
<div class="content-grid">
|
||||
<main id="main-content">
|
||||
|
||||
<!-- Donate Header -->
|
||||
<div class="donate-header pixel-border">
|
||||
<div style="font-family:var(--font-terminal); font-size:0.85rem; color:var(--forest-light); margin-bottom:1rem;">
|
||||
<span>~/donate $</span> <span style="color:var(--amber);">cat tip_jar.md</span>
|
||||
</div>
|
||||
<h1 class="post-title">{{ .Title }}</h1>
|
||||
<p style="font-family:var(--font-body); font-style:italic; color:var(--text-warm); font-size:1rem; margin-top:0.5rem;">
|
||||
{{- with .Params.subtitle }}{{ . }}{{- else }}If you enjoy the writing and want to keep the tea kettle going, any support is deeply appreciated.{{- end }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- Donate Body (optional intro markdown) -->
|
||||
{{- with .Content }}
|
||||
<div class="resume-body" style="margin-bottom:2rem;">{{ . }}</div>
|
||||
{{- end }}
|
||||
|
||||
<!-- Platforms -->
|
||||
<div class="donate-grid">
|
||||
|
||||
{{- with .Params.kofi }}
|
||||
<a href="https://ko-fi.com/{{ . }}" target="_blank" rel="noopener" class="donate-card pixel-border">
|
||||
<span class="donate-card__icon"><img src="/kofi.webp" width=30px height=30px/></span>
|
||||
<div class="donate-card__name">Ko-fi</div>
|
||||
<div class="donate-card__handle">ko-fi.com/{{ . }}</div>
|
||||
<div class="donate-card__desc">Buy me a cup of cof- I mean, uh, tea. Ko-fi is not the most inclusive name...</div>
|
||||
</a>
|
||||
{{- end }}
|
||||
|
||||
{{- with .Params.liberapay }}
|
||||
<a href="https://liberapay.com/{{ . }}" target="_blank" rel="noopener" class="donate-card pixel-border">
|
||||
<span class="donate-card__icon"><img src="/liberapay.svg" width=30px height=30px/></span>
|
||||
<div class="donate-card__name">Liberapay</div>
|
||||
<div class="donate-card__handle">liberapay.com/{{ . }}</div>
|
||||
<div class="donate-card__desc">Like Patreon or Onlyfans but, like, better.</div>
|
||||
</a>
|
||||
{{- end }}
|
||||
|
||||
{{- with .Params.github_sponsors }}
|
||||
<a href="https://github.com/sponsors/{{ . }}" target="_blank" rel="noopener" class="donate-card pixel-border">
|
||||
<div class="donate-card__icon">🐙</div>
|
||||
<div class="donate-card__name">GitHub Sponsors</div>
|
||||
<div class="donate-card__handle">github.com/sponsors/{{ . }}</div>
|
||||
<div class="donate-card__desc">Support via GitHub</div>
|
||||
</a>
|
||||
{{- end }}
|
||||
|
||||
</div>
|
||||
|
||||
<!-- Crypto Wallets -->
|
||||
{{- $hasCrypto := or .Params.bitcoin .Params.ethereum .Params.monero .Params.litecoin }}
|
||||
{{- if $hasCrypto }}
|
||||
<div class="donate-section">
|
||||
<h2 class="donate-section__title">Crypto Wallets: unlike the fed, I don't have an inflation fetish</h2>
|
||||
|
||||
{{- with .Params.bitcoin }}
|
||||
<div class="wallet-card pixel-border">
|
||||
<div class="wallet-card__header">
|
||||
<span class="wallet-card__icon"><img src="/bitcoin_logo.png" width=30px height=30px/></span>
|
||||
<span class="wallet-card__name">Bitcoin</span>
|
||||
<span class="wallet-card__ticker">BTC</span>
|
||||
</div>
|
||||
<div class="wallet-card__body">
|
||||
<div class="wallet-card__address">
|
||||
<span class="wallet-card__addr-text" id="btc-addr">{{ . }}</span>
|
||||
<button class="wallet-card__copy" onclick="copyAddr('btc-addr', this)">[ copy ]</button>
|
||||
</div>
|
||||
<canvas class="wallet-qr" id="qr-btc" data-address="{{ . }}"></canvas>
|
||||
</div>
|
||||
</div>
|
||||
{{- end }}
|
||||
|
||||
{{- with .Params.ethereum }}
|
||||
<div class="wallet-card pixel-border">
|
||||
<div class="wallet-card__header">
|
||||
<span class="wallet-card__icon"><img src="/ethereum_logo.png" width=15px height=30px/></span>
|
||||
<span class="wallet-card__name">Ethereum</span>
|
||||
<span class="wallet-card__ticker">ETH</span>
|
||||
</div>
|
||||
<div class="wallet-card__body">
|
||||
<div class="wallet-card__address">
|
||||
<span class="wallet-card__addr-text" id="eth-addr">{{ . }}</span>
|
||||
<button class="wallet-card__copy" onclick="copyAddr('eth-addr', this)">[ copy ]</button>
|
||||
</div>
|
||||
<canvas class="wallet-qr" id="qr-eth" data-address="{{ . }}"></canvas>
|
||||
</div>
|
||||
</div>
|
||||
{{- end }}
|
||||
|
||||
{{- with .Params.monero }}
|
||||
<div class="wallet-card pixel-border">
|
||||
<div class="wallet-card__header">
|
||||
<span class="wallet-card__icon"><img src="/monero_logo.png" width=30px height=30px/></span>
|
||||
<span class="wallet-card__name">Monero</span>
|
||||
<span class="wallet-card__ticker">XMR</span>
|
||||
</div>
|
||||
<div class="wallet-card__body">
|
||||
<div class="wallet-card__address">
|
||||
<span class="wallet-card__addr-text" id="xmr-addr">{{ . }}</span>
|
||||
<button class="wallet-card__copy" onclick="copyAddr('xmr-addr', this)">[ copy ]</button>
|
||||
</div>
|
||||
<canvas class="wallet-qr" id="qr-xmr" data-address="{{ . }}"></canvas>
|
||||
</div>
|
||||
</div>
|
||||
{{- end }}
|
||||
|
||||
{{- with .Params.litecoin }}
|
||||
<div class="wallet-card pixel-border">
|
||||
<div class="wallet-card__header">
|
||||
<span class="wallet-card__icon"><img src="/litecoin.png" width=30px height=30px/></span>
|
||||
<span class="wallet-card__name">Litecoin</span>
|
||||
<span class="wallet-card__ticker">LTC</span>
|
||||
</div>
|
||||
<div class="wallet-card__body">
|
||||
<div class="wallet-card__address">
|
||||
<span class="wallet-card__addr-text" id="ltc-addr">{{ . }}</span>
|
||||
<button class="wallet-card__copy" onclick="copyAddr('ltc-addr', this)">[ copy ]</button>
|
||||
</div>
|
||||
<canvas class="wallet-qr" id="qr-ltc" data-address="{{ . }}"></canvas>
|
||||
</div>
|
||||
</div>
|
||||
{{- end }}
|
||||
|
||||
</div>
|
||||
{{- end }}
|
||||
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/qrcodejs/1.0.0/qrcode.min.js"></script>
|
||||
<script>
|
||||
// Copy address to clipboard
|
||||
function copyAddr(id, btn) {
|
||||
var text = document.getElementById(id).textContent.trim();
|
||||
navigator.clipboard.writeText(text).then(function() {
|
||||
var orig = btn.textContent;
|
||||
btn.textContent = '[ copied! ]';
|
||||
btn.style.color = 'var(--forest-light)';
|
||||
setTimeout(function() { btn.textContent = orig; btn.style.color = ''; }, 2000);
|
||||
});
|
||||
}
|
||||
|
||||
// Theme colours (match CSS variables)
|
||||
var QR_DARK = '#d4a228'; // --amber: the "on" modules
|
||||
var QR_LIGHT = '#130e07'; // --bg-primary: the "off" background
|
||||
|
||||
// Generate a QR code into each canvas
|
||||
document.querySelectorAll('.wallet-qr').forEach(function(canvas) {
|
||||
var address = canvas.getAttribute('data-address');
|
||||
if (!address) return;
|
||||
|
||||
// qrcode.js needs a fresh div to render into, then we pull the image
|
||||
var tmp = document.createElement('div');
|
||||
tmp.style.display = 'none';
|
||||
document.body.appendChild(tmp);
|
||||
|
||||
new QRCode(tmp, {
|
||||
text: address,
|
||||
width: 160,
|
||||
height: 160,
|
||||
colorDark: QR_DARK,
|
||||
colorLight: QR_LIGHT,
|
||||
correctLevel: QRCode.CorrectLevel.M,
|
||||
});
|
||||
|
||||
// qrcode.js creates an <img> inside the div once done
|
||||
// Give it a tick to finish then copy to our canvas
|
||||
setTimeout(function() {
|
||||
var img = tmp.querySelector('img');
|
||||
if (!img) return;
|
||||
img.onload = function() {
|
||||
canvas.width = 160;
|
||||
canvas.height = 160;
|
||||
var ctx = canvas.getContext('2d');
|
||||
ctx.drawImage(img, 0, 0, 160, 160);
|
||||
document.body.removeChild(tmp);
|
||||
};
|
||||
// If already loaded
|
||||
if (img.complete) {
|
||||
canvas.width = 160;
|
||||
canvas.height = 160;
|
||||
var ctx = canvas.getContext('2d');
|
||||
ctx.drawImage(img, 0, 0, 160, 160);
|
||||
document.body.removeChild(tmp);
|
||||
}
|
||||
}, 100);
|
||||
});
|
||||
</script>
|
||||
|
||||
</main>
|
||||
|
||||
{{ partial "sidebar.html" . }}
|
||||
</div>
|
||||
{{ end }}
|
||||
133
layouts/index.html
Normal file
133
layouts/index.html
Normal file
@@ -0,0 +1,133 @@
|
||||
{{ define "main" }}
|
||||
|
||||
<!-- Cozy Hero Card -->
|
||||
<section class="hero">
|
||||
<div class="hero__card pixel-border">
|
||||
|
||||
<!-- Pixel art book/tea illustration -->
|
||||
<div class="hero__pixel-art" aria-hidden="true">
|
||||
<img src="profile_pic.png" width=250 height=250>
|
||||
</div>
|
||||
|
||||
<div class="hero__info">
|
||||
<!-- Name bar -->
|
||||
<div class="hero__name-bar pixel-border">
|
||||
<span class="label">SCHOLAR:</span>
|
||||
<span class="value">{{ .Site.Params.author | default "archivist" }}</span>
|
||||
<span class="label" style="margin-left:auto;">STATUS:</span>
|
||||
<span class="value" style="color:var(--forest-light);">reading</span>
|
||||
</div>
|
||||
|
||||
<!-- Status pips -->
|
||||
<div class="hero__status">
|
||||
<span style="color:var(--text-dim);">TEA:</span>
|
||||
<span class="pip"></span>
|
||||
<span class="pip"></span>
|
||||
<span class="pip"></span>
|
||||
<span class="pip"></span>
|
||||
<span class="pip--dim pip"></span>
|
||||
|
||||
<span style="color:var(--text-dim);">WHIMSY:</span>
|
||||
<span class="pip"></span>
|
||||
<span class="pip"></span>
|
||||
<span class="pip"></span>
|
||||
<span class="pip"></span>
|
||||
<span class="pip"></span>
|
||||
</div>
|
||||
|
||||
<!-- Description -->
|
||||
<p class="hero__desc">
|
||||
{{- with .Site.Params.description -}}
|
||||
{{ . }}
|
||||
{{- else -}}
|
||||
A wanderer in the archive. Keeper of fragments, collector of marginalia.
|
||||
Pull up a chair. The kettle is on.
|
||||
{{- end -}}
|
||||
</p>
|
||||
|
||||
<!-- Post count -->
|
||||
<div style="font-family:var(--font-terminal); font-size:0.92rem; color:var(--text-dim);">
|
||||
<span style="color:var(--forest-light);">entries:</span>
|
||||
{{ len .Site.RegularPages }}
|
||||
|
||||
{{- with .Site.Taxonomies.tags }}
|
||||
<span style="color:var(--forest-light);">topics:</span>
|
||||
{{ len . }}
|
||||
{{- end }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div><!-- /.hero__card -->
|
||||
|
||||
<!--<div class="hero__cta">
|
||||
<a href="{{ "posts/" | relURL }}" class="btn btn--primary">
|
||||
[ open archive ]
|
||||
</a>
|
||||
<a href="{{ "about/" | relURL }}" class="btn btn--secondary">
|
||||
[ about ]
|
||||
</a>
|
||||
</div> -->
|
||||
</section>
|
||||
|
||||
<!-- Content + Sidebar Grid -->
|
||||
<div class="content-grid">
|
||||
<main id="main-content">
|
||||
|
||||
{{- $pinned := where .Site.RegularPages "Params.featured" true }}
|
||||
{{- $recent := first 8 (where .Site.RegularPages "Params.featured" "!=" true) }}
|
||||
{{- $posts := $recent }}
|
||||
{{- if $pinned }}
|
||||
{{- $posts = union $pinned $recent }}
|
||||
{{- end }}
|
||||
|
||||
{{- if $posts }}
|
||||
<ul class="post-list">
|
||||
{{- range $i, $post := first 2 $posts }}
|
||||
<li class="post-card pixel-border" data-index="{{ printf "%03d" (add $i 1) }}">
|
||||
|
||||
<div class="post-card__meta">
|
||||
<span class="prompt">~/posts $</span>
|
||||
<span class="post-card__date">{{ $post.Date.Format "2006-01-02" }}</span>
|
||||
{{- if $post.Params.featured }}
|
||||
<span style="color:var(--amber); font-size:0.8em;">[FEATURED]</span>
|
||||
{{- end }}
|
||||
</div>
|
||||
|
||||
<h2 class="post-card__title">
|
||||
<a href="{{ $post.Permalink }}">{{ $post.Title }}</a>
|
||||
</h2>
|
||||
|
||||
{{- with $post.Summary }}
|
||||
<p class="post-card__summary">{{ . }}</p>
|
||||
{{- end }}
|
||||
|
||||
{{- with $post.Params.tags }}
|
||||
<div class="post-card__tags">
|
||||
{{- range . }}
|
||||
<a href="{{ "tags/" | relURL }}{{ . | urlize }}/" class="tag">{{ . }}</a>
|
||||
{{- end }}
|
||||
</div>
|
||||
{{- end }}
|
||||
|
||||
</li>
|
||||
{{- end }}
|
||||
</ul>
|
||||
{{- else }}
|
||||
<div class="pixel-border" style="padding:2rem; font-family:var(--font-terminal); color:var(--text-dim); text-align:center;">
|
||||
<p>// No entries found. The archive awaits its first manuscript.</p>
|
||||
</div>
|
||||
{{- end }}
|
||||
|
||||
{{- if gt (len .Site.RegularPages) 2 }}
|
||||
<div style="margin-top:1.5rem; text-align:center;">
|
||||
<a href="{{ "posts/" | relURL }}" class="btn btn--secondary">[ view all entries ]</a>
|
||||
</div>
|
||||
{{- end }}
|
||||
|
||||
</main>
|
||||
|
||||
{{ partial "sidebar.html" . }}
|
||||
|
||||
</div>
|
||||
|
||||
{{ end }}
|
||||
13
layouts/partials/comments.html
Normal file
13
layouts/partials/comments.html
Normal file
@@ -0,0 +1,13 @@
|
||||
{{- if and (not .Params.nocomments) (.Site.Params.comentarioURL) }}
|
||||
<div class="comments-section">
|
||||
<div class="comments-section__header">
|
||||
<span class="widget-icon">💬</span> DISCUSSION
|
||||
</div>
|
||||
<div id="comentario"></div>
|
||||
<script defer
|
||||
src="{{ .Site.Params.comentarioURL }}/comentario.js"
|
||||
data-page-id="{{ .Permalink }}">
|
||||
</script>
|
||||
<comentario-comments></comentario-comments>
|
||||
</div>
|
||||
{{- end }}
|
||||
81
layouts/partials/footer.html
Normal file
81
layouts/partials/footer.html
Normal file
@@ -0,0 +1,81 @@
|
||||
<footer class="site-footer">
|
||||
<div class="site-wrapper">
|
||||
|
||||
<div class="footer-inner">
|
||||
|
||||
<!-- I don't like this stuff personally but feel free to put it back in -->
|
||||
<!-- Col 1: About
|
||||
<div class="footer-col">
|
||||
<div class="footer-col__title">ABOUT</div>
|
||||
<p style="font-family:var(--font-terminal); font-size:0.82rem; color:var(--text-dim); line-height:1.7;">
|
||||
{{- with .Site.Params.description }}{{ . }}{{ else }}
|
||||
A place for words, ideas, and the quiet rustle of digital manuscripts.
|
||||
{{- end }}
|
||||
</p>
|
||||
</div>-->
|
||||
|
||||
<!-- Col 2: Navigation
|
||||
<div class="footer-col">
|
||||
<div class="footer-col__title">NAVIGATION</div>
|
||||
<ul class="footer-links">
|
||||
{{- range .Site.Menus.footer }}
|
||||
<li><a href="{{ .URL }}">{{ .Name }}</a></li>
|
||||
{{- end }}
|
||||
{{- if not .Site.Menus.footer }}
|
||||
<li><a href="{{ .Site.BaseURL }}">home</a></li>
|
||||
<li><a href="{{ "posts/" | relURL }}">archive</a></li>
|
||||
<li><a href="{{ "tags/" | relURL }}">index</a></li>
|
||||
<li><a href="{{ "about/" | relURL }}">about</a></li>
|
||||
<li><a href="{{ "index.xml" | relURL }}">rss feed</a></li>
|
||||
{{- end }}
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<!-- Col 3: Connect
|
||||
<div class="footer-col">
|
||||
<div class="footer-col__title">CONNECT</div>
|
||||
<ul class="footer-links">
|
||||
{{- with .Site.Params.social.github }}
|
||||
<li><a href="https://github.com/{{ . }}" target="_blank" rel="noopener">github</a></li>
|
||||
{{- end }}
|
||||
{{- with .Site.Params.social.mastodon }}
|
||||
<li><a href="{{ . }}" target="_blank" rel="noopener">mastodon</a></li>
|
||||
{{- end }}
|
||||
{{- with .Site.Params.social.email }}
|
||||
<li><a href="mailto:{{ . }}">email</a></li>
|
||||
{{- end }}
|
||||
{{- with .Site.Params.social.rss }}
|
||||
<li><a href="{{ . | relURL }}">rss</a></li>
|
||||
{{- else }}
|
||||
<li><a href="{{ "index.xml" | relURL }}">rss</a></li>
|
||||
{{- end }}
|
||||
</ul>
|
||||
</div>
|
||||
-->
|
||||
</div>
|
||||
|
||||
<!-- Status Bar -->
|
||||
<div class="footer-status">
|
||||
<div class="status-left">
|
||||
<span class="status-indicator">
|
||||
<span class="status-dot"></span>
|
||||
SYSTEM ONLINE
|
||||
</span>
|
||||
<span>{{ now.Format "2006-01-02" }}</span>
|
||||
<span>
|
||||
{{- $pages := len .Site.RegularPages -}}
|
||||
{{ $pages }} ENTRIES INDEXED
|
||||
</span>
|
||||
</div>
|
||||
<div class="status-right">
|
||||
<span>HUGO v{{ hugo.Version }}</span>
|
||||
<span class="status-copyright">
|
||||
© {{ now.Year }}
|
||||
{{- with .Site.Params.author }} {{ . }}{{ end }}
|
||||
— CODEX OBSCURA THEME
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div><!-- /.site-wrapper -->
|
||||
</footer>
|
||||
85
layouts/partials/head.html
Normal file
85
layouts/partials/head.html
Normal file
@@ -0,0 +1,85 @@
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
|
||||
<!-- LaTeX Rendering -->
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css">
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.js"></script>
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/contrib/auto-render.min.js"
|
||||
onload="renderMathInElement(document.body, {
|
||||
delimiters: [
|
||||
{left: '$$', right: '$$', display: true},
|
||||
{left: '$', right: '$', display: false}
|
||||
]
|
||||
});">
|
||||
</script>
|
||||
|
||||
|
||||
<!-- Syntax Highlighting -->
|
||||
<!-- Highlight.js for better Common Lisp support -->
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/base16/monokai.min.css">
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/lisp.min.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/python.min.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/julia.min.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/r.min.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/bash.min.js"></script>
|
||||
<script>hljs.highlightAll();</script>
|
||||
|
||||
{{- with .Site.Params.description }}
|
||||
<meta name="description" content="{{ . }}" />
|
||||
{{- end }}
|
||||
|
||||
{{- with .Description }}
|
||||
<meta name="description" content="{{ . }}" />
|
||||
{{- end }}
|
||||
|
||||
{{- with .Site.Params.author }}
|
||||
<meta name="author" content="{{ . }}" />
|
||||
{{- end }}
|
||||
|
||||
<!-- Open Graph -->
|
||||
<meta property="og:type" content="{{ if .IsPage }}article{{ else }}website{{ end }}" />
|
||||
<meta property="og:title" content="{{ if .IsHome }}{{ .Site.Title }}{{ else }}{{ .Title }} — {{ .Site.Title }}{{ end }}" />
|
||||
<meta property="og:description" content="{{ with .Description }}{{ . }}{{ else }}{{ .Site.Params.description }}{{ end }}" />
|
||||
<meta property="og:url" content="{{ .Permalink }}" />
|
||||
{{- with .Site.Params.ogImage }}
|
||||
<meta property="og:image" content="{{ . | absURL }}" />
|
||||
{{- end }}
|
||||
|
||||
<!-- Twitter -->
|
||||
<meta name="twitter:card" content="summary_large_image" />
|
||||
<meta name="twitter:title" content="{{ if .IsHome }}{{ .Site.Title }}{{ else }}{{ .Title }} — {{ .Site.Title }}{{ end }}" />
|
||||
|
||||
<title>{{ if .IsHome }}{{ .Site.Title }}{{ else }}{{ .Title }} — {{ .Site.Title }}{{ end }}</title>
|
||||
|
||||
<!-- Canonical -->
|
||||
<link rel="canonical" href="{{ .Permalink }}" />
|
||||
|
||||
<!-- RSS -->
|
||||
{{ range .AlternativeOutputFormats -}}
|
||||
<link rel="{{ .Rel }}" type="{{ .MediaType.Type }}" href="{{ .Permalink }}" title="{{ $.Site.Title }}" />
|
||||
{{ end -}}
|
||||
|
||||
<!-- Favicon — pixel style -->
|
||||
<link rel="icon" type="image/svg+xml" href="{{ "favicon.svg" | relURL }}" />
|
||||
<link rel="alternate icon" href="{{ "favicon.ico" | relURL }}" />
|
||||
|
||||
<!-- Google Fonts -->
|
||||
<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=VT323&family=IM+Fell+English:ital@0;1&family=Courier+Prime:ital,wght@0,400;0,700;1,400&display=swap" rel="stylesheet" />
|
||||
|
||||
<!-- Theme CSS -->
|
||||
<link rel="stylesheet" href="{{ "css/main.css" | relURL }}" />
|
||||
|
||||
{{- with .Site.Params.customCSS }}
|
||||
{{- range . }}
|
||||
<link rel="stylesheet" href="{{ . | relURL }}" />
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
<!-- Inline critical SVG favicon -->
|
||||
<style>
|
||||
/* Favicon SVG embedded for retro pixel look */
|
||||
</style>
|
||||
51
layouts/partials/header.html
Normal file
51
layouts/partials/header.html
Normal file
@@ -0,0 +1,51 @@
|
||||
<header class="site-header">
|
||||
<div class="site-wrapper">
|
||||
<div class="header-inner">
|
||||
|
||||
<!-- Decorative deco row — books, leaves, tea -->
|
||||
|
||||
<!-- Site Title -->
|
||||
<div style="display:flex; align-items:baseline; gap:1rem; flex-wrap:wrap;">
|
||||
<a href="{{ .Site.BaseURL }}" class="site-title">
|
||||
<span class="site-title__prompt">~/</span>
|
||||
<span class="site-title__name">{{ .Site.Title | default "Codex Obscura" }}</span>
|
||||
<!-- span class="site-title__cursor" aria-hidden="true">█</span -->
|
||||
</a>
|
||||
{{- with .Site.Params.tagline }}
|
||||
<span class="site-tagline">{{ . }}</span>
|
||||
{{- end }}
|
||||
</div>
|
||||
<div class="site-deco" aria-hidden="true">
|
||||
<font size="3.5pt"> ✨ this | is | customized | in | partials | header | line | 19 ✨ </font>
|
||||
</div>
|
||||
|
||||
<!-- Navigation -->
|
||||
<nav class="site-nav" aria-label="Primary navigation">
|
||||
{{ $currentPage := . }}
|
||||
{{- range .Site.Menus.main }}
|
||||
<div class="nav-item{{ if $currentPage.IsMenuCurrent "main" . }} nav-item--active{{ end }}">
|
||||
<a href="{{ .URL }}">
|
||||
{{ .Name }}
|
||||
|
||||
</a>
|
||||
</div>
|
||||
{{- end }}
|
||||
{{- if not .Site.Menus.main }}
|
||||
<div class="nav-item{{ if .IsHome }} nav-item--active{{ end }}">
|
||||
<a href="{{ .Site.BaseURL }}">home</a>
|
||||
</div>
|
||||
<div class="nav-item">
|
||||
<a href="{{ "posts/" | relURL }}">posts</a>
|
||||
</div>
|
||||
<div class="nav-item">
|
||||
<a href="{{ "tags/" | relURL }}">tags</a>
|
||||
</div>
|
||||
<div class="nav-item">
|
||||
<a href="{{ "about/" | relURL }}">about</a>
|
||||
</div>
|
||||
{{- end }}
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
80
layouts/partials/sidebar.html
Normal file
80
layouts/partials/sidebar.html
Normal file
@@ -0,0 +1,80 @@
|
||||
<aside class="sidebar" aria-label="Sidebar">
|
||||
|
||||
<!-- System Info Widget -->
|
||||
<div class="sidebar-widget pixel-border">
|
||||
<div class="sidebar-widget__header"><span class="site-title__cursor" aria-hidden="true">█</span>SYS_INFO</div>
|
||||
<div class="sys-info">
|
||||
<div class="sys-info__row">
|
||||
<span class="sys-info__key">HOST</span>
|
||||
<span class="sys-info__val">{{ .Site.Title | default "codex" }}</span>
|
||||
</div>
|
||||
<div class="sys-info__row">
|
||||
<span class="sys-info__key">LANG</span>
|
||||
<span class="sys-info__val">{{ .Site.LanguageCode | default "en-US" }}</span>
|
||||
</div>
|
||||
<div class="sys-info__row">
|
||||
<span class="sys-info__key">ENTRIES</span>
|
||||
<span class="sys-info__val">{{ len .Site.RegularPages }}</span>
|
||||
</div>
|
||||
<div class="sys-info__row">
|
||||
<span class="sys-info__key">TAGS</span>
|
||||
<span class="sys-info__val">{{ len .Site.Taxonomies.tags }}</span>
|
||||
</div>
|
||||
<div class="sys-info__row">
|
||||
<span class="sys-info__key">STATUS</span>
|
||||
<span class="sys-info__val" style="color:var(--forest-light)">ONLINE</span>
|
||||
</div>
|
||||
<div class="sys-info__row">
|
||||
<span class="sys-info__key">UPTIME</span>
|
||||
<span class="sys-info__val" id="js-uptime">--:--:--</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Recent Posts Widget -->
|
||||
{{- $recent := first 5 .Site.RegularPages }}
|
||||
{{- if $recent }}
|
||||
<div class="sidebar-widget pixel-border">
|
||||
<div class="sidebar-widget__header"><span class="widget-icon">📖</span> RECENT</div>
|
||||
<ul class="sidebar-posts">
|
||||
{{- range $recent }}
|
||||
<li class="sidebar-post">
|
||||
<a href="{{ .Permalink }}">{{ .Title }}</a>
|
||||
<span class="sidebar-post__date">{{ .Date.Format "2006-01-02" }}</span>
|
||||
</li>
|
||||
{{- end }}
|
||||
</ul>
|
||||
</div>
|
||||
{{- end }}
|
||||
|
||||
<!-- Tags Widget
|
||||
{{- with .Site.Taxonomies.tags }}
|
||||
<div class="sidebar-widget pixel-border">
|
||||
<div class="sidebar-widget__header"><span class="widget-icon">🏷</span> INDEX</div>
|
||||
<div class="sidebar-tags">
|
||||
{{- range $name, $pages := . }}
|
||||
<a href="{{ "tags/" | relURL }}{{ $name | urlize }}/" class="tag">
|
||||
{{ $name }}
|
||||
<span style="color:var(--text-dim);font-size:0.75em;">({{ len $pages }})</span>
|
||||
</a>
|
||||
{{- end }}
|
||||
</div>
|
||||
</div>
|
||||
{{- end }}-->
|
||||
|
||||
<!-- Quote Widget -->
|
||||
{{- with .Site.Params.sidebarQuote }}
|
||||
<div class="sidebar-widget pixel-border" style="border-left:3px solid var(--amber-dark);">
|
||||
<div class="sidebar-widget__header"><span class="widget-icon">🪶</span> MARGINALIA</div>
|
||||
<p style="font-family:var(--font-body); font-style:italic; font-size:0.85rem; color:var(--text-muted); line-height:1.65;">
|
||||
“{{ . }}”
|
||||
</p>
|
||||
{{- with $.Site.Params.sidebarQuoteAuthor }}
|
||||
<p style="font-family:var(--font-terminal); font-size:0.75rem; color:var(--text-dim); margin-top:0.5rem; text-align:right;">
|
||||
— {{ . }}
|
||||
</p>
|
||||
{{- end }}
|
||||
</div>
|
||||
{{- end }}
|
||||
|
||||
</aside>
|
||||
48
layouts/resume/single.html
Normal file
48
layouts/resume/single.html
Normal file
@@ -0,0 +1,48 @@
|
||||
{{ define "main" }}
|
||||
<div class="content-grid">
|
||||
<main id="main-content">
|
||||
|
||||
<!-- Resume Header -->
|
||||
<div class="resume-header pixel-border">
|
||||
<div class="resume-header__top">
|
||||
<div class="resume-header__prompt">
|
||||
<span style="color:var(--forest-light);">~/resume $</span>
|
||||
<span style="color:var(--amber);"> cat dossier.md</span>
|
||||
</div>
|
||||
<a href="{{ .Site.Params.resumePDF | default "#" }}" class="btn btn--primary" style="font-size:0.85rem; padding:0.3rem 0.9rem;">
|
||||
[ download .pdf ]
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<h1 class="resume-name">{{ .Params.resumeName | default .Site.Params.author | default "Your Name" }}</h1>
|
||||
|
||||
{{- with .Params.resumeTitle }}
|
||||
<div class="resume-title">{{ . }}</div>
|
||||
{{- end }}
|
||||
|
||||
<div class="resume-contacts">
|
||||
{{- with .Params.email }}
|
||||
<span class="resume-contact"><span class="resume-contact__label">mail:</span> <a href="mailto:{{ . }}">{{ . }}</a></span>
|
||||
{{- end }}
|
||||
{{- with .Params.location }}
|
||||
<span class="resume-contact"><span class="resume-contact__label">loc:</span> {{ . }}</span>
|
||||
{{- end }}
|
||||
{{- with .Params.website }}
|
||||
<span class="resume-contact"><span class="resume-contact__label">web:</span> <a href="{{ . }}">{{ . }}</a></span>
|
||||
{{- end }}
|
||||
{{- with .Params.github }}
|
||||
<span class="resume-contact"><span class="resume-contact__label">git:</span> <a href="https://github.com/{{ . }}" target="_blank" rel="noopener">{{ . }}</a></span>
|
||||
{{- end }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Resume Body from markdown -->
|
||||
<div class="resume-body">
|
||||
{{ .Content }}
|
||||
</div>
|
||||
|
||||
</main>
|
||||
|
||||
{{ partial "sidebar.html" . }}
|
||||
</div>
|
||||
{{ end }}
|
||||
139
layouts/tags/taxonomy.html
Normal file
139
layouts/tags/taxonomy.html
Normal file
@@ -0,0 +1,139 @@
|
||||
{{ define "main" }}
|
||||
<div class="content-grid">
|
||||
|
||||
<main id="main-content">
|
||||
|
||||
<!-- Section Header -->
|
||||
<div style="margin-bottom:1.5rem; padding-bottom:1rem; border-bottom:2px solid var(--border-dim);">
|
||||
<h1 style="font-family:var(--font-terminal); font-size:1.8rem; color:var(--amber-light); letter-spacing:0.06em; text-shadow: 0 0 10px var(--glow-amber);">
|
||||
{{ if .IsHome }}ARCHIVE{{ else }}{{ .Title | upper }}{{ end }}
|
||||
</h1>
|
||||
<p class="taxonomy-header">
|
||||
<span style="color:var(--forest-light);">~/{{ .Section | default "posts" }} $</span>
|
||||
ls -la •
|
||||
<span style="color:var(--amber);">{{ len .Pages }} entries</span>
|
||||
</p>
|
||||
</div>
|
||||
{{- $tags := .Site.Taxonomies.tags }}
|
||||
{{- $currentTag := .Data.Term }}
|
||||
{{- with $tags }}
|
||||
<div style="display:flex; flex-wrap:wrap; gap:0.4rem; margin-bottom:1.5rem; align-items:center;">
|
||||
<span style="font-family:var(--font-terminal); font-size:0.8rem; color:var(--forest-light); letter-spacing:0.08em; margin-right:0.25rem;">FILTER:</span>
|
||||
<a href="{{ "posts/" | relURL }}"
|
||||
class="tag"
|
||||
style="{{ if not $currentTag }}color:var(--amber); border-color:var(--amber-dark);{{ end }}">
|
||||
all
|
||||
</a>
|
||||
{{- range $name, $pages := $tags }}
|
||||
<a href="{{ "tags/" | relURL }}{{ $name | urlize }}/"
|
||||
class="tag"
|
||||
style="{{ if eq $name $currentTag }}color:var(--amber); border-color:var(--amber-dark);{{ end }}">
|
||||
{{ $name }}
|
||||
<span style="color:var(--text-dim); font-size:0.75em;">({{ len $pages }})</span>
|
||||
</a>
|
||||
{{- end }}
|
||||
</div>
|
||||
{{- end }}
|
||||
|
||||
{{- if .Pages }}
|
||||
|
||||
{{/* Group posts by year */}}
|
||||
{{- range (.Pages.GroupByDate "2006") }}
|
||||
<div style="margin-bottom:2.5rem;">
|
||||
|
||||
<!-- Year marker -->
|
||||
<div style="
|
||||
font-family: var(--font-terminal);
|
||||
font-size: 0.8rem;
|
||||
color: var(--text-dim);
|
||||
letter-spacing: 0.15em;
|
||||
padding: 0.3rem 0;
|
||||
margin-bottom: 1rem;
|
||||
border-bottom: 1px solid var(--border-dim);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.75rem;
|
||||
">
|
||||
<span style="color:var(--orange);">▶</span>
|
||||
<span>YEAR://{{ .Key }}</span>
|
||||
<span>({{ len .Pages }} entries)</span>
|
||||
</div>
|
||||
|
||||
<ul class="post-list">
|
||||
{{- range .Pages }}
|
||||
<li class="post-card pixel-border" data-index="{{ .Date.Format "01-02" }}">
|
||||
|
||||
<div class="post-card__meta">
|
||||
<span class="prompt">$ cat</span>
|
||||
<span class="post-card__date">{{ .Date.Format "Jan 02" }}</span>
|
||||
</div>
|
||||
|
||||
<h2 class="post-card__title">
|
||||
<a href="{{ .Permalink }}">{{ .Title }}</a>
|
||||
</h2>
|
||||
|
||||
{{- with .Params.subtitle }}
|
||||
<p class="post-subtitle" style="font-family:var(--font-body); font-style:italic; color:var(--text-muted); font-size:0.88rem; margin-bottom:0.5rem; margin-top:-0.3rem;">{{ . }}</p>
|
||||
{{- end }}
|
||||
|
||||
{{- with .Summary }}
|
||||
<p class="post-card__summary">{{ . }}</p>
|
||||
{{- end }}
|
||||
|
||||
{{- with .Params.tags }}
|
||||
<div class="post-card__tags">
|
||||
{{- range . }}
|
||||
<a href="{{ "tags/" | relURL }}{{ . | urlize }}/" class="tag">{{ . }}</a>
|
||||
{{- end }}
|
||||
</div>
|
||||
{{- end }}
|
||||
|
||||
</li>
|
||||
{{- end }}
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
{{- end }}
|
||||
|
||||
{{- else }}
|
||||
<div class="pixel-border" style="padding:2rem; font-family:var(--font-terminal); color:var(--text-dim); text-align:center; line-height:2;">
|
||||
<p>// QUERY RETURNED 0 RESULTS</p>
|
||||
<p style="color:var(--text-muted); font-style:italic; font-family:var(--font-body); margin-top:0.5rem;">
|
||||
The archive is silent. Return when manuscripts have been added.
|
||||
</p>
|
||||
</div>
|
||||
{{- end }}
|
||||
|
||||
<!-- Pagination -->
|
||||
{{- template "partials/pagination.html" . }}
|
||||
|
||||
</main>
|
||||
|
||||
<!-- Sidebar -->
|
||||
{{ partial "sidebar.html" . }}
|
||||
|
||||
</div>
|
||||
{{ end }}
|
||||
|
||||
{{- define "partials/pagination.html" }}
|
||||
{{- $pager := .Paginate .Pages }}
|
||||
{{- if gt $pager.TotalPages 1 }}
|
||||
<nav class="pagination" aria-label="Pagination">
|
||||
{{- if $pager.HasPrev }}
|
||||
<a href="{{ $pager.Prev.URL }}"><< PREV</a>
|
||||
{{- end }}
|
||||
|
||||
{{- range $pager.Pagers }}
|
||||
{{- if eq . $pager }}
|
||||
<span class="current">{{ .PageNumber }}</span>
|
||||
{{- else }}
|
||||
<a href="{{ .URL }}">{{ .PageNumber }}</a>
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{- if $pager.HasNext }}
|
||||
<a href="{{ $pager.Next.URL }}">NEXT >></a>
|
||||
{{- end }}
|
||||
</nav>
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
30
layouts/tags/terms.html
Normal file
30
layouts/tags/terms.html
Normal file
@@ -0,0 +1,30 @@
|
||||
{{ define "main" }}
|
||||
<div class="content-grid">
|
||||
<main id="main-content">
|
||||
|
||||
<div style="margin-bottom:1.5rem; padding-bottom:1rem; border-bottom:2px solid var(--border-dim);">
|
||||
<h1 style="font-family:var(--font-terminal); font-size:1.8rem; color:var(--amber-light); letter-spacing:0.06em; text-shadow: 0 0 10px var(--glow-amber);">
|
||||
TOPIC INDEX
|
||||
</h1>
|
||||
<p class="taxonomy-header">
|
||||
<span style="color:var(--forest-light);">~/tags $</span>
|
||||
ls •
|
||||
<span style="color:var(--amber);">{{ len .Data.Terms }} topics found</span>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<ul class="taxonomy-list">
|
||||
{{- range .Data.Terms.Alphabetical }}
|
||||
<li class="taxonomy-list__item">
|
||||
<a href="{{ .Page.Permalink }}">
|
||||
#{{ .Page.Title }}
|
||||
<span class="count">{{ .Count }}</span>
|
||||
</a>
|
||||
</li>
|
||||
{{- end }}
|
||||
</ul>
|
||||
|
||||
</main>
|
||||
{{ partial "sidebar.html" . }}
|
||||
</div>
|
||||
{{ end }}
|
||||
Reference in New Issue
Block a user