Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
f98b861
creating folders, files and data
marinalendt-png Nov 21, 2025
3592a9c
added styling to header tech and project section. Also added global s…
marinalendt-png Nov 25, 2025
a73b664
Add: svg and images
marinalendt-png Nov 27, 2025
2409abb
Add: styling to components cards
marinalendt-png Nov 27, 2025
2ef995c
Add: projects and articles in data
marinalendt-png Nov 27, 2025
6ad9855
Styled: ArticleSection
marinalendt-png Nov 27, 2025
a4f4afa
Styled: ContactSection
marinalendt-png Nov 27, 2025
0d32c34
Styled: HeaderSection
marinalendt-png Nov 27, 2025
4dc2ad7
styled: ProjectSection
marinalendt-png Nov 27, 2025
ca5bc0d
styled: SkillsSection
marinalendt-png Nov 27, 2025
034cc8d
styled: TechSection
marinalendt-png Nov 27, 2025
c34a5f6
add: global styles
marinalendt-png Nov 27, 2025
8d24446
remove: picture not used
marinalendt-png Nov 27, 2025
a00fc8f
change: max-width on body
marinalendt-png Nov 28, 2025
dfa9a3d
remove: pictures that isnt used and changing name of weather-app
marinalendt-png Nov 28, 2025
c980328
change: name of weather-app picture
marinalendt-png Nov 28, 2025
736f8ff
fix: style and bugs in sections project, skills and tech
marinalendt-png Nov 28, 2025
0d80c81
change: add styling to projectcard and removing some styling in proje…
marinalendt-png Nov 28, 2025
d3ed5ed
fix: proper CSS-value
marinalendt-png Nov 28, 2025
1cc26a0
change: proper gap between grids
marinalendt-png Nov 28, 2025
1ca940e
fix: gap and position in articlecard and section
marinalendt-png Nov 28, 2025
f1657c7
fix: small changes, clean code etc.
marinalendt-png Nov 28, 2025
412e24f
add: articles
marinalendt-png Nov 28, 2025
d853cd2
add: og:tags and FavIcon
marinalendt-png Nov 28, 2025
972d019
add: ML icon
marinalendt-png Nov 28, 2025
ee63ab6
fix: icon bug
marinalendt-png Nov 28, 2025
b6b854a
final fix: images, padding, clean code etc
marinalendt-png Nov 30, 2025
662cb34
Add: Read me file
marinalendt-png Nov 30, 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
33 changes: 33 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1 +1,34 @@
# Portfolio
https://project-portfolio-ml.netlify.app/

Marina Lendt – Frontend Developer Portfolio

Project Overview
This is a personal portfolio website showcasing my projects, skills, and background as a frontend developer. The goal of the project is to demonstrate:

- Responsive, mobile-first design
- Accessible and user-friendly interfaces
- Clean, reusable React components
- Integration of images, icons, and external links

Features

# Header Section
Introduction with name, profession, and a short bio

# Tech Section
Showing different tech that I have learnt

# Projects Section
Cards displaying featured projects with live demo and GitHub links

# Skills Section
Showing different skills in code, toolbox, and other skills

# Articles Section
Article cards with image, title, date, excerpt, and link to read more

# Accessibility
Proper use of semantic HTML (<section>, <article>, <time>)
Focus-visible styles for keyboard navigation
Alt attributes for all images
44 changes: 33 additions & 11 deletions index.html
Original file line number Diff line number Diff line change
@@ -1,13 +1,35 @@
<!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>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.jsx"></script>
</body>
</html>

<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />

<!-- Open Graph -->
<meta property="og:title" content="Marina Lendt - Frontend Developer">
<meta property="og:description" content="From healthcare to frontend development - my portfolio">
<meta property="og:image" content="https://project-portfolio-ml.netlify.app/ML-og-image.png">
<meta property="og:url" content="https://project-portfolio-ml.netlify.app/">
<meta property="og:type" content="website">

<!-- Favicon for browser -->
<link rel="icon" href="/ML-og-image.png" type="image/png">

<!-- Apple Touch Icon for iOS -->
<link rel="apple-touch-icon" sizes="180x180" href="/ML-og-image.png">

<!-- Google fonts -->
<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=Dosis:wght@200..800&family=Montserrat:ital,wght@0,100..900;1,100..900&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&family=Roboto:ital,wght@0,100..900;1,100..900&display=swap"
rel="stylesheet">
<title>Portfolio</title>
</head>

<body>
<div id="root"></div>
<script type="module" src="/src/main.jsx"></script>
</body>

