π Release Notes for Version 2.2.0
π Release Date: July 2026
π Critical Bug Fixes
β Runtime & Memory Issues Resolved
- Removed duplicate
<router-outlet>fromHeaderComponentβ every routed page was being rendered twice, doubling DOM elements and lifecycle calls - Fixed
setTimeoutmemory leak inHomeComponentβ the recursive typing animation timer now stores its ID and is properly cancelled inngOnDestroy, preventing background timer accumulation after navigation - Added
implements OnInittoFooterComponentβ lifecycle hook is now enforced at compile time instead of relying on duck typing
π§ Important Fixes
βοΈ Configuration & Providers
- Removed conflicting animation providers β
provideAnimations()andprovideAnimationsAsync()were both registered; only the modern async variant is kept
π¨ UI & Template Fixes
- Fixed duplicate
classattribute on header brand link βnavbar-brandandtext-lightclasses were being silently discarded by the browser - Fixed invalid Pydantic tag color β double
##in the CSS color value caused the tag to render with no background - Removed duplicate
Tag.LOMBOKentries in two portfolio project tag arrays (Tutor Mate API, Library Manager API) - Fixed missing
pxunit on cardmin-widthβ unitless value was ignored by the browser; constraint moved to component CSS - Fixed
@fortrack expression inCardComponentβ was tracking by parent array reference; now tracks by individual tag item - Added
Portfolioheading to the portfolio section for visual consistency with other pages
π Security
- Added
rel="noopener noreferrer"to alltarget="_blank"external links acrossheader,footer,contact, andmodaltemplates β prevents tabnapping attacks
βΏ Accessibility & HTML Validity
- Replaced
<button><a>anti-pattern inhome,about, andcontacttemplates with properly styled standalone<a>elements β fixes invalid HTML nesting and broken keyboard navigation - Updated contact image alt text from
"Contact Image"to"Barbara Calderon"
π₯οΈ Modal Component
- Replaced global
document.querySelectorwith@ViewChild('swiperRef')β component no longer queries outside its own DOM, fixing a fragile global selector
ποΈ Structural Improvements
π Code Organisation
- Extracted project data from
PortfolioComponentintosrc/app/data/projects.data.tsβ component now holds presentation logic only; data is independently readable and maintainable - Renamed Skills β Education across the codebase β route path (
/skillsβ/education), component class (SkillsComponentβEducationComponent), files, selector, and nav link now all match the displayed content - Removed unused
customClassproperty fromAccordionComponent - Removed empty
providers: []fromPortfolioComponentdecorator
π§Ή Minor Cleanup
- Updated
<title>inindex.htmlfrom the default Angular scaffold value to"Barbara Calderon | Software Engineer" - Fixed typo "Brazillian" β "Brazilian" in accordion content
π§ͺ Testing & Quality
π New Spec Files
card.component.spec.tsβ 5 tests covering component creation,card.namerendering,card.summaryrendering, tag chip count, and modal dialog opening on button clickmodal.component.spec.tsβ 6 tests covering component creation,MAT_DIALOG_DATAassignment, title/description/tag rendering, and close button behaviour
β All Tests Pass
- 33 tests across 6 spec files β all passing
π What This Release Demonstrates
- β Correct Angular lifecycle management β no dangling timers or unimplemented interfaces
- β
Secure external linking β all
target="_blank"anchors protected - β Valid, accessible HTML β no illegal element nesting, descriptive alt text
- β Separation of concerns β data, presentation, and routing are cleanly separated
- β Meaningful test coverage β key components verified with real assertions