* refactor(a11y): comprehensive WCAG 2.2 AA accessibility improvements
Add skip-to-content link, landmark regions, ARIA attributes, keyboard
navigation, focus styles, reduced-motion support, and i18n keys across
all layouts, partials, shortcodes, and JS components.
- Add skip nav link in baseof.html and id="content" on all <main> tags
- Fix 404 page lang/dir attributes and add <main> landmark
- Add aria-label to banner close, PDF iframe, search input/results
- Remove aria-hidden from back-to-top button
- Add aria-hidden to decorative external link icon
- Add role="tablist" to tabs, aria-expanded to filetree/dropdowns
- Wrap mermaid diagrams in role="img", asciinema in role="region"
- Change theme toggle <p> items to <button role="menuitem"> with
full keyboard navigation (Arrow/Home/End/Escape)
- Add arrow-key keyboard navigation to tabs component
- Separate sidebar collapsible button from link for independent
keyboard access with aria-expanded sync
- Sync aria-expanded on all dropdown toggles (theme, lang, navbar,
hamburger, page context menu)
- Add aria-live search status announcements
- Add 13 new i18n keys, replace hardcoded aria-label strings
- Add prefers-reduced-motion CSS override and focus-visible base styles
- Add aria-label swap on code copy ("Copied!" feedback for AT)
- Add aria-current to active TOC links
- Wrap filetree in <ul> container for proper list semantics
- Add unique aria-label to blog "Read more" links
- Document accessibility guidelines in AGENTS.md
* feat(a11y): enhance focus styles and accessibility for various components
- Add focus-visible styles to badges, buttons, and links for improved keyboard navigation.
- Update breadcrumb, sidebar, and TOC components to include focus-visible outlines.
- Introduce new classes for focus states in the badge and tabs shortcodes.
- Ensure consistent focus styles across all interactive elements to meet WCAG 2.2 AA standards.
* feat(a11y): implement new focus-visible utilities and enhance accessibility styles
- Introduce new utility classes for focus-visible states to improve keyboard navigation.
- Update various components including badges, buttons, and search inputs to utilize new focus-visible styles.
- Refactor existing focus styles to ensure consistency and compliance with accessibility standards.
- Enhance breadcrumb, sidebar, and TOC components with updated focus-visible classes for better user experience.
* chore: add .gitattributes to collapse generated files in PR diffs
* fix: enhance accessibility and improve documentation
- Added alt attributes to images in multiple language documentation files for better accessibility.
- Updated the navbar title partial to remove unnecessary title attribute.
- Improved search input accessibility by adding autocomplete="off".
- Enhanced search partials in both navbar and sidebar with location context.
- Updated SVG icons in various components to include aria-hidden and focusable attributes for improved accessibility compliance.
* fix: improve giscus theme toggle functionality
- Updated the theme toggle options selector to use a data attribute for better specificity.
- Modified the event listener to use a setTimeout for the theme update, ensuring smoother transitions when the theme switcher is clicked.
* fix: resolve axe-core WCAG AA violations across docs pages
Add aria-labels to Hugo task list checkboxes, fix asciinema player
timer accessible names, make Jupyter output cells keyboard-focusable,
and add missing heading hierarchy in shortcodes docs for fa/ja/zh-cn.
* feat: integrate accessibility testing with Playwright and enhance CI workflow
- Added Playwright configuration for accessibility testing.
- Implemented accessibility tests using axe-core for all English pages.
- Created a GitHub Actions workflow to automate accessibility tests on pull requests.
- Updated package dependencies to include @axe-core/playwright and @playwright/test.
- Enhanced sidebar component with data attributes for improved accessibility styling.
* fix: update base URL and improve accessibility labels across multiple languages
- Changed the base URL in Playwright configuration and CI workflow from localhost:3000 to localhost:1313.
- Added accessibility labels for screen readers in various language files, enhancing user experience for visually impaired users.
- Updated the Asciinema script to dynamically set the playback time label for better accessibility compliance.
* refactor: reorganize accessibility tests and update test directory structure
- Moved accessibility tests from the e2e directory to a new tests directory for better organization.
- Updated the test directory path in Playwright configuration.
- Refactored the accessibility test implementation to improve code clarity and maintainability.
* chore: update .gitignore to include Playwright test output directories
- Added entries for 'playwright-report/' and 'test-results/' to the .gitignore file to prevent cluttering the repository with test artifacts.
* refactor: enhance accessibility and improve focus styles across components
- Removed unused utility for focus visibility in CSS and consolidated focus-visible styles for better maintainability.
- Updated various components to use `role` attributes for improved accessibility, including menu items and buttons.
- Enhanced theme toggle and language switch components with appropriate ARIA roles and attributes for better screen reader support.
- Improved the handling of focus states in the navigation and context menus to ensure a consistent user experience.
* chore: update dependencies and enhance accessibility features
- Updated the 'serve' package version in package.json and package-lock.json for improved performance.
- Removed unused 'xml2js' dependency to streamline the project.
- Enhanced the Playwright configuration to better manage the web server setup for testing.
- Improved accessibility in the language switcher and navigation menu by refining focus management and keyboard interactions.
- Updated the back-to-top button to manage tabindex for better accessibility compliance.
* feat: enhance mobile menu accessibility and keyboard interactions
- Added ARIA attributes to manage visibility of the sidebar on mobile devices.
- Implemented focus management for the sidebar when the menu is toggled.
- Introduced keyboard support to close the menu with the Escape key.
- Improved overall accessibility for the hamburger menu and sidebar interactions.
* fix: refine mobile menu keyboard interaction and enhance navbar accessibility
- Updated the Escape key functionality to close the menu only on mobile devices.
- Added a new ARIA attribute to the hamburger menu button for improved accessibility.
8.4 KiB
AGENTS.md
This file provides guidance to AI coding agents when working with code in this repository.
Project Overview
Hextra is a modern, responsive Hugo theme designed for creating documentation websites, technical blogs, and static sites. Built with Tailwind CSS, it offers features like full-text search, dark mode, multi-language support, and extensive customization options.
Development Commands
Initial Setup
When working in a new worktree or fresh clone without node_modules, run npm install first to install dependencies:
npm install
Development Server
# Start development server with theme reloading (recommended for theme development)
npm run dev:theme
Building
# Build the example site
npm run build
# Build CSS assets only
npm run build:css
Architecture Overview
Hugo Theme Structure
- Base Layout:
layouts/baseof.htmlwraps all pages - Specialized Layouts:
layouts/docs/,layouts/blog/,layouts/hextra-home.html - Partials: Reusable components in
layouts/_partials/- Core UI:
navbar.html,sidebar.html,footer.html,breadcrumb.html,toc.html - Utilities:
layouts/_partials/utils/for helper functions - Custom overrides:
layouts/_partials/custom/for user customizations
- Core UI:
- Shortcodes: Custom Markdown extensions in
layouts/_shortcodes/ - Render Hooks: Custom Markdown rendering in
layouts/_markup/for codeblocks, headings, images, and links
Asset Organization
assets/
├── css/
│ ├── styles.css # Main stylesheet (Tailwind entry point)
│ ├── compiled/main.css # Built CSS output (generated)
│ ├── components/ # Component-specific styles
│ ├── chroma/ # Syntax highlighting themes
│ └── custom.css # User customization entry point
└── js/
├── core/ # Core JS components
└── flexsearch.js # Search functionality
Key Components
- Search: FlexSearch-powered full-text search (
assets/js/flexsearch.js) - Navigation: Responsive navbar and auto-generated sidebar
- Theme Toggle: Dark/light mode switching
- Internationalization: 20+ language support in
i18n/
Content Features
- Shortcodes:
callout,card,cards,tabs,tab,details,steps,filetree,jupyter,badge,icon,pdf,include,asciinema,term - Code Features: Syntax highlighting (Chroma), copy buttons, line numbers via render hooks
- SEO: Open Graph, Twitter Cards, structured data
- Performance: Minimal JavaScript, optimized CSS with Tailwind
Development Workflow
Example Site Development
The docs/ directory serves as both documentation and testing ground:
- Test new features here before releasing
- Configuration examples in
docs/hugo.yamlshowing multi-language setup - Content examples demonstrate all theme capabilities
- Run from docs with:
hugo server --themesDir=../..
CSS Development Workflow
- Source:
assets/css/styles.css(main stylesheet) - Build process: Tailwind CSS → PostCSS →
assets/css/compiled/main.css - Component styles organized in
assets/css/components/ - Chroma syntax highlighting themes in
assets/css/chroma/ - CSS compilation requires Node.js dependencies (PostCSS, Tailwind CSS v4+)
Rebuilding CSS after template changes
Tailwind CSS relies on docs/hugo_stats.json to know which HTML tags, classes, and IDs are actually used in the built site, so it can tree-shake unused styles. When you modify layouts, partials, or shortcodes you must regenerate hugo_stats.json first, then rebuild the CSS:
-
Generate
docs/hugo_stats.json— Run Hugo with thedev.tomlconfig (which setsbuild.buildStats.enable = true):# Using npm (starts a dev server that writes hugo_stats.json on every rebuild): npm run dev:theme # Or a one-shot build using the raw Hugo command: hugo --config=hugo.yaml,../dev.toml --themesDir=../.. --source=docs -
Build the CSS — With an up-to-date
hugo_stats.jsonin place, compile the stylesheet:npm run build:css
Why two steps?
dev.tomlmountsdocs/hugo_stats.jsoninto the Hugo asset pipeline (assets/notwatching/hugo_stats.json) and configures a cache-buster so that changes to the stats file trigger a CSS recompile duringdev:theme. When running outside the dev server you need to perform these steps manually in order.
Customization Points
- Custom partials:
layouts/_partials/custom/ - Custom CSS:
assets/css/custom.css - Site-specific overrides: Copy any layout to your site's
layouts/directory
Configuration & Requirements
Theme Requirements
- Hugo minimum version: 0.146.0 (extended version required - see
theme.toml) - Go 1.20+ (as specified in
go.mod) - Node.js for CSS compilation (PostCSS, Tailwind CSS v4+)
Key Configuration Files
docs/hugo.yaml- Example Hugo configuration with multi-language setuppostcss.config.mjs- PostCSS configuration for CSS processingpackage.json- Node.js dependencies and build scripts
Development Environment
- Default Hugo development server: Port 1313
- Development server runs with
--disableFastRender -Dfor better development experience - Theme development uses
--logLevel=debugfor detailed logging
Multi-language Support
- Configure languages in
hugo.yaml(supports 20+ languages including RTL) - Translation files in
i18n/directory (e.g.,en.yaml,fa.yaml,ja.yaml,zh-cn.yaml) - Example supports English, Persian (RTL), Japanese, and Simplified Chinese
Theme Development Guidelines
Hugo Theme Conventions
- Theme files in this repository override Hugo defaults
- Follow Hugo's theme development guidelines for compatibility
- Maintain backward compatibility with existing configurations
JavaScript & Performance
- All JavaScript components are designed to have minimal footprint
- Core JS components in
assets/js/core/:theme.js,nav-menu.js,code-copy.js,sidebar.js,tabs.js, etc. - FlexSearch powers offline full-text search (
assets/js/flexsearch.js)
CSS Architecture
- Uses Tailwind CSS v4+ with PostCSS processing
- Component-based CSS organization in
assets/css/components/ - Compiled output goes to
assets/css/compiled/main.css - Prettier formatting for Go templates and code consistency
Accessibility (WCAG Compliance)
All new features and UI changes must follow the Web Content Accessibility Guidelines (WCAG) 2.2 at the AA conformance level. Key requirements:
- Semantic HTML: Use appropriate elements (
<nav>,<main>,<aside>,<button>,<ul>, etc.) instead of generic<div>/<span>where applicable. - ARIA attributes: Add
aria-label,aria-expanded,aria-controls,aria-current,role, and other ARIA attributes to interactive components (menus, toggles, dropdowns, modals) so screen readers can interpret them. - Keyboard navigation: All interactive elements must be reachable and operable via keyboard (
Tab,Enter,Escape, arrow keys). Manage focus appropriately when opening/closing menus, modals, and drawers. - Focus indicators: Never remove visible focus outlines. Use the existing
hextra-focusutility or equivalent visible focus ring styles. - Color contrast: Text and interactive elements must meet WCAG AA contrast ratios (4.5:1 for normal text, 3:1 for large text). Verify in both light and dark modes.
- Images and icons: Decorative SVGs/icons should have
aria-hidden="true". Meaningful images need descriptivealttext. - Skip links and landmarks: Preserve existing skip-navigation links and ARIA landmark roles (
role="navigation",role="search", etc.). - Live regions: Use
aria-livefor dynamic content updates (e.g., search results, status messages) so assistive technology announces changes. - Form controls: Associate
<label>elements with inputs. Provide accessible names for buttons that contain only icons.
When introducing a new component or modifying an existing one, verify it works with keyboard-only navigation and review the rendered HTML for proper semantics and ARIA usage.
Testing & Quality Assurance
- Test all changes in
docs/before releasing - Use
npm run dev:themefor theme development with hot reloading - Format code with
npx prettier --write .before committing - Verify multi-language functionality across supported languages