Alex.



Changelog

156 total commits

My Tinkering Log

I know I should stop "playing" with my site all the time and focus on writing; but I am having so much fun learning and experimenting with Astro. Want to see what I've been messing with on the webbed site, instead of actually writing content? Here's a list of changes I've made to my Astro site:

View all commits on GitHub

2026

b1cb699

feat: add changelog page with GitHub commit history

asce1062 View on GitHub
Commit details
  • Add /changelog page displaying all commits fetched at build time

- Extend src/lib/api/github.ts with changelog functions:
- fetchAllGitHubCommits() with pagination support
- getChangelogEntries(), formatChangelogDate(), renderMarkdownToHtml()
- getRepoSlugFromUrl(), getBaseRepoUrl() helpers
- Features:
- Shows 25 commits initially with "Load more" button
- Year grouping with sticky headers
- Expandable commit details for multi-line messages
- Graceful error handling for API failures
- Uses GITHUB_PAT for higher rate limits (5000/hr vs 60/hr)
- Add changelog link to navigation and colophon page
ca5d9e1

feat: add palette page with design tokens and click-to-copy

asce1062 View on GitHub
Commit details
  • Add /palette page with tabbed Swatches/Ingredients views

- Create design-tokens.ts registry with colorRoles and colorValues
- Implement CSS-only tab switching with accessibility (ARIA roles)
- Add click-to-copy for computed colors and OKLCH values
- Add palette to header navigation between Colophon and Meta
- Update icon font with palette icons
- Link palette from colophon Typography & Design section
2ec25be

feat: add colophon/meta pages, refactor config to grouped exports

asce1062 View on GitHub
Commit details
Add colophon/meta pages:
- /meta: diagnostic, minimal, noindex (build info, package versions, SEO defaults)
- /colophon: narrative credits, philosophy, tech stack with icons

Config architecture improvements:
- Create deps-info.ts (centralized package.json access)
- Create build-info.ts (build timestamp, Node version)
- Create site-utils.ts (helper functions)
- Create index.ts barrel export
- Remove all legacy individual exports from site-config.ts
- Migrate all consumers to grouped exports (SITE, BLOG, SOCIAL, SEO, PWA, etc.)

SEO/meta tag fixes:
- OpenGraphTags: WebPage schema for non-articles, stable WebSite name,
Twitter meta uses name attr, title-case breadcrumbs, add isPartOf
- MetaTags: remove fake Atom feed, inaccurate geo metadata, obsolete tags
- Layout: safe Astro.site fallback, fix duplicate id on main element

Misc:
- Add /humans.txt following humanstxt.org standard
- Add .txt to service worker navigateFallbackDenylist
- Add Colophon and Meta to site navigation

Housekeeping:
- Icon font updates
- Remove trailing design-tokens.mjs and tailwind.config.mjs since tailwindCSS v4 update
7cc0187

feat: enhance project cards, theming, and navigation UX

asce1062 View on GitHub
Commit details
Project Cards:
- Add contributors, issues, and forks counts with icons
- Fetch contributor count via GitHub API
- Conditional color styling (warning for 0, info for >= 1)
- Separate stats row from project name link

Theme System:
- Add URL parameter support (?theme=dark or ?theme=light)
- Add keyboard shortcut (Ctrl/Cmd + Shift + L) for theme toggle
- Export setTheme() for programmatic theme control

Navigation & Footer:
- Replace inline SVG with icon-git-commit in footer
- Add hover pause for blink animation on nav links
7052393

feat: update 0xProto font, sticky TOC, and code block styling

asce1062 View on GitHub
Commit details
  • Update 0xProto font to complete set (Regular, Bold, Italic) with

woff2, otf, ttf formats; remove old NerdFont version
- Remove unused Josefin Sans and Poppins fonts
- Add sticky table of contents that shows on scroll-up only,
with auto-close on link click
- Add scroll-margin-top to headings for proper anchor positioning
- Set heading font weights (h1-h3 bold, h4-h6 semibold)
- Style .btn and .link-action with 0xProto italic
- Italicize footer build info text
- Update rehype-pretty-code config with grid option for full-width
line highlighting
- Fix code block theme switching to use data-theme attribute
- Add border and improved styling to code blocks
- Fix resume page fallback to fit content instead of fixed height
e301759

feat: upgrade to Tailwind CSS v4 with CSS-first configuration

