From 9c37c639062620028def7a44a597d55065603c92 Mon Sep 17 00:00:00 2001 From: KamyCoding Date: Wed, 29 Jul 2026 19:41:04 +0200 Subject: [PATCH 1/6] chore(assets): add header visual assets --- public/assets/decorations/language-hover-de.svg | 9 +++++++++ public/assets/decorations/language-hover-en.svg | 9 +++++++++ .../assets/decorations/navigation/nav-hover-about.svg | 9 +++++++++ .../decorations/navigation/nav-hover-contact.svg | 9 +++++++++ .../decorations/navigation/nav-hover-projects.svg | 9 +++++++++ .../decorations/navigation/nav-hover-skills.svg | 9 +++++++++ public/logo.svg | 11 +++++++++++ 7 files changed, 65 insertions(+) create mode 100644 public/assets/decorations/language-hover-de.svg create mode 100644 public/assets/decorations/language-hover-en.svg create mode 100644 public/assets/decorations/navigation/nav-hover-about.svg create mode 100644 public/assets/decorations/navigation/nav-hover-contact.svg create mode 100644 public/assets/decorations/navigation/nav-hover-projects.svg create mode 100644 public/assets/decorations/navigation/nav-hover-skills.svg create mode 100644 public/logo.svg diff --git a/public/assets/decorations/language-hover-de.svg b/public/assets/decorations/language-hover-de.svg new file mode 100644 index 0000000..4d52131 --- /dev/null +++ b/public/assets/decorations/language-hover-de.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/assets/decorations/language-hover-en.svg b/public/assets/decorations/language-hover-en.svg new file mode 100644 index 0000000..263fce7 --- /dev/null +++ b/public/assets/decorations/language-hover-en.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/assets/decorations/navigation/nav-hover-about.svg b/public/assets/decorations/navigation/nav-hover-about.svg new file mode 100644 index 0000000..9012c45 --- /dev/null +++ b/public/assets/decorations/navigation/nav-hover-about.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/assets/decorations/navigation/nav-hover-contact.svg b/public/assets/decorations/navigation/nav-hover-contact.svg new file mode 100644 index 0000000..80f114b --- /dev/null +++ b/public/assets/decorations/navigation/nav-hover-contact.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/assets/decorations/navigation/nav-hover-projects.svg b/public/assets/decorations/navigation/nav-hover-projects.svg new file mode 100644 index 0000000..feb9cd4 --- /dev/null +++ b/public/assets/decorations/navigation/nav-hover-projects.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/assets/decorations/navigation/nav-hover-skills.svg b/public/assets/decorations/navigation/nav-hover-skills.svg new file mode 100644 index 0000000..8732dc9 --- /dev/null +++ b/public/assets/decorations/navigation/nav-hover-skills.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/logo.svg b/public/logo.svg new file mode 100644 index 0000000..dead462 --- /dev/null +++ b/public/logo.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + From eadb8d4b0beda6ae8ee29c46654c53cd5678ee36 Mon Sep 17 00:00:00 2001 From: KamyCoding Date: Wed, 29 Jul 2026 20:10:40 +0200 Subject: [PATCH 2/6] feat(header): implement desktop navigation and language switch --- src/app/layout/header/header.html | 147 ++++++++++++++++++++++++++++++ src/app/layout/header/header.ts | 12 ++- 2 files changed, 156 insertions(+), 3 deletions(-) diff --git a/src/app/layout/header/header.html b/src/app/layout/header/header.html index e69de29..c5fb186 100644 --- a/src/app/layout/header/header.html +++ b/src/app/layout/header/header.html @@ -0,0 +1,147 @@ +
+
+ + + Kamycoding + + + + + + + +
+
diff --git a/src/app/layout/header/header.ts b/src/app/layout/header/header.ts index 6aa2613..8bc1de7 100644 --- a/src/app/layout/header/header.ts +++ b/src/app/layout/header/header.ts @@ -1,9 +1,15 @@ -import { Component } from '@angular/core'; +import { Component, signal } from '@angular/core'; +import { RouterLink } from '@angular/router'; @Component({ selector: 'app-header', - imports: [], + imports: [RouterLink], templateUrl: './header.html', styleUrl: './header.css', }) -export class Header {} +export class Header { + protected readonly activeLanguage = signal<'en' | 'de'>('en'); + protected toggleLanguage(): void { + this.activeLanguage.update((language) => (language === 'en' ? 'de' : 'en')); + } +} From 151c35d6942de5bf8fd0919b8f16c0d67d3c592e Mon Sep 17 00:00:00 2001 From: KamyCoding Date: Thu, 30 Jul 2026 12:58:13 +0200 Subject: [PATCH 3/6] chore(assets): add mobile nav assets --- .../backgrounds/mobile-menu-background.webp | Bin 0 -> 52194 bytes public/assets/icons/navigation/close-active.svg | 15 +++++++++++++++ public/assets/icons/navigation/menu-active.svg | 15 +++++++++++++++ public/assets/icons/navigation/menu-close.svg | 8 ++++++++ public/assets/icons/navigation/menu-open.svg | 8 ++++++++ public/assets/icons/social/email.svg | 9 +++++++++ public/assets/icons/social/github.svg | 4 ++++ public/assets/icons/social/linkedin.svg | 4 ++++ 8 files changed, 63 insertions(+) create mode 100644 public/assets/backgrounds/mobile-menu-background.webp create mode 100644 public/assets/icons/navigation/close-active.svg create mode 100644 public/assets/icons/navigation/menu-active.svg create mode 100644 public/assets/icons/navigation/menu-close.svg create mode 100644 public/assets/icons/navigation/menu-open.svg create mode 100644 public/assets/icons/social/email.svg create mode 100644 public/assets/icons/social/github.svg create mode 100644 public/assets/icons/social/linkedin.svg diff --git a/public/assets/backgrounds/mobile-menu-background.webp b/public/assets/backgrounds/mobile-menu-background.webp new file mode 100644 index 0000000000000000000000000000000000000000..5188c517f08ffd5d79e76777b85e3520cf2bce05 GIT binary patch literal 52194 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

