Skip to content
Open
Show file tree
Hide file tree
Changes from 53 commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
964bdb5
add images
MalLunBar Apr 15, 2025
2af53a5
add sections and change data in json
MalLunBar Apr 16, 2025
9b4e4e1
moved folders
MalLunBar Apr 16, 2025
4921fd2
change folder structure
MalLunBar Apr 16, 2025
cd2e3ee
Start the code and change file-names
MalLunBar Apr 16, 2025
499b6b5
Add some projectcard components and start on about page
MalLunBar Apr 16, 2025
ac55d09
make tech section
MalLunBar Apr 16, 2025
2c244bd
skills sektion
MalLunBar Apr 16, 2025
99eb2f1
Add blogsection but not with all info
MalLunBar Apr 17, 2025
779e8e6
add info to blog card and heading
MalLunBar Apr 17, 2025
c860ac9
add img to contact section
MalLunBar Apr 17, 2025
6c00c85
add headings to all sections and start on Contact
MalLunBar Apr 17, 2025
24ba18f
Tag component
MalLunBar Apr 17, 2025
6b357cb
installed styled components and added a plugin for to get better clas…
MalLunBar Apr 22, 2025
60400a8
starting with styled-components
MalLunBar Apr 22, 2025
21a2970
change of some pics and delete css file
MalLunBar Apr 22, 2025
f882aa3
add styled component for all sections
MalLunBar Apr 22, 2025
86fe6d4
headingmedium used in several places
MalLunBar Apr 22, 2025
24291d1
Add json file for the skills
MalLunBar Apr 23, 2025
90bfaa2
positioning the skills
MalLunBar Apr 23, 2025
01186f0
Styling projectcard and everything in it
MalLunBar Apr 23, 2025
63f639a
Styling for TechSection and add Footer
MalLunBar Apr 23, 2025
899f857
fix icon component and transfer some styling from button
MalLunBar Apr 23, 2025
b9367b3
fix positioning on contactSection
MalLunBar Apr 23, 2025
cd3c2d3
change some file names and add more styling to typography things.
MalLunBar Apr 24, 2025
7451e55
change paragraphs to get the scaping right in about section
MalLunBar Apr 24, 2025
6414249
chnage to named exports and break out things from project card
MalLunBar Apr 24, 2025
f4b439c
Break out text from projectcard into CardContent
MalLunBar Apr 24, 2025
56ea3ad
Devide sections in two for styling
MalLunBar Apr 24, 2025
aabf945
Make tags the right size
MalLunBar Apr 24, 2025
88cb4dc
add media for blogposts
MalLunBar Apr 24, 2025
c7bef2b
chnage blog post pic
MalLunBar Apr 24, 2025
7dd8a6f
add og-tags
MalLunBar Apr 26, 2025
1eb045d
add absolute URL
MalLunBar Apr 26, 2025
242edc6
add printscreen
MalLunBar Apr 26, 2025
ce16f79
change size
MalLunBar Apr 26, 2025
a546df7
change img
MalLunBar Apr 26, 2025
fa12b26
media styling for desktop and tablet
MalLunBar Apr 26, 2025
221180d
change width and positioning of projects
MalLunBar Apr 26, 2025
43aa2e2
positioning and changing of pictures
MalLunBar Apr 26, 2025
667773d
Add row-reverse to every other project
MalLunBar Apr 26, 2025
0b9ee65
fix gap on blog card
MalLunBar Apr 26, 2025
5d04f60
checking spaces are correct
MalLunBar Apr 26, 2025
892e444
change the text content
MalLunBar Apr 27, 2025
b6f6d6b
rewrite and cleanup some code and add load more button
MalLunBar Apr 27, 2025
8398674
centering button
MalLunBar Apr 27, 2025
94f3706
Add a function that tells user there are no more projects to load
MalLunBar Apr 27, 2025
75e53a3
Add alt text to all images
MalLunBar Apr 27, 2025
97476f0
last alt text
MalLunBar Apr 27, 2025
ea1bd5f
cleanup white space
MalLunBar Apr 27, 2025
01bc24d
add netlifylink
MalLunBar Apr 27, 2025
ee5def6
CHange title on blogsection
MalLunBar Apr 27, 2025
fcc9330
deleted margin on infobox
MalLunBar Apr 28, 2025
45d1f95
add a project
MalLunBar May 10, 2025
b1e6fd8
add correct fontsize on skillsection
MalLunBar May 10, 2025
87feb8c
create function for loadMore-button
MalLunBar May 10, 2025
1c521ce
add a project
MalLunBar May 16, 2025
ff1feb1
add project and skills
MalLunBar May 26, 2025
724a4f8
chnage image on project
MalLunBar May 26, 2025
3b477c1
add skills to tech-section
MalLunBar May 26, 2025
d26d0a7
add project to json file
MalLunBar Sep 4, 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
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1 +1,4 @@
# Portfolio