asce1062 View on GitHub
Commit details
BREAKING CHANGE: Tailwind CSS v3 → v4 migration

Core Changes
- Replace @tailwind directives with @import "tailwindcss"
- Migrate to @tailwindcss/postcss plugin
- Convert theme config to CSS-first approach with @theme directive
- Replace custom utilities with @utility directive syntax

Component Refactoring
- Extract CollapsibleNav as reusable component with:
- Height-based animation
- Full keyboard accessibility (Tab, Enter, Space)
- ARIA attributes for screen readers
- Smooth transitions with reduced-motion support

Bug Fixes
- Remove FOUC prevention that caused blank pages in tailwind v4
- Fix Card component flex layout with flex! override
- Fix breadcrumb inline wrapping with inline! override
- Fix nav text color inheritance from parent link
- Remove unused collapsibleNav.ts script

## Config Updates
- Update postcss.config.mjs for @tailwindcss/postcss
- Add autoprefixer and postcss-nesting to knip ignore list
2a498a4

refactor: more theming updates and migrations pre tailwindcss v4 upgrade

asce1062 View on GitHub
Commit details
Finalize the migration to a semantic CSS variable system that eliminates
light/dark theme duplication across the codebase.

Key changes:
- Fix CSS variable references in global.css to use correct theme paths
- Update tailwind.config.mjs to expose design tokens for theme() function
- Refactor entire codebase to use theme aware semantic variables
- Implement transparency support via color-mix() in project and blog cards
- Unify behavior for buttons and action links
114188a

feat: establish retro design token system and theme infrastructure

asce1062 View on GitHub
Commit details
Major overhaul of the color system:
- Support semantic theme colors (brand, neutral, secondary, accent)
- Support backward compatibility with palette/light numbered scales

Design Token Updates:
- Expand design-tokens.mjs with full light/dark theme color scales
- Add documentation with usage patterns and examples
- Include semantic colors (brand-primary, default-font, subtext-color, etc.)
- Maintain backward compatibility with palette/light numbered scales

Theme Configuration:
- Update tailwind.config.mjs to expose new semantic color utilities
- Add theme.css for Tailwind CSS v4 compatibility

Component & Config Updates:
- Fix guestbook textarea placeholder visibility issue
- Update Prettier config htmlWhitespaceSensitivity setting to respect whitespace properly
- "ignore" to "strict" to preserve whitespaces as written
- Refactor components to use new design token references
- Update topography SVG variants for light/dark themes

This commit establishes the foundation for migrating away from legacy palette/light
numbered scales to a more maintainable semantic color system. These changes maintain
backward compatibility while preparing for future migration.

2025

53b52e2

feat: improve PDF resume viewer with browser detection

asce1062 View on GitHub
Commit details
  • Add fallback overlay for browsers without inline PDF support

- Implement navigator.pdfViewerEnabled API for PDF detection
- Add iOS and in-app browser detection
- Show download button and text version link when PDF can't render inline
- Hide text version link when fallback overlay is displayed
- Update CSP headers in netlify.toml to allow PDF iframe loading
- Add 'self' to frame-src directive
- Change frame-ancestors from 'none' to 'self'
- Update X-Frame-Options from DENY to SAMEORIGIN

Fixes issues where:
- Some browsers showed blank iframes
- Some browsers displayed "contact site owner" errors

Browser support:
- Desktop: Shows inline PDF viewer (all modern browsers)
- iOS/Mobile: Shows fallback with download button immediately
- In-app browsers: Shows fallback automatically
- Legacy browsers: Falls back based on mobile detection
ed1da27

feat: add floating search modal with responsive positioning

asce1062 View on GitHub
Commit details
Add a global floating search modal that can be triggered from anywhere on
the site via the search icon or Ctrl+K/Cmd+K keyboard shortcut.

- Create FloatingSearch.astro component with dynamic positioning
- Positions at first HR divider in header
- Width matches body container responsively across all viewports
- Uses separate pagefind instance to avoid conflicts with search page
- Hidden on /search page to prevent duplication

- Extract reusable SearchBox.astro component
- Shared by both search page and floating modal
- Accepts searchId prop for unique pagefind instances

- Add search trigger button to Header
- Positioned below theme switcher toggle
- Only visible when not on search page

- Update search page to use SearchBox component
- Maintains existing functionality with new architecture
- Uses dedicated page-searchbox instance

- Update search.css to support both search contexts
- Styles apply to #pagefind-search and #pagefind-search-floating
- Consistent appearance across page and modal

