All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- [Unreleased]
- [2.0.4] - 2026-07-16
- [2.0.3] - 2026-07-13
- [2.0.2] - 2026-07-09
- [2.0.1] - 2026-07-09
- [2.0.0] - 2026-07-02
- [1.2.10] - 2026-06-18
- [1.2.9] - 2026-06-18
- [1.2.8] - 2026-06-18
- [1.2.7] - 2026-06-18
- [1.2.6] - 2026-06-18
- [1.2.5] - 2026-06-18
- [1.2.4] - 2026-06-18
- [1.2.3] - 2026-04-15
- [1.2.2] - 2026-03-16
- [1.2.1] - 2026-03-09
- [1.2.0] - 2025-12-15
- [1.1.1] - 2024-12-12
- [1.1.0] - 2024-12-12
- [1.0.0] - 2024-12-11
- REQ-GIT-001 tooling:
.scripts/check-no-cursor-coauthor.sh,.scripts/strip-cursor-coauthor-from-history.sh,.githooks/commit-msg, Cursor rule.cursor/rules/01-git-commits.mdc, and Makefile targetscheck-no-cursor-coauthor/strip-cursor-coauthor-from-history/ updatedsetup-hooks. - CI job
git-hygiene: full-history check that commit messages do not contain Cursor co-author trailers (seeGITHUB_CI.md). - Code of Conduct:
CODE_OF_CONDUCT.md(Contributor Covenant); linked from README. - Documentation:
docs/GITHUB_CI.md(REQ-GIT-001 operator/CI reference); CONTRIBUTING and RELEASE updated for hooks and pre-push verification.
- Dev dependencies (
composer.lock): PHP-CS-Fixer 3.95.15, Rector 2.5.7, and related transitive updates; demo lockfiles refreshed. .gitignore: ignore Cursor local sandbox file.cursor/sandbox.json(REQ-IDE-005).- Git history (REQ-GIT-001): removed Cursor co-author trailers from past commits on
main; release tagsv2.0.0–v2.0.3retargeted to the rewritten commits.
- Symfony assets package:
NowoPasswordToggleExtensionprependsframework.assets.packages.nowo_password_toggle(base_path:/bundles/nowopasswordtoggle) so Twig can reference bundle CSS withasset('css/toggle_password.css', 'nowo_password_toggle')(AssetMapper-friendly).
- Documentation: README,
INSTALLATION.md, andUSAGE.mdrecommend the named asset package instead of the legacybundles/nowopasswordtoggle/...path; INSTALLATION adds optional CSS publish steps and an AssetMapper note.
- GitHub Spec Kit: repository scaffolding (
.specify/, Cursorspeckit-*skills in.cursor/skills/) for spec-driven maintenance. - Baseline specs:
specs/001-baseline/(spec.md,code-inventory.md) documenting 100% of production code undersrc/. - Documentation:
docs/SPEC-KIT.md(install, structure, Cursor workflow); README link under Documentation.
- Spec-driven development:
docs/SPEC-DRIVEN-DEVELOPMENT.mdaligned with the three-layer model (Spec Kit baseline, product behavior, traceability). - Dev dependencies (
composer.lock): PHPUnit 10.5.64, PHPStan 2.2.5, PHP-CS-Fixer 3.95.12, Twig 3.28.0, and related transitive updates. - Demo Dockerfiles (
symfony7,symfony8,symfony8-php85): install PHPintlextension alongsidezip.
- Symfony 6.4 demo: deleted
demo/symfony6/(directory, Docker setup, and tests). Minimum requirements are PHP 8.2 and Symfony 7+; usesymfony7,symfony8, orsymfony8-php85.
- Demo Makefile: removed Symfony 6.4 version helpers from
demo/Makefileoutput labels.
- PHP: minimum version is now >= 8.2 (was >= 8.1). Projects on PHP 8.1 must upgrade PHP before updating the bundle.
- Symfony: minimum version is now ^7.0 || ^8.0 (Symfony 6.x is no longer supported). Stay on
^1.2if you cannot upgrade Symfony yet.
- CI: test matrix updated to PHP 8.2–8.5 and Symfony 7.0 / 7.4 / 8.0 / 8.1.
- Demos:
symfony6removed from the demo aggregator (demo/Makefile); active demos aresymfony7,symfony8, andsymfony8-php85. - Documentation: README, INSTALLATION, CONTRIBUTING, DEMO-FRANKENPHP, and demo README aligned with the new requirements.
- Rector: PHP set target updated from 8.1 to 8.2;
IconSupportCheckermarkedreadonly(PHP 8.2).
- Demo
update-deps: each demo Makefile now definesCOMPOSEandSERVICE_PHPbefore including the sharedMakefile.demo-update-deps.mk(fixesrun: not foundwhen runningmake update-deps).
- CI coverage threshold: minimum project coverage in GitHub Actions lowered from 100% to 95% (
MIN_COVERAGEenv inci.yml). README and CONTRIBUTING updated accordingly. The test suite onmainstill reports 100% locally.
- IconSupportChecker coverage / detection: removed unreachable
IconRendererInterfacefallback; UX Icons availability is detected via Twig runtime classes only (UXIconRuntime, legacyUXIconsRuntime). Restores 100% test coverage required by CI. No application config changes.
- Default widget icon visibility: show/hide toggle icons via inline
style.displayon the SVG instead of the Bootstrapd-noneclass. The initially hidden icon is rendered withstyle: 'display: none'; the inlineonclickhandler toggleselement.style.display. No dependency on Bootstrap utility classes for icon visibility.
- Default widget icon rendering: the template no longer checks
ux_icon is defined. In Twig,definedapplies to variables, not functions, so that condition was always false and icons were never rendered (dev showed[icons missing]even whenicons_availablewas true andsymfony/ux-iconswas installed). Icons are now rendered whenicons_availableis true.
- UX Icons 3.x detection:
IconSupportCheckerdetectsSymfony\UX\Icons\Twig\UXIconRuntime(with fallbacks for legacyUXIconsRuntimeandIconRendererInterface). Without this fix,icons_availablestayed false with UX Icons 3.x installed and the default widget showed[icons missing]in dev even aftercomposer require symfony/ux-icons symfony/http-clientandux:icons:lock.
- UX Icons 3.x
ux:icons:lock: command accepts no icon arguments (scans Twig templates). Updated docs, demos (auto-scripts), recipepost-install.txt,IconSupportCheckerwarning message, and dev template hint. Usephp bin/console ux:icons:lock(optional--force).
- UX Icons requirement handling:
IconSupportCheckerandIconSupportWarningSubscriberdetect missingsymfony/ux-icons/symfony/http-client, log an actionable warning (Monolog channelnowo_password_toggle), and exposeicons_availableto the default Twig widget for graceful degradation (dev hint, prod without icons, toggle still works). - Flex recipe 1.2.3 / 1.2.4:
requirefor ux-icons and http-client,config/packages/ux_icons.yaml, tabler SVG assets, updatedpost-install.txt.
- Demos: all demos require
symfony/http-client;ux:icons:lock tabler:eye tabler:eye-offadded to Composerauto-scripts. - Documentation: INSTALLATION.md (manual install, runtime fallback), USAGE.md (default icons section), demo/README.md (icon dependencies for demos).
- Twig template override order: Compiler pass
TwigPathsPassregisters the bundle Twig namespace on the native loader after the application paths, so overrides intemplates/bundles/NowoPasswordToggleBundle/are used before the bundle defaults. - Tests: Unit tests under
tests/Unit/(includingTwigPathsPassTest); integration placeholder undertests/Integration/. - GitHub: Issue templates (bug, feature, support), pull request template,
CODEOWNERS, workflows (sync-releases,stale,pr-lint), Dependabot and Copilot instructions updates.
- Demo Composer path repository: Demos declare the bundle as
dev-main as 1.2.99withminimum-stability: devandprefer-stable: true, so the canonical path repository (/var/password-toggle-bundle) satisfies the same semver intent as^1.2.xandcomposer installworks inside Docker. Documented in demo/README.md troubleshooting.
- Documentation: README (toggle / UX Icons /
Caddyfile.devin dev), DEMO-FRANKENPHP.md (bundles example with UX Icons and Twig Inspector), INSTALLATION.md (UX Icons and default template), plus edits to CONTRIBUTING, BRANCHING, USAGE, SECURITY, ENGRAM. - Development: Cursor rules,
.cursorignore, Makefile and demo Makefiles, demo.env.example/ docker-compose alignment, Flex recipe manifest path, PHPUnit config and coverage script.
- Demo with FrankenPHP: New documentation and setup for running demos with FrankenPHP (development and production)
- Added docs/DEMO-FRANKENPHP.md with instructions for FrankenPHP, Caddyfile, and PHP dev ini
- README links to the new demo doc for development and production usage
- Demo configurations and development setup: Updated all demo projects for consistent development experience
- Docker and docker-compose aligned across symfony6, symfony7, symfony8, and symfony8-php85 demos
- FrankenPHP Caddyfile and PHP dev ini configuration in each demo
- Demo
.env.testand.env.devupdates where applicable - Twig dev package configuration for demos
- Root Makefile, composer, and .gitignore adjustments
- README: Demo screenshot showing the password toggle form in the main README for quick visual reference.
- Demo structure: Renamed demo project directories for simpler paths
demo/demo-symfony6→demo/symfony6demo/demo-symfony7→demo/symfony7demo/demo-symfony8→demo/symfony8demo/demo-symfony8-php85→demo/symfony8-php85- Makefile and documentation updated to use the new paths (e.g.
make up symfony7).
- PHPStan 2.x compatibility: Updated configuration and code for PHPStan 2
- Removed deprecated
memoryLimitandcheckMissingIterableValueTypefromphpstan.neon.dist(use CLI--memory-limitand analysis level instead). - Added generic type hints for Symfony Form:
@extends AbstractType<string>andFormInterface<string>inPasswordType. - Adjusted
NowoPasswordToggleBundle::getContainerExtension()return type handling for parentExtensionInterface|falseproperty. - Updated
NowoPasswordToggleExtension::load()parameter type toarray<int, array<string, mixed>>for config array. - Test type assertions and PHPStan ignores where needed for container parameters and assertions.
- Removed deprecated
- Bundle Configuration System: Added support for default configuration via YAML file
- Created
Configurationclass to define bundle configuration structure - Added support for configuring default values in
config/packages/nowo_password_toggle.yaml - All form type options can now be configured globally and overridden per field
- Configuration is automatically injected into
PasswordTypeservice
- Created
- Symfony Flex Recipe: Created Flex recipe for automatic installation and configuration
- Bundle registration is now automatic when using Symfony Flex
- Default configuration file is automatically created at
config/packages/nowo_password_toggle.yaml - Recipe includes manifest.json, configuration file, and post-install message
- Recipe structure ready for publishing to symfony/recipes-contrib or private recipe repository
- Makefile Improvements: Enhanced demo Makefile for better usability
- Generic commands now accept demo name as direct argument (e.g.,
make up symfony8) - Both formats supported:
make up symfony8andmake up DEMO=symfony8 - Updated help documentation to show both usage formats
- Generic commands now accept demo name as direct argument (e.g.,
- Configuration Validation: Added comprehensive validation for bundle configuration
- Icons and labels cannot be empty strings
- Arrays (button_classes, toggle_container_classes) are validated as arrays
- Invalid message must be non-empty
- Clear error messages for invalid configuration values
- Type Validation: Added type validation in OptionsResolver
- All form type options now have strict type validation
- Prevents type errors at runtime
- Better error messages for invalid option types
- Template Improvements: Enhanced Twig template with better functionality
- Support for
toggle=falseto render simple password input without toggle button - Keyboard support (Enter/Space keys) for toggle button
- Improved error handling in JavaScript with null checks
- Better accessibility with proper ARIA attributes
- Support for
- Test Coverage: Added comprehensive tests for new functionality
- Tests for Configuration class with validation scenarios
- Tests for Extension with configuration parameter storage
- Tests for PasswordType with injected configuration
- Tests for type validation in OptionsResolver
- Demo Projects Test Configuration: Fixed test environment setup for all demo projects
- Created
config/packages/test/framework.yamlfor all demos to enable functional testing - Fixed
phpunit.xml.distto correctly setAPP_ENV=testfor all demos - Added
DEFAULT_URIenvironment variable to.env.examplefiles for Symfony 7.0+ compatibility - All demo test suites now run correctly in test environment
- Created
- Demo Projects Updated: Updated all demo projects to use bundle v1.2.0
- Updated
composer.jsonin all demos to require^1.2.0 - Updated
composer.lockfiles to reflect v1.2.0 dependency - Added
config/packages/nowo_password_toggle.yamlconfiguration files to all demos - Demos now demonstrate the new global configuration feature
- Updated demo README to document the configuration system
- All demos verified to work correctly and respond with HTTP 200
- Updated
- PasswordType Service: Modified to accept configuration as constructor dependency
- Configuration defaults are now injected via dependency injection
- Maintains backward compatibility with hardcoded fallbacks
- Configuration can be overridden per form field as before
- Added strict type validation for all options
- Template Rendering: Improved template logic for better flexibility
- Conditional rendering based on
toggleoption - Fallback to simple password input when toggle is disabled
- Enhanced JavaScript with better error handling
- Conditional rendering based on
- Code Quality: Improved code quality and maintainability
- Removed unused imports from Extension class
- Added validation to prevent configuration errors
- Enhanced error messages for better debugging
- Documentation: Updated README with configuration section
- Added comprehensive configuration documentation
- Explained Flex recipe automatic installation
- Updated usage examples to show configuration options
- Documentation Structure: Reorganized documentation files
- Moved
CHANGELOG.mdtodocs/CHANGELOG.mdfor better organization - Moved
CONTRIBUTING.mdtodocs/CONTRIBUTING.mdfor consistency - Added
docs/BRANCHING.mdwith branching strategy documentation - Updated all references to documentation paths in README
- Moved
- Demo Projects: Fixed multiple issues in all demo projects
- Fixed incorrect package name: Changed
symfony/ux-icontosymfony/ux-icons(correct package name) - Fixed bundle registration: Updated
bundles.phpto use correct namespaceSymfony\UX\Icons\UXIconsBundleinstead ofSymfony\UX\Icon\IconBundle - Fixed nginx configuration: Corrected
SCRIPT_FILENAMEpath from$document_root$fastcgi_script_nameto/app/public$fastcgi_script_namefor proper file resolution - Fixed routing configuration: Added explicit attribute-based routing configuration in
routes.yamlfor all demos - Added missing dependency: Added
symfony/yamlto all democomposer.jsonfiles (required for YAML configuration loading) - Added web profiler: Added
symfony/web-profiler-bundleto all demos for better debugging experience - Fixed port configuration: Ensured all demos use port 8001 by default and can be configured via environment variables
- Fixed incorrect package name: Changed
- Demo Configuration: Improved demo project configurations
- All demos now properly load routes from controller attributes
- Web profiler bundle registered for
devandtestenvironments in all demos - Consistent nginx configuration across all demo projects
- All
composer.lockfiles generated and updated to ensure reproducible builds
- Multiple Demo Projects: Created four independent demo projects for different Symfony/PHP combinations
- Symfony 6.4 demo (PHP 8.2) - Port 8001 by default
- Symfony 7.0 demo (PHP 8.2) - Port 8001 by default
- Symfony 8.0 demo (PHP 8.4) - Port 8001 by default
- Symfony 8.0 demo with PHP 8.5 - Port 8001 by default
- Each demo includes its own Docker setup, tests, and configuration
- Port configuration via
.envfiles (all use 8001 by default, configurable)
- Demo Test Suites: Each demo project includes comprehensive PHPUnit test suite
- Controller tests to verify form functionality
- Bundle integration tests to verify bundle registration
- Tests verify password toggle functionality, form submission, and UI elements
- 100% Code Coverage: Achieved complete test coverage for the bundle
- All classes and methods fully tested
- Enhanced test suite with comprehensive edge case coverage
- All tests passing
- CONTRIBUTING.md: Added comprehensive contribution guide in English
- Code standards and conventions
- Testing requirements (100% coverage)
- Pull request process and checklist
- Development setup instructions
- CI/CD Workflow: Enhanced GitHub Actions workflow
- Added support for Symfony 8.0 and PHP 8.4/8.5
- Updated matrix to test all compatible PHP/Symfony combinations
- Improved dependency installation with Symfony version-specific requirements
- Updated to actions/checkout@v6 and actions/cache@v5
- Dependencies: Updated
composer.json- Added Symfony 8.0 support:
^6.0 || ^7.0 || ^8.0 - Updated PHP requirement:
>=8.1 <8.6(was>=8.1) - PHPUnit constraint set to
^10.0only (removed^11.0for PHP 8.1 compatibility)
- Added Symfony 8.0 support:
- Code Style: Fixed PHP-CS-Fixer configuration
- Removed duplicate
single_blank_line_before_namespacerule (already included in@PSR12)
- Removed duplicate
- Documentation: Enhanced README.md
- Added comprehensive Testing section with coverage information
- Added Code Quality section
- Added CI/CD section with detailed matrix information
- Updated Demo Project section with information about multiple demos
- Added link to CONTRIBUTING.md
- Demo Projects: Fixed Docker setup issues
- Created Dockerfiles for each demo with Composer pre-installed
- Fixed docker-compose.yml to use build context instead of image
- Removed obsolete
versionattribute from docker-compose.yml - Added entrypoint scripts for proper directory permissions
- Port Configuration: Implemented
.envfile support for demo ports- Each demo has its own
.envfile with default port configuration - Ports can be customized per demo without modifying docker-compose.yml
- All demos use port 8001 by default (configurable via
.envfile)
- Each demo has its own
- PHPDoc Documentation: Enhanced all classes with comprehensive PHPDoc comments in English
- All bundle classes (
NowoPasswordToggleBundle,NowoPasswordToggleExtension,PasswordType) have detailed documentation with feature lists - All demo classes (
DemoController,Kernel) include complete PHPDoc with@authorand@copyrighttags - All public methods include
@paramand@returnannotations with detailed descriptions - Enhanced class descriptions with usage information and examples
- All bundle classes (
- Test Coverage: Enhanced test suite to achieve 100% coverage
- Improved
NowoPasswordToggleBundleTestwith better isolation - Enhanced
NowoPasswordToggleExtensionTestto verify service registration - Added comprehensive tests for
PasswordTypecovering all options and edge cases - All tests now verify actual behavior instead of just asserting true
- Improved
- Demo Structure: Organized demo projects with independent setups
- Each demo can run independently with its own docker-compose.yml
- Makefile updated with commands for all demos (up, down, install, test, logs)
- Comprehensive README.md in demo directory with usage instructions
- Test commands for each demo and all demos combined
- PHP: >= 8.1, < 8.6
- Symfony: >= 6.0 || >= 7.0 || >= 8.0
- Symfony UX Icon: >= 2.0 || >= 3.0
- Password form type with toggle visibility: Custom Symfony form type that extends TextType
- Toggle button to show/hide password
- Native JavaScript implementation (no Stimulus) for maximum compatibility
- Compatible with Symfony Live Components
- Customizable icons using Symfony UX Icon
- Configurable CSS classes for button and container
- Customizable labels for accessibility
- Twig template:
toggle_password_widget.html.twigfor rendering the password field- Inline JavaScript for toggle functionality
- ARIA labels for accessibility
- Support for Tabler icons (default) or any UX Icon compatible icon
- Bundle structure: Complete Symfony bundle with:
- Bundle class (
NowoPasswordToggleBundle) - DependencyInjection extension (
NowoPasswordToggleExtension) - Form type service configuration
- Automatic template discovery
- Bundle class (
- Configuration options:
toggle: Enable/disable toggle functionality (default:true)visible_icon: Icon when password is hidden (default:'tabler:eye-off')hidden_icon: Icon when password is visible (default:'tabler:eye')visible_label: Label when password is hidden (default:'Show')hidden_label: Label when password is visible (default:'Hide')button_classes: CSS classes for toggle button (default:['input-group-text', 'cursor-pointer'])toggle_container_classes: CSS classes for container (default:['form-password-toggle'])always_empty: Always render empty value (default:true)trim: Trim whitespace (default:false)invalid_message: Invalid message (default:'The password is invalid.')
- Development tools:
- PHPUnit test configuration
- PHP-CS-Fixer configuration (PSR-12)
- Docker development environment
- Makefile for common development tasks
- Composer scripts for testing and code style
- Documentation:
- Complete README with usage examples
- PHPDoc documentation in English for all classes and methods
- Inline code comments in English
- The bundle automatically registers the form type service
- Templates are automatically discovered by Symfony
- No
parent_attroption (removed for simplicity) - Uses native JavaScript onclick to avoid conflicts with Live Components
- Requires Symfony UX Icon bundle for icon support