bB#2<&1VGnqj@bhkhK}+7&sst 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 + + + + + + + + + + + + + + diff --git a/public/assets/icons/navigation/menu-active.svg b/public/assets/icons/navigation/menu-active.svg new file mode 100644 index 0000000..e30f3f6 --- /dev/null +++ b/public/assets/icons/navigation/menu-active.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/public/assets/icons/navigation/menu-close.svg b/public/assets/icons/navigation/menu-close.svg new file mode 100644 index 0000000..dc5c87d --- /dev/null +++ b/public/assets/icons/navigation/menu-close.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/public/assets/icons/navigation/menu-open.svg b/public/assets/icons/navigation/menu-open.svg new file mode 100644 index 0000000..f3cb6d0 --- /dev/null +++ b/public/assets/icons/navigation/menu-open.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/public/assets/icons/social/email.svg b/public/assets/icons/social/email.svg new file mode 100644 index 0000000..3d3ace8 --- /dev/null +++ b/public/assets/icons/social/email.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/assets/icons/social/github.svg b/public/assets/icons/social/github.svg new file mode 100644 index 0000000..2e80b2f --- /dev/null +++ b/public/assets/icons/social/github.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/assets/icons/social/linkedin.svg b/public/assets/icons/social/linkedin.svg new file mode 100644 index 0000000..0f48519 --- /dev/null +++ b/public/assets/icons/social/linkedin.svg @@ -0,0 +1,4 @@ + + + + From 3b1003a32459b53de173948552b286f6030ca21a Mon Sep 17 00:00:00 2001 From: KamyCoding Date: Sat, 1 Aug 2026 14:24:06 +0200 Subject: [PATCH 4/6] feat(header): add responsive mobile navigation --- src/app/layout/header/header.html | 237 ++++++++++++++++++-------- src/app/layout/header/header.model.ts | 13 ++ src/app/layout/header/header.ts | 81 ++++++++- 3 files changed, 256 insertions(+), 75 deletions(-) create mode 100644 src/app/layout/header/header.model.ts diff --git a/src/app/layout/header/header.html b/src/app/layout/header/header.html index c5fb186..47d8190 100644 --- a/src/app/layout/header/header.html +++ b/src/app/layout/header/header.html @@ -1,8 +1,43 @@

