From 64ce8ca54ea67210436a267242435c25d5987609 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marl=C3=A8ne=20SIMONDANT?= <msimondant@grandlyon.com>
Date: Wed, 2 Feb 2022 14:18:51 +0000
Subject: [PATCH] feat(pages): display pages from ghost (eg. : about page and
 accessibility page)

---
 src/app/about/about.component.html            |  38 ----
 src/app/about/about.component.ts              |  15 --
 src/app/app-routing.module.ts                 |   6 +-
 src/app/app.module.ts                         |   4 +-
 src/app/footer/footer.component.html          |   1 +
 src/app/header/header.component.html          |   4 +-
 src/app/page/enum/page.enum.ts                |   4 +
 src/app/page/models/page.model.ts             |  17 ++
 src/app/page/page.component.html              |  18 ++
 .../page.component.scss}                      |  20 +-
 .../page.component.spec.ts}                   |  15 +-
 src/app/page/page.component.ts                |  33 ++++
 src/app/page/services/page.service.spec.ts    |  16 ++
 src/app/page/services/page.service.ts         |  26 +++
 .../post-details/post-details.component.scss  | 178 +----------------
 src/assets/scss/_ghost.scss                   | 184 ++++++++++++++++++
 src/sitemap.xml                               |   4 +-
 17 files changed, 326 insertions(+), 257 deletions(-)
 delete mode 100644 src/app/about/about.component.html
 delete mode 100644 src/app/about/about.component.ts
 create mode 100644 src/app/page/enum/page.enum.ts
 create mode 100644 src/app/page/models/page.model.ts
 create mode 100644 src/app/page/page.component.html
 rename src/app/{about/about.component.scss => page/page.component.scss} (54%)
 rename src/app/{about/about.component.spec.ts => page/page.component.spec.ts} (52%)
 create mode 100644 src/app/page/page.component.ts
 create mode 100644 src/app/page/services/page.service.spec.ts
 create mode 100644 src/app/page/services/page.service.ts
 create mode 100644 src/assets/scss/_ghost.scss

diff --git a/src/app/about/about.component.html b/src/app/about/about.component.html
deleted file mode 100644
index 23034e3aa..000000000
--- a/src/app/about/about.component.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<div fxLayout="column" class="content-container full-screen">
-  <div class="section-container">
-    <div fxLayout="row" fxLayout.lt-sm="column" fxLayoutAlign="left" fxLayoutGap="5%">
-      <div class="about-container">
-        <h1>Qui sommes-nous ?</h1>
-        <p>
-          La numérisation accélérée des différents services privés et publics ainsi que la crise sanitaire que nous
-          traversons a renforcé une fracture numérique déjà forte pour un nombre important de citoyens.
-        </p>
-        <p>
-          Au printemps 2019, la Métropole de Lyon s'est saisie des enjeux autour de l'inclusion numérique en initiant la
-          structuration d'un réseau des acteurs de la médiation numérique sur son territoire. Son objectif est de mettre
-          en relation les acteurs qui œuvrent au quotidien pour limiter cette fracture numérique, nombreux sur le
-          territoire de la Métropole : associations, centres sociaux, structures informations jeunesses, grands
-          opérateurs de services publics, collectivités...
-        </p>
-        <p>
-          Des ateliers de travail ont été organisés en 2019 pour identifier les besoins de ces acteurs et 9 offres de
-          services ont été identifiées :
-        </p>
-        <h2>Recenser et partager des ressources existantes (optimisation)</h2>
-        <img src="/assets/img/about_illustration_1.jpg" width="640" height="114" alt="illustration des besoins" />
-        <h2>Co-construire de nouvelles ressources (développement)</h2>
-        <img src="/assets/img/about_illustration_2.jpg" width="640" height="149" alt="illustration des besoins" />
-        <p>
-          Cet espace vise à centraliser et mettre en commun les ressources développées dans le cadre du réseau par ses
-          acteurs.
-        </p>
-        <p>N'hésitez pas à contribuer à cet espace en partageant vos ressources</p>
-        <p class="version" fxLayoutAlign="center center">Version : {{ version }}</p>
-      </div>
-      <div fxLayout="column" fxLayoutAlign="center center" fxLayoutGap="20px">
-        <img src="/assets/logos/logo_europe.png" width="220" height="168" alt="logo de l'union européenne" />
-        <img src="/assets/logos/logo_region.png" width="220" height="98" alt="logo de la région Auverge-Rhône-Alpes" />
-      </div>
-    </div>
-  </div>
-</div>
diff --git a/src/app/about/about.component.ts b/src/app/about/about.component.ts
deleted file mode 100644
index 1368672d6..000000000
--- a/src/app/about/about.component.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { Component, OnInit } from '@angular/core';
-import { version } from '../../../package.json';
-
-@Component({
-  selector: 'app-about',
-  templateUrl: './about.component.html',
-  styleUrls: ['./about.component.scss'],
-})
-export class AboutComponent implements OnInit {
-  public version: string = version;
-
-  constructor() {}
-
-  ngOnInit(): void {}
-}
diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts
index 4aa08599e..8718c9630 100644
--- a/src/app/app-routing.module.ts
+++ b/src/app/app-routing.module.ts
@@ -1,6 +1,6 @@
 import { NgModule } from '@angular/core';
 import { Routes, RouterModule } from '@angular/router';
