Changelog
Version 1.5.0 (2026-03-05)
Theming & Layout Refinement
CSS Variables Theming: Refactored the core stylesheet to utilize CSS variables for seamless theme integration.
New Configuration Options: Added
filter_tabs_theme_mode,filter_tabs_flavor, andfilter_tabs_enable_collapsible_admonitionsfor enhanced visual control and behavior flexibility.Layout Enhancements: Refined sidebar layout to handle vertical stacking correctly and improved overall UI styling.
Developer & Maintenance Fixes
Code Quality: Addressed lingering code smells and fixed undefined name issues in the Sphix configuration.
Test Robustness: Finalized UI implementation tests, fixed failing edge-cases, and ensured the highest code quality standards.
Version 1.4.3 (2026-02-28)
Internationalization (i18n)
Danish Support: Added full support for Danish translation (
da). All UI strings, including auto-generated legends (e.g., “Vælg programmeringssprog”), are now localized.Translation Infrastructure: Implemented gettext-style translation (
.po/.mo) across all core modules. The extension is now ready for further language contributions.
Accessibility & Polish
ARIA Refinement: Added
aria-controlsattributes to radio buttons, linking them explicitly to their corresponding panels for superior screen reader synchronization.100% Test Coverage: Reached the milestone of 100% code coverage across every single file in the
filter_tabspackage, including error paths and builder-specific edge cases.CI Stability: Fixed formatting and import order issues in the test suite that were blocking GitHub Actions.
New Guidelines: Added a comprehensive
CONTRIBUTING.mdto assist new developers with setup, testing, and contribution workflows.
Version 1.4.2 (2026-02-28)
Security
HTML encoding: All user-provided strings (tab names and legend text) are now properly HTML-encoded before rendering to prevent cross-site scripting (XSS) vulnerabilities.
CSS validation: The highlight color configuration is now validated to ensure it contains only safe CSS color values, preventing potential CSS injection.
Security Test Suite: Introduced a targetted security test suite to verify these protections and prevent future regressions.
Version 1.4.1 (2026-02-28)
Architecture & Refactoring
Modularized codebase: Split the formerly monolithic
extension.pyinto a clean package structure. Core logic is now organized into dedicated modules:nodes.py,directives.py,render_html.py,transforms.py, and others. This significantly improves maintainability and makes the code easier to navigate.Refined entry point: Updated
filter_tabs/__init__.pyto serve as a clean package interface, exporting only necessary Sphinx setup functions.
Developer Experience & Tooling
Improved IDE integration: Added a
.pyre_configurationfile to help static analysis tools correctly resolve imports within virtual environments, eliminating common “missing import” warnings.Full style pass: Re-formatted the entire codebase and organized import blocks using
ruffto ensure consistent style across all new modules.Workspace cleanup: Updated
.gitignoreto properly handlepdf_build.logandtest_out.txt, ensuring temporary build artifacts stay out of the repository.
Version 1.4.0 (2026-02-25)
Code quality & tooling
Deleted dead
renderer.pymodule.FilterTabsRendererwas never instantiated and imported a non-existentTabDataclass. All rendering logic lives inextension.py.Modernised type annotations throughout
extension.py: replacedtyping.List/Dict/Optionalwith built-in generics (PEP 585) andX | None(PEP 604); annotated the previously bareapp_configparameter withsphinx.config.Config; added missing-> Nonereturn annotation onsetup_collapsible_admonitions; movedimport reto module level; fixedraise ... from e(B904) inTabDirective.run.Added
mypystatic type checking. Configuration lives in[tool.mypy]inpyproject.tomlwith targeted overrides for Sphinx’s incomplete stubs. Amypytox environment and CI step are included.Added
rufffor linting and formatting. Configuration lives in[tool.ruff]inpyproject.toml. Alinttox environment runsruff checkandruff format --check. A.pre-commit-config.yamlis provided for local use. ThelintCI job gates the test matrix.Expanded test suite from 16 to 31 tests, covering:
_parse_tab_argumentedge cases,_validate_slotswarnings (duplicate names, empty content, multiple defaults),tab-outside-context error, all three_infer_content_typepaths, collapsible admonitions (collapsed, expanded, no-title, non-HTML builder), and_write_theme_csswarn/cap thresholds.Replaced
blackwithruff+mypy+types-docutilsinrequirements/dev.txt; pinned docs Sphinx to>=9.1inrequirements/docs.txt; consolidated CI dependency installation to use requirements files.Fixed
docs/conf.py: usePath-basedsys.pathmanipulation, readreleasefromimportlib.metadata, addintersphinxmappings for Python and Sphinx, setfilter_tabs_debug_mode = Falsefor production docs.Added
NodeVisitorFunctype alias; applied to_visit_skip_node,_depart_noop, and theVisitorPairtuple insetup().
Version 1.3.1 (2026-02-19)
Bug fixes
Removed
improve_inline_formattingevent handler, which incorrectly added redundantaria-labelattributes to every<strong>and<em>element sitewide, causing screen readers to double-announce text.Fixed the CSS panel-visibility selectors to use the child combinator (
>) between.sft-contentand.sft-panel. The previous descendant combinator caused outer groupcheckedselectors to bleed into nested groups, showing inner panels regardless of their own radio state.
Improvements
Removed the hard 10-tab limit. The panel-visibility selector block is now generated at build time, sized exactly to the maximum tab count used in the build. Groups above 15 tabs emit a warning; groups above 20 emit an error and are capped.
Replaced per-container inline
styleattributes with a generatedfilter_tabs_theme.cssfile, keeping--sft-highlight-coloras a proper:rootCSS custom property rather than per-element inline style.Moved
app.add_css_file()inside thebuilder-initedevent behind a format check, so CSS is never registered for LaTeX and other non-HTML builders.Replaced deprecated
env.appaccess in directives with a builder name cached inenvduringbuilder-inited, eliminating theRemovedInSphinx11Warningsuppression workaround.Added explicit LaTeX skip-visitors for all custom nodes, preventing silent failures if they appear outside expected code paths.
Fixed hover and focus tints to use
color-mix()against--sft-highlight-colorrather than hardcodedrgba(0, 123, 255, …)values that did not follow user colour customisation.Added
__all__ = ['setup']toextension.pyto declare the public API.
Documentation
Added a 12-tab Large Tab Groups example to the usage page demonstrating realistic many-language SDK installation instructions.
Version 1.3.0 (2026-02-06)
Compatibility & Infrastructure
Added Official Support for Sphinx 9.0 and 9.1: Updated dependency constraints and testing matrix to ensure full compatibility with the latest Sphinx releases.
Added Python 3.13 Support: Verified compatibility and updated package classifiers.
Future-Proofing: Resolves RemovedInSphinx11Warning by refactoring configuration access to use env.config and safely handling builder checks.
Development
Optimized tox configuration for parallel testing.
Improved export-project.sh script to robustly exclude virtual environments and build artifacts.
Version 1.2.6 (2025-09-09)
Architecture Change: Transition to CSS-Only Implementation
BREAKING: Removed JavaScript file and all JS-dependent functionality
Fixed panel visibility issues through improved CSS selector approach
Enhanced accessibility with native form control behavior
Simplified maintenance by eliminating JavaScript dependencies
Improved compatibility with restrictive environments (CSP, JS-disabled)
Version 1.2.5 (2025-09-04)
Bump version
Version 1.2.4 (2025-09-03)
Configuration to automate and simplify release process.
Version 1.2.3 (2025-09-03)
This commit addresses several issues found during accessibility audit.
ARIA Role Correction: The role for content panels has been corrected from region to the more accurate tabpanel to better align with WAI-ARIA patterns for tabbed interfaces.
Native Keyboard Navigation: Custom JavaScript keyboard handlers for* arrow keys have been removed. The component now relies entirely on the native, predictable browser behavior for radiogroup navigation, simplifying the code and improving the user experience.
Valid HTML Output: Dynamic CSS generation has been refactored to resolve W3C validation errors. Inline <style> blocks are no longer injected into the body. Instead, CSS rules are collected and added to the document <head> via the html-page-context Sphinx event.
Accessibility Documentation: A new document, _accessibility.rst, has been added. This file details the extension’s accessibility implementation strategy and explains the conscious design choice to use the robust radiogroup pattern to ensure CSS-first functionality.
Version 1.2.2 (2025-09-01)
Remove obsolete scripts complete_cleanup.sh and test_cleanup.sh
Improve export-project.sh, which now exclude dist and .pytest_cache
Version 1.2.1 (2025-09-01)
Fixes multiple issues from code review, improving test robustness, documentation accuracy, and CI stability.
Version 1.2.0 (2025-08-31)
First Production/Stable release.
No-breaking refactoring for easier maintainability
Consolidated six Python files into two, and reduced lines of code
extension.py: All Sphinx integration and output generation in one place
static/: UI functionality unchanged
Version 1.1.0b (2025-08-30)
Changed
Majorly refactored the entire codebase for simplicity and maintainability.
Simplified configuration options down to the essentials.
Improved error messages for missing tabs.
Added
Added focus management to panels via JavaScript for better accessibility.
Added more detailed debug logging.
Version 1.0.0b (2025-08-27)
BREAKING CHANGE: Simplified directive syntax -
filter-tabsno longer requires tab names as argumentsTab names and defaults are now defined directly in
.. tab::directivesContent outside
.. tab::blocks automatically becomes general contentAdded
:aria-label:option totabdirective for enhanced accessibilityImproved screen reader support with customizable ARIA labels
Fixed CSS selector bug that referenced
.sft-contentwithout using constantMajor refactoring: Static types, better separation of concerns, etc.
Version 0.9.3b (2025-08-22)
Reintroduce doc deploy requirements, but now caching them (GitHub)
Version 0.9.2b (2025-08-21)
Removed duplicate IDs in HTML and resulting W3 validation errors
Add dev, export, and improved setup scripts
Reduced doc deploy requirements from 1GB to 50MB
Version 0.9.0b (2025-08-20)
Full WAI-ARIA compliance implemented
Added keyboard navigation (arrow keys, Home/End, Enter/Space)
Enhanced screen reader compatibility
Progressive JavaScript enhancement for better accessibility
Improved focus management and ARIA state handling
Refactored extension.py for readability and maintainability
Version 0.8.0b (2025-08-15)
Added keyboard navigation using tab and arrows
Allowed for nested tabs and included example usage
Refactor HTML generation according to WAI-ARIA recommendations
Extended README.md with build and test instructions for developers
Version 0.7.0b (2025-08-13)
Fixed HTML errors
Version 0.6.0b (2025-08-11)
Initial release