diff --git a/.github/workflows/ftpDeploy.yml b/.github/workflows/ftpDeploy.yml
index f7148bb..574fd44 100644
--- a/.github/workflows/ftpDeploy.yml
+++ b/.github/workflows/ftpDeploy.yml
@@ -15,6 +15,7 @@ jobs:
- name: 🔨Run Gulp
run: |
+ export github="true"
npm install
npm start
diff --git a/dist/api/index.php b/dist/api/index.php
index 0476c1a..8f7548d 100644
--- a/dist/api/index.php
+++ b/dist/api/index.php
@@ -49,10 +49,10 @@ $app->get("/timelineData/{timeline}", function (Request $request, Response $resp
$json = json_encode($result);
$response->getBody()->write($json);
- //if it is an error give a 403 code since it can't find the data
- if(array_key_exists("errorMessage", $result[0]))
+ //if it is an error give a 404 code since it can't find the data
+ if(array_key_exists("errorMessage", $result))
{
- $response = $response->withStatus(403);
+ $response = $response->withStatus(404);
}
//use content type json to indicate json data on frontend.
@@ -63,19 +63,193 @@ $app->get('/projectData', function (Request $request, Response $response)
{
global $projectData;
- $result= $projectData->getProjectData();
+ $result = $projectData->getProjectData();
$json = json_encode($result);
$response->getBody()->write($json);
- if(array_key_exists("errorMessage", $result[0]))
+ if(array_key_exists("errorMessage", $result))
{
- $response = $response->withStatus(403);
+ $response = $response->withStatus(404);
}
//use content type json to indicate json data on frontend.
return $response->withHeader("Content-Type", "application/json");
});
-$app->run();
+$app->post('/contact', function (Request $request, Response $response)
+{
+ $data = $request->getParsedBody();
+ if(empty($data["fName"]) || empty($data["lName"]) || empty($data["email"]) || empty($data["subject"]) || empty($data["message"]))
+ {
+ $response->getBody()->write(json_encode(array("errorMessage" => "Please fill out all the fields")));
+ $response = $response->withStatus(400);
+ return $response->withHeader("Content-Type", "application/json");
+ }
+
+ if (!filter_var($data["email"], FILTER_VALIDATE_EMAIL))
+ {
+ $response->getBody()->write(json_encode(array("errorMessage" => "Email is not the correct format")));
+ $response = $response->withStatus(400);
+ return $response->withHeader("Content-Type", "application/json");
+ }
+
+ // email form filler/conatcter
+ $headers1 = "From: noreply@rohitpai.tech\r\n";
+ $headers1 .= "Reply-To: rohit@rohitpai.tech\r\n";
+ $headers1 .= "MIME-Version: 1.0\r\n";
+ $headers1 .= "Content-Type: text/html; charset=UTF-8\r\n";
+
+ $message1 = "
+
+
+ {$data['subject']}
+
+
+
+ Thank you for filling out the form on my website, I will try to respond to your query as soon as I can.
+
+ Below is what you filled in for your record
+
+
+ Firstname
+ Lastname
+ Email
+ Subject
+ message
+
+
+ {$data['fName']}
+ {$data['lName']}
+ {$data['email']}
+ {$data['subject']}
+ {$data['message']}
+
+
+
+
+ Regards, Rohit Pai rohit@rohitpai.tech
+
+
+ ";
+
+ mail($data["email"], $data["subject"], $message1, $headers1);
+
+ // email to me
+ $headers2 = "From: noreply@rohitpai.tech\r\n";
+ $headers2 .= "Reply-To: {$data['email']}\r\n";
+ $headers2 .= "MIME-Version: 1.0\r\n";
+ $headers2 .= "Content-Type: text/html; charset=UTF-8\r\n";
+
+ $message2 = "
+
+
+ {$data['subject']}
+
+
+
+ {$data['fName']} {$data['lName']} filled in the form on the website, here is what they sent.
+
+
+ Firstname
+ Lastname
+ Email
+ Subject
+ message
+
+
+ {$data['fName']}
+ {$data['lName']}
+ {$data['email']}
+ {$data['subject']}
+ {$data['message']}
+
+
+
+
+ ";
+
+ mail("rohit@rohitpai.tech", "{$data['fName']} {$data['lName']} filled in the form", $message2, $headers2);
+ return $response->withStatus(201);
+});
+
+$app->run();
\ No newline at end of file
diff --git a/dist/api/timelineData.php b/dist/api/timelineData.php
index e3f2068..5686f13 100644
--- a/dist/api/timelineData.php
+++ b/dist/api/timelineData.php
@@ -25,7 +25,7 @@ class timelineData
}
else
{
- return array(array("errorMessage" => "Error, edu data not found"));
+ return array("errorMessage" => "Error, edu data not found");
}
}
@@ -44,7 +44,7 @@ class timelineData
}
else
{
- return array(array("errorMessage" => "Error, work data not found"));
+ return array("errorMessage" => "Error, work data not found");
}
}
diff --git a/dist/css/main.css b/dist/css/main.css
index 2ccab3d..cbe657a 100644
--- a/dist/css/main.css
+++ b/dist/css/main.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;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}template{display:none}[hidden]{display:none}html{scroll-behavior:smooth}body{font-family:Noto Sans KR,sans-serif;font-style:normal;font-weight:500;font-size:var(--generalFS);line-height:1.625rem}a:visited{color:inherit}h1,nav{font-family:Share Tech Mono,monospace;font-style:normal;font-weight:400;font-size:var(--titleFS);line-height:2.5625rem;text-transform:lowercase}h2{font-family:Noto Sans KR,sans-serif;font-style:normal;font-weight:500;font-size:var(--headingFS);line-height:2.1875rem}a.btn,form input[type=submit]{text-decoration:none;display:inline-block;padding:1rem 2rem;border-radius:.625em;border:.3215em solid var(--primaryDefault);color:#fff;text-align:center}a.btn:hover{border:.3215em solid var(--primaryHover)}a.btnPrimary,form input[type=submit]{background:var(--primaryDefault);cursor:pointer}a.btnOutline{background:#fff;color:var(--primaryDefault)}a.btnPrimary[disabled]{pointer-events:none;background:var(--notAvailableDefault);border:.3215em solid var(--notAvailableDefault)}a.btnPrimary[disabled]:hover{background:var(--notAvailableHover);border:.3215em solid var(--notAvailableHover)}a.btnPrimary:hover,form input[type=submit]:hover{background:var(--primaryHover)}a.btn:active,form input[type=submit]:active{padding:.8rem 1.8rem}.boxShadowOut:hover{box-shadow:0 6px 4px 0 var(--mutedBlack)}.boxShadowIn:active{box-shadow:inset 0 6px 4px 0 var(--mutedBlack)}.textShadow:hover{text-shadow:0 6px 4px var(--mutedBlack)}section#about,section#curriculumvitae h1{padding:0 5rem}header{background:#6a6a6a url(../imgs/hero.jpg) no-repeat bottom;background-size:cover;height:40%;color:#fff;backdrop-filter:grayscale(100%);position:relative}nav{display:flex;flex-direction:row;justify-content:space-between;padding:.25em;position:fixed;top:0;width:100%;transition:background-color .4s ease-in}nav.scrolled{background-color:var(--navBack);z-index:1}nav #nav-check{display:none}nav .nav-btn{display:none}nav h1{margin:0}nav a{text-decoration:none;color:#fff}nav ul{display:flex;flex-direction:row;gap:1em;margin:0;justify-content:flex-end;align-items:flex-end}nav ul li{list-style:none}nav ul li span{visibility:hidden}nav ul li .active span,nav ul li a:hover span{visibility:visible}header div{display:flex;flex-direction:column;justify-content:center;align-items:center;padding-top:10em}header div .btn{margin:2em 0}header div button{background:0 0;border:none;display:inline-block;text-align:center;text-decoration:none;font-size:2rem;cursor:pointer}i.fa-chevron-down{color:hsla(0,0%,67%,.58);font-size:3.75em;margin:1.5rem 0}div h1 span{visibility:visible;animation:caret 1s steps(1) infinite}@keyframes caret{50%{visibility:hidden}}section#about{margin-bottom:5rem}section#about div{padding:.1em 5em}section#curriculumVitae{background-color:var(--primaryDefault);color:#fff;padding:2em 0}section#curriculumVitae .cvGrid{display:flex;flex-direction:row;padding:0 1.5rem;flex-wrap:wrap}section#curriculumVitae .cvGrid>div{width:45%;display:flex;flex-direction:column;min-height:100%}section#curriculumVitae .cvGrid h2{text-align:center}section#curriculumVitae .timeline{position:relative;max-width:30em;gap:1em;display:flex;flex-direction:column;height:100%}section#curriculumVitae #work{margin:0 auto 0 8rem}section#curriculumVitae .timeline:before{content:"";position:absolute;height:100%;border:4px var(--timelineItemBrdr) solid;right:194px;top:0}section#curriculumVitae .timeline:after{content:"";display:table;clear:both}section#curriculumVitae .timelineItem{border:2px solid var(--timelineItemBrdr);-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;padding:0 1rem;width:50%;position:relative;background-color:var(--primaryHover)}.timelineItem:after,section#curriculumVitae .timelineItem:before{content:'';position:absolute}section#curriculumVitae .timelineItem:before{content:'';right:-20px;top:calc(50% - 5px);border-style:solid;border-color:var(--timelineItemBrdr) var(--timelineItemBrdr) transparent transparent;border-width:20px;transform:rotate(45deg)}section#curriculumVitae .timelineItem:nth-child(2n){margin-left:21em}section#curriculumVitae .timelineItem:nth-child(2n):before{right:auto;left:-20px;border-color:transparent transparent var(--timelineItemBrdr) var(--timelineItemBrdr)}section#curriculumVitae .timelineItem h3{font-weight:400}section#curriculumVitae .timelineItem span{color:#e5e5e5}section#projects{display:flex;flex-direction:row;padding:0 2.5rem;border-bottom:2px solid var(--mutedGrey)}section#projects .mainProj,section#projects .otherProj{width:50%;display:flex;flex-direction:column;align-items:center;gap:1em}section#projects .mainProj{border-right:2px solid var(--mutedGrey);padding:0 2.5em 5em 0}section#projects .mainProj img,section#projects .otherProj .oProjItem img{-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;display:block;margin:1em auto}section#projects .mainProj img{width:100%;max-width:40rem}section#projects .mainProj .flexRow{display:flex;flex-direction:row;gap:4em}section#projects .mainProj .flexCol{display:flex;flex-direction:column;gap:2.5em}section#projects .otherProj>a{margin:5rem 0}section#projects .otherProj>div{display:flex;flex-direction:column;gap:2em}section#projects .otherProj>div .oProjItem{display:flex;justify-content:center;align-items:center;flex-direction:row;margin:0 auto;width:90%;border:1px solid var(--grey);gap:1em;box-shadow:0 6px 4px 0 var(--mutedBlack);-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;padding:0 1em}section#projects .otherProj>div .oProjItem:nth-child(2){flex-direction:row-reverse}section#projects .otherProj .oProjItem img{max-width:15rem;width:100%;padding:0 1em}section#projects .oProjItem .flexCol div:nth-child(2){display:flex;flex-direction:row;justify-content:flex-start;gap:3em;margin-left:2em}section#projects .flexCol div:nth-child(2) .btn{padding:.25em .5em}:root{--mainHue:79;--mainSat:62%;--mainLight:51%;--primaryDefault:hsla(var(--mainHue), var(--mainSat), var(--mainLight), 1);--primaryHover:hsla(var(--mainHue), var(--mainSat), calc(var(--mainLight) - 10%), 1);--timelineItemBrdr:hsla(var(--mainHue), var(--mainSat), calc(var(--mainLight) - 20%), 1);--errorDefault:hsla(0, var(--mainSat), var(--mainLight), 1);--grey:hsla(0, 0%, 39%, 1);--notAvailableDefault:hsla(0, 0%, 39%, 1);--notAvailableHover:hsla(0, 0%,32%, 1);--mutedGrey:hsla(0, 0%, 78%, 1);--mutedBlack:hsla(0, 0%, 0%, 0.25);--navBack:hsla(0, 0%, 30%, 1);--titleFS:2.25rem;--generalFS:1.125rem;--headingFS:1.5rem}*{box-sizing:border-box}@media screen and (max-width:90em){section#curriculumvitae .cvGrid{flex-direction:column;justify-content:center;align-items:center}section#curriculumvitae .cvGrid>div{width:100%}section#curriculumvitae .cvGrid>div:first-child{padding-bottom:2.5em;margin-bottom:2.5em;border-bottom:5px #fff solid}section#curriculumvitae .cvGrid h2{margin-left:5em}section#curriculumvitae .cvGrid .timeline{margin:0 auto}}@media screen and (max-width:75em){section#about,section#curriculumvitae h1{padding:0 1em}nav{display:block;height:50px;width:100%;background-color:var(--navBack);position:fixed;top:0;padding:0}nav a h1{margin-left:1ch}nav .nav-btn{display:inline-block;position:absolute;right:75px;top:-360px}nav ul{position:fixed;display:block;width:100%;background-color:#333;transition:all .4s ease-in;overflow-y:hidden;padding-left:0;margin-top:7px}nav ul li a{display:block;width:100%;transform:translateX(-30px);transition:all .4s ease-in;opacity:0}.nav-btn label{display:inline-block;cursor:pointer;width:60px;height:50px;position:fixed;-webkit-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);transform:rotate(0);-webkit-transition:.5s ease-in;-moz-transition:.5s ease-in;-o-transition:.5s ease-in;transition:.5s ease-in}.nav-btn label span{display:block;position:absolute;height:5px;width:100%;background-color:#fff;opacity:1;right:0;top:20px;-webkit-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);transform:rotate(0);-webkit-transition:.25s ease-in;-moz-transition:.25s ease-in;-o-transition:.25s ease-in;transition:.25s ease-in}nav #nav-check:not(:checked)~ul{height:auto;max-height:0}nav #nav-check:not(:checked)~.nav-btn label span:nth-child(1){top:8px;-webkit-transform-origin:left center;-moz-transform-origin:left center;-o-transform-origin:left center;transform-origin:left center}nav #nav-check:not(:checked)~.nav-btn label span:nth-child(2){top:23px;-webkit-transform-origin:left center;-moz-transform-origin:left center;-o-transform-origin:left center;transform-origin:left center}nav #nav-check:not(:checked)~.nav-btn label span:nth-child(3){top:38px;-webkit-transform-origin:left center;-moz-transform-origin:left center;-o-transform-origin:left center;transform-origin:left center}nav #nav-check:checked~.nav-btn label,nav .nav-btn label:hover{background-color:rgba(-1,0,0,.3)}nav #nav-check:checked~ul{max-height:50vh;overflow-y:hidden}nav #nav-check:checked~ul li a{opacity:1;transform:translateX(0)}nav #nav-check:checked~ul li:nth-child(1) a{transition-delay:.15s}nav #nav-check:checked~ul li:nth-child(2) a{transition-delay:.25s}nav #nav-check:checked~ul li:nth-child(3) a{transition-delay:.35s}nav #nav-check:checked~ul li:nth-child(4) a{transition-delay:.45s}nav #nav-check:checked~ul li:nth-child(5) a{transition-delay:.55s}nav #nav-check:checked~.nav-btn label span:first-child{-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}nav #nav-check:checked~.nav-btn label span:nth-child(2){width:0;opacity:0}nav #nav-check:checked~.nav-btn label span:last-child{-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}section#about div{padding:.1em 2.5em}section#curriculumvitae .cvGrid{padding:0}section#projects{flex-direction:column;justify-content:center;align-items:center}section#projects .mainProj{border-right:0;padding:0;width:100%;margin:0 5em}section#projects .mainProj img{padding:0 1em}section#projects .mainProj .flexRow{flex-direction:column;margin:0 2.5em}section#projects .mainProj .flexCol{flex-direction:row;justify-content:center;align-items:center}section#projects .otherProj{width:100%}section#projects .otherProj .btn{width:10em;text-align:center}section#projects .otherProj>div .oProjItem,section#projects .otherProj>div .oProjItem:nth-child(2){flex-direction:column}section#projects .oProjItem .flexCol div:nth-child(2){justify-content:center;margin-left:0;margin-bottom:1em}section#projects .otherProj>a{margin-left:3em;margin-right:3em;text-align:center}}@media screen and (max-width:55em){section#curriculumvitae .cvGrid .timeline,section#curriculumvitae .cvGrid .timeline#work{margin:0 auto;width:100%}section#curriculumvitae .timeline:before{border:none}section#curriculumvitae .timelineItem,section#curriculumvitae .timelineItem:nth-child(2n){width:95%;padding:0;margin:0 auto}section#curriculumvitae .timelineItem:before{right:unset;left:unset;border:none}}@media screen and (max-width:31em){section#about,section#curriculumvitae h1{padding:0 1em}header div h1{text-align:center;height:5.125rem}section#about div{padding:.1em 1em}section#projects .mainProj .flexCol{flex-direction:column}section#projects .oProjItem .flexCol div:nth-child(2){flex-direction:column;justify-content:center;align-items:center}}
\ 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;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}template{display:none}[hidden]{display:none}html{scroll-behavior:smooth}body{font-family:Noto Sans KR,sans-serif;font-style:normal;font-weight:500;font-size:var(--generalFS);line-height:1.625rem}a:visited{color:inherit}h1,nav{font-family:Share Tech Mono,monospace;font-style:normal;font-weight:400;font-size:var(--titleFS);line-height:2.5625rem;text-transform:lowercase}h2{font-family:Noto Sans KR,sans-serif;font-style:normal;font-weight:500;font-size:var(--headingFS);line-height:2.1875rem}a.btn,form input[type=submit]{text-decoration:none;display:inline-block;padding:1rem 2rem;border-radius:.625em;border:.3215em solid var(--primaryDefault);color:#fff;text-align:center}a.btn:hover,form input[type=submit]:hover{border:.3215em solid var(--primaryHover)}a.btnPrimary,form input[type=submit]{background:var(--primaryDefault);cursor:pointer}a.btnOutline{background:#fff;color:var(--primaryDefault)}a.btnPrimary[disabled]{pointer-events:none;background:var(--notAvailableDefault);border:.3215em solid var(--notAvailableDefault)}a.btnPrimary[disabled]:hover{background:var(--notAvailableHover);border:.3215em solid var(--notAvailableHover)}a.btnPrimary:hover,form input[type=submit]:hover{background:var(--primaryHover)}a.btn:active,form input[type=submit]:active{padding:.8rem 1.8rem}.boxShadowOut:hover{box-shadow:0 6px 4px 0 var(--mutedBlack)}.boxShadowIn:active{box-shadow:inset 0 6px 4px 0 var(--mutedBlack)}.textShadow:hover{text-shadow:0 6px 4px var(--mutedBlack)}section#about,section#curriculumvitae h1{padding:0 5rem}header{background:#6a6a6a url(../imgs/hero.jpg) no-repeat bottom;background-size:cover;height:40%;color:#fff;backdrop-filter:grayscale(100%);position:relative}nav{display:flex;flex-direction:row;justify-content:space-between;padding:.25em;position:fixed;top:0;width:100%;transition:background-color .4s ease-in}nav.scrolled{background-color:var(--navBack);z-index:1}nav #nav-check{display:none}nav .nav-btn{display:none}nav h1{margin:0}nav a{text-decoration:none;color:#fff}nav ul{display:flex;flex-direction:row;gap:1em;margin:0;justify-content:flex-end;align-items:flex-end}nav ul li{list-style:none}nav ul li span{visibility:hidden}nav ul li .active span,nav ul li a:hover span{visibility:visible}header div{display:flex;flex-direction:column;justify-content:center;align-items:center;padding-top:10em}header div .btn{margin:2em 0}header div button{background:0 0;border:none;display:inline-block;text-align:center;text-decoration:none;font-size:2rem;cursor:pointer}i.fa-chevron-down{color:hsla(0,0%,67%,.58);font-size:3.75em;margin:1.5rem 0}div h1 span{visibility:visible;animation:caret 1s steps(1) infinite}@keyframes caret{50%{visibility:hidden}}section#about{margin-bottom:5rem}section#about div{padding:.1em 5em}section#curriculumVitae{background-color:var(--primaryDefault);color:#fff;padding:2em 0}section#curriculumVitae .cvGrid{display:flex;flex-direction:row;padding:0 1.5rem;flex-wrap:wrap}section#curriculumVitae .cvGrid>div{width:45%;display:flex;flex-direction:column;min-height:100%}section#curriculumVitae .cvGrid h2{text-align:center}section#curriculumVitae .timeline{position:relative;max-width:30em;gap:1em;display:flex;flex-direction:column;height:100%}section#curriculumVitae #work{margin:0 auto 0 8rem}section#curriculumVitae .timeline:before{content:"";position:absolute;height:100%;border:4px var(--timelineItemBrdr) solid;right:194px;top:0}section#curriculumVitae .timeline:after{content:"";display:table;clear:both}section#curriculumVitae .timelineItem{border:2px solid var(--timelineItemBrdr);-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;padding:0 1rem;width:50%;position:relative;background-color:var(--primaryHover)}.timelineItem:after,section#curriculumVitae .timelineItem:before{content:'';position:absolute}section#curriculumVitae .timelineItem:before{content:'';right:-20px;top:calc(50% - 5px);border-style:solid;border-color:var(--timelineItemBrdr) var(--timelineItemBrdr) transparent transparent;border-width:20px;transform:rotate(45deg)}section#curriculumVitae .timelineItem:nth-child(2n){margin-left:21em}section#curriculumVitae .timelineItem:nth-child(2n):before{right:auto;left:-20px;border-color:transparent transparent var(--timelineItemBrdr) var(--timelineItemBrdr)}section#curriculumVitae .timelineItem h3{font-weight:400}section#curriculumVitae .timelineItem span{color:#e5e5e5}section#projects{display:flex;flex-direction:row;padding:0 2.5rem;border-bottom:2px solid var(--mutedGrey)}section#projects .mainProj,section#projects .otherProj{width:50%;display:flex;flex-direction:column;align-items:center;gap:1em}section#projects .mainProj{border-right:2px solid var(--mutedGrey);padding:0 2.5em 5em 0}section#projects .mainProj img,section#projects .otherProj .oProjItem img{-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;display:block;margin:1em auto}section#projects .mainProj img{width:100%;max-width:40rem}section#projects .mainProj .flexRow{display:flex;flex-direction:row;gap:4em}section#projects .mainProj .flexCol{display:flex;flex-direction:column;gap:2.5em}section#projects .otherProj>a{margin:5rem 0}section#projects .otherProj>div{display:flex;flex-direction:column;gap:2em}section#projects .otherProj>div .oProjItem{display:flex;justify-content:center;align-items:center;flex-direction:row;margin:0 auto;width:90%;border:1px solid var(--grey);gap:1em;box-shadow:0 6px 4px 0 var(--mutedBlack);-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;padding:0 1em}section#projects .otherProj>div .oProjItem:nth-child(2){flex-direction:row-reverse}section#projects .otherProj .oProjItem img{max-width:15rem;width:100%;padding:0 1em}section#projects .oProjItem .flexCol div:nth-child(2){display:flex;flex-direction:row;justify-content:flex-start;gap:3em;margin-left:2em}section#projects .flexCol div:nth-child(2) .btn{padding:.25em .5em}section#contact{display:flex;flex-direction:row;padding:0 2.5em}div#findMe,div#sayHello{width:50%;display:flex;flex-direction:column;align-items:center;gap:1em}div#findMe .findMeContainer{display:flex;flex-direction:row;justify-content:space-around;align-items:center;gap:2em;width:100%;height:100%;margin:5em 0}div#findMe .findMeContainer .profile{-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%}div#findMe .socialIcons{display:flex;flex-direction:row;justify-content:center;align-items:center;gap:2em}div#findMe .socialIcons div{display:flex;flex-direction:column;gap:1.5em}div#findMe .socialIcons div svg{width:2.5em;fill:var(--primaryDefault);font-size:2em}div#findMe .socialIcons div a:hover svg{fill:var(--primaryHover)}div#sayHello #contactForm{display:flex;flex-direction:column;justify-content:center;align-items:center}#contactForm .flName{display:flex;flex-direction:row;gap:1em}#contactForm .formControl{width:100%}#contactForm input[type=submit]{margin-top:1em;align-self:flex-start}#contactForm .formControl input:not([type=submit]),#contactForm .formControl textarea{width:100%;border:4px solid var(--primaryDefault);background:0 0;outline:0;-webkit-border-radius:1em;-moz-border-radius:1em;border-radius:.5em;padding:0 .5em}#contactForm .formControl textarea{padding:.5em}#contactForm .formControl input:not([type=submit]).invalid:invalid,#contactForm .formControl textarea.invalid:invalid{border:4px solid var(--errorDefault)}#contactForm .formControl input:not([type=submit]).invalid:invalid:focus,#contactForm .formControl textarea.invalid:invalid:focus{border:4px solid var(--errorHover);box-shadow:0 4px 2px 0 var(--mutedBlack)}#contactForm .formControl input:not([type=submit]):focus,#contactForm .formControl textarea:focus{border:4px solid var(--primaryHover)}#contactForm .formControl input:not([type=submit]){height:3em}#contactForm .flName{display:flex;flex-direction:row;gap:1em}#contactForm .formControl{width:100%}#contactForm input[type=submit]{margin-top:1em;align-self:flex-start}#contactForm .formControl input:not([type=submit]),#contactForm .formControl textarea{width:100%;border:4px solid var(--primaryDefault);background:0 0;outline:0;-webkit-border-radius:1em;-moz-border-radius:1em;border-radius:.5em;padding:0 .5em}#contactForm .formControl textarea{padding:.5em}#contactForm .formControl input:not([type=submit]).invalid:invalid,#contactForm .formControl textarea.invalid:invalid{border:4px solid var(--errorDefault)}#contactForm .formControl input:not([type=submit]).invalid:invalid:focus,#contactForm .formControl textarea.invalid:invalid:focus{border:4px solid var(--errorHover);box-shadow:0 4px 2px 0 var(--mutedBlack)}#contactForm .formControl input:not([type=submit]):focus,#contactForm .formControl textarea:focus{border:4px solid var(--primaryHover)}#contactForm .formControl input:not([type=submit]){height:3em}div.message{background:var(--primaryDefault);color:#fff;padding:.5em .8em;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;display:flex;justify-content:center;align-items:center;align-self:flex-start;flex-direction:row-reverse;position:relative;height:75px;visibility:visible;overflow:hidden;-webkit-transition:all .5s ease-in-out;-moz-transition:all .5s ease-in-out;-ms-transition:all .5s ease-in-out;-o-transition:all .5s ease-in-out;transition:all .5s ease-in-out;opacity:1;margin-top:1em}div.message.error{background:var(--errorDefault)}div.message button{border:none;background:0 0;outline:0;cursor:pointer;color:#fff;font-size:1.25rem;margin-top:-5px;position:absolute;transform:translate(0,0);transform-origin:0 0;right:10px;top:10px}div.message.hidden{opacity:0;visibility:hidden;height:0}div.message button:hover{text-shadow:-1px 2px var(--mutedBlack)}:root{--mainHue:79;--mainSat:62%;--mainLight:51%;--primaryDefault:hsla(var(--mainHue), var(--mainSat), var(--mainLight), 1);--primaryHover:hsla(var(--mainHue), var(--mainSat), calc(var(--mainLight) - 10%), 1);--timelineItemBrdr:hsla(var(--mainHue), var(--mainSat), calc(var(--mainLight) - 20%), 1);--errorDefault:hsla(0, calc(var(--mainSat) + 10%),calc(var(--mainLight) + 10%), 1);--errorHover:hsla(0, calc(var(--mainSat) + 10%), calc(var(--mainLight) - 10%), 1);--grey:hsla(0, 0%, 39%, 1);--notAvailableDefault:hsla(0, 0%, 39%, 1);--notAvailableHover:hsla(0, 0%,32%, 1);--mutedGrey:hsla(0, 0%, 78%, 1);--mutedBlack:hsla(0, 0%, 0%, 0.25);--navBack:hsla(0, 0%, 30%, 1);--titleFS:2.25rem;--generalFS:1.125rem;--headingFS:1.5rem}*{box-sizing:border-box}@media screen and (max-width:90em){section#curriculumvitae .cvGrid{flex-direction:column;justify-content:center;align-items:center}section#curriculumvitae .cvGrid>div{width:100%}section#curriculumvitae .cvGrid>div:first-child{padding-bottom:2.5em;margin-bottom:2.5em;border-bottom:5px #fff solid}section#curriculumvitae .cvGrid h2{margin-left:5em}section#curriculumvitae .cvGrid .timeline{margin:0 auto}}@media screen and (max-width:75em){section#about,section#curriculumvitae h1{padding:0 1em}nav{display:block;height:50px;width:100%;background-color:var(--navBack);position:fixed;top:0;padding:0}nav a h1{margin-left:1ch}nav .nav-btn{display:inline-block;position:absolute;right:75px;top:-360px}nav ul{position:fixed;display:block;width:100%;background-color:#333;transition:all .4s ease-in;overflow-y:hidden;padding-left:0;margin-top:7px}nav ul li a{display:block;width:100%;transform:translateX(-30px);transition:all .4s ease-in;opacity:0}.nav-btn label{display:inline-block;cursor:pointer;width:60px;height:50px;position:fixed;-webkit-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);transform:rotate(0);-webkit-transition:.5s ease-in;-moz-transition:.5s ease-in;-o-transition:.5s ease-in;transition:.5s ease-in}.nav-btn label span{display:block;position:absolute;height:5px;width:100%;background-color:#fff;opacity:1;right:0;top:20px;-webkit-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);transform:rotate(0);-webkit-transition:.25s ease-in;-moz-transition:.25s ease-in;-o-transition:.25s ease-in;transition:.25s ease-in}nav #nav-check:not(:checked)~ul{height:auto;max-height:0}nav #nav-check:not(:checked)~.nav-btn label span:nth-child(1){top:8px;-webkit-transform-origin:left center;-moz-transform-origin:left center;-o-transform-origin:left center;transform-origin:left center}nav #nav-check:not(:checked)~.nav-btn label span:nth-child(2){top:23px;-webkit-transform-origin:left center;-moz-transform-origin:left center;-o-transform-origin:left center;transform-origin:left center}nav #nav-check:not(:checked)~.nav-btn label span:nth-child(3){top:38px;-webkit-transform-origin:left center;-moz-transform-origin:left center;-o-transform-origin:left center;transform-origin:left center}nav #nav-check:checked~.nav-btn label,nav .nav-btn label:hover{background-color:rgba(-1,0,0,.3)}nav #nav-check:checked~ul{max-height:50vh;overflow-y:hidden}nav #nav-check:checked~ul li a{opacity:1;transform:translateX(0)}nav #nav-check:checked~ul li:nth-child(1) a{transition-delay:.15s}nav #nav-check:checked~ul li:nth-child(2) a{transition-delay:.25s}nav #nav-check:checked~ul li:nth-child(3) a{transition-delay:.35s}nav #nav-check:checked~ul li:nth-child(4) a{transition-delay:.45s}nav #nav-check:checked~ul li:nth-child(5) a{transition-delay:.55s}nav #nav-check:checked~.nav-btn label span:first-child{-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}nav #nav-check:checked~.nav-btn label span:nth-child(2){width:0;opacity:0}nav #nav-check:checked~.nav-btn label span:last-child{-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}section#about div{padding:.1em 2.5em}section#curriculumvitae .cvGrid{padding:0}section#projects{flex-direction:column;justify-content:center;align-items:center}section#projects .mainProj{border-right:0;padding:0;width:100%;margin:0 5em}section#projects .mainProj img{padding:0 1em}section#projects .mainProj .flexRow{flex-direction:column;margin:0 2.5em}section#projects .mainProj .flexCol{flex-direction:row;justify-content:center;align-items:center}section#projects .otherProj{width:100%}section#projects .otherProj .btn{width:10em;text-align:center}section#projects .otherProj>div .oProjItem,section#projects .otherProj>div .oProjItem:nth-child(2){flex-direction:column}section#projects .oProjItem .flexCol div:nth-child(2){justify-content:center;margin-left:0;margin-bottom:1em}section#projects .otherProj>a{margin-left:3em;margin-right:3em;text-align:center}section#contact{flex-direction:column;justify-content:center;align-items:center}div#findMe,div#sayHello{width:100%}div#findMe .findMeContainer{flex-direction:column;justify-content:center}div#findMe .socialIcons{flex-direction:row}div#findMe .socialIcons div{flex-direction:row}}@media screen and (max-width:55em){section#curriculumvitae .cvGrid .timeline,section#curriculumvitae .cvGrid .timeline#work{margin:0 auto;width:100%}section#curriculumvitae .timeline:before{border:none}section#curriculumvitae .timelineItem,section#curriculumvitae .timelineItem:nth-child(2n){width:95%;padding:0;margin:0 auto}section#curriculumvitae .timelineItem:before{right:unset;left:unset;border:none}div#findMe .socialIcons{flex-direction:column}#contactForm .flName{flex-direction:column;gap:0;width:100%}}@media screen and (max-width:31em){section#about,section#curriculumvitae h1{padding:0 1em}header div h1{text-align:center;height:5.125rem}section#about div{padding:.1em 1em}section#projects .mainProj .flexCol{flex-direction:column}section#projects .oProjItem .flexCol div:nth-child(2){flex-direction:column;justify-content:center;align-items:center}}
\ No newline at end of file
diff --git a/dist/imgs/blog.svg b/dist/imgs/blog.svg
deleted file mode 100644
index e644970..0000000
--- a/dist/imgs/blog.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/dist/imgs/email.svg b/dist/imgs/email.svg
deleted file mode 100644
index a2c425a..0000000
--- a/dist/imgs/email.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/dist/imgs/github.svg b/dist/imgs/github.svg
deleted file mode 100644
index 4784f7b..0000000
--- a/dist/imgs/github.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/dist/imgs/hero before.jpg b/dist/imgs/hero before.jpg
new file mode 100644
index 0000000..2c3b469
Binary files /dev/null and b/dist/imgs/hero before.jpg differ
diff --git a/dist/imgs/instagram.svg b/dist/imgs/instagram.svg
deleted file mode 100644
index a4b9ff2..0000000
--- a/dist/imgs/instagram.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/dist/imgs/linkedin.svg b/dist/imgs/linkedin.svg
deleted file mode 100644
index 0fcc887..0000000
--- a/dist/imgs/linkedin.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/dist/imgs/phone.svg b/dist/imgs/phone.svg
deleted file mode 100644
index dba3946..0000000
--- a/dist/imgs/phone.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/dist/imgs/profile.jpg b/dist/imgs/profile.jpg
new file mode 100644
index 0000000..8bc20a4
Binary files /dev/null and b/dist/imgs/profile.jpg differ
diff --git a/dist/index.html b/dist/index.html
index 9e513e9..cd889fd 100644
--- a/dist/index.html
+++ b/dist/index.html
@@ -1 +1 @@
-Rohit Pai - Portfolio about Lorem ipsum dolor sit amet, consectetur adipisicing elit. Beatae debitis dolore, illum minus molestias officiis quidem similique ut. Autem consectetur eum, fugit illum ipsam laudantium magnam magni minima nesciunt numquam officia, soluta unde, voluptates! Aliquid aut, beatae dignissimos, dolorem ex exercitationem fugiat harum itaque laudantium placeat repellat suscipit velit! Aliquam architecto autem beatae consectetur, dicta dolorum eligendi esse harum hic iure labore, libero molestias nemo neque nisi nostrum odio sed sunt tempora totam voluptatem voluptatibus.
Download CV
\ No newline at end of file
+Rohit Pai - Portfolio about Lorem ipsum dolor sit amet, consectetur adipisicing elit. Beatae debitis dolore, illum minus molestias officiis quidem similique ut. Autem consectetur eum, fugit illum ipsam laudantium magnam magni minima nesciunt numquam officia, soluta unde, voluptates! Aliquid aut, beatae dignissimos, dolorem ex exercitationem fugiat harum itaque laudantium placeat repellat suscipit velit! Aliquam architecto autem beatae consectetur, dicta dolorum eligendi esse harum hic iure labore, libero molestias nemo neque nisi nostrum odio sed sunt tempora totam voluptatem voluptatibus.
Download CV
\ No newline at end of file
diff --git a/dist/js/main.js b/dist/js/main.js
index 79bed5b..5c7954f 100644
--- a/dist/js/main.js
+++ b/dist/js/main.js
@@ -1 +1 @@
-const scrollLimit=150;var dataText=["full stack developer","web designer","student","gamer","drummer"];function typeWriter(t,e,n){e_',setTimeout((function(){typeWriter(t,e+1,n)}),100)):"function"==typeof n&&setTimeout(n,700)}function StartTextAnimation(t){void 0===dataText[t]?setTimeout((function(){StartTextAnimation(0)}),1500):t{t.json().then((e=>{t.ok&&e.forEach((t=>{let e=document.createElement("div");e.classList.add("timelineItem"),e.innerHTML=`\n\t\t\t\t\t\n\t\t\t\t\tGrade: ${t.grade} \n\t\t\t\t\t${t.course}
\n\t\t\t\t`,document.getElementById("edu").appendChild(e)}))}))})),fetch("/api/timelineData/work").then((t=>{t.json().then((e=>{t.ok&&e.forEach((t=>{let e=document.createElement("div");e.classList.add("timelineItem"),e.innerHTML=`\n\t\t\t\t\t\n\t\t\t\t\t${t.companyName} - ${t.area} \n\t\t\t\t\t${t.title}
\n\t\t\t\t`,document.getElementById("work").appendChild(e)}))}))}))}function getProjectData(){fetch("/api/projectData").then((t=>{t.json().then((e=>{t.ok&&e.forEach((t=>{if("1"===t.isMainProject)return document.getElementById("mainProj").innerHTML=`\n\t\t\t\t\t\t${t.title} \n\t\t\t\t\t\t\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t
${t.information}
\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t`,null;document.querySelector("#otherProj div").innerHTML+=`\n \n
\n
\n
\n `}))}))}))}window.onscroll=()=>{document.body.scrollTop>=150||document.documentElement.scrollTop>=150?document.querySelector("nav").classList.add("scrolled"):document.querySelector("nav").classList.remove("scrolled");let t="";document.querySelectorAll("section").forEach((e=>{const n=e.offsetTop;window.pageYOffset>=n-60&&(t=e.getAttribute("id"))})),document.querySelectorAll("nav ul li a").forEach((e=>{e.classList.remove("active"),e.href.includes(t)&&""!==t?e.classList.add("active"):""===t&&document.querySelector("nav ul li a").classList.add("active")}))},document.addEventListener("DOMContentLoaded",(()=>{StartTextAnimation(0),getTimelineData(),getProjectData()}));
\ No newline at end of file
+const scrollLimit=150;var dataText=["full stack developer","web designer","student","gamer","drummer"];function typeWriter(t,e,n){e_',setTimeout((function(){typeWriter(t,e+1,n)}),100)):"function"==typeof n&&setTimeout(n,700)}function StartTextAnimation(t){void 0===dataText[t]?setTimeout((function(){StartTextAnimation(0)}),1500):t{t.json().then((e=>{t.ok&&e.forEach((t=>{let e=document.createElement("div");e.classList.add("timelineItem"),e.innerHTML=`\n\t\t\t\t\t\n\t\t\t\t\tGrade: ${t.grade} \n\t\t\t\t\t${t.course}
\n\t\t\t\t`,document.getElementById("edu").appendChild(e)}))}))})),fetch("/api/timelineData/work").then((t=>{t.json().then((e=>{t.ok&&e.forEach((t=>{let e=document.createElement("div");e.classList.add("timelineItem"),e.innerHTML=`\n\t\t\t\t\t\n\t\t\t\t\t${t.companyName} - ${t.area} \n\t\t\t\t\t${t.title}
\n\t\t\t\t`,document.getElementById("work").appendChild(e)}))}))}))}function getProjectData(){fetch("/api/projectData").then((t=>{t.json().then((e=>{t.ok&&e.forEach((t=>{if("1"===t.isMainProject)return document.getElementById("mainProj").innerHTML=`\n\t\t\t\t\t\t${t.title} \n\t\t\t\t\t\t\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t
${t.information}
\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t`,null;document.querySelector("#otherProj div").innerHTML+=`\n \n
\n
\n
\n `}))}))}))}window.onscroll=()=>{document.body.scrollTop>=150||document.documentElement.scrollTop>=150?document.querySelector("nav").classList.add("scrolled"):document.querySelector("nav").classList.remove("scrolled");let t="";document.querySelectorAll("section").forEach((e=>{const n=e.offsetTop;window.pageYOffset>=n-60&&(t=e.getAttribute("id"))})),document.querySelectorAll("nav ul li a").forEach((e=>{e.classList.remove("active"),e.href.includes(t)&&""!==t?e.classList.add("active"):""===t&&document.querySelector("nav ul li a").classList.add("active")}))},document.addEventListener("DOMContentLoaded",(()=>{StartTextAnimation(0),getTimelineData(),getProjectData()})),document.querySelector("#contactError .close").addEventListener("click",(()=>document.querySelector("#contactError").classList.toggle("hidden"))),document.querySelector("#contactForm").addEventListener("submit",(t=>{t.preventDefault();let e=new FormData;e.append("fName",document.querySelector("#fName").value),e.append("lName",document.querySelector("#lName").value),e.append("email",document.querySelector("#email").value),e.append("subject",document.querySelector("#subject").value),e.append("message",document.querySelector("#message").value);let n=!1;if(["#fName","#lName","#email","#subject","#message"].forEach((t=>{const e=document.querySelector(t);0===e.value.length?(e.classList.add("invalid"),n=!0):(e.classList.remove("invalid"),document.querySelector("#contactError").classList.remove("error"))})),n)return document.querySelector("#contactError").classList.add("error"),document.querySelector("#contactError").classList.remove("hidden"),void(document.querySelector("#contactError div").innerText="Please fill out all fields.");fetch("/api/contact",{method:"POST",body:e}).then((t=>{t.ok&&(document.querySelector("#contactError").classList.remove("hidden"),document.querySelector("#contactError div").innerText="Thanks for contacting me, I will get back to you as soon as possible.")}))}));
\ No newline at end of file
diff --git a/gulpfile.js b/gulpfile.js
index 1104443..9188dab 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -3,13 +3,8 @@ const browserSync = require("browser-sync").create();
const htmlMin = require("gulp-htmlmin");
const cssMin = require("gulp-clean-css")
const terser = require("gulp-terser");
-const ftp = require("vinyl-ftp");
-const env = require("gulp-env");
-env({
- file: ".env",
- type: ".ini"
-});
+const github = (process.env.github) ? true : false;
gulp.task("minifyHTML", () =>
{
@@ -57,25 +52,6 @@ gulp.task("watchFiles", () =>
gulp.watch("src/api/*.php", gulp.task("movePHPFiles"))
});
-gulp.task("ftp", () =>
-{
- let conn = ftp.create(
- {
- host: process.env.host,
- user: process.env.user,
- pass: process.env.pass,
- parallel: 1,
- });
- return gulp.src("dist/**", {base: "dist", dot: true})
- .pipe(conn.newerOrDifferentSize("/"))
- .pipe(conn.dest("/"));
-});
-
-gulp.task("deploy", () =>
-{
- gulp.watch("dist", gulp.task("ftp"));
-});
-
gulp.task("browserSync", () =>
{
browserSync.init({
@@ -89,4 +65,17 @@ gulp.task("browserSync", () =>
gulp.watch("dist").on("change", browserSync.reload)
});
-gulp.task("default", gulp.series(gulp.parallel("watchFiles", "browserSync")));
+gulp.task("default", async () =>
+{
+ if(github)
+ {
+ (gulp.series("movePHPFiles", "minifyJS", "minifyHTML", "minifyCSS")());
+ }
+ else
+ {
+ (gulp.series(gulp.parallel("watchFiles", "browserSync"))());
+ }
+});
+
+//gulp.task("default", gulp.series(gulp.parallel("watchFiles", "browserSync")));
+
diff --git a/src/api/index.php b/src/api/index.php
index 0476c1a..4d41d50 100644
--- a/src/api/index.php
+++ b/src/api/index.php
@@ -49,10 +49,10 @@ $app->get("/timelineData/{timeline}", function (Request $request, Response $resp
$json = json_encode($result);
$response->getBody()->write($json);
- //if it is an error give a 403 code since it can't find the data
- if(array_key_exists("errorMessage", $result[0]))
+ //if it is an error give a 404 code since it can't find the data
+ if(array_key_exists("errorMessage", $result))
{
- $response = $response->withStatus(403);
+ $response = $response->withStatus(404);
}
//use content type json to indicate json data on frontend.
@@ -63,19 +63,193 @@ $app->get('/projectData', function (Request $request, Response $response)
{
global $projectData;
- $result= $projectData->getProjectData();
+ $result = $projectData->getProjectData();
$json = json_encode($result);
$response->getBody()->write($json);
- if(array_key_exists("errorMessage", $result[0]))
+ if(array_key_exists("errorMessage", $result))
{
- $response = $response->withStatus(403);
+ $response = $response->withStatus(404);
}
//use content type json to indicate json data on frontend.
return $response->withHeader("Content-Type", "application/json");
});
-$app->run();
+$app->post('/contact', function (Request $request, Response $response)
+{
+ $data = $request->getParsedBody();
+ if(empty($data["fName"]) || empty($data["lName"]) || empty($data["email"]) || empty($data["subject"]) || empty($data["message"]))
+ {
+ $response->getBody()->write(json_encode(array("errorMessage" => "Please fill out all the fields")));
+ $response = $response->withStatus(400);
+ return $response->withHeader("Content-Type", "application/json");
+ }
+
+ if (!filter_var($data["email"], FILTER_VALIDATE_EMAIL))
+ {
+ $response->getBody()->write(json_encode(array("errorMessage" => "Email is not the correct format")));
+ $response = $response->withStatus(400);
+ return $response->withHeader("Content-Type", "application/json");
+ }
+
+ // email form filler/conatcter
+ $headers1 = "From: noreply@rohitpai.tech\r\n";
+ $headers1 .= "Reply-To: rohit@rohitpai.tech\r\n";
+ $headers1 .= "MIME-Version: 1.0\r\n";
+ $headers1 .= "Content-Type: text/html; charset=UTF-8\r\n";
+
+ $message1 = "
+
+
+ {$data['subject']}
+
+
+
+ Thank you for filling out the form on my website, I will try to respond to your query as soon as I can.
+
+ Below is what you filled in for your record
+
+
+ Firstname
+ Lastname
+ Email
+ Subject
+ message
+
+
+ {$data['fName']}
+ {$data['lName']}
+ {$data['email']}
+ {$data['subject']}
+ {$data['message']}
+
+
+
+
+ Regards, Rohit Pai rohit@rohitpai.tech
+
+
+ ";
+
+ mail($data["email"], $data["subject"], $message1, $headers1);
+
+ // email to me
+ $headers2 = "From: noreply@rohitpai.tech\r\n";
+ $headers2 .= "Reply-To: {$data['email']}\r\n";
+ $headers2 .= "MIME-Version: 1.0\r\n";
+ $headers2 .= "Content-Type: text/html; charset=UTF-8\r\n";
+
+ $message2 = "
+
+
+ {$data['subject']}
+
+
+
+ {$data['fName']} {$data['lName']} filled in the form on the website, here is what they sent.
+
+
+ Firstname
+ Lastname
+ Email
+ Subject
+ message
+
+
+ {$data['fName']}
+ {$data['lName']}
+ {$data['email']}
+ {$data['subject']}
+ {$data['message']}
+
+
+
+
+ ";
+
+ mail("rohit@rohitpai.tech", "{$data['fName']} {$data['lName']} filled in the form", $message2, $headers2);
+ return $response->withStatus(201);
+});
+
+$app->run();
\ No newline at end of file
diff --git a/src/api/timelineData.php b/src/api/timelineData.php
index e3f2068..5686f13 100644
--- a/src/api/timelineData.php
+++ b/src/api/timelineData.php
@@ -25,7 +25,7 @@ class timelineData
}
else
{
- return array(array("errorMessage" => "Error, edu data not found"));
+ return array("errorMessage" => "Error, edu data not found");
}
}
@@ -44,7 +44,7 @@ class timelineData
}
else
{
- return array(array("errorMessage" => "Error, work data not found"));
+ return array("errorMessage" => "Error, work data not found");
}
}
diff --git a/src/css/contact.css b/src/css/contact.css
new file mode 100644
index 0000000..bc4dda2
--- /dev/null
+++ b/src/css/contact.css
@@ -0,0 +1,211 @@
+section#contact {
+ display: flex;
+ flex-direction: row;
+ padding: 0 2.5em;
+}
+
+div#findMe, div#sayHello {
+ width: 50%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 1em;
+}
+
+div#findMe .findMeContainer {
+ display: flex;
+ flex-direction: row;
+ justify-content: space-around;
+ align-items: center;
+ gap: 2em;
+ width: 100%;
+ height: 100%;
+ margin: 5em 0;
+}
+
+div#findMe .findMeContainer .profile {
+ -webkit-border-radius: 50%;
+ -moz-border-radius: 50%;
+ border-radius: 50%;
+}
+
+div#findMe .socialIcons {
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+ align-items: center;
+ gap: 2em;
+}
+
+div#findMe .socialIcons div {
+ display: flex;
+ flex-direction: column;
+ gap: 1.5em;
+}
+
+div#findMe .socialIcons div svg {
+ width: 2.5em;
+ fill: var(--primaryDefault);
+ font-size: 2em;
+}
+
+div#findMe .socialIcons div a:hover svg {
+ fill: var(--primaryHover);
+}
+
+div#sayHello #contactForm{
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+}
+
+#contactForm .flName {
+ display: flex;
+ flex-direction: row;
+ gap: 1em;
+}
+
+#contactForm .formControl {
+ width: 100%;
+}
+
+#contactForm input[type="submit"] {
+ margin-top: 1em;
+ align-self: flex-start;
+}
+
+#contactForm .formControl input:not([type="submit"]), #contactForm .formControl textarea {
+ width: 100%;
+ border: 4px solid var(--primaryDefault);
+ background: none;
+ outline: none;
+ -webkit-border-radius: 1em;
+ -moz-border-radius: 1em;
+ border-radius: 0.5em;
+ padding: 0 0.5em;
+}
+
+#contactForm .formControl textarea {
+ padding: 0.5em;
+}
+
+
+#contactForm .formControl input:not([type="submit"]).invalid:invalid, #contactForm .formControl textarea.invalid:invalid {
+ border: 4px solid var(--errorDefault);
+}
+
+#contactForm .formControl input:not([type="submit"]).invalid:invalid:focus, #contactForm .formControl textarea.invalid:invalid:focus {
+ border: 4px solid var(--errorHover);
+ box-shadow: 0 4px 2px 0 var(--mutedBlack);
+}
+
+#contactForm .formControl input:not([type="submit"]):focus, #contactForm .formControl textarea:focus {
+ border: 4px solid var(--primaryHover);
+}
+
+#contactForm .formControl input:not([type="submit"]) {
+ height: 3em;
+}
+
+#contactForm .flName {
+ display: flex;
+ flex-direction: row;
+ gap: 1em;
+}
+
+#contactForm .formControl {
+ width: 100%;
+}
+
+#contactForm input[type="submit"] {
+ margin-top: 1em;
+ align-self: flex-start;
+}
+
+#contactForm .formControl input:not([type="submit"]), #contactForm .formControl textarea {
+ width: 100%;
+ border: 4px solid var(--primaryDefault);
+ background: none;
+ outline: none;
+ -webkit-border-radius: 1em;
+ -moz-border-radius: 1em;
+ border-radius: 0.5em;
+ padding: 0 0.5em;
+}
+
+#contactForm .formControl textarea {
+ padding: 0.5em;
+}
+
+
+#contactForm .formControl input:not([type="submit"]).invalid:invalid, #contactForm .formControl textarea.invalid:invalid {
+ border: 4px solid var(--errorDefault);
+}
+
+#contactForm .formControl input:not([type="submit"]).invalid:invalid:focus, #contactForm .formControl textarea.invalid:invalid:focus {
+ border: 4px solid var(--errorHover);
+ box-shadow: 0 4px 2px 0 var(--mutedBlack);
+}
+
+#contactForm .formControl input:not([type="submit"]):focus, #contactForm .formControl textarea:focus {
+ border: 4px solid var(--primaryHover);
+}
+
+#contactForm .formControl input:not([type="submit"]) {
+ height: 3em;
+}
+
+div.message {
+ background: var(--primaryDefault);
+ color: #FFFFFF;
+ padding: 0.5em 0.8em;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ align-self: flex-start;
+ flex-direction: row-reverse;
+ position: relative;
+ height: 75px;
+ visibility: visible;
+ overflow: hidden;
+ -webkit-transition: all 0.5s ease-in-out;
+ -moz-transition: all 0.5s ease-in-out;
+ -ms-transition: all 0.5s ease-in-out;
+ -o-transition: all 0.5s ease-in-out;
+ transition: all 0.5s ease-in-out;
+ opacity: 1;
+ margin-top: 1em;
+}
+
+div.message.error {
+ background: var(--errorDefault);
+}
+
+div.message button {
+ border: none;
+ background: none;
+ outline: none;
+ cursor: pointer;
+ color: #FFFFFF;
+ font-size: 1.25rem;
+ margin-top: -5px;
+ position: absolute;
+ transform: translate(0, 0);
+ transform-origin: 0 0;
+ right: 10px;
+ top: 10px;
+}
+
+div.message.hidden {
+ opacity: 0;
+ visibility: hidden;
+ height: 0;
+}
+
+div.message button:hover {
+ text-shadow: -1px 2px var(--mutedBlack);
+}
\ No newline at end of file
diff --git a/src/css/main.css b/src/css/main.css
index 3344565..6b0ac91 100644
--- a/src/css/main.css
+++ b/src/css/main.css
@@ -7,6 +7,7 @@
@import "about.css";
@import "cv.css";
@import "projects.css";
+@import "contact.css";
/****** Root Style ******/
:root {
@@ -17,7 +18,8 @@
--primaryDefault: hsla(var(--mainHue), var(--mainSat), var(--mainLight), 1);
--primaryHover: hsla(var(--mainHue), var(--mainSat), calc(var(--mainLight) - 10%), 1);
--timelineItemBrdr: hsla(var(--mainHue), var(--mainSat), calc(var(--mainLight) - 20%), 1);
- --errorDefault: hsla(0, var(--mainSat), var(--mainLight), 1);
+ --errorDefault: hsla(0, calc(var(--mainSat) + 10%),calc(var(--mainLight) + 10%), 1);
+ --errorHover: hsla(0, calc(var(--mainSat) + 10%), calc(var(--mainLight) - 10%), 1);
--grey: hsla(0, 0%, 39%, 1);
--notAvailableDefault: hsla(0, 0%, 39%, 1);
--notAvailableHover: hsla(0, 0%,32%, 1);
@@ -307,7 +309,31 @@
text-align: center;
}
-
+
+ section#contact {
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ }
+
+ div#findMe, div#sayHello {
+ width: 100%;
+
+ }
+
+
+ div#findMe .findMeContainer {
+ flex-direction: column;
+ justify-content: center;
+ }
+
+ div#findMe .socialIcons {
+ flex-direction: row;
+ }
+
+ div#findMe .socialIcons div {
+ flex-direction: row;
+ }
}
@media screen and (max-width: 55em) {
@@ -335,6 +361,15 @@
border:none
}
+ div#findMe .socialIcons {
+ flex-direction: column;
+ }
+
+ #contactForm .flName {
+ flex-direction: column;
+ gap: 0;
+ width: 100%;
+ }
}
@media screen and (max-width: 31em) {
@@ -369,5 +404,5 @@
justify-content: center;
align-items: center;
}
-
+
}
diff --git a/src/css/templateStyles.css b/src/css/templateStyles.css
index dfd4e71..67de1b8 100644
--- a/src/css/templateStyles.css
+++ b/src/css/templateStyles.css
@@ -43,7 +43,7 @@ a.btn, form input[type="submit"] {
text-align: center;
}
-a.btn:hover {
+a.btn:hover, form input[type="submit"]:hover {
border: 0.3215em solid var(--primaryHover);
}
diff --git a/src/imgs/blog.svg b/src/imgs/blog.svg
deleted file mode 100644
index e644970..0000000
--- a/src/imgs/blog.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/imgs/email.svg b/src/imgs/email.svg
deleted file mode 100644
index a2c425a..0000000
--- a/src/imgs/email.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/imgs/github.svg b/src/imgs/github.svg
deleted file mode 100644
index 4784f7b..0000000
--- a/src/imgs/github.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/imgs/instagram.svg b/src/imgs/instagram.svg
deleted file mode 100644
index a4b9ff2..0000000
--- a/src/imgs/instagram.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/imgs/linkedin.svg b/src/imgs/linkedin.svg
deleted file mode 100644
index 0fcc887..0000000
--- a/src/imgs/linkedin.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/imgs/phone.svg b/src/imgs/phone.svg
deleted file mode 100644
index dba3946..0000000
--- a/src/imgs/phone.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/imgs/profile.jpg b/src/imgs/profile.jpg
new file mode 100644
index 0000000..8bc20a4
Binary files /dev/null and b/src/imgs/profile.jpg differ
diff --git a/src/index.html b/src/index.html
index b59bafa..4b324f7 100644
--- a/src/index.html
+++ b/src/index.html
@@ -8,7 +8,6 @@
Rohit Pai - Portfolio
-
@@ -89,51 +88,76 @@