</html>
6 changes: 4 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,15 @@
},
"dependencies": {
"react": "^19.0.0",
"react-dom": "^19.0.0"
"react-dom": "^19.0.0",
"styled-components": "^6.1.19"
},
"devDependencies": {
"@eslint/js": "^9.21.0",
"@types/react": "^19.0.10",
"@types/react-dom": "^19.0.4",
"@vitejs/plugin-react": "^4.3.4",
"@vitejs/plugin-react": "^4.7.0",
"babel-plugin-styled-components": "^2.1.4",
"eslint": "^9.21.0",
"eslint-plugin-react-hooks": "^5.1.0",
"eslint-plugin-react-refresh": "^0.4.19",
Expand Down
Binary file added public/ML-og-image.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
27 changes: 24 additions & 3 deletions src/App.jsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,29 @@
import React from "react";

import { GlobalStyles } from "./styles/GlobalStyles";
import { HeaderSection } from "./sections/HeaderSection";
import { TechSection } from "./sections/TechSection";
import { ProjectsSection } from "./sections/ProjectsSection";
import { SkillsSection } from "./sections/SkillsSection";
import { ArticleSection } from "./sections/ArticleSection";
import { ContactSection } from "./sections/ContactSection";
// import { Buttons } from "./components/Buttons";



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>
<GlobalStyles />
<HeaderSection />
<TechSection />
<ProjectsSection />
<SkillsSection />
<ArticleSection />
<ContactSection />
</>
)
);
}



3 changes: 3 additions & 0 deletions src/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 src/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 src/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.
Binary file added src/assets/business-site.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 src/assets/data-img.jpg
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 src/assets/floorball-img.jpg
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 src/assets/icon-arrow-down.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 src/assets/icon-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 src/assets/icon-web.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 src/assets/picture1.jpg
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 src/assets/picture2.jpg
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 src/assets/picture3.jpg
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 src/assets/profile-img.jpg
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 src/assets/quiz-app.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 src/assets/recipe-library.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 src/assets/stethoscope-img.jpg
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 src/assets/weather-app.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
143 changes: 143 additions & 0 deletions src/components/ArticleCard.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
import React from "react";
import styled from "styled-components";
import IconWebSVG from "../assets/icon-web.svg";

export const ArticleCard = ({ data }) => {
return (
<CardWrapper>
<ImageBox>
<Image src={data.image} alt={data.title} />
</ImageBox>
<TextBox>
<DateTag dateTime={data.date}>{data.date}</DateTag>
<CardTitle>{data.title}</CardTitle>
<CardText>{data.text}</CardText>
<ReadButton href={data.link} aria-label={`Read full article: ${data.title}`}>
<ButtonIcon src={IconWebSVG} alt="" /> Read article
</ReadButton>
</TextBox>
</CardWrapper>
);
}

const CardWrapper = styled.article`
display: flex;
flex-direction: column;
gap: 32px;
width: 100%;
margin-top: 64px;

/* Tablet */
@media (min-width: 768px) {
flex-direction: row;
align-items: flex-start;
gap: 32px;
}

/* Desktop */
@media (min-width: 1024px) {
gap: 125px;
}
`;

const ImageBox = styled.div`
width: 327px;
height: 200px;
flex-shrink: 0;

/* Tablet */
@media (min-width: 768px) {
width: 200px;
height: 338px;
flex-shrink: 0;
}

/* Desktop */
@media (min-width: 1024px) {
width: 479px;
height: 311px;
}
`;

const Image = styled.img`
width: 100%;
height: 100%;
border-radius: 12px;
object-fit: cover;
`;

const TextBox = styled.div`
display: flex;
flex-direction: column;
gap: 32px;
text-align: left;
font-size: 16px;

/* Tablet */
@media (min-width: 768px) {
padding-left:0;
max-width: calc(100% - 200px);
}

/* Desktop */
@media (min-width: 1024px) {
max-width: calc(100% - 379px);
}
`;

const DateTag = styled.time`

Choose a reason for hiding this comment

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

Nice use of a rare element! I've never used <time> before! :)

display: flex;
align-items: center;
width: 130px;
height: 24px;
padding: 2px 6px;
background: rgba(255, 255, 255, 1);
color: rgba(0, 0, 0, 1);
border: 1px solid rgba(0, 0, 0, 1);
border-radius: 4px;
font-size: 16px;
font-weight: 500;
`;

const CardTitle = styled.h3`
font-size: 24px;
font-weight: 500;
color: rgba(0, 0, 0, 1);
line-height: 24px;

/* Desktop */
@media (min-width: 1024px) {
font-size: 30px;
}
`;

const CardText = styled.p`
font-size: 16px;
color: rgba(0, 0, 0, 1);
line-height: 22px;
`;

const ReadButton = styled.a`
width: 271px;
height: 48px;
display: inline-flex;
text-align: center;
padding: 12px 16px;
background: rgba(0, 0, 0, 1);
color: rgba(255, 255, 255, 1) ;
border-radius: 12px;
font-weight: 500;
text-decoration: none;
cursor: pointer;

&:focus-visible {
outline: 3px solid #f39c12;
outline-offset: 2px;
}
`;

const ButtonIcon = styled.img`
width: 24px;
height: 24px;
margin-right: 8px;
`;
Loading