Compare commits

..

10 commits

Author SHA1 Message Date
9ccd29294b fix metadata
Some checks failed
/ build (push) Failing after 5m10s
2024-12-27 13:42:20 -08:00
9142f5f460 fix rss links 2024-12-27 13:36:14 -08:00
fee5eb133a fix: css header border on characters page 2024-12-26 19:19:10 -08:00
63096f5237 granular quality 2024-12-26 18:30:15 -08:00
1f5dd5023a update image shrink routine to use mozjpeg 2024-12-26 18:26:04 -08:00
f92e91f261 ignore tina cms 2024-12-26 17:30:51 -08:00
9d2a4bcdfd regular dependencies 2024-12-24 13:26:54 -08:00
266dfbefdf no top level bundles 2024-12-24 13:07:30 -08:00
3bf0435c7e star for fursonas 2024-12-24 13:03:32 -08:00
9d32397367 toons? games? 2024-12-24 13:00:00 -08:00
14 changed files with 534 additions and 313 deletions

3
.gitignore vendored
View file

@ -1,8 +1,9 @@
_site/ _site/
node_modules/ node_modules
.cache .cache
patches patches
tools/in/* tools/in/*
!tools/in/.gitkeep !tools/in/.gitkeep
tools/out/* tools/out/*
!tools/out/.gitkeep !tools/out/.gitkeep
tina

View file

@ -3,7 +3,7 @@ layout: layouts/base.njk
--- ---
{% css %} {% css %}
h2 { h2 ~ h2 {
border: none; border: none;
padding-top: 20px; padding-top: 20px;
border-top: 12px double var(--xkcd-magenta); border-top: 12px double var(--xkcd-magenta);

View file

@ -3,12 +3,12 @@
"permalink": "/blog/feed.xml", "permalink": "/blog/feed.xml",
"eleventyExcludeFromCollections": true, "eleventyExcludeFromCollections": true,
"metadata": { "metadata": {
"title": "My Blog about Boats", "title": "nycki.net",
"description": "I am writing about my experiences as a naval navel-gazer.", "description": "nycki.net",
"language": "en", "language": "en",
"base": "https://example.com/", "base": "https://nycki.net/",
"author": { "author": {
"name": "Boaty McBoatFace" "name": "nycki"
} }
} }
} }

View file

@ -2,6 +2,7 @@
layout: layouts/base.njk layout: layouts/base.njk
title: characters title: characters
permalink: /characters/ permalink: /characters/
description: toons? games?
--- ---
# {{ title }} # {{ title }}
@ -11,21 +12,21 @@ permalink: /characters/
## the list ## the list
**fursona🤎 roleplay🎭 no custom art♻ cards project🃏 removable head🎃** **sona⭐ roleplay🎭 no custom art♻ cards project🃏 removable head🎃**
- [Magenta Johnson](https://www.f-list.net/c/magenta%20johnson/) (2013) 🤎🎭🎃 - [Magenta Johnson](https://www.f-list.net/c/magenta%20johnson/) (2013) 🎭🎃
- [Naughty Stage Ninjas](https://www.f-list.net/c/naughty%20stage%20ninjas/) (2015) 🎭♻️ - [Naughty Stage Ninjas](https://www.f-list.net/c/naughty%20stage%20ninjas/) (2015) 🎭♻️
- [Paradox Pickpocket](https://www.f-list.net/c/Paradox%20Pickpocket) (2016) 🎭♻️ - [Paradox Pickpocket](https://www.f-list.net/c/Paradox%20Pickpocket) (2016) 🎭♻️
- [Magic Hands](https://www.f-list.net/c/magic%20hands/) (2016) 🎭 - [Magic Hands](https://www.f-list.net/c/magic%20hands/) (2016) 🎭
- [Lucky](https://www.f-list.net/c/lucky%20bunny%20girl/) (2016) 🎭♻️ - [Lucky](https://www.f-list.net/c/lucky%20bunny%20girl/) (2016) 🎭♻️
- The Bunnies: - The Bunnies:
- [Klayni](https://www.f-list.net/c/klayni/) (2020) 🤎🎭 - [Klayni](https://www.f-list.net/c/klayni/) (2020) 🎭
- [Seven Spades](https://www.f-list.net/c/seven%20spades/) and [Ten Diamonds](https://www.f-list.net/c/ten%20diamonds/), the Velvets (2022) 🃏 - [Seven Spades](https://www.f-list.net/c/seven%20spades/) and [Ten Diamonds](https://www.f-list.net/c/ten%20diamonds/), the Velvets (2022) 🃏
- Kitty and [Bunny](https://www.f-list.net/c/bunny%20card/), Fortune's Court (2022) 🃏 - Kitty and [Bunny](https://www.f-list.net/c/bunny%20card/), Fortune's Court (2022) 🃏
- [Unnamed Bunny Assistants](https://x.com/nupa_nsfw/status/1692229330091590004) (2023) 🃏 - [Unnamed Bunny Assistants](https://x.com/nupa_nsfw/status/1692229330091590004) (2023) 🃏
- [Royal Fluffle](https://cohost.org/nycki/post/7477310-bunny-cards) (2024) 🃏 - [Royal Fluffle](https://cohost.org/nycki/post/7477310-bunny-cards) (2024) 🃏
- [Klay Mu](https://bark.lgbt/@nycki/113261905651460029) (2023) 🤎🎭 - [Klay Mu](https://bark.lgbt/@nycki/113261905651460029) (2023) 🎭
- [Fusion Magenta](https://bark.lgbt/@nycki/111557553537372550) (2023) 🤎 - [Fusion Magenta](https://bark.lgbt/@nycki/111557553537372550) (2023)
- [Gogo Board](https://bark.lgbt/@nycki/113154698667052076) (2023) 🎭🎃 - [Gogo Board](https://bark.lgbt/@nycki/113154698667052076) (2023) 🎭🎃
- [Venus Nil](https://bark.lgbt/@nycki/113318574242645093) (2024) 🎭🎃 - [Venus Nil](https://bark.lgbt/@nycki/113318574242645093) (2024) 🎭🎃

View file

@ -195,7 +195,7 @@ a[href].header-anchor:focus,
color: #aaa; color: #aaa;
} }
h1:not(:has(+h2)) { h1 {
padding-bottom: 20px; padding-bottom: 20px;
border-bottom: 12px double var(--xkcd-magenta); border-bottom: 12px double var(--xkcd-magenta);
} }

View file

@ -6,6 +6,8 @@ import { DateTime } from "luxon";
/** @param {import('@11ty/eleventy').UserConfig} eleventyConfig */ /** @param {import('@11ty/eleventy').UserConfig} eleventyConfig */
export default function(eleventyConfig) { export default function(eleventyConfig) {
eleventyConfig.setInputDirectory('content');
if (process.env.NODE_ENV === 'localhost') { if (process.env.NODE_ENV === 'localhost') {
console.log('metadata override'); console.log('metadata override');
eleventyConfig.addGlobalData('metadata.url', 'http://localhost:8080'); eleventyConfig.addGlobalData('metadata.url', 'http://localhost:8080');
@ -31,7 +33,9 @@ export default function(eleventyConfig) {
eleventyConfig.addWatchTarget("content/**/*.{svg,webp,png,jpeg}"); eleventyConfig.addWatchTarget("content/**/*.{svg,webp,png,jpeg}");
// Official plugins // Official plugins
eleventyConfig.addBundle('css'); eleventyConfig.addBundle('css', {
toFileDirectory: 'bundle',
});
eleventyConfig.addPlugin(pluginSyntaxHighlight, { eleventyConfig.addPlugin(pluginSyntaxHighlight, {
preAttributes: { tabindex: 0 } preAttributes: { tabindex: 0 }
}); });
@ -150,14 +154,6 @@ export default function(eleventyConfig) {
// Pre-process *.html files with: (default: `liquid`) // Pre-process *.html files with: (default: `liquid`)
htmlTemplateEngine: "njk", htmlTemplateEngine: "njk",
// These are all optional:
dir: {
input: "content", // default: "."
includes: "../_includes", // default: "_includes"
data: "../_data", // default: "_data"
output: "_site"
},
// ----------------------------------------------------------------- // -----------------------------------------------------------------
// Optional items: // Optional items:
// ----------------------------------------------------------------- // -----------------------------------------------------------------

752
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -33,13 +33,14 @@
"url": "https://github.com/11ty/eleventy-base-blog/issues" "url": "https://github.com/11ty/eleventy-base-blog/issues"
}, },
"homepage": "https://github.com/11ty/eleventy-base-blog#readme", "homepage": "https://github.com/11ty/eleventy-base-blog#readme",
"devDependencies": { "dependencies": {
"@11ty/eleventy": "^3.0.0", "@11ty/eleventy": "^3.0.0",
"@11ty/eleventy-plugin-rss": "^2.0.2", "@11ty/eleventy-plugin-rss": "^2.0.2",
"@11ty/eleventy-plugin-syntaxhighlight": "^5.0.0", "@11ty/eleventy-plugin-syntaxhighlight": "^5.0.0",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"jsdom": "^25.0.1", "jsdom": "^25.0.1",
"luxon": "^3.3.0", "luxon": "^3.3.0",
"markdown-it-anchor": "^8.6.7" "markdown-it-anchor": "^8.6.7",
"sharp": "^0.33.5"
} }
} }

View file

@ -1,28 +1,36 @@
// winget install ImageMagick.Q8 import fs from 'node:fs/promises';
const { exec } = require('node:child_process'); import path from 'node:path';
const { readdir } = require('node:fs/promises'); import sharp from 'sharp';
const path = require('node:path');
const dirIn = 'tools/in';
const dirOut = 'tools/out';
const thresholdBytes = 2 * 1024 * 1024;
const quality = [100, 99, 97, 95, 90, 80, 75, 70, 60, 50, 40];
async function main() { async function main() {
const dirIn = 'tools/in'; for (const base of await fs.readdir(dirIn)) {
const dirOut = 'tools/out';
for (const base of await readdir(dirIn)) {
if (base === '.gitkeep') continue; if (base === '.gitkeep') continue;
const fileIn = `${dirIn}/${base}`; const fileIn = `${dirIn}/${base}`;
const file = path.parse(fileIn); const { name } = path.parse(fileIn);
const fileOut = `${dirOut}/${file.name}.webp`; const { size } = await fs.stat(fileIn);
if (size <= thresholdBytes) {
// TODO: what if the input image is already a lossless webp? const fileOut = `${dirOut}/${base}`;
const lossless = file.ext === '.png'; console.log(`${fileIn} -> ${fileOut} (no changes)`);
fs.copyFile(fileIn, fileOut);
const command = [ continue;
`magick "${fileIn}"`, }
`-define webp:lossless=${lossless}`, const fileOut = `${dirOut}/${name}.jpg`;
`-define webp:target-size=200kb`, for (let i = 0; i < quality.length; i += 1) {
`"${fileOut}"`, const newStats = await (sharp(fileIn)
].join(' '); .withMetadata()
console.log(command); .jpeg({ mozjpeg: true, quality: quality[i] })
exec(command, (_err, stdout, stderr) => console.log(stdout + stderr)); .toFile(fileOut)
);
if (i == quality.length || newStats.size <= thresholdBytes) {
console.log(`${fileIn} -> ${fileOut} (quality: ${quality[i]})`);
break;
}
}
} }
} }