from the last days
(all time)
diff --git a/css/critical.css b/css/critical.css
index 051439d..0d0ab8b 100644
--- a/css/critical.css
+++ b/css/critical.css
@@ -45,6 +45,8 @@ main.container{padding-top:1.5rem;padding-bottom:1.5rem}
.layout-with-sidebar{display:grid;grid-template-columns:1fr;gap:1.5rem}
@media(min-width:1024px){.layout-with-sidebar{grid-template-columns:2fr 1fr;gap:2rem}}
.main-content{min-width:0;overflow-x:hidden}
+/* Reserve sidebar space on desktop to prevent CLS when Alpine.js hydrates collapsible widgets */
+@media(min-width:1024px){.sidebar{min-height:600px}}
/* Basic typography — prevent FOUT */
h1,h2,h3,h4{margin:0;line-height:1.25}
diff --git a/css/tailwind.css b/css/tailwind.css
index 2e77357..5607dcc 100644
--- a/css/tailwind.css
+++ b/css/tailwind.css
@@ -187,7 +187,7 @@
}
.nav-dropdown-menu a {
- @apply block px-4 py-2 text-sm text-surface-600 dark:text-surface-400 hover:bg-surface-100 dark:hover:bg-surface-700 hover:text-surface-900 dark:hover:text-surface-100 no-underline;
+ @apply block px-4 py-2.5 text-sm text-surface-600 dark:text-surface-400 hover:bg-surface-100 dark:hover:bg-surface-700 hover:text-surface-900 dark:hover:text-surface-100 no-underline;
}
.nav-dropdown-divider {
@@ -224,7 +224,7 @@
}
.mobile-nav-submenu a {
- @apply pl-8 py-2 text-sm border-b-0;
+ @apply pl-8 py-3 text-sm border-b-0;
}
.mobile-nav-divider {
@@ -332,7 +332,7 @@
/* Category tags (post metadata pills) */
.p-category {
- @apply inline-block px-2 py-0.5 text-xs bg-surface-100 dark:bg-surface-800 text-surface-600 dark:text-surface-300 rounded border border-surface-200 dark:border-surface-700 hover:border-accent-400 dark:hover:border-accent-600 transition-colors;
+ @apply inline-block px-3 py-1.5 text-xs bg-surface-100 dark:bg-surface-800 text-surface-600 dark:text-surface-300 rounded border border-surface-200 dark:border-surface-700 hover:border-accent-400 dark:hover:border-accent-600 transition-colors;
}
/* Inline hashtags in post content — styled as subtle links, not pills */
@@ -353,7 +353,7 @@
}
.facepile-avatar img {
- @apply w-8 h-8 rounded-full;
+ @apply w-10 h-10 rounded-full;
}
/* GitHub components */
diff --git a/eleventy.config.js b/eleventy.config.js
index ec4c710..5a61754 100644
--- a/eleventy.config.js
+++ b/eleventy.config.js
@@ -7,6 +7,7 @@ import markdownIt from "markdown-it";
import markdownItAnchor from "markdown-it-anchor";
import syntaxHighlight from "@11ty/eleventy-plugin-syntaxhighlight";
import { minify } from "html-minifier-terser";
+import { minify as minifyJS } from "terser";
import registerUnfurlShortcode, { getCachedCard, prefetchUrl } from "./lib/unfurl-shortcode.js";
import matter from "gray-matter";
import { createHash, createHmac } from "crypto";
@@ -1267,6 +1268,36 @@ export default function (eleventyConfig) {
}
+ // JS minification — minify source JS files in output (skip vendor, already-minified)
+ if (runMode === "build" && !incremental) {
+ const jsOutputDir = directories?.output || dir.output;
+ const jsDir = resolve(jsOutputDir, "js");
+ if (existsSync(jsDir)) {
+ let jsMinified = 0;
+ let jsSaved = 0;
+ for (const file of readdirSync(jsDir).filter(f => f.endsWith(".js") && !f.endsWith(".min.js"))) {
+ const filePath = resolve(jsDir, file);
+ try {
+ const src = readFileSync(filePath, "utf-8");
+ const result = await minifyJS(src, { compress: true, mangle: true });
+ if (result.code) {
+ const saved = src.length - result.code.length;
+ if (saved > 0) {
+ writeFileSync(filePath, result.code);
+ jsSaved += saved;
+ jsMinified++;
+ }
+ }
+ } catch (err) {
+ console.error(`[js-minify] Failed to minify ${file}:`, err.message);
+ }
+ }
+ if (jsMinified > 0) {
+ console.log(`[js-minify] Minified ${jsMinified} JS files, saved ${(jsSaved / 1024).toFixed(1)} KiB`);
+ }
+ }
+ }
+
// Syndication webhook — trigger after incremental rebuilds (new posts are now live)
// Cuts syndication latency from ~2 min (poller) to ~5 sec (immediate trigger)
if (incremental) {
diff --git a/funkwhale.njk b/funkwhale.njk
index 58143c4..d3545b5 100644
--- a/funkwhale.njk
+++ b/funkwhale.njk
@@ -220,7 +220,7 @@ withSidebar: true
{{ listening.relativeTime }}
{% if listening.duration %}
- {{ listening.duration }}
+ {{ listening.duration }}
{% endif %}
diff --git a/interactions.njk b/interactions.njk
index 712e8b2..c998a07 100644
--- a/interactions.njk
+++ b/interactions.njk
@@ -25,7 +25,7 @@ permalink: /interactions/
role="tab" id="interactions-tab-outbound" aria-controls="interactions-panel-outbound"
class="px-4 py-3 text-sm font-medium border-b-2 -mb-px transition-colors">
My Activity
-