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"
>
-
+
Tableau de bord
diff --git a/frontend/src/app/components/workspace-navigation/workspace-navigation.ts b/frontend/src/app/components/workspace-navigation/workspace-navigation.ts
index b244efa..04fc852 100644
--- a/frontend/src/app/components/workspace-navigation/workspace-navigation.ts
+++ b/frontend/src/app/components/workspace-navigation/workspace-navigation.ts
@@ -1,4 +1,12 @@
import { Component, inject, input, output } from '@angular/core';
+import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
+import {
+ faBuilding,
+ faFileLines,
+ faGear,
+ faTableCellsLarge,
+ faUsers,
+} from '@fortawesome/free-solid-svg-icons';
import { RouterLink, RouterLinkActive } from '@angular/router';
import { MatButtonModule } from '@angular/material/button';
import { BrandMark } from '../brand-mark';
@@ -7,11 +15,16 @@ import { SessionService } from '../../services/session.service';
@Component({
selector: 'app-workspace-navigation',
- imports: [BrandMark, MatButtonModule, RouterLink, RouterLinkActive],
+ imports: [BrandMark, FontAwesomeModule, MatButtonModule, RouterLink, RouterLinkActive],
templateUrl: './workspace-navigation.html',
styleUrl: './workspace-navigation.css',
})
export class WorkspaceNavigation {
+ readonly faTableCellsLarge = faTableCellsLarge;
+ readonly faBuilding = faBuilding;
+ readonly faUsers = faUsers;
+ readonly faFileLines = faFileLines;
+ readonly faGear = faGear;
readonly userInitial = input.required();
readonly logoutRequested = output();
readonly session = inject(SessionService);
diff --git a/frontend/src/styles.scss b/frontend/src/styles.scss
index 5bc3148..2003975 100644
--- a/frontend/src/styles.scss
+++ b/frontend/src/styles.scss
@@ -98,6 +98,14 @@ svg {
display: block;
}
+fa-icon {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ line-height: 1;
+ vertical-align: middle;
+}
+
h1,
h2,
h3,