Commit Graph

387 Commits

Author SHA1 Message Date
svemagie
69da442fe0 Add repo-managed static CV data fallbacks 2026-03-08 06:49:12 +01:00
svemagie
dd400cbef5 Fetch CV data via API with file fallback 2026-03-08 06:46:07 +01:00
svemagie
a1eedb72ca update page post 2026-03-08 06:45:08 +01:00
svemagie
2174fcd31b update page post 2026-03-08 06:30:29 +01:00
svemagie
b3525b6944 Fix Last.fm listening fetch parameters 2026-03-08 06:26:14 +01:00
svemagie
e54624f7c0 Harden listening data endpoints with route fallbacks 2026-03-08 06:19:11 +01:00
svemagie
5277766ea3 Default Social Activity tab to Mastodon 2026-03-08 05:53:01 +01:00
svemagie
722ff22328 Fix GitHub widget/data endpoints to prefer /github/api routes 2026-03-08 05:44:47 +01:00
svemagie
64e861873e update page post 2026-03-08 05:31:47 +01:00
svemagie
5722e80c8e Remove legacy IndieKit auth config from static blog repo 2026-03-08 04:41:43 +01:00
svemagie
d7bb8f0c52 fix: add resilient github and changelog API fallbacks 2026-03-08 03:03:41 +01:00
svemagie
79011c8cf8 update page post 2026-03-08 02:52:37 +01:00
svemagie
c984bd2237 create page post 2026-03-08 02:52:04 +01:00
svemagie
b7442b6eaa new gitignore 2026-03-08 02:50:39 +01:00
svemagie
98a1898fd1 fix: normalize permalinks and page updated dates 2026-03-08 02:45:11 +01:00
svemagie
cb921f076b create page post 2026-03-08 02:32:42 +01:00
svemagie
d0553b38f6 upload photo file 2026-03-08 02:06:10 +01:00
svemagie
45e32e4582 delete photo file 2026-03-08 02:05:58 +01:00
svemagie
db7518094c upload photo file 2026-03-08 01:56:27 +01:00
svemagie
4ff4fa3f33 delete note post 2026-03-08 00:39:20 +01:00
svemagie
64f787491b update note post 2026-03-08 00:36:57 +01:00
svemagie
1c47cfdc79 update bookmark post 2026-03-08 00:35:24 +01:00
svemagie
b2d28949ce fix(layout): apply page layout defaults for page post type 2026-03-08 00:21:18 +01:00
svemagie
fb2fe70c98 fix(theme): apply post layout defaults for content markdown 2026-03-08 00:09:29 +01:00
svemagie
452732a624 fix(content): migrate malformed indiekit JSON blobs to markdown 2026-03-08 00:01:10 +01:00
svemagie
e9849fa6cb create bookmark post 2026-03-07 23:27:22 +01:00
svemagie
44eca63f10 Merge remote-tracking branch 'theme-upstream/main' 2026-03-07 23:22:52 +01:00
svemagie
5b2f570398 chore: trigger deploy 2026-03-07 21:05:06 +01:00
svemagie
519a7cb36f fix: render notes with content.html if present (web interface compatibility) 2026-03-07 21:00:36 +01:00
svemagie
f9652e592f Merge branch 'main' of github.com:svemagie/blog 2026-03-07 20:58:30 +01:00
svemagie
e541877050 claude ignore 2026-03-07 20:57:49 +01:00
svemagie
39599db772 create note post 2026-03-07 20:57:17 +01:00
Ricardo
254d5069f7 fix: move focus-trap logic from inline attribute to JS method
The @keydown.tab handler in fediverse-modal.njk contained complex
inline JS with arrow functions, querySelector strings with escaped
quotes, and comparison operators — all of which confused
html-minifier-terser's HTML parser, causing parse errors on every
page that includes the modal (i.e., nearly every page).

Moved the focus-trap logic to a trapFocus() method on the Alpine
component where it belongs.