Technical improvements:
- TypeScript null safety fixes in FloatingSearch
- ResizeObserver for responsive width updates
- Debounced resize handlers for performance
cdfe807

feat: Add resume viewer page and UI enhancements

asce1062 View on GitHub
Commit details
  • Create dedicated Resume page with PDF iframe viewer (/resume)

- Implement reusable iframe theme management system (src/scripts/iframeTheme.ts)
- Enhance header breadcrumb navigation
- Add "/alex/" to path structure (~/ home / alex /)
- Implement grouped hover effect for home/alex links
- Improve UI
- Make BackToTop button position responsive (bottom-4 md:bottom-8)
- Replace footer commit text with Git commit SVG icon
- Remove rounded corners site-wide for sharper design
350cc59

fix: resolve unparsable JSON-LD structured data in search console

asce1062 View on GitHub
Commit details
  • Fix JSON-LD schema parsing errors reported by Google Search Console

- Change from set:text to set:html for JSON-LD script tags to prevent HTML escaping
- Add is:inline directive to all JSON-LD scripts to silence Astro warnings
- Add security documentation explaining safe use of set:html with JSON.stringify()
- JSON.stringify() automatically escapes dangerous characters (< > & " ')
- All data comes from controlled sources (MDX frontmatter, config files)
- No user input from forms or URL parameters
- Disable astro/no-set-html-directive ESLint rule at file level with justification
- Added a helper function formatBreadcrumbName() that:
- Returns "Blog" if the segment is "blog"
- Removes the date prefix matching the pattern YYYY-MM-DD- (e.g., 2025-08-13-)
- Converts remaining hyphens to spaces
The issue was that set:text was HTML-escaping quotes to &quot;, making the
JSON unparsable. Using set:html with JSON.stringify() is safe because:
1. JSON.stringify() escapes all dangerous characters
2. We control all data sources (no user input)
3. Characters like < and > are converted to \u003c and \u003e

Fixes Google Search Console error:
"Parsing error: Missing '}' or object member name"
cbff541

feat: implement collapsible navigation with dynamic row detection

asce1062 View on GitHub
Commit details
  • Add chevron-bar-down icon to icomoon font set

- Create collapsibleNav.ts utility for responsive navigation management
- Dynamically detects first row items based on viewport width
- Automatically shows/hides toggle button when items wrap
- Smooth 180° rotation animation on expand/collapse
- Update Header component with collapsible navigation
- Add nav-toggle button with chevron icon
- Use Tailwind transition-transform for smooth animations
- Center toggle button on all screen sizes
- Maintain min-height to prevent layout shift
- Update navigation layout for better responsive behavior
- Change from center to left alignment on desktop (sm:justify-start)
- Tighten spacing from gap-1 to gap-0.5
- Reduce padding: px-1.5 (mobile), sm:px-1 (desktop)
- Improve horizontal rule visibility
- Change from bg-palette-700 to bg-palette-900
- Add border-0 to prevent border conflicts
43024d0

feat: add multi-path icon support and improve navigation layout

asce1062 View on GitHub
Commit details
  • Switch around header and footer content

- Add support for multi-path icons in navigation (icon-female with 10 paths)
- Update Header layout to wrap from left edge in desktop mode
- Tighten navigation spacing to prevent RSS feed wrapping
- Add 8biticon link to main navigation with proper icon rendering
e87e538

update: packages

asce1062 View on GitHub
Commit details
@astrojs/check ^0.9.4 → ^0.9.5
@astrojs/mdx ^4.37 → ^4.3.8
@astrojs/rss ^4.0.12 → ^4.0.13
astro ^5.14.5 → ^5.15.1
astro-og-canvas ^0.7.0 → ^0.7.2
astro-themes ^0.2.6 → ^0.2.7
@eslint/js ^9.37.0 → ^9.38.0
@types/node ^24.6.2 → ^24.9.1
@typescript-eslint/eslint-plugin ^8.46.1 → ^8.46.2
@typescript-eslint/parser ^8.46.1 → ^8.46.2
astro-og-canvas ^0.7.0 → ^0.7.2
astro-themes ^0.2.6 → ^0.2.7
eslint ^9.37.0 → ^9.38.0
knip ^5.64.1 → ^5.66.2
lint-staged ^16.2.4 → ^16.2.6
netlify-cli ^23.9.1 → ^23.9.5