From 9ac15956d435951c1908fd8450346e26fbf236c3 Mon Sep 17 00:00:00 2001 From: fabcodingzest <48706652+fabcodingzest@users.noreply.github.com> Date: Thu, 20 Aug 2020 18:51:33 +0530 Subject: [PATCH 1/5] Managing front end for custom login --- app.js | 1 + config/passportLocal.js | 0 package-lock.json | 18 +++++++++++++ package.json | 3 +++ public/css/style.css | 2 +- public/images/google.png | Bin 0 -> 53689 bytes routes/api/user.js | 8 ++++++ views/layouts/login.ejs | 7 +++--- views/login.ejs | 53 +++++++++++++++++++++++++++++++++------ views/signup.ejs | 34 +++++++++++++++++++++++++ 10 files changed, 115 insertions(+), 11 deletions(-) create mode 100644 config/passportLocal.js create mode 100644 public/images/google.png create mode 100644 routes/api/user.js create mode 100644 views/signup.ejs diff --git a/app.js b/app.js index 1ebaefa..e361ce0 100644 --- a/app.js +++ b/app.js @@ -84,6 +84,7 @@ app.use(express.static(path.join(__dirname, "public"))); // Routes app.use("/", require("./routes/api/index")); app.use("/auth", require("./routes/api/auth")); +app.use("/user", require("./routes/api/user")); app.use("/portfolio", require("./routes/api/portfolio")); app.use("/market", require("./routes/api/market")); app.use("/view", require("./routes/api/view")); diff --git a/config/passportLocal.js b/config/passportLocal.js new file mode 100644 index 0000000..e69de29 diff --git a/package-lock.json b/package-lock.json index ef450b5..6832b0b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -230,6 +230,11 @@ } } }, + "bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" + }, "binary-extensions": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", @@ -722,6 +727,11 @@ "xdg-basedir": "^4.0.0" } }, + "connect-flash": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/connect-flash/-/connect-flash-0.1.1.tgz", + "integrity": "sha1-2GMPJtlaf4UfmVax6MxnMvO2qjA=" + }, "connect-mongo": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/connect-mongo/-/connect-mongo-3.2.0.tgz", @@ -5561,6 +5571,14 @@ "passport-oauth2": "1.x.x" } }, + "passport-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", + "integrity": "sha1-H+YyaMkudWBmJkN+O5BmYsFbpu4=", + "requires": { + "passport-strategy": "1.x.x" + } + }, "passport-oauth2": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.5.0.tgz", diff --git a/package.json b/package.json index 422c070..39179b1 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,9 @@ "alphavantage": "^2.1.0", "autoprefixer": "^9.8.6", "axios": "^0.19.2", + "bcryptjs": "^2.4.3", "concurrently": "^5.3.0", + "connect-flash": "^0.1.1", "connect-mongo": "^3.2.0", "cross-env": "^7.0.2", "date-fns": "^2.15.0", @@ -48,6 +50,7 @@ "npm": "^6.14.7", "passport": "^0.4.1", "passport-google-oauth20": "^2.0.0", + "passport-local": "^1.0.0", "postcss-cli": "^7.1.1", "tailwindcss": "^1.6.2", "uuid": "^8.3.0" diff --git a/public/css/style.css b/public/css/style.css index 5234529..374c8da 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -1 +1 @@ -/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:transparent;background-image:none}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}fieldset,ol,ul{margin:0;padding:0}ol,ul{list-style:none}html{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}*,:after,:before{box-sizing:border-box;border:0 solid #e2e8f0}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#a0aec0}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#a0aec0}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:#a0aec0}input::placeholder,textarea::placeholder{color:#a0aec0}[role=button],button{cursor:pointer}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}.space-y-5>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1.25rem*(1 - var(--space-y-reverse)));margin-bottom:calc(1.25rem*var(--space-y-reverse))}.space-y-10>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(2.5rem*(1 - var(--space-y-reverse)));margin-bottom:calc(2.5rem*var(--space-y-reverse))}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.bg-transparent{background-color:transparent}.bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.bg-gray-100{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.bg-gray-200{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.bg-gray-300{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.bg-gray-700{--bg-opacity:1;background-color:#4a5568;background-color:rgba(74,85,104,var(--bg-opacity))}.bg-yellow-500{--bg-opacity:1;background-color:#ecc94b;background-color:rgba(236,201,75,var(--bg-opacity))}.bg-green-200{--bg-opacity:1;background-color:#c6f6d5;background-color:rgba(198,246,213,var(--bg-opacity))}.bg-teal-500{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.bg-blue-400{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.bg-blue-500{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.bg-blue-600{--bg-opacity:1;background-color:#3182ce;background-color:rgba(49,130,206,var(--bg-opacity))}.bg-blue-800{--bg-opacity:1;background-color:#2c5282;background-color:rgba(44,82,130,var(--bg-opacity))}.bg-secondary-100{--bg-opacity:1;background-color:#e2e2d5;background-color:rgba(226,226,213,var(--bg-opacity))}.bg-tempc-400{--bg-opacity:1;background-color:#266fea;background-color:rgba(38,111,234,var(--bg-opacity))}.bg-tempc-500{--bg-opacity:1;background-color:#41d7aa;background-color:rgba(65,215,170,var(--bg-opacity))}.hover\:bg-white:hover{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.hover\:bg-gray-200:hover{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.hover\:bg-red-400:hover{--bg-opacity:1;background-color:#fc8181;background-color:rgba(252,129,129,var(--bg-opacity))}.hover\:bg-yellow-600:hover{--bg-opacity:1;background-color:#d69e2e;background-color:rgba(214,158,46,var(--bg-opacity))}.hover\:bg-green-400:hover{--bg-opacity:1;background-color:#68d391;background-color:rgba(104,211,145,var(--bg-opacity))}.hover\:bg-teal-500:hover{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.hover\:bg-blue-400:hover{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.hover\:bg-blue-500:hover{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.hover\:bg-blue-700:hover{--bg-opacity:1;background-color:#2b6cb0;background-color:rgba(43,108,176,var(--bg-opacity))}.hover\:bg-indigo-700:hover{--bg-opacity:1;background-color:#4c51bf;background-color:rgba(76,81,191,var(--bg-opacity))}.focus\:bg-gray-200:focus{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.hover\:bg-opacity-50:hover{--bg-opacity:0.5}.border-gray-100{--border-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--border-opacity))}.border-gray-200{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.border-green-400{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.border-teal-500{--border-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--border-opacity))}.border-blue-500{--border-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.border-blue-600{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.border-purple-700{--border-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--border-opacity))}.hover\:border-green-400:hover{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.hover\:border-blue-600:hover{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.rounded-sm{border-radius:.125rem}.rounded{border-radius:.25rem}.rounded-lg{border-radius:.5rem}.rounded-full{border-radius:9999px}.rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.border-4{border-width:4px}.border-8{border-width:8px}.border{border-width:1px}.border-b-2{border-bottom-width:2px}.border-l-8{border-left-width:8px}.border-b{border-bottom-width:1px}.cursor-pointer{cursor:pointer}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.flex-grow{flex-grow:1}.flex-shrink-0{flex-shrink:0}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-10{height:2.5rem}.h-16{height:4rem}.h-20{height:5rem}.h-64{height:16rem}.h-auto{height:auto}.h-full{height:100%}.text-xs{font-size:.75rem}.text-sm{font-size:.875rem}.text-base{font-size:1rem}.text-lg{font-size:1.125rem}.text-xl{font-size:1.25rem}.text-2xl{font-size:1.5rem}.text-3xl{font-size:1.875rem}.text-4xl{font-size:2.25rem}.text-5xl{font-size:3rem}.text-6xl{font-size:4rem}.leading-none{line-height:1}.leading-tight{line-height:1.25}.leading-normal{line-height:1.5}.m-4{margin:1rem}.m-8{margin:2rem}.-m-4{margin:-1rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.my-4{margin-top:1rem;margin-bottom:1rem}.my-8{margin-top:2rem;margin-bottom:2rem}.mx-auto{margin-left:auto;margin-right:auto}.-mx-8{margin-left:-2rem;margin-right:-2rem}.ml-0{margin-left:0}.mr-1{margin-right:.25rem}.mb-1{margin-bottom:.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.mb-2{margin-bottom:.5rem}.ml-2{margin-left:.5rem}.mt-3{margin-top:.75rem}.mb-3{margin-bottom:.75rem}.ml-3{margin-left:.75rem}.mt-4{margin-top:1rem}.mb-4{margin-bottom:1rem}.ml-4{margin-left:1rem}.mt-6{margin-top:1.5rem}.mr-6{margin-right:1.5rem}.mt-8{margin-top:2rem}.mb-8{margin-bottom:2rem}.mb-10{margin-bottom:2.5rem}.mt-12{margin-top:3rem}.max-w-xs{max-width:20rem}.max-w-sm{max-width:24rem}.max-w-4xl{max-width:56rem}.max-w-6xl{max-width:72rem}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.min-w-0{min-width:0}.object-cover{-o-object-fit:cover;object-fit:cover}.focus\:outline-none:focus,.outline-none{outline:0}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-4{padding-left:1rem;padding-right:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.py-16{padding-top:4rem;padding-bottom:4rem}.pt-2{padding-top:.5rem}.pb-2{padding-bottom:.5rem}.pl-2{padding-left:.5rem}.pr-4{padding-right:1rem}.pb-4{padding-bottom:1rem}.pt-6{padding-top:1.5rem}.pb-8{padding-bottom:2rem}.pt-10{padding-top:2.5rem}.pr-10{padding-right:2.5rem}.pl-10{padding-left:2.5rem}.pt-20{padding-top:5rem}.pt-32{padding-top:8rem}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.top-0{top:0}.right-0{right:0}.bottom-0{bottom:0}.left-0{left:0}.shadow{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.shadow-md{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.shadow-lg{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.shadow-2xl{box-shadow:0 25px 50px -12px rgba(0,0,0,.25)}.hover\:shadow-inner:hover{box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.focus\:shadow-outline:focus{box-shadow:0 0 0 3px rgba(66,153,225,.5)}.fill-current{fill:currentColor}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-black{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.text-gray-500{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.text-gray-600{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.text-gray-700{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.text-gray-800{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.text-gray-900{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.text-green-900{--text-opacity:1;color:#22543d;color:rgba(34,84,61,var(--text-opacity))}.text-teal-500{--text-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--text-opacity))}.text-secondary-200{--text-opacity:1;color:#888883;color:rgba(136,136,131,var(--text-opacity))}.text-tempc-200{--text-opacity:1;color:#e93434;color:rgba(233,52,52,var(--text-opacity))}.text-tempc-400{--text-opacity:1;color:#266fea;color:rgba(38,111,234,var(--text-opacity))}.text-tempc-500{--text-opacity:1;color:#41d7aa;color:rgba(65,215,170,var(--text-opacity))}.hover\:text-black:hover{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.hover\:text-white:hover{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.hover\:text-gray-900:hover{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.focus\:text-black:focus{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.focus\:text-gray-900:focus{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.uppercase{text-transform:uppercase}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.whitespace-no-wrap{white-space:nowrap}.break-words{overflow-wrap:break-word}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-10{width:2.5rem}.w-16{width:4rem}.w-20{width:5rem}.w-24{width:6rem}.w-32{width:8rem}.w-auto{width:auto}.w-2\/3{width:66.666667%}.w-2\/5{width:40%}.w-full{width:100%}.w-screen{width:100vw}.gap-4{grid-gap:1rem;gap:1rem}.gap-8{grid-gap:2rem;gap:2rem}.gap-10{grid-gap:2.5rem;gap:2.5rem}.grid-flow-col{grid-auto-flow:column}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.grid-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.transform{--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y))}.hover\:scale-125:hover{--transform-scale-x:1.25;--transform-scale-y:1.25}.transition{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}@-webkit-keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@-webkit-keyframes ping{0%{transform:scale(1);opacity:1}75%,to{transform:scale(2);opacity:0}}@keyframes ping{0%{transform:scale(1);opacity:1}75%,to{transform:scale(2);opacity:0}}@-webkit-keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}@-webkit-keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:translateY(0);-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}@keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:translateY(0);-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}body,html{margin:0;padding:0;width:100%;height:100%;overflow-x:hidden;box-sizing:border-box;background-color:#e2e8f0}.chartjs-container{position:relative;margin:auto;height:75vh;width:75vw}.symbolicon{font-size:72px;background:-webkit-linear-gradient(#eee,#333);background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:transparent}@media (min-width:640px){.sm\:container{width:100%;max-width:640px}@media (min-width:768px){.sm\:container{max-width:768px}}@media (min-width:1024px){.sm\:container{max-width:1024px}}@media (min-width:1280px){.sm\:container{max-width:1280px}}.sm\:h-20{height:5rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:px-8{padding-left:2rem;padding-right:2rem}}@media (min-width:768px){.md\:container{width:100%}@media (min-width:640px){.md\:container{max-width:640px}}@media (min-width:768px){.md\:container{max-width:768px}}@media (min-width:1024px){.md\:container{max-width:1024px}}@media (min-width:1280px){.md\:container{max-width:1280px}}.md\:block{display:block}.md\:inline-block{display:inline-block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:flex-row{flex-direction:row}.md\:items-center{align-items:center}.md\:justify-center{justify-content:center}.md\:text-sm{font-size:.875rem}.md\:text-xl{font-size:1.25rem}.md\:text-2xl{font-size:1.5rem}.md\:text-3xl{font-size:1.875rem}.md\:mx-auto{margin-left:auto;margin-right:auto}.md\:ml-56{margin-left:14rem}.md\:ml-64{margin-left:16rem}.md\:ml-auto{margin-left:auto}.md\:min-h-full{min-height:100%}.md\:px-2{padding-left:.5rem;padding-right:.5rem}.md\:px-8{padding-left:2rem;padding-right:2rem}.md\:px-10{padding-left:2.5rem;padding-right:2.5rem}.md\:py-12{padding-top:3rem;padding-bottom:3rem}.md\:pb-0{padding-bottom:0}.md\:fixed{position:fixed}.md\:top-0{top:0}.md\:left-0{left:0}.md\:break-all{word-break:break-all}.md\:w-56{width:14rem}.md\:w-1\/2{width:50%}.md\:w-4\/5{width:80%}.md\:gap-4{grid-gap:1rem;gap:1rem}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:col-span-4{grid-column:span 4/span 4}.md\:grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.md\:grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}}@media (min-width:1024px){.lg\:container{width:100%}@media (min-width:640px){.lg\:container{max-width:640px}}@media (min-width:768px){.lg\:container{max-width:768px}}@media (min-width:1024px){.lg\:container{max-width:1024px}}@media (min-width:1280px){.lg\:container{max-width:1280px}}.lg\:block{display:block}.lg\:grid{display:grid}.lg\:items-start{align-items:flex-start}.lg\:items-center{align-items:center}.lg\:justify-center{justify-content:center}.lg\:text-sm{font-size:.875rem}.lg\:text-base{font-size:1rem}.lg\:text-lg{font-size:1.125rem}.lg\:text-3xl{font-size:1.875rem}.lg\:text-4xl{font-size:2.25rem}.lg\:text-6xl{font-size:4rem}.lg\:ml-64{margin-left:16rem}.lg\:p-6{padding:1.5rem}.lg\:text-center{text-align:center}.lg\:w-64{width:16rem}.lg\:w-1\/4{width:25%}.lg\:w-3\/5{width:60%}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.lg\:grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.lg\:row-span-2{grid-row:span 2/span 2}}@media (min-width:1280px){.xl\:container{width:100%}@media (min-width:640px){.xl\:container{max-width:640px}}@media (min-width:768px){.xl\:container{max-width:768px}}@media (min-width:1024px){.xl\:container{max-width:1024px}}@media (min-width:1280px){.xl\:container{max-width:1280px}}.xl\:text-2xl{font-size:1.5rem}} \ No newline at end of file +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:transparent;background-image:none}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}fieldset,ol,ul{margin:0;padding:0}ol,ul{list-style:none}html{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}*,:after,:before{box-sizing:border-box;border:0 solid #e2e8f0}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#a0aec0}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#a0aec0}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:#a0aec0}input::placeholder,textarea::placeholder{color:#a0aec0}[role=button],button{cursor:pointer}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}.space-y-5>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1.25rem*(1 - var(--space-y-reverse)));margin-bottom:calc(1.25rem*var(--space-y-reverse))}.space-y-10>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(2.5rem*(1 - var(--space-y-reverse)));margin-bottom:calc(2.5rem*var(--space-y-reverse))}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.bg-transparent{background-color:transparent}.bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.bg-gray-100{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.bg-gray-200{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.bg-gray-300{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.bg-gray-700{--bg-opacity:1;background-color:#4a5568;background-color:rgba(74,85,104,var(--bg-opacity))}.bg-gray-900{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.bg-red-900{--bg-opacity:1;background-color:#742a2a;background-color:rgba(116,42,42,var(--bg-opacity))}.bg-yellow-500{--bg-opacity:1;background-color:#ecc94b;background-color:rgba(236,201,75,var(--bg-opacity))}.bg-green-200{--bg-opacity:1;background-color:#c6f6d5;background-color:rgba(198,246,213,var(--bg-opacity))}.bg-teal-500{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.bg-blue-400{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.bg-blue-500{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.bg-blue-600{--bg-opacity:1;background-color:#3182ce;background-color:rgba(49,130,206,var(--bg-opacity))}.bg-blue-800{--bg-opacity:1;background-color:#2c5282;background-color:rgba(44,82,130,var(--bg-opacity))}.bg-secondary-100{--bg-opacity:1;background-color:#e2e2d5;background-color:rgba(226,226,213,var(--bg-opacity))}.bg-tempc-400{--bg-opacity:1;background-color:#266fea;background-color:rgba(38,111,234,var(--bg-opacity))}.bg-tempc-500{--bg-opacity:1;background-color:#41d7aa;background-color:rgba(65,215,170,var(--bg-opacity))}.hover\:bg-white:hover{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.hover\:bg-gray-200:hover{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.hover\:bg-red-400:hover{--bg-opacity:1;background-color:#fc8181;background-color:rgba(252,129,129,var(--bg-opacity))}.hover\:bg-yellow-600:hover{--bg-opacity:1;background-color:#d69e2e;background-color:rgba(214,158,46,var(--bg-opacity))}.hover\:bg-green-400:hover{--bg-opacity:1;background-color:#68d391;background-color:rgba(104,211,145,var(--bg-opacity))}.hover\:bg-teal-500:hover{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.hover\:bg-blue-400:hover{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.hover\:bg-blue-500:hover{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.hover\:bg-blue-700:hover{--bg-opacity:1;background-color:#2b6cb0;background-color:rgba(43,108,176,var(--bg-opacity))}.hover\:bg-indigo-700:hover{--bg-opacity:1;background-color:#4c51bf;background-color:rgba(76,81,191,var(--bg-opacity))}.focus\:bg-gray-200:focus{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.hover\:bg-opacity-50:hover{--bg-opacity:0.5}.border-gray-100{--border-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--border-opacity))}.border-gray-200{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.border-gray-400{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.border-green-400{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.border-teal-500{--border-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--border-opacity))}.border-blue-500{--border-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.border-blue-600{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.border-purple-700{--border-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--border-opacity))}.hover\:border-green-400:hover{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.hover\:border-blue-600:hover{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.rounded-sm{border-radius:.125rem}.rounded{border-radius:.25rem}.rounded-lg{border-radius:.5rem}.rounded-full{border-radius:9999px}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.border-4{border-width:4px}.border-8{border-width:8px}.border{border-width:1px}.border-b-2{border-bottom-width:2px}.border-l-8{border-left-width:8px}.border-b{border-bottom-width:1px}.cursor-pointer{cursor:pointer}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.flex-auto{flex:1 1 auto}.flex-grow{flex-grow:1}.flex-shrink-0{flex-shrink:0}.font-normal{font-weight:400}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-10{height:2.5rem}.h-16{height:4rem}.h-20{height:5rem}.h-64{height:16rem}.h-auto{height:auto}.h-full{height:100%}.text-xs{font-size:.75rem}.text-sm{font-size:.875rem}.text-base{font-size:1rem}.text-lg{font-size:1.125rem}.text-xl{font-size:1.25rem}.text-2xl{font-size:1.5rem}.text-3xl{font-size:1.875rem}.text-4xl{font-size:2.25rem}.text-5xl{font-size:3rem}.text-6xl{font-size:4rem}.leading-none{line-height:1}.leading-tight{line-height:1.25}.leading-normal{line-height:1.5}.m-4{margin:1rem}.m-8{margin:2rem}.-m-4{margin:-1rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.my-4{margin-top:1rem;margin-bottom:1rem}.my-8{margin-top:2rem;margin-bottom:2rem}.mx-auto{margin-left:auto;margin-right:auto}.-mx-8{margin-left:-2rem;margin-right:-2rem}.mb-0{margin-bottom:0}.ml-0{margin-left:0}.mr-1{margin-right:.25rem}.mb-1{margin-bottom:.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.mb-2{margin-bottom:.5rem}.ml-2{margin-left:.5rem}.mt-3{margin-top:.75rem}.mb-3{margin-bottom:.75rem}.ml-3{margin-left:.75rem}.mt-4{margin-top:1rem}.mb-4{margin-bottom:1rem}.ml-4{margin-left:1rem}.mt-6{margin-top:1.5rem}.mr-6{margin-right:1.5rem}.mb-6{margin-bottom:1.5rem}.mt-8{margin-top:2rem}.mb-8{margin-bottom:2rem}.mb-10{margin-bottom:2.5rem}.mt-12{margin-top:3rem}.max-w-xs{max-width:20rem}.max-w-sm{max-width:24rem}.max-w-4xl{max-width:56rem}.max-w-6xl{max-width:72rem}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.min-w-0{min-width:0}.object-cover{-o-object-fit:cover;object-fit:cover}.focus\:outline-none:focus,.outline-none{outline:0}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-4{padding-left:1rem;padding-right:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.py-16{padding-top:4rem;padding-bottom:4rem}.pt-0{padding-top:0}.pt-2{padding-top:.5rem}.pb-2{padding-bottom:.5rem}.pl-2{padding-left:.5rem}.pr-4{padding-right:1rem}.pb-4{padding-bottom:1rem}.pt-6{padding-top:1.5rem}.pb-8{padding-bottom:2rem}.pt-10{padding-top:2.5rem}.pr-10{padding-right:2.5rem}.pl-10{padding-left:2.5rem}.pt-20{padding-top:5rem}.pt-32{padding-top:8rem}.placeholder-gray-400::-moz-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.placeholder-gray-400:-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.placeholder-gray-400::-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.placeholder-gray-400::placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.top-0{top:0}.right-0{right:0}.bottom-0{bottom:0}.left-0{left:0}.shadow{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.shadow-md{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.shadow-lg{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.shadow-2xl{box-shadow:0 25px 50px -12px rgba(0,0,0,.25)}.hover\:shadow-md:hover{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.hover\:shadow-lg:hover{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.hover\:shadow-inner:hover{box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.focus\:shadow-outline:focus{box-shadow:0 0 0 3px rgba(66,153,225,.5)}.fill-current{fill:currentColor}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-black{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.text-gray-500{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.text-gray-600{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.text-gray-700{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.text-gray-800{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.text-gray-900{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.text-green-900{--text-opacity:1;color:#22543d;color:rgba(34,84,61,var(--text-opacity))}.text-teal-500{--text-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--text-opacity))}.text-blue-200{--text-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--text-opacity))}.text-secondary-200{--text-opacity:1;color:#888883;color:rgba(136,136,131,var(--text-opacity))}.text-tempc-200{--text-opacity:1;color:#e93434;color:rgba(233,52,52,var(--text-opacity))}.text-tempc-400{--text-opacity:1;color:#266fea;color:rgba(38,111,234,var(--text-opacity))}.text-tempc-500{--text-opacity:1;color:#41d7aa;color:rgba(65,215,170,var(--text-opacity))}.hover\:text-black:hover{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.hover\:text-white:hover{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.hover\:text-gray-900:hover{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.focus\:text-black:focus{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.focus\:text-gray-900:focus{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.uppercase{text-transform:uppercase}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.whitespace-no-wrap{white-space:nowrap}.break-words{overflow-wrap:break-word}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-10{width:2.5rem}.w-16{width:4rem}.w-20{width:5rem}.w-24{width:6rem}.w-32{width:8rem}.w-auto{width:auto}.w-2\/3{width:66.666667%}.w-2\/5{width:40%}.w-full{width:100%}.w-screen{width:100vw}.gap-4{grid-gap:1rem;gap:1rem}.gap-8{grid-gap:2rem;gap:2rem}.gap-10{grid-gap:2.5rem;gap:2.5rem}.grid-flow-col{grid-auto-flow:column}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.grid-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.transform{--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y))}.hover\:scale-125:hover{--transform-scale-x:1.25;--transform-scale-y:1.25}.transition{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}@-webkit-keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@-webkit-keyframes ping{0%{transform:scale(1);opacity:1}75%,to{transform:scale(2);opacity:0}}@keyframes ping{0%{transform:scale(1);opacity:1}75%,to{transform:scale(2);opacity:0}}@-webkit-keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}@-webkit-keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:translateY(0);-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}@keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:translateY(0);-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}body,html{margin:0;padding:0;width:100%;height:100%;overflow-x:hidden;box-sizing:border-box;background-color:#e2e8f0}.chartjs-container{position:relative;margin:auto;height:75vh;width:75vw}.symbolicon{font-size:72px;background:-webkit-linear-gradient(#eee,#333);background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:transparent}.min-w-300{min-width:300px}@media (min-width:640px){.sm\:container{width:100%;max-width:640px}@media (min-width:768px){.sm\:container{max-width:768px}}@media (min-width:1024px){.sm\:container{max-width:1024px}}@media (min-width:1280px){.sm\:container{max-width:1280px}}.sm\:h-20{height:5rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:px-8{padding-left:2rem;padding-right:2rem}}@media (min-width:768px){.md\:container{width:100%}@media (min-width:640px){.md\:container{max-width:640px}}@media (min-width:768px){.md\:container{max-width:768px}}@media (min-width:1024px){.md\:container{max-width:1024px}}@media (min-width:1280px){.md\:container{max-width:1280px}}.md\:block{display:block}.md\:inline-block{display:inline-block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:flex-row{flex-direction:row}.md\:items-center{align-items:center}.md\:justify-center{justify-content:center}.md\:text-sm{font-size:.875rem}.md\:text-xl{font-size:1.25rem}.md\:text-2xl{font-size:1.5rem}.md\:text-3xl{font-size:1.875rem}.md\:mx-auto{margin-left:auto;margin-right:auto}.md\:ml-56{margin-left:14rem}.md\:ml-64{margin-left:16rem}.md\:ml-auto{margin-left:auto}.md\:min-h-full{min-height:100%}.md\:px-2{padding-left:.5rem;padding-right:.5rem}.md\:px-8{padding-left:2rem;padding-right:2rem}.md\:px-10{padding-left:2.5rem;padding-right:2.5rem}.md\:py-12{padding-top:3rem;padding-bottom:3rem}.md\:pb-0{padding-bottom:0}.md\:fixed{position:fixed}.md\:top-0{top:0}.md\:left-0{left:0}.md\:break-all{word-break:break-all}.md\:w-56{width:14rem}.md\:w-1\/2{width:50%}.md\:w-4\/5{width:80%}.md\:gap-4{grid-gap:1rem;gap:1rem}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:col-span-4{grid-column:span 4/span 4}.md\:grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.md\:grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}}@media (min-width:1024px){.lg\:container{width:100%}@media (min-width:640px){.lg\:container{max-width:640px}}@media (min-width:768px){.lg\:container{max-width:768px}}@media (min-width:1024px){.lg\:container{max-width:1024px}}@media (min-width:1280px){.lg\:container{max-width:1280px}}.lg\:block{display:block}.lg\:grid{display:grid}.lg\:items-start{align-items:flex-start}.lg\:items-center{align-items:center}.lg\:justify-center{justify-content:center}.lg\:text-sm{font-size:.875rem}.lg\:text-base{font-size:1rem}.lg\:text-lg{font-size:1.125rem}.lg\:text-3xl{font-size:1.875rem}.lg\:text-4xl{font-size:2.25rem}.lg\:text-6xl{font-size:4rem}.lg\:ml-64{margin-left:16rem}.lg\:p-6{padding:1.5rem}.lg\:px-10{padding-left:2.5rem;padding-right:2.5rem}.lg\:text-center{text-align:center}.lg\:w-64{width:16rem}.lg\:w-1\/4{width:25%}.lg\:w-3\/5{width:60%}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.lg\:grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.lg\:row-span-2{grid-row:span 2/span 2}}@media (min-width:1280px){.xl\:container{width:100%}@media (min-width:640px){.xl\:container{max-width:640px}}@media (min-width:768px){.xl\:container{max-width:768px}}@media (min-width:1024px){.xl\:container{max-width:1024px}}@media (min-width:1280px){.xl\:container{max-width:1280px}}.xl\:text-2xl{font-size:1.5rem}} \ No newline at end of file diff --git a/public/images/google.png b/public/images/google.png new file mode 100644 index 0000000000000000000000000000000000000000..9074676b7f42c1389d693846866a630e3f9e6072 GIT binary patch literal 53689 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�nW$r$;$sq+VB-|-?Cj{SD$=96 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 Tv==@^5}#1lJ(hm-{Pq6 { + res.status(200).render('signup', {layout: 'layouts/login'}) +}) + +module.exports = router; \ No newline at end of file diff --git a/views/layouts/login.ejs b/views/layouts/login.ejs index 1fbc4e3..96844c9 100644 --- a/views/layouts/login.ejs +++ b/views/layouts/login.ejs @@ -4,15 +4,16 @@ - + TradeByte - + <%- body %> - + \ No newline at end of file diff --git a/views/login.ejs b/views/login.ejs index 56199c3..246ec55 100644 --- a/views/login.ejs +++ b/views/login.ejs @@ -1,7 +1,46 @@ -

