Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
715a10f
Stem + started on design, added a lot of files in this commit
UlrikaRakkaBrant Apr 24, 2025
edb7158
Styling Buttons and buttonCards tried to use fontawesome
UlrikaRakkaBrant Apr 26, 2025
92495ac
icon positioning, remembering theme, netlify-links
UlrikaRakkaBrant Apr 28, 2025
0e99ad5
Fixing icons. Making flexbox to move title depending on screensize.
UlrikaRakkaBrant Sep 27, 2025
15078b5
chore: remove index.css and rely on GlobalStyles
UlrikaRakkaBrant Sep 27, 2025
adb8d3f
refactor: load projects from JSON instead of hardcoded array
UlrikaRakkaBrant Sep 27, 2025
c5f5c61
chore: add netlify.toml for build settings
UlrikaRakkaBrant Sep 27, 2025
b26eaf3
style(hero): adjust image styling for responsive sizes and shape
UlrikaRakkaBrant Oct 3, 2025
f44cab6
style(projects): added project images + set responsive fixed image si…
UlrikaRakkaBrant Oct 5, 2025
4ec4976
style(projects): add light shadow around project images
UlrikaRakkaBrant Oct 5, 2025
628041e
feat(articles): mobile-first card with top image, date/title/excerpt/…
UlrikaRakkaBrant Oct 5, 2025
ca65933
style(articles): set fixed responsive image sizes (327x200 mobile, 20…
UlrikaRakkaBrant Oct 6, 2025
a9d5007
added pictures
UlrikaRakkaBrant Oct 7, 2025
7fd4924
style(articles): remove border and shadow frame from article cards
UlrikaRakkaBrant Oct 7, 2025
94b346e
remove article border ad date border
UlrikaRakkaBrant Oct 7, 2025
8feaa69
style(articles): align body with thumbnail on mobile; set exact mobil…
UlrikaRakkaBrant Oct 8, 2025
5d32f82
style(articles): make body height match thumbnail on tablet and desktop
UlrikaRakkaBrant Oct 8, 2025
b5d6b05
style(articles): align date to top and button to bottom; body fills h…
UlrikaRakkaBrant Oct 8, 2025
bbdb667
working on the aligning
UlrikaRakkaBrant Oct 8, 2025
b1f0616
style(articles): refine gutters and center cards on larger screens
UlrikaRakkaBrant Oct 8, 2025
e5a6344
Update article one
UlrikaRakkaBrant Oct 8, 2025
d7ff554
style(articles): set date tag to fixed 142x28 'Hug' style from Figma
UlrikaRakkaBrant Oct 8, 2025
78a5db5
style(articles): set ReadLink button to fixed 303x48px size across al…
UlrikaRakkaBrant Oct 8, 2025
0b8d212
added icon-library
UlrikaRakkaBrant Oct 8, 2025
f532721
style(articles): tidy spacing, fix grid rows, correct column-gap, cle…
UlrikaRakkaBrant Oct 10, 2025
8b733b5
contact icons
UlrikaRakkaBrant Oct 16, 2025
8b13253
added contact icon and read.me
UlrikaRakkaBrant Oct 16, 2025
d078516
sun favicon
UlrikaRakkaBrant Oct 16, 2025
d9679e6
netlify link to portfolio project
UlrikaRakkaBrant Oct 16, 2025
3a94154
chore(config): fix TypeScript/JS setup for styled-components and asse…
UlrikaRakkaBrant Oct 16, 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
63 changes: 63 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1 +1,64 @@
# Portfolio
https://ulrikasportfolio.netlify.app/

# 🌟 Ulrika Einebrant – Portfolio

This is my personal developer portfolio built with **React**, designed to showcase my web projects, skills, and creative work — including my theatre group, [Kompani Error](https://kompanierror.se/#/).

It’s built mobile-first and fully responsive across devices, following my custom design in Figma.

---

## 🚀 Features

- 💻 **Responsive Design** – Optimized for mobile, tablet, and desktop
- ⚛️ **Built with React** – Component-based structure for reusability and clarity
- 💅 **Styled-components** – Modern CSS-in-JS styling with theme and global styles
- 🧩 **Dynamic Content** – Projects and articles loaded from JSON data
- 🖼️ **Accessible & Inclusive** – Semantic HTML, ARIA labels, and alt text
- 🌐 **Deployed on Netlify** – Continuous deployment via GitHub
- 🎭 **Personal Touch** – Integrates creative work such as Kompani Error

---

## 🧱 Tech Stack

| Category | Technology |
|-----------|-------------|
| Frontend | React (Vite), JavaScript (ES6+), JSX |
| Styling | Styled-components, CSS Grid/Flexbox |
| Design | Figma (custom responsive design) |
| Deployment | Netlify, GitHub |
| Tools | npm, Git, VS Code |

---

## 🧠 Key Learnings

- Building and structuring a scalable React project
- Creating reusable, accessible components
- Handling responsive layouts based on Figma designs
- Using styled-components for modular styling
- Working with version control (Git) and CI/CD (Netlify)

---

## 🔗 Live Demo

👉 [View Portfolio on Netlify](https://ulrikasportfolio.netlify.app)
👉 [GitHub Repository](https://github.com/UlrikaRakkaBrant/js-project-portfolio)

---

## 🪄 Future Improvements

- Add light/dark mode toggle
- Animate transitions (Framer Motion)
- Write more articles
- Add unit tests with React Testing Library

---




5 changes: 5 additions & 0 deletions declarations.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
// declarations.d.ts
declare module '*.svg' { const src: string; export default src; }
declare module '*.png' { const src: string; export default src; }
declare module '*.jpg' { const src: string; export default src; }
declare module '*.jpeg' { const src: string; export default src; }
48 changes: 37 additions & 11 deletions index.html
Original file line number Diff line number Diff line change
@@ -1,13 +1,39 @@
<!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="icon"
type="image/svg+xml"
href="/sun.png"
/>
<meta
name="viewport"
content="width=device-width, initial-scale=1.0"
/>
<title>Ulrikas Portfolio</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:wght@300;400;500;600;700&display=swap"
rel="stylesheet"
/>
</head>

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

</html>
19 changes: 19 additions & 0 deletions jsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"compilerOptions": {
"target": "ES2020",
"module": "ESNext",
"moduleResolution": "bundler",
"jsx": "react-jsx",
"checkJs": true,
"baseUrl": "./",
"lib": [
"ES2020",
"DOM"
]
},
"include": [
"src",
"styled.d.ts",
"declarations.d.ts"
]
}
9 changes: 9 additions & 0 deletions netlify.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
[build]
command = "npm run build"
publish = "dist"

# Uncomment this later if you add React Router
# [[redirects]]
# from = "/*"
# to = "/index.html"
# status = 200
13 changes: 11 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,27 @@
"preview": "vite preview"
},
"dependencies": {
"@fontsource/poppins": "^5.2.5",
"@fortawesome/fontawesome-svg-core": "^6.7.2",
"@fortawesome/free-brands-svg-icons": "^6.7.2",
"@fortawesome/free-solid-svg-icons": "^6.7.2",
"@fortawesome/react-fontawesome": "^0.2.2",
"react": "^19.0.0",
"react-dom": "^19.0.0"
"react-dom": "^19.0.0",
"react-icons": "^5.5.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.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",
"typescript": "^5.9.3",
"vite": "^6.2.0"
}
}
Binary file added public/articles/first.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/articles/second.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/articles/third.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/projects/accessibility-quiz.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/projects/ecommerce-demo.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/projects/portfolio.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/projects/recipe-app.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/projects/weather-app.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/sun.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
48 changes: 42 additions & 6 deletions src/App.jsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,44 @@
export const App = () => {
import React from 'react';
import GlobalStyle from './styles/GlobalStyles.jsx';
import { ThemeProvider } from 'styled-components';
import { theme } from './styles/theme.jsx';
import Header from './components/Header.jsx';
import Title from './components/Title.jsx';
import Hero from './components/Hero.jsx';
import About from './components/About.jsx';
import Tech from './components/Tech.jsx';
import Projects from './components/Projects/Projects.jsx';
import Skills from './components/Skills.jsx';
import Articles from './components/Articles.jsx';
import Contact from './components/Contact.jsx';
import styled from "styled-components"

const TitleHeroContainer = styled.div`
display: flex;
flex-direction: column;

@media (min-width: ${({ theme }) => theme.breakpoints.tablet}) {
flex-direction: column-reverse;
}
`;

function 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>
</>
)
<ThemeProvider theme={theme}>
<GlobalStyle />
<Header />
<TitleHeroContainer >
<Title />
<Hero />
</TitleHeroContainer>
<About />
<Tech />
<Projects />
<Skills />
<Articles />
<Contact />
</ThemeProvider>
);
}

export default App;
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.
3 changes: 3 additions & 0 deletions src/assets/github-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 src/assets/kompani-error.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/link-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 src/assets/ulrika.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
37 changes: 37 additions & 0 deletions src/components/About.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import React from 'react';
import styled from 'styled-components';

const AboutWrapper = styled.section`
padding: 2rem 1rem;
display: flex;
flex-direction: column;
align-items: center;

@media (min-width: ${({ theme }) => theme.breakpoints.tablet}) {
padding: 4rem 2rem;
text-align: center;

}
`;

const Bio = styled.p`
max-width: 600px;
font-size: 1rem;
line-height: 1.6;
`;

const About = () => {
return (
<AboutWrapper>
<Bio>
I'm a web developer with a passion for blending creativity and technology. I create
engaging, user-friendly websites that focus on both functionality and design. My
background in theatre gives me a unique perspective, bringing storytelling and
visual creativity into every project. I’m driven by the idea of making digital
experiences that are as immersive and impactful as a great performance.
</Bio>
</AboutWrapper>
);
};

export default About;
Loading