From b573262b59e01251e9f67e8e75ce25b7e231e65d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois=20Grand?= <francois.grand@inrae.fr>
Date: Thu, 17 Nov 2022 10:00:23 +0100
Subject: [PATCH] add @angular/pwa

refs #445
---
 angular.json                      |  12 ++++--
 ngsw-config.json                  |  30 +++++++++++++++
 package-lock.json                 |  29 ++++++++++++++-
 package.json                      |   3 +-
 src/app/app.module.ts             |  10 ++++-
 src/assets/icons/icon-128x128.png | Bin 0 -> 1253 bytes
 src/assets/icons/icon-144x144.png | Bin 0 -> 1394 bytes
 src/assets/icons/icon-152x152.png | Bin 0 -> 1427 bytes
 src/assets/icons/icon-192x192.png | Bin 0 -> 1790 bytes
 src/assets/icons/icon-384x384.png | Bin 0 -> 3557 bytes
 src/assets/icons/icon-512x512.png | Bin 0 -> 5008 bytes
 src/assets/icons/icon-72x72.png   | Bin 0 -> 792 bytes
 src/assets/icons/icon-96x96.png   | Bin 0 -> 958 bytes
 src/index.html                    |  60 ++++++++++--------------------
 src/manifest.webmanifest          |  59 +++++++++++++++++++++++++++++
 15 files changed, 155 insertions(+), 48 deletions(-)
 create mode 100644 ngsw-config.json
 create mode 100644 src/assets/icons/icon-128x128.png
 create mode 100644 src/assets/icons/icon-144x144.png
 create mode 100644 src/assets/icons/icon-152x152.png
 create mode 100644 src/assets/icons/icon-192x192.png
 create mode 100644 src/assets/icons/icon-384x384.png
 create mode 100644 src/assets/icons/icon-512x512.png
 create mode 100644 src/assets/icons/icon-72x72.png
 create mode 100644 src/assets/icons/icon-96x96.png
 create mode 100644 src/manifest.webmanifest

diff --git a/angular.json b/angular.json
index 234f2a317..a5fea2de6 100644
--- a/angular.json
+++ b/angular.json
@@ -35,7 +35,8 @@
                 "glob": "**/*.png",
                 "input": "src/",
                 "output": "/"
-              }
+              },
+              "src/manifest.webmanifest"
             ],
             "styles": [
               "src/styles.scss",
@@ -75,7 +76,9 @@
             "buildOptimizer": false,
             "sourceMap": true,
             "optimization": false,
-            "namedChunks": true
+            "namedChunks": true,
+            "serviceWorker": true,
+            "ngswConfigPath": "ngsw-config.json"
           },
           "configurations": {
             "production": {
@@ -105,7 +108,7 @@
         "serve": {
           "builder": "@angular-devkit/build-angular:dev-server",
           "options": {
-            "browserTarget": "ngHyd:build",
+            "browserTarget": "ngHyd:build"
           },
           "configurations": {
             "production": {
@@ -136,7 +139,8 @@
               "src/favicon.ico",
               "src/**/*.json",
               "src/**/*.md",
-              "src/**/*.png"
+              "src/**/*.png",
+              "src/manifest.webmanifest"
             ]
           }
         }
diff --git a/ngsw-config.json b/ngsw-config.json
new file mode 100644
index 000000000..f8bf2102e
--- /dev/null
+++ b/ngsw-config.json
@@ -0,0 +1,30 @@
+{
+  "$schema": "./node_modules/@angular/service-worker/config/schema.json",
+  "index": "/index.html",
+  "assetGroups": [
+    {
+      "name": "app",
+      "installMode": "prefetch",
+      "resources": {
+        "files": [
+          "/favicon.ico",
+          "/index.html",
+          "/manifest.webmanifest",
+          "/*.css",
+          "/*.js"
+        ]
+      }
+    },
+    {
+      "name": "assets",
+      "installMode": "lazy",
+      "updateMode": "prefetch",
+      "resources": {
+        "files": [
+          "/assets/**",
+          "/*.(svg|cur|jpg|jpeg|png|apng|webp|avif|gif|otf|ttf|woff|woff2)"
+        ]
+      }
+    }
+  ]
+}
diff --git a/package-lock.json b/package-lock.json
index 8d29777e1..597641a64 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -22,6 +22,7 @@
         "@angular/platform-browser": "^14.0.4",
         "@angular/platform-browser-dynamic": "^14.0.4",
         "@angular/router": "^14.0.4",
+        "@angular/service-worker": "^14.0.4",
         "@ngx-matomo/tracker": "^3.0.0",
         "@types/pako": "^1.0.4",
         "@types/sprintf-js": "^1.1.2",
@@ -59,7 +60,7 @@
       },
       "devDependencies": {
         "@angular-devkit/core": "^14.0.4",
-        "@angular-eslint/eslint-plugin": "^14.0.0",
+        "@angular-eslint/eslint-plugin": "^14.0.4",
         "@angular/cli": "^14.0.4",
         "@angular/compiler-cli": "^14.0.4",
         "@angular/language-service": "^14.0.4",
@@ -927,6 +928,24 @@
         "rxjs": "^6.5.3 || ^7.4.0"
       }
     },