-import { AboutComponent } from './about/about.component';
+import { PageComponent } from './page/page.component';
 import { ContactComponent } from './contact/contact.component';
 import { FormComponent } from './form/structure-form/form.component';
 import { AdminGuard } from './guards/admin.guard';
@@ -46,8 +46,8 @@ const routes: Routes = [
     component: LegalNoticeComponent,
   },
   {
-    path: 'about',
-    component: AboutComponent,
+    path: 'page/:slugPage',
+    component: PageComponent,
   },
   {
     path: 'contact',
diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index f142abc82..a38225903 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -20,7 +20,7 @@ import { StructureDetailsComponent } from './structure-list/components/structure
 import { StructureOpeningStatusComponent } from './structure-list/components/structure-opening-status/structure-opening-status.component';
 import { ModalFilterComponent } from './structure-list/components/modal-filter/modal-filter.component';
 import { LegalNoticeComponent } from './legal-notice/legal-notice.component';
-import { AboutComponent } from './about/about.component';
+import { PageComponent } from './page/page.component';
 import { ContactComponent } from './contact/contact.component';
 import { FormComponent } from './form/structure-form/form.component';
 import { UserVerificationComponent } from './user-verification/user-verification.component';
@@ -55,7 +55,7 @@ import { RoleGuard } from './guards/role.guard';
     StructureDetailsComponent,
     StructureOpeningStatusComponent,
     LegalNoticeComponent,
-    AboutComponent,
+    PageComponent,
     ContactComponent,
     UserVerificationComponent,
     ResetEmailComponent,
diff --git a/src/app/footer/footer.component.html b/src/app/footer/footer.component.html
index e778892c8..b7720d4de 100644
--- a/src/app/footer/footer.component.html
+++ b/src/app/footer/footer.component.html
@@ -1,5 +1,6 @@
 <div class="footer" fxLayout="row" fxLayoutAlign="center">
   <div fxLayout="row">
+    <a class="clickable text-align-center" routerLink="/page/accessibilite" i18n>Accessibilité</a>
     <a class="clickable text-align-center" routerLink="/legal-notice" i18n>Mentions légales</a>
     <a class="clickable text-align-center" routerLink="/newsletter" i18n>Newsletter</a>
     <!-- <a class="clickable text-align-center" routerLink="/sitemap" i18n>Plan du site</a> -->
diff --git a/src/app/header/header.component.html b/src/app/header/header.component.html
index f763f292d..51dd7c81d 100644
--- a/src/app/header/header.component.html
+++ b/src/app/header/header.component.html
@@ -19,7 +19,7 @@
     <a routerLink="/news" [routerLinkActive]="'active'" i18n>Actualités</a>
     <a routerLink="/acteurs" [routerLinkActive]="'active'" i18n>Cartographie des acteurs</a>
     <a routerLink="/orientation" [routerLinkActive]="'active'" i18n>Orienter un bénéficiaire</a>
-    <a routerLink="/about" [routerLinkActive]="'active'" i18n>Qui sommes-nous ?</a>
+    <a routerLink="/page/qui-sommes-nous" [routerLinkActive]="'active'" i18n>Qui sommes-nous ?</a>
     <a *ngIf="isAdmin" routerLink="/admin" [routerLinkActive]="'active'">Administration</a>
     <button *ngIf="isLoggedIn" class="red" routerLink="/profile" [routerLinkActive]="'active'">
       {{ displayName }}
@@ -39,7 +39,7 @@
         <a routerLink="/news" [routerLinkActive]="'active'" (click)="closeMenu()" i18n>Actualités</a>
         <a routerLink="/acteurs" [routerLinkActive]="'active'" (click)="closeMenu()" i18n>Cartographie de acteurs</a>
         <a routerLink="/orientation" [routerLinkActive]="'active'" i18n>Orienter un bénéficiaire</a>
-        <a routerLink="/about" [routerLinkActive]="'active'" i18n>Qui sommes-nous ?</a>
+        <a routerLink="/page/qui-sommes-nous" [routerLinkActive]="'active'" i18n>Qui sommes-nous ?</a>
         <a *ngIf="isAdmin" routerLink="/admin" [routerLinkActive]="'active'" (click)="closeMenu()">Administration</a>
       </div>
     </div>
diff --git a/src/app/page/enum/page.enum.ts b/src/app/page/enum/page.enum.ts
new file mode 100644
index 000000000..3f1bd8e7d
--- /dev/null
+++ b/src/app/page/enum/page.enum.ts
@@ -0,0 +1,4 @@
+export enum PageEnum {
+  quiSommesNous = 'qui-sommes-nous',
+  accessibilite = 'accessibilite',
+}
diff --git a/src/app/page/models/page.model.ts b/src/app/page/models/page.model.ts
new file mode 100644
index 000000000..3ee682538
--- /dev/null
+++ b/src/app/page/models/page.model.ts
@@ -0,0 +1,17 @@
+import { SafeHtml } from '@angular/platform-browser';
+
+export class Page {
+  pages: Page[];
+  id: number;
+  published_at: Date;
+  updated_at: Date;
+  title: string;
+  excerpt: string;
+  feature_image: string;
+  html: string;
+  safeHtml: SafeHtml;
+
+  constructor(obj?: any) {
+    Object.assign(this, obj);
+  }
+}
diff --git a/src/app/page/page.component.html b/src/app/page/page.component.html
new file mode 100644
index 000000000..b0470d320
--- /dev/null
+++ b/src/app/page/page.component.html
@@ -0,0 +1,18 @@
+<div fxLayout="column" class="content-container full-screen">
+  <div class="section-container">
+    <div class="postContainer" *ngIf="page" fxLayout="column" fxLayoutGap="16px">
+      <div class="gh-canvas">
+        <div fxLayout="column" fxLayoutAlign="center none">
+          <div fxLayout="row" class="title">{{ page.title }}</div>
+        </div>
+        <div fxLayout="row" class="article-image" *ngIf="page.feature_image">
+          <img class="image" alt="image about the news" [src]="page.feature_image" />
+        </div>
+        <div fxLayout="row" class="description">
+          <div [innerHtml]="page.safeHtml"></div>
+        </div>
+        <p *ngIf="version" class="version" fxLayoutAlign="center center">Version : {{ version }}</p>
+      </div>
+    </div>
+  </div>
+</div>
diff --git a/src/app/about/about.component.scss b/src/app/page/page.component.scss
similarity index 54%
rename from src/app/about/about.component.scss
rename to src/app/page/page.component.scss
index a5d775dd2..4a481e9e8 100644
--- a/src/app/about/about.component.scss
+++ b/src/app/page/page.component.scss
@@ -1,21 +1,13 @@
-@import '../../assets/scss/color';
 @import '../../assets/scss/typography';
-
-.content-container {
-  overflow: auto;
-}
-
-h2 {
-  @include cn-bold-16;
-  color: $red-default;
-}
-
-.about-container {
-  max-width: 760px;
-}
+@import '../../assets/scss/color';
+@import '../../assets/scss/ghost';
 
 .version {
   padding-top: 80px;
   font-size: $font-size-xxsmall;
   color: $grey-3;
 }
+
+.articleContainer {
+  padding-top: 20px;
+}
diff --git a/src/app/about/about.component.spec.ts b/src/app/page/page.component.spec.ts
similarity index 52%
rename from src/app/about/about.component.spec.ts
rename to src/app/page/page.component.spec.ts
index 0e0d812f0..c3a36f388 100644
--- a/src/app/about/about.component.spec.ts
+++ b/src/app/page/page.component.spec.ts
@@ -1,20 +1,19 @@
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 
-import { AboutComponent } from './about.component';
+import { PageComponent } from './page.component';
 
-describe('AboutComponent', () => {
-  let component: AboutComponent;
-  let fixture: ComponentFixture<AboutComponent>;
+describe('PageComponent', () => {
+  let component: PageComponent;
+  let fixture: ComponentFixture<PageComponent>;
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      declarations: [ AboutComponent ]
-    })
-    .compileComponents();
+      declarations: [PageComponent],
+    }).compileComponents();
   });
 
   beforeEach(() => {
-    fixture = TestBed.createComponent(AboutComponent);
+    fixture = TestBed.createComponent(PageComponent);
     component = fixture.componentInstance;
     fixture.detectChanges();
   });
