chore: clean up logic + data + feeds

This commit is contained in:
Cory Dransfeldt 2024-11-04 18:57:14 -08:00
parent 74d3fe1b44
commit fa2ac170b3
No known key found for this signature in database
41 changed files with 400 additions and 481 deletions

View file

@ -1,8 +1,6 @@
# 404s # 404s
/now.html /now 301 /now.html /now 301
/contact.html /contact 301 /contact.html /contact 301
/watching/favorite-movies /watching 301
/watching/favorite-shows /watching 301
# feeds # feeds
/feed.xml /feeds/posts 301 /feed.xml /feeds/posts 301

34
package-lock.json generated
View file

@ -1,19 +1,18 @@
{ {
"name": "coryd.dev", "name": "coryd.dev",
"version": "2.4.13", "version": "2.6.7",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "coryd.dev", "name": "coryd.dev",
"version": "2.4.13", "version": "2.6.7",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@11ty/eleventy-fetch": "4.0.1", "@11ty/eleventy-fetch": "4.0.1",
"@cdransf/api-text": "^1.8.1", "@cdransf/api-text": "^1.8.1",
"@cdransf/select-pagination": "^1.3.1", "@cdransf/select-pagination": "^1.3.1",
"@daviddarnes/mastodon-post": "^1.3.0", "@daviddarnes/mastodon-post": "^1.3.0",
"http-proxy-middleware": "3.0.3",
"minisearch": "^7.1.0", "minisearch": "^7.1.0",
"youtube-video-element": "^1.1.6" "youtube-video-element": "^1.1.6"
}, },
@ -29,6 +28,7 @@
"fast-xml-parser": "^4.5.0", "fast-xml-parser": "^4.5.0",
"html-minifier-terser": "^7.2.0", "html-minifier-terser": "^7.2.0",
"html-to-text": "^9.0.5", "html-to-text": "^9.0.5",
"http-proxy-middleware": "3.0.3",
"ics": "^3.8.1", "ics": "^3.8.1",
"linkedom": "0.18.5", "linkedom": "0.18.5",
"luxon": "^3.5.0", "luxon": "^3.5.0",
@ -688,6 +688,7 @@
"version": "1.17.15", "version": "1.17.15",
"resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz",
"integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@types/node": "*" "@types/node": "*"
@ -722,9 +723,10 @@
"peer": true "peer": true
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "22.8.7", "version": "22.9.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.8.7.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz",
"integrity": "sha512-LidcG+2UeYIWcMuMUpBKOnryBWG/rnmOHQR5apjn8myTQcx3rinFRn7DcIFhMnS0PPFSC6OafdIKEad0lj6U0Q==", "integrity": "sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"undici-types": "~6.19.8" "undici-types": "~6.19.8"
@ -1060,6 +1062,7 @@
"version": "3.0.3", "version": "3.0.3",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"fill-range": "^7.1.1" "fill-range": "^7.1.1"
@ -1788,9 +1791,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/electron-to-chromium": { "node_modules/electron-to-chromium": {
"version": "1.5.51", "version": "1.5.52",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.51.tgz", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.52.tgz",
"integrity": "sha512-kKeWV57KSS8jH4alKt/jKnvHPmJgBxXzGUSbMd4eQF+iOsVPl7bz2KUmu6eo80eMP8wVioTfTyTzdMgM15WXNg==", "integrity": "sha512-xtoijJTZ+qeucLBDNztDOuQBE1ksqjvNjvqFoST3nGC7fSpqJ+X6BdTBaY5BHG+IhWWmpc6b/KfpeuEDupEPOQ==",
"dev": true, "dev": true,
"license": "ISC" "license": "ISC"
}, },
@ -2145,6 +2148,7 @@
"version": "7.1.1", "version": "7.1.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"to-regex-range": "^5.0.1" "to-regex-range": "^5.0.1"
@ -2250,6 +2254,7 @@
"version": "1.15.9", "version": "1.15.9",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
"integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
"dev": true,
"funding": [ "funding": [
{ {
"type": "individual", "type": "individual",
@ -2666,6 +2671,7 @@
"version": "1.18.1", "version": "1.18.1",
"resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
"integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"eventemitter3": "^4.0.0", "eventemitter3": "^4.0.0",
@ -2680,6 +2686,7 @@
"version": "3.0.3", "version": "3.0.3",
"resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.3.tgz", "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.3.tgz",
"integrity": "sha512-usY0HG5nyDUwtqpiZdETNbmKtw3QQ1jwYFZ9wi5iHzX2BcILwQKtYDJPo7XHTsu5Z0B2Hj3W9NNnbd+AjFWjqg==", "integrity": "sha512-usY0HG5nyDUwtqpiZdETNbmKtw3QQ1jwYFZ9wi5iHzX2BcILwQKtYDJPo7XHTsu5Z0B2Hj3W9NNnbd+AjFWjqg==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@types/http-proxy": "^1.17.15", "@types/http-proxy": "^1.17.15",
@ -2825,6 +2832,7 @@
"version": "2.1.1", "version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=0.10.0" "node": ">=0.10.0"
@ -2844,6 +2852,7 @@
"version": "4.0.3", "version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"is-extglob": "^2.1.1" "is-extglob": "^2.1.1"
@ -2863,6 +2872,7 @@
"version": "7.0.0", "version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=0.12.0" "node": ">=0.12.0"
@ -2872,6 +2882,7 @@
"version": "5.0.0", "version": "5.0.0",
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
"integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
"dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=0.10.0" "node": ">=0.10.0"
@ -3256,6 +3267,7 @@
"version": "4.0.8", "version": "4.0.8",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
"integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"braces": "^3.0.3", "braces": "^3.0.3",
@ -3791,6 +3803,7 @@
"version": "2.3.1", "version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=8.6" "node": ">=8.6"
@ -4640,6 +4653,7 @@
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
"integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
"dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/resolve": { "node_modules/resolve": {
@ -5318,6 +5332,7 @@
"version": "5.0.1", "version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"is-number": "^7.0.0" "is-number": "^7.0.0"
@ -5411,6 +5426,7 @@
"version": "6.19.8", "version": "6.19.8",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
"integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
"dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/unpipe": { "node_modules/unpipe": {

View file

@ -1,6 +1,6 @@
{ {
"name": "coryd.dev", "name": "coryd.dev",
"version": "2.4.13", "version": "2.6.7",
"description": "The source for my personal site. Built using 11ty (and other tools).", "description": "The source for my personal site. Built using 11ty (and other tools).",
"type": "module", "type": "module",
"engines": { "engines": {
@ -30,7 +30,6 @@
"@cdransf/api-text": "^1.8.1", "@cdransf/api-text": "^1.8.1",
"@cdransf/select-pagination": "^1.3.1", "@cdransf/select-pagination": "^1.3.1",
"@daviddarnes/mastodon-post": "^1.3.0", "@daviddarnes/mastodon-post": "^1.3.0",
"http-proxy-middleware": "3.0.3",
"minisearch": "^7.1.0", "minisearch": "^7.1.0",
"youtube-video-element": "^1.1.6" "youtube-video-element": "^1.1.6"
}, },
@ -46,6 +45,7 @@
"fast-xml-parser": "^4.5.0", "fast-xml-parser": "^4.5.0",
"html-minifier-terser": "^7.2.0", "html-minifier-terser": "^7.2.0",
"html-to-text": "^9.0.5", "html-to-text": "^9.0.5",
"http-proxy-middleware": "3.0.3",
"ics": "^3.8.1", "ics": "^3.8.1",
"linkedom": "0.18.5", "linkedom": "0.18.5",
"luxon": "^3.5.0", "luxon": "^3.5.0",

View file

@ -153,23 +153,19 @@ window.addEventListener("load", () => {
: plainText; : plainText;
}; };
const formatArtistTitle = (title, totalPlays) =>
totalPlays > 0
? `${title} <strong class="highlight-text">${totalPlays} plays</strong>`
: title;
const renderSearchResults = (results) => { const renderSearchResults = (results) => {
const resultHTML = results const resultHTML = results
.map( .map(
({ title, url, description, type, total_plays }) => ` ({ title, url, description, type, total_plays }) => `
<li class="search__results--result"> <li class="search__results--result">
<a href="${url}"> <h3>
<h3>${ <a href="${url}">${title}</a>
type === "artist" && total_plays ${
? formatArtistTitle(title, total_plays) type === "artist" && total_plays
: title ? ` <strong class="highlight-text">${total_plays} plays</strong>`
}</h3> : ""
</a> }
</h3>
<p>${truncateDescription(description)}</p> <p>${truncateDescription(description)}</p>
</li> </li>
` `
@ -225,13 +221,14 @@ window.addEventListener("load", () => {
.map( .map(
({ title, url, description, type, total_plays }) => ` ({ title, url, description, type, total_plays }) => `
<li class="search__results--result"> <li class="search__results--result">
<a href="${url}"> <h3>
<h3>${ <a href="${url}">${title}</a>
${
type === "artist" && total_plays type === "artist" && total_plays
? formatArtistTitle(title, total_plays) ? ` <strong class="highlight-text">${total_plays} plays</strong>`
: title : ""
}</h3> }
</a> </h3>
<p>${truncateDescription(description)}</p> <p>${truncateDescription(description)}</p>
</li> </li>
` `

View file

@ -1,17 +1,15 @@
html body { html,
body {
font-family: var(--font-mono);
color: var(--text-color); color: var(--text-color);
background: var(--background-color); background: var(--background-color);
font-family: var(--font-mono);
} }
html { html {
scrollbar-width: thin;
scrollbar-color: var(--accent-color) var(--gray-light); scrollbar-color: var(--accent-color) var(--gray-light);
} }
body { body {
font-size: var(--font-size-base);
line-height: var(--line-height-base);
letter-spacing: -0.035rem; letter-spacing: -0.035rem;
word-spacing: -0.15rem; word-spacing: -0.15rem;
} }
@ -42,13 +40,7 @@ p {
margin: var(--margin-vertical-base-horizontal-zero); margin: var(--margin-vertical-base-horizontal-zero);
} }
:is(p, ul, ol) a { .highlight-text {
text-decoration: underline;
text-underline-offset: var(--spacing-xs);
}
.highlight-text,
details > summary {
color: var(--text-color-inverted); color: var(--text-color-inverted);
background-color: var(--accent-color); background-color: var(--accent-color);
padding: var(--spacing-xs); padding: var(--spacing-xs);
@ -56,7 +48,6 @@ details > summary {
} }
details > summary { details > summary {
cursor: pointer;
display: inline; display: inline;
} }
@ -68,27 +59,10 @@ blockquote {
margin: var(--margin-vertical-base-horizontal-zero); margin: var(--margin-vertical-base-horizontal-zero);
} }
code { :is(h1, h2, h3) svg {
padding: var(--spacing-xs);
color: var(--text-color-inverted);
background-color: var(--background-color-inverted);
border-radius: var(--border-radius-slight);
}
p:not(.banner p) > svg {
margin-bottom: var(--inline-margin-bottom);
}
:is(h1, h2, h3, h4, h5, h6) svg {
stroke-width: var(--stroke-width-bold); stroke-width: var(--stroke-width-bold);
} }
:is(h1, h2, h3, h4, h5, h6):has(svg) {
display: flex;
align-items: center;
gap: var(--spacing-sm);
}
strong, strong,
blockquote { blockquote {
font-weight: var(--font-weight-bold); font-weight: var(--font-weight-bold);
@ -105,7 +79,29 @@ svg {
stroke-width: var(--stroke-width-default); stroke-width: var(--stroke-width-default);
} }
/* brand colors */ /* images */
img {
border-radius: var(--border-radius-slight);
&.image-banner {
border: var(--border-default);
height: auto;
width: 100%;
}
}
/* lists */
ul,
ol {
margin: var(--margin-vertical-base-horizontal-zero);
padding-left: var(--spacing-base);
& li:not(:last-child) {
margin-bottom: var(--spacing-lg);
}
}
/* brand + section colors */
.article, .article,
.books, .books,
.brand-github, .brand-github,
@ -211,51 +207,44 @@ svg {
/* links */ /* links */
a { a {
color: var(--accent-color); color: var(--accent-color);
text-decoration: none;
}
:is(a:hover, a:active, a:focus) svg[data-tablericon-name^="arrow-"] { & > img {
stroke: var(--accent-color-hover); border: var(--border-default);
} }
a:hover,
a:focus,
a:active,
:is(.main-title, footer nav.sub-pages) a:hover,
:is(.main-title, footer nav.sub-pages) a:focus,
:is(.main-title, footer nav.sub-pages) a:active {
color: var(--accent-color-hover);
transition: color var(--transition-duration-default)
var(--transition-ease-in-out);
}
:is(a:has(svg):hover, a:has(svg):active, a:has(svg):focus) svg {
stroke: var(--accent-color-hover);
}
:is(a):has(svg) {
display: inline-flex;
align-items: center;
gap: var(--spacing-sm);
& svg { & svg {
stroke: var(--accent-color); stroke: var(--accent-color);
} }
&:hover svg, &:hover,
&:active svg, &:focus,
&:focus svg { &:active {
stroke: var(--accent-color-hover); color: var(--accent-color-hover);
transition: color var(--transition-duration-default)
var(--transition-ease-in-out);
& > img {
border-color: var(--accent-color-hover);
transition: border var(--transition-duration-default)
var(--transition-ease-in-out);
}
& > svg {
stroke: var(--accent-color-hover);
}
} }
} }
:is(h1, h2, h3, a, p:not(.banner p), span, th, td, .post-meta):has(svg) {
display: flex;
align-items: center;
gap: var(--spacing-xs);
}
/* headers */ /* headers */
h1, h1,
h2, h2,
h3, h3 {
h4,
h5,
h6 {
font-weight: var(--font-weight-bold); font-weight: var(--font-weight-bold);
line-height: var(--line-height-md); line-height: var(--line-height-md);
margin: var(--margin-vertical-base-horizontal-zero); margin: var(--margin-vertical-base-horizontal-zero);
@ -264,48 +253,32 @@ h6 {
h1 { h1 {
font-size: var(--font-size-2xl); font-size: var(--font-size-2xl);
} }
h2 { h2 {
font-size: var(--font-size-xl); font-size: var(--font-size-xl);
} }
h3 { h3 {
font-size: var(--font-size-lg); font-size: var(--font-size-lg);
} }
h4 {
font-size: var(--font-size-base);
}
h5 {
font-size: var(--font-size-md);
}
h6 {
font-size: var(--font-size-sm);
}
@media screen and (min-width: 768px) { @media screen and (min-width: 768px) {
h1 { h1 {
font-size: var(--font-size-3xl); font-size: var(--font-size-3xl);
} }
h2 { h2 {
font-size: var(--font-size-2xl); font-size: var(--font-size-2xl);
} }
h3 { h3 {
font-size: var(--font-size-xl); font-size: var(--font-size-xl);
} }
h4 {
font-size: var(--font-size-lg);
}
h5 {
font-size: var(--font-size-base);
}
h6 {
font-size: var(--font-size-md);
}
} }
/* dividers */ /* dividers */
hr { hr {
height: 1px; color: var(--gray-light);
background-color: var(--gray-light);
border: 0;
margin: var(--margin-vertical-base-horizontal-zero); margin: var(--margin-vertical-base-horizontal-zero);
} }
@ -322,19 +295,11 @@ article {
margin-top: 0; margin-top: 0;
} }
&.standalone .associated-media:last-of-type > hr {
display: none;
}
& h3 { & h3 {
margin-top: 0; margin-top: 0;
} }
& .post-meta { & .post-meta {
display: flex;
align-items: center;
gap: var(--spacing-sm);
& svg { & svg {
stroke: var(--gray-dark); stroke: var(--gray-dark);
width: var(--sizing-svg-sm); width: var(--sizing-svg-sm);
@ -362,10 +327,6 @@ img + .associated-media,
& li:last-child { & li:last-child {
margin-bottom: 0; margin-bottom: 0;
} }
& .footnote-item > p {
display: inline;
}
} }
&:has(~ *) { &:has(~ *) {
@ -375,11 +336,7 @@ img + .associated-media,
sup.footnote-ref { sup.footnote-ref {
line-height: var(--line-height-xs); line-height: var(--line-height-xs);
} padding: var(--spacing-xs);
sup.footnote-ref a,
.footnote-backref {
text-decoration: none;
} }
/* tables */ /* tables */
@ -476,8 +433,8 @@ td:first-of-type,
.active, .active,
.active svg { .active svg {
cursor: not-allowed; cursor: not-allowed;
color: var(--accent-color); color: var(--accent-color-active);
stroke: var(--accent-color-hover); stroke: var(--accent-color-active);
} }
/* layout */ /* layout */
@ -506,8 +463,7 @@ main {
main, main,
footer { footer {
width: 80%; width: 80%;
margin-left: auto; margin: 0 auto;
margin-right: auto;
@media screen and (min-width: 768px) { @media screen and (min-width: 768px) {
max-width: 768px; max-width: 768px;
@ -555,28 +511,4 @@ footer {
} }
} }
} }
}
:is(.main-title, footer nav.sub-pages) a {
color: var(--text-color);
}
/* lists */
ul,
ol {
list-style-position: inside;
margin: var(--margin-vertical-base-horizontal-zero);
padding-left: var(--spacing-base);
& li:not(:last-child) {
margin-bottom: var(--spacing-lg);
}
}
/* images */
.image-banner {
border: var(--border-default);
border-radius: var(--border-radius-slight);
height: auto;
width: 100%;
} }

View file

@ -1,4 +1,5 @@
.addon-links { .addon-links {
margin-top: var(--spacing-base);
display: grid; display: grid;
gap: var(--sizing-base); gap: var(--sizing-base);
grid-template-columns: var(--grid-columns-one); grid-template-columns: var(--grid-columns-one);
@ -15,9 +16,8 @@
border-bottom: 0; border-bottom: 0;
margin-bottom: 0; margin-bottom: 0;
& ol, & ul,
ul { & ol {
padding: 0;
margin-bottom: 0; margin-bottom: 0;
} }
} }

View file

@ -14,5 +14,7 @@
& img { & img {
image-rendering: pixelated; image-rendering: pixelated;
border: none;
border-radius: 0;
} }
} }

View file

@ -8,14 +8,12 @@ button,
border: 2px solid var(--accent-color); border: 2px solid var(--accent-color);
border-radius: var(--border-radius-full); border-radius: var(--border-radius-full);
padding: var(--spacing-xs) var(--spacing-md); padding: var(--spacing-xs) var(--spacing-md);
cursor: pointer;
font-size: var(--font-size-base); font-size: var(--font-size-base);
font-weight: var(--font-weight-bold); font-weight: var(--font-weight-bold);
line-height: var(--line-height-base); line-height: var(--line-height-base);
white-space: nowrap; white-space: nowrap;
color: var(--text-color-inverted); color: var(--text-color-inverted);
background-color: var(--accent-color); background-color: var(--accent-color);
appearance: none;
transition: color var(--transition-duration-default) transition: color var(--transition-duration-default)
var(--transition-ease-in-out); var(--transition-ease-in-out);
@ -23,10 +21,7 @@ button,
margin-top: 0; margin-top: 0;
} }
&:not(.active):hover, &:not(.active):is(:hover, :active, :focus, :focus-within) {
&:not(.active):active,
&:not(.active):focus,
&:not(.active):focus-within {
background-color: var(--accent-color-hover); background-color: var(--accent-color-hover);
border-color: var(--accent-color-hover); border-color: var(--accent-color-hover);
} }

View file

@ -3,61 +3,29 @@
opacity: 0.5; opacity: 0.5;
} }
input[type="text"], input:not([type="button"]):not([type="submit"]):not([type="reset"]),
input[type="email"],
input[type="search"],
textarea { textarea {
font: var(--font-weight-base) var(--font-size-base) var(--font-mono);
line-height: var(--line-height-base);
color: var(--text-color);
background-color: var(--background-color);
border: var(--border-default);
border-radius: var(--border-radius-slight);
padding: var(--spacing-sm);
width: 100%; width: 100%;
} }
input:not([type="button"]):not([type="submit"]):not([type="reset"]),
textarea,
select {
color: var(--text-color);
border-radius: var(--border-radius-slight);
background-color: var(--background-color);
padding: var(--spacing-sm);
border: var(--border-gray);
}
form:has(+ *), form:has(+ *),
label:has(input):has(+ *) input, label:has(input):has(+ *) input,
input[type="text"]:has(+ *), input:not([type="button"]):not([type="submit"]):not([type="reset"]):has(+ *),
input[type="email"]:has(+ *),
input[type="search"]:has(+ *),
textarea:has(+ *) { textarea:has(+ *) {
margin-bottom: var(--spacing-base); margin-bottom: var(--spacing-base);
} }
select {
color: var(--text-color);
cursor: pointer;
border: var(--border-gray);
border-radius: var(--border-radius-slight);
background-color: var(--background-color);
padding: var(--spacing-xs) var(--spacing-sm);
}
fieldset {
display: flex;
flex-direction: column;
gap: var(--spacing-sm);
padding: var(--spacing-lg) 0 0 0;
border: none;
@media screen and (min-width: 768px) {
flex-direction: row;
gap: var(--spacing-lg);
}
& label {
display: flex;
align-items: center;
gap: var(--sizing-xs);
}
& input[type="checkbox"] {
margin: 0;
}
}
.search__form { .search__form {
margin-top: 0; margin-top: 0;
@ -79,9 +47,5 @@ fieldset {
margin-bottom: var(--sizing-base); margin-bottom: var(--sizing-base);
border-bottom: var(--border-gray); border-bottom: var(--border-gray);
} }
& a {
text-decoration: none;
}
} }
} }

View file

@ -1,6 +1,4 @@
.mastodon-post-wrapper { .mastodon-post-wrapper {
margin-bottom: var(--spacing-base);
& dl, & dl,
dt { dt {
display: flex; display: flex;

View file

@ -1,4 +1,4 @@
.icon-link + .media-grid { a + .media-grid {
margin-top: var(--spacing-base); margin-top: var(--spacing-base);
} }

View file

@ -23,7 +23,6 @@ menu {
margin: 0; margin: 0;
padding: var(--spacing-sm) 0; padding: var(--spacing-sm) 0;
width: 100%; width: 100%;
color: var(--text-color);
background: var(--background-color); background: var(--background-color);
& a { & a {

View file

@ -39,13 +39,7 @@
} }
} }
& a:has(img) {
display: flex;
}
& img { & img {
border: var(--border-default);
border-radius: var(--border-radius-slight);
width: calc(var(--sizing-3xl) * 1.5); width: calc(var(--sizing-3xl) * 1.5);
height: calc(var(--sizing-3xl) * 1.5); height: calc(var(--sizing-3xl) * 1.5);
@ -92,18 +86,17 @@
& .title, & .title,
& .subtext, & .subtext,
& .subtext p, & time {
& .timestamp {
line-height: var(--line-height-md); line-height: var(--line-height-md);
word-break: break-word; word-break: break-word;
} }
& .subtext, & .subtext,
& .timestamp { & time {
font-size: var(--font-size-sm); font-size: var(--font-size-sm);
} }
& .timestamp { & time {
margin-top: var(--spacing-sm); margin-top: var(--spacing-sm);
margin-left: 0; margin-left: 0;

View file

@ -2,24 +2,23 @@
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
}
.pagination button { & button {
background: none; background: none;
padding: 0; padding: 0;
} }
.pagination a { & a {
display: flex; display: flex;
}
.pagination p { &.disabled svg[data-tablericon-name^="arrow-"] {
text-align: center; cursor: not-allowed;
margin: 0; stroke: var(--gray-medium);
} stroke-width: var(--stroke-width-default);
}
}
.pagination a.disabled svg[data-tablericon-name^="arrow-"] { & p {
cursor: not-allowed; text-align: center;
stroke: var(--gray-medium); }
stroke-width: var(--stroke-width-default);
} }

View file

@ -1,7 +1,7 @@
#tracks-recent, #tracks-recent,
#tracks-chart, #tracks-chart,
#tracks-recent ~ .tracks-recent, .tracks-recent,
#tracks-chart ~ .tracks-chart { .tracks-chart {
display: none; display: none;
} }
@ -15,7 +15,7 @@ input[id="tracks-chart"] ~ .tracks-chart {
margin-top: var(--spacing-base); margin-top: var(--spacing-base);
} }
input[id="tracks-recent"] ~ [for="tracks-recent"]:has(+ [for="tracks-chart"]) { [for="tracks-recent"] {
margin-right: var(--spacing-xs); margin-right: var(--spacing-xs);
} }
@ -37,4 +37,4 @@ input[id="tracks-recent"] ~ [for="tracks-recent"]:has(+ [for="tracks-chart"]) {
#tracks-chart:not(:checked) ~ [for="tracks-chart"]:hover, #tracks-chart:not(:checked) ~ [for="tracks-chart"]:hover,
#tracks-chart:not(:checked) ~ [for="tracks-chart"]:active { #tracks-chart:not(:checked) ~ [for="tracks-chart"]:active {
color: var(--accent-color-hover); color: var(--accent-color-hover);
} }

View file

@ -2,6 +2,15 @@ youtube-video {
aspect-ratio: 16/9; aspect-ratio: 16/9;
width: 100%; width: 100%;
display: flex; display: flex;
overflow: hidden;
border: var(--border-default);
border-radius: var(--border-radius-slight);
&:hover {
border-color: var(--accent-color-hover);
transition: border var(--transition-duration-default)
var(--transition-ease-in-out);
}
&:has(+ *) { &:has(+ *) {
margin-bottom: var(--spacing-base); margin-bottom: var(--spacing-base);

View file

@ -37,13 +37,13 @@
); );
--accent-color: light-dark(var(--blue-400), var(--blue-200)); --accent-color: light-dark(var(--blue-400), var(--blue-200));
--accent-color-hover: light-dark(var(--blue-600), var(--blue-100)); --accent-color-hover: light-dark(var(--blue-600), var(--blue-100));
--accent-color-active: light-dark(var(--blue-600), var(--blue-100));
--brand-buy-me-a-coffee: #ff5f5f; --brand-buy-me-a-coffee: light-dark(#0d0c22, #ffdd00);
--brand-github: light-dark(#333, #f5f5f5); --brand-github: light-dark(#333, #f5f5f5);
--brand-fastmail: light-dark(#0067b9, #ffc107); --brand-fastmail: light-dark(#0067b9, #ffc107);
--brand-listenbrainz: #e97941; --brand-mastodon: light-dark(#563acc, #858afa);
--brand-mastodon: #6364ff; --brand-npm: #cb3837;
--brand-npm: #cc3534;
--brand-rss: #f26522; --brand-rss: #f26522;
--article: light-dark(#007272, #00ffff); --article: light-dark(#007272, #00ffff);
@ -149,7 +149,7 @@
--inline-margin-bottom: -5px; --inline-margin-bottom: -5px;
/* shadows */ /* shadows */
--box-shadow-media: inset 0 -85px 60px -40px var(--gray-900); --box-shadow-media: inset 0 -85px 60px -40px var(--color-darkest);
--box-shadow-text-toggle: inset 0 -120px 60px -60px var(--background-color); --box-shadow-text-toggle: inset 0 -120px 60px -60px var(--background-color);
--text-shadow-default: rgba(0, 0, 0, 0.7) 0px 0px 10px; --text-shadow-default: rgba(0, 0, 0, 0.7) 0px 0px 10px;

View file

@ -54,7 +54,7 @@
</h3> </h3>
<xsl:value-of select="description" disable-output-escaping="yes" /> <xsl:value-of select="description" disable-output-escaping="yes" />
<xsl:if test="enclosure"> <xsl:if test="enclosure">
<img src="{enclosure/@url}" alt="{title}" /> <img class="image-banner" src="{enclosure/@url}" alt="{title}" />
</xsl:if> </xsl:if>
</div> </div>
</xsl:for-each> </xsl:for-each>

View file

@ -16,10 +16,10 @@
/* page styles */ /* page styles */
@import url("./pages/about.css") layer(page); @import url("./pages/about.css") layer(page);
@import url("./pages/books.css") layer(page); @import url("./pages/books.css") layer(page);
@import url("./pages/blogroll.css") layer(page);
@import url("./pages/contact.css") layer(page); @import url("./pages/contact.css") layer(page);
@import url("./pages/feeds.css") layer(page); @import url("./pages/feeds.css") layer(page);
@import url("./pages/links.css") layer(page); @import url("./pages/links.css") layer(page);
@import url("./pages/media.css") layer(page);
@import url("./pages/music.css") layer(page); @import url("./pages/music.css") layer(page);
@import url("./pages/watching.css") layer(page); @import url("./pages/watching.css") layer(page);
@import url("./pages/webrings.css") layer(page); @import url("./pages/webrings.css") layer(page);

View file

@ -13,14 +13,10 @@
margin-bottom: var(--spacing-sm); margin-bottom: var(--spacing-sm);
width: 100%; width: 100%;
& .interior { & img {
display: flex; width: var(--avatar-size);
height: var(--avatar-size);
& img { image-rendering: pixelated;
width: var(--avatar-size);
height: var(--avatar-size);
image-rendering: pixelated;
}
} }
} }

View file

@ -1,3 +0,0 @@
.blog-roll-icons {
display: flex;
}

View file

@ -14,7 +14,7 @@
border-bottom: 0; border-bottom: 0;
margin-bottom: 0; margin-bottom: 0;
& .book-meta .description { & .media-meta .description {
margin-bottom: 0; margin-bottom: 0;
} }
} }
@ -27,28 +27,17 @@
max-width: calc(var(--sizing-3xl) * 4); max-width: calc(var(--sizing-3xl) * 4);
height: auto; height: auto;
aspect-ratio: var(--aspect-ratio-vertical); aspect-ratio: var(--aspect-ratio-vertical);
transition: border-color var(--transition-duration-default)
var(--transition-ease-in-out);
} }
& a:focus img, & .media-meta {
& a:focus-within img, margin-top: var(--sizing-base);
& a:hover img,
& a:active img {
border-color: var(--accent-color-hover);
}
& .book-meta {
align-items: center; align-items: center;
@media screen and (min-width: 768px) { @media screen and (min-width: 768px) {
margin-top: 0;
align-items: start; align-items: start;
} }
& p {
margin: 0;
}
& .description { & .description {
margin-bottom: var(--spacing-base); margin-bottom: var(--spacing-base);
} }
@ -65,38 +54,6 @@
} }
} }
.book-entry,
.book-focus {
& img {
border: var(--border-default);
border-radius: var(--border-radius-slight);
}
& .book-meta {
display: flex;
flex-direction: column;
gap: var(--spacing-sm);
& p.title {
font-size: var(--font-size-xl);
line-height: var(--line-height-md);
}
& p.sub-meta {
font-size: var(--font-size-sm);
& svg {
width: var(--sizing-svg-sm);
height: var(--sizing-svg-sm);
}
}
& p {
margin: 0;
}
}
}
.book-focus { .book-focus {
margin-top: var(--spacing-base); margin-top: var(--spacing-base);
border-bottom: 0; border-bottom: 0;
@ -113,7 +70,7 @@
align-items: start; align-items: start;
} }
& .book-meta { & .media-meta {
width: 100%; width: 100%;
align-items: center; align-items: center;
@ -122,10 +79,6 @@
align-items: start; align-items: start;
} }
& p {
margin: 0;
}
& .progress-bar-wrapper { & .progress-bar-wrapper {
max-width: 50%; max-width: 50%;

View file

@ -22,11 +22,6 @@
} }
& img { & img {
border: var(--border-default);
border-radius: var(--border-radius-slight);
width: 100%;
height: auto;
display: block;
margin-top: var(--sizing-base); margin-top: var(--sizing-base);
} }
} }

View file

@ -1,16 +1,16 @@
.link-grid { .link-grid {
display: grid; display: grid;
gap: var(--spacing-sm); gap: var(--spacing-sm);
grid-template-columns: repeat(1, minmax(0, 1fr)); grid-template-columns: var(--grid-columns-one);
margin-bottom: var(--spacing-base); margin-bottom: var(--spacing-base);
@media screen and (min-width: 768px) { @media screen and (min-width: 768px) {
grid-template-columns: repeat(2, minmax(0, 1fr)); grid-template-columns: var(--grid-columns-two);
} }
& .link-box { & .link-box {
border: var(--border-gray); border: var(--border-gray);
border-radius: var(--border-radius-slight); border-radius: var(--border-radius-slight);
padding: var(--spacing-xs) var(--spacing-sm); padding: var(--spacing-sm) var(--spacing-md);
} }
} }

View file

@ -0,0 +1,19 @@
.media-meta {
display: flex;
flex-direction: column;
gap: var(--spacing-sm);
& .title {
font-size: var(--font-size-xl);
line-height: var(--line-height-md);
}
& .sub-meta {
font-size: var(--font-size-sm);
& svg {
width: var(--sizing-svg-sm);
height: var(--sizing-svg-sm);
}
}
}

View file

@ -12,7 +12,6 @@
& img { & img {
border: var(--border-default); border: var(--border-default);
border-radius: var(--border-radius-slight);
width: 100%; width: 100%;
height: auto; height: auto;
aspect-ratio: var(--aspect-ratio-square); aspect-ratio: var(--aspect-ratio-square);
@ -33,33 +32,12 @@
gap: var(--spacing-md); gap: var(--spacing-md);
} }
& .artist-meta { & .media-meta {
display: flex;
flex-direction: column;
gap: var(--spacing-sm);
margin-top: var(--spacing-base); margin-top: var(--spacing-base);
@media screen and (min-width: 768px) { @media screen and (min-width: 768px) {
margin-top: 0; margin-top: 0;
} }
& p {
margin: 0;
&.title {
font-size: var(--font-size-xl);
line-height: var(--line-height-md);
}
&.sub-meta {
font-size: var(--font-size-sm);
& svg {
width: var(--sizing-svg-sm);
height: var(--sizing-svg-sm);
}
}
}
} }
} }
@ -72,13 +50,4 @@
.concert-list { .concert-list {
margin-top: 0; margin-top: 0;
padding-left: 0;
& li .modal-toggle {
height: calc(var(--sizing-lg) * 1.6);
}
}
p.concerts + ul + hr {
display: none;
} }

View file

@ -11,7 +11,6 @@ a:active > .watching.hero::after {
& img { & img {
aspect-ratio: var(--aspect-ratio-banner); aspect-ratio: var(--aspect-ratio-banner);
border-radius: var(--border-radius-slight);
height: auto; height: auto;
width: 100%; width: 100%;
} }
@ -62,33 +61,8 @@ a:active > .watching.hero::after {
margin-top: var(--spacing-base); margin-top: var(--spacing-base);
border-bottom: 0; border-bottom: 0;
& img { & .media-meta {
aspect-ratio: var(--aspect-ratio-banner);
}
& .meta {
display: flex;
flex-direction: column;
gap: var(--spacing-sm);
margin: var(--margin-vertical-base-horizontal-zero); margin: var(--margin-vertical-base-horizontal-zero);
& p {
margin: 0;
&.title {
font-size: var(--font-size-xl);
line-height: var(--line-height-md);
}
&.sub-meta {
font-size: var(--font-size-sm);
& svg {
width: var(--sizing-svg-sm);
height: var(--sizing-svg-sm);
}
}
}
} }
& .footnotes { & .footnotes {
@ -97,6 +71,6 @@ a:active > .watching.hero::after {
} }
} }
.icon-link + .poster.grid { a + .poster.grid {
margin-top: var(--spacing-base); margin-top: var(--spacing-base);
} }

View file

@ -1,9 +1,15 @@
code {
padding: var(--spacing-xs);
color: var(--text-color-inverted);
background-color: var(--background-color-inverted);
border-radius: var(--border-radius-slight);
}
code, code,
pre { pre {
color: var(--blue-100); color: var(--blue-100);
background: none; background: none;
border-radius: var(--border-radius-slight); border-radius: var(--border-radius-slight);
text-shadow: 0 1px rgba(0, 0, 0, 0.3);
font-family: var(--font-mono); font-family: var(--font-mono);
text-align: left; text-align: left;
white-space: pre; white-space: pre;
@ -32,8 +38,8 @@ pre {
pre, pre,
:not(pre) > code { :not(pre) > code {
background: var(--gray-900); background: var(--color-darkest);
border: 1px solid var(--gray-300); border: var(--border-gray);
} }
.namespace { .namespace {

View file

@ -1,29 +1,135 @@
*, *,
*::before, *::before,
*::after { *::after {
box-sizing: border-box; margin: 0;
margin: 0; padding: 0;
box-sizing: border-box;
} }
body { :where([hidden]:not([hidden='until-found'])) {
line-height: var(--line-height-md); display: none !important;
-webkit-font-smoothing: antialiased;
-webkit-text-size-adjust: none;
} }
input, :where(html) {
button, font-size: 100%;
textarea, -webkit-text-size-adjust: none;
select { scrollbar-width: thin;
font: inherit; scrollbar-gutter: stable;
tab-size: 2;
} }
p, :where(html:has(dialog:modal[open])) {
h1, overflow: clip;
h2,
h3,
h4,
h5,
h6 {
overflow-wrap: break-word;
} }
@media (prefers-reduced-motion: no-preference) {
:where(html:focus-within) {
scroll-behavior: smooth;
}
}
:where(body) {
font-size: var(--font-size-base);
line-height: var(--line-height-base);
-webkit-font-smoothing: antialiased;
-webkit-text-size-adjust: 100%;
}
:where(button) {
all: unset;
}
:where(input, button, textarea, select) {
font: inherit;
color: inherit;
}
:where(textarea) {
resize: vertical;
resize: block;
}
:where(button, label, select, summary, [role='button'], [role='option']) {
cursor: pointer;
}
:where(:disabled) {
cursor: not-allowed;
}
:where(label:has(> input:disabled), label:has(+ input:disabled)) {
cursor: not-allowed;
}
:where(a) {
color: inherit;
text-underline-offset: var(--spacing-xs);
}
ul {
list-style-type: disc;
}
ol {
list-style-type: number;
}
:where(ul, ol) {
list-style-position: inside;
}
:where(img, svg, video, canvas, audio, iframe, embed, object) {
display: block;
}
:where(p, h1, h2, h3) {
overflow-wrap: break-word;
}
:where(h1, h2, h3) {
text-wrap: balance;
}
:where(hr) {
border: none;
border-block-start: 1px solid;
border-block-start-color: currentColor;
color: inherit;
block-size: 0;
overflow: visible;
}
:where(dialog, [popover]) {
border: none;
background: none;
color: inherit;
inset: unset;
max-width: unset;
max-height: unset;
}
:where(dialog:not([open], [popover]), [popover]:not(:popover-open)) {
display: none !important;
}
:where(:focus-visible) {
outline: var(--border-default);
outline-offset: 1px;
border-radius: var(--border-radius-slight);
box-shadow: 0 0 0 1px var(--accent-color);
}
:where(:focus-visible, :target) {
scroll-margin-block: 8vh;
}
:where(.visually-hidden:not(:focus-within, :active)) {
clip-path: inset(50%) !important;
height: 1px !important;
width: 1px !important;
overflow: hidden !important;
position: absolute !important;
white-space: nowrap !important;
border: 0 !important;
user-select: none !important;
}

View file

@ -13,11 +13,14 @@
"items": [ "items": [
{%- assign entries = data -%} {%- assign entries = data -%}
{%- for entry in entries limit: 20 -%} {%- for entry in entries limit: 20 -%}
{%- assign text = entry.feed.description | markdown | strip_html | escape| normalize_whitespace | rstrip | htmlTruncate %}
{ {
"id": "{{ entry.feed.url | encodeAmp }}", "id": "{{ entry.feed.url | encodeAmp }}",
"url": "{{ entry.feed.url | encodeAmp }}", "url": "{{ entry.feed.url | encodeAmp }}",
"title": "{{ entry.feed.title | escape }}", "title": "{{ entry.feed.title | escape }}",
"content_text": "{{ entry.feed.description | markdown | strip_html | escape| normalize_whitespace | rstrip | htmlTruncate }}", "content_html": "{{ text }}",
"content_text": "{{ text }}",
"summary": "{{ text }}",
"date_published": "{{ entry.feed.date | stringToRFC3339 }}" "date_published": "{{ entry.feed.date | stringToRFC3339 }}"
}{%- if forloop.last == false -%},{%- endif -%} }{%- if forloop.last == false -%},{%- endif -%}
{%- endfor -%} {%- endfor -%}

View file

@ -16,4 +16,4 @@
{{ post.description | normalize_whitespace | markdown | htmlTruncate }} {{ post.description | normalize_whitespace | markdown | htmlTruncate }}
</article> </article>
{%- endfor -%} {%- endfor -%}
<a class="icon-link" href="/posts">View all posts {% tablericon "arrow-right" %}</a> <a href="/posts">View all posts {% tablericon "arrow-right" %}</a>

View file

@ -4,7 +4,7 @@
{%- assign loadingStrategy = loading | default: 'lazy' -%} {%- assign loadingStrategy = loading | default: 'lazy' -%}
{%- for item in data limit: count -%} {%- for item in data limit: count -%}
{%- assign alt = item.grid.alt | replaceQuotes -%} {%- assign alt = item.grid.alt | replaceQuotes -%}
{%- assign imageUrl = item.grid.image | default: item.grid.backdrop -%} {%- assign imageUrl = item.grid.image -%}
<a href="{{ item.grid.url }}" title="{{ alt }}"> <a href="{{ item.grid.url }}" title="{{ alt }}">
<div class="item"> <div class="item">
<div class="meta-text"> <div class="meta-text">
@ -16,6 +16,7 @@
{%- assign height = 0 -%} {%- assign height = 0 -%}
{%- case shape -%} {%- case shape -%}
{%- when 'poster' -%} {%- when 'poster' -%}
{%- assign imageUrl = item.grid.backdrop -%}
{%- assign imageClass = 'banner' -%} {%- assign imageClass = 'banner' -%}
{%- assign width = 256 -%} {%- assign width = 256 -%}
{%- assign height = 170 -%} {%- assign height = 170 -%}

View file

@ -22,9 +22,9 @@
<span class="subtext">{{ item.chart.subtext }}</span> <span class="subtext">{{ item.chart.subtext }}</span>
</div> </div>
</div> </div>
<div class="timestamp"> <time datetime="item.chart.played_at">
{{ item.chart.played_at | date: "%B %-d, %-I:%M%p", "America/Los_Angeles" }} {{ item.chart.played_at | date: "%B %-d, %-I:%M%p", "America/Los_Angeles" }}
</div> </time>
</div> </div>
{%- endfor -%} {%- endfor -%}
</div> </div>

View file

@ -6,7 +6,6 @@
href="{{ prevHref }}" href="{{ prevHref }}"
aria-label="Previous page" aria-label="Previous page"
class="{% unless prevHref %}disabled{% endunless %}" class="{% unless prevHref %}disabled{% endunless %}"
{% unless prevHref %}disabled{% endunless %}
> >
{% tablericon "arrow-left" %} {% tablericon "arrow-left" %}
</a> </a>
@ -29,7 +28,6 @@
href="{{ nextHref }}" href="{{ nextHref }}"
aria-label="Next page" aria-label="Next page"
class="{% unless nextHref %}disabled{% endunless %}" class="{% unless nextHref %}disabled{% endunless %}"
{% unless nextHref %}disabled{% endunless %}
> >
{% tablericon "arrow-right" %} {% tablericon "arrow-right" %}
</a> </a>

View file

@ -32,12 +32,12 @@ schema: books
height="307" height="307"
/> />
</a> </a>
<div class="book-meta"> <div class="media-meta">
<a href="{{ book.url }}"> <a href="{{ book.url }}">
<p class="title"><strong>{{ book.title }}</strong></p> <span class="title"><strong>{{ book.title }}</strong></span>
</a> </a>
{% if book.author %} {% if book.author %}
<p class="sub-meta">By {{ book.author }}</p> <span class="sub-meta">By {{ book.author }}</span>
{% endif %} {% endif %}
{% if book.progress %} {% if book.progress %}
{%- assign percentage = book.progress | append: '%' -%} {%- assign percentage = book.progress | append: '%' -%}

View file

@ -12,7 +12,7 @@ schema: books-year
{%- assign currentYear = 'now' | date: "%Y" -%} {%- assign currentYear = 'now' | date: "%Y" -%}
{%- assign yearString = year.value | append: '' -%} {%- assign yearString = year.value | append: '' -%}
{%- assign currentYearString = currentYear | append: '' -%} {%- assign currentYearString = currentYear | append: '' -%}
<a class="icon-link" href="/books" title="Go back to the books index page">{% tablericon "arrow-left" %} Back to books</a> <a href="/books" title="Go back to the books index page">{% tablericon "arrow-left" %} Back to books</a>
<h2>{{ year.value }} / Books</h2> <h2>{{ year.value }} / Books</h2>
{% if yearString == currentYearString %} {% if yearString == currentYearString %}
<p>I've finished <strong class="highlight-text">{{ bookData.size }} books</strong> this year.{%- if favoriteBooks %} Among my favorites are {{ favoriteBooks }}.{%- endif -%}</p> <p>I've finished <strong class="highlight-text">{{ bookData.size }} books</strong> this year.{%- if favoriteBooks %} Among my favorites are {{ favoriteBooks }}.{%- endif -%}</p>

View file

@ -24,7 +24,7 @@ schema: music-index
{% tablericon "playlist" %} {% tablericon "playlist" %}
Tracks Tracks
</h3> </h3>
<div class="track-display"> <div>
<input id="tracks-recent" name="track-options" type="radio" aria-hidden="true" checked /> <input id="tracks-recent" name="track-options" type="radio" aria-hidden="true" checked />
<input id="tracks-chart" name="track-options" type="radio" aria-hidden="true" /> <input id="tracks-chart" name="track-options" type="radio" aria-hidden="true" />
<label for="tracks-recent" class="button" data-toggle="tracks-recent">Recent</label> <label for="tracks-recent" class="button" data-toggle="tracks-recent">Recent</label>

View file

@ -4,10 +4,10 @@ description: These are my favorite movies. There are many like them, but these a
pagination: pagination:
data: movies.favorites data: movies.favorites
size: 24 size: 24
permalink: "/watching/favorite-movies/{% if pagination.pageNumber > 0 %}{{ pagination.pageNumber }}/{% endif %}.html" permalink: "/watching/favorite-movies/{% if pagination.pageNumber > 0 %}{{ pagination.pageNumber }}/{% endif %}index.html"
schema: favorite-movies schema: favorite-movies
--- ---
<a class="icon-link" href="/watching" title="Go back to the watching index page">{% tablericon "arrow-left" %} Back to watching</a> <a href="/watching" title="Go back to the watching index page">{% tablericon "arrow-left" %} Back to watching</a>
{% if pagination.pageNumber == 0 %} {% if pagination.pageNumber == 0 %}
<h2 class="watching">{{ title }}</h2> <h2 class="watching">{{ title }}</h2>
<p>These are my favorite movies. There are many like them, but these are mine.</p> <p>These are my favorite movies. There are many like them, but these are mine.</p>

View file

@ -4,10 +4,10 @@ description: These are my favorite shows. There are many like them, but these ar
pagination: pagination:
data: tv.favorites data: tv.favorites
size: 24 size: 24
permalink: "/watching/favorite-shows/{% if pagination.pageNumber > 0 %}{{ pagination.pageNumber }}/{% endif %}.html" permalink: "/watching/favorite-shows/{% if pagination.pageNumber > 0 %}{{ pagination.pageNumber }}/{% endif %}index.html"
schema: favorite-shows schema: favorite-shows
--- ---
<a class="icon-link" href="/watching" title="Go back to the watching index page">{% tablericon "arrow-left" %} Back to watching</a> <a href="/watching" title="Go back to the watching index page">{% tablericon "arrow-left" %} Back to watching</a>
{% if pagination.pageNumber == 0 %} {% if pagination.pageNumber == 0 %}
<h2 class="watching">{{ title }}</h2> <h2 class="watching">{{ title }}</h2>
<p>These are my favorite shows. There are many like them, but these are mine.</p> <p>These are my favorite shows. There are many like them, but these are mine.</p>

View file

@ -22,7 +22,7 @@ schema: watching
</h3> </h3>
{% render "media/grid.liquid", globals:globals, data:tv.recentlyWatched, shape:"vertical", count: 6 %} {% render "media/grid.liquid", globals:globals, data:tv.recentlyWatched, shape:"vertical", count: 6 %}
<h3 id="favorite-movies"> <h3 id="favorite-movies">
<a class="icon-link" href="/watching/favorite-movies"> <a href="/watching/favorite-movies">
{% tablericon "star" %} {% tablericon "star" %}
Favorite movies Favorite movies
</a> </a>
@ -30,7 +30,7 @@ schema: watching
{% assign favoriteMovies = movies.favorites | shuffleArray %} {% assign favoriteMovies = movies.favorites | shuffleArray %}
{% render "media/grid.liquid", globals:globals, data:favoriteMovies, shape:"vertical", count: 6 %} {% render "media/grid.liquid", globals:globals, data:favoriteMovies, shape:"vertical", count: 6 %}
<h3 id="favorite-shows"> <h3 id="favorite-shows">
<a class="icon-link" href="/watching/favorite-shows"> <a href="/watching/favorite-shows">
{% tablericon "star" %} {% tablericon "star" %}
Favorite shows Favorite shows
</a> </a>

View file

@ -136,7 +136,7 @@ const generateAssociatedMediaHTML = (data, isGenre = false) => {
return ` return `
<div class="associated-media"> <div class="associated-media">
<p class="${category}">${ICON_MAP[icon]} ${title}</p> <span class="${category}">${ICON_MAP[icon]} ${title}</span>
<ul> <ul>
${items ${items
.map((item) => { .map((item) => {
@ -206,10 +206,10 @@ export const generateArtistHTML = (artist, globals) => {
const playLabel = artist?.["total_plays"] === 1 ? "play" : "plays"; const playLabel = artist?.["total_plays"] === 1 ? "play" : "plays";
const concertsList = artist["concerts"]?.length const concertsList = artist["concerts"]?.length
? `<hr /> ? `<hr />
<p id="concerts" class="concerts"> <span id="concerts" class="concerts">
${ICON_MAP["deviceSpeaker"]} ${ICON_MAP["deviceSpeaker"]}
I've seen this artist live! I've seen this artist live!
</p> </span>
<ul>${artist["concerts"].map(generateConcertModal).join("")}</ul>` <ul>${artist["concerts"].map(generateConcertModal).join("")}</ul>`
: ""; : "";
const albumsTable = artist["albums"]?.length const albumsTable = artist["albums"]?.length
@ -231,7 +231,7 @@ export const generateArtistHTML = (artist, globals) => {
: ""; : "";
return ` return `
<a class="icon-link" href="/music">${ICON_MAP.arrowLeft} Back to music</a> <a href="/music">${ICON_MAP.arrowLeft} Back to music</a>
<article class="artist-focus"> <article class="artist-focus">
<div class="artist-display"> <div class="artist-display">
<img <img
@ -250,31 +250,31 @@ export const generateArtistHTML = (artist, globals) => {
width="200" width="200"
height="200" height="200"
/> />
<div class="artist-meta"> <div class="media-meta">
<p class="title"><strong>${artist["name"]}</strong></p> <span class="title"><strong>${artist["name"]}</strong></span>
<p class="sub-meta country">${ICON_MAP["mapPin"]} ${parseCountryField( <span class="sub-meta country">${ICON_MAP["mapPin"]} ${parseCountryField(
artist["country"] artist["country"]
)}</p> )}</span>
${ ${
artist["favorite"] artist["favorite"]
? `<p class="sub-meta favorite">${ICON_MAP["heart"]} This is one of my favorite artists!</p>` ? `<span class="sub-meta favorite">${ICON_MAP["heart"]} This is one of my favorite artists!</span>`
: "" : ""
} }
${ ${
artist["tattoo"] artist["tattoo"]
? `<p class="sub-meta tattoo">${ICON_MAP["needle"]} I have a tattoo inspired by this artist!</p>` ? `<span class="sub-meta tattoo">${ICON_MAP["needle"]} I have a tattoo inspired by this artist!</span>`
: "" : ""
} }
${ ${
artist["total_plays"] artist["total_plays"]
? `<p class="sub-meta"><strong class="highlight-text">${artist["total_plays"]} ${playLabel}</strong></p>` ? `<span class="sub-meta"><strong class="highlight-text">${artist["total_plays"]} ${playLabel}</strong></span>`
: "" : ""
} }
<p class="sub-meta">${ <span class="sub-meta">${
artist["genre"] artist["genre"]
? `<a href="${artist["genre"]["url"]}">${artist["genre"]["name"]}</a>` ? `<a href="${artist["genre"]["url"]}">${artist["genre"]["name"]}</a>`
: "" : ""
}</p> }</span>
</div> </div>
</div> </div>
${generateAssociatedMediaHTML(artist)} ${generateAssociatedMediaHTML(artist)}
@ -311,7 +311,7 @@ export const generateBookHTML = (book, globals) => {
: ""; : "";
return ` return `
<a class="icon-link" href="/books">${ <a href="/books">${
ICON_MAP["arrowLeft"] ICON_MAP["arrowLeft"]
} Back to books</a> } Back to books</a>
<article class="book-focus"> <article class="book-focus">
@ -319,14 +319,14 @@ export const generateBookHTML = (book, globals) => {
<img <img
srcset=" srcset="
${globals["cdn_url"]}${ ${globals["cdn_url"]}${
book["image"] book["image"]
}?class=verticalsm&type=webp 200w, }?class=verticalsm&type=webp 200w,
${globals["cdn_url"]}${ ${globals["cdn_url"]}${
book["image"] book["image"]
}?class=verticalmd&type=webp 400w, }?class=verticalmd&type=webp 400w,
${globals["cdn_url"]}${ ${globals["cdn_url"]}${
book["image"] book["image"]
}?class=verticalbase&type=webp 800w }?class=verticalbase&type=webp 800w
" "
sizes="(max-width: 450px) 203px, (max-width: 850px) 406px, 812px" sizes="(max-width: 450px) 203px, (max-width: 850px) 406px, 812px"
src="${globals["cdn_url"]}${book["image"]}?class=verticalsm&type=webp" src="${globals["cdn_url"]}${book["image"]}?class=verticalsm&type=webp"
@ -336,23 +336,23 @@ export const generateBookHTML = (book, globals) => {
width="200" width="200"
height="307" height="307"
/> />
<div class="book-meta"> <div class="media-meta">
<p class="title"><strong>${book["title"]}</strong></p> <span class="title"><strong>${book["title"]}</strong></span>
${book["rating"] ? `<p>${book["rating"]}</p>` : ""} ${book["rating"] ? `<span>${book["rating"]}</span>` : ""}
${ ${
book["author"] ? `<p class="sub-meta">By ${book["author"]}</p>` : "" book["author"] ? `<span class="sub-meta">By ${book["author"]}</span>` : ""
} }
${ ${
book["favorite"] book["favorite"]
? `<p class="sub-meta favorite">${ICON_MAP["heart"]} This is one of my favorite books!</p>` ? `<span class="sub-meta favorite">${ICON_MAP["heart"]} This is one of my favorite books!</span>`
: "" : ""
} }
${ ${
book["tattoo"] book["tattoo"]
? `<p class="sub-meta tattoo">${ICON_MAP["needle"]} I have a tattoo inspired by this book!</p>` ? `<span class="sub-meta tattoo">${ICON_MAP["needle"]} I have a tattoo inspired by this book!</span>`
: "" : ""
} }
${status ? `<p class="sub-meta">${status}</p>` : ""} ${status ? `<span class="sub-meta">${status}</span>` : ""}
</div> </div>
</div> </div>
${ ${
@ -373,7 +373,7 @@ export const generateGenreHTML = (genre) => {
const mediaLinks = generateMediaLinks(genre["artists"], "artist", 5); const mediaLinks = generateMediaLinks(genre["artists"], "artist", 5);
return ` return `
<a class="icon-link" href="/music">${ <a href="/music">${
ICON_MAP["arrowLeft"] ICON_MAP["arrowLeft"]
} Back to music</a> } Back to music</a>
<h2>${genre["name"]}</h2> <h2>${genre["name"]}</h2>
@ -411,21 +411,21 @@ export const generateWatchingHTML = (media, globals, type) => {
media["last_watched"] || (isShow && media["episode"]?.["last_watched_at"]); media["last_watched"] || (isShow && media["episode"]?.["last_watched_at"]);
return ` return `
<a class="icon-link" href="/watching">${ <a href="/watching">${
ICON_MAP.arrowLeft ICON_MAP.arrowLeft
} Back to watching</a> } Back to watching</a>
<article class="watching focus"> <article class="watching focus">
<img <img
srcset=" srcset="
${globals["cdn_url"]}${ ${globals["cdn_url"]}${
media["backdrop"] media["backdrop"]
}?class=bannersm&type=webp 256w, }?class=bannersm&type=webp 256w,
${globals["cdn_url"]}${ ${globals["cdn_url"]}${
media["backdrop"] media["backdrop"]
}?class=bannermd&type=webp 512w, }?class=bannermd&type=webp 512w,
${globals["cdn_url"]}${ ${globals["cdn_url"]}${
media["backdrop"] media["backdrop"]
}?class=bannerbase&type=webp 1024w }?class=bannerbase&type=webp 1024w
" "
sizes="(max-width: 450px) 256px, sizes="(max-width: 450px) 256px,
(max-width: 850px) 512px, (max-width: 850px) 512px,
@ -438,31 +438,31 @@ export const generateWatchingHTML = (media, globals, type) => {
width="256" width="256"
height="180" height="180"
/> />
<div class="meta"> <div class="media-meta">
<p class="title"><strong>${media["title"]}</strong> (${ <span class="title"><strong>${media["title"]}</strong> (${
media["year"] media["year"]
})</p> })</span>
${media["rating"] ? `<p>${media["rating"]}</p>` : ""} ${media["rating"] ? `<span>${media["rating"]}</span>` : ""}
${ ${
media["favorite"] media["favorite"]
? `<p class="sub-meta favorite">${ICON_MAP["heart"]} This is one of my favorite ${label}s!</p>` ? `<span class="sub-meta favorite">${ICON_MAP["heart"]} This is one of my favorite ${label}s!</span>`
: "" : ""
} }
${ ${
media["tattoo"] media["tattoo"]
? `<p class="sub-meta tattoo">${ICON_MAP["needle"]} I have a tattoo inspired by this ${label}!</p>` ? `<span class="sub-meta tattoo">${ICON_MAP["needle"]} I have a tattoo inspired by this ${label}!</span>`
: "" : ""
} }
${ ${
media["collected"] media["collected"]
? `<p class="sub-meta collected">${ICON_MAP["circleCheck"]} This ${label} is in my collection!</p>` ? `<span class="sub-meta collected">${ICON_MAP["circleCheck"]} This ${label} is in my collection!</span>`
: "" : ""
} }
${ ${
lastWatched lastWatched
? `<p class="sub-meta">Last watched on <strong class="highlight-text">${formatDate( ? `<span class="sub-meta">Last watched on <strong class="highlight-text">${formatDate(
lastWatched lastWatched
)}</strong>.</p>` )}</strong>.</span>`
: "" : ""
} }
</div> </div>