Rather than approaching modernization as a complete rewrite, I incrementally introduced architectural changes that reduced coupling between concerns. Visualization responsibilities were migrated from D3-heavy implementations toward reusable Recharts components to standardize chart behavior and reduce custom rendering complexity. Existing Immutable.js-based state management patterns were gradually replaced with Redux Toolkit, simplifying reducer logic and making state transitions easier to understand and maintain.
To improve separation of concerns, presentation components were decoupled from state orchestration and event-handling logic. Shared visualization patterns, filtering behavior, and reusable UI elements were extracted into composable modules, allowing new screens and reporting requirements to be implemented without duplicating existing implementations. End-to-end tests using Cypress were expanded to provide confidence during iterative refactoring and reduce the risk associated with releasing incremental changes.