Added capcha, functionality for senidng emails, and refactored code for the images to go to LiveCode/url and Github code if unavailable

This commit is contained in:
its-michaelroy
2024-07-25 17:33:45 -03:00
parent 2942ced2db
commit b27dc4978f
6 changed files with 3156 additions and 3233 deletions

3
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,3 @@
{
"liveServer.settings.port": 5501
}

File diff suppressed because it is too large Load Diff

42
assets/js/formHandler.js Normal file
View File

@@ -0,0 +1,42 @@
let hcaptchaVerified = false;
// Callback function for hCaptcha
function onVerify() {
hcaptchaVerified = true;
}
// Prevent form submission if hCaptcha is not verified
document.getElementById("contactForm").addEventListener("submit", function (e) {
e.preventDefault(); // Prevent the default form submission
if (hcaptchaVerified) {
const email = document.getElementById("email").value;
document.getElementById("subject").value = `New submission from ${email}`;
// Use fetch to submit the form data
fetch(this.action, {
method: "POST",
body: new FormData(this),
})
.then((response) => {
if (response.ok) {
clearFormFields(); // Clear fields on successful submission
alert("Your message has been sent!");
} else {
alert("There was a problem with your submission.");
}
})
.catch((error) => {
console.error("Error:", error);
alert("There was a problem with your submission.");
});
} else {
alert("Please complete the hCaptcha challenge."); // Alert if hCaptcha is not verified
}
});
// Function to clear form fields
function clearFormFields() {
document.getElementById("name").value = "Name";
document.getElementById("email").value = "Email";
document.getElementById("message").value = "Message";
}

View File

@@ -87,22 +87,22 @@
// Main Sections: Two. // Main Sections: Two.
// Lightbox gallery. // // Lightbox gallery.
$window.on("load", function () { // $window.on("load", function () {
$("#two").poptrox({ // $("#two").poptrox({
caption: function ($a) { // caption: function ($a) {
return $a.next("h3").text(); // return $a.next("h3").text();
}, // },
overlayColor: "#2c2c2c", // overlayColor: "#2c2c2c",
overlayOpacity: 0.85, // overlayOpacity: 0.85,
popupCloserText: "", // popupCloserText: "",
popupLoaderText: "", // popupLoaderText: "",
selector: ".work-item a.image", // selector: ".work-item a.image",
usePopupCaption: true, // usePopupCaption: true,
usePopupDefaultStyling: false, // usePopupDefaultStyling: false,
usePopupEasyClose: false, // usePopupEasyClose: false,
usePopupNav: true, // usePopupNav: true,
windowMargin: breakpoints.active("<=small") ? 0 : 50, // windowMargin: breakpoints.active("<=small") ? 0 : 50,
}); // });
}); // });
})(jQuery); })(jQuery);

Binary file not shown.

View File

