From 713ab3b2d959c198445bb9c9d48314af264d08f7 Mon Sep 17 00:00:00 2001 From: Nessar Date: Thu, 16 Jul 2026 20:46:22 +0200 Subject: [PATCH] feat: integrate FontAwesome icons across various components - Updated apartment-list component to use FontAwesome icons for better visual representation. - Refactored brand-mark component to utilize FontAwesome for the brand icon. - Enhanced dashboard-page with FontAwesome icons for improved navigation. - Replaced SVG icons with FontAwesome in settings-page for consistency and better performance. - Updated sign-in-page to use FontAwesome for the sign-in action icon. - Refactored tenant-card to incorporate FontAwesome icons for attachments. - Enhanced workspace-navigation with FontAwesome icons for all navigation items. - Applied consistent styling for fa-icon elements across components. --- frontend/e2e/app.spec.ts | 8 + .../apartment-list/apartment-list.css | 260 ++++++++------ .../apartment-list/apartment-list.html | 201 +++++------ .../apartment-list/apartment-list.ts | 6 +- frontend/src/app/components/brand-mark.ts | 22 +- .../dashboard-page/dashboard-page.css | 7 +- .../dashboard-page/dashboard-page.html | 5 +- .../dashboard-page/dashboard-page.ts | 5 +- .../settings-page/settings-page.css | 7 +- .../settings-page/settings-page.html | 11 +- .../components/settings-page/settings-page.ts | 10 +- .../components/sign-in-page/sign-in-page.css | 7 +- .../components/sign-in-page/sign-in-page.html | 10 +- .../components/sign-in-page/sign-in-page.ts | 5 +- .../components/tenant-card/tenant-card.css | 12 + .../workspace-navigation.css | 330 ++++++++++-------- .../workspace-navigation.html | 61 +--- .../workspace-navigation.ts | 15 +- frontend/src/styles.scss | 8 + 19 files changed, 534 insertions(+), 456 deletions(-) diff --git a/frontend/e2e/app.spec.ts b/frontend/e2e/app.spec.ts index 038a586..ba824ea 100644 --- a/frontend/e2e/app.spec.ts +++ b/frontend/e2e/app.spec.ts @@ -86,6 +86,14 @@ test('adapts authenticated navigation to the viewport', async ({ page }, testInf expect(Math.round((navigationBox?.y ?? 0) + (navigationBox?.height ?? 0))).toBe( viewport?.height, ); + for (const button of await navigation.locator('.navigation-item').all()) { + const buttonBox = await button.boundingBox(); + const labelBox = await button.locator('.mdc-button__label > span').boundingBox(); + expect(buttonBox).not.toBeNull(); + expect(labelBox).not.toBeNull(); + expect(labelBox!.x).toBeGreaterThanOrEqual(buttonBox!.x); + expect(labelBox!.x + labelBox!.width).toBeLessThanOrEqual(buttonBox!.x + buttonBox!.width); + } } await navigation.getByRole('button', { name: 'Appartements' }).click(); diff --git a/frontend/src/app/components/apartment-list/apartment-list.css b/frontend/src/app/components/apartment-list/apartment-list.css index 1d7eca2..1986c39 100644 --- a/frontend/src/app/components/apartment-list/apartment-list.css +++ b/frontend/src/app/components/apartment-list/apartment-list.css @@ -1,166 +1,204 @@ :host { - display: block; + display: block; } + .page-heading { - margin-bottom: 30px; + margin-bottom: 30px; } -.content-region > mat-progress-bar { - margin-bottom: 16px; + +.content-region>mat-progress-bar { + margin-bottom: 16px; } + .refresh-error { - margin-bottom: 16px; + margin-bottom: 16px; } + .page-heading h1 { - margin-bottom: 8px; - font-size: clamp(2rem, 7vw, 3.2rem); - font-weight: 750; - letter-spacing: -0.055em; - line-height: 1.02; + margin-bottom: 8px; + font-size: clamp(2rem, 7vw, 3.2rem); + font-weight: 750; + letter-spacing: -0.055em; + line-height: 1.02; } -.page-heading > div > p:last-child { - margin-bottom: 0; - color: var(--text-muted); - line-height: 1.6; + +.page-heading>div>p:last-child { + margin-bottom: 0; + color: var(--text-muted); + line-height: 1.6; } + .page-heading .primary-action { - width: 100%; - margin-top: 20px; -} -.button-plus { - margin-right: 4px; - font-size: 1.25rem; - font-weight: 400; + width: 100%; + margin-top: 20px; } + .empty-state, .apartment-card { - border: 1px solid var(--border); - border-radius: 22px; - background: var(--surface); - box-shadow: 0 1px 0 rgba(255, 255, 255, 0.04); + border: 1px solid var(--border); + border-radius: 22px; + background: var(--surface); + box-shadow: 0 1px 0 rgba(255, 255, 255, 0.04); } + .empty-state { - padding: 46px 22px; - text-align: center; + padding: 46px 22px; + text-align: center; } + .empty-illustration { - display: grid; - width: 68px; - height: 68px; - place-items: center; - margin: 0 auto 22px; - border-radius: 16px; - background: var(--surface-accent); - color: var(--accent); + display: grid; + width: 68px; + height: 68px; + place-items: center; + margin: 0 auto 22px; + border-radius: 16px; + background: var(--surface-accent); + color: var(--accent); } -.empty-illustration svg { - width: 34px; - height: 34px; + +.empty-illustration fa-icon { + display: flex; + width: 34px; + height: 34px; } + +.empty-illustration fa-icon svg { + width: 100%; + height: 100%; +} + .empty-state h2 { - margin-bottom: 8px; - font-size: 1.45rem; + margin-bottom: 8px; + font-size: 1.45rem; } -.empty-state > p:not(.eyebrow) { - max-width: 440px; - margin: 0 auto 22px; - color: var(--text-muted); - line-height: 1.6; + +.empty-state>p:not(.eyebrow) { + max-width: 440px; + margin: 0 auto 22px; + color: var(--text-muted); + line-height: 1.6; } + .empty-state .mat-mdc-outlined-button { - --mdc-outlined-button-label-text-color: var(--accent); - --mdc-outlined-button-outline-color: var(--border-strong); - border-radius: 12px; + --mdc-outlined-button-label-text-color: var(--accent); + --mdc-outlined-button-outline-color: var(--border-strong); + border-radius: 12px; } + .apartments-grid { - display: grid; - grid-template-columns: 1fr; - gap: 16px; + display: grid; + grid-template-columns: 1fr; + gap: 16px; } + .apartment-card { - padding: 20px; + padding: 20px; } + .apartment-card-topline { - display: flex; - align-items: baseline; - justify-content: space-between; - gap: 14px; - margin-bottom: 22px; + display: flex; + align-items: baseline; + justify-content: space-between; + gap: 14px; + margin-bottom: 22px; } + .property-label { - margin: 0; + margin: 0; } + .property-value { - font-size: 1rem; - font-weight: 800; + font-size: 1rem; + font-weight: 800; } + .apt-info h2 { - margin-bottom: 9px; - font-size: 1.35rem; - letter-spacing: -0.035em; + margin-bottom: 9px; + font-size: 1.35rem; + letter-spacing: -0.035em; } + .apt-address { - display: flex; - align-items: flex-start; - gap: 8px; - margin-bottom: 12px; - color: var(--text-muted); - font-size: 0.88rem; - line-height: 1.5; + display: flex; + align-items: flex-start; + gap: 8px; + margin-bottom: 12px; + color: var(--text-muted); + font-size: 0.88rem; + line-height: 1.5; } -.apt-address svg { - width: 17px; - height: 17px; - flex: 0 0 17px; - margin-top: 2px; + +.apt-address fa-icon { + display: flex; + width: 17px; + height: 17px; + flex: 0 0 17px; + margin-top: 2px; } + +.apt-address fa-icon svg { + width: 100%; + height: 100%; +} + .apt-desc { - margin-bottom: 0; - color: var(--text-muted); - font-size: 0.88rem; - line-height: 1.55; + margin-bottom: 0; + color: var(--text-muted); + font-size: 0.88rem; + line-height: 1.55; } + .apt-actions { - display: flex; - gap: 4px; - justify-content: flex-end; - margin-top: 20px; - padding-top: 12px; - border-top: 1px solid var(--border); + display: flex; + gap: 4px; + justify-content: flex-end; + margin-top: 20px; + padding-top: 12px; + border-top: 1px solid var(--border); } + .apt-actions .mat-mdc-button { - --mdc-text-button-label-text-color: var(--accent); + --mdc-text-button-label-text-color: var(--accent); } + .apt-actions .danger-action.mat-mdc-button { - --mdc-text-button-label-text-color: var(--danger); + --mdc-text-button-label-text-color: var(--danger); } + .apt-actions mat-spinner { - display: inline-block; - margin-right: 6px; - vertical-align: middle; + display: inline-block; + margin-right: 6px; + vertical-align: middle; } + .card-error { - margin: 14px 0 0; - color: var(--danger); - font-size: 0.84rem; + margin: 14px 0 0; + color: var(--danger); + font-size: 0.84rem; } + @media (min-width: 700px) { - .page-heading { - display: flex; - align-items: flex-end; - justify-content: space-between; - gap: 28px; - } - .page-heading .primary-action { - width: auto; - flex: 0 0 auto; - margin-top: 0; - } - .apartments-grid { - grid-template-columns: repeat(2, minmax(0, 1fr)); - } + .page-heading { + display: flex; + align-items: flex-end; + justify-content: space-between; + gap: 28px; + } + + .page-heading .primary-action { + width: auto; + flex: 0 0 auto; + margin-top: 0; + } + + .apartments-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } } + @media (min-width: 1180px) { - .apartments-grid { - grid-template-columns: repeat(3, minmax(0, 1fr)); - } -} + .apartments-grid { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } +} \ No newline at end of file diff --git a/frontend/src/app/components/apartment-list/apartment-list.html b/frontend/src/app/components/apartment-list/apartment-list.html index e32595e..6a5467e 100644 --- a/frontend/src/app/components/apartment-list/apartment-list.html +++ b/frontend/src/app/components/apartment-list/apartment-list.html @@ -1,117 +1,92 @@
-
-

Portefeuille

-

Mes appartements

-

Les biens rattachés à votre activité LMNP.

-
- +
+

Portefeuille

+

Mes appartements

+

Les biens rattachés à votre activité LMNP.

+
+
- @if (loadState().loaded && loadState().loading) { - - } - @if (loadState().loaded && loadState().error) { - - } - @if (!loadState().loaded && loadState().loading) { -
- @for (placeholder of [1, 2, 3]; track placeholder) { - - } -
- } @else if (!loadState().loaded && loadState().error) { - - } @else if (apartments().length === 0) { -
- -

Commencez ici

-

Aucun appartement enregistré

-

Ajoutez votre premier bien pour construire votre portefeuille.

- -
- } @else { -
- @for (apt of apartments(); track apt.id) { -
-
- Bien immobilier - {{ apt.purchasePrice.toLocaleString('fr-FR') }} € -
-
-

{{ apt.name }}

-

- - {{ apt.address }} -

- @if (apt.description) { -

{{ apt.description }}

- } -
- @if (apt.id && deleteErrors()[apt.id]) { - - } -
- - @if (apt.id) { - - } -
-
- } -
- } -
+ @if (loadState().loaded && loadState().loading) { + + } + @if (loadState().loaded && loadState().error) { + + } + @if (!loadState().loaded && loadState().loading) { +
+ @for (placeholder of [1, 2, 3]; track placeholder) { + + } +
+ } @else if (!loadState().loaded && loadState().error) { + + } @else if (apartments().length === 0) { +
+ +

Commencez ici

+

Aucun appartement enregistré

+

Ajoutez votre premier bien pour construire votre portefeuille.

+ +
+ } @else { +
+ @for (apt of apartments(); track apt.id) { +
+
+ Bien immobilier + {{ apt.purchasePrice.toLocaleString('fr-FR') }} € +
+
+

{{ apt.name }}

+

+

+ @if (apt.description) { +

{{ apt.description }}

+ } +
+ @if (apt.id && deleteErrors()[apt.id]) { + + } +
+ + @if (apt.id) { + + } +
+
+ } +
+ } + \ No newline at end of file diff --git a/frontend/src/app/components/apartment-list/apartment-list.ts b/frontend/src/app/components/apartment-list/apartment-list.ts index a59ea7e..4fd383e 100644 --- a/frontend/src/app/components/apartment-list/apartment-list.ts +++ b/frontend/src/app/components/apartment-list/apartment-list.ts @@ -1,4 +1,6 @@ import { Component, input, output } from '@angular/core'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { faHouse, faLocationDot } from '@fortawesome/free-solid-svg-icons'; import { MatButtonModule } from '@angular/material/button'; import { MatProgressBarModule } from '@angular/material/progress-bar'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; @@ -7,11 +9,13 @@ import { LoadState } from '../../services/workspace-resource'; @Component({ selector: 'app-apartment-list', - imports: [MatButtonModule, MatProgressBarModule, MatProgressSpinnerModule], + imports: [FontAwesomeModule, MatButtonModule, MatProgressBarModule, MatProgressSpinnerModule], templateUrl: './apartment-list.html', styleUrl: './apartment-list.css', }) export class ApartmentList { + readonly faHouse = faHouse; + readonly faLocationDot = faLocationDot; readonly apartments = input.required(); readonly loadState = input.required(); readonly deletingIds = input>(new Set()); diff --git a/frontend/src/app/components/brand-mark.ts b/frontend/src/app/components/brand-mark.ts index 5edebd6..cd8c6fd 100644 --- a/frontend/src/app/components/brand-mark.ts +++ b/frontend/src/app/components/brand-mark.ts @@ -1,24 +1,30 @@ import { Component } from '@angular/core'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { faHouse } from '@fortawesome/free-solid-svg-icons'; @Component({ selector: 'app-brand-mark', - template: ` - - - - - `, + imports: [FontAwesomeModule], + template: ` `, styles: ` :host { display: grid; place-items: center; } - svg { + fa-icon { + display: flex; width: 55%; height: 55%; } + + fa-icon svg { + width: 100%; + height: 100%; + } `, host: { 'aria-hidden': 'true' }, }) -export class BrandMark {} +export class BrandMark { + readonly faHouse = faHouse; +} diff --git a/frontend/src/app/components/dashboard-page/dashboard-page.css b/frontend/src/app/components/dashboard-page/dashboard-page.css index aa05e6f..ac2d5b9 100644 --- a/frontend/src/app/components/dashboard-page/dashboard-page.css +++ b/frontend/src/app/components/dashboard-page/dashboard-page.css @@ -104,10 +104,15 @@ background: var(--surface); color: var(--accent); } -.feature-icon svg { +.feature-icon fa-icon { + display: flex; width: 24px; height: 24px; } +.feature-icon fa-icon svg { + width: 100%; + height: 100%; +} .user-profile { display: flex; align-items: center; diff --git a/frontend/src/app/components/dashboard-page/dashboard-page.html b/frontend/src/app/components/dashboard-page/dashboard-page.html index 87d095b..7b8b044 100644 --- a/frontend/src/app/components/dashboard-page/dashboard-page.html +++ b/frontend/src/app/components/dashboard-page/dashboard-page.html @@ -13,10 +13,7 @@ [attr.aria-busy]="workspace.apartmentLoadState().loading" >

Votre portefeuille

diff --git a/frontend/src/app/components/dashboard-page/dashboard-page.ts b/frontend/src/app/components/dashboard-page/dashboard-page.ts index 4f8a9c3..1b192a3 100644 --- a/frontend/src/app/components/dashboard-page/dashboard-page.ts +++ b/frontend/src/app/components/dashboard-page/dashboard-page.ts @@ -1,4 +1,6 @@ import { Component, computed, inject, signal } from '@angular/core'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { faTableCellsLarge } from '@fortawesome/free-solid-svg-icons'; import { HttpClient } from '@angular/common/http'; import { Router } from '@angular/router'; import { MatButtonModule } from '@angular/material/button'; @@ -8,11 +10,12 @@ import { WorkspaceService } from '../../services/workspace.service'; @Component({ selector: 'app-dashboard-page', - imports: [MatButtonModule, MatProgressBarModule], + imports: [FontAwesomeModule, MatButtonModule, MatProgressBarModule], templateUrl: './dashboard-page.html', styleUrl: './dashboard-page.css', }) export class DashboardPage { + readonly faTableCellsLarge = faTableCellsLarge; private readonly http = inject(HttpClient); private readonly router = inject(Router); readonly session = inject(SessionService); diff --git a/frontend/src/app/components/settings-page/settings-page.css b/frontend/src/app/components/settings-page/settings-page.css index 6f5f855..a79af4e 100644 --- a/frontend/src/app/components/settings-page/settings-page.css +++ b/frontend/src/app/components/settings-page/settings-page.css @@ -61,10 +61,15 @@ background: var(--surface-accent); color: var(--accent); } -.settings-icon svg { +.settings-icon fa-icon { + display: flex; width: 24px; height: 24px; } +.settings-icon fa-icon svg { + width: 100%; + height: 100%; +} .settings-copy h2 { margin-bottom: 5px; } diff --git a/frontend/src/app/components/settings-page/settings-page.html b/frontend/src/app/components/settings-page/settings-page.html index 6d7a21b..e19801b 100644 --- a/frontend/src/app/components/settings-page/settings-page.html +++ b/frontend/src/app/components/settings-page/settings-page.html @@ -8,10 +8,7 @@
- +

Interface

Apparence

@@ -47,11 +44,7 @@ aria-labelledby="session-heading" >
- +

Compte

Session

diff --git a/frontend/src/app/components/settings-page/settings-page.ts b/frontend/src/app/components/settings-page/settings-page.ts index 53c78c0..2a6e21a 100644 --- a/frontend/src/app/components/settings-page/settings-page.ts +++ b/frontend/src/app/components/settings-page/settings-page.ts @@ -1,4 +1,6 @@ import { Component, inject } from '@angular/core'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { faMoon, faUser } from '@fortawesome/free-solid-svg-icons'; import { MatButtonModule } from '@angular/material/button'; import { MatRadioModule } from '@angular/material/radio'; import { SessionService } from '../../services/session.service'; @@ -6,13 +8,17 @@ import { ThemeService } from '../../services/theme.service'; @Component({ selector: 'app-settings-page', - imports: [MatButtonModule, MatRadioModule], + imports: [FontAwesomeModule, MatButtonModule, MatRadioModule], templateUrl: './settings-page.html', styleUrl: './settings-page.css', }) export class SettingsPage { + readonly faMoon = faMoon; + readonly faUser = faUser; readonly session = inject(SessionService); readonly theme = inject(ThemeService); - logout(): void { window.location.href = '/logout'; } + logout(): void { + window.location.href = '/logout'; + } } diff --git a/frontend/src/app/components/sign-in-page/sign-in-page.css b/frontend/src/app/components/sign-in-page/sign-in-page.css index 0a7c5e4..a5f5061 100644 --- a/frontend/src/app/components/sign-in-page/sign-in-page.css +++ b/frontend/src/app/components/sign-in-page/sign-in-page.css @@ -51,11 +51,16 @@ width: 100%; max-width: 360px; } -.sign-in-action svg { +.sign-in-action fa-icon { + display: flex; width: 19px; height: 19px; margin-left: 8px; } +.sign-in-action fa-icon svg { + width: 100%; + height: 100%; +} .security-note { display: flex; align-items: center; diff --git a/frontend/src/app/components/sign-in-page/sign-in-page.html b/frontend/src/app/components/sign-in-page/sign-in-page.html index cd26b7e..cfeeaff 100644 --- a/frontend/src/app/components/sign-in-page/sign-in-page.html +++ b/frontend/src/app/components/sign-in-page/sign-in-page.html @@ -19,15 +19,7 @@

diff --git a/frontend/src/app/components/sign-in-page/sign-in-page.ts b/frontend/src/app/components/sign-in-page/sign-in-page.ts index c75f59c..8ea7b98 100644 --- a/frontend/src/app/components/sign-in-page/sign-in-page.ts +++ b/frontend/src/app/components/sign-in-page/sign-in-page.ts @@ -1,13 +1,16 @@ import { Component, output } from '@angular/core'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { faArrowRight } from '@fortawesome/free-solid-svg-icons'; import { MatButtonModule } from '@angular/material/button'; import { BrandMark } from '../brand-mark'; @Component({ selector: 'app-sign-in-page', - imports: [BrandMark, MatButtonModule], + imports: [BrandMark, FontAwesomeModule, MatButtonModule], templateUrl: './sign-in-page.html', styleUrl: './sign-in-page.css', }) export class SignInPage { + readonly faArrowRight = faArrowRight; readonly loginRequested = output(); } diff --git a/frontend/src/app/components/tenant-card/tenant-card.css b/frontend/src/app/components/tenant-card/tenant-card.css index 5fc30bb..db7f182 100644 --- a/frontend/src/app/components/tenant-card/tenant-card.css +++ b/frontend/src/app/components/tenant-card/tenant-card.css @@ -95,6 +95,10 @@ width: 16px; margin-right: 8px; } +.attachment-download-icon svg { + width: 100%; + height: 100%; +} .attachment-file-name { min-width: 0; overflow-wrap: anywhere; @@ -107,6 +111,14 @@ padding: 0 5px; font-size: 0.9rem; } +.attachment-delete fa-icon { + width: 1em; + height: 1em; +} +.attachment-delete fa-icon svg { + width: 100%; + height: 100%; +} .upload-action { display: block; min-height: 40px; diff --git a/frontend/src/app/components/workspace-navigation/workspace-navigation.css b/frontend/src/app/components/workspace-navigation/workspace-navigation.css index 4b42970..1d744f6 100644 --- a/frontend/src/app/components/workspace-navigation/workspace-navigation.css +++ b/frontend/src/app/components/workspace-navigation/workspace-navigation.css @@ -1,156 +1,212 @@ :host { - display: block; + display: block; } + .app-navigation { - position: fixed; - z-index: 20; - right: 0; - bottom: 0; - left: 0; - height: calc(72px + env(safe-area-inset-bottom)); - padding: 6px 10px env(safe-area-inset-bottom); - border-top: 1px solid var(--border); - background: color-mix(in srgb, var(--surface) 94%, transparent); - box-shadow: 0 -10px 30px rgba(25, 40, 35, 0.06); - backdrop-filter: blur(18px); + position: fixed; + z-index: 20; + right: 0; + bottom: 0; + left: 0; + height: calc(72px + env(safe-area-inset-bottom)); + padding: 6px 10px env(safe-area-inset-bottom); + border-top: 1px solid var(--border); + background: color-mix(in srgb, var(--surface) 94%, transparent); + box-shadow: 0 -10px 30px rgba(25, 40, 35, 0.06); + backdrop-filter: blur(18px); } + .sidebar-brand, .sidebar-user { - display: none; + display: none; } + .navigation-items { - display: grid; - height: 100%; - grid-template-columns: repeat(5, minmax(0, 1fr)); - gap: 4px; + display: grid; + height: 100%; + grid-template-columns: repeat(5, minmax(0, 1fr)); + gap: 4px; } + .navigation-item.mat-mdc-button { - --mdc-text-button-label-text-color: var(--text-muted); - min-width: 0; - height: 60px; - border-radius: 14px; - padding: 5px 4px; - font-weight: 650; - letter-spacing: 0; + --mdc-text-button-label-text-color: var(--text-muted); + width: 100%; + min-width: 0; + height: 60px; + border-radius: 14px; + overflow: hidden; + padding: 5px 4px; + font-weight: 650; + letter-spacing: 0; } + .navigation-item .mat-mdc-button-touch-target { - height: 60px; + height: 60px; } -.navigation-item svg { - width: 21px; - height: 21px; - margin: 0 auto 4px; + +.navigation-item fa-icon { + display: flex; + width: 21px; + height: 21px; + margin: 0 auto 4px; } + +.navigation-item fa-icon svg { + width: 100%; + height: 100%; +} + .navigation-item span { - display: block; - overflow: hidden; - font-size: 0.66rem; - text-overflow: ellipsis; - white-space: nowrap; + display: block; + overflow: hidden; + font-size: 0.66rem; + text-overflow: ellipsis; + white-space: nowrap; } + .navigation-item.active { - --mdc-text-button-label-text-color: var(--accent); - background: var(--surface-accent); + --mdc-text-button-label-text-color: var(--accent); + background: var(--surface-accent); } + +@media (max-width: 959px) { + .navigation-item .mdc-button__label { + display: flex; + width: 100%; + height: 100%; + min-width: 0; + flex-direction: column; + align-items: center; + justify-content: center; + } + + .navigation-item span { + width: 100%; + min-width: 0; + overflow-wrap: break-word; + font-size: 0.62rem; + line-height: 1.05; + text-align: center; + white-space: normal; + } +} + @media (min-width: 960px) { - .app-navigation { - top: 0; - right: auto; - bottom: auto; - width: 256px; - height: 100vh; - padding: 26px 18px; - border-top: 0; - border-right: 1px solid var(--border); - background: var(--surface); - box-shadow: none; - backdrop-filter: none; - } - .sidebar-brand { - display: flex; - align-items: center; - gap: 12px; - padding: 0 8px 32px; - } - .sidebar-brand > div { - display: flex; - flex-direction: column; - font-size: 0.86rem; - line-height: 1.15; - } - .sidebar-brand strong { - font-size: 1rem; - } - .sidebar-brand span:last-child { - color: var(--text-muted); - } - .navigation-items { - display: flex; - height: auto; - flex-direction: column; - gap: 6px; - } - .navigation-item.mat-mdc-button { - width: 100%; - height: 48px; - justify-content: flex-start; - border-radius: 13px; - padding: 0 14px; - } - .navigation-item .mat-mdc-button-touch-target { - height: 48px; - } - .navigation-item .mdc-button__label { - display: flex; - align-items: center; - gap: 12px; - } - .navigation-item svg { - width: 20px; - height: 20px; - margin: 0; - } - .navigation-item span { - font-size: 0.86rem; - } - .sidebar-user { - position: absolute; - right: 18px; - bottom: 24px; - left: 18px; - display: grid; - grid-template-columns: 36px minmax(0, 1fr); - gap: 10px; - padding: 14px; - border: 1px solid var(--border); - border-radius: 16px; - background: var(--surface-soft); - } - .sidebar-user > div:nth-child(2) { - display: flex; - min-width: 0; - flex-direction: column; - justify-content: center; - } - .sidebar-user strong, - .sidebar-user span { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - .sidebar-user strong { - font-size: 0.82rem; - } - .sidebar-user span { - color: var(--text-muted); - font-size: 0.69rem; - } - .logout-action.mat-mdc-button { - --mdc-text-button-label-text-color: var(--text-muted); - grid-column: 1 / -1; - height: 34px; - border-top: 1px solid var(--border); - border-radius: 0; - font-size: 0.75rem; - } -} + .app-navigation { + top: 0; + right: auto; + bottom: auto; + width: 256px; + height: 100vh; + padding: 26px 18px; + border-top: 0; + border-right: 1px solid var(--border); + background: var(--surface); + box-shadow: none; + backdrop-filter: none; + } + + .sidebar-brand { + display: flex; + align-items: center; + gap: 12px; + padding: 0 8px 32px; + } + + .sidebar-brand>div { + display: flex; + flex-direction: column; + font-size: 0.86rem; + line-height: 1.15; + } + + .sidebar-brand strong { + font-size: 1rem; + } + + .sidebar-brand span:last-child { + color: var(--text-muted); + } + + .navigation-items { + display: flex; + height: auto; + flex-direction: column; + gap: 6px; + } + + .navigation-item.mat-mdc-button { + width: 100%; + height: 48px; + justify-content: flex-start; + border-radius: 13px; + padding: 0 14px; + } + + .navigation-item .mat-mdc-button-touch-target { + height: 48px; + } + + .navigation-item .mdc-button__label { + display: flex; + align-items: center; + gap: 12px; + } + + .navigation-item fa-icon { + display: flex; + width: 20px; + height: 20px; + margin: 0; + } + + .navigation-item span { + font-size: 0.86rem; + } + + .sidebar-user { + position: absolute; + right: 18px; + bottom: 24px; + left: 18px; + display: grid; + grid-template-columns: 36px minmax(0, 1fr); + gap: 10px; + padding: 14px; + border: 1px solid var(--border); + border-radius: 16px; + background: var(--surface-soft); + } + + .sidebar-user>div:nth-child(2) { + display: flex; + min-width: 0; + flex-direction: column; + justify-content: center; + } + + .sidebar-user strong, + .sidebar-user span { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + .sidebar-user strong { + font-size: 0.82rem; + } + + .sidebar-user span { + color: var(--text-muted); + font-size: 0.69rem; + } + + .logout-action.mat-mdc-button { + --mdc-text-button-label-text-color: var(--text-muted); + grid-column: 1 / -1; + height: 34px; + border-top: 1px solid var(--border); + border-radius: 0; + font-size: 0.75rem; + } +} \ No newline at end of file diff --git a/frontend/src/app/components/workspace-navigation/workspace-navigation.html b/frontend/src/app/components/workspace-navigation/workspace-navigation.html index ffb0ab7..d69ee89 100644 --- a/frontend/src/app/components/workspace-navigation/workspace-navigation.html +++ b/frontend/src/app/components/workspace-navigation/workspace-navigation.html @@ -12,18 +12,7 @@ routerLink="/dashboard" routerLinkActive="active" > - +