Commit Graph

142 Commits

Author SHA1 Message Date
Ricardo
4e2f579e71 feat: add heading anchors for direct linking to article sections
Uses markdown-it-anchor to generate linkable IDs on h2-h4 headings.
Headings become clickable links with a subtle # indicator on hover.
Includes scroll-margin-top so anchored headings don't hide behind
the sticky header.
2026-02-17 19:09:09 +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
29a014506d feat: add "Edit this post" button to FAB menu
When viewing a post that has mpUrl in its frontmatter, the FAB menu
shows an "Edit this post" link at the top that redirects to the
Indiekit admin edit form via /posts/edit?url=<mpUrl>.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 04:11:20 +01:00
Ricardo
c2ebee696d docs: update CLAUDE.md and README.md with comprehensive documentation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 18:24:14 +01:00
Ricardo
dcccf29713 feat: add personal/work project section templates
- cv-projects-personal.njk: filters projects with projectType=personal (or unset)
- cv-projects-work.njk: filters projects with projectType=work
- CV page now only shows work projects
- Homepage section dispatcher routes both new types

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 11:24:34 +01:00
Ricardo
28bc7a6c1b fix: load pagefind at end of body instead of deferred in head
The defer + DOMContentLoaded queue approach failed silently when
pagefind-ui.js couldn't load. Moving the script to end of body
ensures all DOM elements exist and processes the queue immediately
after the script loads.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 11:03:02 +01:00
Ricardo
7cb0203adc fix: load pagefind once in base layout, eliminate duplicate scripts
Pagefind CSS/JS is now loaded once in base.njk <head> with defer.
A tiny initPagefind() helper queues widget inits until DOMContentLoaded
when PagefindUI is available. Removes duplicate <link>/<script> tags
from all sidebar widgets, search page, and 404 page.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 10:50:32 +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
8eb5239906 fix: move post navigation from sidebar to main content area
Post navigation (prev/next) now renders below the syndication block
in the main content flow, matching how listing pages work. Removed
from sidebar widget system.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 09:04:19 +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
a54d094891 feat: add Pagefind search box to 404 page
Helps visitors from old unreirected links find what they're looking for.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 10:14:09 +01:00
Ricardo
a92fa93780 feat: add changelog page and refactor footer to 4-zone grid
- New /changelog/ page with Alpine.js tabbed interface showing commits
  across all indiekit repos, categorized into 7 groups with load-more
- Footer refactored from minimal feed links to responsive 4-zone grid:
  Navigate, Content, Connect (social links), Meta (feeds + changelog)
- Footer uses grid-cols-2 on mobile, grid-cols-4 on desktop

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 09:16:51 +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
ddbc983505 feat: add syntax highlighting for code blocks
Integrates @11ty/eleventy-plugin-syntaxhighlight (PrismJS) for
build-time syntax highlighting of fenced code blocks. Includes
a custom GitHub-inspired theme with dark mode support (.dark class).

All existing articles with triple-backtick code blocks will
automatically get highlighting on next Eleventy rebuild.

Also fixes overflow-x: hidden on .prose/.e-content that was
clipping scrollable code blocks — changed to overflow-x: clip.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 10:21:31 +01:00
Ricardo
2b3e51042c feat: type-aware rendering in blog sidebar
Recent Posts widget and Previous/Next navigation now show colored
icons and descriptive labels for likes, bookmarks, reposts, and
replies instead of "Untitled".

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 09:44:12 +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
Ricardo
37b323842b nav: promote /cv to top-level, remove /now from header
/now is already in the /slashes submenu dropdown, so having it
top-level was redundant. /cv gets promoted to main navbar.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 08:38:29 +01:00
Ricardo
757db6a327 feat: add dedicated /cv page and simplify homepage fallback
Move CV content to a standalone /cv page that reuses the section partials
from the homepage builder. Simplify home.njk from a 3-tier to 2-tier
fallback (plugin config OR recent posts + explore links). Add /cv to
the slash pages navigation dropdown.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 04:10:45 +01:00
Ricardo
c5cd3c2c75 fix: update webmention API URLs for new moderation plugin
Change all webmention fetch URLs from /webmentions-api/api/mentions
to /webmentions/api/mentions to match the new @rmdes/indiekit-endpoint-webmention-io
plugin which replaces both the upstream viewer and the proxy plugin.

