A modern, performant portfolio website built with Vite, TypeScript, and Lit Element web components. Features a custom static site generator with advanced templating, blog management, and sophisticated CSS architecture.
- Modern Web Components: Built with Lit Element for encapsulated, reusable components
- Custom Static Site Generator: KBR Builder - a comprehensive Vite plugin for HTML templating and Markdown processing
- Advanced CSS Architecture: Hybrid approach combining global styles, Shadow DOM, and shared style modules
- Blog System: Full-featured blog with Markdown support, frontmatter metadata, and tag filtering
- Performance Optimized: Vite-powered development with optimized production builds
- Accessibility First: WCAG compliant with proper focus management and semantic HTML
- SEO Ready: Automated meta tag generation, sitemap support, and structured data
- Prose Linting: Automated content quality checks with Vale using Google's style guide
This project uses Vale for linting prose in Markdown blog post content. Vale helps maintain consistent, clear, and accessible writing following the Google Developer Documentation Style Guide.
Vale only runs on Markdown files in:
source/site/content/*.mdsource/site/content/__drafts/*.md
- Main config:
.vale.ini - Style guide: Google Developer Documentation Style Guide (automatically downloaded)
- Styles directory:
.vale/styles/(ignored by git)
# Lint all Markdown blog content
npm run lint:prose
# Lint only changed files (useful during development)
npm run lint:prose:changed
# Lint only Markdown drafts
npm run lint:prose:drafts
# Verbose output with debugging info
npm run lint:prose:verboseThe linting system is powered by a TypeScript script (scripts/lint-prose.ts) that provides intelligent file discovery and flexible linting options:
- Smart file discovery: Automatically finds relevant Markdown files
- Git integration: Can lint only changed, staged, or specific file sets
- Flexible scoping: Target all content, drafts only, or specific patterns
- Enhanced reporting: Colorized output with progress indicators
- CLI flexibility: Mix and match options (e.g.,
--drafts-only --verbose)
The configuration uses:
- Google style guide: Primary rules for technical writing
- Vale built-in rules: Basic grammar and spelling
- Custom settings: Relaxed rules for blog content vs. technical docs
- First-person pronouns: Allowed in drafts, warnings in published posts
- Contractions: Suggestions only
- Exclamation points: Allowed in drafts
- Parentheses: Suggestions only
Common technical terms are automatically accepted. To add more terms:
- Edit
.vale.inito add vocabulary support - Create vocabulary files in
.vale/config/vocabularies/Blog/ - Add terms to
accept.txtorreject.txt
Vale CLI must be installed and available in $PATH. Install with:
# macOS
brew install vale
# Linux
curl -sfL https://install.goreleaser.com/github.com/ValeLint/vale.sh | sh
# Or download from https://github.com/errata-ai/vale/releases- "Vale not found": Make sure Vale CLI is installed and in PATH
- "Styles not found": Run
vale syncto download style guides - "Too many errors": Check
.vale.inifor rule customizations
For real-time linting in your editor:
- VS Code: Install the Vale extension
- Vim: Use ALE with Vale
- Emacs: Use flycheck with Vale
- Node.js 18+
- npm or yarn
# Clone the repository
git clone https://github.com/KyleBlankRollins/Web-Portfolio.git
cd Web-Portfolio
# Install dependencies
npm install
# Start development server
npm run devVisit http://localhost:3000 to see the site in action.
# Build static files
npm run build
# Preview production build locally
npm run previewWeb-Portfolio/
โโโ README.md # This file - project overview
โโโ package.json # Dependencies and scripts
โโโ vite.config.ts # Vite configuration with custom plugin
โโโ tsconfig.json # TypeScript configuration
โโโ netlify.toml # Deployment configuration
โโโ todos.md # Project todo list and feature tracking
โโโ .vale.ini # Vale prose linting configuration
โโโ .vale/ # Vale linting setup (styles ignored by git)
โโโ scripts/ # Development and build scripts
โโโ public/ # Static assets served directly
โ โโโ styles/ # Global CSS files (style.css, theme.css, etc.)
โ โโโ fonts/ # Web font assets
โ โโโ data/ # Generated data files (blog-manifest.json)
โ โโโ assets/ # Static assets and images
โ โโโ samples/ # Portfolio samples and documents
โโโ source/
โ โโโ builder/ # Custom Vite plugin - KBR Builder
โ โ โโโ README.md # ๐ Build system documentation
โ โโโ site/ # Site source code
โ โโโ README.md # ๐ Content creation guide
โ โโโ main.ts # Application entry point
โ โโโ index.html # Main page template
โ โโโ pages/ # HTML pages (About, Portfolio, etc.)
โ โโโ content/ # Blog posts (Markdown)
โ โ โโโ __drafts/ # Draft blog posts
โ โโโ templates/ # HTML templates
โ โโโ components/ # Lit Element web components
โ โโโ styles/ # CSS architecture
โ โโโ README.md # ๐จ CSS architecture documentation
โโโ dist/ # Built site output (generated)
This project includes comprehensive documentation for different aspects of development:
๐จ CSS Architecture
Learn about the hybrid CSS architecture, shared style modules, Shadow DOM patterns, and design token system.
Key Topics:
- Lit Element Shadow DOM styling strategies
- Shared style modules and component organization
- Design token philosophy (no fallback values)
- Performance optimization patterns
๐ง Build System
Deep dive into the KBR Builder - the custom Vite plugin that powers the site's static generation, templating, and development experience.
Key Topics:
- HTML templating engine with variable substitution
- Markdown processing and blog manifest generation
- Development server enhancements and live reloading
- Production build optimization and asset injection
๐ Content Creation
User-friendly guide for creating and editing site content, including HTML pages and blog posts.
Key Topics:
- Creating HTML pages with metadata and templates
- Writing blog posts in Markdown with frontmatter
- Using web components in content
- SEO best practices and troubleshooting
- Navigation (
kbr-navigation) - Site navigation with active state management - Table of Contents (
kbr-table-of-contents) - Auto-generated TOC with scroll indicators - Tag Filter (
kbr-tag-filter) - Interactive blog post filtering with animations - Timeline (
kbr-timeline) - Career timeline with expandable entries - Post List (
kbr-post-list) - Blog post listing with search and filtering - Anchor Copy (
kbr-anchor-copy) - Automatic anchor links for headings
- Template Processor - HTML templating with variable substitution and includes
- Markdown Processor - Convert Markdown to HTML with frontmatter parsing
- Dev Server Middleware - Live processing and hot reloading during development
- HTML Bundle Processor - Production build optimization and asset injection
- Progressive Enhancement: Core functionality works without JavaScript
- Web Components: Standards-based component architecture
- CSS Custom Properties: Design token system for consistent theming
- Semantic HTML: Proper document structure and accessibility
- Vite Development: Lightning-fast development experience
- Static Generation: Pre-rendered HTML for optimal loading
- Component Bundling: Efficient CSS and JS delivery
- Asset Optimization: Automatic compression and caching headers
- TypeScript: Full type safety across the codebase
- Hot Module Replacement: Instant updates during development
- Comprehensive Documentation: Clear guides for all aspects of development
- Modular Architecture: Clean separation of concerns
The site is configured for deployment on Netlify with optimized build settings:
# netlify.toml
[build]
command = "npm run build"
publish = "dist"- Image optimization pipeline
- Progressive Web App features
- Comment system for blog posts
This is a personal portfolio project, but feedback and suggestions are welcome! Please check the documentation files for technical details before proposing changes.
- Read the relevant documentation (CSS, Build System, or Content)
- Create a feature branch
- Make your changes following existing patterns
- For blog content: Prose linting runs automatically on commit, or use
npm run lint:prose - Test thoroughly in development mode
- Submit a pull request with clear description
This project is licensed under the MIT License - see the LICENSE file for details.
Built by Kyle Blank Rollins as a showcase of modern web development techniques, performance optimization, and thoughtful user experience design. The site serves as both a portfolio and a demonstration of technical writing and development capabilities.
Key Technologies: Vite, TypeScript, Lit Element, CSS Custom Properties, Markdown, Netlify
Architecture Highlights: Custom static site generator, hybrid CSS architecture, comprehensive component system, performance-first development