Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
a20c808
Added a header with navigation.
solen80a Apr 15, 2025
ed004db
Rearranged so main.jsx only contains the original stuff. Devided proj…
solen80a Apr 15, 2025
2d26782
Rearranged ProjCards.
solen80a Apr 16, 2025
1782160
Implemented a hamburger menu with userState.
solen80a Apr 16, 2025
a788f71
Hamburger is positioned correct and only show on mobile. Naviagtion f…
solen80a Apr 17, 2025
e134e12
Added footer and profile component with styling.
solen80a Apr 17, 2025
58fe8b4
Updated proj with project content from app. Added tags and netlify link.
solen80a Apr 17, 2025
2cf0b57
Added skip to main content.
solen80a Apr 20, 2025
aa0709b
Hamburger opens, and fixed open x.
solen80a Apr 20, 2025
82b3cc0
Added svg icons and imgs. Added styled components. Added a styled but…
solen80a Apr 22, 2025
416a5d5
Moved css styling to styled components for Profile, Tech and Footer.
solen80a Apr 23, 2025
eba5b75
Added skip link as it´s own section component with styled components.
solen80a Apr 24, 2025
ab70a83
Add MyWordsCard component and MyWords section with data integration
solen80a Apr 24, 2025
5dd7e33
Add projects data integration and update components to utilize projec…
solen80a Apr 24, 2025
7c4145b
Refactor components and styles for improved structure and readability…
solen80a Apr 24, 2025
36d7299
Refactor Proj and Skills sections to use TagButton component for tags…
solen80a Apr 25, 2025
0eae30b
Refactor Proj section to utilize TagButton component for tags; remove…
solen80a Apr 25, 2025
e5d9821
Update README and Footer components; enhance project details and add …
solen80a Apr 25, 2025
a4d51f4
Implement code changes to enhance functionality and improve performance
solen80a Apr 25, 2025
05ee068
Add MyWordsCard component and MyWords section with data integration
solen80a Apr 26, 2025
9474e10
Refactor components for improved styling and responsiveness; update B…
solen80a Apr 27, 2025
b203d7c
Refactor media queries for improved responsiveness; update GlobalStyl…
solen80a Apr 27, 2025
fb6822c
Refactor code structure for improved readability and maintainability
solen80a Apr 27, 2025
d526518
Refactor GlobalStyle, Profile, Skills, and Tech components for improv…
solen80a Apr 27, 2025
372b965
Refactor Button and ProjCard components for improved layout and respo…
solen80a Apr 27, 2025
59361f6
Refactor GlobalStyle, MyWordsCard, and Profile components for improve…
solen80a Apr 27, 2025
02d59b4
Refactor GlobalStyle and MyWordsCard components for improved responsi…
solen80a Apr 27, 2025
14cd3e2
Refactor MyWordsCard and ProjCard components for improved semantic st…
solen80a Apr 27, 2025
aaece75
Cleaned code and removed unused files.
solen80a Apr 27, 2025
b0c9f67
Fixed padding and max-width on sections. Also fixed the font on tags.
solen80a May 12, 2025
82836cc
Added even odd to my project card and mywords cards. Also added paddi…
solen80a May 19, 2025
c880665
Made some cleaning and fixed profile img.
solen80a May 19, 2025
1c2585e
Fixed styling for sections and img.
solen80a May 19, 2025
967bbab
Made some more cleaning.
solen80a May 19, 2025
2094f1d
Added mor padding to the sections. And some more styling.
solen80a May 21, 2025
342a767
Styling changes.
solen80a Jun 3, 2025
c2a4a97
More styling fixes to get everything fit on mobile. Also made som cle…
solen80a Jun 3, 2025
0250ffc
Added project to portfolio and updated skills list.
solen80a Jun 19, 2025
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
25 changes: 24 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,24 @@
# Portfolio
# Portfolio project

Netlify link: https://sofialennbom.netlify.app/

Portfolio project in react using components and props, styled components.
It follows the guidelines on how to write clean code and accessibility guidelines to ensure your website is usable by a diverse range of users:
[] Lighthouse score of at least 95
[] Images have alt attributes and proper sizes
[] All contrasts should be OK
[] Responsive for devices from 320px width up to at least 1600px.

The portfolio contains:
[] A picture of me
[] A presentation of my tech skills
[] A presentation of my projects linking to GitHub and Netlify.
[] A presentation of some thoughts that I have around code.
[] A clear way to get in contact with me

Follows figma design: https://www.figma.com/design/RsWkRToMb9XaYPNpNNDdo6/Sofia%C2%B4s-Figma-designs-for-students?node-id=1078-2289&m=dev





5 changes: 4 additions & 1 deletion index.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@
<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>
<title>Portfolio Sofia Lennbom</title>
<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=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap" rel="stylesheet">
</head>
<body>
<div id="root"></div>
Expand Down
5 changes: 3 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@
},
"dependencies": {
"react": "^19.0.0",
"react-dom": "^19.0.0"
"react-dom": "^19.0.0",
"styled-components": "^6.1.17"
},
"devDependencies": {
"@eslint/js": "^9.21.0",
Expand All @@ -22,6 +23,6 @@
"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"
}
}
3 changes: 3 additions & 0 deletions public/assets/Btn - github.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions public/assets/Btn - instagram.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions public/assets/Btn - linkedin.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions public/assets/Btn - stackoverflow.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions public/assets/Ic-ArrowDown.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions public/assets/Ic-Web.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
21 changes: 21 additions & 0 deletions public/assets/RecLib.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
21 changes: 21 additions & 0 deletions public/assets/accessibility.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/assets/food.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
21 changes: 21 additions & 0 deletions public/assets/green_leaf.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 12 additions & 0 deletions public/assets/laptop.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
18 changes: 18 additions & 0 deletions public/assets/movie_app.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
9 changes: 9 additions & 0 deletions public/assets/screen.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
9 changes: 9 additions & 0 deletions public/assets/seed.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/assets/sofia_lennbom_black_white.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
9 changes: 9 additions & 0 deletions public/assets/sofia_lennbom_black_white.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
21 changes: 21 additions & 0 deletions public/assets/weather.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
24 changes: 22 additions & 2 deletions src/App.jsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,28 @@

