Add Portfolio project
@@ -0,0 +1,5 @@
|
||||
apply plugin: 'java'
|
||||
java {
|
||||
sourceCompatibility = JavaVersion.VERSION_21
|
||||
targetCompatibility = JavaVersion.VERSION_21
|
||||
}
|
||||
1
Portfolio/build.gradle
Normal file
@@ -0,0 +1 @@
|
||||
apply plugin: 'base'
|
||||
BIN
Portfolio/html_finalprojimages/CSS3.png
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
Portfolio/html_finalprojimages/bullet.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
12
Portfolio/html_finalprojimages/checkmark--outline.svg
Normal file
@@ -0,0 +1,12 @@
|
||||
<svg id="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
|
||||
<defs>
|
||||
<style>
|
||||
.cls-1 {
|
||||
fill: none;
|
||||
}
|
||||
</style>
|
||||
</defs>
|
||||
<polygon points="14 21.414 9 16.413 10.413 15 14 18.586 21.585 11 23 12.415 14 21.414"/>
|
||||
<path d="M16,2A14,14,0,1,0,30,16,14,14,0,0,0,16,2Zm0,26A12,12,0,1,1,28,16,12,12,0,0,1,16,28Z"/>
|
||||
<rect id="_Transparent_Rectangle_" data-name="<Transparent Rectangle>" class="cls-1" width="32" height="32"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 495 B |
BIN
Portfolio/html_finalprojimages/envelope.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
Portfolio/html_finalprojimages/flash.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
Portfolio/html_finalprojimages/home.png
Normal file
|
After Width: | Height: | Size: 3.9 KiB |
BIN
Portfolio/html_finalprojimages/html5.png
Normal file
|
After Width: | Height: | Size: 38 KiB |
BIN
Portfolio/html_finalprojimages/java.png
Normal file
|
After Width: | Height: | Size: 116 KiB |
BIN
Portfolio/html_finalprojimages/js.jpeg
Normal file
|
After Width: | Height: | Size: 5.2 KiB |
BIN
Portfolio/html_finalprojimages/node.png
Normal file
|
After Width: | Height: | Size: 3.6 KiB |
BIN
Portfolio/html_finalprojimages/phone.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
Portfolio/html_finalprojimages/profile.webp
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
Portfolio/html_finalprojimages/react.png
Normal file
|
After Width: | Height: | Size: 90 KiB |
BIN
Portfolio/html_finalprojimages/waving-hand.png
Normal file
|
After Width: | Height: | Size: 310 KiB |
186
Portfolio/index.html
Normal file
@@ -0,0 +1,186 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>John Ahlroos - Portfolio</title>
|
||||
<link rel="stylesheet" href="./style.css"/>
|
||||
<script src="./script.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<!-- Navigation Bar -->
|
||||
<nav>
|
||||
<div id="home">
|
||||
<div class="profile_name">
|
||||
<span>John Ahlroos</span>
|
||||
<div class="contact_info">
|
||||
<img src="html_finalprojimages/envelope.png" alt="https://icons8.com/icon/124377/circled-envelope"/>
|
||||
john@nomail.com
|
||||
</div>
|
||||
<div style="clear:both;"></div>
|
||||
<div class="contact_info">
|
||||
<img src="html_finalprojimages/phone.png" alt="https://icons8.com/icon/124377/circled-envelope"/>
|
||||
+13456764598
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="topdiv">
|
||||
<a class="topmenu topmenu:hover" href="#about-me">About Me</a>
|
||||
<a class="topmenu topmenu:hover" href="#skills">Skills</a>
|
||||
<a class="topmenu topmenu:hover" href="#projects">Projects</a>
|
||||
<a class="topmenu topmenu:hover" href="#recommendations">Recommendations</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<!-- About Me -->
|
||||
<section id="about-me" class="container">
|
||||
<div>
|
||||
<img src="html_finalprojimages/profile.webp" class="profile_image"/>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<h1>
|
||||
Hi, I'm John Ahlroos! <img src="html_finalprojimages/waving-hand.png" width="60px"/>
|
||||
</h1>
|
||||
<p>
|
||||
I am a full stack developer with 20 years of experience in both Back-End and Web development.
|
||||
I haver worked on numerous different software stacks ranging from the most basic websites to large
|
||||
cloud deployments with 100+ microservices.
|
||||
My favourite development stack is Java Spring Boot combined with HTMX as the front-end.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Skills -->
|
||||
<section id="skills">
|
||||
<h2>Skills</h2>
|
||||
<div style="clear:both;"></div>
|
||||
|
||||
<div class="all_skills">
|
||||
<div class="skill">
|
||||
<img src="html_finalprojimages/html5.png"/>
|
||||
<h6>HTML</h6>
|
||||
<p>15 years experience</p>
|
||||
</div>
|
||||
|
||||
<div class="skill">
|
||||
<img src="html_finalprojimages/js.jpeg"/>
|
||||
<h6>JavaScript</h6>
|
||||
<p>15 years experience</p>
|
||||
</div>
|
||||
|
||||
<div class="skill">
|
||||
<img src="html_finalprojimages/java.png"/>
|
||||
<h6>Java</h6>
|
||||
<p>15 years experience</p>
|
||||
</div>
|
||||
|
||||
<div class="skill">
|
||||
<img src="html_finalprojimages/react.png"/>
|
||||
<h6>React</h6>
|
||||
<p>2 years experience</p>
|
||||
</div>
|
||||
|
||||
<div class="skill">
|
||||
<img src="html_finalprojimages/node.png"/>
|
||||
<h6>Node</h6>
|
||||
<p>1 years experience</p>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Projects -->
|
||||
<section class="projects" id="projects">
|
||||
<h2>
|
||||
Projects
|
||||
</h2>
|
||||
<div style="clear:both;"></div>
|
||||
|
||||
<div id="projects-container" class="projects-container">
|
||||
<div class="project-card">
|
||||
<h3>Software development blog</h3>
|
||||
<ul>
|
||||
<li>A blog providing the latest news in web development</li>
|
||||
</ul>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="project-card">
|
||||
<h3>Step Counter</h3>
|
||||
<ul>
|
||||
<li>A step counter which measures steps taken on the Moon. Only works in Zero-gravity.</li>
|
||||
</ul>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="project-card">
|
||||
<h3>Family secret recipes book</h3>
|
||||
<ul>
|
||||
<li>The secret recipes only known to my family - until now!</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<div style="clear:both;"></div>
|
||||
|
||||
<!-- Recommendations -->
|
||||
<section id="recommendations">
|
||||
<h2>Recommendations</h2>
|
||||
<div style="clear:both;"></div>
|
||||
<div class="all_recommendations" id="all_recommendations">
|
||||
<div class="recommendation">
|
||||
<span>“</span>
|
||||
I've been fortunate to get to know John well over the past
|
||||
5 years, both personally and professionally. It's obvious to me that he has the key attributes necessary
|
||||
to land a dream project. He could be a change-maker just
|
||||
through her insurmountable spirit alone but the fact that he has the intelligence to match makes him a
|
||||
formidable force and one to watch for the future.
|
||||
<span>”</span>
|
||||
</div>
|
||||
<div class="recommendation">
|
||||
<span>“</span>
|
||||
I cannot recommend John more highly - he's an extremely capable and talented Web Developer,
|
||||
not to mention an A+ human. From the moment he joined BigTech over 5 years ago, John stood out
|
||||
for his work ethic, attitude, and intelligence. He was a stand-out IC and then a talented and respected leader,
|
||||
and any company would be lucky to have him. I'd work with him again in a heartbeat.
|
||||
<span>”</span>
|
||||
</div>
|
||||
<div class="recommendation">
|
||||
<span>“</span>
|
||||
John was an invaluable asset to the team and one of the highest performing consultants I worked with
|
||||
during my tenure at Resume Worded. He independently managed multiple work streams where he demonstrated
|
||||
strong project management skills, deep research and analytical capabilities and scenario-driven strategic
|
||||
thinking. I know he will go on to lead and achieve great things in his career.
|
||||
<span>”</span>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Recommendation Form -->
|
||||
<section id="contact">
|
||||
<div class="flex_center">
|
||||
<fieldset>
|
||||
<legend class="introduction">Leave a Recommendation</legend>
|
||||
<input type="text" placeholder="Name (Optional)"> <br/>
|
||||
<textarea id="new_recommendation" cols="500" rows="10" placeholder="Message"></textarea>
|
||||
<div class="flex_center">
|
||||
<button id="recommend_btn" onclick="addRecommendation()">Submit</button>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div class="iconbutton">
|
||||
<a href="#home">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="white" width="63px">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M15 11.25l-3-3m0 0l-3 3m3-3v7.5M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="popup" id="popup" class="flex_center">
|
||||
<img src="html_finalprojimages/checkmark--outline.svg"/>
|
||||
<h3>Thanks for leaving a recommendation bro!</h3>
|
||||
<button onclick="showPopup(false)">Ok</button>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
BIN
Portfolio/screenshots/aboutme.png
Normal file
|
After Width: | Height: | Size: 134 KiB |
BIN
Portfolio/screenshots/home_icon.png
Normal file
|
After Width: | Height: | Size: 3.9 KiB |
BIN
Portfolio/screenshots/nav_bar.png
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
Portfolio/screenshots/new_recommendation.png
Normal file
|
After Width: | Height: | Size: 112 KiB |
BIN
Portfolio/screenshots/popup.png
Normal file
|
After Width: | Height: | Size: 90 KiB |
BIN
Portfolio/screenshots/profile_name.png
Normal file
|
After Width: | Height: | Size: 33 KiB |
BIN
Portfolio/screenshots/projects.png
Normal file
|
After Width: | Height: | Size: 37 KiB |
BIN
Portfolio/screenshots/recommendations.png
Normal file
|
After Width: | Height: | Size: 109 KiB |
BIN
Portfolio/screenshots/skills.png
Normal file
|
After Width: | Height: | Size: 38 KiB |
28
Portfolio/script.js
Normal file
@@ -0,0 +1,28 @@
|
||||
function addRecommendation() {
|
||||
// Get the message of the new recommendation
|
||||
let recommendation = document.getElementById("new_recommendation");
|
||||
// If the user has left a recommendation, display a pop-up
|
||||
if (recommendation.value != null && recommendation.value.trim() != "") {
|
||||
console.log("New recommendation added");
|
||||
//Call showPopup here
|
||||
showPopup(true);
|
||||
|
||||
// Create a new 'recommendation' element and set it's value to the user's message
|
||||
var element = document.createElement("div");
|
||||
element.setAttribute("class","recommendation");
|
||||
element.innerHTML = "\<span\>“\</span\>" + recommendation.value + "\<span\>”\</span\>";
|
||||
// Add this element to the end of the list of recommendations
|
||||
document.getElementById("all_recommendations").appendChild(element);
|
||||
|
||||
// Reset the value of the textarea
|
||||
recommendation.value = "";
|
||||
}
|
||||
}
|
||||
|
||||
function showPopup(bool) {
|
||||
if (bool) {
|
||||
document.getElementById('popup').style.visibility = 'visible'
|
||||
} else {
|
||||
document.getElementById('popup').style.visibility = 'hidden'
|
||||
}
|
||||
}
|
||||
326
Portfolio/style.css
Normal file
@@ -0,0 +1,326 @@
|
||||
body {
|
||||
font-family: 'Trebuchet MS', 'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Arial, sans-serif;
|
||||
}
|
||||
|
||||
/* Navigation Bar */
|
||||
|
||||
#home {
|
||||
background-color: #7600bc;
|
||||
padding-bottom: 1cm;
|
||||
margin-left:-1cm;
|
||||
margin-right:-1cm;
|
||||
margin-top:-1cm;
|
||||
padding-top: 2cm;
|
||||
padding-bottom: 2cm;
|
||||
height: 5mm;
|
||||
}
|
||||
|
||||
.topmenu {
|
||||
color: lightgray;
|
||||
margin: 10px;
|
||||
padding: 20px;
|
||||
font-size: 20px;
|
||||
text-decoration:none;
|
||||
}
|
||||
|
||||
.topmenu:hover {
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.topdiv {
|
||||
float: right;
|
||||
padding-right: 1cm;
|
||||
}
|
||||
|
||||
.profile_name {
|
||||
float: left;
|
||||
padding-left: 3cm;
|
||||
margin-top: -20px;
|
||||
font-size: 2em;
|
||||
color: #eee;
|
||||
font-family: 'sans-serif';
|
||||
}
|
||||
|
||||
.profile_name .contact_info {
|
||||
font-size: 15px;
|
||||
font-style: italic;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.contact_info img {
|
||||
width:25px;
|
||||
margin-right: 10px;
|
||||
float:left;
|
||||
}
|
||||
|
||||
/* Titles */
|
||||
|
||||
h2 {
|
||||
text-align: justify;
|
||||
font-size: 50px;
|
||||
text-align: center;
|
||||
float: left;
|
||||
color: #7600bc;
|
||||
margin: 30px;
|
||||
margin-left: 60px;
|
||||
margin-top: 40px;
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
.introduction {
|
||||
text-align: justify;
|
||||
font-size: 30px;
|
||||
text-align: center;
|
||||
float: left;
|
||||
margin-top: 30px;
|
||||
margin-bottom: 20px;
|
||||
animation-duration: 5s;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
/* Used in the About Me sections */
|
||||
|
||||
.container {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
/* About Me */
|
||||
|
||||
.about-me {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
#about-me h1 {
|
||||
font-size: 65px;
|
||||
margin-top: 90px;
|
||||
color: #7600bc;
|
||||
}
|
||||
|
||||
#about-me p {
|
||||
font-size: 25px;
|
||||
color: rgb(128, 128, 128);
|
||||
margin-top: -1cm;
|
||||
}
|
||||
|
||||
.profile_image {
|
||||
width: 550px;
|
||||
height: fit-content;
|
||||
vertical-align: middle;
|
||||
margin: 5px;
|
||||
}
|
||||
|
||||
/* Skills */
|
||||
|
||||
.all_skills {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-flow: wrap;
|
||||
}
|
||||
|
||||
.skill {
|
||||
border: 1px solid gray;
|
||||
display: block;
|
||||
border-radius: 6px;
|
||||
text-align: center;
|
||||
margin: 50px;
|
||||
padding: 10px;
|
||||
width: 2in;
|
||||
font-size: 20px;
|
||||
box-shadow: 0 3px 10px gray;
|
||||
}
|
||||
|
||||
.skill img {
|
||||
height: 100px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.skills h6 {
|
||||
align-items: center;
|
||||
font-size: 20px;
|
||||
margin-block-start: 8px;
|
||||
margin-block-end: 5px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.skills p {
|
||||
align-items: center;
|
||||
font-size: 15px;
|
||||
color: gray;
|
||||
margin-block-start: 5px;
|
||||
margin-block-end: 5px;
|
||||
}
|
||||
|
||||
.flex_center {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
/* Projects */
|
||||
|
||||
.projects-container {
|
||||
margin-top: 30px;
|
||||
margin-left: 60px;
|
||||
}
|
||||
|
||||
.projects-container hr {
|
||||
border: 1px solid lightgray;
|
||||
width: 75%;
|
||||
margin-left: 5cm;
|
||||
}
|
||||
|
||||
.project-card {
|
||||
margin: 0 15px 15px 30px;
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
.project-card h3 {
|
||||
font-size: 25px;
|
||||
margin-left: 30px;
|
||||
}
|
||||
|
||||
.project-card li {
|
||||
font-size: 20px;
|
||||
margin-left: 30px;
|
||||
}
|
||||
|
||||
/* Recommendations */
|
||||
|
||||
.all_recommendations {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-left: 1in;
|
||||
flex-direction: row;
|
||||
flex-flow: wrap;
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
.recommendation {
|
||||
font-style: italic;
|
||||
text-align: left;
|
||||
width: 26.875rem;
|
||||
padding: 1rem;
|
||||
background-color: #fff;
|
||||
border-radius: 11px;
|
||||
box-shadow: 0 3px 10px var(--primary-shadow);
|
||||
padding: 20px;
|
||||
margin: 10px;
|
||||
border:1px solid gray;
|
||||
font-size: 18px;
|
||||
height:170px
|
||||
}
|
||||
|
||||
.recommendation span {
|
||||
color: #7600bc;
|
||||
font-size: 20px;
|
||||
font-family: 'Times New Roman', Times, serif;
|
||||
}
|
||||
|
||||
/* Scroll to Top Button */
|
||||
|
||||
.iconbutton{
|
||||
width: 48px;
|
||||
height: 48px;
|
||||
border-radius: 100%;
|
||||
background-color: #7600bc;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
position: fixed;
|
||||
right: 3%;
|
||||
bottom: 3%;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
/* Form Pop-up */
|
||||
|
||||
.popup {
|
||||
width:400px;
|
||||
background-color: #e8bcf0;
|
||||
border-radius: 3mm;
|
||||
top: 50%;
|
||||
left:50%;
|
||||
transform: translate(-50%,-50%);
|
||||
text-align: center;
|
||||
position: fixed;
|
||||
/* padding: 30px; */
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
.popup img {
|
||||
padding-top: 20px;
|
||||
}
|
||||
|
||||
.popup button {
|
||||
background-color: #fff;
|
||||
border: 1px solid #7600bc;
|
||||
color: #7600bc;
|
||||
display: block;
|
||||
border-radius: 6px;
|
||||
text-align: center;
|
||||
margin: 50px;
|
||||
padding: 10px;
|
||||
width: 2in;
|
||||
font-size: 20px;
|
||||
margin-left: 25%;
|
||||
}
|
||||
|
||||
.popup button:hover {
|
||||
background-color: #fff;
|
||||
border: 2px solid #7600bc;
|
||||
color: #7600bc;
|
||||
display: block;
|
||||
font-weight: bolder;
|
||||
text-align: center;
|
||||
cursor: pointer;
|
||||
margin-left: 25%;
|
||||
}
|
||||
|
||||
/* Recommendation Form */
|
||||
|
||||
input, textarea {
|
||||
font-family: 'Trebuchet MS', 'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Arial, sans-serif;
|
||||
margin: 10px;
|
||||
width:100%;
|
||||
}
|
||||
|
||||
fieldset {
|
||||
display: flexbox;
|
||||
align-content: center;
|
||||
justify-content: center;
|
||||
padding: 25px;
|
||||
margin-left: 50px;
|
||||
margin-right: 50px;
|
||||
border: thin solid white;
|
||||
width: 50%;
|
||||
}
|
||||
|
||||
/* Buttons */
|
||||
|
||||
button {
|
||||
background-color: #fff;
|
||||
border: 1px solid #7600bc;
|
||||
color: #7600bc;
|
||||
display: block;
|
||||
border-radius: 6px;
|
||||
text-align: center;
|
||||
margin: 50px;
|
||||
padding: 10px;
|
||||
width: 2in;
|
||||
font-size: 20px;
|
||||
}
|
||||
|
||||
button:hover {
|
||||
background-color: #7600bc;
|
||||
border: 1px solid #7600bc;
|
||||
color: #fff;
|
||||
display: block;
|
||||
border-radius: 6px;
|
||||
text-align: center;
|
||||
cursor: pointer;
|
||||
}
|
||||
16
build.gradle
@@ -4,20 +4,4 @@ allprojects {
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
}
|
||||
|
||||
subprojects {
|
||||
apply plugin: 'java'
|
||||
java {
|
||||
sourceCompatibility = JavaVersion.VERSION_21
|
||||
targetCompatibility = JavaVersion.VERSION_21
|
||||
}
|
||||
dependencies {
|
||||
testImplementation platform('org.junit:junit-bom:5.10.0')
|
||||
testImplementation 'org.junit.jupiter:junit-jupiter'
|
||||
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
|
||||
}
|
||||
test {
|
||||
useJUnitPlatform()
|
||||
}
|
||||
}
|
||||
@@ -1,2 +1,3 @@
|
||||
rootProject.name = 'java-developer-course'
|
||||
include('PetCareScheduler')
|
||||
include 'PetCareScheduler'
|
||||
include 'Portfolio'
|
||||