Add login and register forms (#14)
continuous-integration/drone/push Build is passing Details

Co-authored-by: hugo.pradier2 <hugo.pradier2@etu.uca.fr>
Co-authored-by: clfreville2 <clement.freville2@etu.uca.fr>
Reviewed-on: #14
Reviewed-by: Clément FRÉVILLE <clement.freville2@etu.uca.fr>
Co-authored-by: Hugo PRADIER <hugo.pradier2@etu.uca.fr>
Co-committed-by: Hugo PRADIER <hugo.pradier2@etu.uca.fr>
master
Hugo PRADIER 5 months ago committed by Clément FRÉVILLE
parent f295bd5e91
commit 80c0d99bee

2
.gitignore vendored

@ -41,4 +41,4 @@ testem.log
# System files
.DS_Store
Thumbs.db
Thumbs.db

@ -25,6 +25,7 @@
"src/assets"
],
"styles": [
"@angular/material/prebuilt-themes/indigo-pink.css",
"src/styles.scss"
],
"scripts": []
@ -40,8 +41,8 @@
"budgets": [
{
"type": "initial",
"maximumWarning": "500kb",
"maximumError": "1mb"
"maximumWarning": "2mb",
"maximumError": "3mb"
},
{
"type": "anyComponentStyle",
@ -91,6 +92,7 @@
"src/assets"
],
"styles": [
"@angular/material/prebuilt-themes/indigo-pink.css",
"src/styles.scss"
],
"scripts": [],

836
package-lock.json generated

@ -14,6 +14,7 @@
"@angular/compiler": "^17.3.7",
"@angular/core": "^17.3.7",
"@angular/forms": "^17.3.7",
"@angular/material": "^17.3.8",
"@angular/platform-browser": "^17.3.7",
"@angular/platform-browser-dynamic": "^17.3.7",
"@angular/router": "^17.3.7",
@ -582,6 +583,70 @@
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/material": {
"version": "17.3.8",
"resolved": "https://registry.npmjs.org/@angular/material/-/material-17.3.8.tgz",
"integrity": "sha512-P15p3ixO119DvqtFPCUc+9uKlFgwrwoZtKstcdx/knFlw9c+wS5s9SZzTbB2yqjZoBZ4gC92kqbUQI2o7AUbUQ==",
"dependencies": {
"@material/animation": "15.0.0-canary.7f224ddd4.0",
"@material/auto-init": "15.0.0-canary.7f224ddd4.0",
"@material/banner": "15.0.0-canary.7f224ddd4.0",
"@material/base": "15.0.0-canary.7f224ddd4.0",
"@material/button": "15.0.0-canary.7f224ddd4.0",
"@material/card": "15.0.0-canary.7f224ddd4.0",
"@material/checkbox": "15.0.0-canary.7f224ddd4.0",
"@material/chips": "15.0.0-canary.7f224ddd4.0",
"@material/circular-progress": "15.0.0-canary.7f224ddd4.0",
"@material/data-table": "15.0.0-canary.7f224ddd4.0",
"@material/density": "15.0.0-canary.7f224ddd4.0",
"@material/dialog": "15.0.0-canary.7f224ddd4.0",
"@material/dom": "15.0.0-canary.7f224ddd4.0",
"@material/drawer": "15.0.0-canary.7f224ddd4.0",
"@material/elevation": "15.0.0-canary.7f224ddd4.0",
"@material/fab": "15.0.0-canary.7f224ddd4.0",
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/floating-label": "15.0.0-canary.7f224ddd4.0",
"@material/form-field": "15.0.0-canary.7f224ddd4.0",
"@material/icon-button": "15.0.0-canary.7f224ddd4.0",
"@material/image-list": "15.0.0-canary.7f224ddd4.0",
"@material/layout-grid": "15.0.0-canary.7f224ddd4.0",
"@material/line-ripple": "15.0.0-canary.7f224ddd4.0",
"@material/linear-progress": "15.0.0-canary.7f224ddd4.0",
"@material/list": "15.0.0-canary.7f224ddd4.0",
"@material/menu": "15.0.0-canary.7f224ddd4.0",
"@material/menu-surface": "15.0.0-canary.7f224ddd4.0",
"@material/notched-outline": "15.0.0-canary.7f224ddd4.0",
"@material/radio": "15.0.0-canary.7f224ddd4.0",
"@material/ripple": "15.0.0-canary.7f224ddd4.0",
"@material/rtl": "15.0.0-canary.7f224ddd4.0",
"@material/segmented-button": "15.0.0-canary.7f224ddd4.0",
"@material/select": "15.0.0-canary.7f224ddd4.0",
"@material/shape": "15.0.0-canary.7f224ddd4.0",
"@material/slider": "15.0.0-canary.7f224ddd4.0",
"@material/snackbar": "15.0.0-canary.7f224ddd4.0",
"@material/switch": "15.0.0-canary.7f224ddd4.0",
"@material/tab": "15.0.0-canary.7f224ddd4.0",
"@material/tab-bar": "15.0.0-canary.7f224ddd4.0",
"@material/tab-indicator": "15.0.0-canary.7f224ddd4.0",
"@material/tab-scroller": "15.0.0-canary.7f224ddd4.0",
"@material/textfield": "15.0.0-canary.7f224ddd4.0",
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"@material/tooltip": "15.0.0-canary.7f224ddd4.0",
"@material/top-app-bar": "15.0.0-canary.7f224ddd4.0",
"@material/touch-target": "15.0.0-canary.7f224ddd4.0",
"@material/typography": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.3.0"
},
"peerDependencies": {
"@angular/animations": "^17.0.0 || ^18.0.0",
"@angular/cdk": "17.3.8",
"@angular/common": "^17.0.0 || ^18.0.0",
"@angular/core": "^17.0.0 || ^18.0.0",
"@angular/forms": "^17.0.0 || ^18.0.0",
"@angular/platform-browser": "^17.0.0 || ^18.0.0",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/platform-browser": {
"version": "17.3.8",
"resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.3.8.tgz",
@ -3394,6 +3459,758 @@
"node": ">= 0.4"
}
},
"node_modules/@material/animation": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/animation/-/animation-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-1GSJaPKef+7HRuV+HusVZHps64cmZuOItDbt40tjJVaikcaZvwmHlcTxRIqzcRoCdt5ZKHh3NoO7GB9Khg4Jnw==",
"dependencies": {
"tslib": "^2.1.0"
}
},
"node_modules/@material/auto-init": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/auto-init/-/auto-init-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-t7ZGpRJ3ec0QDUO0nJu/SMgLW7qcuG2KqIsEYD1Ej8qhI2xpdR2ydSDQOkVEitXmKoGol1oq4nYSBjTlB65GqA==",
"dependencies": {
"@material/base": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/banner": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/banner/-/banner-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-g9wBUZzYBizyBcBQXTIafnRUUPi7efU9gPJfzeGgkynXiccP/vh5XMmH+PBxl5v+4MlP/d4cZ2NUYoAN7UTqSA==",
"dependencies": {
"@material/base": "15.0.0-canary.7f224ddd4.0",
"@material/button": "15.0.0-canary.7f224ddd4.0",
"@material/dom": "15.0.0-canary.7f224ddd4.0",
"@material/elevation": "15.0.0-canary.7f224ddd4.0",
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/ripple": "15.0.0-canary.7f224ddd4.0",
"@material/rtl": "15.0.0-canary.7f224ddd4.0",
"@material/shape": "15.0.0-canary.7f224ddd4.0",
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"@material/tokens": "15.0.0-canary.7f224ddd4.0",
"@material/typography": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/base": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/base/-/base-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-I9KQOKXpLfJkP8MqZyr8wZIzdPHrwPjFvGd9zSK91/vPyE4hzHRJc/0njsh9g8Lm9PRYLbifXX+719uTbHxx+A==",
"dependencies": {
"tslib": "^2.1.0"
}
},
"node_modules/@material/button": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/button/-/button-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-BHB7iyHgRVH+JF16+iscR+Qaic+p7LU1FOLgP8KucRlpF9tTwIxQA6mJwGRi5gUtcG+vyCmzVS+hIQ6DqT/7BA==",
"dependencies": {
"@material/density": "15.0.0-canary.7f224ddd4.0",
"@material/dom": "15.0.0-canary.7f224ddd4.0",
"@material/elevation": "15.0.0-canary.7f224ddd4.0",
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/focus-ring": "15.0.0-canary.7f224ddd4.0",
"@material/ripple": "15.0.0-canary.7f224ddd4.0",
"@material/rtl": "15.0.0-canary.7f224ddd4.0",
"@material/shape": "15.0.0-canary.7f224ddd4.0",
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"@material/tokens": "15.0.0-canary.7f224ddd4.0",
"@material/touch-target": "15.0.0-canary.7f224ddd4.0",
"@material/typography": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/card": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/card/-/card-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-kt7y9/IWOtJTr3Z/AoWJT3ZLN7CLlzXhx2udCLP9ootZU2bfGK0lzNwmo80bv/pJfrY9ihQKCtuGTtNxUy+vIw==",
"dependencies": {
"@material/dom": "15.0.0-canary.7f224ddd4.0",
"@material/elevation": "15.0.0-canary.7f224ddd4.0",
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/ripple": "15.0.0-canary.7f224ddd4.0",
"@material/rtl": "15.0.0-canary.7f224ddd4.0",
"@material/shape": "15.0.0-canary.7f224ddd4.0",
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"@material/tokens": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/checkbox": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/checkbox/-/checkbox-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-rURcrL5O1u6hzWR+dNgiQ/n89vk6tdmdP3mZgnxJx61q4I/k1yijKqNJSLrkXH7Rto3bM5NRKMOlgvMvVd7UMQ==",
"dependencies": {
"@material/animation": "15.0.0-canary.7f224ddd4.0",
"@material/base": "15.0.0-canary.7f224ddd4.0",
"@material/density": "15.0.0-canary.7f224ddd4.0",
"@material/dom": "15.0.0-canary.7f224ddd4.0",
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/focus-ring": "15.0.0-canary.7f224ddd4.0",
"@material/ripple": "15.0.0-canary.7f224ddd4.0",
"@material/rtl": "15.0.0-canary.7f224ddd4.0",
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"@material/touch-target": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/chips": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/chips/-/chips-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-AYAivV3GSk/T/nRIpH27sOHFPaSMrE3L0WYbnb5Wa93FgY8a0fbsFYtSH2QmtwnzXveg+B1zGTt7/xIIcynKdQ==",
"dependencies": {
"@material/animation": "15.0.0-canary.7f224ddd4.0",
"@material/base": "15.0.0-canary.7f224ddd4.0",
"@material/checkbox": "15.0.0-canary.7f224ddd4.0",
"@material/density": "15.0.0-canary.7f224ddd4.0",
"@material/dom": "15.0.0-canary.7f224ddd4.0",
"@material/elevation": "15.0.0-canary.7f224ddd4.0",
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/focus-ring": "15.0.0-canary.7f224ddd4.0",
"@material/ripple": "15.0.0-canary.7f224ddd4.0",
"@material/rtl": "15.0.0-canary.7f224ddd4.0",
"@material/shape": "15.0.0-canary.7f224ddd4.0",
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"@material/tokens": "15.0.0-canary.7f224ddd4.0",
"@material/touch-target": "15.0.0-canary.7f224ddd4.0",
"@material/typography": "15.0.0-canary.7f224ddd4.0",
"safevalues": "^0.3.4",
"tslib": "^2.1.0"
}
},
"node_modules/@material/circular-progress": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/circular-progress/-/circular-progress-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-DJrqCKb+LuGtjNvKl8XigvyK02y36GRkfhMUYTcJEi3PrOE00bwXtyj7ilhzEVshQiXg6AHGWXtf5UqwNrx3Ow==",
"dependencies": {
"@material/animation": "15.0.0-canary.7f224ddd4.0",
"@material/base": "15.0.0-canary.7f224ddd4.0",
"@material/dom": "15.0.0-canary.7f224ddd4.0",
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/progress-indicator": "15.0.0-canary.7f224ddd4.0",
"@material/rtl": "15.0.0-canary.7f224ddd4.0",
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/data-table": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/data-table/-/data-table-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-/2WZsuBIq9z9RWYF5Jo6b7P6u0fwit+29/mN7rmAZ6akqUR54nXyNfoSNiyydMkzPlZZsep5KrSHododDhBZbA==",
"dependencies": {
"@material/animation": "15.0.0-canary.7f224ddd4.0",
"@material/base": "15.0.0-canary.7f224ddd4.0",
"@material/checkbox": "15.0.0-canary.7f224ddd4.0",
"@material/density": "15.0.0-canary.7f224ddd4.0",
"@material/dom": "15.0.0-canary.7f224ddd4.0",
"@material/elevation": "15.0.0-canary.7f224ddd4.0",
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/icon-button": "15.0.0-canary.7f224ddd4.0",
"@material/linear-progress": "15.0.0-canary.7f224ddd4.0",
"@material/list": "15.0.0-canary.7f224ddd4.0",
"@material/menu": "15.0.0-canary.7f224ddd4.0",
"@material/rtl": "15.0.0-canary.7f224ddd4.0",
"@material/select": "15.0.0-canary.7f224ddd4.0",
"@material/shape": "15.0.0-canary.7f224ddd4.0",
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"@material/tokens": "15.0.0-canary.7f224ddd4.0",
"@material/touch-target": "15.0.0-canary.7f224ddd4.0",
"@material/typography": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/density": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/density/-/density-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-o9EXmGKVpiQ6mHhyV3oDDzc78Ow3E7v8dlaOhgaDSXgmqaE8v5sIlLNa/LKSyUga83/fpGk3QViSGXotpQx0jA==",
"dependencies": {
"tslib": "^2.1.0"
}
},
"node_modules/@material/dialog": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/dialog/-/dialog-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-u0XpTlv1JqWC/bQ3DavJ1JguofTelLT2wloj59l3/1b60jv42JQ6Am7jU3I8/SIUB1MKaW7dYocXjDWtWJakLA==",
"dependencies": {
"@material/animation": "15.0.0-canary.7f224ddd4.0",
"@material/base": "15.0.0-canary.7f224ddd4.0",
"@material/button": "15.0.0-canary.7f224ddd4.0",
"@material/dom": "15.0.0-canary.7f224ddd4.0",
"@material/elevation": "15.0.0-canary.7f224ddd4.0",
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/icon-button": "15.0.0-canary.7f224ddd4.0",
"@material/ripple": "15.0.0-canary.7f224ddd4.0",
"@material/rtl": "15.0.0-canary.7f224ddd4.0",
"@material/shape": "15.0.0-canary.7f224ddd4.0",
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"@material/tokens": "15.0.0-canary.7f224ddd4.0",
"@material/touch-target": "15.0.0-canary.7f224ddd4.0",
"@material/typography": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/dom": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/dom/-/dom-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-mQ1HT186GPQSkRg5S18i70typ5ZytfjL09R0gJ2Qg5/G+MLCGi7TAjZZSH65tuD/QGOjel4rDdWOTmYbPYV6HA==",
"dependencies": {
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/rtl": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/drawer": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/drawer/-/drawer-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-qyO0W0KBftfH8dlLR0gVAgv7ZHNvU8ae11Ao6zJif/YxcvK4+gph1z8AO4H410YmC2kZiwpSKyxM1iQCCzbb4g==",
"dependencies": {
"@material/animation": "15.0.0-canary.7f224ddd4.0",
"@material/base": "15.0.0-canary.7f224ddd4.0",
"@material/dom": "15.0.0-canary.7f224ddd4.0",
"@material/elevation": "15.0.0-canary.7f224ddd4.0",
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/list": "15.0.0-canary.7f224ddd4.0",
"@material/ripple": "15.0.0-canary.7f224ddd4.0",
"@material/rtl": "15.0.0-canary.7f224ddd4.0",
"@material/shape": "15.0.0-canary.7f224ddd4.0",
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"@material/typography": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/elevation": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-tV6s4/pUBECedaI36Yj18KmRCk1vfue/JP/5yYRlFNnLMRVISePbZaKkn/BHXVf+26I3W879+XqIGlDVdmOoMA==",
"dependencies": {
"@material/animation": "15.0.0-canary.7f224ddd4.0",
"@material/base": "15.0.0-canary.7f224ddd4.0",
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/rtl": "15.0.0-canary.7f224ddd4.0",
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/fab": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/fab/-/fab-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-4h76QrzfZTcPdd+awDPZ4Q0YdSqsXQnS540TPtyXUJ/5G99V6VwGpjMPIxAsW0y+pmI9UkLL/srrMaJec+7r4Q==",
"dependencies": {
"@material/animation": "15.0.0-canary.7f224ddd4.0",
"@material/dom": "15.0.0-canary.7f224ddd4.0",
"@material/elevation": "15.0.0-canary.7f224ddd4.0",
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/focus-ring": "15.0.0-canary.7f224ddd4.0",
"@material/ripple": "15.0.0-canary.7f224ddd4.0",
"@material/rtl": "15.0.0-canary.7f224ddd4.0",
"@material/shape": "15.0.0-canary.7f224ddd4.0",
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"@material/tokens": "15.0.0-canary.7f224ddd4.0",
"@material/touch-target": "15.0.0-canary.7f224ddd4.0",
"@material/typography": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/feature-targeting": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-SAjtxYh6YlKZriU83diDEQ7jNSP2MnxKsER0TvFeyG1vX/DWsUyYDOIJTOEa9K1N+fgJEBkNK8hY55QhQaspew==",
"dependencies": {
"tslib": "^2.1.0"
}
},
"node_modules/@material/floating-label": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/floating-label/-/floating-label-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-0KMo5ijjYaEHPiZ2pCVIcbaTS2LycvH9zEhEMKwPPGssBCX7iz5ffYQFk7e5yrQand1r3jnQQgYfHAwtykArnQ==",
"dependencies": {
"@material/animation": "15.0.0-canary.7f224ddd4.0",
"@material/base": "15.0.0-canary.7f224ddd4.0",
"@material/dom": "15.0.0-canary.7f224ddd4.0",
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/rtl": "15.0.0-canary.7f224ddd4.0",
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"@material/typography": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/focus-ring": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/focus-ring/-/focus-ring-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-Jmg1nltq4J6S6A10EGMZnvufrvU3YTi+8R8ZD9lkSbun0Fm2TVdICQt/Auyi6An9zP66oQN6c31eqO6KfIPsDg==",
"dependencies": {
"@material/dom": "15.0.0-canary.7f224ddd4.0",
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/rtl": "15.0.0-canary.7f224ddd4.0"
}
},
"node_modules/@material/form-field": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/form-field/-/form-field-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-fEPWgDQEPJ6WF7hNnIStxucHR9LE4DoDSMqCsGWS2Yu+NLZYLuCEecgR0UqQsl1EQdNRaFh8VH93KuxGd2hiPg==",
"dependencies": {
"@material/base": "15.0.0-canary.7f224ddd4.0",
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/ripple": "15.0.0-canary.7f224ddd4.0",
"@material/rtl": "15.0.0-canary.7f224ddd4.0",
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"@material/typography": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/icon-button": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/icon-button/-/icon-button-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-DcK7IL4ICY/DW+48YQZZs9g0U1kRaW0Wb0BxhvppDMYziHo/CTpFdle4gjyuTyRxPOdHQz5a97ru48Z9O4muTw==",
"dependencies": {
"@material/base": "15.0.0-canary.7f224ddd4.0",
"@material/density": "15.0.0-canary.7f224ddd4.0",
"@material/dom": "15.0.0-canary.7f224ddd4.0",
"@material/elevation": "15.0.0-canary.7f224ddd4.0",
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/focus-ring": "15.0.0-canary.7f224ddd4.0",
"@material/ripple": "15.0.0-canary.7f224ddd4.0",
"@material/rtl": "15.0.0-canary.7f224ddd4.0",
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"@material/touch-target": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/image-list": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/image-list/-/image-list-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-voMjG2p80XbjL1B2lmF65zO5gEgJOVKClLdqh4wbYzYfwY/SR9c8eLvlYG7DLdFaFBl/7gGxD8TvvZ329HUFPw==",
"dependencies": {
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/shape": "15.0.0-canary.7f224ddd4.0",
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"@material/typography": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/layout-grid": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/layout-grid/-/layout-grid-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-veDABLxMn2RmvfnUO2RUmC1OFfWr4cU+MrxKPoDD2hl3l3eDYv5fxws6r5T1JoSyXoaN+oEZpheS0+M9Ure8Pg==",
"dependencies": {
"tslib": "^2.1.0"
}
},
"node_modules/@material/line-ripple": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/line-ripple/-/line-ripple-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-f60hVJhIU6I3/17Tqqzch1emUKEcfVVgHVqADbU14JD+oEIz429ZX9ksZ3VChoU3+eejFl+jVdZMLE/LrAuwpg==",
"dependencies": {
"@material/animation": "15.0.0-canary.7f224ddd4.0",
"@material/base": "15.0.0-canary.7f224ddd4.0",
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/linear-progress": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/linear-progress/-/linear-progress-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-pRDEwPQielDiC9Sc5XhCXrGxP8wWOnAO8sQlMebfBYHYqy5hhiIzibezS8CSaW4MFQFyXmCmpmqWlbqGYRmiyg==",
"dependencies": {
"@material/animation": "15.0.0-canary.7f224ddd4.0",
"@material/base": "15.0.0-canary.7f224ddd4.0",
"@material/dom": "15.0.0-canary.7f224ddd4.0",
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/progress-indicator": "15.0.0-canary.7f224ddd4.0",
"@material/rtl": "15.0.0-canary.7f224ddd4.0",
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/list": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/list/-/list-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-Is0NV91sJlXF5pOebYAtWLF4wU2MJDbYqztML/zQNENkQxDOvEXu3nWNb3YScMIYJJXvARO0Liur5K4yPagS1Q==",
"dependencies": {
"@material/base": "15.0.0-canary.7f224ddd4.0",
"@material/density": "15.0.0-canary.7f224ddd4.0",
"@material/dom": "15.0.0-canary.7f224ddd4.0",
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/ripple": "15.0.0-canary.7f224ddd4.0",
"@material/rtl": "15.0.0-canary.7f224ddd4.0",
"@material/shape": "15.0.0-canary.7f224ddd4.0",
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"@material/tokens": "15.0.0-canary.7f224ddd4.0",
"@material/typography": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/menu": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/menu/-/menu-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-D11QU1dXqLbh5X1zKlEhS3QWh0b5BPNXlafc5MXfkdJHhOiieb7LC9hMJhbrHtj24FadJ7evaFW/T2ugJbJNnQ==",
"dependencies": {
"@material/base": "15.0.0-canary.7f224ddd4.0",
"@material/dom": "15.0.0-canary.7f224ddd4.0",
"@material/elevation": "15.0.0-canary.7f224ddd4.0",
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/list": "15.0.0-canary.7f224ddd4.0",
"@material/menu-surface": "15.0.0-canary.7f224ddd4.0",
"@material/ripple": "15.0.0-canary.7f224ddd4.0",
"@material/rtl": "15.0.0-canary.7f224ddd4.0",
"@material/shape": "15.0.0-canary.7f224ddd4.0",
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"@material/tokens": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/menu-surface": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/menu-surface/-/menu-surface-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-7RZHvw0gbwppaAJ/Oh5SWmfAKJ62aw1IMB3+3MRwsb5PLoV666wInYa+zJfE4i7qBeOn904xqT2Nko5hY0ssrg==",
"dependencies": {
"@material/animation": "15.0.0-canary.7f224ddd4.0",
"@material/base": "15.0.0-canary.7f224ddd4.0",
"@material/elevation": "15.0.0-canary.7f224ddd4.0",
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/rtl": "15.0.0-canary.7f224ddd4.0",
"@material/shape": "15.0.0-canary.7f224ddd4.0",
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/notched-outline": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/notched-outline/-/notched-outline-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-Yg2usuKB2DKlKIBISbie9BFsOVuffF71xjbxPbybvqemxqUBd+bD5/t6H1fLE+F8/NCu5JMigho4ewUU+0RCiw==",
"dependencies": {
"@material/base": "15.0.0-canary.7f224ddd4.0",
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/floating-label": "15.0.0-canary.7f224ddd4.0",
"@material/rtl": "15.0.0-canary.7f224ddd4.0",
"@material/shape": "15.0.0-canary.7f224ddd4.0",
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/progress-indicator": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/progress-indicator/-/progress-indicator-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-UPbDjE5CqT+SqTs0mNFG6uFEw7wBlgYmh+noSkQ6ty/EURm8lF125dmi4dv4kW0+octonMXqkGtAoZwLIHKf/w==",
"dependencies": {
"tslib": "^2.1.0"
}
},
"node_modules/@material/radio": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/radio/-/radio-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-wR1X0Sr0KmQLu6+YOFKAI84G3L6psqd7Kys5kfb8WKBM36zxO5HQXC5nJm/Y0rdn22ixzsIz2GBo0MNU4V4k1A==",
"dependencies": {
"@material/animation": "15.0.0-canary.7f224ddd4.0",
"@material/base": "15.0.0-canary.7f224ddd4.0",
"@material/density": "15.0.0-canary.7f224ddd4.0",
"@material/dom": "15.0.0-canary.7f224ddd4.0",
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/focus-ring": "15.0.0-canary.7f224ddd4.0",
"@material/ripple": "15.0.0-canary.7f224ddd4.0",
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"@material/touch-target": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/ripple": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-JqOsWM1f4aGdotP0rh1vZlPZTg6lZgh39FIYHFMfOwfhR+LAikUJ+37ciqZuewgzXB6iiRO6a8aUH6HR5SJYPg==",
"dependencies": {
"@material/animation": "15.0.0-canary.7f224ddd4.0",
"@material/base": "15.0.0-canary.7f224ddd4.0",
"@material/dom": "15.0.0-canary.7f224ddd4.0",
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/rtl": "15.0.0-canary.7f224ddd4.0",
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/rtl": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-UVf14qAtmPiaaZjuJtmN36HETyoKWmsZM/qn1L5ciR2URb8O035dFWnz4ZWFMmAYBno/L7JiZaCkPurv2ZNrGA==",
"dependencies": {
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/segmented-button": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/segmented-button/-/segmented-button-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-LCnVRUSAhELTKI/9hSvyvIvQIpPpqF29BV+O9yM4WoNNmNWqTulvuiv7grHZl6Z+kJuxSg4BGbsPxxb9dXozPg==",
"dependencies": {
"@material/base": "15.0.0-canary.7f224ddd4.0",
"@material/elevation": "15.0.0-canary.7f224ddd4.0",
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/ripple": "15.0.0-canary.7f224ddd4.0",
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"@material/touch-target": "15.0.0-canary.7f224ddd4.0",
"@material/typography": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/select": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/select/-/select-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-WioZtQEXRpglum0cMSzSqocnhsGRr+ZIhvKb3FlaNrTaK8H3Y4QA7rVjv3emRtrLOOjaT6/RiIaUMTo9AGzWQQ==",
"dependencies": {
"@material/animation": "15.0.0-canary.7f224ddd4.0",
"@material/base": "15.0.0-canary.7f224ddd4.0",
"@material/density": "15.0.0-canary.7f224ddd4.0",
"@material/dom": "15.0.0-canary.7f224ddd4.0",
"@material/elevation": "15.0.0-canary.7f224ddd4.0",
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/floating-label": "15.0.0-canary.7f224ddd4.0",
"@material/line-ripple": "15.0.0-canary.7f224ddd4.0",
"@material/list": "15.0.0-canary.7f224ddd4.0",
"@material/menu": "15.0.0-canary.7f224ddd4.0",
"@material/menu-surface": "15.0.0-canary.7f224ddd4.0",
"@material/notched-outline": "15.0.0-canary.7f224ddd4.0",
"@material/ripple": "15.0.0-canary.7f224ddd4.0",
"@material/rtl": "15.0.0-canary.7f224ddd4.0",
"@material/shape": "15.0.0-canary.7f224ddd4.0",
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"@material/tokens": "15.0.0-canary.7f224ddd4.0",
"@material/typography": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/shape": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/shape/-/shape-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-8z8l1W3+cymObunJoRhwFPKZ+FyECfJ4MJykNiaZq7XJFZkV6xNmqAVrrbQj93FtLsECn9g4PjjIomguVn/OEw==",
"dependencies": {
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/rtl": "15.0.0-canary.7f224ddd4.0",
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/slider": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/slider/-/slider-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-QU/WSaSWlLKQRqOhJrPgm29wqvvzRusMqwAcrCh1JTrCl+xwJ43q5WLDfjYhubeKtrEEgGu9tekkAiYfMG7EBw==",
"dependencies": {
"@material/animation": "15.0.0-canary.7f224ddd4.0",
"@material/base": "15.0.0-canary.7f224ddd4.0",
"@material/dom": "15.0.0-canary.7f224ddd4.0",
"@material/elevation": "15.0.0-canary.7f224ddd4.0",
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/ripple": "15.0.0-canary.7f224ddd4.0",
"@material/rtl": "15.0.0-canary.7f224ddd4.0",
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"@material/tokens": "15.0.0-canary.7f224ddd4.0",
"@material/typography": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/snackbar": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/snackbar/-/snackbar-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-sm7EbVKddaXpT/aXAYBdPoN0k8yeg9+dprgBUkrdqGzWJAeCkxb4fv2B3He88YiCtvkTz2KLY4CThPQBSEsMFQ==",
"dependencies": {
"@material/animation": "15.0.0-canary.7f224ddd4.0",
"@material/base": "15.0.0-canary.7f224ddd4.0",
"@material/button": "15.0.0-canary.7f224ddd4.0",
"@material/dom": "15.0.0-canary.7f224ddd4.0",
"@material/elevation": "15.0.0-canary.7f224ddd4.0",
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/icon-button": "15.0.0-canary.7f224ddd4.0",
"@material/ripple": "15.0.0-canary.7f224ddd4.0",
"@material/rtl": "15.0.0-canary.7f224ddd4.0",
"@material/shape": "15.0.0-canary.7f224ddd4.0",
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"@material/tokens": "15.0.0-canary.7f224ddd4.0",
"@material/typography": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/switch": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/switch/-/switch-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-lEDJfRvkVyyeHWIBfoxYjJVl+WlEAE2kZ/+6OqB1FW0OV8ftTODZGhHRSzjVBA1/p4FPuhAtKtoK9jTpa4AZjA==",
"dependencies": {
"@material/animation": "15.0.0-canary.7f224ddd4.0",
"@material/base": "15.0.0-canary.7f224ddd4.0",
"@material/density": "15.0.0-canary.7f224ddd4.0",
"@material/dom": "15.0.0-canary.7f224ddd4.0",
"@material/elevation": "15.0.0-canary.7f224ddd4.0",
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/focus-ring": "15.0.0-canary.7f224ddd4.0",
"@material/ripple": "15.0.0-canary.7f224ddd4.0",
"@material/rtl": "15.0.0-canary.7f224ddd4.0",
"@material/shape": "15.0.0-canary.7f224ddd4.0",
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"@material/tokens": "15.0.0-canary.7f224ddd4.0",
"safevalues": "^0.3.4",
"tslib": "^2.1.0"
}
},
"node_modules/@material/tab": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/tab/-/tab-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-E1xGACImyCLurhnizyOTCgOiVezce4HlBFAI6YhJo/AyVwjN2Dtas4ZLQMvvWWqpyhITNkeYdOchwCC1mrz3AQ==",
"dependencies": {
"@material/base": "15.0.0-canary.7f224ddd4.0",
"@material/elevation": "15.0.0-canary.7f224ddd4.0",
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/focus-ring": "15.0.0-canary.7f224ddd4.0",
"@material/ripple": "15.0.0-canary.7f224ddd4.0",
"@material/rtl": "15.0.0-canary.7f224ddd4.0",
"@material/tab-indicator": "15.0.0-canary.7f224ddd4.0",
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"@material/tokens": "15.0.0-canary.7f224ddd4.0",
"@material/typography": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/tab-bar": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/tab-bar/-/tab-bar-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-p1Asb2NzrcECvAQU3b2SYrpyJGyJLQWR+nXTYzDKE8WOpLIRCXap2audNqD7fvN/A20UJ1J8U01ptrvCkwJ4eA==",
"dependencies": {
"@material/animation": "15.0.0-canary.7f224ddd4.0",
"@material/base": "15.0.0-canary.7f224ddd4.0",
"@material/density": "15.0.0-canary.7f224ddd4.0",
"@material/elevation": "15.0.0-canary.7f224ddd4.0",
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/tab": "15.0.0-canary.7f224ddd4.0",
"@material/tab-indicator": "15.0.0-canary.7f224ddd4.0",
"@material/tab-scroller": "15.0.0-canary.7f224ddd4.0",
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"@material/tokens": "15.0.0-canary.7f224ddd4.0",
"@material/typography": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/tab-indicator": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/tab-indicator/-/tab-indicator-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-h9Td3MPqbs33spcPS7ecByRHraYgU4tNCZpZzZXw31RypjKvISDv/PS5wcA4RmWqNGih78T7xg4QIGsZg4Pk4w==",
"dependencies": {
"@material/animation": "15.0.0-canary.7f224ddd4.0",
"@material/base": "15.0.0-canary.7f224ddd4.0",
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/tab-scroller": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/tab-scroller/-/tab-scroller-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-LFeYNjQpdXecwECd8UaqHYbhscDCwhGln5Yh+3ctvcEgvmDPNjhKn/DL3sWprWvG8NAhP6sHMrsGhQFVdCWtTg==",
"dependencies": {
"@material/animation": "15.0.0-canary.7f224ddd4.0",
"@material/base": "15.0.0-canary.7f224ddd4.0",
"@material/dom": "15.0.0-canary.7f224ddd4.0",
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/tab": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/textfield": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/textfield/-/textfield-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-AExmFvgE5nNF0UA4l2cSzPghtxSUQeeoyRjFLHLy+oAaE4eKZFrSy0zEpqPeWPQpEMDZk+6Y+6T3cOFYBeSvsw==",
"dependencies": {
"@material/animation": "15.0.0-canary.7f224ddd4.0",
"@material/base": "15.0.0-canary.7f224ddd4.0",
"@material/density": "15.0.0-canary.7f224ddd4.0",
"@material/dom": "15.0.0-canary.7f224ddd4.0",
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/floating-label": "15.0.0-canary.7f224ddd4.0",
"@material/line-ripple": "15.0.0-canary.7f224ddd4.0",
"@material/notched-outline": "15.0.0-canary.7f224ddd4.0",
"@material/ripple": "15.0.0-canary.7f224ddd4.0",
"@material/rtl": "15.0.0-canary.7f224ddd4.0",
"@material/shape": "15.0.0-canary.7f224ddd4.0",
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"@material/tokens": "15.0.0-canary.7f224ddd4.0",
"@material/typography": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/theme": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/theme/-/theme-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-hs45hJoE9yVnoVOcsN1jklyOa51U4lzWsEnQEuJTPOk2+0HqCQ0yv/q0InpSnm2i69fNSyZC60+8HADZGF8ugQ==",
"dependencies": {
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/tokens": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/tokens/-/tokens-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-r9TDoicmcT7FhUXC4eYMFnt9TZsz0G8T3wXvkKncLppYvZ517gPyD/1+yhuGfGOxAzxTrM66S/oEc1fFE2q4hw==",
"dependencies": {
"@material/elevation": "15.0.0-canary.7f224ddd4.0"
}
},
"node_modules/@material/tooltip": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/tooltip/-/tooltip-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-8qNk3pmPLTnam3XYC1sZuplQXW9xLn4Z4MI3D+U17Q7pfNZfoOugGr+d2cLA9yWAEjVJYB0mj8Yu86+udo4N9w==",
"dependencies": {
"@material/animation": "15.0.0-canary.7f224ddd4.0",
"@material/base": "15.0.0-canary.7f224ddd4.0",
"@material/button": "15.0.0-canary.7f224ddd4.0",
"@material/dom": "15.0.0-canary.7f224ddd4.0",
"@material/elevation": "15.0.0-canary.7f224ddd4.0",
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/rtl": "15.0.0-canary.7f224ddd4.0",
"@material/shape": "15.0.0-canary.7f224ddd4.0",
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"@material/tokens": "15.0.0-canary.7f224ddd4.0",
"@material/typography": "15.0.0-canary.7f224ddd4.0",
"safevalues": "^0.3.4",
"tslib": "^2.1.0"
}
},
"node_modules/@material/top-app-bar": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/top-app-bar/-/top-app-bar-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-SARR5/ClYT4CLe9qAXakbr0i0cMY0V3V4pe3ElIJPfL2Z2c4wGR1mTR8m2LxU1MfGKK8aRoUdtfKaxWejp+eNA==",
"dependencies": {
"@material/animation": "15.0.0-canary.7f224ddd4.0",
"@material/base": "15.0.0-canary.7f224ddd4.0",
"@material/elevation": "15.0.0-canary.7f224ddd4.0",
"@material/ripple": "15.0.0-canary.7f224ddd4.0",
"@material/rtl": "15.0.0-canary.7f224ddd4.0",
"@material/shape": "15.0.0-canary.7f224ddd4.0",
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"@material/typography": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/touch-target": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/touch-target/-/touch-target-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-BJo/wFKHPYLGsRaIpd7vsQwKr02LtO2e89Psv0on/p0OephlNIgeB9dD9W+bQmaeZsZ6liKSKRl6wJWDiK71PA==",
"dependencies": {
"@material/base": "15.0.0-canary.7f224ddd4.0",
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/rtl": "15.0.0-canary.7f224ddd4.0",
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/typography": {
"version": "15.0.0-canary.7f224ddd4.0",
"resolved": "https://registry.npmjs.org/@material/typography/-/typography-15.0.0-canary.7f224ddd4.0.tgz",
"integrity": "sha512-kBaZeCGD50iq1DeRRH5OM5Jl7Gdk+/NOfKArkY4ksBZvJiStJ7ACAhpvb8MEGm4s3jvDInQFLsDq3hL+SA79sQ==",
"dependencies": {
"@material/feature-targeting": "15.0.0-canary.7f224ddd4.0",
"@material/theme": "15.0.0-canary.7f224ddd4.0",
"tslib": "^2.1.0"
}
},
"node_modules/@ngtools/webpack": {
"version": "17.3.7",
"resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.3.7.tgz",
@ -5719,12 +6536,12 @@
}
},
"node_modules/braces": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
"dev": true,
"dependencies": {
"fill-range": "^7.0.1"
"fill-range": "^7.1.1"
},
"engines": {
"node": ">=8"
@ -7925,9 +8742,9 @@
}
},
"node_modules/fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
"dev": true,
"dependencies": {
"to-regex-range": "^5.0.1"
@ -12627,6 +13444,11 @@
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"dev": true
},
"node_modules/safevalues": {
"version": "0.3.4",
"resolved": "https://registry.npmjs.org/safevalues/-/safevalues-0.3.4.tgz",
"integrity": "sha512-LRneZZRXNgjzwG4bDQdOTSbze3fHm1EAKN/8bePxnlEZiBmkYEDggaHbuvHI9/hoqHbGfsEA7tWS9GhYHZBBsw=="
},
"node_modules/sass": {
"version": "1.71.1",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.71.1.tgz",

@ -18,6 +18,7 @@
"@angular/compiler": "^17.3.7",
"@angular/core": "^17.3.7",
"@angular/forms": "^17.3.7",
"@angular/material": "^17.3.8",
"@angular/platform-browser": "^17.3.7",
"@angular/platform-browser-dynamic": "^17.3.7",
"@angular/router": "^17.3.7",
@ -62,4 +63,4 @@
"prettier": "^3.2.5",
"typescript": "~5.4.5"
}
}
}

@ -2,6 +2,7 @@ import { TestBed } from '@angular/core/testing';
import { AppComponent } from './app.component';
import { TranslateModule } from '@ngx-translate/core';
import { RouterModule } from '@angular/router';
import { HttpClientModule } from '@angular/common/http';
describe('AppComponent', () => {
beforeEach(() =>
@ -9,6 +10,7 @@ describe('AppComponent', () => {
imports: [
RouterModule.forRoot([]),
AppComponent,
HttpClientModule,
TranslateModule.forRoot(),
],
})

@ -6,6 +6,8 @@ import { FormComponent } from './components/form/form.component';
import { TermsOfServiceComponent } from './components/terms-of-service/terms-of-service.component';
import { OurStoryComponent } from './components/our-story/our-story.component';
import { PrivacyPolicyComponent } from './components/privacy-policy/privacy-policy.component';
import { RegisterComponent } from './components/register/register.component';
import { LoginComponent } from './components/login/login.component';
// Toutes les routes de l'application sont définies ici
export const routes: Routes = [
@ -17,4 +19,6 @@ export const routes: Routes = [
{ path: 'our-story', component: OurStoryComponent },
{ path: 'terms-of-service', component: TermsOfServiceComponent },
{ path: 'privacy-policy', component: PrivacyPolicyComponent },
{ path: 'register', component: RegisterComponent },
{ path: 'login', component: LoginComponent },
];

@ -74,7 +74,11 @@
<div class="right_part__connexion">
<!--Login-->
<div class="right_part__connexion--login">
<div
class="right_part__connexion--login"
routerLink="/login"
routerLinkActive="active"
[routerLinkActiveOptions]="{ exact: true }">
<span>Log In</span>
<svg
width="30"
@ -95,9 +99,17 @@
</svg>
</div>
<!--Register-->
<div class="right_part__connexion--register">
<button
class="right_part__connexion--register"
routerLink="/register"
routerLinkActive="active"
[routerLinkActiveOptions]="{ exact: true }">
<span>Register Now</span>
</div>
</button>
<!-- Logout -->
<button class="right_part__connexion--logout" (click)="logout()">
<span>Logout</span>
</button>
</div>
</div>
</div>
@ -147,7 +159,11 @@
</nav>
<div class="mobile_menu__connexion">
<!--Login-->
<div class="right_part__connexion--login">
<div
class="right_part__connexion--login"
routerLink="/login"
routerLinkActive="active"
[routerLinkActiveOptions]="{ exact: true }">
<span>Log In</span>
<svg
width="30"
@ -168,9 +184,17 @@
</svg>
</div>
<!--Register-->
<div class="right_part__connexion--register">
<button
class="right_part__connexion--register"
routerLink="/register"
routerLinkActive="active"
[routerLinkActiveOptions]="{ exact: true }">
<span>Register Now</span>
</div>
</button>
<!-- Logout -->
<button class="right_part__connexion--logout" (click)="logout()">
<span>Logout</span>
</button>
</div>
</div>
</div>

@ -3,6 +3,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing';
import { HeaderComponent } from './header.component';
import { TranslateModule } from '@ngx-translate/core';
import { RouterModule } from '@angular/router';
import { HttpClientModule } from '@angular/common/http';
describe('HeaderComponent', () => {
let component: HeaderComponent;
@ -13,6 +14,7 @@ describe('HeaderComponent', () => {
imports: [
RouterModule.forRoot([]),
HeaderComponent,
HttpClientModule,
TranslateModule.forRoot(),
],
});

@ -11,6 +11,7 @@ import { TranslateModule } from '@ngx-translate/core';
import { ReactiveFormsModule } from '@angular/forms';
import { RouterLink, RouterLinkActive } from '@angular/router';
import { NgClass, NgOptimizedImage } from '@angular/common';
import { UserService } from 'src/app/services/user.service';
@Component({
selector: 'app-header',
@ -36,7 +37,10 @@ export class HeaderComponent {
@Input() themeService!: ThemeService;
// Instanciation du service pour les actions de traduction
constructor(private translationService: TranslationService) {}
constructor(
private translationService: TranslationService,
private userService: UserService
) {}
// Méthode pour changer la langue
onLanguageChange(event: Event) {
@ -63,4 +67,15 @@ export class HeaderComponent {
document.body.classList.remove('no-scroll');
}
}
// Logout
logout() {
this.userService.logoutUser().subscribe((response) => {
if (response.success) {
console.log('Logout success');
} else {
console.log('Logout error');
}
});
}
}

@ -0,0 +1,18 @@
.form-container {
display: flex;
flex-direction: column;
}
.form-field {
width: 100%;
}
.success-message {
color: green;
margin-top: 20px;
}
.error-message {
color: red;
margin-top: 20px;
}

@ -0,0 +1,33 @@
<form [formGroup]="loginForm" (ngSubmit)="loginAction()">
<mat-form-field>
<mat-label>Login</mat-label>
<input matInput formControlName="login" required />
<mat-error *ngIf="loginForm.controls.login.invalid">
Login is required
</mat-error>
</mat-form-field>
<mat-form-field>
<mat-label>Password</mat-label>
<input
matInput
[type]="hide ? 'password' : 'text'"
formControlName="password"
required />
<button
mat-icon-button
matSuffix
(click)="hide = !hide"
[attr.aria-label]="'Hide password'">
<mat-icon>{{ hide ? 'visibility_off' : 'visibility' }}</mat-icon>
</button>
<mat-error *ngIf="loginForm.controls.password.invalid">
Password is required
</mat-error>
</mat-form-field>
<button mat-raised-button type="submit">Login</button>
<div *ngIf="errorLogin">{{ errorLogin }}</div>
<div *ngIf="successLogin">{{ successLogin }}</div>
</form>

@ -0,0 +1,24 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { LoginComponent } from './login.component';
import { HttpClientModule } from '@angular/common/http';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
describe('LoginComponent', () => {
let component: LoginComponent;
let fixture: ComponentFixture<LoginComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [LoginComponent, HttpClientModule, NoopAnimationsModule],
}).compileComponents();
fixture = TestBed.createComponent(LoginComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

@ -0,0 +1,71 @@
import { Component } from '@angular/core';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import {
FormControl,
Validators,
FormsModule,
ReactiveFormsModule,
NgForm,
FormGroup,
FormBuilder,
} from '@angular/forms';
import { MatInputModule } from '@angular/material/input';
import { MatFormFieldModule } from '@angular/material/form-field';
import { merge } from 'rxjs';
import { MatIconModule } from '@angular/material/icon';
import { MatButtonModule } from '@angular/material/button';
import { CommonModule } from '@angular/common';
import { UserService } from 'src/app/services/user.service';
import { User } from 'src/app/models/user.model';
@Component({
selector: 'app-auth',
templateUrl: './login.component.html',
styleUrl: './login.component.css',
standalone: true,
imports: [
MatFormFieldModule,
MatInputModule,
FormsModule,
ReactiveFormsModule,
MatButtonModule,
MatIconModule,
CommonModule,
],
})
export class LoginComponent {
hide = true;
loginForm = this.formBuilder.group({
login: ['', Validators.required],
password: ['', Validators.required],
});
errorMessage = '';
successLogin = '';
errorLogin = '';
constructor(
private userService: UserService,
private formBuilder: FormBuilder
) {
}
loginAction() {
const formValue = this.loginForm.value;
this.userService
.loginUser(formValue.login!, formValue.password!)
.subscribe((response) => {
console.log('response :', response);
if (response.success) {
this.successLogin = 'Vous êtes connecté.';
this.errorLogin = '';
} else {
this.errorLogin = "L'authentification a échoué.";
this.successLogin = '';
}
});
}
}

@ -0,0 +1,18 @@
.form-container {
display: flex;
flex-direction: column;
}
.form-field {
width: 100%;
}
.success-message {
color: green;
margin-top: 20px;
}
.error-message {
color: red;
margin-top: 20px;
}

@ -0,0 +1,53 @@
<form [formGroup]="registerForm" (ngSubmit)="register()">
<h1>Formulaire d'inscription :</h1>
<mat-form-field class="form-field">
<mat-label>Enter your email</mat-label>
<input
matInput
placeholder="pat@example.com"
formControlName="email"
required />
<mat-error *ngIf="registerForm.controls.email.invalid">{{
errorMessage
}}</mat-error>
</mat-form-field>
<mat-form-field class="form-field">
<mat-label>Enter your login</mat-label>
<input matInput placeholder="pat" formControlName="login" required />
<mat-error *ngIf="registerForm.controls.login.invalid">{{
errorMessage
}}</mat-error>
</mat-form-field>
<mat-form-field class="form-field">
<mat-label>Enter your password</mat-label>
<input
matInput
[type]="hide ? 'password' : 'text'"
formControlName="password"
required />
<button
mat-icon-button
matSuffix
(click)="hide = !hide"
[attr.aria-label]="'Hide password'"
[attr.aria-pressed]="hide">
<mat-icon>{{ hide ? 'visibility_off' : 'visibility' }}</mat-icon>
</button>
<mat-error *ngIf="registerForm.controls.password.invalid">{{
errorMessage
}}</mat-error>
</mat-form-field>
<button mat-flat-button color="primary" type="submit">Créer un compte</button>
<!-- Message de retour de l'inscription -->
<div *ngIf="successRegister" class="success-message">
{{ successRegister }}
</div>
<div *ngIf="errorRegister" class="error-message">
{{ errorRegister }}
</div>
</form>

@ -0,0 +1,75 @@
import { Component } from '@angular/core';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import {
FormControl,
Validators,
FormsModule,
ReactiveFormsModule,
NgForm,
FormBuilder,
} from '@angular/forms';
import { MatInputModule } from '@angular/material/input';
import { MatFormFieldModule } from '@angular/material/form-field';
import { merge } from 'rxjs';
import { MatIconModule } from '@angular/material/icon';
import { MatButtonModule } from '@angular/material/button';
import { CommonModule } from '@angular/common';
import { UserService } from 'src/app/services/user.service';
import { User } from 'src/app/models/user.model';
@Component({
selector: 'app-auth',
templateUrl: './register.component.html',
styleUrl: './register.component.css',
standalone: true,
imports: [
MatFormFieldModule,
MatInputModule,
FormsModule,
ReactiveFormsModule,
MatButtonModule,
MatIconModule,
CommonModule,
],
})
export class RegisterComponent {
hide = true;
registerForm = this.formBuilder.group({
email: ['', Validators.required],
login: ['', Validators.required],
password: ['', Validators.required],
});
errorMessage = '';
successRegister = '';
errorRegister = '';
constructor(
private userService: UserService,
private formBuilder: FormBuilder
) {
}
register() {
const formRegisterValue = this.registerForm.value;
this.userService
.postUser(
formRegisterValue.email!,
formRegisterValue.login!,
formRegisterValue.password!
)
.subscribe((response) => {
console.log('response :', response);
if (response.success) {
this.successRegister = 'Votre compte a été créé avec succès.';
this.errorRegister = '';
} else {
this.errorRegister =
"L'inscription a échoué : un compte avec ce login existe déjà.";
this.successRegister = '';
}
});
}
}

@ -0,0 +1,6 @@
export interface User {
id_user: number;
login: string;
password: string;
permissions: number;
}

@ -0,0 +1,50 @@
import { Injectable } from '@angular/core';
import { User } from '../models/user.model';
import { HttpClient, HttpResponse } from '@angular/common/http';
import { Observable } from 'rxjs';
import { NgForm } from '@angular/forms';
@Injectable({
providedIn: 'root',
})
export class UserService {
API_URL = 'http://127.0.0.1:3000';
constructor(private http: HttpClient) {}
postUser(
email: string,
login: string,
password: string
): Observable<Response> {
const body = {
email: email,
login: login,
password: password,
permissions: 0,
};
return this.http.post<Response>(`${this.API_URL}/users`, body);
}
loginUser(login: string, password: string): Observable<Response> {
const body = {
login: login,
password: password,
};
return this.http.post<Response>(`${this.API_URL}/users/login`, body, {
withCredentials: true,
});
}
logoutUser(): Observable<Response> {
return this.http.post<Response>(`${this.API_URL}/users/logout`, {
withCredentials: true,
});
}
}
type Response = {
success: boolean;
};

@ -11,8 +11,14 @@
<link
href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500&display=swap"
rel="stylesheet" />
<link
href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500&display=swap"
rel="stylesheet" />
<link
href="https://fonts.googleapis.com/icon?family=Material+Icons"
rel="stylesheet" />
</head>
<body>
<body class="mat-typography">
<app-root></app-root>
</body>
</html>

@ -10,6 +10,7 @@ import {
import { ReactiveFormsModule, FormsModule } from '@angular/forms';
import { BrowserModule, bootstrapApplication } from '@angular/platform-browser';
import { TranslationService } from './app/services/translation.service';
import { provideAnimationsAsync } from '@angular/platform-browser/animations/async';
import { provideRouter, withComponentInputBinding } from '@angular/router';
import { routes } from './app/app.routes';
@ -31,5 +32,6 @@ bootstrapApplication(AppComponent, {
),
TranslationService,
provideHttpClient(withInterceptorsFromDi()),
provideAnimationsAsync(),
],
}).catch(console.error);

Loading…
Cancel
Save