Commit Graph

35 Commits

Author SHA1 Message Date
Ricardo
155816a0bc feat: replace all primary (blue) with contextual colors across entire theme
Eliminate monotonous blue by replacing ~290 primary- references in 60 files
with semantically appropriate colors:

- accent (teal): links, CTAs, buttons, tabs, focus rings, spinners
- purple: Funkwhale/music, photos, Mastodon/fediverse
- surface (neutral): GitHub, dates/metadata, info boxes
- amber: bookmarks, blogroll categories
- red: likes
- green: reposts
- sky: replies
- orange: RSS/feeds, podcasts
- #0085ff: Bluesky brand
- #a730b8: Mastodon brand

Also updates prose link colors in tailwind.config.js, pagefind UI
primary color to teal, and client-side JS color references.

Confab-Link: http://localhost:8080/sessions/bd3f7012-c703-47e9-bfe2-2ad04ce1842d
2026-03-04 12:50:19 +01:00
Ricardo
2ca3e047a4 feat: UI overhaul — accent color, Inter font, widget icons, diversified colors
- Add teal accent color scale and activate Inter font via @font-face
- Neutralize nav/footer hovers from primary blue to surface neutrals
- Apply accent color to hero subtitle, FAB, CTA buttons, card hovers
- Fix reply post-type color from generic primary to distinctive sky blue
- Create centralized icon macro (icon.njk) with 24 reusable SVG icons
- Add per-widget-type icons and colored left-accent borders to all sidebars
- Update .p-category tags from blue to neutral surface with border
- Diversify color vocabulary: red (likes), amber (bookmarks/blogroll),
  green (reposts), purple (funkwhale), sky (replies), orange (subscribe)

Confab-Link: http://localhost:8080/sessions/bd3f7012-c703-47e9-bfe2-2ad04ce1842d
2026-03-04 11:21:39 +01:00
Ricardo
760058d0e4 feat: multi-domain fediverse support and share-to-mastodon upgrade
- Replace single localStorage string with versioned multi-domain store
  (fediverse_domains_v1) with usage tracking, inspired by Mastodon's
  share.joinmastodon.org project
- Add domain validation via URL constructor before redirecting
- Add mode param to fediverseInteract component: "interact" for
  authorize_interaction, "share" for /share?text=...
- Migrate old fediverse_instance key automatically on first load
- Extract shared modal partial (fediverse-modal.njk) used by post
  interaction, follow widget, and share widget
- Share widget now prompts visitors for their own instance instead of
  hardcoding site owner's Mastodon instance