+ +
+ + + Kamycoding + + + + +
+ +
@@ -14,77 +49,23 @@ @@ -145,3 +126,113 @@
+ + +
+
+ + + + + +
+ +
+ + + + +
+ + +
+ @for (item of socialLinks; track item.id) { + + + + } +
+
diff --git a/src/app/layout/header/header.model.ts b/src/app/layout/header/header.model.ts new file mode 100644 index 0000000..c0c2e38 --- /dev/null +++ b/src/app/layout/header/header.model.ts @@ -0,0 +1,13 @@ +export interface NavigationItem { + readonly label: string; + readonly fragment: string; + readonly hoverDecorationSrc: string; +} + +export interface SocialLink { + readonly id: string; + readonly href: string; + readonly accessibleLabel: string; + readonly iconSrc: string; + readonly opensInNewTab: boolean; +} diff --git a/src/app/layout/header/header.ts b/src/app/layout/header/header.ts index 8bc1de7..bddf195 100644 --- a/src/app/layout/header/header.ts +++ b/src/app/layout/header/header.ts @@ -1,15 +1,92 @@ -import { Component, signal } from '@angular/core'; +import { Component, HostListener, OnDestroy, signal, ElementRef, viewChild } from '@angular/core'; import { RouterLink } from '@angular/router'; +import type { NavigationItem, SocialLink } from './header.model'; + @Component({ selector: 'app-header', imports: [RouterLink], templateUrl: './header.html', styleUrl: './header.css', }) -export class Header { +export class Header implements OnDestroy { protected readonly activeLanguage = signal<'en' | 'de'>('en'); + protected readonly isMobileMenuOpen = signal(false); + private readonly openMenuButton = + viewChild.required>('openMenuButton'); + private readonly closeMenuButton = + viewChild.required>('closeMenuButton'); + + protected readonly navigationItems: readonly NavigationItem[] = [ + { + label: 'About me', + fragment: 'about', + hoverDecorationSrc: '/assets/decorations/navigation/nav-hover-about.svg', + }, + { + label: 'Skills', + fragment: 'skills', + hoverDecorationSrc: '/assets/decorations/navigation/nav-hover-skills.svg', + }, + { + label: 'Projects', + fragment: 'projects', + hoverDecorationSrc: '/assets/decorations/navigation/nav-hover-projects.svg', + }, + { + label: 'Contact', + fragment: 'contact', + hoverDecorationSrc: '/assets/decorations/navigation/nav-hover-contact.svg', + }, + ]; + + protected readonly socialLinks: readonly SocialLink[] = [ + { + id: 'linkedin', + href: 'https://www.linkedin.com/in/kamyarzamanfar/', + accessibleLabel: 'Visit LinkedIn profile', + iconSrc: '/assets/icons/social/linkedin.svg', + opensInNewTab: true, + }, + { + id: 'github', + href: 'https://github.com/kamycoding', + accessibleLabel: 'Visit GitHub profile', + iconSrc: '/assets/icons/social/github.svg', + opensInNewTab: true, + }, + + { + id: 'email', + href: 'mailto:kamyar.zamanfar@gmail.com', + accessibleLabel: 'Send an email', + iconSrc: '/assets/icons/social/email.svg', + opensInNewTab: false, + }, + ]; + protected toggleLanguage(): void { this.activeLanguage.update((language) => (language === 'en' ? 'de' : 'en')); } + + protected openMobileMenu(): void { + this.isMobileMenuOpen.set(true); + document.body.style.overflow = 'hidden'; + } + + protected closeMobileMenu(): void { + this.isMobileMenuOpen.set(false); + document.body.style.overflow = ''; + } + + @HostListener('document:keydown.escape') + protected onEscape(): void { + if (this.isMobileMenuOpen()) { + this.closeMobileMenu(); + } + } + + ngOnDestroy(): void { + document.body.style.overflow = ''; + } } From f69e44dbd62003612b0a2c8d3f4546331d257510 Mon Sep 17 00:00:00 2001 From: KamyCoding Date: Sat, 1 Aug 2026 14:24:17 +0200 Subject: [PATCH 5/6] chore(layout): remove placeholder content --- src/app/layout/footer/footer.html | 1 - src/app/pages/home/home.html | 2 -- 2 files changed, 3 deletions(-) diff --git a/src/app/layout/footer/footer.html b/src/app/layout/footer/footer.html index 28c0d7d..e69de29 100644 --- a/src/app/layout/footer/footer.html +++ b/src/app/layout/footer/footer.html @@ -1 +0,0 @@ -

footer works!

diff --git a/src/app/pages/home/home.html b/src/app/pages/home/home.html index 0d9d7b5..e69de29 100644 --- a/src/app/pages/home/home.html +++ b/src/app/pages/home/home.html @@ -1,2 +0,0 @@ -

Frontend

-

Kamy :)

