Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Auto detect text files and perform LF normalization
* text=auto
603 changes: 579 additions & 24 deletions .gitignore

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"liveServer.settings.port": 5501
}
1 change: 0 additions & 1 deletion README.md

This file was deleted.

600 changes: 600 additions & 0 deletions dist/assets/index-BEspto0Q.js

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions dist/assets/index-ByK2BA4K.css

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

75 changes: 75 additions & 0 deletions dist/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />

<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Agdasima:wght@400;700&family=Chewy&family=DM+Sans:ital,opsz,wght@0,9..40,100..1000;1,9..40,100..1000&family=Mako&display=swap" rel="stylesheet">
<script type="module" crossorigin src="/assets/index-BEspto0Q.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-ByK2BA4K.css">
</head>
<object data="" type=""></object>
<div id="root"></div>
<!-- <div id="sectionTwo" class="sectionTwo">

<div class="techHeadline">
<h2>Tech Stack</h2>
</div>
<div class="techStack">
<p class="techStack">HTML, CSS, Flexbox, JavaScript, ES6, React, React Hooks, Web Accessibility, Node.js, API's, MongoDB, Python (Pandas, NumPy, Matplotlib, Seaborn), Mob-programming, Pair-programming, GitHub.</p>
</div>

<a href="#sectionFour">
<div class="angle-square-headline-techstack">
Projects
</div>
<img
src="img/angle-square-light.webp"
class="angle-down-light"
alt="Angle down icon"
/>
</div>
</a> -->

<!-- <a href="#sectionThree"> -->

<!-- Skills section -->
<!-- <div id="sectionFour" class="sectionFour">
<div class="sectionFourContainer">
<div class="sectionFourCards">
<p>HTML5</p>
<p>CSS3</p>
<p>JavaScript</p>
<p>TypeScript</p>
<p>React</p>
<p>React Hooks</p>
</div>
<div class="sectionFourCards">
<img src="img/server.webp" alt="Database icon" class="skillsIcons" />
Backend
<p>Node.js</p>
</div>
<div class="sectionFourCards">
<img src="img/handshake.webp" alt="Handshake icon" class="skillsIcons" />
Methodologies
<p>Agile</p>
</div>
<div class="sectionFourCards">
<img src="img/chart-histogram.webp" alt="Histogram icon" class="skillsIcons" />
Data Analysis
<p>Google Analytics 4</p>
<p>Google Tag Manager</p>
<p>Google Looker Studio</p>
<p>Google Optimize</p>
<p>Python (Pandas, NumPy, Matplotlib, Seaborn)</p>
<p>R</p>
<p>SQL</p>
</div>

</div>
</div> -->

</body>
</html>
28 changes: 28 additions & 0 deletions hooks/useIntersectionObserver.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { useEffect, useState } from "react";

const useIntersectionObserver = (ref, options) => {
const [isVisible, setIsVisible] = useState(false);

useEffect(() => {
const observer = new IntersectionObserver(([entry]) => {
if (entry.isIntersecting) {
setIsVisible(true);
observer.unobserve(entry.target); // Stop observing after it becomes visible
}
}, options);

if (ref.current) {
observer.observe(ref.current);
}

return () => {
if (ref.current) {
observer.unobserve(ref.current);
}
};
}, [ref, options]);

return isVisible;
};

export default useIntersectionObserver;
69 changes: 65 additions & 4 deletions index.html
Original file line number Diff line number Diff line change
@@ -1,13 +1,74 @@
<!doctype html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Portfolio</title>
<link rel="stylesheet" href="/style.css">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Agdasima:wght@400;700&family=Chewy&family=DM+Sans:ital,opsz,wght@0,9..40,100..1000;1,9..40,100..1000&family=Mako&display=swap" rel="stylesheet">
</head>
<body>
<object data="" type=""></object>
<div id="root"></div>
<!-- <div id="sectionTwo" class="sectionTwo">

<div class="techHeadline">
<h2>Tech Stack</h2>
</div>
<div class="techStack">
<p class="techStack">HTML, CSS, Flexbox, JavaScript, ES6, React, React Hooks, Web Accessibility, Node.js, API's, MongoDB, Python (Pandas, NumPy, Matplotlib, Seaborn), Mob-programming, Pair-programming, GitHub.</p>
</div>

<a href="#sectionFour">
<div class="angle-square-headline-techstack">
Projects
</div>
<img
src="img/angle-square-light.webp"
class="angle-down-light"
alt="Angle down icon"
/>
</div>
</a> -->

<!-- <a href="#sectionThree"> -->

<!-- Skills section -->
<!-- <div id="sectionFour" class="sectionFour">
<div class="sectionFourContainer">
<div class="sectionFourCards">
<p>HTML5</p>
<p>CSS3</p>
<p>JavaScript</p>
<p>TypeScript</p>
<p>React</p>
<p>React Hooks</p>
</div>
<div class="sectionFourCards">
<img src="img/server.webp" alt="Database icon" class="skillsIcons" />
Backend
<p>Node.js</p>
</div>
<div class="sectionFourCards">
<img src="img/handshake.webp" alt="Handshake icon" class="skillsIcons" />
Methodologies
<p>Agile</p>
</div>
<div class="sectionFourCards">
<img src="img/chart-histogram.webp" alt="Histogram icon" class="skillsIcons" />
Data Analysis
<p>Google Analytics 4</p>
<p>Google Tag Manager</p>
<p>Google Looker Studio</p>
<p>Google Optimize</p>
<p>Python (Pandas, NumPy, Matplotlib, Seaborn)</p>
<p>R</p>
<p>SQL</p>
</div>