import { Profile } from "./sections/Profile"
import { Tech } from "./sections/Tech"
import { Proj } from "./sections/Proj"
import { Footer } from "./sections/Footer"
import { GlobalStyle } from "./components/GlobalStyle"
import { SkipToMainContent } from "./sections/SkipToMain"
import { Skills } from "./sections/Skills"
import { MyWords } from "./sections/MyWords"




export const 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>

<GlobalStyle />
<SkipToMainContent />
<Profile />
<Tech />
<Proj />
<Skills />
<MyWords />
<Footer />
</>
)
}
41 changes: 41 additions & 0 deletions src/components/Button.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import styled from "styled-components"

import { Media } from "./Media"

const ButtonWrapper = styled.a`
display: inline-flex;
background-color: #434040;
color: white;
width: 303px;
height: 48px;
padding: 0px 16px;
border: 2px solid #434040;
border-radius: 12px;
align-items: center;
gap: 16px;

cursor: pointer;

img{
height: 31px;
min-width: 31px;
}

/* Desktop Widescreen */
@media ${Media.desktop}{
display: inline-flex;
justify-content: flex-start;
padding: 5px 125px 5px 16px;
margin-right: auto;
}
`

export const Button = ({ url, icon, alt, title }) => {
return (
<ButtonWrapper href={url} target="_blank" >
<img src={icon} alt={alt} />
{title}
</ButtonWrapper>
)
}

97 changes: 97 additions & 0 deletions src/components/GlobalStyle.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
import { createGlobalStyle } from "styled-components";

import { Media } from "./Media";

export const GlobalStyle = createGlobalStyle`
* {
box-sizing: border-box;
align-items: center;
margin: 0;
padding: 0;
}

body {
font-family: poppins, sans-serif;
background-color: #F4F4F4;
color: #434040;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
text-align: center;
}

a {
text-decoration: none;
}

h1, h2, p {
margin: 0;
padding: 0;
}

h3 {
text-align: left;
margin: 0;
padding: 0;
}

img {
min-width: 300px;
max-width: 100%;
height: auto;
margin: 0;
border-radius: 12px;
}

section {
display: flex;
padding: 64px 16px;
flex-direction: column;
align-items: center;
gap: 16px;
width: 100vw;

/* Desktop Tablet */
@media ${Media.tablet}{
padding: 64px 24px;
}

/* Desktop Widescreen */
@media ${Media.desktop}{
padding: 128px 48px;
}
}

div {
width: 80%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}

article {
min-width: 300px;
height: 100%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
//padding: 0px 16px;

/* Desktop Widescreen */
@media ${Media.desktop}{
display: flex;
justify-content: center;
align-items: center;
width: 580px;
align-items: center;

img {
margin-right: auto;
}
}
}
`
;
7 changes: 7 additions & 0 deletions src/components/Media.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@


export const Media = {
mobile: "(max-width: 500px)",
tablet: "(min-width: 501px) and (max-width: 768px)",
desktop: "(min-width: 769px) and (max-width: 2000px)",
}
102 changes: 102 additions & 0 deletions src/components/MyWordsCard.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
import styled from "styled-components";

import { Media } from "../components/Media";
import { TagButton } from "../components/TagButton";
import { Body, H3 } from "../components/Typography";
import { Button } from "./Button";

const MyWordsCardContainer = styled.section`
display: flex;
justify-content: center;
align-items: center;

/* Tablet */
@media ${Media.tablet}{
gap: 32px;
}

/* Desktop Widescreen */
@media ${Media.desktop}{
flex-direction: ${({ $reverse}) => ($reverse ? "row-reverse" : "row")};
justify-content: center;
height: 418px;
align-items: center;
}

& p {
width: 100%;
}
`

const TagWrapper = styled.p`
display: flex;
justify-content: space-between;
align-items: center;
gap: 6px;
border-radius: 12px;

& button {
width: 142px;
}
`

const MyWordsImage = styled.img`
width: 200px;


/* Tablet */
@media ${Media.tablet}{
min-width: 200px;
width: 300px;

}

/* Desktop Widescreen */
@media ${Media.desktop}{
width: auto;
max-width: 479px;

}
`

const MyWordsCardContent = styled.article`
gap: 10px;
`


export const MyWordsCard = ({
index,
image,
alt,
tag,
name,
content,
link,
myWordsIcon,
myWordsAlt,
myWordsTitle}) => {
const isreversed = index % 2 === 0;

return (
<>
<MyWordsCardContainer $reverse={isreversed}>
<MyWordsImage src={image} alt={alt} />
<MyWordsCardContent>
<TagWrapper>
<TagButton $projtag>{tag}</TagButton>
</TagWrapper>
<H3>{name}</H3>
<Body>{content}</Body>
<Button
url={link}
icon={myWordsIcon}
alt={myWordsAlt}
title={myWordsTitle}
/>
</MyWordsCardContent>
</MyWordsCardContainer>
</>
)


};
Loading