Overview
The Blog page displays a grid of blog posts that are dynamically loaded from markdown files. It features a clean listing interface with JavaScript-powered markdown rendering using Showdown.js.Blog posts are stored as markdown files in
/blog/posts/ and dynamically rendered on the page using JavaScript.Page Structure
Header Section
The blog page includes an introductory header with badge, title, and description:Badge
Uppercase “BLOG” label with blue accent styling
Heading
Large responsive heading (3xl on mobile, 4xl on desktop)
Subtitle
Descriptive text explaining the blog’s purpose
Dynamic Post Grid
Blog posts are displayed in a responsive grid that adapts to screen size:Grid Behavior
- Mobile
- Tablet (md)
- Desktop (lg)
- Single column layout
- Full width cards
- Stacked vertically
Post Content Display
A dedicated content area shows the selected blog post:Content Area Features
Content Area Features
- Initial State: Hidden by default (
hiddenclass) - Styling: Dark gray background with rounded corners
- Padding: Generous spacing (
p-6) - Prompt: Guides users to select a post
- Dynamic Content: Populated by JavaScript when post is selected
JavaScript Integration
The blog page uses two JavaScript libraries:External Libraries
Showdown.js
Markdown to HTML converter for rendering blog posts
functions.js
Shared utility functions used across the site
list-posts.js
Blog-specific script for loading and displaying posts
Showdown.js is loaded from CDN to convert markdown files into HTML for display in the browser.
list-posts.js Functionality
The blog post loader script (scripts/list-posts.js) provides dynamic loading and rendering:
fetchPostList() Function
fetchPostList() Function
Fetches and displays the list of blog posts:Key Features:
- Fetches
posts.jsonindex file - Creates dynamic card elements for each post
- Cycles through 10 Font Awesome icons for visual variety
- Adds click handlers to load full post content
- Error handling with user-friendly messages
loadPostContent() Function
loadPostContent() Function
Loads and renders individual blog post markdown:Key Features:
- Fetches raw markdown file
- Converts markdown to HTML using Showdown.js
- Displays in styled content area with prose classes
- Provides “Back to posts” navigation
- Smooth scrolling to content
Icon Rotation System
Icon Rotation System
The script includes 10 Font Awesome icons that rotate for each post:Icons are assigned using modulo:
icons[index % icons.length]Blog Post Structure
Blog posts are stored as markdown files in theblog/posts/ directory:
Example Post File
File Organization
Post List Styling
Custom CSS provides styling for the post list elements:Styling Details
Styling Details
List Items:
- No bullet points (
list-style-type: none) - Dark gray background (
#2d3748) - Rounded corners (8px)
- Smooth hover transition (0.3s)
- Lighter background on hover (
#4a5568)
- No underline
- Blue color (
#63b3ed) - Bold font weight
- White color on hover (
#e2e8f0)
Design Elements
Color Scheme
Backgrounds
- Section:
bg-gray-800 - Post cards:
#2d3748 - Hover state:
#4a5568
Text & Accents
- Headings:
text-white - Subtitle:
text-blue-300 - Links:
#63b3ed - Badge:
text-blue-400
Typography
Responsive Features
Mobile Optimization
- Single column grid for easy scrolling
- Touch-friendly tap targets
- Full-width content area
- Readable text sizing
Desktop Enhancements
- Three-column grid maximizes screen space
- Hover effects on post cards
- Centered content with max-width constraints
- Generous spacing between elements
The layout uses Tailwind’s responsive breakpoints:
md: (768px) and lg: (1024px).Meta Information
Blog-specific meta tags for SEO:Key Features
Dynamic Loading
- Posts loaded from markdown files
- JavaScript-powered rendering
- No page reload needed
- Showdown.js markdown converter
User Experience
- Clean, modern design
- Responsive grid layout
- Hover effects and transitions
- Clear visual hierarchy
Content Management
- Markdown-based posts
- Date-based file naming
- Easy to add new posts
- No database required
Performance
- CDN-hosted libraries
- Lazy content loading
- Optimized images
- Minimal dependencies
Shared Components
The blog page includes:- Fixed navigation header - Same as homepage
- Footer with social links - 16+ social platforms
- Legal links - Terms, Privacy, Cookies, Accessibility
- Font Awesome icons - Version 6.4.0
All pages share the same header and footer components for consistent navigation and branding.

