A robust Sphinx extension for creating accessible, filterable content tabs using pure CSS and semantic HTML.
📖 View extension and documentation at: https://aputtu.github.io/sphinx-filter-tabs/
This extension provides filter-tabs and tab directives to create user-friendly, switchable content blocks. Perfect for showing code examples in multiple languages, installation instructions for different platforms, or any content that benefits from organized, filterable presentation.
- Pure CSS Implementation: Zero JavaScript dependencies for maximum compatibility and performance
- Fully Accessible: WAI-ARIA compliant with native keyboard navigation and screen reader support
- Semantic HTML: Uses standard form controls (radio buttons) for robust, predictable behavior
- Universal Compatibility: Works in all environments where CSS is supported, including strict CSP policies
- Internationalization (i18n): Built-in support for translations, including a complete Danish localization
- Easy Customization: Theme colors and styling through simple CSS custom properties
- Multiple Output Formats: Graceful fallback to sequential content in PDF/LaTeX builds
- 100% Test Coverage: Rigorous verification across all modules, Python versions, and Sphinx releases
pip install sphinx-filter-tabsAdd to your conf.py:
extensions = [
'filter_tabs',
].. filter-tabs::
This content appears above all tabs.
.. tab:: Python
Install using pip:
.. code-block:: bash
pip install my-package
.. tab:: Conda (default)
Install using conda:
.. code-block:: bash
conda install my-package
.. tab:: From Source
Build from source:
.. code-block:: bash
git clone https://github.com/user/repo.git
cd repo
pip install -e .Add these optional settings to your conf.py:
# Customize the active tab highlight color
filter_tabs_highlight_color = '#007bff' # Default: '#007bff'
# Enable debug logging during development
filter_tabs_debug_mode = False # Default: FalseOverride the auto-generated legend:
.. filter-tabs::
:legend: Select Your Installation Method
.. tab:: Quick Install
Content here...Provide descriptive labels for screen readers:
.. filter-tabs::
.. tab:: CLI
:aria-label: Command line installation instructions
Content for command line users...Create complex layouts with nested tab groups:
.. filter-tabs::
.. tab:: Windows
Choose your package manager:
.. filter-tabs::
.. tab:: Chocolatey
choco install my-package
.. tab:: Scoop
scoop install my-packageThis extension uses a pure CSS architecture with semantic HTML:
- Radio buttons provide the selection mechanism (hidden but accessible)
- CSS
:checkedselectors control panel visibility - Fieldset/legend structure provides semantic grouping
- ARIA attributes enhance screen reader support
- Native keyboard navigation works through standard form controls
This approach ensures:
- Maximum compatibility across all browsers and assistive technologies
- Better performance with no JavaScript parsing or execution
- Enhanced security for environments with strict Content Security Policies
- Simplified maintenance with fewer dependencies and potential conflicts
Works in all modern browsers that support:
- CSS3 selectors (
:checked, attribute selectors) - Basic ARIA attributes
- HTML5 form elements
This includes all browsers from the last 10+ years.
git clone https://github.com/aputtu/sphinx-filter-tabs.git
cd sphinx-filter-tabs
./scripts/setup_dev.shThis creates a virtual environment and builds the documentation.
Note: Always activate the virtual environment before running any development commands, otherwise your shell may pick up a different Python installation (e.g. a system or conda Python) and commands like
pytestwill fail:source venv/bin/activate
# Activate virtual environment
source venv/bin/activate
# Run tests
pytest
# Build documentation
./scripts/dev.sh html
# Run tests across multiple Sphinx versions
tox
# Clean build and start fresh
./scripts/dev.sh clean-all
# Export project structure for analysis
./scripts/export-project.shThe project includes comprehensive tests covering:
- Basic tab functionality and content visibility
- Accessibility features and ARIA compliance
- Nested tabs and complex layouts
- Multiple output formats (HTML, LaTeX, plain text, man, texinfo)
- Edge cases: duplicate names, empty tabs, multiple defaults, large tab groups
Tests run automatically on:
- Python versions 3.10, 3.11, 3.12, 3.13, 3.14
- Sphinx versions 7.0, 7.4, 8.0, 8.2, 9.0, 9.1
- 100% Code Coverage across all package modules
- Multiple operating systems via GitHub Actions
# Run the full test suite
tox
# Run linting (ruff) and type checking (mypy)
tox -e lint
tox -e mypyThe extension is organized as a modular Python package:
filter_tabs/- Core logic split into focused modules (nodes.py,directives.py,render_html.py, etc.)filter_tabs/static/- Pure CSS styling and functionality
The logic is distributed across dedicated modules for nodes, directives, transforms, and builders, ensuring a clean and maintainable codebase.
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch
- Add tests for new functionality
- Ensure all tests pass:
pytest - Submit a pull request
GNU General Public License v3.0. See LICENSE for details.
See CHANGELOG.md for version history and migration notes.