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``, and ``filter_tabs_enable_collapsible_admonitions`` for 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-controls`` attributes 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_tabs`` package, 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.md`` to 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.py`` into 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__.py`` to serve as a clean package interface, exporting only necessary Sphinx setup functions. **Developer Experience & Tooling** * **Improved IDE integration**: Added a ``.pyre_configuration`` file 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 ``ruff`` to ensure consistent style across all new modules. * **Workspace cleanup**: Updated ``.gitignore`` to properly handle ``pdf_build.log`` and ``test_out.txt``, ensuring temporary build artifacts stay out of the repository. Version 1.4.0 (2026-02-25) --------------------------- **Code quality & tooling** * Deleted dead ``renderer.py`` module. ``FilterTabsRenderer`` was never instantiated and imported a non-existent ``TabData`` class. All rendering logic lives in ``extension.py``. * Modernised type annotations throughout ``extension.py``: replaced ``typing.List``/``Dict``/``Optional`` with built-in generics (PEP 585) and ``X | None`` (PEP 604); annotated the previously bare ``app_config`` parameter with ``sphinx.config.Config``; added missing ``-> None`` return annotation on ``setup_collapsible_admonitions``; moved ``import re`` to module level; fixed ``raise ... from e`` (B904) in ``TabDirective.run``. * Added ``mypy`` static type checking. Configuration lives in ``[tool.mypy]`` in ``pyproject.toml`` with targeted overrides for Sphinx's incomplete stubs. A ``mypy`` tox environment and CI step are included. * Added ``ruff`` for linting and formatting. Configuration lives in ``[tool.ruff]`` in ``pyproject.toml``. A ``lint`` tox environment runs ``ruff check`` and ``ruff format --check``. A ``.pre-commit-config.yaml`` is provided for local use. The ``lint`` CI job gates the test matrix. * Expanded test suite from 16 to 31 tests, covering: ``_parse_tab_argument`` edge cases, ``_validate_slots`` warnings (duplicate names, empty content, multiple defaults), ``tab``-outside-context error, all three ``_infer_content_type`` paths, collapsible admonitions (collapsed, expanded, no-title, non-HTML builder), and ``_write_theme_css`` warn/cap thresholds. * Replaced ``black`` with ``ruff`` + ``mypy`` + ``types-docutils`` in ``requirements/dev.txt``; pinned docs Sphinx to ``>=9.1`` in ``requirements/docs.txt``; consolidated CI dependency installation to use requirements files. * Fixed ``docs/conf.py``: use ``Path``-based ``sys.path`` manipulation, read ``release`` from ``importlib.metadata``, add ``intersphinx`` mappings for Python and Sphinx, set ``filter_tabs_debug_mode = False`` for production docs. * Added ``NodeVisitorFunc`` type alias; applied to ``_visit_skip_node``, ``_depart_noop``, and the ``VisitorPair`` tuple in ``setup()``. Version 1.3.1 (2026-02-19) --------------------------- **Bug fixes** * Removed ``improve_inline_formatting`` event handler, which incorrectly added redundant ``aria-label`` attributes to every ```` and ```` element sitewide, causing screen readers to double-announce text. * Fixed the CSS panel-visibility selectors to use the child combinator (``>``) between ``.sft-content`` and ``.sft-panel``. The previous descendant combinator caused outer group ``checked`` selectors 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 ``style`` attributes with a generated ``filter_tabs_theme.css`` file, keeping ``--sft-highlight-color`` as a proper ``:root`` CSS custom property rather than per-element inline style. * Moved ``app.add_css_file()`` inside the ``builder-inited`` event behind a format check, so CSS is never registered for LaTeX and other non-HTML builders. * Replaced deprecated ``env.app`` access in directives with a builder name cached in ``env`` during ``builder-inited``, eliminating the ``RemovedInSphinx11Warning`` suppression 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-color`` rather than hardcoded ``rgba(0, 123, 255, …)`` values that did not follow user colour customisation. * Added ``__all__ = ['setup']`` to ``extension.py`` to 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 `