-
Notifications
You must be signed in to change notification settings - Fork 55
Nicolinas portfolio #47
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
f640626
3188ea0
6265b44
a275d87
c4629b6
9b43f85
8f31084
40610a4
9eb2e39
d859085
91b3e33
cd32fce
8286e28
37590f1
e3bf2a5
1e62fab
123617c
82c7fc0
ae00c94
451208c
8dad866
58494bd
8c38543
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| 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. |
| 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 /> | ||
| </> | ||
| ) | ||
| } |
| 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> | ||
| ) | ||
| } | ||
|
|
||
|
|
| 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> | ||
| ) | ||
| } | ||
|
|
| 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" />} | ||
| </a> | ||
| ) | ||
| } | ||
|
|
||
|
|
||
| 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> | ||
| ) | ||
| } |
| 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" /> } | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same as before |
||
| </a> | ||
| ) | ||
| } | ||
| 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> | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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? |
||
| ) | ||
| } | ||
| 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) { | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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> | ||
| ) | ||
| } | ||
| 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> | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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> | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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> | ||
| ) | ||
| } | ||
|
|
||
There was a problem hiding this comment.
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?