diff --git a/src/app/page/page.component.ts b/src/app/page/page.component.ts
new file mode 100644
index 000000000..2ce5875e0
--- /dev/null
+++ b/src/app/page/page.component.ts
@@ -0,0 +1,33 @@
+import { Component, OnInit } from '@angular/core';
+import { ActivatedRoute } from '@angular/router';
+import { DomSanitizer } from '@angular/platform-browser';
+import { version } from '../../../package.json';
+import { Page } from './models/page.model';
+import { PageService } from './services/page.service';
+import { PageEnum } from './enum/page.enum';
+
+@Component({
+  selector: 'app-page',
+  templateUrl: './page.component.html',
+  styleUrls: ['./page.component.scss'],
+})
+export class PageComponent implements OnInit {
+  public page: Page;
+  public version: string;
+  private slugPage: string;
+  private quiSommesNous = PageEnum.quiSommesNous;
+
+  constructor(private sanitizer: DomSanitizer, private route: ActivatedRoute, private pageService: PageService) {}
+
+  ngOnInit(): void {
+    this.route.params.subscribe((routeParams) => {
+      this.slugPage = routeParams.slugPage;
+      this.pageService.getPage(this.slugPage).subscribe((page) => {
+        this.page = page.pages[0];
+        this.page.safeHtml = this.sanitizer.bypassSecurityTrustHtml(this.page.html);
+      });
+      // Display version number in 'About' page only
+      this.slugPage == this.quiSommesNous ? (this.version = version) : (this.version = '');
+    });
+  }
+}
diff --git a/src/app/page/services/page.service.spec.ts b/src/app/page/services/page.service.spec.ts
new file mode 100644
index 000000000..707828ba5
--- /dev/null
+++ b/src/app/page/services/page.service.spec.ts
@@ -0,0 +1,16 @@
+import { TestBed } from '@angular/core/testing';
+
+import { PageService } from './page.service';
+
+describe('PageService', () => {
+  let service: PageService;
+
+  beforeEach(() => {
+    TestBed.configureTestingModule({});
+    service = TestBed.inject(PageService);
+  });
+
+  it('should be created', () => {
+    expect(service).toBeTruthy();
+  });
+});
diff --git a/src/app/page/services/page.service.ts b/src/app/page/services/page.service.ts
new file mode 100644
index 000000000..6569447bc
--- /dev/null
+++ b/src/app/page/services/page.service.ts
@@ -0,0 +1,26 @@
+import { HttpClient } from '@angular/common/http';
+import { Injectable } from '@angular/core';
+import { Router } from '@angular/router';
+import { Observable } from 'rxjs';
+import { map, catchError } from 'rxjs/operators';
+import { Page } from '../models/page.model';
+
+@Injectable({
+  providedIn: 'root',
+})
+export class PageService {
+  private readonly baseUrl = 'api/pages/';
+  constructor(private http: HttpClient, private router: Router) {}
+
+  public getPage(slugPage: string): Observable<Page> {
+    return this.http.get<Page>(`${this.baseUrl}` + slugPage).pipe(
+      map((item: Page) => {
+        return new Page(item);
+      }),
+      catchError(() => {
+        this.router.navigate(['/']);
+        return new Observable<Page>();
+      })
+    );
+  }
+}
diff --git a/src/app/post/components/post-details/post-details.component.scss b/src/app/post/components/post-details/post-details.component.scss
index 59262dbe3..71b1f8516 100644
--- a/src/app/post/components/post-details/post-details.component.scss
+++ b/src/app/post/components/post-details/post-details.component.scss
@@ -3,15 +3,9 @@
 @import '../../../../assets/scss/layout';
 @import '../../../../assets/scss/breakpoint';
 @import '../../../../assets/scss/hyperlink';