Link to Project:
https://malinlundgren.netlify.app/
64 changes: 53 additions & 11 deletions index.html
Original file line number Diff line number Diff line change
@@ -1,13 +1,55 @@
<!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" />
<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=Montserrat:ital,wght@0,100..900;1,100..900&family=Poppins:wght@400;500;700&display=swap"
rel="stylesheet"
>
<link
rel="icon"
type="image/svg+xml"
href="./assets/girl.png"
/>
<meta
name="viewport"
content="width=device-width, initial-scale=1.0"
/>
<meta
property="og:title"
content="Malin Lundgren Frontend Developer Portfolio"
/>
<meta
property="og:type"
content="website"
/>
<meta
property="og:url"
content="https://malinlundgren.netlify.app/"
/>
<meta
property="og:image"
content="https://malinlundgren.netlify.app/assets/og-tag.png"
/>
<title>Portfolio</title>
</head>

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

</html>
8 changes: 5 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,19 @@
},
"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",
"@types/react": "^19.0.10",
"@types/react-dom": "^19.0.4",
"@vitejs/plugin-react": "^4.3.4",
"@vitejs/plugin-react": "^4.4.1",
"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",
"globals": "^15.15.0",
"vite": "^6.2.0"
}
}
}
3 changes: 3 additions & 0 deletions public/assets/arrowdown-icon.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/blue.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/assets/bus.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/assets/business1.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/assets/contact-pic.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/assets/food.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/assets/girl.png
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/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/globe-icon.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/instagram-icon.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/it-takes-two.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 public/assets/it-takes-two.webp
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/linkedin-icon.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/og-tag.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/assets/profile-pic.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/assets/purple.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/assets/rain.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/assets/towerfall.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/assets/towerfall1.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/assets/yellow.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
21 changes: 19 additions & 2 deletions src/App.jsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,25 @@
import GlobalStyle from "./GlobalStyle"
import { About } from "./sections/About"
import TechSection from "./sections/TechSection"
import ProjectSection from "./sections/ProjectsSection"
import SkillsSection from "./sections/SkillsSection"
import Blog from "./sections/BlogSection"
import ContactSection from "./sections/ContactSection"



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 />
<About />
<TechSection />
<ProjectSection />
<SkillsSection />
<Blog />
<ContactSection />
</>
)
}


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

const GlobalStyle = createGlobalStyle`
* {
box-sizing: border-box;
margin: 0;
padding: 0;
font-family: "Poppins", sans-serif;
}
`

export default GlobalStyle
49 changes: 49 additions & 0 deletions src/components/BlogCard.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import { Button } from "./Button"
import styled from "styled-components"
import { CardTextContent } from "./CardTextContent"
import { BlogImage } from "./BlogImage"
import { media } from "../media"