From 9c1b12dd71133f1f343b6538f2bda958a33a670c Mon Sep 17 00:00:00 2001 From: KamyCoding Date: Mon, 3 Aug 2026 10:17:12 +0200 Subject: [PATCH 6/6] refactor(header): finalize responsive navigation behavior --- src/app/app.config.ts | 11 +++- src/app/layout/header/header.css | 0 src/app/layout/header/header.html | 54 ++++++++++------ src/app/layout/header/header.spec.ts | 22 ------- src/app/layout/header/header.ts | 97 ++++++++++++++++++++++++---- 5 files changed, 130 insertions(+), 54 deletions(-) delete mode 100644 src/app/layout/header/header.css delete mode 100644 src/app/layout/header/header.spec.ts diff --git a/src/app/app.config.ts b/src/app/app.config.ts index cb1270e..166836f 100644 --- a/src/app/app.config.ts +++ b/src/app/app.config.ts @@ -1,11 +1,16 @@ import { ApplicationConfig, provideBrowserGlobalErrorListeners } from '@angular/core'; -import { provideRouter } from '@angular/router'; +import { provideRouter, withInMemoryScrolling } from '@angular/router'; import { routes } from './app.routes'; export const appConfig: ApplicationConfig = { providers: [ provideBrowserGlobalErrorListeners(), - provideRouter(routes) - ] + provideRouter( + routes, + withInMemoryScrolling({ + anchorScrolling: 'enabled', + }), + ), + ], }; diff --git a/src/app/layout/header/header.css b/src/app/layout/header/header.css deleted file mode 100644 index e69de29..0000000 diff --git a/src/app/layout/header/header.html b/src/app/layout/header/header.html index 47d8190..9cd7b7d 100644 --- a/src/app/layout/header/header.html +++ b/src/app/layout/header/header.html @@ -4,8 +4,12 @@
- - Kamycoding + + @@ -25,6 +29,7 @@ aria-hidden="true" draggable="false" /> + - - Kamycoding + + @@ -52,11 +61,12 @@ @for (item of navigationItems; track item.fragment) {
  • {{ item.label }} + - + EN - + DE
    - + @@ -147,12 +160,14 @@ class="group inline-flex size-11 items-center justify-center focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary" type="button" aria-label="Close navigation menu" + aria-controls="mobile-navigation" (click)="closeMobileMenu()" > @@ -160,12 +175,14 @@ class="hidden size-8 group-active:block" src="/assets/icons/navigation/close-active.svg" alt="" + aria-hidden="true" draggable="false" />
    + - +
    - +
    @for (item of socialLinks; track item.id) { diff --git a/src/app/layout/header/header.spec.ts b/src/app/layout/header/header.spec.ts deleted file mode 100644 index 9ef7403..0000000 --- a/src/app/layout/header/header.spec.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { Header } from './header'; - -describe('Header', () => { - let component: Header; - let fixture: ComponentFixture
    ; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [Header], - }).compileComponents(); - - fixture = TestBed.createComponent(Header); - component = fixture.componentInstance; - await fixture.whenStable(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/layout/header/header.ts b/src/app/layout/header/header.ts index bddf195..43c35ef 100644 --- a/src/app/layout/header/header.ts +++ b/src/app/layout/header/header.ts @@ -1,22 +1,41 @@ -import { Component, HostListener, OnDestroy, signal, ElementRef, viewChild } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { + afterNextRender, + Component, + HostListener, + inject, + Injector, + signal, + viewChild, +} from '@angular/core'; +import type { ElementRef, OnDestroy } from '@angular/core'; import { RouterLink } from '@angular/router'; import type { NavigationItem, SocialLink } from './header.model'; +const DESKTOP_MEDIA_QUERY = '(min-width: 64rem)'; + @Component({ selector: 'app-header', imports: [RouterLink], templateUrl: './header.html', - styleUrl: './header.css', }) export class Header implements OnDestroy { - protected readonly activeLanguage = signal<'en' | 'de'>('en'); - protected readonly isMobileMenuOpen = signal(false); + private readonly document = inject(DOCUMENT); + private readonly injector = inject(Injector); + private readonly openMenuButton = viewChild.required>('openMenuButton'); + private readonly closeMenuButton = viewChild.required>('closeMenuButton'); + private previousBodyOverflow = ''; + private isBodyScrollLocked = false; + + protected readonly activeLanguage = signal<'en' | 'de'>('en'); + protected readonly isMobileMenuOpen = signal(false); + protected readonly navigationItems: readonly NavigationItem[] = [ { label: 'About me', @@ -55,7 +74,6 @@ export class Header implements OnDestroy { iconSrc: '/assets/icons/social/github.svg', opensInNewTab: true, }, - { id: 'email', href: 'mailto:kamyar.zamanfar@gmail.com', @@ -70,23 +88,80 @@ export class Header implements OnDestroy { } protected openMobileMenu(): void { + if (this.isMobileMenuOpen()) { + return; + } + this.isMobileMenuOpen.set(true); - document.body.style.overflow = 'hidden'; + this.lockBodyScroll(); + + afterNextRender( + () => { + if (this.isMobileMenuOpen()) { + this.closeMenuButton().nativeElement.focus({ + preventScroll: true, + }); + } + }, + { + injector: this.injector, + }, + ); } - protected closeMobileMenu(): void { + protected closeMobileMenu(restoreFocus = true): void { + if (!this.isMobileMenuOpen()) { + return; + } + + if (restoreFocus) { + this.openMenuButton().nativeElement.focus({ + preventScroll: true, + }); + } + this.isMobileMenuOpen.set(false); - document.body.style.overflow = ''; + this.restoreBodyScroll(); } @HostListener('document:keydown.escape') protected onEscape(): void { - if (this.isMobileMenuOpen()) { - this.closeMobileMenu(); + if (!this.isMobileMenuOpen()) { + return; + } + + this.closeMobileMenu(); + } + + @HostListener('window:resize') + protected onViewportResize(): void { + const isDesktop = this.document.defaultView?.matchMedia(DESKTOP_MEDIA_QUERY).matches ?? false; + + if (isDesktop) { + this.closeMobileMenu(false); } } ngOnDestroy(): void { - document.body.style.overflow = ''; + this.restoreBodyScroll(); + } + + private lockBodyScroll(): void { + if (this.isBodyScrollLocked) { + return; + } + + this.previousBodyOverflow = this.document.body.style.overflow; + this.document.body.style.overflow = 'hidden'; + this.isBodyScrollLocked = true; + } + + private restoreBodyScroll(): void { + if (!this.isBodyScrollLocked) { + return; + } + + this.document.body.style.overflow = this.previousBodyOverflow; + this.isBodyScrollLocked = false; } }