</div>
</div> -->
<script type="module" src="/src/main.jsx"></script>

</body>
</html>
Empty file added media.js
Empty file.
42 changes: 25 additions & 17 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,27 +1,35 @@
{
"name": "project",
"private": true,
"version": "0.0.0",
"type": "module",
"dependencies": {
"@headlessui/react": "^2.2.2",
"@heroicons/react": "^2.2.0",
"@vitejs/plugin-react": "^4.4.1",
"prop-types": "^15.8.1",
"react": "^19.1.0",
"react-dom": "^19.1.0",
"styled-components": "^6.1.17"
},
"name": "testing-repo",
"version": "1.0.0",
"main": "app.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "vite",
"build": "vite build",
"lint": "eslint .",
"preview": "vite preview"
},
"dependencies": {
"react": "^19.0.0",
"react-dom": "^19.0.0"
"repository": {
"type": "git",
"url": "git+https://github.com/oskarnordin/testing-repo.git"
},
"keywords": [],
"author": "",
"license": "ISC",
"bugs": {
"url": "https://github.com/oskarnordin/testing-repo/issues"
},
"homepage": "https://github.com/oskarnordin/testing-repo#readme",
"description": "",
"devDependencies": {
"@eslint/js": "^9.21.0",
"@types/react": "^19.0.10",
"@types/react-dom": "^19.0.4",
"@vitejs/plugin-react": "^4.3.4",
"eslint": "^9.21.0",
"eslint-plugin-react-hooks": "^5.1.0",
"eslint-plugin-react-refresh": "^0.4.19",
"globals": "^15.15.0",
"vite": "^6.2.0"
"vite": "^6.2.6"
}
}
Binary file added public/img/access.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/img/angle-down.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/img/angle-square-down.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 2 additions & 0 deletions public/img/angle-square-down.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/img/angle-square-light.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/img/bg-video-3.mp4
Binary file not shown.
5 changes: 5 additions & 0 deletions public/img/placeholder.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/img/portfolio.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/img/selfie-round.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/img/sushi.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/img/thinking.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/img/weather.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 0 additions & 1 deletion public/vite.svg

This file was deleted.

1 change: 0 additions & 1 deletion pull_request_template.md

This file was deleted.

26 changes: 22 additions & 4 deletions src/App.jsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,26 @@
export const App = () => {
import React from "react";
import Overlay from "./components/Sections/Overlay";
import SkillsSection from "./components/Sections/Skills";
import TechstackSection from "./components/Sections/Techstack";
import HeroVideo from "./components/HeroVideo";
import FeaturedProjects from "./components/Sections/Projects";
import MyWordsSection from "./components/Sections/MyWords";
import ContactSection from "./components/Sections/Contact";
import "./style.css";

function App() {
return (
<>
<h1>Portfolio</h1>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Voluptatem, laborum! Maxime animi nostrum facilis distinctio neque labore consectetur beatae eum ipsum excepturi voluptatum, dicta repellendus incidunt fugiat, consequatur rem aperiam.</p>
<HeroVideo />
<Overlay />
<TechstackSection />

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your prop names are easy to understand and where they appear on your page. I can see you have a main element that isn't being used. Is that being addressed elsewhere?

<FeaturedProjects />
<MyWordsSection />
<SkillsSection />
<ContactSection />
<main></main>
</>
)
);
}

export default App;
88 changes: 88 additions & 0 deletions src/components/Cards/ContactCard.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
import React, { useRef } from "react";
import styled from "styled-components";
import useIntersectionObserver from "/hooks/useIntersectionObserver";

const ContactCardContainer = styled.div`
background-color: transparent;
display: flex;
border-radius: 28px;
align-items: center;
flex-direction: column;
flex-wrap: wrap;
min-height: 650px;
padding: 40px;
width: 450px;
gap: 10px;
text-align: center;
opacity: 0; /* Start hidden */
transform: translateY(20px); /* Start with offset */
transition: opacity 0.6s ease-out, transform 0.6s ease-out;
&.visible {
opacity: 1;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Haven't seen this before! interesting!

transform: translateY(0);
}
@media (max-width: 1200px) {
width: 100%;
height: 450px;
border-radius: 18px;
padding: 0px;
}
`;

const SelfieImage = styled.img`
border-radius: 50%;
width: 300px;
height: 300px;
padding: 10px;
@media (max-width: 768px) {
width: 150px;
height: 150px;
padding: 6px;
}
`;

const ContactH2 = styled.h2`
color: black;
font-size: 64px;
font-weight: bold;
margin-bottom: 10px;
`;

const ContactH3 = styled.h3`
background-color: transparent;
justify-content: center;
align-items: center;
font-family: DM sans;
display: flex;
color: #2d3748;
font-weight: 600;
font-size: 32px;
padding: 10px;
margin: 5px;
border-radius: 16px;
text-decoration: none;
@media (max-width: 768px) {
font-size: 18px;
}
`;

const ContactCard = () => {
const ref = useRef(null);
const isVisible = useIntersectionObserver(ref, { threshold: 0.1 });

return (
<ContactCardContainer ref={ref} className={isVisible ? "visible" : ""}>
<ContactH2>Let's talk</ContactH2>
<SelfieImage src="/img/selfie-round.png" alt="Selfie of Oskar Nordin" />
<ContactH3>Oskar Nordin</ContactH3>
<ContactH3>+46701774998</ContactH3>
<ContactH3>oskarnordin1@gmail.com</ContactH3>
</ContactCardContainer>
);
};

export default ContactCard;
Loading