Skip to main content

A Sphinx extension for accessible, CSS-first filterable content tabs.

Project description

Sphinx Filter Tabs Extension

Tests and Docs Deployment PyPI version PyPI - Python Version PyPI - License

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.

Key Features

  • 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
  • Easy Customization: Theme colors and styling through simple CSS custom properties
  • Multiple Output Formats: Graceful fallback to sequential content in PDF/LaTeX builds
  • Proven Reliability: Comprehensive test suite across multiple Python and Sphinx versions

Quick Start

Installation

pip install sphinx-filter-tabs

Enable the Extension

Add to your conf.py:

extensions = [
    # ... your other extensions ...
    'filter_tabs.extension',
]

Basic Usage

.. 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 .

Configuration Options

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: False

Advanced Usage

Custom Legend

Override the auto-generated legend:

.. filter-tabs::
   :legend: Select Your Installation Method

   .. tab:: Quick Install
      Content here...

ARIA Labels for Accessibility

Provide descriptive labels for screen readers:

.. filter-tabs::

   .. tab:: CLI
      :aria-label: Command line installation instructions
      
      Content for command line users...

Nested Tabs

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-package

How It Works

This extension uses a pure CSS architecture with semantic HTML:

  • Radio buttons provide the selection mechanism (hidden but accessible)
  • CSS :checked selectors 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

Browser Support

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.

Development

Quick Setup

git clone https://github.com/aputtu/sphinx-filter-tabs.git
cd sphinx-filter-tabs
./scripts/setup_dev.sh

This 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 pytest will fail:

source venv/bin/activate

Development Commands

# 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.sh

Testing

The 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
  • Multiple operating systems via GitHub Actions
# Run the full test suite
tox

# Run linting (ruff) and type checking (mypy)
tox -e lint
tox -e mypy

Architecture

The extension consists of two main components:

  • extension.py - Sphinx integration, directives, node definitions, and all rendering logic
  • static/filter_tabs.css - Pure CSS styling and functionality

All HTML and fallback rendering lives directly in extension.py alongside the directive and node definitions, keeping the codebase compact and easy to follow.

Contributing

Contributions are welcome! Please:

  1. Fork the repository
  2. Create a feature branch
  3. Add tests for new functionality
  4. Ensure all tests pass: pytest
  5. Submit a pull request

License

GNU General Public License v3.0. See LICENSE for details.

Changelog

See CHANGELOG.md for version history and migration notes.

Support

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sphinx_filter_tabs-1.4.0.tar.gz (35.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sphinx_filter_tabs-1.4.0-py3-none-any.whl (27.0 kB view details)

Uploaded Python 3

File details

Details for the file sphinx_filter_tabs-1.4.0.tar.gz.

File metadata

  • Download URL: sphinx_filter_tabs-1.4.0.tar.gz
  • Upload date:
  • Size: 35.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for sphinx_filter_tabs-1.4.0.tar.gz
Algorithm Hash digest
SHA256 65d1f7f27f3bbef023ed9b37e0666dbee7c2aefad085f16d09e25f06974523af
MD5 6654351b9f6483faf0f5fbc05534c9dd
BLAKE2b-256 b57538a614f16685e3591c91daa35431bf356efaeeacc5409e03da034a79dde2

See more details on using hashes here.

Provenance

The following attestation bundles were made for sphinx_filter_tabs-1.4.0.tar.gz:

Publisher: test.yml on aputtu/sphinx-filter-tabs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sphinx_filter_tabs-1.4.0-py3-none-any.whl.

File metadata

File hashes

Hashes for sphinx_filter_tabs-1.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f0dbd639c83264d08058de34aa2b92cc7919ccc3d15a9b42748cf873b997be12
MD5 57ab41a4a0cf8a8cddc7143a1b78d052
BLAKE2b-256 180bea84f2258e0c12898b8ea3d879f8d22c1e7e81614d29acc37c8dcdc3f356

See more details on using hashes here.

Provenance

The following attestation bundles were made for sphinx_filter_tabs-1.4.0-py3-none-any.whl:

Publisher: test.yml on aputtu/sphinx-filter-tabs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page