Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
f640626
Setting up basic structure + testing component
Nicolinabl Nov 18, 2025
3188ea0
created components: introduction, skills + for icons
Nicolinabl Nov 19, 2025
6265b44
created components: projectSection, projects. Used the project compon…
Nicolinabl Nov 19, 2025
a275d87
connected json data to projects
Nicolinabl Nov 20, 2025
c4629b6
changed folder structure, used map to shorten code in projectsCollection
Nicolinabl Nov 21, 2025
9b43f85
changed folder structure, added typography components
Nicolinabl Nov 21, 2025
8f31084
Styled typography components and buttons
Nicolinabl Nov 25, 2025
40610a4
info message in readme and intro text
Nicolinabl Nov 25, 2025
9eb2e39
global style added
Nicolinabl Nov 27, 2025
d859085
styled components
Nicolinabl Nov 27, 2025
91b3e33
added carousel for featured projects
Nicolinabl Nov 27, 2025
cd32fce
added json file for articles, made slideshow for articles
Nicolinabl Nov 28, 2025
8286e28
removed import not in use
Nicolinabl Nov 28, 2025
37590f1
fixed bug in import path
Nicolinabl Nov 28, 2025
e3bf2a5
bug
Nicolinabl Nov 28, 2025
1e62fab
.
Nicolinabl Nov 28, 2025
123617c
deploy problems netlify, test to try again
Nicolinabl Nov 28, 2025
82c7fc0
name change files
Nicolinabl Nov 28, 2025
ae00c94
changed errors in pathways
Nicolinabl Nov 28, 2025
451208c
changed file names to consistent casing
Nicolinabl Nov 28, 2025
8dad866
changed file + foldernames to match github, bc issues with git not re…
Nicolinabl Nov 28, 2025
58494bd
media queries added for responsiveness
Nicolinabl Nov 29, 2025
8c38543
Styling changes made to make site fully responsive and looking good o…
Nicolinabl 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
21 changes: 20 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,20 @@
# Portfolio
# Nicolina Bäcklin Löwenberg – Portfolio

A personal portfolio website showcasing my skills, projects, and thoughts as a web developer.
Live site: https://nicolina-portfolio.netlify.app/

## 📌 Overview

This portfolio was built as part of a React course to demonstrate component-based architecture and styling, while maintaining clean code and accessibility standards.
The site includes information about me, my tech stack, my projects, and a way to get in touch.

## 💻 Tech Stack used

- **React** (Vite)
- **JavaScript (ES6+)**
- **CSS / Responsive Design**
- **HTML5** (semantic markup, accessibility)

## 🤯 Learnings

Number one lesson during this project: realizing GitHub doesn't always recognize changes to lower/uppercase in file-, and folder-names. This caused a lot of trouble when deploying to Netlify -> Netlify couldn't build site because import pathways were "wrong". Looking at my local copy everything looked good, but on GitHub it didn't match. After many hours researching i found the problem and had to change my local copy to match the GitHub version (in case sensitivity) to make it work. Lesson learned: make sure to name files and folders correctly from scratch, to avoid renaming issues later on.
12 changes: 9 additions & 3 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,18 @@
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<link href='https://fonts.googleapis.com/css?family=Poppins' rel='stylesheet'>
<link href='https://fonts.googleapis.com/css?family=Urbanist' rel='stylesheet'>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Portfolio</title>
<meta property="og:title" content="Nicolina Bäcklin Löwenberg" />
<meta property="og:description" content="Portfolio website of Nicolina Bäcklin Löwenberg, web developer." />
<meta property="og:url" content="https://nicolina-portfolio.netlify.app/" />
<title>Nicolinas Portfolio</title>
<link rel="icon" href="/favicon.ico">
</head>
<body>
<div id="root"></div>
<!-- Container of application -->
<div id="root"></div>
<script type="module" src="/src/main.jsx"></script>
</body>
</html>
5 changes: 4 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,10 @@
},
"dependencies": {
"react": "^19.0.0",
"react-dom": "^19.0.0"
"react-dom": "^19.0.0",
"react-slick": "^0.31.0",
"slick-carousel": "^1.8.1",
"styled-components": "^6.1.19"
},
"devDependencies": {
"@eslint/js": "^9.21.0",
Expand Down
Binary file added public/favicon.ico
Binary file not shown.
11 changes: 9 additions & 2 deletions src/App.jsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,15 @@
import { Header } from './Components/layout/Header'
import { Main } from './Components/layout/Main'
import { Footer } from './Components/layout/Footer'
import GlobalStyle from './globalStyles'

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 />
<Header />
<Main />
<Footer />
</>
)
}
Binary file added src/Assets/beach.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/businessSite.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/cat.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/eventFinder.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/family.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/gitHubIcon.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 src/Assets/gitHubIcon.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/instagramIcon.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 src/Assets/instagramIcon.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/linkedinIcon.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 src/Assets/linkedinIcon.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/me.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/recipeLibrary.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/weatherApp.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/workMe.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
32 changes: 32 additions & 0 deletions src/Components/Buttons/ClearButton.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import styled from 'styled-components'

const Button = styled.a`
display: flex;
width: 192px;
height: 48px;
padding: 0 16px;
justify-content: center;
align-items: center;
border-radius: 12px;
border: 2px solid #505b4d;
background: #FFF;

font-family: Poppins;
color: #505b4d;
font-size: 18px;
font-weight: 500;
text-decoration: none;

&:hover {
background-color: black;
color: white;
}
`

export const ClearButton = (props) => {
return (
<Button href={props.href} target="_blank">{props.label}</Button>
)
}


34 changes: 34 additions & 0 deletions src/Components/Buttons/FilledButton.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import styled from 'styled-components'

