Refactor topbar HTML, projects TS and styles

Minor markup and formatting cleanup plus layout adjustments.

- topbar.component.html: removed mat-toolbar color attribute, compacted/normalized element attributes and spacing, fixed small markup spacing issues.
- projects.component.ts: code formatting and whitespace normalization (imports, property spacing, object literals, small function signature/timeout formatting); no logic changes.
- styles.scss: reorganized topbar rules (added app-topbar wrapper, display and color), switched .hero from grid to flex with responsive flex-basis, adjusted photo and intro flex behavior, increased project grid column min width and centered grid with max-width, removed featured card full-width grid span.

These changes improve consistency, readability and adjust layout/responsiveness of the topbar/hero/project grid.
This commit is contained in:
2026-02-22 12:27:20 +01:00
parent 0e78e6b471
commit c6edc922fe
3 changed files with 147 additions and 148 deletions

View File

@@ -1,11 +1,7 @@
<mat-toolbar class="topbar" color="primary" (keydown)="onKeydown($event)"> <mat-toolbar class="topbar" (keydown)="onKeydown($event)">
<a class="brand" routerLink="/"> <a class="brand" routerLink="/">
<img class="logo-dot" <img class="logo-dot" src="{{AssetsConstants.LOGO}}" alt="" aria-hidden="true" draggable="false"
src="{{AssetsConstants.LOGO}}" oncontextmenu="return false;">
alt="" aria-hidden="true"
draggable="false"
oncontextmenu="return false;"
>
<span class="brand-text">{{ 'APP.TITLE' | translate }}</span> <span class="brand-text">{{ 'APP.TITLE' | translate }}</span>
</a> </a>
@@ -17,11 +13,7 @@
</nav> </nav>
<!-- Mobile nav menu button --> <!-- Mobile nav menu button -->
<button <button mat-icon-button class="nav-menu-btn" [matMenuTriggerFor]="navMenu" aria-label="Open navigation">
mat-icon-button
class="nav-menu-btn"
[matMenuTriggerFor]="navMenu"
aria-label="Open navigation">
<mat-icon>menu</mat-icon> <mat-icon>menu</mat-icon>
</button> </button>
@@ -46,7 +38,8 @@
<span class="spacer"></span> <span class="spacer"></span>
<!-- Settings: Sprache + Theme --> <!-- Settings: Sprache + Theme -->
<button mat-icon-button [matMenuTriggerFor]="settingsMenu" aria-label="Open settings" matTooltip="{{ 'TOPBAR.SETTINGS' | translate }}"> <button mat-icon-button [matMenuTriggerFor]="settingsMenu" aria-label="Open settings"
matTooltip="{{ 'TOPBAR.SETTINGS' | translate }}">
<mat-icon>tune</mat-icon> <mat-icon>tune</mat-icon>
</button> </button>

View File

@@ -172,8 +172,7 @@ export class ProjectsComponent implements OnInit, OnDestroy {
} }
} }
private dialogOpenFunction() : void private dialogOpenFunction(): void {
{
this.queryParamSub = this.route.queryParamMap.subscribe(params => { this.queryParamSub = this.route.queryParamMap.subscribe(params => {
const projectIdentifier = params.get('project'); const projectIdentifier = params.get('project');
if (projectIdentifier) { if (projectIdentifier) {

View File

@@ -425,16 +425,21 @@ app-root {
} }
/* ---- Topbar ---- */ /* ---- Topbar ---- */
.topbar { app-topbar {
position: sticky; position: sticky;
top: 0; top: 0;
z-index: 100; z-index: 100;
display: block;
}
.topbar {
backdrop-filter: saturate(1.1) blur(8px); backdrop-filter: saturate(1.1) blur(8px);
background: color-mix(in srgb, var(--card-bg) 80%, transparent); background: color-mix(in srgb, var(--card-bg) 80%, transparent);
border-bottom: 1px solid rgba(0, 0, 0, .08); border-bottom: 1px solid rgba(0, 0, 0, .08);
display: flex; display: flex;
align-items: center; align-items: center;
padding: clamp(0.5rem, 1vw, 1rem); padding: clamp(0.5rem, 1vw, 1rem);
color: var(--app-fg);
} }
.topbar .brand { .topbar .brand {
@@ -539,8 +544,8 @@ app-root {
} }
.hero { .hero {
display: grid; display: flex;
grid-template-columns: repeat(auto-fit, minmax(min(100%, 425px), 1fr)); flex-wrap: wrap;
gap: clamp(1rem, 4vw, 1.5rem); gap: clamp(1rem, 4vw, 1.5rem);
border-radius: var(--card-radius); border-radius: var(--card-radius);
background: var(--card-bg); background: var(--card-bg);
@@ -550,7 +555,8 @@ app-root {
.hero .photo { .hero .photo {
display: flex; display: flex;
align-items: flex-start; align-items: flex-start;
justify-content: center; justify-content: flex-start;
flex: 0 0 clamp(300px, 100%, 425px);
} }
.hero .photo img { .hero .photo img {
@@ -567,6 +573,7 @@ app-root {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: clamp(0.5rem, 2vw, 1rem); gap: clamp(0.5rem, 2vw, 1rem);
flex: 1 1 300px;
} }
.hero .intro h1 { .hero .intro h1 {
@@ -748,7 +755,9 @@ app-root {
.project-grid { .project-grid {
display: grid; display: grid;
gap: clamp(1rem, 3vw, 1.5rem); gap: clamp(1rem, 3vw, 1.5rem);
grid-template-columns: repeat(auto-fill, minmax(min(100%, 350px), 1fr)); grid-template-columns: repeat(auto-fill, minmax(min(100%, 450px), 1fr));
max-width: 1200px;
margin: 0 auto;
} }
.project-card { .project-card {
@@ -763,9 +772,7 @@ app-root {
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15); box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
} }
.project-card.featured {
grid-column: 1 / -1;
}
.project-card mat-card-header { .project-card mat-card-header {
padding-bottom: 1rem; padding-bottom: 1rem;