Confab-Link: http://localhost:8080/sessions/edb1b7b0-da66-4486-bd9c-d1cfa7553b88
2026-03-07 20:35:32 +01:00
Ricardo
6ff40c8317 perf: address PageSpeed Insights issues (CLS, contrast, touch targets, JS minification)
- Reserve sidebar min-height on desktop to prevent CLS from Alpine.js hydration
- Defer lite-yt-embed.css with media="print" onload pattern
- Add terser JS minification in eleventy.after build hook
- Increase touch target sizing for category pills, facepile avatars, nav items
- Fix text-surface-400 contrast ratio (3.05:1 → 6.23:1) across 20 instances

Confab-Link: http://localhost:8080/sessions/edb1b7b0-da66-4486-bd9c-d1cfa7553b88
2026-03-07 20:13:45 +01:00
Ricardo
2c60bc2580 fix: restore horizontal layout for post categories
The accessibility change from <span> to <ul> caused categories to stack
vertically. Add flex utilities to maintain horizontal flow while keeping
the semantic list markup and ARIA attributes.

Confab-Link: http://localhost:8080/sessions/0ec83454-d346-4329-8aaf-6b12139bf596
2026-03-07 20:11:20 +01:00
Ricardo
1026d728af a11y: fix all remaining WCAG 2.1 AA issues from audit round 2
- Focus traps for fediverse modal and lightbox dialogs (C3, C4)
- Search widget input label (C5)
- Blogroll widget tab ARIA semantics (C6)
- Footer social links "opens in new tab" warning (S5)
- Reply context aria-label on aside (S8)
- Photo alt text fallback includes post title (S10)
- Post categories use list markup (M3)
- Funkwhale now-playing bars aria-hidden (M7)
- TOC uses static Tailwind classes instead of dynamic (M9)
- Footer headings use proper aria heading roles (M15)
- Header anchor opacity increased to 1 for contrast (M18)
- Custom HTML widgets labeled as regions (M19)
- Empty collection placeholder role=status (M22)
- GitHub widget loading state announced (N5)
- Subscribe icon contrast improved (m1)
- All Permalink links have aria-label with post context (m3)
- Podroll audio element aria-label (m4)
- Obfuscated email link aria-label (m6)
- Fediverse follow button uses aria-label (M10)

Score: 53.6% → 92.9% (26/28 WCAG criteria passing)

Confab-Link: http://localhost:8080/sessions/0ec83454-d346-4329-8aaf-6b12139bf596
2026-03-07 19:34:25 +01:00
Ricardo
e236b4bf65 a11y: comprehensive WCAG 2.1 Level AA accessibility audit
- Add skip-to-main-content link and main content ID target
- Add prefers-reduced-motion media queries for all animations
- Enhance visible focus indicators (2px offset, high-contrast ring)
- Replace ~160 text-surface-500 instances with text-surface-600/dark:text-surface-400
  for 4.5:1+ contrast ratio compliance
- Add aria-hidden="true" to ~30+ decorative SVG icons across sidebars/widgets
- Convert facepile containers from div to semantic ul/li with role="list"
- Add aria-label to icon-only buttons (share, sort controls)
- Add sr-only labels to form inputs (webmention, search)
- Add aria-live="polite" to dynamically loaded webmentions
- Add aria-label with relative+absolute date to time-difference component
- Add keyboard handlers (Enter/Space) to custom interactive elements
- Add aria-label to nav landmarks (table of contents)
- Fix modal focus trap and dialog accessibility
- Fix lightbox keyboard navigation and screen reader announcements

Confab-Link: http://localhost:8080/sessions/edb1b7b0-da66-4486-bd9c-d1cfa7553b88
2026-03-07 18:58:08 +01:00
Ricardo
db75bd05ea fix: give each post type a unique domain color
Articles, notes, and bookmarks were all sharing amber, which
defeats the purpose of per-type color identity.

New complete color map (7 unique colors):
- Articles: indigo (long-form writing)
- Notes: teal (short posts)
- Bookmarks: amber (saved links)
- Likes: red (heart)
- Replies: sky (conversation)
- Reposts: green (sharing)
- Photos: purple (visual)

Updated across collection pages, blog.njk mixed view,
recent-posts widget (now shows type-specific icons and colors
for all 7 types), and design system documentation.