**Login/Landing Page**

- -
- - - Login With Google - +
+

TradeByte

+
+
+
+
Sign in with
+
+ +
+
+
+
Or sign in with credentials
+
+
+ + +
+
+ + +
+ +
+
+
+
\ No newline at end of file diff --git a/views/signup.ejs b/views/signup.ejs new file mode 100644 index 0000000..2f670c6 --- /dev/null +++ b/views/signup.ejs @@ -0,0 +1,34 @@ +
+

TradeByte

+
+
+
+
+
Or sign in with credentials
+
+
+ + +
+
+ + +
+ +
+
+
+
\ No newline at end of file From c9a6635661604938413049ea42f56a03c6347413 Mon Sep 17 00:00:00 2001 From: fabcodingzest <48706652+fabcodingzest@users.noreply.github.com> Date: Thu, 20 Aug 2020 23:44:09 +0530 Subject: [PATCH 2/5] Front end and some backend for custom login --- config/passportLocal.js | 40 +++++++++++++++++++++++++ middleware/auth.js | 3 +- public/css/style.css | 2 +- public/css/tailwind.css | 19 +++++++++--- routes/api/user.js | 10 +++++-- tailwind.config.js | 4 --- views/layouts/login.ejs | 1 + views/login.ejs | 34 ++++++++++----------- views/signup.ejs | 66 ++++++++++++++++++++++++----------------- 9 files changed, 120 insertions(+), 59 deletions(-) diff --git a/config/passportLocal.js b/config/passportLocal.js index e69de29..cc0da44 100644 --- a/config/passportLocal.js +++ b/config/passportLocal.js @@ -0,0 +1,40 @@ +const LocalStrategy = require('passport-local').Strategy; +const bcrypt = require('bcryptjs'); + +// Load User model +const User = require('../models/User'); + +module.exports = function (passport) { + passport.use( + new LocalStrategy({ usernameField: 'email' }, (email, password, done) => { + // Match User + User.findOne({ + email: email + }).then(user => { + if (!user) { + return done(null, false, { message: 'That email is not registered' }) + } + + // Match user Password + bcrypt.compare(password, user.password, (err, isMatch) => { + if (err) throw err; + if (isMatch) { + done(null, user); + } else { + return done(null, false, { message: 'That password is incorrect' }) + } + }) + }) + }) + ) + + passport.serializeUser((user, done) => { + done(null, user.id); + }); + + passport.deserializeUser((id, done) => { + User.findById(id, (err, user) => { + done(err, user); + }); + }); +} \ No newline at end of file diff --git a/middleware/auth.js b/middleware/auth.js index c02b88c..a7fae58 100644 --- a/middleware/auth.js +++ b/middleware/auth.js @@ -5,7 +5,8 @@ module.exports = { if (req.isAuthenticated()) { return next(); } else { - res.redirect("/"); + req.flash('error_msg', 'Please log in to view that resource'); + res.redirect('/'); } }, ensureGuest: function (req, res, next) { diff --git a/public/css/style.css b/public/css/style.css index 3f77280..f51cc30 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -1 +1 @@ -/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:transparent;background-image:none}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}fieldset,ol,ul{margin:0;padding:0}ol,ul{list-style:none}html{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}*,:after,:before{box-sizing:border-box;border:0 solid #e2e8f0}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#a0aec0}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#a0aec0}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:#a0aec0}input::placeholder,textarea::placeholder{color:#a0aec0}[role=button],button{cursor:pointer}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}.space-y-5>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1.25rem*(1 - var(--space-y-reverse)));margin-bottom:calc(1.25rem*var(--space-y-reverse))}.space-y-10>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(2.5rem*(1 - var(--space-y-reverse)));margin-bottom:calc(2.5rem*var(--space-y-reverse))}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.bg-transparent{background-color:transparent}.bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.bg-gray-100{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.bg-gray-200{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.bg-gray-300{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.bg-gray-700{--bg-opacity:1;background-color:#4a5568;background-color:rgba(74,85,104,var(--bg-opacity))}.bg-yellow-500{--bg-opacity:1;background-color:#ecc94b;background-color:rgba(236,201,75,var(--bg-opacity))}.bg-green-200{--bg-opacity:1;background-color:#c6f6d5;background-color:rgba(198,246,213,var(--bg-opacity))}.bg-teal-500{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.bg-blue-400{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.bg-blue-500{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.bg-blue-600{--bg-opacity:1;background-color:#3182ce;background-color:rgba(49,130,206,var(--bg-opacity))}.bg-blue-800{--bg-opacity:1;background-color:#2c5282;background-color:rgba(44,82,130,var(--bg-opacity))}.bg-secondary-100{--bg-opacity:1;background-color:#e2e2d5;background-color:rgba(226,226,213,var(--bg-opacity))}.bg-tempc-400{--bg-opacity:1;background-color:#266fea;background-color:rgba(38,111,234,var(--bg-opacity))}.bg-tempc-500{--bg-opacity:1;background-color:#41d7aa;background-color:rgba(65,215,170,var(--bg-opacity))}.hover\:bg-white:hover{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.hover\:bg-gray-200:hover{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.hover\:bg-red-400:hover{--bg-opacity:1;background-color:#fc8181;background-color:rgba(252,129,129,var(--bg-opacity))}.hover\:bg-yellow-600:hover{--bg-opacity:1;background-color:#d69e2e;background-color:rgba(214,158,46,var(--bg-opacity))}.hover\:bg-green-400:hover{--bg-opacity:1;background-color:#68d391;background-color:rgba(104,211,145,var(--bg-opacity))}.hover\:bg-teal-500:hover{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.hover\:bg-blue-400:hover{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.hover\:bg-blue-500:hover{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.hover\:bg-blue-700:hover{--bg-opacity:1;background-color:#2b6cb0;background-color:rgba(43,108,176,var(--bg-opacity))}.hover\:bg-indigo-700:hover{--bg-opacity:1;background-color:#4c51bf;background-color:rgba(76,81,191,var(--bg-opacity))}.focus\:bg-gray-200:focus{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.hover\:bg-opacity-50:hover{--bg-opacity:0.5}.border-gray-100{--border-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--border-opacity))}.border-gray-200{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.border-green-400{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.border-teal-500{--border-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--border-opacity))}.border-blue-500{--border-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.border-blue-600{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.border-purple-700{--border-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--border-opacity))}.hover\:border-green-400:hover{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.hover\:border-blue-600:hover{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.rounded-sm{border-radius:.125rem}.rounded{border-radius:.25rem}.rounded-lg{border-radius:.5rem}.rounded-full{border-radius:9999px}.rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.border-4{border-width:4px}.border-8{border-width:8px}.border{border-width:1px}.border-b-2{border-bottom-width:2px}.border-l-8{border-left-width:8px}.border-b{border-bottom-width:1px}.cursor-pointer{cursor:pointer}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.flex-grow{flex-grow:1}.flex-shrink-0{flex-shrink:0}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-10{height:2.5rem}.h-16{height:4rem}.h-20{height:5rem}.h-64{height:16rem}.h-auto{height:auto}.h-full{height:100%}.text-xs{font-size:.75rem}.text-sm{font-size:.875rem}.text-base{font-size:1rem}.text-lg{font-size:1.125rem}.text-xl{font-size:1.25rem}.text-2xl{font-size:1.5rem}.text-3xl{font-size:1.875rem}.text-4xl{font-size:2.25rem}.text-5xl{font-size:3rem}.text-6xl{font-size:4rem}.leading-none{line-height:1}.leading-tight{line-height:1.25}.leading-normal{line-height:1.5}.m-4{margin:1rem}.m-8{margin:2rem}.-m-4{margin:-1rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.my-4{margin-top:1rem;margin-bottom:1rem}.my-8{margin-top:2rem;margin-bottom:2rem}.mx-auto{margin-left:auto;margin-right:auto}.-mx-8{margin-left:-2rem;margin-right:-2rem}.ml-0{margin-left:0}.mr-1{margin-right:.25rem}.mb-1{margin-bottom:.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.mb-2{margin-bottom:.5rem}.ml-2{margin-left:.5rem}.mt-3{margin-top:.75rem}.mb-3{margin-bottom:.75rem}.ml-3{margin-left:.75rem}.mt-4{margin-top:1rem}.mb-4{margin-bottom:1rem}.ml-4{margin-left:1rem}.mt-6{margin-top:1.5rem}.mr-6{margin-right:1.5rem}.mt-8{margin-top:2rem}.mb-8{margin-bottom:2rem}.mb-10{margin-bottom:2.5rem}.mt-12{margin-top:3rem}.max-w-xs{max-width:20rem}.max-w-sm{max-width:24rem}.max-w-4xl{max-width:56rem}.max-w-6xl{max-width:72rem}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.min-w-0{min-width:0}.object-cover{-o-object-fit:cover;object-fit:cover}.focus\:outline-none:focus,.outline-none{outline:0}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-4{padding-left:1rem;padding-right:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.py-16{padding-top:4rem;padding-bottom:4rem}.pt-2{padding-top:.5rem}.pb-2{padding-bottom:.5rem}.pl-2{padding-left:.5rem}.pr-4{padding-right:1rem}.pb-4{padding-bottom:1rem}.pt-6{padding-top:1.5rem}.pb-8{padding-bottom:2rem}.pt-10{padding-top:2.5rem}.pr-10{padding-right:2.5rem}.pl-10{padding-left:2.5rem}.pt-20{padding-top:5rem}.pt-32{padding-top:8rem}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.top-0{top:0}.right-0{right:0}.bottom-0{bottom:0}.left-0{left:0}.shadow{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.shadow-md{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.shadow-lg{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.shadow-2xl{box-shadow:0 25px 50px -12px rgba(0,0,0,.25)}.hover\:shadow-inner:hover{box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.focus\:shadow-outline:focus{box-shadow:0 0 0 3px rgba(66,153,225,.5)}.fill-current{fill:currentColor}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-black{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.text-gray-500{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.text-gray-600{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.text-gray-700{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.text-gray-800{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.text-gray-900{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.text-green-900{--text-opacity:1;color:#22543d;color:rgba(34,84,61,var(--text-opacity))}.text-teal-500{--text-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--text-opacity))}.text-secondary-200{--text-opacity:1;color:#888883;color:rgba(136,136,131,var(--text-opacity))}.text-tempc-200{--text-opacity:1;color:#e93434;color:rgba(233,52,52,var(--text-opacity))}.text-tempc-400{--text-opacity:1;color:#266fea;color:rgba(38,111,234,var(--text-opacity))}.text-tempc-500{--text-opacity:1;color:#41d7aa;color:rgba(65,215,170,var(--text-opacity))}.hover\:text-black:hover{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.hover\:text-white:hover{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.hover\:text-gray-900:hover{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.focus\:text-black:focus{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.focus\:text-gray-900:focus{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.uppercase{text-transform:uppercase}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.whitespace-no-wrap{white-space:nowrap}.break-words{overflow-wrap:break-word}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-10{width:2.5rem}.w-16{width:4rem}.w-20{width:5rem}.w-24{width:6rem}.w-32{width:8rem}.w-auto{width:auto}.w-2\/3{width:66.666667%}.w-2\/5{width:40%}.w-full{width:100%}.w-screen{width:100vw}.gap-4{grid-gap:1rem;gap:1rem}.gap-8{grid-gap:2rem;gap:2rem}.gap-10{grid-gap:2.5rem;gap:2.5rem}.grid-flow-col{grid-auto-flow:column}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.grid-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.transform{--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y))}.hover\:scale-125:hover{--transform-scale-x:1.25;--transform-scale-y:1.25}.transition{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}@-webkit-keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@-webkit-keyframes ping{0%{transform:scale(1);opacity:1}75%,to{transform:scale(2);opacity:0}}@keyframes ping{0%{transform:scale(1);opacity:1}75%,to{transform:scale(2);opacity:0}}@-webkit-keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}@-webkit-keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:translateY(0);-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}@keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:translateY(0);-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}body,html{margin:0;padding:0;width:100%;height:100%;overflow-x:hidden;box-sizing:border-box;background-color:#e2e8f0}.chartjs-container{position:relative;margin:auto;height:75vh;width:75vw}.symbolicon{font-size:72px;background:-webkit-linear-gradient(#eee,#333);background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:transparent}@media (min-width:640px){.sm\:container{width:100%;max-width:640px}@media (min-width:768px){.sm\:container{max-width:768px}}@media (min-width:1024px){.sm\:container{max-width:1024px}}@media (min-width:1280px){.sm\:container{max-width:1280px}}.sm\:h-20{height:5rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:px-8{padding-left:2rem;padding-right:2rem}}@media (min-width:768px){.md\:container{width:100%}@media (min-width:640px){.md\:container{max-width:640px}}@media (min-width:768px){.md\:container{max-width:768px}}@media (min-width:1024px){.md\:container{max-width:1024px}}@media (min-width:1280px){.md\:container{max-width:1280px}}.md\:block{display:block}.md\:inline-block{display:inline-block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:flex-row{flex-direction:row}.md\:items-center{align-items:center}.md\:justify-center{justify-content:center}.md\:h-screen{height:100vh}.md\:text-sm{font-size:.875rem}.md\:text-xl{font-size:1.25rem}.md\:text-2xl{font-size:1.5rem}.md\:text-3xl{font-size:1.875rem}.md\:mx-auto{margin-left:auto;margin-right:auto}.md\:ml-56{margin-left:14rem}.md\:ml-64{margin-left:16rem}.md\:ml-auto{margin-left:auto}.md\:px-2{padding-left:.5rem;padding-right:.5rem}.md\:px-8{padding-left:2rem;padding-right:2rem}.md\:px-10{padding-left:2.5rem;padding-right:2.5rem}.md\:py-12{padding-top:3rem;padding-bottom:3rem}.md\:pb-0{padding-bottom:0}.md\:fixed{position:fixed}.md\:top-0{top:0}.md\:left-0{left:0}.md\:break-all{word-break:break-all}.md\:w-56{width:14rem}.md\:w-1\/2{width:50%}.md\:w-4\/5{width:80%}.md\:z-50{z-index:50}.md\:gap-4{grid-gap:1rem;gap:1rem}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:col-span-4{grid-column:span 4/span 4}.md\:grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.md\:grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}}@media (min-width:1024px){.lg\:container{width:100%}@media (min-width:640px){.lg\:container{max-width:640px}}@media (min-width:768px){.lg\:container{max-width:768px}}@media (min-width:1024px){.lg\:container{max-width:1024px}}@media (min-width:1280px){.lg\:container{max-width:1280px}}.lg\:block{display:block}.lg\:grid{display:grid}.lg\:items-start{align-items:flex-start}.lg\:items-center{align-items:center}.lg\:justify-center{justify-content:center}.lg\:text-sm{font-size:.875rem}.lg\:text-base{font-size:1rem}.lg\:text-lg{font-size:1.125rem}.lg\:text-3xl{font-size:1.875rem}.lg\:text-4xl{font-size:2.25rem}.lg\:text-6xl{font-size:4rem}.lg\:ml-64{margin-left:16rem}.lg\:p-6{padding:1.5rem}.lg\:text-center{text-align:center}.lg\:w-64{width:16rem}.lg\:w-1\/4{width:25%}.lg\:w-3\/5{width:60%}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.lg\:grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.lg\:row-span-2{grid-row:span 2/span 2}}@media (min-width:1280px){.xl\:container{width:100%}@media (min-width:640px){.xl\:container{max-width:640px}}@media (min-width:768px){.xl\:container{max-width:768px}}@media (min-width:1024px){.xl\:container{max-width:1024px}}@media (min-width:1280px){.xl\:container{max-width:1280px}}.xl\:text-2xl{font-size:1.5rem}} \ No newline at end of file +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:transparent;background-image:none}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}fieldset,ol,ul{margin:0;padding:0}ol,ul{list-style:none}html{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}*,:after,:before{box-sizing:border-box;border:0 solid #e2e8f0}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#a0aec0}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#a0aec0}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:#a0aec0}input::placeholder,textarea::placeholder{color:#a0aec0}[role=button],button{cursor:pointer}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}body,html{margin:0;padding:0;width:100%;height:100%;overflow-x:hidden;box-sizing:border-box;background-color:#e2e8f0}.chartjs-container{position:relative;margin:auto;height:75vh;width:75vw}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}.symbolicon{font-size:72px;background:-webkit-linear-gradient(#eee,#333);background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:transparent}.min-w{min-width:400px}@media (max-width:400px){.min-w{min-width:300px}}.space-y-5>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1.25rem*(1 - var(--space-y-reverse)));margin-bottom:calc(1.25rem*var(--space-y-reverse))}.space-y-10>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(2.5rem*(1 - var(--space-y-reverse)));margin-bottom:calc(2.5rem*var(--space-y-reverse))}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.bg-transparent{background-color:transparent}.bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.bg-gray-100{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.bg-gray-200{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.bg-gray-300{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.bg-gray-700{--bg-opacity:1;background-color:#4a5568;background-color:rgba(74,85,104,var(--bg-opacity))}.bg-gray-900{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.bg-red-900{--bg-opacity:1;background-color:#742a2a;background-color:rgba(116,42,42,var(--bg-opacity))}.bg-yellow-500{--bg-opacity:1;background-color:#ecc94b;background-color:rgba(236,201,75,var(--bg-opacity))}.bg-green-200{--bg-opacity:1;background-color:#c6f6d5;background-color:rgba(198,246,213,var(--bg-opacity))}.bg-teal-500{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.bg-blue-400{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.bg-blue-500{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.bg-blue-600{--bg-opacity:1;background-color:#3182ce;background-color:rgba(49,130,206,var(--bg-opacity))}.bg-blue-800{--bg-opacity:1;background-color:#2c5282;background-color:rgba(44,82,130,var(--bg-opacity))}.bg-secondary-100{--bg-opacity:1;background-color:#e2e2d5;background-color:rgba(226,226,213,var(--bg-opacity))}.bg-tempc-400{--bg-opacity:1;background-color:#266fea;background-color:rgba(38,111,234,var(--bg-opacity))}.bg-tempc-500{--bg-opacity:1;background-color:#41d7aa;background-color:rgba(65,215,170,var(--bg-opacity))}.hover\:bg-white:hover{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.hover\:bg-gray-200:hover{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.hover\:bg-red-400:hover{--bg-opacity:1;background-color:#fc8181;background-color:rgba(252,129,129,var(--bg-opacity))}.hover\:bg-yellow-600:hover{--bg-opacity:1;background-color:#d69e2e;background-color:rgba(214,158,46,var(--bg-opacity))}.hover\:bg-green-400:hover{--bg-opacity:1;background-color:#68d391;background-color:rgba(104,211,145,var(--bg-opacity))}.hover\:bg-teal-500:hover{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.hover\:bg-blue-400:hover{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.hover\:bg-blue-500:hover{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.hover\:bg-blue-700:hover{--bg-opacity:1;background-color:#2b6cb0;background-color:rgba(43,108,176,var(--bg-opacity))}.hover\:bg-indigo-700:hover{--bg-opacity:1;background-color:#4c51bf;background-color:rgba(76,81,191,var(--bg-opacity))}.focus\:bg-gray-200:focus{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.hover\:bg-opacity-50:hover{--bg-opacity:0.5}.border-gray-100{--border-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--border-opacity))}.border-gray-200{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.border-gray-400{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.border-green-400{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.border-teal-500{--border-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--border-opacity))}.border-blue-500{--border-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.border-blue-600{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.border-purple-700{--border-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--border-opacity))}.hover\:border-green-400:hover{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.hover\:border-blue-600:hover{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.rounded-sm{border-radius:.125rem}.rounded{border-radius:.25rem}.rounded-lg{border-radius:.5rem}.rounded-full{border-radius:9999px}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.border-4{border-width:4px}.border-8{border-width:8px}.border{border-width:1px}.border-b-2{border-bottom-width:2px}.border-l-8{border-left-width:8px}.border-b{border-bottom-width:1px}.cursor-pointer{cursor:pointer}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.flex-auto{flex:1 1 auto}.flex-grow{flex-grow:1}.flex-shrink-0{flex-shrink:0}.font-normal{font-weight:400}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-10{height:2.5rem}.h-16{height:4rem}.h-20{height:5rem}.h-64{height:16rem}.h-auto{height:auto}.h-full{height:100%}.text-xs{font-size:.75rem}.text-sm{font-size:.875rem}.text-base{font-size:1rem}.text-lg{font-size:1.125rem}.text-xl{font-size:1.25rem}.text-2xl{font-size:1.5rem}.text-3xl{font-size:1.875rem}.text-4xl{font-size:2.25rem}.text-5xl{font-size:3rem}.text-6xl{font-size:4rem}.leading-none{line-height:1}.leading-tight{line-height:1.25}.leading-normal{line-height:1.5}.m-4{margin:1rem}.m-8{margin:2rem}.-m-4{margin:-1rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.my-4{margin-top:1rem;margin-bottom:1rem}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.my-8{margin-top:2rem;margin-bottom:2rem}.mx-auto{margin-left:auto;margin-right:auto}.-mx-8{margin-left:-2rem;margin-right:-2rem}.mb-0{margin-bottom:0}.ml-0{margin-left:0}.mr-1{margin-right:.25rem}.mb-1{margin-bottom:.25rem}.ml-1{margin-left:.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.mb-2{margin-bottom:.5rem}.ml-2{margin-left:.5rem}.mt-3{margin-top:.75rem}.mb-3{margin-bottom:.75rem}.ml-3{margin-left:.75rem}.mt-4{margin-top:1rem}.mb-4{margin-bottom:1rem}.ml-4{margin-left:1rem}.mt-6{margin-top:1.5rem}.mr-6{margin-right:1.5rem}.mb-6{margin-bottom:1.5rem}.mt-8{margin-top:2rem}.mb-8{margin-bottom:2rem}.mb-10{margin-bottom:2.5rem}.mt-12{margin-top:3rem}.max-w-xs{max-width:20rem}.max-w-sm{max-width:24rem}.max-w-4xl{max-width:56rem}.max-w-6xl{max-width:72rem}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.min-w-0{min-width:0}.object-cover{-o-object-fit:cover;object-fit:cover}.focus\:outline-none:focus,.outline-none{outline:0}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-4{padding-left:1rem;padding-right:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.px-8{padding-left:2rem;padding-right:2rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.py-16{padding-top:4rem;padding-bottom:4rem}.pt-0{padding-top:0}.pt-2{padding-top:.5rem}.pb-2{padding-bottom:.5rem}.pl-2{padding-left:.5rem}.pr-4{padding-right:1rem}.pb-4{padding-bottom:1rem}.pt-6{padding-top:1.5rem}.pb-8{padding-bottom:2rem}.pt-10{padding-top:2.5rem}.pr-10{padding-right:2.5rem}.pb-10{padding-bottom:2.5rem}.pl-10{padding-left:2.5rem}.pt-20{padding-top:5rem}.pt-32{padding-top:8rem}.placeholder-gray-400::-moz-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.placeholder-gray-400:-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.placeholder-gray-400::-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.placeholder-gray-400::placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.top-0{top:0}.right-0{right:0}.bottom-0{bottom:0}.left-0{left:0}.shadow{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.shadow-md{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.shadow-lg{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.shadow-2xl{box-shadow:0 25px 50px -12px rgba(0,0,0,.25)}.hover\:shadow-md:hover{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.hover\:shadow-lg:hover{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.hover\:shadow-inner:hover{box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.focus\:shadow-outline:focus{box-shadow:0 0 0 3px rgba(66,153,225,.5)}.fill-current{fill:currentColor}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-black{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.text-gray-500{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.text-gray-600{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.text-gray-700{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.text-gray-800{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.text-gray-900{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.text-red-600{--text-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--text-opacity))}.text-green-900{--text-opacity:1;color:#22543d;color:rgba(34,84,61,var(--text-opacity))}.text-teal-500{--text-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--text-opacity))}.text-blue-200{--text-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--text-opacity))}.text-blue-700{--text-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--text-opacity))}.text-secondary-200{--text-opacity:1;color:#888883;color:rgba(136,136,131,var(--text-opacity))}.text-tempc-200{--text-opacity:1;color:#e93434;color:rgba(233,52,52,var(--text-opacity))}.text-tempc-400{--text-opacity:1;color:#266fea;color:rgba(38,111,234,var(--text-opacity))}.text-tempc-500{--text-opacity:1;color:#41d7aa;color:rgba(65,215,170,var(--text-opacity))}.hover\:text-black:hover{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.hover\:text-white:hover{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.hover\:text-gray-900:hover{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.focus\:text-black:focus{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.focus\:text-gray-900:focus{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.uppercase{text-transform:uppercase}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.whitespace-no-wrap{white-space:nowrap}.break-words{overflow-wrap:break-word}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-10{width:2.5rem}.w-16{width:4rem}.w-20{width:5rem}.w-24{width:6rem}.w-32{width:8rem}.w-auto{width:auto}.w-1\/2{width:50%}.w-2\/3{width:66.666667%}.w-2\/5{width:40%}.w-full{width:100%}.w-screen{width:100vw}.gap-4{grid-gap:1rem;gap:1rem}.gap-8{grid-gap:2rem;gap:2rem}.gap-10{grid-gap:2.5rem;gap:2.5rem}.grid-flow-col{grid-auto-flow:column}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.grid-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.transform{--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y))}.hover\:scale-125:hover{--transform-scale-x:1.25;--transform-scale-y:1.25}.transition{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}@-webkit-keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@-webkit-keyframes ping{0%{transform:scale(1);opacity:1}75%,to{transform:scale(2);opacity:0}}@keyframes ping{0%{transform:scale(1);opacity:1}75%,to{transform:scale(2);opacity:0}}@-webkit-keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}@-webkit-keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:translateY(0);-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}@keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:translateY(0);-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}@media (min-width:640px){.sm\:container{width:100%;max-width:640px}@media (min-width:768px){.sm\:container{max-width:768px}}@media (min-width:1024px){.sm\:container{max-width:1024px}}@media (min-width:1280px){.sm\:container{max-width:1280px}}.sm\:h-20{height:5rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:px-8{padding-left:2rem;padding-right:2rem}}@media (min-width:768px){.md\:container{width:100%}@media (min-width:640px){.md\:container{max-width:640px}}@media (min-width:768px){.md\:container{max-width:768px}}@media (min-width:1024px){.md\:container{max-width:1024px}}@media (min-width:1280px){.md\:container{max-width:1280px}}.md\:block{display:block}.md\:inline-block{display:inline-block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:flex-row{flex-direction:row}.md\:items-center{align-items:center}.md\:justify-center{justify-content:center}.md\:h-screen{height:100vh}.md\:text-sm{font-size:.875rem}.md\:text-xl{font-size:1.25rem}.md\:text-2xl{font-size:1.5rem}.md\:text-3xl{font-size:1.875rem}.md\:mx-auto{margin-left:auto;margin-right:auto}.md\:ml-56{margin-left:14rem}.md\:ml-64{margin-left:16rem}.md\:ml-auto{margin-left:auto}.md\:px-2{padding-left:.5rem;padding-right:.5rem}.md\:px-8{padding-left:2rem;padding-right:2rem}.md\:px-10{padding-left:2.5rem;padding-right:2.5rem}.md\:py-12{padding-top:3rem;padding-bottom:3rem}.md\:pb-0{padding-bottom:0}.md\:fixed{position:fixed}.md\:top-0{top:0}.md\:left-0{left:0}.md\:break-all{word-break:break-all}.md\:w-56{width:14rem}.md\:w-1\/2{width:50%}.md\:w-4\/5{width:80%}.md\:z-50{z-index:50}.md\:gap-4{grid-gap:1rem;gap:1rem}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:col-span-4{grid-column:span 4/span 4}.md\:grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.md\:grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}}@media (min-width:1024px){.lg\:container{width:100%}@media (min-width:640px){.lg\:container{max-width:640px}}@media (min-width:768px){.lg\:container{max-width:768px}}@media (min-width:1024px){.lg\:container{max-width:1024px}}@media (min-width:1280px){.lg\:container{max-width:1280px}}.lg\:block{display:block}.lg\:grid{display:grid}.lg\:items-start{align-items:flex-start}.lg\:items-center{align-items:center}.lg\:justify-center{justify-content:center}.lg\:text-sm{font-size:.875rem}.lg\:text-base{font-size:1rem}.lg\:text-lg{font-size:1.125rem}.lg\:text-3xl{font-size:1.875rem}.lg\:text-4xl{font-size:2.25rem}.lg\:text-5xl{font-size:3rem}.lg\:text-6xl{font-size:4rem}.lg\:ml-64{margin-left:16rem}.lg\:p-6{padding:1.5rem}.lg\:px-10{padding-left:2.5rem;padding-right:2.5rem}.lg\:text-center{text-align:center}.lg\:w-64{width:16rem}.lg\:w-1\/4{width:25%}.lg\:w-3\/5{width:60%}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.lg\:grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.lg\:row-span-2{grid-row:span 2/span 2}}@media (min-width:1280px){.xl\:container{width:100%}@media (min-width:640px){.xl\:container{max-width:640px}}@media (min-width:768px){.xl\:container{max-width:768px}}@media (min-width:1024px){.xl\:container{max-width:1024px}}@media (min-width:1280px){.xl\:container{max-width:1280px}}.xl\:text-2xl{font-size:1.5rem}} \ No newline at end of file diff --git a/public/css/tailwind.css b/public/css/tailwind.css index f441c4a..985abac 100644 --- a/public/css/tailwind.css +++ b/public/css/tailwind.css @@ -1,7 +1,4 @@ @tailwind base; -@tailwind components; -@tailwind utilities; - /* Custom CSS */ /* Main CSS */ @@ -23,10 +20,24 @@ body { width: 75vw; } +@tailwind components; + .symbolicon { font-size: 72px; background: -webkit-linear-gradient(#eee, #333); background-clip: text; -webkit-background-clip: text; -webkit-text-fill-color: transparent; -} \ No newline at end of file +} + +.min-w{ + min-width: 400px; +} + +@media (max-width:400px){ + .min-w{ + min-width: 300px; + } +} + +@tailwind utilities; \ No newline at end of file diff --git a/routes/api/user.js b/routes/api/user.js index d48946f..4f83b16 100644 --- a/routes/api/user.js +++ b/routes/api/user.js @@ -2,7 +2,13 @@ const express = require("express"); const router = express.Router(); router.get('/signup', (req, res) => { - res.status(200).render('signup', {layout: 'layouts/login'}) + res.status(200).render('signup', { layout: 'layouts/login' }) +}) +router.post('/signup', (req, res) => { + + console.log('signup') +}) +router.post('/signin', (req, res) => { + }) - module.exports = router; \ No newline at end of file diff --git a/tailwind.config.js b/tailwind.config.js index 0b764c4..1b75d52 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -11,11 +11,7 @@ module.exports = { 100: '#E2E2D5', 200: '#888883', }, - - // colors according to design 400->blue 200->red 500->green - - tempc: { 100: '#365088', 200: '#E93434', diff --git a/views/layouts/login.ejs b/views/layouts/login.ejs index 96844c9..496906e 100644 --- a/views/layouts/login.ejs +++ b/views/layouts/login.ejs @@ -4,6 +4,7 @@ + diff --git a/views/login.ejs b/views/login.ejs index 246ec55..21d6dc5 100644 --- a/views/login.ejs +++ b/views/login.ejs @@ -1,23 +1,20 @@ -
-