Confab-Link: http://localhost:8080/sessions/0ec83454-d346-4329-8aaf-6b12139bf596
2026-03-03 11:09:29 +01:00
Ricardo
b8c76e8f22 fix: recent-posts widget fallback to collections.recentPosts
The widget used bare 'recentPosts' variable which doesn't exist in
the homepage context (it's a collection). Add fallback to
collections.recentPosts so the widget works on all pages.
2026-02-24 16:23:42 +01:00
Ricardo
2c172566c8 feat: add fediverse follow me sidebar widget
Reuses the existing fediverseInteract Alpine.js component to let
visitors follow the site author from their own fediverse instance.
Registered in all three sidebar routers (homepage, blog listing,
blog post) as widget type "fediverse-follow".
2026-02-23 16:50:27 +01:00
Ricardo
e1f4b2cd90 feat: eliminate URL dualism — computed permalinks, conversations support
- Add computed permalink in data cascade for existing posts without
  frontmatter permalink (converts file path to Indiekit URL)
- Fix ogSlug filter and computed data for new 5-segment URL structure
- Add conversations API as build-time data source
- Merge conversations + webmentions in webmentionsForUrl filter with
  deduplication and legacy /content/ URL alias computation
- Sidebar widget fetches from both webmention-io and conversations APIs
- Update webmention-debug page with conversationMentions parameter
2026-02-23 09:38:30 +01:00
Ricardo
1bf6f9358a feat: wrap all widgets and comments in is-land on:visible
Add <is-land on:visible> lazy-loading wrapper to every widget template
and the comments section for consistent deferred rendering. Widgets
that already had it (social-activity, github-repos, blogroll, feedland,
webmentions) are unchanged. Also wraps inline search and custom-html
widgets in all sidebar container files.
2026-02-22 00:31:01 +01:00
Ricardo
74933687c1 feat: unify listening widget with Funkwhale + Last.fm sources
Show 2 recent tracks from each source (4 total) instead of only
Funkwhale. Removed stats section — users can visit /listening/ for
full statistics. Now Playing indicator works from either source.
2026-02-22 00:13:41 +01:00
Ricardo
adccb1602b fix: improve widget card styling and fix recent-comments widget
Widget cards now have white bg, border, and shadow in light mode for
clear visual separation. Each widget has bottom margin for spacing.

Recent-comments widget updated to use standard .widget/.widget-title
classes instead of custom sidebar-widget class.
2026-02-21 23:49:59 +01:00
rmdes
fa7bfb26ea feat: add comment system components and recent comments widget
- Comment area on post pages (IndieAuth sign-in, submit, display)
- Alpine.js client-side component for auth flow and comment CRUD
- Recent comments sidebar widget with build-time data fetching
- Include comments.js in base layout, comments.njk before webmentions

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 21:56:15 +01:00
Ricardo
daf813e192 fix: wrap webmentions widget in is-land for lazy loading
The webmentions sidebar widget uses Alpine.js + fetch API but was
missing the is-land on:visible wrapper that all other JS-dependent
sidebar widgets have. This defers its initialization until scrolled
into view, consistent with social-activity, github-repos, funkwhale,
blogroll, and feedland widgets.
2026-02-18 12:20:38 +01:00
Ricardo
c3eb04570c feat: add zachleat.com-inspired theme enhancements
- Add time-difference web component for relative dates
- Add @zachleat/table-saw for responsive tables
- Add webmention facepile styling with bookmarks support
- Add OG image thumbnails to post navigation
- Add @11ty/is-land for lazy widget hydration
- Wrap sidebar widgets in is-land for deferred loading
- Lazy-load webmention avatars with is-land
- Add @zachleat/filter-container for blog archive filtering
- Add posting frequency sparkline to blog header
- Inline critical CSS and defer full stylesheet loading
2026-02-18 11:16:33 +01:00
Ricardo
ed24ac47bd feat: add 3-dot menu to feedland widget
Links to blogroll page, OPML export, and FeedLand source.
Matches Dave Winer's blogroll.js menu pattern.
2026-02-17 18:35:01 +01:00
Ricardo
69e0032891 feat: use lastItemAt for feed freshness in feedland widget
Shows when a feed last published new content instead of when it was
last checked. Falls back to lastFetchAt for blogs not yet re-synced.
2026-02-17 17:43:53 +01:00
Ricardo
9963578bab refactor: rewrite feedland widget with pure divs, no table element
Eliminates persistent horizontal scrollbar caused by <table> layout.
Uses flexbox divs exclusively for predictable overflow behavior.
2026-02-17 17:18:06 +01:00
Ricardo
5a3fb29d85 fix: eliminate horizontal scrollbar in feedland widget 2026-02-17 17:08:20 +01:00
Ricardo
8aeef55ed0 fix: ensure feed timestamp stays visible after title in feedland widget 2026-02-17 16:59:25 +01:00
Ricardo
1865ff130d fix: move feed timestamp to right of title in feedland widget 2026-02-17 16:54:00 +01:00
Ricardo
c2a6d9b280 fix: use flexbox for feed title row to keep 'when' timestamp visible 2026-02-17 16:41:38 +01:00
Ricardo
a25cc140ee fix: restore 'when' timestamp visibility in FeedLand widget 2026-02-17 16:24:31 +01:00
Ricardo
3da40ce3b0 fix: remove horizontal scrollbar from FeedLand widget 2026-02-17 16:09:36 +01:00
Ricardo
4662f2e911 fix: make FeedLand widget responsive to fill sidebar width 2026-02-17 16:03:32 +01:00
Ricardo
fec999793d fix: FeedLand widget click-to-expand and dark mode for expanded items
Add row selection and expand/collapse behavior matching Dave Winer's
blogroll.js: first click selects, second click (or caret click) expands
to show up to 5 recent items fetched from blogroll API. Items cached
after first fetch. Added dark mode styles for expanded items.
2026-02-17 15:54:31 +01:00
Ricardo
690a10ecf8 feat: add FeedLand sidebar widget
Replicates Dave Winer's blogroll.js visual rendering (240px bordered
container, Ubuntu/Rancho fonts, Title/When sort, caret wedges, truncated
titles, relative timestamps, "Powered by FeedLand" footer) using Alpine.js
and the blogroll API instead of jQuery + external scripts.