-
-$margin-post: 20px;
+@import '../../../../assets/scss/ghost';
 
 .postContainer {
-  max-width: 1200px;
-  margin: $margin-post 0;
-  min-height: calc(
-    var(--vh, 1vh) * 100 - #{$header-height} - #{$footer-height} - #{$header-post-height} - #{$margin-post} * 3
-  );
   .chevronLeft {
     height: 24px;
     width: 24px;
@@ -19,6 +13,7 @@ $margin-post: 20px;
     margin-right: 10px;
   }
 }
+
 .tag {
   @include cn-bold-16;
   text-transform: uppercase;
@@ -26,11 +21,6 @@ $margin-post: 20px;
   fill: $secondary-color;
   stroke: $secondary-color;
 }
-.title {
-  @include cn-bold-30;
-  color: $grey-1;
-  margin-bottom: 8px;
-}
 .informations {
   @include cn-regular-16;
   div:nth-child(2n) {
@@ -39,172 +29,14 @@ $margin-post: 20px;
 }
 
 .description {
-  div {
-    max-width: 860px;
-    line-height: 180%;
-  }
-  ::ng-deep hr {
-    display: block;
-    margin: 3.2em 0;
-    padding: 0;
-    height: 1px;
-    border: 0;
-    border-top: 1px solid #dfe1e3;
+  ::ng-deep img {
+    width: 100%;
+    height: 100%;
   }
   ::ng-deep figure {
-    margin: 0;
     figcaption {
       margin-top: 1%;
-      font-size: small;
       text-align: center;
-      color: #626d79;
-    }
-  }
-  ::ng-deep img {
-    width: 100%;
-    height: 100%;
-  }
-  ::ng-deep .kg-embed-card {
-    position: relative;
-    width: 110%;
-    padding-top: 65%;
-    iframe {
-      position: absolute;
-      top: 0;
-      left: 0;
-      bottom: 0;
-      right: 0;
-      width: 100%;
-      height: 100%;
-      border: none;
-    }
-  }
-  ::ng-deep a {
-    @include hyperlink;
-    padding: 0;
-  }
-  ::ng-deep p {
-    @include cn-regular-20;
-    line-height: 1.6em;
-  }
-  ::ng-deep li {
-    @include cn-regular-20;
-    line-height: 1.6em;
-    margin-bottom: 10px;
-  }
-  ::ng-deep h2 {
-    margin-top: 50px;
-  }
-  ::ng-deep blockquote {
-    margin: 1.5em 0;
-    padding: 0 1.6em;
-    border-left: 3px solid $blue;
-  }
-  ::ng-deep .kg-image-card {
-    margin: 0 auto;
-    max-width: 100%;
-    ::ng-deep .kg-image {
-      max-width: 100%;
-      margin-top: 10px;
-      display: block;
-      margin-left: auto;
-      margin-right: auto;
-    }
-  }
-  ::ng-deep .kg-bookmark-card {
-    margin-top: 30px;
-    font: inherit;
-    vertical-align: baseline;
-    ::ng-deep .kg-bookmark-container {
-      display: flex;
-      border-radius: 3px;
-      color: var(--darkgrey);
-      text-decoration: none;
-      box-shadow: 0 2px 5px -1px rgb(0 0 0 / 15%), 0 0 1px rgb(0 0 0 / 9%);
-      ::ng-deep .kg-bookmark-content {
-        flex-grow: 1;
-        display: flex;
-        flex-direction: column;
-        justify-content: flex-start;
-        align-items: flex-start;
-        padding: 20px;
-        ::ng-deep .kg-bookmark-title {
-          color: $grey-1;
-          @include cn-regular-18;
-        }
-        ::ng-deep .kg-bookmark-description {
-          display: -webkit-box;
-          overflow-y: hidden;
-          margin-top: 12px;
-          max-height: 48px;
-          color: $grey-2;
-          line-height: 1.5em;
-          font-weight: 400;
-          -webkit-line-clamp: 2;
-          -webkit-box-orient: vertical;
-        }
-        ::ng-deep .kg-bookmark-metadata {
-          display: flex;
-          flex-wrap: wrap;
-          align-items: center;
-          margin-top: 14px;
-          color: var(--darkgrey);
-          font-weight: 500;
-          ::ng-deep .kg-bookmark-icon {
-            margin-right: 8px;
-            width: 22px;
-            height: 22px;
-            display: block;
-          }
-          ::ng-deep .kg-bookmark-author {
-            line-height: 1.5em;
-            @include cn-regular-18;
-          }
-          ::ng-deep .kg-bookmark-publisher {
-            overflow: hidden;
-            line-height: 1.5em;
-            text-overflow: ellipsis;
-            white-space: nowrap;
-            color: $grey-2;
-          }
-        }
-      }
-      ::ng-deep .kg-bookmark-thumbnail {
-        position: relative;
-        min-width: 33%;
-        max-height: 100%;
-        img {
-          position: absolute;
-          width: 100%;
-          height: 100%;
-          border-radius: 0 3px 3px 0;
-          -o-object-fit: cover;
-          object-fit: cover;
-        }
-      }
     }
   }
 }
-
-.gh-canvas {
-  display: grid;
-  grid-template-columns:
-    [full-start] minmax(4vmin, auto) [wide-start] minmax(auto, 240px) [main-start] min(720px, calc(100% - 8vw))
-    [main-end] minmax(auto, 240px) [wide-end] minmax(4vmin, auto) [full-end];
-}
-
-.gh-canvas > * {
-  grid-column: main-start/main-end;
-}
-
-.gh-canvas .article-image {
-  grid-column: wide-start/wide-end;
-  width: 100%;
-  margin: 4vmin 0 0;
-  img {
-    display: block;
-    margin-left: auto;
-    margin-right: auto;
-    width: 100%;
-  }
-}
diff --git a/src/assets/scss/_ghost.scss b/src/assets/scss/_ghost.scss
new file mode 100644
index 000000000..15de6a5c2
--- /dev/null
+++ b/src/assets/scss/_ghost.scss
@@ -0,0 +1,184 @@
+@import '../../assets/scss/color';
+@import '../../assets/scss/layout';
+@import '../../assets/scss/breakpoint';
+@import '../../assets/scss/hyperlink';
+
+$margin-post: 20px;
+
+.postContainer {
+  max-width: 1200px;
+  margin: $margin-post 0;
+  min-height: calc(
+    var(--vh, 1vh) * 100 - #{$header-height} - #{$footer-height} - #{$header-post-height} - #{$margin-post} * 3
+  );
+}
+.title {
+  @include cn-bold-30;
+  color: $grey-1;
+  margin-bottom: 8px;
+}
+
+.description {
+  div {
+    max-width: 860px;
+    line-height: 180%;
+  }
+  ::ng-deep hr {
+    display: block;
+    margin: 3.2em 0;
+    padding: 0;
+    height: 1px;
+    border: 0;
+    border-top: 1px solid #dfe1e3;
+  }
+  ::ng-deep figure {
+    margin: 0;
+    figcaption {
+      font-size: small;
+      color: #626d79;
+    }
+  }
+  ::ng-deep .kg-embed-card {
+    position: relative;
+    width: 110%;
+    padding-top: 65%;
+    iframe {
+      position: absolute;
+      top: 0;
+      left: 0;
+      bottom: 0;
+      right: 0;
+      width: 100%;
+      height: 100%;
+      border: none;
+    }
+  }
+  ::ng-deep a {
+    @include hyperlink;
+    padding: 0;
+  }
+  ::ng-deep p {
+    @include cn-regular-20;
+    line-height: 1.6em;
+  }
+  ::ng-deep li {
+    @include cn-regular-20;
+    line-height: 1.6em;
+    margin-bottom: 10px;
+  }
+  ::ng-deep h2 {
+    margin-top: 50px;
+  }
+  ::ng-deep blockquote {
+    margin: 1.5em 0;
+    padding: 0 1.6em;
+    border-left: 3px solid $blue;
+  }
+  ::ng-deep .kg-image-card {
+    margin: 0 auto;
+    max-width: 100%;
+    ::ng-deep .kg-image {
+      max-width: 100%;
+      margin-top: 10px;
+      display: block;
+      margin-left: auto;
+      margin-right: auto;
+    }
+  }
+  ::ng-deep .kg-bookmark-card {
+    margin-top: 30px;
+    font: inherit;
+    vertical-align: baseline;
+    ::ng-deep .kg-bookmark-container {
+      display: flex;
+      border-radius: 3px;
+      color: var(--darkgrey);
+      text-decoration: none;
+      box-shadow: 0 2px 5px -1px rgb(0 0 0 / 15%), 0 0 1px rgb(0 0 0 / 9%);
+      ::ng-deep .kg-bookmark-content {
+        flex-grow: 1;
+        display: flex;
+        flex-direction: column;
+        justify-content: flex-start;
+        align-items: flex-start;
+        padding: 20px;
+        ::ng-deep .kg-bookmark-title {
+          color: $grey-1;
+          @include cn-regular-18;
+        }
+        ::ng-deep .kg-bookmark-description {
+          display: -webkit-box;
+          overflow-y: hidden;
+          margin-top: 12px;
+          max-height: 48px;
+          color: $grey-2;
+          line-height: 1.5em;
+          font-weight: 400;
+          -webkit-line-clamp: 2;
+          -webkit-box-orient: vertical;
+        }
+        ::ng-deep .kg-bookmark-metadata {
+          display: flex;
+          flex-wrap: wrap;
+          align-items: center;
+          margin-top: 14px;
+          color: var(--darkgrey);
+          font-weight: 500;
+          ::ng-deep .kg-bookmark-icon {
+            margin-right: 8px;
+            width: 22px;
+            height: 22px;
+            display: block;
+          }
+          ::ng-deep .kg-bookmark-author {
+            line-height: 1.5em;
+            @include cn-regular-18;
+          }
+          ::ng-deep .kg-bookmark-publisher {
+            overflow: hidden;
+            line-height: 1.5em;
+            text-overflow: ellipsis;
+            white-space: nowrap;
+            color: $grey-2;
+          }
+        }
+      }
+      ::ng-deep .kg-bookmark-thumbnail {
+        position: relative;
+        min-width: 33%;
+        max-height: 100%;
+        img {
+          position: absolute;
+          width: 100%;
+          height: 100%;
+          border-radius: 0 3px 3px 0;
+          -o-object-fit: cover;
+          object-fit: cover;
+        }
+      }
+    }
+  }
+}
+
+.gh-canvas {
+  display: grid;
+  grid-template-columns:
+    [full-start] minmax(4vmin, auto) [wide-start] minmax(auto, 240px) [main-start] min(720px, calc(100% - 8vw))
+    [main-end] minmax(auto, 240px) [wide-end] minmax(4vmin, auto) [full-end];
+}
+
+.gh-canvas > * {
+  grid-column: main-start/main-end;
+}
+
+.gh-canvas .article-image {
+  grid-column: wide-start/wide-end;
+  width: 100%;
+  margin: 4vmin 0 0;
+  img {
+    display: block;
+    margin-left: auto;
+    margin-right: auto;
+    width: 100%;
+  }
+}
diff --git a/src/sitemap.xml b/src/sitemap.xml
index 951ad41ce..2b2ff2cc9 100644
--- a/src/sitemap.xml
+++ b/src/sitemap.xml
@@ -26,9 +26,9 @@
 </url>
 
 <url>
-  <loc>https://resin.grandlyon.com/about</loc>
+  <loc>https://resin.grandlyon.com/page/qui-sommes-nous</loc>
   <priority>0.64</priority>
-  <lastmod>2021-05-04T13:28:32+00:00</lastmod>
+  <lastmod>2022-01-04T15:28:32+00:00</lastmod>
 </url>
 
 </urlset>
-- 
GitLab