TradeByte

+
+

TradeByte

-
-
-
Sign in with
-
+ -
+
Or sign in with credentials
-
+
- - - - +
+ +
\ No newline at end of file diff --git a/views/signup.ejs b/views/signup.ejs index 2f670c6..2ea3561 100644 --- a/views/signup.ejs +++ b/views/signup.ejs @@ -1,34 +1,44 @@
-

TradeByte

-
-
-
-
-
Or sign in with credentials
-
-
- - TradeByte +
+
+ Sign Up for  TradeByte +
+
+ +
+
+ + + placeholder="First Name" style="transition: all 0.15s ease 0s;">
-
- - + + -
-
- - - - + placeholder="Last Name" style="transition: all 0.15s ease 0s;">
- -
+
+
+ + +
+
+ + +
+
+ +

Go back to Login

+
+
-
\ No newline at end of file + +
\ No newline at end of file From cb5bc8e2126e186c207b2e1441b4ba5722cfaa3e Mon Sep 17 00:00:00 2001 From: fabcodingzest <48706652+fabcodingzest@users.noreply.github.com> Date: Fri, 21 Aug 2020 19:57:23 +0530 Subject: [PATCH 3/5] Custom Sign In and Sign Up implemented using passport #46 --- app.js | 8 +++ middleware/auth.js | 2 +- routes/api/auth.js | 8 +++ routes/api/user.js | 69 +++++++++++++++++++++-- views/login.ejs | 5 +- views/partials/_messages.ejs | 103 +++++++++++++++++++++++++++++++++++ views/signup.ejs | 26 ++++++--- 7 files changed, 204 insertions(+), 17 deletions(-) create mode 100644 views/partials/_messages.ejs diff --git a/app.js b/app.js index 8c2735f..d43a27d 100644 --- a/app.js +++ b/app.js @@ -16,12 +16,14 @@ const session = require("express-session"); const mongoose = require("mongoose"); const MongoStore = require("connect-mongo")(session); const connectDB = require("./config/db"); +const flash = require('connect-flash'); // Load config dotenv.config({ path: "./config/config.env" }); // Passport config require("./config/passport")(passport); +require("./config/passportLocal")(passport); // DB Connected connectDB(); @@ -75,9 +77,15 @@ app.use( app.use(passport.initialize()); app.use(passport.session()); +// Connect Flash +app.use(flash()) + // Set Global variables app.use(function (req, res, next) { res.locals.user = req.user || null; + res.locals.success_msg = req.flash('success_msg'); + res.locals.error_msg = req.flash('error_msg'); + res.locals.error = req.flash('error'); next(); }); diff --git a/middleware/auth.js b/middleware/auth.js index a7fae58..bb38a58 100644 --- a/middleware/auth.js +++ b/middleware/auth.js @@ -5,7 +5,7 @@ module.exports = { if (req.isAuthenticated()) { return next(); } else { - req.flash('error_msg', 'Please log in to view that resource'); + req.flash('error_msg', 'Password or Email does not match'); res.redirect('/'); } }, diff --git a/routes/api/auth.js b/routes/api/auth.js index 971fdbd..f5a41a7 100644 --- a/routes/api/auth.js +++ b/routes/api/auth.js @@ -21,6 +21,14 @@ router.get( } ); +router.post('/signin', (req, res, next) => { + passport.authenticate('local', { + successRedirect: '/portfolio', + failureRedirect: '/', + failureFlash: true + })(req, res, next) +}) + // @desc Logout user // @route /auth/logout router.get("/logout", (req, res) => { diff --git a/routes/api/user.js b/routes/api/user.js index 4f83b16..adaa9c4 100644 --- a/routes/api/user.js +++ b/routes/api/user.js @@ -1,14 +1,73 @@ const express = require("express"); const router = express.Router(); +const passport = require("passport") +const bcrypt = require("bcryptjs"); +const {v4: uuidv4} = require("uuid"); +const { ensureGuest } = require("../../middleware/auth"); -router.get('/signup', (req, res) => { +// Load User Model +const User = require("../../models/User"); + +// Sign Up Page +router.get('/signup', ensureGuest, (req, res) => { res.status(200).render('signup', { layout: 'layouts/login' }) }) + +// Submit Sign Up Form router.post('/signup', (req, res) => { - - console.log('signup') + const { firstName, lastName, password1, password2, email } = req.body; + let errors = []; + + if (!firstName || !lastName || !password1 || !password2 || !email) { + errors.push({ msg: 'Please enter all fields' }); + } + if (password1 !== password2) { + errors.push({ msg: 'Passwords do not match' }) + } + if (password1.length < 6) { + errors.push({ msg: 'Password must be longer than 6 characters' }) + } + + if (errors.length > 0) { + res.render('signup', { layout: 'layouts/login', errors, firstName, lastName, password1, password2 }) + } else { + User.findOne({ email: email }).then((user) => { + if (user) { + errors.push({ msg: 'Email already exists' }) + res.render('signup', { layout: 'layouts/login', errors, firstName, lastName, password1, password2 }) + } else { + const newUser = new User({ + googleId: uuidv4(), + displayName: `${firstName} ${lastName}`, + firstName, + lastName, + email, + image: 'https://t3.ftcdn.net/jpg/00/64/67/52/240_F_64675209_7ve2XQANuzuHjMZXP3aIYIpsDKEbF5dD.jpg', + password: password1, + balance: 10000, + }) + + bcrypt.genSalt(10, (err, salt) => { + bcrypt.hash(newUser.password, salt, (err, hash) => { + if (err) throw err; + newUser.password = hash; + newUser.save().then(user => { + req.flash('success_msg', 'You are now registered and can log in') + res.status(200).redirect('/') + }).catch((err) => console.log(err)) + }) + }) + } + }) + } }) -router.post('/signin', (req, res) => { - + +router.post('/signin', (req, res, next) => { + passport.authenticate('local', { + successRedirect: '/portfolio', + failureRedirect: '/', + failureFlash: true, + })(req, res, next) }) + module.exports = router; \ No newline at end of file diff --git a/views/login.ejs b/views/login.ejs index 21d6dc5..e7f92af 100644 --- a/views/login.ejs +++ b/views/login.ejs @@ -10,6 +10,7 @@ src="/images/google.png">Sign in with Google + <%- include('./partials/_messages') %>
@@ -17,13 +18,13 @@
-
-
diff --git a/views/partials/_messages.ejs b/views/partials/_messages.ejs new file mode 100644 index 0000000..e260cb9 --- /dev/null +++ b/views/partials/_messages.ejs @@ -0,0 +1,103 @@ +<% if(typeof errors != "undefined") { %> +<% errors.forEach(function(error) { %> +
+
+
+ + + + + +
+

<%= error.msg %>

+
+
+ + + + +
+
+<% }); %> +<% } %> + +<% if(success_msg != "") { %> +
+
+
+ + + + + +
+

<%= success_msg %>

+
+
+ + + + +
+
+<% } %> + +<% if(error_msg != "") { %> +
+
+
+ + + + + +
+

<%= error_msg %>

+
+
+ + + + +
+
+<% } %> + +<% if(error != "") { %> +
+
+
+ + + + + +
+

<%= error %>

+
+
+ + + + +
+
+<% } %> \ No newline at end of file diff --git a/views/signup.ejs b/views/signup.ejs index 2ea3561..7434d8b 100644 --- a/views/signup.ejs +++ b/views/signup.ejs @@ -1,41 +1,49 @@

