Changelog¶
Version 1.6.0 (2026-07-01)¶
Accessibility & API Contract
Native HTML Accessibility Contract: Kept the HTML output on the native radio-group pattern by removing ARIA
tabpanelsemantics from plain content panels and leaving the outer container as a structuraldiv.Clearer Screen Reader Helper Text: Updated hidden radio descriptions to describe showing content instead of selecting ARIA-style tabs.
Opt-in Collapsible Admonitions: Collapsible admonitions now default to disabled and require the namespaced
sft-collapsibleclass when enabled.
Theming & Layout
Legend Display Control: Added
:hide-legend:for compact tab groups that still preserve a semantic legend for assistive technology.Large Tab Groups: Generated panel-visibility CSS now scales beyond 20 tabs when a build contains larger groups. Groups above 15 still emit a usability warning.
Developer & Packaging
Node Lifecycle Split: Separated parse-time filter-tab nodes from rendered HTML nodes to keep Sphinx transform boundaries clearer.
Runtime Dependency Cleanup: Kept the public package dependency metadata limited to direct runtime requirements.
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.Test Coverage: Expanded package-level test coverage, 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: User-provided strings, including tab names and legend text, are 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 targeted 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 ignorepdf_build.logandtest_out.txt, keeping temporary build artifacts 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.Modernized 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_csslarge-group selector generation.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 color customization.Changed native theming so the default highlight color follows the active Sphinx theme/browser link color. Explicit
filter_tabs_highlight_colorvalues still override the default.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 the testing matrix for the latest Sphinx releases.
Added Python 3.13 Support: Verified compatibility and updated package classifiers.
Future-Proofing: Resolved
RemovedInSphinx11Warningby refactoring configuration access to useenv.configand safely handling builder checks.
Development
Optimized
toxconfiguration for parallel testing.Improved
export-project.shto 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)¶
Bumped version.
Version 1.2.4 (2025-09-03)¶
Added configuration to automate and simplify the release process.
Version 1.2.3 (2025-09-03)¶
This release addressed several issues found during an accessibility audit.
ARIA Role Correction: The role for content panels has been corrected from
regiontotabpanelto 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 on native browser behavior for
radiogroupnavigation, 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 thehtml-page-contextSphinx 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 theradiogrouppattern for CSS-first functionality.
Version 1.2.2 (2025-09-01)¶
Removed obsolete
complete_cleanup.shandtest_cleanup.shscripts.Improved
export-project.shso it excludesdistand.pytest_cache.
Version 1.2.1 (2025-09-01)¶
Fixed multiple issues from code review, improving test robustness, documentation accuracy, and CI stability.
Version 1.2.0 (2025-08-31)¶
First Production/Stable release.
Non-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 placestatic/: UI functionality unchanged
Version 1.1.0b (2025-08-30)¶
Changed
Refactored the 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)¶
Reintroduced documentation deployment requirements with GitHub caching.
Version 0.9.2b (2025-08-21)¶
Removed duplicate IDs in HTML and resulting W3 validation errors
Added development, export, and setup scripts.
Reduced doc deploy requirements from 1GB to 50MB
Version 0.9.0b (2025-08-20)¶
Added WAI-ARIA support
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