const BlogCardStyle = styled.div`
display: flex;
flex-direction: column;
gap: 32px;
flex: 1 0 0;


@media ${media.tablet} {
flex-direction: row;
}
@media ${media.desktop} {
gap: 125px;
}
`
const BlogCardTextStyle = styled.div`
display: flex;
flex-direction: column;
gap: 32px;

`
const BlogCard = ({ image, alt, tags, name, description, link }) => {
return (
<BlogCardStyle>
<BlogImage
image={image}
alt={alt}
/>
<BlogCardTextStyle>
<CardTextContent
name={name}
tags={tags}
description={description} />
<Button
icon="./assets/globe-icon.svg"
label="Watch Trailer"
url={link} />
</BlogCardTextStyle>
</BlogCardStyle>
)
}

export default BlogCard
26 changes: 26 additions & 0 deletions src/components/BlogImage.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import styled from "styled-components";
import { media } from "../media";


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

@media ${media.tablet} {
width: 200px;
height: 100%;
}
@media ${media.desktop} {
width: 479px;
}
`


export const BlogImage = ({ image, alt }) => {
return <BlogCardImage src={image} alt={alt} />
}



83 changes: 83 additions & 0 deletions src/components/Button.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
import styled from "styled-components"
import IconLink from "./IconLink"
import { useState } from "react";



const ButtonStyled = styled.a`
background-color: ${(props) => props.$background || "black"};
color: ${(props) => props.$text || "white"};
border: ${(props) => props.$border || "none"};
border-radius: 12px;
width: 303px;
height: 48px;
font-size: 18px;
padding: 16px;
display: flex;
gap: 16px;
align-items: center;
text-decoration: none;
`

const CenteredButtonStyled = styled(ButtonStyled)`
align-self: center;
`

export const Button = ({ icon, label, url, background, text, border }) => {

return (
<ButtonStyled
href={url}
target="_blank"
rel="noopener noreferrer"
$background={background}
$text={text}
$border={border}

>
<IconLink
icon={icon}
url={url}
background={background} />
{label}
</ButtonStyled>
)
}

export const CenteredButton = ({ icon, label, url, background, text, border }) => {

const [showBox, setShowBox] = useState(false);

const handleClick = (e) => {
e.preventDefault();
setShowBox(true);
}

return (
<>
<CenteredButtonStyled
href={url}
target="_blank"
rel="noopener noreferrer"
$background={background}
$text={text}
$border={border}
onClick={handleClick}
>
<IconLink
icon={icon}
url={url}
background={background} />
{label}
</CenteredButtonStyled>

{showBox && (
<div style={{ padding: "10px", backgroundColor: "#eee", borderRadius: "12px" }}>
No more projects to show!
</div>
)}
</>

)
}

35 changes: 35 additions & 0 deletions src/components/CardTextContent.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import { Tag } from "./Tag"
import { HeadingMedium } from "../typography/HeadingsMedium"
import styled from "styled-components"
import { Paragraph } from "../typography/Paragraphs"


const CardTextStyle = styled.div`
display: flex;
flex-direction: column;
gap: 16px;
max-width: 580px;

`
const TagContainerStyle = styled.div`
display: flex;
gap: 4px;
flex-wrap: wrap;
`

export const CardTextContent = ({ tags, name, description }) => {
return (
<CardTextStyle>
<TagContainerStyle>
{tags.map((tag) => (
<Tag
key={tag}
label={tag} />
))}
</TagContainerStyle>
<HeadingMedium title={name} />
<Paragraph align="left">{description}</Paragraph>
</CardTextStyle>

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


const IconStyled = styled.img`
width: 32px;
height: 32px;
background-color: ${(props) => props.$background || "black"};
`
const WhiteIconStyled = styled(IconStyled)`
background-color: white;
`

const IconLink = ({ icon, background }) => {
return (
<>
{icon && <IconStyled
src={icon}
alt=""
aria-hidden="true"
$background={background} />}
</>
)
}

export default IconLink
Loading