Build-time feed now fetches from local Indiekit API instead of
webmention.io directly.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 21:24:28 +01:00
Ricardo
4bb5647b08 feat: blogroll category tabs and upcoming badge
- Default tab is now "All Blogs" (the actual blogroll)
- Categories become individual tabs replacing single "Recent Posts"
- Items lazy-loaded per category with caching
- "Upcoming" badge on future-dated posts
- Removed category dropdown (tabs replace it)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 21:22:31 +01:00
Ricardo
dd454bf4ce feat: render footer as responsive 3-column grid
Wraps footer items in a CSS grid that's 1 column on mobile, 2 on tablet,
3 on desktop. Each custom-html block fills one column.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 17:12:31 +01:00
Ricardo
b8ad6dbb25 style: show experience highlights as tags instead of bullet list
Matches the tag/pill style used by interests and skills sections.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 14:31:23 +01:00
Ricardo
45b42c67fe feat: add date display to CV projects and education templates
Projects now show startDate/endDate range. Education supports both
startDate/endDate (new) and year (backward compat) display.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 12:11:22 +01:00
Ricardo
7004dbc4f1 feat: read CV data from plugin file instead of hardcoded defaults
_data/cv.js now reads from content/.indiekit/cv.json written by the
CV plugin, matching the homepageConfig.js pattern. Falls back to
empty defaults when no plugin is installed.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 10:55:22 +01:00
Ricardo
523f538d1b fix: restore sidebar on blog and post type pages
The homepage builder's sidebar bypass was using homepageConfig (a global
Eleventy data file) to suppress the sidebar on ALL pages, not just the
homepage. Now only bypasses when page.url == "/" so blog, post type, and
plugin pages keep their normal sidebar.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 10:12:46 +01:00
Ricardo
610f81f8fe feat: add footer rendering and custom-html sidebar widget
- Homepage builder now renders footer section below main content
- Sidebar supports custom-html widget type with title + content
- New homepage-footer.njk component for footer items

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 10:10:16 +01:00
Ricardo
2ea75e567d fix: search sidebar widget now renders Pagefind UI
The search widget was only showing a heading with an empty div.
Now loads Pagefind CSS/JS and initializes the search UI.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 19:53:13 +01:00
Ricardo
b4bc2f6f07 feat: wire homepage builder layout system and sidebar control
- base.njk: skip hardcoded sidebar when homepage builder is active
- homepage-builder.njk: implement 3 layouts (single-column, two-column,
  full-width-hero) with CSS grid and sidebar rendering
- homepage-section.njk: section type dispatcher (extracted for reuse)
- homepage-sidebar.njk: maps widget types to existing widget partials

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 19:08:27 +01:00
Ricardo
b8c60b1a81 fix: hide default hero when homepage builder is active (Tier 1)
The hardcoded hero section was always rendering, causing a double hero
when the homepage plugin is configured and has its own hero enabled.
Now only shows for Tier 2 (CV) and Tier 3 (default) fallbacks.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 18:06:07 +01:00
Ricardo
bada61e2e4 fix: resolve homepage.json via content/ symlink instead of absolute path
CONTENT_DIR env var wasn't set on Cloudron, so the data file tried
/data/content/.indiekit/homepage.json which doesn't exist. Now resolves
relative to the Eleventy project dir through the content/ symlink.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 17:10:28 +01:00
Ricardo
d0360dbdf7 feat: add CV section partials for homepage builder
- cv-experience.njk: work history timeline with highlights
- cv-skills.njk: skills grid grouped by category
- cv-education.njk: education cards + language pills
- cv-projects.njk: project cards with status badges and tech tags
- cv-interests.njk: interest tag cloud
- Update homepage-builder.njk to include cv-education and cv-interests

Part of indiekit-endpoint-cv plugin integration (Phase 2).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 16:01:01 +01:00
Ricardo
d9e99fa9cc feat: add homepage builder components for Phase 3
- homepage-builder.njk: master section renderer for configured sections
- sections/hero.njk: hero section with avatar, name, title, bio, social
- sections/recent-posts.njk: configurable recent posts section
- sections/custom-html.njk: freeform HTML content block
- Wire home.njk Tier 1 to include homepage-builder when config exists

Part of indiekit-endpoint-homepage plugin integration.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-08 15:55:08 +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