Confab-Link: http://localhost:8080/sessions/0ec83454-d346-4329-8aaf-6b12139bf596
2026-03-07 18:03:06 +01:00
Ricardo
7d8b039ba7 fix: harmonize domain colors across all collection templates
Each post type now has a unique, consistent color applied across
sparkline, card border, icon, label, hover state, and permalink:
- Articles/Notes/Bookmarks: amber
- Likes: red (was rose)
- Replies: sky (was rose)
- Reposts: green (was rose)
- Photos: purple

Replaces generic accent/rose colors with type-specific colors in
blog.njk mixed-type view and all individual collection pages.

Confab-Link: http://localhost:8080/sessions/0ec83454-d346-4329-8aaf-6b12139bf596
2026-03-07 17:48:49 +01:00
Ricardo
333d972e40 fix: align sparkline colors with per-type domain colors
Match sparkline wrapper colors to the post type icon colors used in the
recent posts widget: replies=sky, reposts=green, likes=red, photos=purple.
Articles, notes, bookmarks, and blog keep amber (writing domain).

Confab-Link: http://localhost:8080/sessions/0ec83454-d346-4329-8aaf-6b12139bf596
2026-03-07 17:40:36 +01:00
svemagie
091d54b509 fix: ignore theme/ directory in Eleventy to prevent duplicate permalink conflicts
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-07 17:33:16 +01:00
svemagie
54bdf7f0b5 fix: replace remaining date.toISOString() calls in JSON-LD with isoDate filter
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-07 17:31:40 +01:00
svemagie
7409ebd846 fix: guard date in post.njk against null and use isoDate filter
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-07 17:29:13 +01:00
Ricardo
95a532b8c1 fix: add explicit width/height attributes to sparkline SVG
SVGs with only a viewBox and no width/height attributes use intrinsic
sizing that can override CSS width:100%. Adding width="100%" height="100%"
and preserveAspectRatio="none" on the SVG element itself ensures the
sparkline fills its container div.

Confab-Link: http://localhost:8080/sessions/0ec83454-d346-4329-8aaf-6b12139bf596
2026-03-07 17:28:29 +01:00
svemagie
d2efa1c1d1 fix: escape Nunjucks tags in architecture.html to prevent parse errors
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-07 17:27:39 +01:00
Ricardo
9a9cd2d251 perf: enable lite-yt-embed, optimize avatar, add cache headers
- YouTube embeds now use lite-youtube facade (loads iframe on click,
  ~800 KiB savings per page with embedded videos)
- Avatar resized from 1000x1000 to 400x400 (152 KiB → 39 KiB)
- lite-yt-embed.css max-width changed to 100% for responsive layout
- Removed unused Tailwind primary color palette from CSS bundle

Confab-Link: http://localhost:8080/sessions/edb1b7b0-da66-4486-bd9c-d1cfa7553b88
2026-03-07 17:26:40 +01:00
svemagie
57fdcf26ad cleanup 2026-03-07 17:25:28 +01:00
svemagie
8cc0042d0e security: replace hardcoded admin password with env var INDIEKIT_PASSWORD
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-07 17:23:20 +01:00
Ricardo
0da3780c77 fix: sparkline sizing — use div wrapper instead of span in flex context
The sparkline SVG containers were using <span> elements as flex items.
While a span's outer display is blockified in flex context, its inner
display remains inline, causing SVG width:100% to resolve against the
inline content width (~22px) instead of the flex-allocated width (~670px).
Switching to <div> provides block inner display, allowing the SVG to
fill the available space correctly.

Confab-Link: http://localhost:8080/sessions/0ec83454-d346-4329-8aaf-6b12139bf596
2026-03-07 17:05:52 +01:00
Ricardo
15b88b7087 feat: add skeleton loader to prevent FOUC during CSS load
Replace unstyled content flash with pulsing gray placeholder shapes
while the deferred Tailwind stylesheet loads. Uses a 'loading' class
on <html> that critical CSS uses to show skeleton / hide content,
removed by the stylesheet's onload handler.

Includes noscript fallback to bypass skeleton when JS is disabled.

Confab-Link: http://localhost:8080/sessions/edb1b7b0-da66-4486-bd9c-d1cfa7553b88
2026-03-07 16:56:59 +01:00