@@ -84,7 +84,10 @@
<h2>Recent Work</h2> <h2>Recent Work</h2>
<div class="row"> <div class="row">
<article class="col-6 col-12-xsmall work-item"> <article class="col-6 col-12-xsmall work-item">
<a href="images/fulls/01.jpg" class="image fit thumb" <a
href="https://deep-impact.onrender.com"
class="image fit thumb"
target="_blank"
><img src="images/DeepImpact.jpeg" alt="Michael Roy" ><img src="images/DeepImpact.jpeg" alt="Michael Roy"
/></a> /></a>
<h3>Deep Impact (2024 Hackathon Winner!)</h3> <h3>Deep Impact (2024 Hackathon Winner!)</h3>
@@ -96,7 +99,10 @@
</p> </p>
</article> </article>
<article class="col-6 col-12-xsmall work-item"> <article class="col-6 col-12-xsmall work-item">
<a href="images/fulls/02.jpg" class="image fit thumb" <a
href="https://github.com/L-Carr/Platoon-Console"
class="image fit thumb"
target="_blank"
><img src="images/platoon-console-v3.svg" alt="Michael Roy" ><img src="images/platoon-console-v3.svg" alt="Michael Roy"
/></a> /></a>
<h3>Platoon Console</h3> <h3>Platoon Console</h3>
@@ -108,7 +114,10 @@
</p> </p>
</article> </article>
<article class="col-6 col-12-xsmall work-item"> <article class="col-6 col-12-xsmall work-item">
<a href="images/fulls/03.jpg" class="image fit thumb" <a
href="https://github.com/vivekmishra9631/PayBridge"
class="image fit thumb"
target="_blank"
><img src="images/paybridge_logo.jpg" alt="Michael Roy" ><img src="images/paybridge_logo.jpg" alt="Michael Roy"
/></a> /></a>
<h3>PayBridge</h3> <h3>PayBridge</h3>
@@ -123,7 +132,10 @@
</p> </p>
</article> </article>
<article class="col-6 col-12-xsmall work-item"> <article class="col-6 col-12-xsmall work-item">
<a href="images/fulls/04.jpg" class="image fit thumb" <a
href="https://github.com/its-michaelroy/ValidationStation"
class="image fit thumb"
target="_blank"
><img src="images/validation.png" alt="Michael Roy" ><img src="images/validation.png" alt="Michael Roy"
/></a> /></a>
<h3>Validation Station</h3> <h3>Validation Station</h3>
@@ -141,7 +153,10 @@
</p> </p>
</article> </article>
<article class="col-6 col-12-xsmall work-item"> <article class="col-6 col-12-xsmall work-item">
<a href="images/fulls/05.jpg" class="image fit thumb" <a
href="https://mrcodewizard.com"
class="image fit thumb"
target="_blank"
><img src="images/website.png" alt="Michael Roy" ><img src="images/website.png" alt="Michael Roy"
/></a> /></a>
<h3>Minimal Portfolio</h3> <h3>Minimal Portfolio</h3>
@@ -151,7 +166,10 @@
</p> </p>
</article> </article>
<article class="col-6 col-12-xsmall work-item"> <article class="col-6 col-12-xsmall work-item">
<a href="images/fulls/06.jpg" class="image fit thumb" <a
href="https://mrcodewizard.com/p1/ShufflePuck"
class="image fit thumb"
target="_blank"
><img src="images/Shufflepuck.png" alt="Michael Roy" ><img src="images/Shufflepuck.png" alt="Michael Roy"
/></a> /></a>
<h3>Shuffle Puck</h3> <h3>Shuffle Puck</h3>
@@ -162,7 +180,10 @@
</p> </p>
</article> </article>
<article class="col-6 col-12-xsmall work-item"> <article class="col-6 col-12-xsmall work-item">
<a href="images/fulls/06.jpg" class="image fit thumb" <a
href="https://github.com/its-michaelroy/npx_business_card#readme"
class="image fit thumb"
target="_blank"
><img src="images/npx_Business_card_square.png" alt="Michael Roy" ><img src="images/npx_Business_card_square.png" alt="Michael Roy"
/></a> /></a>
<h3>NPM Digital Business Card</h3> <h3>NPM Digital Business Card</h3>
@@ -192,10 +213,20 @@
</p> </p>
<div class="row"> <div class="row">
<div class="col-8 col-12-small"> <div class="col-8 col-12-small">
<form method="post" action="#"> <form
<div class="row gtr-uniform gtr-50"> method="POST"
action="https://formspree.io/f/xldrgkro"
class="row gtr-uniform gtr-50"
>
<input type="hidden" name="subject" id="subject" />
<div class="col-6 col-12-xsmall"> <div class="col-6 col-12-xsmall">
<input type="text" name="name" id="name" placeholder="Name" /> <input
type="text"
name="name"
id="name"
placeholder="Name"
required
/>
</div> </div>
<div class="col-6 col-12-xsmall"> <div class="col-6 col-12-xsmall">
<input <input
@@ -203,6 +234,7 @@
name="email" name="email"
id="email" id="email"
placeholder="Email" placeholder="Email"
required
/> />
</div> </div>
<div class="col-12"> <div class="col-12">
@@ -211,334 +243,28 @@
id="message" id="message"
placeholder="Message" placeholder="Message"
rows="4" rows="4"
required
></textarea> ></textarea>
</div> </div>
<div class="col-12">
<div
class="h-captcha"
data-sitekey="a3a0feb2-f424-4848-8838-a640bea6ae62"
data-callback="onVerify"
></div>
</div>
<div class="col-12">
<ul class="actions">
<li>
<input type="submit" value="Send Message" />
</li>
</ul>
</div> </div>
</form> </form>
<ul class="actions">
<li><input type="submit" value="Send Message" /></li>
</ul>
</div> </div>
</div> </div>
</section> </section>
<!-- Four -->
<!--
<section id="four">
<h2>Elements</h2>
<section>
<h4>Text</h4>
<p>This is <b>bold</b> and this is <strong>strong</strong>. This is <i>italic</i> and this is <em>emphasized</em>.
This is <sup>superscript</sup> text and this is <sub>subscript</sub> text.
This is <u>underlined</u> and this is code: <code>for (;;) { ... }</code>. Finally, <a href="#">this is a link</a>.</p>
<hr />
<header>
<h4>Heading with a Subtitle</h4>
<p>Lorem ipsum dolor sit amet nullam id egestas urna aliquam</p>
</header>
<p>Nunc lacinia ante nunc ac lobortis. Interdum adipiscing gravida odio porttitor sem non mi integer non faucibus ornare mi ut ante amet placerat aliquet. Volutpat eu sed ante lacinia sapien lorem accumsan varius montes viverra nibh in adipiscing blandit tempus accumsan.</p>
<header>
<h5>Heading with a Subtitle</h5>
<p>Lorem ipsum dolor sit amet nullam id egestas urna aliquam</p>
</header>
<p>Nunc lacinia ante nunc ac lobortis. Interdum adipiscing gravida odio porttitor sem non mi integer non faucibus ornare mi ut ante amet placerat aliquet. Volutpat eu sed ante lacinia sapien lorem accumsan varius montes viverra nibh in adipiscing blandit tempus accumsan.</p>
<hr />
<h2>Heading Level 2</h2>
<h3>Heading Level 3</h3>
<h4>Heading Level 4</h4>
<h5>Heading Level 5</h5>
<h6>Heading Level 6</h6>
<hr />
<h5>Blockquote</h5>
<blockquote>Fringilla nisl. Donec accumsan interdum nisi, quis tincidunt felis sagittis eget tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan faucibus. Vestibulum ante ipsum primis in faucibus lorem ipsum dolor sit amet nullam adipiscing eu felis.</blockquote>
<h5>Preformatted</h5>
<pre><code>i = 0;
while (!deck.isInOrder()) {
print 'Iteration ' + i;
deck.shuffle();
i++;
}
print 'It took ' + i + ' iterations to sort the deck.';</code></pre>
</section>
<section>
<h4>Lists</h4>
<div class="row">
<div class="col-6 col-12-xsmall">
<h5>Unordered</h5>
<ul>
<li>Dolor pulvinar etiam magna etiam.</li>
<li>Sagittis adipiscing lorem eleifend.</li>
<li>Felis enim feugiat dolore viverra.</li>
</ul>
<h5>Alternate</h5>
<ul class="alt">
<li>Dolor pulvinar etiam magna etiam.</li>
<li>Sagittis adipiscing lorem eleifend.</li>
<li>Felis enim feugiat dolore viverra.</li>
</ul>
</div> </div>
<div class="col-6 col-12-xsmall">
<h5>Ordered</h5>
<ol>
<li>Dolor pulvinar etiam magna etiam.</li>
<li>Etiam vel felis at lorem sed viverra.</li>
<li>Felis enim feugiat dolore viverra.</li>
<li>Dolor pulvinar etiam magna etiam.</li>
<li>Etiam vel felis at lorem sed viverra.</li>
<li>Felis enim feugiat dolore viverra.</li>
</ol>
<h5>Icons</h5>
<ul class="icons">
<li><a href="#" class="icon brands fa-twitter"><span class="label">Twitter</span></a></li>
<li><a href="#" class="icon brands fa-facebook-f"><span class="label">Facebook</span></a></li>
<li><a href="#" class="icon brands fa-instagram"><span class="label">Instagram</span></a></li>
<li><a href="#" class="icon brands fa-github"><span class="label">Github</span></a></li>
<li><a href="#" class="icon brands fa-dribbble"><span class="label">Dribbble</span></a></li>
<li><a href="#" class="icon brands fa-tumblr"><span class="label">Tumblr</span></a></li>
</ul>
</div>
</div>
<h5>Actions</h5>
<ul class="actions">
<li><a href="#" class="button primary">Default</a></li>
<li><a href="#" class="button">Default</a></li>
</ul>
<ul class="actions small">
<li><a href="#" class="button primary small">Small</a></li>
<li><a href="#" class="button small">Small</a></li>
</ul>
<div class="row">
<div class="col-6 col-12-small">
<ul class="actions stacked">
<li><a href="#" class="button primary">Default</a></li>
<li><a href="#" class="button">Default</a></li>
</ul>
</div>
<div class="col-6 col-12-small">
<ul class="actions stacked">
<li><a href="#" class="button primary small">Small</a></li>
<li><a href="#" class="button small">Small</a></li>
</ul>
</div>
<div class="col-6 col-12-small">
<ul class="actions stacked">
<li><a href="#" class="button primary fit">Default</a></li>
<li><a href="#" class="button fit">Default</a></li>
</ul>
</div>
<div class="col-6 col-12-small">
<ul class="actions stacked">
<li><a href="#" class="button primary small fit">Small</a></li>
<li><a href="#" class="button small fit">Small</a></li>
</ul>
</div>
</div>
</section>
<section>
<h4>Table</h4>
<h5>Default</h5>
<div class="table-wrapper">
<table>
<thead>
<tr>
<th>Name</th>
<th>Description</th>
<th>Price</th>
</tr>
</thead>
<tbody>
<tr>
<td>Item One</td>
<td>Ante turpis integer aliquet porttitor.</td>
<td>29.99</td>
</tr>
<tr>
<td>Item Two</td>
<td>Vis ac commodo adipiscing arcu aliquet.</td>
<td>19.99</td>
</tr>
<tr>
<td>Item Three</td>
<td> Morbi faucibus arcu accumsan lorem.</td>
<td>29.99</td>
</tr>
<tr>
<td>Item Four</td>
<td>Vitae integer tempus condimentum.</td>
<td>19.99</td>
</tr>
<tr>
<td>Item Five</td>
<td>Ante turpis integer aliquet porttitor.</td>
<td>29.99</td>
</tr>
</tbody>
<tfoot>
<tr>
<td colspan="2"></td>
<td>100.00</td>
</tr>
</tfoot>
</table>
</div>
<h5>Alternate</h5>
<div class="table-wrapper">
<table class="alt">
<thead>
<tr>
<th>Name</th>
<th>Description</th>
<th>Price</th>
</tr>
</thead>
<tbody>
<tr>
<td>Item One</td>
<td>Ante turpis integer aliquet porttitor.</td>
<td>29.99</td>
</tr>
<tr>
<td>Item Two</td>
<td>Vis ac commodo adipiscing arcu aliquet.</td>
<td>19.99</td>
</tr>
<tr>
<td>Item Three</td>
<td> Morbi faucibus arcu accumsan lorem.</td>
<td>29.99</td>
</tr>
<tr>
<td>Item Four</td>
<td>Vitae integer tempus condimentum.</td>
<td>19.99</td>
</tr>
<tr>
<td>Item Five</td>
<td>Ante turpis integer aliquet porttitor.</td>
<td>29.99</td>
</tr>
</tbody>
<tfoot>
<tr>
<td colspan="2"></td>
<td>100.00</td>
</tr>
</tfoot>
</table>
</div>
</section>
<section>
<h4>Buttons</h4>
<ul class="actions">
<li><a href="#" class="button primary">Primary</a></li>
<li><a href="#" class="button">Default</a></li>
</ul>
<ul class="actions">
<li><a href="#" class="button large">Large</a></li>
<li><a href="#" class="button">Default</a></li>
<li><a href="#" class="button small">Small</a></li>
</ul>
<ul class="actions fit">
<li><a href="#" class="button primary fit">Fit</a></li>
<li><a href="#" class="button fit">Fit</a></li>
</ul>
<ul class="actions fit small">
<li><a href="#" class="button primary fit small">Fit + Small</a></li>
<li><a href="#" class="button fit small">Fit + Small</a></li>
</ul>
<ul class="actions">
<li><a href="#" class="button primary icon solid fa-download">Icon</a></li>
<li><a href="#" class="button icon solid fa-download">Icon</a></li>
</ul>
<ul class="actions">
<li><span class="button primary disabled">Primary</span></li>
<li><span class="button disabled">Default</span></li>
</ul>
</section>
<section>
<h4>Form</h4>
<form method="post" action="#">
<div class="row gtr-uniform gtr-50">
<div class="col-6 col-12-xsmall">
<input type="text" name="demo-name" id="demo-name" value="" placeholder="Name" />
</div>
<div class="col-6 col-12-xsmall">
<input type="email" name="demo-email" id="demo-email" value="" placeholder="Email" />
</div>
<div class="col-12">
<select name="demo-category" id="demo-category">
<option value="">- Category -</option>
<option value="1">Manufacturing</option>
<option value="1">Shipping</option>
<option value="1">Administration</option>
<option value="1">Human Resources</option>
</select>
</div>
<div class="col-4 col-12-small">
<input type="radio" id="demo-priority-low" name="demo-priority" checked>
<label for="demo-priority-low">Low Priority</label>
</div>
<div class="col-4 col-12-small">
<input type="radio" id="demo-priority-normal" name="demo-priority">
<label for="demo-priority-normal">Normal Priority</label>
</div>
<div class="col-4 col-12-small">
<input type="radio" id="demo-priority-high" name="demo-priority">
<label for="demo-priority-high">High Priority</label>
</div>
<div class="col-6 col-12-small">
<input type="checkbox" id="demo-copy" name="demo-copy">
<label for="demo-copy">Email me a copy of this message</label>
</div>
<div class="col-6 col-12-small">
<input type="checkbox" id="demo-human" name="demo-human" checked>
<label for="demo-human">I am a human and not a robot</label>
</div>
<div class="col-12">
<textarea name="demo-message" id="demo-message" placeholder="Enter your message" rows="6"></textarea>
</div>
<div class="col-12">
<ul class="actions">
<li><input type="submit" value="Send Message" class="primary" /></li>
<li><input type="reset" value="Reset" /></li>
</ul>
</div>
</div>
</form>
</section>
<section>
<h4>Image</h4>
<h5>Fit</h5>
<div class="box alt">
<div class="row gtr-50 gtr-uniform">
<div class="col-12"><span class="image fit"><img src="images/fulls/05.jpg" alt="" /></span></div>
<div class="col-4"><span class="image fit"><img src="images/thumbs/01.jpg" alt="" /></span></div>
<div class="col-4"><span class="image fit"><img src="images/thumbs/02.jpg" alt="" /></span></div>
<div class="col-4"><span class="image fit"><img src="images/thumbs/03.jpg" alt="" /></span></div>
<div class="col-4"><span class="image fit"><img src="images/thumbs/04.jpg" alt="" /></span></div>
<div class="col-4"><span class="image fit"><img src="images/thumbs/05.jpg" alt="" /></span></div>
<div class="col-4"><span class="image fit"><img src="images/thumbs/06.jpg" alt="" /></span></div>
<div class="col-4"><span class="image fit"><img src="images/thumbs/03.jpg" alt="" /></span></div>
<div class="col-4"><span class="image fit"><img src="images/thumbs/02.jpg" alt="" /></span></div>
<div class="col-4"><span class="image fit"><img src="images/thumbs/01.jpg" alt="" /></span></div>
</div>
</div>
<h5>Left &amp; Right</h5>
<p><span class="image left"><img src="images/avatar.jpg" alt="" /></span>Fringilla nisl. Donec accumsan interdum nisi, quis tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent. Donec accumsan interdum nisi, quis tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent.</p>
<p><span class="image right"><img src="images/avatar.jpg" alt="" /></span>Fringilla nisl. Donec accumsan interdum nisi, quis tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent. Donec accumsan interdum nisi, quis tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent.</p>
</section>
</section>
--></div>
<!-- Footer --> <!-- Footer -->
<footer id="footer"> <footer id="footer">
@@ -571,6 +297,15 @@ print 'It took ' + i + ' iterations to sort the deck.';</code></pre>
><span class="label">Portfolio</span></a ><span class="label">Portfolio</span></a
> >
</li> </li>
<li>
<a
href="documents/Michael_Roy_Dev_Resume_v10.pdf"
class="icon solid fa-file-pdf"
download="Michael_Roy_Dev_Resume.pdf"
title="Resume"
><span class="label">Resume</span></a
>
</li>
<li> <li>
<a <a
href="mailto:michael.roy@mrcodewizard.com" href="mailto:michael.roy@mrcodewizard.com"
@@ -597,6 +332,7 @@ print 'It took ' + i + ' iterations to sort the deck.';</code></pre>
</footer> </footer>
<!-- Scripts --> <!-- Scripts -->
<script src="https://js.hcaptcha.com/1/api.js" async defer></script>
<script src="assets/js/jquery.min.js"></script> <script src="assets/js/jquery.min.js"></script>
<script src="assets/js/jquery.poptrox.min.js"></script> <script src="assets/js/jquery.poptrox.min.js"></script>
<script src="assets/js/browser.min.js"></script> <script src="assets/js/browser.min.js"></script>
@@ -604,5 +340,22 @@ print 'It took ' + i + ' iterations to sort the deck.';</code></pre>
<script src="assets/js/util.js"></script> <script src="assets/js/util.js"></script>
<script src="assets/js/main.js"></script> <script src="assets/js/main.js"></script>
<script src="assets/js/year.js"></script> <script src="assets/js/year.js"></script>
<script src="assets/js/formHandler.js" defer></script>
<script>
window.va =
window.va ||
function () {
(window.vaq = window.vaq || []).push(arguments);
};
</script>
<script defer src="/_vercel/insights/script.js"></script>
<script>
window.si =
window.si ||
function () {
(window.siq = window.siq || []).push(arguments);
};
</script>
<script defer src="/_vercel/speed-insights/script.js"></script>
</body> </body>
</html> </html>