9.2 KiB
Adritian Hugo Theme - AI Coding Instructions
Project Overview
This is a Hugo theme for personal websites/portfolios, not a standalone site (although a example site is provided, to demonstrate the usage of the theme itself). The theme provides layouts, styling, and functionality that users import via Hugo modules or as a git submodule.
Technology Stack:
- Static Site Generator: Hugo (v0.136+ extended version required)
- CSS Framework: Bootstrap 5 (v5.3.8)
- CSS Preprocessor: SCSS/Sass
- JavaScript Libraries: Fuse.js (search), DOMPurify (XSS protection)
- Testing: Playwright (E2E tests)
- Package Manager: npm
- Templating: Hugo Templates (Go templates)
- Build Tools: Hugo's built-in asset pipeline, PostCSS, Autoprefixer
Project Architecture
This is a Hugo theme for personal websites/portfolios, not a standalone site. The theme provides layouts, styling, and functionality that users import via Hugo modules or as a git submodule.
The theme provides a example site (exampleSite/) that demonstrates all features and serves as a starting point for users. It is also used for the integration tests.
Key Structure:
layouts/- Hugo templates (partials, shortcodes, content types)assets/scss/- Bootstrap 5-based styling with theme customizationsexampleSite/- Demo content that gets distributed to users viaadritian-theme-helperand serves as a github template repositoryarchetypes/- Content templates for different content typesi18n/- Multilingual translations (en/es/fr)
Content Architecture & Custom Types
The theme implements 5 custom content types with specific frontmatter:
- Experience (
content/experience/) - Job history withjobTitle,company,location,duration - Skills (
content/skills/) - Technical skills with progress bars and categories - Blog (
content/blog/) - Posts with sidebar/default layouts - Client-work (
content/client-work/) - Portfolio pieces - Testimonial (
content/testimonial/) - User testimonials
Critical: Each content type has a corresponding archetype in archetypes/ and layout in layouts/. Always maintain this trio when adding new types.
Development Workflows
Local Development
# Install dependencies
npm install # Installs Bootstrap + theme-helper
# Theme development (testing with exampleSite)
npm run serve
Testing
npm test # Full test suite
npm run test:e2e # Playwright E2E tests
npm run test:e2e:no-menus # Tests without navigation (for menu-less configs)
Test Coverage: E2E tests validate theme switching, language switching, content rendering, search functionality, and HTML validation across all major features.
Performance Optimization
npm run build:performance # Optimized build with critical CSS
node scripts/optimize-performance.js # Performance analysis
Styling System
SCSS Architecture: Modular approach extending Bootstrap 5
assets/scss/adritian.scss- Main entry point importing all partialsassets/scss/_variables.scss- Theme color/sizing variables- Individual component files:
_navbar.scss,_blog.scss,_experience.scss, etc.
Theme Colors: Uses CSS custom properties with $base-color as primary. Dark/light themes switch via CSS variables, not separate stylesheets.
Multilingual (i18n) Implementation
Translation Strategy:
- Static strings:
i18n/*.yamlfiles (navigation, UI elements) - Content: Hugo's file-based translation (
content/en/,content/es/, etc.) - Post-v1.7.0: Prefers shortcode-based content over i18n strings for flexibility
Shortcode System
Primary Content Method: Pages built with shortcodes rather than traditional Hugo sections.
Key shortcodes in layouts/shortcodes/:
experience-section- Displays limited experience list (controlled byhomepageExperienceCount)experience-list- Print-friendly experience listcontact-section- Formspree integrationshowcase-section- Portfolio displayabout-section,text-section- Content blocks
Pattern: Most homepage sections use shortcodes for maximum customization flexibility.
Module Distribution Model
Critical Understanding: This theme is distributed via:
- Hugo Module (recommended) -
hugo mod get github.com/zetxek/adritian-free-hugo-theme - Theme Helper Package -
@zetxek/adritian-theme-helperdownloads demo content - Git Submodule (legacy) - Direct theme inclusion
Bootstrap Process:
hugo mod get -u github.com/zetxek/adritian-free-hugo-theme
hugo mod npm pack
npm install # Installs Bootstrap + theme-helper
./node_modules/@zetxek/adritian-theme-helper/dist/scripts/download-content.js
Configuration Patterns
Hugo Config (hugo.toml):
- Performance optimizations:
[minify],[imaging],[markup]sections - Custom output formats for content types (footer content excluded from HTML generation)
- Module imports section for theme loading
Package.json Scripts:
serve- Development with exampleSitebuild- Production build with minification- Separate test commands for different scenarios
Key Integration Points
Search: Powered by Fuse.js with JSON index generation Contact Forms: Formspree integration via shortcode Analytics: Vercel Analytics support built-in Performance: Critical CSS generation, image optimization, minification
Common Development Pitfalls
- Missing Dependencies: Theme requires Bootstrap via npm - users often miss
npm installstep - Content Structure: Custom content types require specific frontmatter fields - validate against archetypes
- Translation Scope: Post-v1.7.0 prefers shortcode content over i18n strings
- Module vs Submodule: Most issues stem from incorrect installation method
Testing Philosophy
E2E tests validate real user workflows rather than individual components. Tests include theme switching, language switching, navigation, search, and content rendering across different configurations (with/without menus).
When modifying layouts or adding features, ensure corresponding E2E tests exist in tests/e2e/.
Coding Standards and Conventions
HTML/Hugo Templates
- Use semantic HTML5 elements for proper document structure
- Follow Hugo's template naming conventions (lowercase with hyphens)
- Partial templates should be in
layouts/partials/ - Shortcodes should be in
layouts/shortcodes/ - Use Hugo's built-in functions when available (e.g.,
absURL,relURL)
SCSS/CSS
- Follow Bootstrap 5 conventions and utility classes where possible
- Use BEM naming methodology for custom components when needed
- Prefix custom variables with theme-specific identifiers
- Keep files modular - one component per file
- Use CSS custom properties for themeable values
- File naming: lowercase with underscores (e.g.,
_navbar.scss,_blog.scss)
JavaScript
- Use vanilla JavaScript (no jQuery)
- Prefer modern ES6+ syntax
- Keep JavaScript minimal - theme is primarily CSS-driven
- Use DOMPurify for any user-generated content sanitization
- Ensure all JavaScript is progressively enhanced (works without JS when possible)
Content and Configuration
- YAML frontmatter for content files
- TOML for Hugo configuration files
- Follow existing frontmatter patterns for each content type
- Use descriptive, human-readable keys
File Naming Conventions
- Templates: lowercase with hyphens (e.g.,
single.html,list.html) - SCSS files: lowercase with underscores, prefixed with
_for partials - Content files: lowercase with hyphens (e.g.,
my-blog-post.md) - Archetypes: match content type name (e.g.,
blog.md,experience.md)
Web Accessibility Requirements
This theme prioritizes accessibility (WCAG 2.1 AA compliance):
- All interactive elements must be keyboard accessible
- Proper ARIA labels and roles for non-semantic elements
- Color contrast ratios must meet WCAG AA standards (4.5:1 for normal text, 3:1 for large text)
- Images must have descriptive
altattributes - Forms must have associated labels
- Focus indicators must be visible and clear
- Dark/light theme switching must maintain accessibility standards in both modes
- Skip navigation links for keyboard users
- Semantic HTML structure (proper heading hierarchy, landmarks, etc.)
- Test changes with screen readers when modifying navigation or interactive elements
Security Best Practices
- Never commit secrets, API keys, or sensitive data
- Use DOMPurify for sanitizing any user-generated or external content
- Validate and sanitize all user inputs in contact forms
- Follow Hugo's security best practices for template rendering
- Keep dependencies updated to patch security vulnerabilities
- Use Hugo's built-in
safeHTML,safeCSS,safeJSfunctions appropriately
Files and Directories to Ignore
Copilot should ignore or be cautious with:
node_modules/- Third-party dependenciespublic/- Hugo build output (generated files)resources/- Hugo's asset cache.hugo_build.lock- Hugo build lock filepackage-lock.json- npm lock file (only update via npm commands).git/- Version control directoryexampleSite/public/- Example site build outputexampleSite/resources/- Example site cache.DS_Store- macOS system files