TradeByte

-
- Sign Up for  TradeByte +
+

Sign Up for  TradeByte

+ <%- include('./partials/_messages') %>
- + name="firstName" placeholder="First Name" style="transition: all 0.15s ease 0s;">
-
-
- +
+
+ +
+ class="bg-gray-900 text-white active:bg-gray-700 text-sm font-bold uppercase px-6 py-3 rounded shadow hover:shadow-lg outline-none focus:outline-none mr-1 mb-1 w-full" + type="submit" style="transition: all 0.15s ease 0s;">Sign Up

Go back to Login

From fadae145f7bd61f3612e97ee6f11f71d35ecfc57 Mon Sep 17 00:00:00 2001 From: fabcodingzest <48706652+fabcodingzest@users.noreply.github.com> Date: Fri, 21 Aug 2020 23:31:56 +0530 Subject: [PATCH 4/5] Added some comments for routes in user.js #46 --- routes/api/user.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/routes/api/user.js b/routes/api/user.js index adaa9c4..4efffba 100644 --- a/routes/api/user.js +++ b/routes/api/user.js @@ -8,12 +8,15 @@ const { ensureGuest } = require("../../middleware/auth"); // Load User Model const User = require("../../models/User"); -// Sign Up Page +// @desc Sign Up Page +// @route GET /user/signup +// @access Public router.get('/signup', ensureGuest, (req, res) => { res.status(200).render('signup', { layout: 'layouts/login' }) }) -// Submit Sign Up Form +// @desc Submit Sign Up Form +// @route GET /user/signup router.post('/signup', (req, res) => { const { firstName, lastName, password1, password2, email } = req.body; let errors = []; @@ -62,6 +65,8 @@ router.post('/signup', (req, res) => { } }) +// @desc Submit Sign In Form +// @route GET /user/signin router.post('/signin', (req, res, next) => { passport.authenticate('local', { successRedirect: '/portfolio', From 1de1b1ff2a5174ae2625e6d300b5d2349fd3bbd1 Mon Sep 17 00:00:00 2001 From: fabcodingzest <48706652+fabcodingzest@users.noreply.github.com> Date: Sat, 22 Aug 2020 00:05:43 +0530 Subject: [PATCH 5/5] Removed Tailwind cdn from login layout& added hack --- public/css/style.css | 2 +- views/layouts/login.ejs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/css/style.css b/public/css/style.css index f51cc30..d9bf352 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -1 +1 @@ -/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:transparent;background-image:none}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}fieldset,ol,ul{margin:0;padding:0}ol,ul{list-style:none}html{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}*,:after,:before{box-sizing:border-box;border:0 solid #e2e8f0}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#a0aec0}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#a0aec0}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:#a0aec0}input::placeholder,textarea::placeholder{color:#a0aec0}[role=button],button{cursor:pointer}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}body,html{margin:0;padding:0;width:100%;height:100%;overflow-x:hidden;box-sizing:border-box;background-color:#e2e8f0}.chartjs-container{position:relative;margin:auto;height:75vh;width:75vw}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}.symbolicon{font-size:72px;background:-webkit-linear-gradient(#eee,#333);background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:transparent}.min-w{min-width:400px}@media (max-width:400px){.min-w{min-width:300px}}.space-y-5>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1.25rem*(1 - var(--space-y-reverse)));margin-bottom:calc(1.25rem*var(--space-y-reverse))}.space-y-10>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(2.5rem*(1 - var(--space-y-reverse)));margin-bottom:calc(2.5rem*var(--space-y-reverse))}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.bg-transparent{background-color:transparent}.bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.bg-gray-100{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.bg-gray-200{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.bg-gray-300{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.bg-gray-700{--bg-opacity:1;background-color:#4a5568;background-color:rgba(74,85,104,var(--bg-opacity))}.bg-gray-900{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.bg-red-900{--bg-opacity:1;background-color:#742a2a;background-color:rgba(116,42,42,var(--bg-opacity))}.bg-yellow-500{--bg-opacity:1;background-color:#ecc94b;background-color:rgba(236,201,75,var(--bg-opacity))}.bg-green-200{--bg-opacity:1;background-color:#c6f6d5;background-color:rgba(198,246,213,var(--bg-opacity))}.bg-teal-500{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.bg-blue-400{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.bg-blue-500{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.bg-blue-600{--bg-opacity:1;background-color:#3182ce;background-color:rgba(49,130,206,var(--bg-opacity))}.bg-blue-800{--bg-opacity:1;background-color:#2c5282;background-color:rgba(44,82,130,var(--bg-opacity))}.bg-secondary-100{--bg-opacity:1;background-color:#e2e2d5;background-color:rgba(226,226,213,var(--bg-opacity))}.bg-tempc-400{--bg-opacity:1;background-color:#266fea;background-color:rgba(38,111,234,var(--bg-opacity))}.bg-tempc-500{--bg-opacity:1;background-color:#41d7aa;background-color:rgba(65,215,170,var(--bg-opacity))}.hover\:bg-white:hover{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.hover\:bg-gray-200:hover{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.hover\:bg-red-400:hover{--bg-opacity:1;background-color:#fc8181;background-color:rgba(252,129,129,var(--bg-opacity))}.hover\:bg-yellow-600:hover{--bg-opacity:1;background-color:#d69e2e;background-color:rgba(214,158,46,var(--bg-opacity))}.hover\:bg-green-400:hover{--bg-opacity:1;background-color:#68d391;background-color:rgba(104,211,145,var(--bg-opacity))}.hover\:bg-teal-500:hover{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.hover\:bg-blue-400:hover{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.hover\:bg-blue-500:hover{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.hover\:bg-blue-700:hover{--bg-opacity:1;background-color:#2b6cb0;background-color:rgba(43,108,176,var(--bg-opacity))}.hover\:bg-indigo-700:hover{--bg-opacity:1;background-color:#4c51bf;background-color:rgba(76,81,191,var(--bg-opacity))}.focus\:bg-gray-200:focus{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.hover\:bg-opacity-50:hover{--bg-opacity:0.5}.border-gray-100{--border-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--border-opacity))}.border-gray-200{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.border-gray-400{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.border-green-400{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.border-teal-500{--border-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--border-opacity))}.border-blue-500{--border-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.border-blue-600{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.border-purple-700{--border-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--border-opacity))}.hover\:border-green-400:hover{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.hover\:border-blue-600:hover{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.rounded-sm{border-radius:.125rem}.rounded{border-radius:.25rem}.rounded-lg{border-radius:.5rem}.rounded-full{border-radius:9999px}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.border-4{border-width:4px}.border-8{border-width:8px}.border{border-width:1px}.border-b-2{border-bottom-width:2px}.border-l-8{border-left-width:8px}.border-b{border-bottom-width:1px}.cursor-pointer{cursor:pointer}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.flex-auto{flex:1 1 auto}.flex-grow{flex-grow:1}.flex-shrink-0{flex-shrink:0}.font-normal{font-weight:400}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-10{height:2.5rem}.h-16{height:4rem}.h-20{height:5rem}.h-64{height:16rem}.h-auto{height:auto}.h-full{height:100%}.text-xs{font-size:.75rem}.text-sm{font-size:.875rem}.text-base{font-size:1rem}.text-lg{font-size:1.125rem}.text-xl{font-size:1.25rem}.text-2xl{font-size:1.5rem}.text-3xl{font-size:1.875rem}.text-4xl{font-size:2.25rem}.text-5xl{font-size:3rem}.text-6xl{font-size:4rem}.leading-none{line-height:1}.leading-tight{line-height:1.25}.leading-normal{line-height:1.5}.m-4{margin:1rem}.m-8{margin:2rem}.-m-4{margin:-1rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.my-4{margin-top:1rem;margin-bottom:1rem}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.my-8{margin-top:2rem;margin-bottom:2rem}.mx-auto{margin-left:auto;margin-right:auto}.-mx-8{margin-left:-2rem;margin-right:-2rem}.mb-0{margin-bottom:0}.ml-0{margin-left:0}.mr-1{margin-right:.25rem}.mb-1{margin-bottom:.25rem}.ml-1{margin-left:.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.mb-2{margin-bottom:.5rem}.ml-2{margin-left:.5rem}.mt-3{margin-top:.75rem}.mb-3{margin-bottom:.75rem}.ml-3{margin-left:.75rem}.mt-4{margin-top:1rem}.mb-4{margin-bottom:1rem}.ml-4{margin-left:1rem}.mt-6{margin-top:1.5rem}.mr-6{margin-right:1.5rem}.mb-6{margin-bottom:1.5rem}.mt-8{margin-top:2rem}.mb-8{margin-bottom:2rem}.mb-10{margin-bottom:2.5rem}.mt-12{margin-top:3rem}.max-w-xs{max-width:20rem}.max-w-sm{max-width:24rem}.max-w-4xl{max-width:56rem}.max-w-6xl{max-width:72rem}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.min-w-0{min-width:0}.object-cover{-o-object-fit:cover;object-fit:cover}.focus\:outline-none:focus,.outline-none{outline:0}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-4{padding-left:1rem;padding-right:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.px-8{padding-left:2rem;padding-right:2rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.py-16{padding-top:4rem;padding-bottom:4rem}.pt-0{padding-top:0}.pt-2{padding-top:.5rem}.pb-2{padding-bottom:.5rem}.pl-2{padding-left:.5rem}.pr-4{padding-right:1rem}.pb-4{padding-bottom:1rem}.pt-6{padding-top:1.5rem}.pb-8{padding-bottom:2rem}.pt-10{padding-top:2.5rem}.pr-10{padding-right:2.5rem}.pb-10{padding-bottom:2.5rem}.pl-10{padding-left:2.5rem}.pt-20{padding-top:5rem}.pt-32{padding-top:8rem}.placeholder-gray-400::-moz-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.placeholder-gray-400:-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.placeholder-gray-400::-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.placeholder-gray-400::placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.top-0{top:0}.right-0{right:0}.bottom-0{bottom:0}.left-0{left:0}.shadow{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.shadow-md{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.shadow-lg{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.shadow-2xl{box-shadow:0 25px 50px -12px rgba(0,0,0,.25)}.hover\:shadow-md:hover{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.hover\:shadow-lg:hover{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.hover\:shadow-inner:hover{box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.focus\:shadow-outline:focus{box-shadow:0 0 0 3px rgba(66,153,225,.5)}.fill-current{fill:currentColor}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-black{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.text-gray-500{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.text-gray-600{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.text-gray-700{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.text-gray-800{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.text-gray-900{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.text-red-600{--text-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--text-opacity))}.text-green-900{--text-opacity:1;color:#22543d;color:rgba(34,84,61,var(--text-opacity))}.text-teal-500{--text-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--text-opacity))}.text-blue-200{--text-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--text-opacity))}.text-blue-700{--text-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--text-opacity))}.text-secondary-200{--text-opacity:1;color:#888883;color:rgba(136,136,131,var(--text-opacity))}.text-tempc-200{--text-opacity:1;color:#e93434;color:rgba(233,52,52,var(--text-opacity))}.text-tempc-400{--text-opacity:1;color:#266fea;color:rgba(38,111,234,var(--text-opacity))}.text-tempc-500{--text-opacity:1;color:#41d7aa;color:rgba(65,215,170,var(--text-opacity))}.hover\:text-black:hover{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.hover\:text-white:hover{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.hover\:text-gray-900:hover{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.focus\:text-black:focus{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.focus\:text-gray-900:focus{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.uppercase{text-transform:uppercase}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.whitespace-no-wrap{white-space:nowrap}.break-words{overflow-wrap:break-word}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-10{width:2.5rem}.w-16{width:4rem}.w-20{width:5rem}.w-24{width:6rem}.w-32{width:8rem}.w-auto{width:auto}.w-1\/2{width:50%}.w-2\/3{width:66.666667%}.w-2\/5{width:40%}.w-full{width:100%}.w-screen{width:100vw}.gap-4{grid-gap:1rem;gap:1rem}.gap-8{grid-gap:2rem;gap:2rem}.gap-10{grid-gap:2.5rem;gap:2.5rem}.grid-flow-col{grid-auto-flow:column}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.grid-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.transform{--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y))}.hover\:scale-125:hover{--transform-scale-x:1.25;--transform-scale-y:1.25}.transition{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}@-webkit-keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@-webkit-keyframes ping{0%{transform:scale(1);opacity:1}75%,to{transform:scale(2);opacity:0}}@keyframes ping{0%{transform:scale(1);opacity:1}75%,to{transform:scale(2);opacity:0}}@-webkit-keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}@-webkit-keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:translateY(0);-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}@keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:translateY(0);-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}@media (min-width:640px){.sm\:container{width:100%;max-width:640px}@media (min-width:768px){.sm\:container{max-width:768px}}@media (min-width:1024px){.sm\:container{max-width:1024px}}@media (min-width:1280px){.sm\:container{max-width:1280px}}.sm\:h-20{height:5rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:px-8{padding-left:2rem;padding-right:2rem}}@media (min-width:768px){.md\:container{width:100%}@media (min-width:640px){.md\:container{max-width:640px}}@media (min-width:768px){.md\:container{max-width:768px}}@media (min-width:1024px){.md\:container{max-width:1024px}}@media (min-width:1280px){.md\:container{max-width:1280px}}.md\:block{display:block}.md\:inline-block{display:inline-block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:flex-row{flex-direction:row}.md\:items-center{align-items:center}.md\:justify-center{justify-content:center}.md\:h-screen{height:100vh}.md\:text-sm{font-size:.875rem}.md\:text-xl{font-size:1.25rem}.md\:text-2xl{font-size:1.5rem}.md\:text-3xl{font-size:1.875rem}.md\:mx-auto{margin-left:auto;margin-right:auto}.md\:ml-56{margin-left:14rem}.md\:ml-64{margin-left:16rem}.md\:ml-auto{margin-left:auto}.md\:px-2{padding-left:.5rem;padding-right:.5rem}.md\:px-8{padding-left:2rem;padding-right:2rem}.md\:px-10{padding-left:2.5rem;padding-right:2.5rem}.md\:py-12{padding-top:3rem;padding-bottom:3rem}.md\:pb-0{padding-bottom:0}.md\:fixed{position:fixed}.md\:top-0{top:0}.md\:left-0{left:0}.md\:break-all{word-break:break-all}.md\:w-56{width:14rem}.md\:w-1\/2{width:50%}.md\:w-4\/5{width:80%}.md\:z-50{z-index:50}.md\:gap-4{grid-gap:1rem;gap:1rem}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:col-span-4{grid-column:span 4/span 4}.md\:grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.md\:grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}}@media (min-width:1024px){.lg\:container{width:100%}@media (min-width:640px){.lg\:container{max-width:640px}}@media (min-width:768px){.lg\:container{max-width:768px}}@media (min-width:1024px){.lg\:container{max-width:1024px}}@media (min-width:1280px){.lg\:container{max-width:1280px}}.lg\:block{display:block}.lg\:grid{display:grid}.lg\:items-start{align-items:flex-start}.lg\:items-center{align-items:center}.lg\:justify-center{justify-content:center}.lg\:text-sm{font-size:.875rem}.lg\:text-base{font-size:1rem}.lg\:text-lg{font-size:1.125rem}.lg\:text-3xl{font-size:1.875rem}.lg\:text-4xl{font-size:2.25rem}.lg\:text-5xl{font-size:3rem}.lg\:text-6xl{font-size:4rem}.lg\:ml-64{margin-left:16rem}.lg\:p-6{padding:1.5rem}.lg\:px-10{padding-left:2.5rem;padding-right:2.5rem}.lg\:text-center{text-align:center}.lg\:w-64{width:16rem}.lg\:w-1\/4{width:25%}.lg\:w-3\/5{width:60%}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.lg\:grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.lg\:row-span-2{grid-row:span 2/span 2}}@media (min-width:1280px){.xl\:container{width:100%}@media (min-width:640px){.xl\:container{max-width:640px}}@media (min-width:768px){.xl\:container{max-width:768px}}@media (min-width:1024px){.xl\:container{max-width:1024px}}@media (min-width:1280px){.xl\:container{max-width:1280px}}.xl\:text-2xl{font-size:1.5rem}} \ No newline at end of file +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:transparent;background-image:none}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}fieldset,ol,ul{margin:0;padding:0}ol,ul{list-style:none}html{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}*,:after,:before{box-sizing:border-box;border:0 solid #e2e8f0}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#a0aec0}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#a0aec0}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:#a0aec0}input::placeholder,textarea::placeholder{color:#a0aec0}[role=button],button{cursor:pointer}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}body,html{margin:0;padding:0;width:100%;height:100%;overflow-x:hidden;box-sizing:border-box;background-color:#e2e8f0}.chartjs-container{position:relative;margin:auto;height:75vh;width:75vw}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}.symbolicon{font-size:72px;background:-webkit-linear-gradient(#eee,#333);background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:transparent}.min-w{min-width:400px}@media (max-width:400px){.min-w{min-width:300px}}.space-y-5>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1.25rem*(1 - var(--space-y-reverse)));margin-bottom:calc(1.25rem*var(--space-y-reverse))}.space-y-10>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(2.5rem*(1 - var(--space-y-reverse)));margin-bottom:calc(2.5rem*var(--space-y-reverse))}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.bg-transparent{background-color:transparent}.bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.bg-gray-100{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.bg-gray-200{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.bg-gray-300{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.bg-gray-700{--bg-opacity:1;background-color:#4a5568;background-color:rgba(74,85,104,var(--bg-opacity))}.bg-gray-900{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.bg-red-200{--bg-opacity:1;background-color:#fed7d7;background-color:rgba(254,215,215,var(--bg-opacity))}.bg-red-900{--bg-opacity:1;background-color:#742a2a;background-color:rgba(116,42,42,var(--bg-opacity))}.bg-yellow-200{--bg-opacity:1;background-color:#fefcbf;background-color:rgba(254,252,191,var(--bg-opacity))}.bg-yellow-500{--bg-opacity:1;background-color:#ecc94b;background-color:rgba(236,201,75,var(--bg-opacity))}.bg-green-200{--bg-opacity:1;background-color:#c6f6d5;background-color:rgba(198,246,213,var(--bg-opacity))}.bg-teal-500{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.bg-blue-400{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.bg-blue-500{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.bg-blue-600{--bg-opacity:1;background-color:#3182ce;background-color:rgba(49,130,206,var(--bg-opacity))}.bg-blue-800{--bg-opacity:1;background-color:#2c5282;background-color:rgba(44,82,130,var(--bg-opacity))}.bg-secondary-100{--bg-opacity:1;background-color:#e2e2d5;background-color:rgba(226,226,213,var(--bg-opacity))}.bg-tempc-400{--bg-opacity:1;background-color:#266fea;background-color:rgba(38,111,234,var(--bg-opacity))}.bg-tempc-500{--bg-opacity:1;background-color:#41d7aa;background-color:rgba(65,215,170,var(--bg-opacity))}.hover\:bg-white:hover{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.hover\:bg-gray-200:hover{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.hover\:bg-red-400:hover{--bg-opacity:1;background-color:#fc8181;background-color:rgba(252,129,129,var(--bg-opacity))}.hover\:bg-yellow-600:hover{--bg-opacity:1;background-color:#d69e2e;background-color:rgba(214,158,46,var(--bg-opacity))}.hover\:bg-green-400:hover{--bg-opacity:1;background-color:#68d391;background-color:rgba(104,211,145,var(--bg-opacity))}.hover\:bg-teal-500:hover{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.hover\:bg-blue-400:hover{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.hover\:bg-blue-500:hover{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.hover\:bg-blue-700:hover{--bg-opacity:1;background-color:#2b6cb0;background-color:rgba(43,108,176,var(--bg-opacity))}.hover\:bg-indigo-700:hover{--bg-opacity:1;background-color:#4c51bf;background-color:rgba(76,81,191,var(--bg-opacity))}.focus\:bg-gray-200:focus{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.hover\:bg-opacity-50:hover{--bg-opacity:0.5}.border-gray-100{--border-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--border-opacity))}.border-gray-200{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.border-gray-400{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.border-red-600{--border-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--border-opacity))}.border-yellow-600{--border-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--border-opacity))}.border-green-400{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.border-green-600{--border-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--border-opacity))}.border-teal-500{--border-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--border-opacity))}.border-blue-500{--border-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.border-blue-600{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.border-purple-700{--border-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--border-opacity))}.hover\:border-green-400:hover{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.hover\:border-blue-600:hover{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.rounded-sm{border-radius:.125rem}.rounded{border-radius:.25rem}.rounded-lg{border-radius:.5rem}.rounded-full{border-radius:9999px}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.border-4{border-width:4px}.border-8{border-width:8px}.border{border-width:1px}.border-b-2{border-bottom-width:2px}.border-l-8{border-left-width:8px}.border-b{border-bottom-width:1px}.cursor-pointer{cursor:pointer}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.flex-auto{flex:1 1 auto}.flex-grow{flex-grow:1}.flex-shrink-0{flex-shrink:0}.font-normal{font-weight:400}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-10{height:2.5rem}.h-16{height:4rem}.h-20{height:5rem}.h-64{height:16rem}.h-auto{height:auto}.h-full{height:100%}.text-xs{font-size:.75rem}.text-sm{font-size:.875rem}.text-base{font-size:1rem}.text-lg{font-size:1.125rem}.text-xl{font-size:1.25rem}.text-2xl{font-size:1.5rem}.text-3xl{font-size:1.875rem}.text-4xl{font-size:2.25rem}.text-5xl{font-size:3rem}.text-6xl{font-size:4rem}.leading-none{line-height:1}.leading-tight{line-height:1.25}.leading-normal{line-height:1.5}.m-4{margin:1rem}.m-8{margin:2rem}.-m-4{margin:-1rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.my-4{margin-top:1rem;margin-bottom:1rem}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.my-8{margin-top:2rem;margin-bottom:2rem}.mx-auto{margin-left:auto;margin-right:auto}.-mx-8{margin-left:-2rem;margin-right:-2rem}.mb-0{margin-bottom:0}.ml-0{margin-left:0}.mt-1{margin-top:.25rem}.mr-1{margin-right:.25rem}.mb-1{margin-bottom:.25rem}.ml-1{margin-left:.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.mb-2{margin-bottom:.5rem}.ml-2{margin-left:.5rem}.mt-3{margin-top:.75rem}.mb-3{margin-bottom:.75rem}.ml-3{margin-left:.75rem}.mt-4{margin-top:1rem}.mb-4{margin-bottom:1rem}.ml-4{margin-left:1rem}.mt-6{margin-top:1.5rem}.mr-6{margin-right:1.5rem}.mb-6{margin-bottom:1.5rem}.mt-8{margin-top:2rem}.mb-8{margin-bottom:2rem}.mb-10{margin-bottom:2.5rem}.mt-12{margin-top:3rem}.max-w-xs{max-width:20rem}.max-w-sm{max-width:24rem}.max-w-4xl{max-width:56rem}.max-w-6xl{max-width:72rem}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.min-w-0{min-width:0}.object-cover{-o-object-fit:cover;object-fit:cover}.focus\:outline-none:focus,.outline-none{outline:0}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-4{padding-left:1rem;padding-right:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.px-8{padding-left:2rem;padding-right:2rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.py-16{padding-top:4rem;padding-bottom:4rem}.pt-0{padding-top:0}.pt-2{padding-top:.5rem}.pb-2{padding-bottom:.5rem}.pl-2{padding-left:.5rem}.pr-4{padding-right:1rem}.pb-4{padding-bottom:1rem}.pt-6{padding-top:1.5rem}.pb-8{padding-bottom:2rem}.pt-10{padding-top:2.5rem}.pr-10{padding-right:2.5rem}.pb-10{padding-bottom:2.5rem}.pl-10{padding-left:2.5rem}.pt-20{padding-top:5rem}.pt-32{padding-top:8rem}.placeholder-gray-400::-moz-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.placeholder-gray-400:-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.placeholder-gray-400::-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.placeholder-gray-400::placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.top-0{top:0}.right-0{right:0}.bottom-0{bottom:0}.left-0{left:0}.shadow{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.shadow-md{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.shadow-lg{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.shadow-2xl{box-shadow:0 25px 50px -12px rgba(0,0,0,.25)}.hover\:shadow-md:hover{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.hover\:shadow-lg:hover{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.hover\:shadow-inner:hover{box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.focus\:shadow-outline:focus{box-shadow:0 0 0 3px rgba(66,153,225,.5)}.fill-current{fill:currentColor}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-black{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.text-gray-500{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.text-gray-600{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.text-gray-700{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.text-gray-800{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.text-gray-900{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.text-red-600{--text-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--text-opacity))}.text-red-700{--text-opacity:1;color:#c53030;color:rgba(197,48,48,var(--text-opacity))}.text-yellow-700{--text-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--text-opacity))}.text-green-700{--text-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--text-opacity))}.text-green-900{--text-opacity:1;color:#22543d;color:rgba(34,84,61,var(--text-opacity))}.text-teal-500{--text-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--text-opacity))}.text-blue-200{--text-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--text-opacity))}.text-blue-700{--text-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--text-opacity))}.text-secondary-200{--text-opacity:1;color:#888883;color:rgba(136,136,131,var(--text-opacity))}.text-tempc-200{--text-opacity:1;color:#e93434;color:rgba(233,52,52,var(--text-opacity))}.text-tempc-400{--text-opacity:1;color:#266fea;color:rgba(38,111,234,var(--text-opacity))}.text-tempc-500{--text-opacity:1;color:#41d7aa;color:rgba(65,215,170,var(--text-opacity))}.hover\:text-black:hover{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.hover\:text-white:hover{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.hover\:text-gray-900:hover{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.hover\:text-red-500:hover{--text-opacity:1;color:#f56565;color:rgba(245,101,101,var(--text-opacity))}.hover\:text-yellow-500:hover{--text-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--text-opacity))}.hover\:text-green-500:hover{--text-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--text-opacity))}.focus\:text-black:focus{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.focus\:text-gray-900:focus{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.uppercase{text-transform:uppercase}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.whitespace-no-wrap{white-space:nowrap}.break-words{overflow-wrap:break-word}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-10{width:2.5rem}.w-16{width:4rem}.w-20{width:5rem}.w-24{width:6rem}.w-32{width:8rem}.w-auto{width:auto}.w-1\/2{width:50%}.w-2\/3{width:66.666667%}.w-2\/5{width:40%}.w-full{width:100%}.w-screen{width:100vw}.gap-4{grid-gap:1rem;gap:1rem}.gap-8{grid-gap:2rem;gap:2rem}.gap-10{grid-gap:2.5rem;gap:2.5rem}.grid-flow-col{grid-auto-flow:column}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.grid-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.transform{--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y))}.hover\:scale-125:hover{--transform-scale-x:1.25;--transform-scale-y:1.25}.transition{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}@-webkit-keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@-webkit-keyframes ping{0%{transform:scale(1);opacity:1}75%,to{transform:scale(2);opacity:0}}@keyframes ping{0%{transform:scale(1);opacity:1}75%,to{transform:scale(2);opacity:0}}@-webkit-keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}@-webkit-keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:translateY(0);-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}@keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:translateY(0);-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}@media (min-width:640px){.sm\:container{width:100%;max-width:640px}@media (min-width:768px){.sm\:container{max-width:768px}}@media (min-width:1024px){.sm\:container{max-width:1024px}}@media (min-width:1280px){.sm\:container{max-width:1280px}}.sm\:h-20{height:5rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:px-8{padding-left:2rem;padding-right:2rem}}@media (min-width:768px){.md\:container{width:100%}@media (min-width:640px){.md\:container{max-width:640px}}@media (min-width:768px){.md\:container{max-width:768px}}@media (min-width:1024px){.md\:container{max-width:1024px}}@media (min-width:1280px){.md\:container{max-width:1280px}}.md\:block{display:block}.md\:inline-block{display:inline-block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:flex-row{flex-direction:row}.md\:items-center{align-items:center}.md\:justify-center{justify-content:center}.md\:h-screen{height:100vh}.md\:text-sm{font-size:.875rem}.md\:text-xl{font-size:1.25rem}.md\:text-2xl{font-size:1.5rem}.md\:text-3xl{font-size:1.875rem}.md\:mx-auto{margin-left:auto;margin-right:auto}.md\:ml-56{margin-left:14rem}.md\:ml-64{margin-left:16rem}.md\:ml-auto{margin-left:auto}.md\:px-2{padding-left:.5rem;padding-right:.5rem}.md\:px-8{padding-left:2rem;padding-right:2rem}.md\:px-10{padding-left:2.5rem;padding-right:2.5rem}.md\:py-12{padding-top:3rem;padding-bottom:3rem}.md\:pb-0{padding-bottom:0}.md\:fixed{position:fixed}.md\:top-0{top:0}.md\:left-0{left:0}.md\:break-all{word-break:break-all}.md\:w-56{width:14rem}.md\:w-1\/2{width:50%}.md\:w-4\/5{width:80%}.md\:z-50{z-index:50}.md\:gap-4{grid-gap:1rem;gap:1rem}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:col-span-4{grid-column:span 4/span 4}.md\:grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.md\:grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}}@media (min-width:1024px){.lg\:container{width:100%}@media (min-width:640px){.lg\:container{max-width:640px}}@media (min-width:768px){.lg\:container{max-width:768px}}@media (min-width:1024px){.lg\:container{max-width:1024px}}@media (min-width:1280px){.lg\:container{max-width:1280px}}.lg\:block{display:block}.lg\:grid{display:grid}.lg\:items-start{align-items:flex-start}.lg\:items-center{align-items:center}.lg\:justify-center{justify-content:center}.lg\:text-sm{font-size:.875rem}.lg\:text-base{font-size:1rem}.lg\:text-lg{font-size:1.125rem}.lg\:text-3xl{font-size:1.875rem}.lg\:text-4xl{font-size:2.25rem}.lg\:text-5xl{font-size:3rem}.lg\:text-6xl{font-size:4rem}.lg\:ml-64{margin-left:16rem}.lg\:p-6{padding:1.5rem}.lg\:px-10{padding-left:2.5rem;padding-right:2.5rem}.lg\:text-center{text-align:center}.lg\:w-64{width:16rem}.lg\:w-1\/4{width:25%}.lg\:w-3\/5{width:60%}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.lg\:grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.lg\:row-span-2{grid-row:span 2/span 2}}@media (min-width:1280px){.xl\:container{width:100%}@media (min-width:640px){.xl\:container{max-width:640px}}@media (min-width:768px){.xl\:container{max-width:768px}}@media (min-width:1024px){.xl\:container{max-width:1024px}}@media (min-width:1280px){.xl\:container{max-width:1280px}}.xl\:text-2xl{font-size:1.5rem}} \ No newline at end of file diff --git a/views/layouts/login.ejs b/views/layouts/login.ejs index 496906e..3430f21 100644 --- a/views/layouts/login.ejs +++ b/views/layouts/login.ejs @@ -4,10 +4,10 @@ - + TradeByte