const Button = styled.a`
display: flex;
width: 192px;
height: 48px;
padding: 0 16px;
justify-content: center;
align-items: center;
border-radius: 12px;
gap: 16px;
background: #505b4d;
border: none;
text-decoration: none;

font-family: Poppins;
font-style: normal;
line-height: normal;
font-size: 18px;
font-weight: 500;
color: #FFFFFF;

&:hover {
background-color: black;
color: white;
}
`

export const FilledButton = (props) => {
return (
<Button href={props.href} target="_blank">{props.label}</Button>
)
}

11 changes: 11 additions & 0 deletions src/Components/Icons/GitHubIcon.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import gitHubIcon from '../../Assets/gitHubIcon.png'

export const GitHubIcon = () => {
return (
<a href='https://github.com/Nicolinabl'>
{ <img src={gitHubIcon} alt="github icon" />}

Choose a reason for hiding this comment

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

I am not sure if you need to use {} brackets around the img here, but maybe I'm missing something?

</a>
)
}


21 changes: 21 additions & 0 deletions src/Components/Icons/IconCollection.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { LinkedinIcon } from './LinkedinIcon'
import { GitHubIcon } from './GitHubIcon'
import { InstagramIcon } from './InstagramIcon'
import styled from 'styled-components'

const IconsContainer = styled.div`
display: flex;
align-items: flex-end;
gap: 32px;
margin-top: 64px;
`

export const IconCollection = () => {
return (
<IconsContainer>
<LinkedinIcon />
<GitHubIcon />
<InstagramIcon />
</IconsContainer>
)
}
10 changes: 10 additions & 0 deletions src/Components/Icons/InstagramIcon.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@

import instagramIcon from '../../Assets/instagramIcon.png'

export const InstagramIcon = () => {
return (
<a href='https://www.instagram.com/'>
{ <img src={instagramIcon} alt="instagram icon" /> }

Choose a reason for hiding this comment

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

Same as before

</a>
)
}
7 changes: 7 additions & 0 deletions src/Components/Icons/LinkedinIcon.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import linkedinIcon from '../../Assets/linkedinIcon.png'

export const LinkedinIcon = () => {
return (
<a href='https://www.linkedin.com/in/nicolina-b%C3%A4cklin-l%C3%B6wenberg/'><img src={linkedinIcon} alt="linkedin icon" /></a>

Choose a reason for hiding this comment

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

Here I don't see those brackets {}, so maybe they are not necessary?

)
}
41 changes: 41 additions & 0 deletions src/Components/Sections/ContactSection.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import { IconCollection } from "../Icons/IconCollection"
import { ProfileImage } from '../cards/ProfileImage'
import { H2 } from '../typography/h2'
import { Body } from '../typography/body'
import styled from 'styled-components'

const ContactContainer = styled.div`
display: flex;
padding: 64px 0;
align-items: center;
gap: 64px;
align-self: stretch;
justify-content: center;

@media (max-width: 1024px) {

Choose a reason for hiding this comment

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

Good usage of media query!

flex-direction: column;
}
`
const ContactHeading = styled.div`
margin-bottom: 32px;
`

export const ContactSection = () => {
return (
<ContactContainer>
<div>
<ProfileImage />
</div>

<div>
<ContactHeading>
<H2>Lets talk!</H2>
</ContactHeading>
<Body>Nicolina Bäcklin Löwenberg</Body>
<Body>+46 72 220 87 00</Body>
<Body>[email protected]</Body>
<IconCollection />
</div>
</ContactContainer>
)
}
74 changes: 74 additions & 0 deletions src/Components/Sections/IntroSection.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
import { IconCollection } from '../Icons/IconCollection'
import { ProfileImage } from '../cards/ProfileImage'
import { H1 } from '../typography/h1'
import { Body } from '../typography/body'
import styled from 'styled-components'

const Hero = styled.header`
display: flex;
flex-direction: row;
justify-content: center;
text-align: left;
padding: 128px 128px 64px 128px;
justify-content: space-evenly;
align-items: center;
align-self: stretch;

@media (max-width: 1024px) {
flex-direction: column;
text-align: center;
padding: 64px 32px 32px 32px;
}

@media (max-width: 480px) {
padding: 32px 16px 16px;
text-align: center;
}
`

const TextContainer = styled.div`
display: flex;
max-width: 580px;
flex-direction: column;
align-items: flex-start;

@media (max-width: 768px) {
align-items: center;
}
`

const ImageContainer = styled.div`
display: flex;
padding: 128px 128px 64px 128px;
align-items: center;

@media (max-width: 1024px) {
padding: 64px 32px 32px 32px;
}

@media (max-width: 480px) {
padding: 32px 16px 16px;
}
`
const InfoText = styled.div`
margin-top: 32px;
`

export const IntroSection = () => {
return (
<Hero>
<TextContainer>
<Body size='30px'>I am Nicolina Bäcklin Löwenberg</Body>
<H1>Web developer</H1>
<InfoText>

Choose a reason for hiding this comment

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

This div seem to only contain the information for the text inside it that could maybe be passed as props directly from the ? But I think your solution works great here anyway.

<Body>Web developer and licensed veterinary nurse. Super excited to make ideas come to life and build projects with impact. I believe in constant learning and showing up fully prepared. Combining my skillsets as a developer and veterinary nurse to bridge the gap between tech and human.</Body>

Choose a reason for hiding this comment

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

Naming styled.p "body" is a little confusing to me, maybe it would be good to specify that it's a body text of paragraph? But it might just be a personal preference

</InfoText>
<IconCollection />
</TextContainer>
<ImageContainer>
<ProfileImage />
</ImageContainer>
</Hero>
)
}

Loading