+    "node_modules/@angular/service-worker": {
+      "version": "14.2.11",
+      "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-14.2.11.tgz",
+      "integrity": "sha512-RIRhkSxjah2f4sFDduPFGS/9rXZADYPYLVO9zkOHiX9IlCzFwqOZnL9UkMrlKC1AoGr6seXkGHHtC+7gOiszoQ==",
+      "dependencies": {
+        "tslib": "^2.3.0"
+      },
+      "bin": {
+        "ngsw-config": "ngsw-config.js"
+      },
+      "engines": {
+        "node": "^14.15.0 || >=16.10.0"
+      },
+      "peerDependencies": {
+        "@angular/common": "14.2.11",
+        "@angular/core": "14.2.11"
+      }
+    },
     "node_modules/@assemblyscript/loader": {
       "version": "0.10.1",
       "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz",
@@ -23295,6 +23314,14 @@
         "tslib": "^2.3.0"
       }
     },
+    "@angular/service-worker": {
+      "version": "14.2.11",
+      "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-14.2.11.tgz",
+      "integrity": "sha512-RIRhkSxjah2f4sFDduPFGS/9rXZADYPYLVO9zkOHiX9IlCzFwqOZnL9UkMrlKC1AoGr6seXkGHHtC+7gOiszoQ==",
+      "requires": {
+        "tslib": "^2.3.0"
+      }
+    },
     "@assemblyscript/loader": {
       "version": "0.10.1",
       "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz",
diff --git a/package.json b/package.json
index bf035e0b3..5abbd69ae 100644
--- a/package.json
+++ b/package.json
@@ -48,6 +48,7 @@
     "@angular/platform-browser": "^14.0.4",
     "@angular/platform-browser-dynamic": "^14.0.4",
     "@angular/router": "^14.0.4",
+    "@angular/service-worker": "^14.0.4",
     "@ngx-matomo/tracker": "^3.0.0",
     "@types/pako": "^1.0.4",
     "@types/sprintf-js": "^1.1.2",
@@ -85,7 +86,7 @@
   },
   "devDependencies": {
     "@angular-devkit/core": "^14.0.4",
-    "@angular-eslint/eslint-plugin": "^14.0.0",
+    "@angular-eslint/eslint-plugin": "^14.0.4",
     "@angular/cli": "^14.0.4",
     "@angular/compiler-cli": "^14.0.4",
     "@angular/language-service": "^14.0.4",
diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index c39a646e4..6a0be9102 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -123,6 +123,8 @@ import { DialogConfirmLoadSessionURLComponent } from "./components/dialog-confir
 import { StructureFieldsetContainerComponent } from "./components/structure-fieldset-container/structure-fieldset-container.component";
 import { BasinFieldsetContainerComponent } from "./components/basin-fieldset-container/basin-fieldset-container.component";
 import { PrebarrageService } from "./services/prebarrage.service";
+import { ServiceWorkerModule } from '@angular/service-worker';
+import { environment } from '../environments/environment';
 
 const appRoutes: Routes = [
     { path: "list/search", component: CalculatorListComponent },
@@ -187,7 +189,13 @@ const appRoutes: Routes = [
             enableTracing: false,
             relativeLinkResolution: 'legacy'
         }),
-        TableModule
+        TableModule,
+        ServiceWorkerModule.register('ngsw-worker.js', {
+          enabled: environment.production,
+          // Register the ServiceWorker as soon as the application is stable
+          // or after 30 seconds (whichever comes first).
+          registrationStrategy: 'registerWhenStable:30000'
+        })
     ],
     declarations: [
         AppComponent,
diff --git a/src/assets/icons/icon-128x128.png b/src/assets/icons/icon-128x128.png
new file mode 100644
index 0000000000000000000000000000000000000000..9f9241f0be40661db1eed29384231e76d33b6e7c
GIT binary patch
literal 1253
zcmV<B1RDE^P)<h;3K|Lk000e1NJLTq004jh004jp0{{R3^x%>C00004XF*Lt006O%
z3;baP00001b5ch_0Itp)=>Px#R8UM*MNDaN$N(?b05IDCG1mYv%m6RW1~u3KGtmGr
z)c`Qj05H@5G1vex-2gG&05Sjn|HA+;>W7}%C{ggJx%=nr_R-qsQgh#Rj_Gxf@wLO%
zPH*a#s-Rh6fB*mh4s=pZQvmBRsYJy17_o~a(q!H`#xchL000SaNLh0L00)l%00)l&
zd2k#i000C4Nkl<Zc-rlo3zDKR6h%cO1W-O91i}69bK0?0pn1uC66l&K?gluOzB%UC
zhr^ydd-m+vv*+JVe3t1ie*Pr$yetD5|H{{op~&+)z*mA~Ylbwr<d2l!iINTf@JW`x
zQoa+Nwy9l|4^xgJj~mo3w*ahL$?w|P0amNzyLL{16)HKZ9RlFBlGECO0KO{uvvxSZ
zR~^E5VeN89j42)Yypri$>8EL$(w!{vTD#Ez6h&Vm;Z@RJyJ5Pb=t?kfC0(@}L=|6A
zC;?{4bI!=^4sa_Okxqbw@%_I8P!z%|z=;8HeE_r!fY3el836hLpcw$}37N77pePIu
z0L(@lpm_o`H~=sW1p0kbywbw}fCf+p-6ix)=MzBk=HMf!i~;~4<VfflR7TOkn+it*
z0Lw@sKLr>-H3n#XX#h5n9s__fIwQZuJPGk+1pOlOB*c>uv^u-+B*c;tv>=H%64II_
zBM3lp=3rHEWE4OEz>=hXe^qg06hQ!I#sGAA*)e1!u|+9ELMAVJhK#WNL5fRA-?wHB
zE+cGn5aSZM-T_)%M&OYiE}_4hQ-R9}+?iZZ3Du9?aSh7|1c=a;ka_?pbY&EP03kRB
zo9FpJ1Ij1^0TNI`<_Tax8A)_^iVc8%osbBP$tVN?j+lh1_YqBn$p}5CNU@cWdIKnI
zWdt8mKoaVPhg2OTBlxgLAQCb|fF6<&d_<E064K*iI*rH(29Ur2T*m+{Afo^V2!Y**
z8UqMmn-;+UiCaST^rW<Q%SgfiC-(p}^(2jZn}#1(9<l8hm3G0l$i5`e7=T`~EwY*D
zT7WSNJwz=@Gz!ox)Bv$0F$J7{DS(9bqjb7u9-0?{Di~3VJT$*KsyP6+MIM?p(O>}T
zib!ph5$D<@wH=CS^3qCJWyHBNiEVSRqHoP^HW{&AI@lznXaHrKiL5)T3q1gx?cT7l
z$cP0H(GoH?fR-MDfCUhe64KV2Q$fopV*yM|^j>pLD){5-_D0G`vH(t`gp?gXkunNd
z07ptfo$K<NTp97MZ&T`I-nal-N=Cfr1TirOwe$L3P%9(m9lDs8Q00C<a3f|S^Y%QO
zUkNEUfFf2#OaM76p$>UL(aa7(zyuhW$Xs7h2tePy(toxbVclW-yS1Lo!^|@P|54BB
z;t@a|K1m`x0Ysm^qlrTw0NIk~Olh<fAXxgM>liHp@bRe4-o_QW$7|yn-D9<p?w;QV
z$EoB21pXhm5^Y?sdte*a?B2|-SpWd5zV!at#+AD_gCK1H!4{9J$8Fr8d-gVN(mh)n
zx9Q&8o6|8swEaI?d{2n&x<|Be%kIszG0VBzUhi%ErT=i*vuDqq|0sU|6H~89F!@8?
P00000NkvXXu0mjfX0IV2

literal 0
HcmV?d00001

diff --git a/src/assets/icons/icon-144x144.png b/src/assets/icons/icon-144x144.png
new file mode 100644
index 0000000000000000000000000000000000000000..4a5f8c16389c261b3291ef34a9ef8b2222f76d69
GIT binary patch
literal 1394
zcmV-&1&#WNP)<h;3K|Lk000e1NJLTq0058x0058(0{{R3(3ld600004XF*Lt006O%
z3;baP00001b5ch_0Itp)=>Px#S5Qn;MNDaN$N(_Y04&%5Fw_7r%m6RZ1vJ?JG1&ky
z)c`Qm05I49G1LGt-2gGe059DDG5`Pn?3%64E>-4njObBw`{(S}RdwSpSM|!&_}=8-
zBu@0X#@b+gK;5I&0000EbW%=J0PQ0&M8x(NsEw~<(cU)swx9q2010qNS#tmY2!Q|q
z2!R10?Pm-C00fFjL_t(|+U=W*a;q>5M1f%57z`milK=nC8``FU7Ta25pmT@)f-{=c
zA}fmHoH}*t)TvXaPM!K6<;BeZJ2YX+ih^^VT>b=(pA@6`C^rfZrny8xQM`dhrZ_y%
zIC=3c{uYZ5F;1KnQ}LPhw)lsQ3kA@=7XPxb252vfziq4q+QH(UghmSVR2FY%<GhfI
zE3}2h7i>%ivTyN48$&>&#l4MfJX2e7y=++AqtHBc7o4PZ7FXMNs-Y|^PL!#|!!#?%
z5@jhkT?Q8SS%Ii2%O>E6AdCA^fvGN^syQa|m&FeXRQ(9lb661xD1~{h<%e!CP(rH^
z4AgxBbubVu11=~}TYjlRfl^w(qd@l;kU)Wm-4F5%WocR>Vw>d{kaz>3B_hTUmWjoi
z2MtFmP=tr#OISF%M4%Y`YP^MoBO?N(2BG-U&3;gW$=J<-I{Uf!9LmfKgmpf3FbYjV
z(WLXq6NphL8kC4U59KDIXiy?D5L;0oARJvXP-GN}a5!dUpcoIuroqE8q0iJrp2x&F
z0uRTC40ORmaj5Wcq`w(GI27*%zr&qRe=vq{C|(PGgF7F1=m%iW_v7}XM@s~}6f-as
z>k+6%O9TKVU?>hFPymLb3jjq}D2mU8mB7N00YEV}DYl<L6*f600FVzAsC%vSIw%~G
z)zt+G#rg$QL*bYLKp_%}&G*tXXpqi_mR3k8iuV>4dNV=`P~C{u&U^j^R3Vciw9#Yq
zP`pp~)OVmn5Ku%9#p@L4Mh{090*c86YUZ2#h8&Iz0!qoDSkHlKayUj1kWU_^hdEF{
zepX{EeNVr1o%a0X#}`2jM{J)TQlHQ5PatyVgTD<CL$Uw;^HfLdeDJ4*oED1pZ=jl3
zA`pl{&u5v0tr$`z<3Q(8g<}Q+#Wo703daNl@@YFooq9{Ts2I`e64K31E-I3-$ACIJ
zxhPM@YYD2dF`g+NuN?{`?8K1l@!FQ9r4qqF$@-pGmB@vGB3&rnuQT0d>U81AV4zr6
zpsVWk<Dm=31P1aoq1Y>rQKm1n-bM^9Cu6<%onO3;5t?vJVW3bGih~-c(uAYIIgvUP
zh3<Z+Q+K|>-A=9y#j6hJq3(Qx>lmgA#a?@1HMR9Zi41@uRnOP@lP{qvk!t`Ht0u)k
z4^*ipM`i$&DhebhM{%7Z93ulDUok1R6rhJ<ax}R_^W>q}lg<Wbw!W<!&lZxgS6X`U
zj#0?N(deX6J}C|~ph`X#8J+3nvQQM%OV3W)`9?rYHYv7LpogqPt`X2Q8HaWv`YmiV
zQLy6KYI2jZ!7<#gzGs^Onci3X`6fV-W3Du?4wS4rVGd)vKy3Y$cNp0Na_t=FUzjDJ
z)UhQ$vj7x1Hl=m<#$H}>cd!D8d5(Rl-MxdCvFujhq|SDdyL%@u)7@?LGYU=t0U2l$
zFB9FpWS;&0gSX)B{aQ=%Imt9Y`~Q>k$FQ_-YZ2T%^YT&uy`8%I5HG9TeUO*s?mo=R
zGIt;7<z;st>E%Ut^X%gMC3(Jc>eQ)Ir%oNBf5;sefixnja{vGU07*qoM6N<$f>q^o
A1ONa4

literal 0
HcmV?d00001

diff --git a/src/assets/icons/icon-152x152.png b/src/assets/icons/icon-152x152.png
new file mode 100644
index 0000000000000000000000000000000000000000..34a1a8d645872c776c9425de45c3fcfba12c271e
GIT binary patch
literal 1427
zcmV;E1#J3>P)<h;3K|Lk000e1NJLTq005W(005W>0{{R3FC5Sl00004XF*Lt006O%
z3;baP00001b5ch_0Itp)=>Px#S5Qn;MNDaN)BrNc058)3FxCJt%K$IW1~u3KFxCJt
z*8nrs05IMFFxCJu+yF7w05QV=FWmq!|NsBlCs6RIx%%hq)l6;YNo@Dg+Uk;~=yZ<p
zx5esUf81+^h4qx%0000FbW%=J03+<sjKuj?q8G8=GeU66B6IQp000SaNLh0L00{a3
z00{a4jl()K000E4Nkl<Zc-rlpi*lnd3`G;bV3KrsnP>X{-?>fGCXfYNSFwSa_5FdK
zVWbmbiyjU>K0ZD^K0ZD^KL2TsQY8DMN~18(vn<;gTO#sXvhT>_UZ`aLlk6vfOgE>x
z$T-hm!ES8PrsW=;^Kr6C!eqm8&oyA1v_kq*?gp^0oQ|86yBTb~R+yAK1#Fd8crAA#
znB!KMDR(-UvsRcdcL>ZyD=d{e3TC$zlI3!r<a*6W38K__xlhuz88u<#xZKBSilWZw
z;kN>%+{YP;V#uJdT7g#Xqm;#0N{kF{1!}pE)7`+j3=Yr=A6bs)`+*fjoG~J)&x^s8
z_jj;<cVOxcrZ`|!cU%};pT$qE3^1xVQU+N23)V8g$kxEQn&Ocf2P50!41*0%u)!gi
zV7lU-5;hqb43&Ofjlp2ahGeklod<?XR?vTuIKM{E^p5<BgQ+Q)a^%;q;gBg;rex`Z
zS;~|vQ?kHR7Bl6_lPoZgg-p5fBnyBEzAJFa1^}4k%9SHo0f0qsJ}^kKCuHVl$yF(q
zWThLh5lq*yB#XRXrs$}DulSNBS?I-=BiA9%299K*H_MnI*Cx+uj%1-XUV+P1-HxFY
zL$VN<#9h(fz<OM=feWy)T+16+j7wHPU<v%ds{4sz1xr>s0P7~D{|#2dlPq?GcR}Ua
z{+_|MsARG8yA+k{=P%eNDp~OG4wS2UoLa{Ulq`6lc*f+~J&)5nP_iJHz$Vx7307j0
zYyg5u$Q8r*0%Cw98-idFB-dsPRzs2%AXtJtFg3lhQHW%vZLn_oGdTw95XqufBuC^}
zpqzrm$Z^33dMyITwR*jMs{qNumm@L#fi<sSHE>)2U)kti#;?W8&*b#JvZYHF1{36S
zl>T3^PqJhK7)+ASQD$y<V?~v$fWacFTvas_MV0Ic221c`fu+P2{i+A+FtFa*m}oMr
z!oZYOumer5q+Bh%hMNqlP_Wjb#xx?k7I12tV3K@DZO&lNughRf!ANP%ugkuuIAEPM
zjV*$e1uL<gF;Vj}K9+0SOjA#z%#!7-(JYLL#q3-$yQbBdCCgeTGt1SmKUSJ0%UU`*
zo8(%V7TX4+WLaRsB-h3SR+}Unu)w52uB~|$P#Gi}vcMvPTzfNEXOOI5fhC3;K*I85
zX^^b61UC6Q6=kb)&`XxLsd&^+t_=mO)=#n@EU;87*Os;itF)43uIt7+x%M=$PAggF
zT4$)6T#1{*rFN2Kf(eaWE9y$~ppk6A1e2P{wWNa8nn^Zff<?=6ZRtzkYFV-;CRnm8
z*Pag6ElXC~0Gm#(z}kGdJjwpyE~caVZLYRC-(I3b!Psm4QS20qTl=?PCFu?<eDCv-
z<H-$J@ctJ!7vTWR&IeS<*)o_s*h&&x1UuRM6fU*)T~cWKlPL<?DmBmPf|Y6>?}F88
z9_@nlYJR5FA|6=i{)<^n7pz<JKo_iC^E0Iu0$}p6W@fu!gPNyx!6r3N>4J@Fer8w`
zTCgqu^~JOcHmrGl7ucESt>yX3@;t&!4|~X?3%0KL#V*(z)}ssdQ1i3H+8(jKyI?0Z
h@8jd+<Ky#R<S!p2d&`MM9Af|g002ovPDHLkV1o49sNVnp

literal 0
HcmV?d00001

diff --git a/src/assets/icons/icon-192x192.png b/src/assets/icons/icon-192x192.png
new file mode 100644
index 0000000000000000000000000000000000000000..9172e5dd29e4b2c35cbf4da874e778934fa27e77
GIT binary patch
literal 1790
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
UWvqof`P%?Q?*Ol6kC^=b0uRVBUjP6A

literal 0
HcmV?d00001

diff --git a/src/assets/icons/icon-384x384.png b/src/assets/icons/icon-384x384.png
new file mode 100644
index 0000000000000000000000000000000000000000..e54e8d3eafe56a617b9de13c361ed68657371e84
GIT binary patch
literal 3557
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

literal 0
HcmV?d00001

diff --git a/src/assets/icons/icon-512x512.png b/src/assets/icons/icon-512x512.png
new file mode 100644
index 0000000000000000000000000000000000000000..51ee297df1cbeb0354814ffe95afa6e4bc86ea23
GIT binary patch
literal 5008
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
FzW_h><Ej7v

literal 0
HcmV?d00001

diff --git a/src/assets/icons/icon-72x72.png b/src/assets/icons/icon-72x72.png
new file mode 100644
index 0000000000000000000000000000000000000000..2814a3f30caf3abf4de2ac85082ef83888b4b479
GIT binary patch
literal 792
zcmV+z1LypSP)<h;3K|Lk000e1NJLTq002k;002k`0{{R3VlzW^00004XF*Lt006O%
z3;baP00001b5ch_0Itp)=>Px#R8UM*MNDaN)&Mcn05H@5Fxdbx(FQfk05I49FVg@p
z+yF7i059JFFxUVv-2gG&05QV=FaQ7l>y@eERCUfVSLAPs`{wKQ$<y8=P2(+9`QGI2
zq_y<7#IBC9F#rGn4s=pZQvgJ-(lPhI7mKIsAY$I07o6z;000SaNLh0L00cn*00cn+
zG(|n;0006rNkl<ZSi|j@*=~a{5Jk&o)_7wL`Tzec;F84V4w$5>`jGn?>BzbqhH<{W
zKKbNtQU<?4Nh`*M2;(;~LCB|wDMg;XOo{V^^A$9+vR7DfcHwKpJyCYDm@MK?5zk@4
znR@LACtlT?daVq#OFFFnUaysL6d-i<n8JB4WiMcG^&uysq*Q`P0YEtgYNc!w0u%vI
zMsONAr6E8JfGPrXok3Rul%uXON6RG|gHYQg26YD1VGy!Bg`7eDq=q1<613>Hf}oTF
z3K?M;*Yw_?5X(3{vgN@kPam<7%UPO5B_t(-pp1}F_K75<4DkSgZ^u+K7b78Mj^BPl
z#(|5Pkg~#)5zE-k6SBin5|a`isF^_xmXa847bIi5%<QCvQW7JQAsLk!{t8M-fI=Xn
z><!4&t$ciRjWh?kt)HVCkdhIg3dpEekOoqQ)F*8#qnqpDSlbw>C5%2AYa1gw46>vw
zsSoY(fov(sFZKmYMmM7mh&iLW8%%1G&XKYpLAfKNw%3}*kuoAdnJr`M>__H>dq~Mh
zP-V-g+(k>-Qs(q}WXssQpxTy_-X}}zK)3Dc*I821%VcWFsJ9?(Nx8HAB~LQ8U>P-a
zuTt*pkmh5n)f|ns+Q$5J2qLyN|84E@+#+w#(H$VTc!5HXl|4%iLCo)Vlji%N$p7+I
zG8$BzyHCc90G+&N*{z@Jc&GJ~9n-C!?ijTGxE#NGXP;Ytsbkdo&MZ9H)#u-s|CMj0
W+lM#8Z~|xm0000<MNUMnLSTZ`s$=&6

literal 0
HcmV?d00001

diff --git a/src/assets/icons/icon-96x96.png b/src/assets/icons/icon-96x96.png
new file mode 100644
index 0000000000000000000000000000000000000000..d271025c4f22c7ba3c5f43ccfcab0e52ebbe80ca
GIT binary patch
literal 958
zcmV;v13~<WP)<h;3K|Lk000e1NJLTq003YB003YJ0{{R3)kcR300004XF*Lt006O%
z3;baP00001b5ch_0Itp)=>Px#QBX`&MNDaN(FHWq05Hh_FW3Mv%K$LW05R48FxUVw
z)c`Tx05I18Fx3Ds+5j=b059DDG5`Pn`|0h?DNx=~ap{et=5mep%+~Lyx#A^H+#^l%
zx5S%GFfafB01k9gPE!E&((4(;BUht~-7>L58O~@#00009a7bBm000H6000H60f4@L
z=Kuf#+(|@1RA}DqnQ3~1AQVNNP|ScL4oUXE&?Z$Ahc^JBfBJbB;3>Hreb6X6a^%R7
z;3>+#e0pA<Dy5R*Z=Rl&N%f3+MFeMLg{a1;DVIFt4=<~C)H|unf;{~!<EnxHFGd-n
z)^*e--&8);N&~zr|J2F?d@5hoy2`DA2~L$4>snVC28G71@_nt#-0QkgM3T~@)@9nd
zZWSG>a#?ZFb**E?A^ZVd{Y>W%C@dE6TmlD>DB#LG-_*Y`3;-|s%mDfk&@%wM<;-dU
z%uZG6jBg_vFwB5~1`r-lj=dzaTLJ+PjAV02+0w|<H2ndPvLytd<RqKZd3i>grk4Qi
z<rxW>_NdmZY}5-iXC>=8R<<kkx@IN2H|$O&zn&=IF)3E5fs>8=;$WuTroY=%%5X~{
z0fLsSe@zuVEn7+gB>k4?UVx64Eg=CVDVhGAi(*a6cA+O0QnGd&yjoH==>eE~y^Vl*
zry6I^Fw^>X#pCEme%Y8om0EzA0pw0)Cde3<On-)7O~}Sfjslmg{Qz2G2@F8uU$XlL
z(BNOT)EO{KHZ0Ev11g)~MtAy4woT`#0W{oc3ZNY|0ERnq0f21Wc`ZXE!_qs9b)adc
zX41Ir(%mQL!2t$WfB+?XP7~X}OGsIO1m|6|KPMYdwuA+gkYqh{5Z91wf&~=NTcU#i
zEhL+C1L)OjXai^<+4!?~4oEh@cNGsnwkv-L0!U_HfB|H)xD?q-)?>FVdcRXGE-Owu
z$vO<s?q#z8h@E724AAUkODzC$E7^cwNIkZ)B^H2kd#E%xz--TK7n|#-_fIs1x>9SV
z*n9RAfjlf%zPAXgA1U?(2-|DBO!@#4mz&4@;tEKwkz3Bf3E*?bd_7qMWaO73wgO!I
zZ{dNqzw6clvF-Nz|AlPY{=QqFiW35mQK&514$>`EMWAkRM6hnLwgYwxw;i-wsO_-b
g0#)SEkt6>uKVW<A{lK0~3jhEB07*qoM6N<$f)e<r7ytkO

literal 0
HcmV?d00001

diff --git a/src/index.html b/src/index.html
index 24fc414e2..4bef67938 100644
--- a/src/index.html
+++ b/src/index.html
@@ -14,6 +14,8 @@
    <link rel="mask-icon" href="/safari-pinned-tab.svg" color="#ffffff">
 
    <meta name="viewport" content="width=device-width, initial-scale=1">
+  <link rel="manifest" href="manifest.webmanifest">
+  <meta name="theme-color" content="#1976d2">
 </head>
 
 <body>
@@ -41,57 +43,32 @@
       </style>
       <div class="app-loading">
          <div class="logo">
-            <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#"
-               xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg"
-               xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-               xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" id="svg3406" version="1.1"
-               inkscape:version="0.92.3 (2405546, 2018-03-11)" width="167.55714" height="167.55714"
-               viewBox="0 0 167.55714 167.55714" sodipodi:docname="cassiopee_logo.svg">
+            <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" id="svg3406" version="1.1" inkscape:version="0.92.3 (2405546, 2018-03-11)" width="167.55714" height="167.55714" viewBox="0 0 167.55714 167.55714" sodipodi:docname="cassiopee_logo.svg">
                <metadata id="metadata3412">
-                  <rdf:RDF>
-                     <cc:Work rdf:about="">
+                  <rdf:rdf>
+                     <cc:work rdf:about="">
                         <dc:format>image/svg+xml</dc:format>
-                        <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" ></dc:type>
+                        <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"></dc:type>
                         <dc:title></dc:title>
-                     </cc:Work>
-                  </rdf:RDF>
+                     </cc:work>
+                  </rdf:rdf>
                </metadata>
                <defs id="defs3410"></defs>
                <g inkscape:groupmode="layer" id="layer1" inkscape:label="background">
-                  <rect
-                     style="fill:#003a80;stroke:none;stroke-width:8;stroke-miterlimit:4;stroke-dasharray:none;fill-opacity:1;stroke-opacity:1;stroke-linejoin:round"
-                     id="fond" width="165.55714" height="165.55714" x="1" y="1"></rect>
+                  <rect style="fill:#003a80;stroke:none;stroke-width:8;stroke-miterlimit:4;stroke-dasharray:none;fill-opacity:1;stroke-opacity:1;stroke-linejoin:round" id="fond" width="165.55714" height="165.55714" x="1" y="1"></rect>
                </g>
                <g inkscape:groupmode="layer" id="calque_traits" inkscape:label="traits">
-                  <path
-                     style="fill:#80b3ff;fill-rule:evenodd;stroke:#4dbbe9;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-                     d="M 16.234557,39.786389 36.297745,77.631687" id="trait_1" inkscape:connector-curvature="0"></path>
-                  <path
-                     style="fill:#80b3ff;fill-rule:evenodd;stroke:#4dbbe9;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-                     d="m 47.234816,83.975938 27.27422,0.39174" id="trait_2" inkscape:connector-curvature="0"></path>
-                  <path
-                     style="fill:#80b3ff;fill-rule:evenodd;stroke:#4dbbe9;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-                     d="M 85.615846,92.002058 101.01379,128.05358" id="trait_3" inkscape:connector-curvature="0"></path>
-                  <path
-                     style="fill:#80b3ff;fill-rule:evenodd;stroke:#4dbbe9;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-                     d="m 145.82968,107.86632 -35.62153,23.78874" id="trait_4" inkscape:connector-curvature="0"></path>
+                  <path style="fill:#80b3ff;fill-rule:evenodd;stroke:#4dbbe9;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="M 16.234557,39.786389 36.297745,77.631687" id="trait_1" inkscape:connector-curvature="0"></path>
+                  <path style="fill:#80b3ff;fill-rule:evenodd;stroke:#4dbbe9;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 47.234816,83.975938 27.27422,0.39174" id="trait_2" inkscape:connector-curvature="0"></path>
+                  <path style="fill:#80b3ff;fill-rule:evenodd;stroke:#4dbbe9;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="M 85.615846,92.002058 101.01379,128.05358" id="trait_3" inkscape:connector-curvature="0"></path>
+                  <path style="fill:#80b3ff;fill-rule:evenodd;stroke:#4dbbe9;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 145.82968,107.86632 -35.62153,23.78874" id="trait_4" inkscape:connector-curvature="0"></path>
                </g>
                <g inkscape:groupmode="layer" id="calque_points" inkscape:label="points">
-                  <circle
-                     style="fill:#ffffff;stroke:#003a80;stroke-width:10;stroke-miterlimit:66;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke markers fill"
-                     id="point_1" cx="12.879179" cy="34.64555" r="6"></circle>
-                  <circle
-                     style="fill:#ffffff;stroke:#003a80;stroke-width:10;stroke-miterlimit:66;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke markers fill"
-                     id="point_2" cx="39.734871" cy="83.581924" r="10"></circle>
-                  <circle
-                     style="fill:#ffffff;stroke:#003a80;stroke-width:10;stroke-linejoin:round;stroke-miterlimit:66;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke markers fill"
-                     id="point_3" cx="82.500542" cy="84.860001" r="10"></circle>
-                  <circle
-                     style="fill:#ffffff;stroke:#003a80;stroke-width:10;stroke-miterlimit:66;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke markers fill"
-                     id="point_4" cx="104.12913" cy="135.35852" r="10"></circle>
-                  <circle
-                     style="fill:#ffffff;stroke:#003a80;stroke-width:10;stroke-miterlimit:66;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke markers fill"
-                     id="point_5" cx="151.57199" cy="103.73587" r="10"></circle>
+                  <circle style="fill:#ffffff;stroke:#003a80;stroke-width:10;stroke-miterlimit:66;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke markers fill" id="point_1" cx="12.879179" cy="34.64555" r="6"></circle>
+                  <circle style="fill:#ffffff;stroke:#003a80;stroke-width:10;stroke-miterlimit:66;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke markers fill" id="point_2" cx="39.734871" cy="83.581924" r="10"></circle>
+                  <circle style="fill:#ffffff;stroke:#003a80;stroke-width:10;stroke-linejoin:round;stroke-miterlimit:66;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke markers fill" id="point_3" cx="82.500542" cy="84.860001" r="10"></circle>
+                  <circle style="fill:#ffffff;stroke:#003a80;stroke-width:10;stroke-miterlimit:66;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke markers fill" id="point_4" cx="104.12913" cy="135.35852" r="10"></circle>
+                  <circle style="fill:#ffffff;stroke:#003a80;stroke-width:10;stroke-miterlimit:66;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke markers fill" id="point_5" cx="151.57199" cy="103.73587" r="10"></circle>
                </g>
             </svg>
          </div>
@@ -282,6 +259,7 @@
       }
    </script>
 
+  <noscript>Please enable JavaScript to continue using this application.</noscript>
 </body>
 
 </html>
\ No newline at end of file
diff --git a/src/manifest.webmanifest b/src/manifest.webmanifest
new file mode 100644
index 000000000..24609d088
--- /dev/null
+++ b/src/manifest.webmanifest
@@ -0,0 +1,59 @@
+{
+  "name": "ngHyd",
+  "short_name": "ngHyd",
+  "theme_color": "#1976d2",
+  "background_color": "#fafafa",
+  "display": "standalone",
+  "scope": "./",
+  "start_url": "./",
+  "icons": [
+    {
+      "src": "assets/icons/icon-72x72.png",
+      "sizes": "72x72",
+      "type": "image/png",
+      "purpose": "maskable any"
+    },
+    {
+      "src": "assets/icons/icon-96x96.png",
+      "sizes": "96x96",
+      "type": "image/png",
+      "purpose": "maskable any"
+    },
+    {
+      "src": "assets/icons/icon-128x128.png",
+      "sizes": "128x128",
+      "type": "image/png",
+      "purpose": "maskable any"
+    },
+    {
+      "src": "assets/icons/icon-144x144.png",
+      "sizes": "144x144",
+      "type": "image/png",
+      "purpose": "maskable any"
+    },
+    {
+      "src": "assets/icons/icon-152x152.png",
+      "sizes": "152x152",
+      "type": "image/png",
+      "purpose": "maskable any"
+    },
+    {
+      "src": "assets/icons/icon-192x192.png",
+      "sizes": "192x192",
+      "type": "image/png",
+      "purpose": "maskable any"
+    },
+    {
+      "src": "assets/icons/icon-384x384.png",
+      "sizes": "384x384",
+      "type": "image/png",
+      "purpose": "maskable any"
+    },
+    {
+      "src": "assets/icons/icon-512x512.png",
+      "sizes": "512x512",
+      "type": "image/png",
+      "purpose": "maskable any"
+    }
+  ]
+}
-- 
GitLab