A modern blog aggregation website built with Vue 3, TypeScript, and Tailwind CSS using Static Site Generation (SSG). This application aggregates blog posts from multiple platforms under the Wheeler Universe brand with optimized SEO and social media sharing capabilities.
- Static Site Generation - Pre-rendered pages for optimal performance and SEO
- Content-Aware URLs - Semantic
/read/
and/watch/
URLs based on content type - Dynamic Meta Tags - Blog-specific SEO meta tags for social media sharing
- Single View Listing - Main page displays all blog entries in one place
- JSON-Driven Content - Blog data loaded from static JSON configuration
- Elegant Redirects - Beautiful redirect pages with countdown and manual options
- Video Content Support - Special handling for video content with
/watch/
URLs - Advanced Filtering - Filter by date range, source platform, and collaboration status
- Real-time Search - Search functionality by blog title
- Dark/Light Mode - Theme toggle with user preference persistence
- Responsive Design - Mobile-first approach with smooth animations
- TypeScript - Full type safety throughout the application
- Modern Stack - Vue 3 Composition API, Vite SSG, Tailwind CSS
- Frontend Framework: Vue 3 with Composition API
- Static Site Generation: Vite SSG (vite-ssg)
- Meta Tags: @unhead/vue for SEO optimization
- Language: TypeScript
- Styling: Tailwind CSS
- Build Tool: Vite
- Routing: Vue Router
- Testing: Vitest + Vue Test Utils
- Code Quality: ESLint + Prettier
- Icons: Heroicons
- Deployment: Netlify with automatic deployments
src/
βββ components/ # Reusable Vue components
β βββ AppHeader.vue # Site header with navigation
β βββ AppFooter.vue # Site footer with stats
β βββ BlogCard.vue # Individual blog entry display
β βββ BlogList.vue # Blog listing container
β βββ SearchBar.vue # Search functionality
β βββ FilterPanel.vue # Date and source filtering
β βββ ThemeToggle.vue # Dark/light mode switcher
βββ composables/ # Vue composition utilities
β βββ useBlogData.ts # Blog data management
β βββ useMetaTags.ts # SEO meta tag management
β βββ useTheme.ts # Theme state management
βββ router/ # Vue Router configuration
βββ types/ # TypeScript type definitions
βββ views/ # Page components
β βββ HomeView.vue # Main blog listing page
β βββ BlogRedirectView.vue # Blog redirect with SEO meta tags
β βββ NotFoundView.vue # 404 error page
βββ tests/ # Test files
β βββ AllComponents.test.ts # Integration tests
β βββ components/ # Component-specific tests
βββ utils/ # Utility functions
βββ style.css # Global styles and Tailwind imports
βββ main.ts # ViteSSG application entry point
- Node.js 18+ and npm (or yarn/pnpm)
- Install dependencies:
npm install
- Start the development server:
npm run dev
- Open http://localhost:3000 in your browser
The application uses Static Site Generation (SSG) to pre-render all pages:
npm run build
This generates:
- Static HTML files with blog-specific meta tags
- Optimized assets and CSS
- Content-aware routes (
/read/
and/watch/
) - Netlify redirect configuration
npm run dev # Start development server
npm run build # Build for production with SSG
npm run build:clean # Full clean build with linting and tests
npm run preview # Preview production build
npm run test # Run test suite
npm run lint # Run ESLint
npm run prettier:write # Format code
Blog posts are configured in public/blog-config.json
:
{
"features": [
{
"enabled": true,
"name": "dark-mode"
}
],
"data": [
{
"collab": false,
"date": "2024-05-09",
"name": "Blog Post Title",
"slug": "blog-post-slug",
"source": "https://example.com/blog-post",
"sourceDisplayName": "Example Site",
"video": false,
"github": "https://github.com/user/repo"
}
]
}
- Add a new entry to the
data
array inpublic/blog-config.json
- Include all required fields:
date
,name
,slug
,source
- Optional fields:
collab
- Mark as collaborative post (shows collaboration badge)video
- Mark as video content (uses/watch/
URL and shows video badge)sourceDisplayName
- Custom display name for the sourcegithub
- Associated GitHub repository URL
- The build process automatically generates routes and meta tags
- URLs will be content-aware:
/read/slug
for articles,/watch/slug
for videos
Enable/disable features in the features
array:
dark-mode
- Dark/light theme togglegoogle-analytics
- Google Analytics integrationfull-text-search
- Full-text search (future feature)
The Wheeler Universe branding can be customized in:
tailwind.config.js
- Color scheme and design tokenssrc/components/AppHeader.vue
- Logo and site titlesrc/style.css
- Global styles and custom CSS
Customize the color palette in tailwind.config.js
:
colors: {
'wheeler-blue': {
// Custom blue color scale
},
'wheeler-gray': {
// Custom gray color scale
}
}
- Linting:
npm run lint
- Formatting:
npm run prettier:write
- Testing:
npm run test
- Full Pipeline:
npm run build:clean
TypeScript compilation: npm run build
(includes type checking)
The application automatically generates:
- Blog-specific meta tags for each post
- Open Graph tags for social media sharing
- Twitter Card optimization
- Content-aware canonical URLs
- Dynamic page titles and descriptions
- Home:
/
- Main blog listing - Articles:
/read/{slug}
- Reading content with redirect page - Videos:
/watch/{slug}
- Video content with redirect page - Static Generation: All routes pre-rendered at build time
The application is built mobile-first with responsive breakpoints:
- Mobile: 320px+
- Tablet: 768px+
- Desktop: 1024px+
- WCAG 2.1 AA compliant
- Keyboard navigation support
- Screen reader friendly
- High contrast dark mode
- Focus management
The application uses Static Site Generation and can be deployed to any static hosting service:
- Automatic deployments on Git push
- Pre-configured build settings
- Built-in SPA routing support
- Custom domain and HTTPS
- Branch previews
- Vercel - Connect your Git repository with auto-deploy
- GitHub Pages - Upload
dist
folder from build process - AWS S3 + CloudFront - Static website hosting with CDN
- Any Static Host - Upload the generated
dist
folder
The SSG build automatically:
- Generates static HTML files for all blog routes
- Injects blog-specific meta tags for SEO
- Creates content-aware URLs (
/read/
and/watch/
) - Optimizes assets and generates sourcemaps
- Creates Netlify
_redirects
file for SPA routing
This project is licensed under the MIT License.
- Fork the repository
- Create a feature branch
- Make your changes
- Run linting and type checking
- Submit a pull request
For questions or support, please open an issue in the GitHub repository.