Compare commits

...

13 Commits

16 changed files with 653 additions and 60 deletions

View File

@ -1,6 +1,6 @@
GPL3 License
Copyright (c) 2023 Nathan Upchurch
Copyright (c) 2023-2024 Nathan Upchurch
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@ -20,6 +20,7 @@ My blog, originally based on the very helpful eleventy-base-blog v8, although it
* All blog posts
* Each individual tag
* /now page that nicely handles posts tagged with "now"
* Blogroll generated from _data/blogroll.js, with an automatically updated .opml so that visitors can import every blog in the list
### Technical
* Reusable web components:
@ -34,4 +35,4 @@ My blog, originally based on the very helpful eleventy-base-blog v8, although it
* robots.txt tells AI scrapers to GTFO
### Weird and Wonderful
* [Accessible cowsay output embedding](https://upchur.ch/gitea/n_u/nathanupchurch.com/wiki#add-a-cowsay-to-a-post)
* [Accessible ~~cowsay~~ cowthink output embedding](https://upchur.ch/gitea/n_u/nathanupchurch.com/wiki#add-a-cowsay-to-a-post)

450
_data/blogroll.js Normal file
View File

@ -0,0 +1,450 @@
export default {
categories: [
{
name: "Comics",
blogs: [
{
title: "Incidental Comics",
feedUrl:
"http://www.incidentalcomics.com/feeds/posts/default?alt=rss",
url: "http://www.incidentalcomics.com",
description: "Nice comics about words, et cetera.",
},
{
title: "XKCD",
feedUrl: "https://xkcd.com/rss.xml",
url: "https://xkcd.com",
description: "Does XKCD needs an introduction?",
},
],
},
{
name: "Design",
blogs: [
{
title: "Libre Arts",
feedUrl: "https://librearts.org/index.xml",
url: "https://librearts.org",
description: "News on FLOSS creative software.",
},
{
title: "Autumn Kotsiuba",
feedUrl: "https://autumnkotsiuba.wixsite.com/portfolio/blog-feed.xml",
url: "https://autumnkotsiuba.wixsite.com",
description: "Autumn blogs about UX content design.",
},
{
title: "Dave Smyth",
feedUrl: "https://davesmyth.com/commonplace-feed",
url: "https://davesmyth.com",
description:
"Dave Smyth is a designer and developer interested in privacy, type and ethics.",
},
{
title: "Grumpy Website",
feedUrl: "https://grumpy.website/feed.xml",
url: "https://grumpy.website",
description: "Grumpy takes on UI mistakes.",
},
{
title: "TypeOff.",
feedUrl: "https://www.typeoff.de/rss",
url: "https://www.typeoff.de",
description:
"A blog from Dan Reynolds, a design researcher based in Wuppertal, Germany.",
},
{
title: "UX Daily",
feedUrl: "https://www.interaction-design.org/rss/site_news.xml",
url: "https://www.interaction-design.org",
description: "The Worlds Largest Free Online Resource on UX Design ",
},
],
},
{
name: "Food & Beverage",
blogs: [
{
title: "Cocktail Doodle",
feedUrl: "https://cocktaildoodle.substack.com/feed",
url: "https://cocktaildoodle.substack.com",
description:
"A charming (but perhaps abandoned) blog from cocktail expert Luke Andrews.",
},
{
title: "Sarah's Vegan Kitchen",
feedUrl: "https://sarahsvegankitchen.com/feed/",
url: "https://sarahsvegankitchen.com",
description:
"Sarah has years of recipes including complex staples like vegan cultured butter.",
},
],
},
{
name: "General Interest",
blogs: [
{
title: "Big Think",
feedUrl: "https://bigthink.com/feed",
url: "https://bigthink.com",
description: "Big thoughts on big issues.",
},
{
title: "Clients from Hell",
feedUrl: "https://notalwaysright.com/tag/clients-from-hell/feed",
url: "https://notalwaysright.com/tag/clients-from-hell",
description:
"Cathartic stories about clients behaving badly from notalwaysright.com.",
},
{
title: "kottke.org",
feedUrl: "https://feeds.kottke.org/main",
url: "https://kottke.org",
description: "Home of fine hypertext products since 1998.",
},
{
title: "Neatorama",
feedUrl: "https://www.neatorama.com/feed",
url: "https://www.neatorama.com/",
description: "Yep, Neatorama's still around!",
},
{
title: "The Reframe",
feedUrl: "https://www.the-reframe.com/rss/",
url: "https://www.the-reframe.com/",
description:
"Essays on politics and narrative fiction from A.R. Moxon.",
},
{
title: "Webcurios",
feedUrl: "https://webcurios.co.uk/feed",
url: "https://webcurios.co.uk",
description:
"A regular(-ish) newsletterblogtypething all about stuff on the internet that its author finds interesting and thinks you might too.",
},
],
},
{
name: "Health",
blogs: [
{
title: "ADDitude",
feedUrl: "https://www.additudemag.com/feed/",
url: "https://www.additudemag.com/",
description:
"The worlds most trusted resource for families and adults living with ADHD and related conditions, and for the professionals who work with them.",
},
{
title: "The Gauntlet",
feedUrl: "https://www.thegauntlet.news/feed",
url: "https://www.thegauntlet.news",
description:
"A newsletter covering the current science on, and commentary related to, the unmitigated spread of COVID.",
},
],
},
{
name: "Incense, Fragrance, and Perfumery",
blogs: [
{
title: "Apothecary's Garden Blog",
feedUrl: "https://apothecarysgarden.com/blogs/blog.atom",
url: "https://apothecarysgarden.com/blogs/blog",
description:
"Explore the world of natural aromatics, and the communities that bring them to us",
},
{
title: "Ayala Moriel Parfums - SmellyBlog",
feedUrl: "https://ayalamoriel.com/blogs/smellyblog.atom",
url: "https://ayalamoriel.com/blogs/smellyblog",
description:
"Ayala Moriel Parfums is an independent artisan perfume house dedicated to the art of natural perfumery.",
},
{
title: "A whiff of Ambrosia",
feedUrl: "https://whiffofambrosia.wordpress.com/feed/",
url: "https://whiffofambrosia.wordpress.com/",
description: "Incense reviews and more. (Abandoned?)",
},
{
title: "Dr. Incense",
feedUrl: "https://dr-incense.com/blogs/dr-incense-blog.atom",
url: "https://dr-incense.com/blogs/dr-incense-blog",
description:
"Traditional incense maker and founder of the Incense Culture Association of Singapore, and Nanyang Culture Academy.",
},
{
title: "Glass Petal Smoke",
feedUrl: "https://glasspetalsmoke.blogspot.com/feeds/posts/default",
url: "https://glasspetalsmoke.blogspot.com/",
description:
"Decoder of flavors and fragrances. Creator of Smell & Tell programming.",
},
{
title: "Incense In The Dark",
feedUrl: "https://incenseinthewind.blogspot.com/feeds/posts/default",
url: "https://incenseinthewind.blogspot.com/",
description: "Incense reviews, rankings, and information.",
},
{
title: "Kikoh Incense",
feedUrl: "https://kikohincense.com/blogs/news.atom",
url: "https://kikohincense.com/blogs/news",
description:
"Detailed descriptions of incense listening sessions from the Kikoh Incense web store.",
},
{
title: "KyaraZen",
feedUrl: "https://www.kyarazen.com/feed/",
url: "https://www.kyarazen.com/",
description:
"Very informative (but perhaps abandoned) blog from world-renowned incense maker KyaraZen.",
},
{
title: "Olfactory Rescue Service",
feedUrl: "https://olfactoryrescueservice.wordpress.com/feed",
url: "https://olfactoryrescueservice.wordpress.com",
description:
"The ultimate retail incense resource providing incense writing and reviews.",
},
{
title: "Ratnagandh",
feedUrl: "https://ratnagandh.wordpress.com/feed/",
url: "https://ratnagandh.wordpress.com/",
description: "Short incense reviews.",
},
{
title: "Rauchfahne",
feedUrl: "https://blog.rauchfahne.de/en/feed/",
url: "https://blog.rauchfahne.de/en/",
description:
"Incense reviews and writing in German and English from incense maker, enthusiast, and industry insider Irene.",
},
{
title: "Reed's Handmade Incense Blog",
feedUrl: "https://reedshandmadeincense.com/blog/feed/",
url: "https://reedshandmadeincense.com/blog/",
description:
"Writing on incense, tea, and other topics from the Reed's Handmade Incense web store.",
},
{
title: "The Parfum Apothecary - Learning & Culture",
feedUrl:
"https://www.theparfumapothecary.com/blogs/learning-culture.atom",
url: "https://www.theparfumapothecary.com/blogs/learning-culture",
description: "Writing on perfume and its history. (Abandoned?)",
},
],
},
{
name: "News",
blogs: [
{
title: "openDemocracy",
feedUrl: "https://www.opendemocracy.net/en/feed",
url: "https://www.opendemocracy.net/",
description:
"High-quality journalism which challenges power, inspires change and builds leadership among groups underrepresented in the media.",
},
],
},
{
name: "Personal Blogs",
blogs: [
{
title: "Andy Bell",
feedUrl: "https://andy-bell.co.uk/feed.xml",
url: "https://andy-bell.co.uk",
description:
"Designer, front-end developer and the founder of Set Studio and Piccalilli.",
},
{
title: "Darek Kay",
feedUrl: "https://darekkay.com/atom.xml",
url: "https://darekkay.com",
description:
"Front-end developer and an accessibility advocate, currently working at IBM.",
},
{
title: "Ellie Kennard",
feedUrl: "https://www.elliekennard.ca/feed",
url: "https://www.elliekennard.ca",
description: "Photography and thoughts in story form.",
},
{
title: "Garbage Collector",
feedUrl: "https://blog.zedas.fr/index.xml",
url: "https://zedas.fr/",
description:
"The little space of a writer, tinkerer, and a coffee addict.",
},
{
title: "Later On",
feedUrl: "https://leisureguy.ca/rss",
url: "https://leisureguy.ca",
description:
"Writing on wet shaving, politics, whole food plant based diets, and more.",
},
{
title: "Luke Andrews",
feedUrl: "https://world.hey.com/lukeandrews/feed.atom",
url: "https://world.hey.com/lukeandrews",
description: "A sparse (abandoned?) blog from Luke Andrews.",
},
{
title: "MediaActivist",
feedUrl: "https://www.mediaactivist.com/rss/",
url: "https://www.mediaactivist.com/",
description:
"The website of Jay Baker (they/he), a long-time guerrilla journalist and documentarian.",
},
{
title: "Ploum.net",
feedUrl: "https://ploum.net/atom_en.xml",
url: "https://ploum.net/index_en.html",
description:
"Writing on tech and free / libre and open source philosophy.",
},
{
title: "Rosnovsky Park",
feedUrl: "https://rosnovsky.us/feed/feed.xml",
url: "https://rosnovsky.us/",
description:
"Writing on web development, hiking, and random hobbies from the venerable benefactor, founder, and admin of the lounge.town Mastodon instance.",
},
{
title: "Simone",
feedUrl: "https://simone.org/rss",
url: "https://simone.org/",
description:
"Explore modern life via thought-provoking essays, pictures, and conversations.",
},
{
title: "Steven Kennard : Turned Art, Sculpture and Photography",
feedUrl: "https://stevenkennard.com/blog/rss",
url: "https://stevenkennard.com/blog",
description:
"Steven Kennard is a woodturner, sculptor and photographer living and working in Nova Scotia, Canada.",
},
{
title: "Stories by Ellen Feinberg",
feedUrl: "https://ellensusie59.medium.com/feed",
url: "https://ellensusie59.medium.com",
description: "Uptown Chicago gal. Irreverent/Irrelevant/Sarcastic.",
},
{
title: "Thefoggiest.dev",
feedUrl: "https://thefoggiest.dev/feed",
url: "https://thefoggiest.dev",
description: "The personal blog of Diederick de Vries of Amsterdam.",
},
{
title: "TorrentFreak",
feedUrl: "http://torrentfreak.com/feed",
url: "http://torrentfreak.com/",
description: "Breaking File-sharing, Copyright and Privacy News.",
},
],
},
{
name: "Tech",
blogs: [
{
title: "9to5Linux",
feedUrl: "https://9to5linux.com/rss",
url: "https://9to5linux.com/",
description: "Linux news, reviews, tutorials, and more",
},
{
title: "It's FOSS",
feedUrl: "https://itsfoss.com/feed/",
url: "https://itsfoss.com/",
description: "Making You a Better Linux User.",
},
{
title: "LinuxInsider",
feedUrl: "https://www.linuxinsider.com?rss=1",
url: "https://www.linuxinsider.com",
description: "Linux News & Information From Around the World.",
},
{
title: "LOW←TECH MAGAZINE",
feedUrl: "https://solar.lowtechmagazine.com/posts/index.xml",
url: "https://solar.lowtechmagazine.com/posts/",
description:
"This is a solar-powered website, which means it sometimes goes offline.",
},
{
title: "Planet KDE",
feedUrl: "https://planet.kde.org/global/atom.xml",
url: "https://planet.kde.org/",
description:
"A feed aggregator that collects what the contributors to the KDE community are writing on their respective blogs.",
},
{
title: "Pluralistic",
feedUrl: "https://pluralistic.net/feed/",
url: "https://pluralistic.net/",
description: "Daily links from Cory Doctorow",
},
{
title: "Werd I/O",
feedUrl: "https://werd.io/feed",
url: "https://werd.io",
description:
"Writing at the intersection of technology, democracy, and society by Ben Werdmuller.",
},
{
title: "We Distribute",
feedUrl: "https://wedistribute.org/rss",
url: "https://wedistribute.org",
description: "Connecting threads across the Web.",
},
],
},
{
name: "Veganism",
blogs: [
{
title: "Vegan Horizon",
feedUrl: "https://veganhorizon.substack.com/feed",
url: "https://veganhorizon.substack.com",
description:
"The vegan newsletter you've been waiting for! Brave, disruptive, to the point.",
},
],
},
{
name: "Web Development",
blogs: [
{
title: "CSS Tricks",
feedUrl: "https://css-tricks.com/feed",
url: "https://css-tricks.com",
description:
"Tips, Tricks, and Techniques on using Cascading Style Sheets.",
},
{
title: "Chris Coyier",
feedUrl: "https://chriscoyier.net/feed/",
url: "https://chriscoyier.net",
description: "Web craftsman, blogger, author, speaker.",
},
{
title: "Jim Nielsens Blog",
feedUrl: "https://blog.jim-nielsen.com/feed.xml",
url: "https://blog.jim-nielsen.com",
description:
"20+ years at the intersection of design & code on the web.",
},
{
title: "Own Your Web",
feedUrl: "https://buttondown.email/ownyourweb/rss",
url: "https://buttondown.com/ownyourweb",
description:
"A newsletter by Matthias Ott about designing, building, creating, and publishing for and on the Web.",
},
],
},
],
};

View File

@ -9,5 +9,7 @@
{% if webring.nextURL %}<a href="{{ webring.nextURL }}">→</a>{% endif %}
</span>
{% endfor %}
{% endif %}</p>
{% endif %}
<a href="/sitemap/">Sitemap</a>
</p>
</footer>

View File

@ -0,0 +1,21 @@
<!doctype html>
<html lang="{{ metadata.language }}">
<head>
{% include "metadata.njk" %}
{#- Bundle CSS #}
{%- css %}{% include "public/css/index.css" %}{% endcss %}
{%- css %}{% include "public/css/webfonts/webfonts.css" %}{% endcss %}
<style>{% getBundle "css" %}</style>
{% include "structuredData.njk" %}
{% include "umami.html" %}
</head>
<body>
{% include "header.njk" %}
<main id="skip">
<section class="full-width-text">
{{ content | safe }}
</section>
</main>
{% include "footer.njk" %}
</body>
</html>

View File

@ -0,0 +1,11 @@
---
layout: layouts/base_full_width_text.njk
---
# Colophon
I built this website using [the 11ty static site generator](https://www.11ty.dev/), free and open source variable typefaces [Fraunces](https://fraunces.undercase.xyz/)[^1] and [Manrope](https://www.gent.media/manrope)[^2], and plain-old HTML, CSS, with some vanilla JavaScript for the web components that I built to handle comments. I used the handy calculators on [utopia.fyi](https://utopia.fyi)[^3] to help me implement fluid typography and spacing. [Here's the repo](https://upchur.ch/gitea/n_u/nathanupchurch.com) in case you'd like to have a look at the source.
[^1]: Designed by Phaedra Charles and Flavia Zimbardi, with contributions by Ethan Cohen, and Andy Clymer.
[^2]: Designed by Mikhail Sharanda with thanks to Mirko Velimirovic for contribution.
[^3]: Created by James Gilyead & Trys Mudford.

View File

@ -5,18 +5,19 @@ eleventyNavigation:
order: 3
---
<article>
<h1>About me and this website Ive built.</h1>
<p>Im a prolific vegan home cook, classical trombonist, a <abbr title="Free/Libre Open Source Software">FLOSS</abbr> enthusiast, daily GNU/Linux user and unabashed <a href="https://kde.org/">KDE</a> stan, speaker of subpar elementary Spanish, incense maker and appreciator, writer, electronics hobbyist, designer, programmer, music producer, print lover, and human with too many interests and too little time.</p>
<h1>About me and my website.</h1>
<p class="page-block nodropcap">Im a prolific vegan home cook, classical trombonist, incense maker, a <abbr title="Free/Libre Open Source Software">FLOSS</abbr> enthusiast, daily GNU/Linux user and unabashed <a href="https://kde.org/">KDE</a> stan, designer, programmer, music producer, print lover, and human with too many interests and too little time. This is my little corner of the internet where I talk about whatever I like without worrying about maintaining a personal brand, or constraining subject matter to topics which might help advance my career or establish me as a thought leader. Im here to express myself and have fun writing about topics I enjoy. If youd like to learn more about my professional accomplishments and work, Ill link my professional website here when I get around to it.</p>
<p>This is my personal website and blog, a little corner of the internet where I can talk about whatever I like without worrying about maintaining a personal brand, or constraining subject matter to those topics which might help advance my career or establish me as a thought leader. Im here to express myself as a human and have fun writing about topics I enjoy. If youd like to learn more about my professional accomplishments and work, Ill link my professional website here soon.</p>
<a href="./colophon/">
<button type="button">Colophon »</button>
</a>
<h2>About this website</h2>
<p>This website is made with <a href="https://www.11ty.dev/">the 11ty static site generator</a>, free and open source variable typefaces <a href="https://fraunces.undercase.xyz/">Fraunces</a> and <a href="https://www.gent.media/manrope">Manrope</a>, along with plain-old HTML, CSS, and some vanilla JavaScript for the web components that I built to handle comments. I used the handy calculators on <a href="https://utopia.fyi">utopia.fyi</a> to help me implement fluid typography and spacing.</p>
<a href="../me/">
<button type="button">Contact »</button>
</a>
<p>I dont collect any of your personal information, full-stop. All webfonts, icons, and images are hosted locally (these things can sometimes be used to <a href="https://www.firstpost.com/world/how-google-uses-fonts-to-track-what-users-do-online-and-sell-data-to-advertisers-12496552.html">track people across the internet</a> otherwise). I use <a href="https://umami.is/">umami</a>, an open source, privacy-respecting analytics tool, to see how many people visit this website.</p>
<a href="./privacy/">
<button type="button">Privacy »</button>
</a>
<p>Miss when the internet was fun? Find more interesting personal blogs at <a href="https://blogroll.org">blogroll.org</a>, <a href="https://ooh.directory/">ooh.directory</a>, or surf through the webrings at the bottom of the page.</p>
<h2>Contact Me</h2>
<p>If you would like to say something nice, ask a question, or simply follow me on the fediverse, <a href="../me">heres where you can find me</a>.</p>
</article>

View File

@ -0,0 +1,7 @@
---
layout: layouts/base_full_width_text.njk
---
# Privacy
I dont collect any of your personal information, full-stop. All webfonts, icons, and images are hosted locally (these things can sometimes be used to [track people across the internet](ttps://www.firstpost.com/world/how-google-uses-fonts-to-track-what-users-do-online-and-sell-data-to-advertisers-12496552.html) otherwise). I use [umami](https://umami.is), an open source, privacy-respecting analytics tool, to see how many people visit this website.

View File

@ -7,7 +7,14 @@ eleventyNavigation:
<h1>Nathans Blog.</h1>
<p class="page-block nodropcap">
Thank you for visiting my blog; I write about lots of things here, from <a href="/tags/storytime">personal stories</a>, to <a href="/tags/gnu-linux">tech</a>, <a href="/tags/vegan-cooking">food</a>, and <a href="/tags/incense">incense</a>. Explore all posts below or <a href="/tags/">choose a topic</a>.
Thank you for visiting my blog; I write about lots of things here, from <a href="/tags/storytime">personal stories</a>, to <a href="/tags/gnu-linux">tech</a>, <a href="/tags/vegan-cooking">food</a>, and <a href="/tags/incense">incense</a>. Explore all posts below or <a href="/tags/">choose a topic</a>. Want to know what I've been reading? <a href="../blogroll/">Exlore the blogroll</a>.<br />
<a href="/tags/">
<button type="button">Topics »</button>
</a>
<a href="../blogroll/">
<button type="button">Blogroll »</button>
</a>
</p>
<h2>Whats New:</h2>
{% set postslist = collections.posts %}

View File

@ -4,6 +4,7 @@ description: "Knowing how to operate a PDF viewer does not a tech wizard make; w
date: 2024-09-21
tags:
- Quick Thoughts
- Rants
synopsis: "Knowing how to operate a PDF viewer does not a tech wizard make; what it means to be good at your job."
mastodon_id: "113178005978869507"
---

View File

@ -0,0 +1,22 @@
---
permalink: /blogroll/nathanUpchurchBlogroll.opml
---
<?xml version="1.0" encoding="UTF-8"?>
<opml version="2.0">
<head>
<title>nathanUpchurchBlogroll.opml</title>
<ownerName>Nathan Upchurch</ownerName>
</head>
<body>{% for category in blogroll.categories %}
<outline id="{{ category.name }}" text="{{ category.name }}">{% for blog in category.blogs %}
<outline
text="{{ blog.title }}"
description="{{ blog.description }}"
htmlUrl="{{ blog.url }}"
title="{{ blog.title }}"
type="rss"
version="RSS2"
xmlUrl="{{ blog.feedUrl }}"/>{% endfor %}
</outline>{% endfor %}
</body>
</opml>

View File

@ -0,0 +1,27 @@
---
layout: layouts/base.njk
---
<h1>Blogroll</h1>
<p class="nodropcap page-block">Here are some of the blogs I subscribe to. You can click the RSS icon next to each to subscribe using <a href="../about-feeds/">your newsreader</a>, or import all of them at once by downloading and importing this convenient <a href="./nathanUpchurchBlogroll.opml" download>.opml file</a>.</p>
{% for category in blogroll.categories %}
<section class="blogroll">
<h2>{{ category.name }}:</h2>
{% for blog in category.blogs %}
<div class="blogroll-category-group">
<a href="{{ blog.url }}"><h3>{{ blog.title }}</h3></a>
<a href="{{ blog.feedUrl }}">
<svg class="tag-feed-icon small" viewBox="0 0 155 155" width="153.349" height="152.909" version="1.0" xmlns="http://www.w3.org/2000/svg">
<title>RSS feed for {{ blog.url }}</title>
<g transform="translate(-427.323 -373.814)">
<ellipse style="opacity: 1; fill-opacity: 1; fill-rule: nonzero" transform="matrix(.86996 0 0 .86996 135.156 330.529)" cx="360.357" cy="200.643" rx="24.643" ry="23.929"></ellipse>
<path style="fill-opacity: 1; fill-rule: evenodd" d="m427.835 455.057-.073-30.273c64.706 3.375 100.619 49.673 101.5 101.94h-30.318c-.503-45.942-31.74-69.996-71.11-71.667z"></path>
<path style="fill-opacity: 1; fill-rule: evenodd" d="m428.201 404.571-.878-30.757C526.75 378.43 580 450.582 580.67 526.724l-31.197-.44c1.365-48.704-34.665-120.267-121.273-121.713Z"></path>
</g>
</svg>
</a>
<p>{{ blog.description }}</p>
</div>
{% endfor %}
</section>
{% endfor %}

View File

@ -14,9 +14,9 @@ numberOfNowPostsToShow: 1
{% set postslistCounter = postsCount %}
{% set showPostListHeader = false %}
{% include "postslist.njk" %}
<a class="link-button" href="/now/">
<a href="/now/">
<button type="button">
See more on the “now” page
See more on the “now” page »
</button>
</a>
</div>
@ -30,9 +30,9 @@ numberOfNowPostsToShow: 1
{% set morePosts = postsCount - numberOfLatestPostsToShow %}
{% if morePosts > 0 %}
<a class="link-button" href="/blog/">
<a href="/blog/">
<button type="button">
See {{ morePosts }} more post{% if morePosts != 1 %}s{% endif %} in the blog
See {{ morePosts }} more post{% if morePosts != 1 %}s{% endif %} in the blog »
</button>
</a>
{% endif %}

23
content/sitemap/index.njk Normal file
View File

@ -0,0 +1,23 @@
---
layout: layouts/base_full_width_text.njk
---
<section class="sitemap">
<h1>Sitemap</h1>
<ul>
<li><a href="/">Home</a></li>
<li>
<a href="/about">About</a>
<ul>
<li><a href="/about/colophon">Colophon</a></li>
<li><a href="/me">Contact</a></li>
<li><a href="/feed/feed.xml">Feed</a></li>
<li><a href="/about/privacy">Privacy</a></li>
</ul>
</li>
<li><a href="/blog">Blog</a></li>
<li><a href="/blogroll">Blogroll</a></li>
<li><a href="/now">Now</a></li>
<li><a href="/tags">Tags</a></li>
</ul>
</section>

View File

@ -1,24 +0,0 @@
[build]
publish = "_site"
command = "npm run build"
[[plugins]]
# Opt-in to the Netlify Lighthouse plugin (choose one):
# 1. Go to your site on https://app.netlify.com and navigate to the Integrations tab, search for the `Lighthouse` plugin
# 2. Or via `npm install -D @netlify/plugin-lighthouse`
# Read more: https://github.com/netlify/netlify-plugin-lighthouse
package = "@netlify/plugin-lighthouse"
# optional, fails build when a category is below a threshold
[plugins.inputs.thresholds]
performance = 1.0
accessibility = 1.0
best-practices = 1.0
seo = 1.0
[plugins.inputs]
output_path = "reports/lighthouse/index.html"

View File

@ -101,6 +101,9 @@
--grid-gutter: var(--space-s-s, clamp(1.25rem, 1.1092rem + 0.7042vw, 1.5rem));
--grid-columns: 12;
/* Span grid utility */
--span-grid: 1 / span 12;
/* Change <img> SVG color with filter */
--logo-filter: brightness(0) saturate(100%) invert(16%) sepia(0%)
saturate(1024%) hue-rotate(177deg) brightness(99%) contrast(88%);
@ -187,6 +190,11 @@ blockquote:before {
position: fixed;
filter: opacity(0.15);
}
.blogroll {
h2:first-of-type {
padding-top: 0;
}
}
body {
animation: var(--slide-in-blurred-bottom);
font-size: var(--step-0);
@ -223,24 +231,38 @@ nav {
}
.now {
display: grid;
grid-column: 1 / span 12;
grid-column: var(--span-grid);
padding-bottom: var(--space-xl);
}
section {
display: grid;
grid-column: 1 / span 12;
grid-column: var(--span-grid);
&.full-width-text {
p {
grid-column: var(--span-grid);
}
/* Add fleuron to last <p> in section */
> p:not(blockquote > p):last-child:after {
content: "\2766";
display: inline;
font-size: var(--step-1);
}
}
}
::selection {
background: var(--contrast-color);
color: var(--background-color);
}
.page-block {
grid-column: 1 / span 12;
grid-column: var(--span-grid);
font-size: var(--step-1);
margin: 0;
padding-bottom: var(--space-xl);
padding-top: var(--space-l);
line-height: calc(var(--step-1) * 0.5 + var(--step-1));
&:has(+ a > button) {
padding-bottom: 0;
}
}
a {
@ -267,13 +289,13 @@ footer .webring {
}
footer p {
font-size: var(--step-0);
grid-column: 1 / span 12;
grid-column: var(--span-grid);
}
h1,
h2,
h3 {
color: var(--text-color);
grid-column: 1 / span 12;
grid-column: var(--span-grid);
margin: 0;
width: 100%;
}
@ -321,7 +343,7 @@ main > p > a > img {
padding-bottom: var(--space-s);
}
pre {
grid-column: 1 / span 12;
grid-column: var(--span-grid);
}
p:last-child {
margin-bottom: 0;
@ -377,18 +399,24 @@ button {
padding: var(--space-2xs) var(--space-xs);
text-transform: uppercase;
transition: var(--transition-normal);
white-space: nowrap;
}
button > img {
max-width: 1em;
margin-right: 0.5em;
filter: var(--icon-filter);
}
a.link-button {
align-items: start;
display: flex;
grid-column: 1 / span 12;
text-align: center;
text-decoration: none;
a {
button {
margin-top: var(--space-m);
}
&:has(button) {
text-decoration: none;
}
&:has(button.full-width) {
display: inline-grid;
grid-column: var(--span-grid);
}
}
button:hover {
background-color: var(--color-gray-90);
@ -419,10 +447,10 @@ table th {
/* Comments */
#comments {
grid-column: 1 / span 12;
grid-column: var(--span-grid);
}
.continue-discussion {
grid-column: 1 / span 12;
grid-column: var(--span-grid);
}
.continue-discussion button {
margin-top: var(--space-xs);
@ -710,9 +738,13 @@ a.post-tag:hover {
}
.tag-feed-icon {
fill: var(--rss-orange);
height: 3.5rem;
height: var(--space-m);
transition: var(--transition-normal);
width: var(--space-l);
width: var(--space-m);
&.small {
height: var(--space-s);
width: var(--space-s);
}
}
.taglist {
display: flex;
@ -794,7 +826,7 @@ h2 + .header-anchor {
/* Components */
article.post {
grid-column: 1 / span 12;
grid-column: var(--span-grid);
container: article / inline-size;
/* Add fleuron after last <p> in article */
> p:not(blockquote > p):last-child:after {
@ -803,7 +835,19 @@ article.post {
font-size: var(--step-1);
}
}
.blogroll {
display: inline;
}
.blogroll-category-group {
margin-bottom: var(--space-l);
margin-left: var(--space-m);
h3 {
display: inline;
}
p {
margin: var(--space-2xs) auto;
}
}
/* Add fleuron after <p> in article when footnotes are present */
p:has(+ hr.footnotes-sep):after {
content: "\2766";