Registered in all three sidebar types (homepage, blog listing, blog post)
and in the fallback sidebar.
2026-02-17 15:26:26 +01:00
Ricardo
e2d35b541e feat: add source tabs and recent sort to blogroll widget
Sidebar widget now fetches blogs sorted by recently updated and groups
them into tabs by source type (Microsub/FeedLand). Tabs only appear
when multiple source types exist. Each tab shows up to 8 blogs.
2026-02-17 14:20:19 +01:00
Ricardo
60b59949ef feat: site-wide webmentions widget with inbound/outbound tabs
Replaces the per-post webmentions sidebar widget (which was redundant
with the main content webmentions section) with a site-wide widget
showing recent inbound webmentions (via API) and outbound interactions
(from Eleventy collections). Available in all sidebars.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 09:51:18 +01:00
Ricardo
a4c121d203 fix: make post-navigation and webmentions sidebar widgets functional
Post navigation now uses previousInCollection/nextInCollection filters
to find adjacent posts (avoids Nunjucks loop scoping bug). Webmentions
sidebar widget now uses webmentionsForUrl and webmentionsByType filters
instead of non-existent filter function.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 08:53:35 +01:00
Ricardo
cf3586eadd feat: data-driven blog sidebars and fix recentPosts glob
Fix recentPosts collection glob (content/posts/ → content/) so the
widget actually finds posts. Extract blog-sidebar widgets into reusable
partials. Make both sidebar.njk (listing pages) and blog-sidebar.njk
(post pages) configurable via homepageConfig.blogListingSidebar and
homepageConfig.blogPostSidebar, with fallback to current hardcoded
widgets for backward compatibility.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 00:13:25 +01:00
Ricardo
7d1cd64af9 fix: increase GitHub widget content height to 420px
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 20:10:06 +01:00
Ricardo
ce21729408 fix: use fixed height instead of min-height for GitHub widget tabs
Prevents all layout shift by locking the content area to h-[340px]
with overflow-y-auto for scrolling if content exceeds the area.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 19:29:17 +01:00
Ricardo
eedcee70cb fix: stable height GitHub widget and consistent tab sizing
- Add min-h-[320px] to prevent layout shift when switching tabs
- Show 5 items per tab for consistent content height
- Simplify tab buttons to text-only at text-xs for compact layout

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 17:58:38 +01:00
Ricardo
6b7bc3644d fix: reorder GitHub widget tabs and add Repos tab
Tab order: Commits (default), Repos, Featured, PRs.
Repos tab fetches full repo list from GitHub public API.
Featured tab shows curated projects from /githubapi.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 17:51:02 +01:00
Ricardo
06d0c93804 feat: replace static GitHub widget with dynamic tabbed widget
Uses Alpine.js client-side fetching from /githubapi/api/* for live data.
Three tabs: Projects (featured repos), Commits (recent activity), PRs.
Follows the blogroll widget pattern for dynamic data loading.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 17:42:40 +01:00
Ricardo
0c79da8d95 feat: type-aware rendering for recent posts section and sidebar widget
Port the blog page's rich post-type rendering into both the homepage
recent-posts section and the sidebar widget. Likes, bookmarks, reposts,
replies, and photos now show colored icons, target URLs, and content
previews instead of generic "Untitled" cards.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 09:21:38 +01:00
rmdes
32aea5ace9 feat: neutralize theme for fresh deployments
Strip personal data from templates so the theme ships clean for any
deployer. Collection pages now use generatePageOnEmptyData so empty
post types show encouraging placeholders instead of 404s. Navigation
is conditional on enabled post types and installed plugins. Sidebar
widgets split into individual components with plugin-aware visibility.
Slashes page explains required plugins for root-level page creation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 15:16:29 +01:00