<!DOCTYPE html>
<html lang="nl">
<head>
<meta charset="UTF-8">
<title>Portfolio</title>
</head>
<html lang="nl">
<head>
<meta charset="UTF-8">
<title>Portfolio</title>
</head>
<nav class="navbar">
<a href="#home">Home</a>
<a href="#projects">Projects</a>
<a href="#contact">Contact</a>
</nav>
<a href="#home">Home</a>
<a href="#projects">Projects</a>
<a href="#contact">Contact</a>
</nav>
<header class="hero">
<h1>Developer</h1>
<p>Full Stack Developer</p>
</header>
<h1>Developer</h1>
<p>Full Stack Developer</p>
</header>
<section id="projects">
<div class="container">
<article class="card"></article>
</div>
</section>
<div class="container">
<article class="card"></article>
</div>
</section>
<form class="contact-form">
<input type="text" placeholder="Name">
<input type="email" placeholder="Email">
<button>Submit</button>
</form>
<input type="text" placeholder="Name">
<input type="email" placeholder="Email">
<button>Submit</button>
</form>
<footer class="footer">
<div class="social-links">
<a href="#">GitHub</a>
<a href="#">LinkedIn</a>
</div>
</footer>
<div class="social-links">
<a href="#">GitHub</a>
<a href="#">LinkedIn</a>
</div>
</footer>
<div class="project-grid">
<div class="project-card">
<img src="project.jpg" alt="Project">
<h3>Project Title</h3>
</div>
</div>
<div class="project-card">
<img src="project.jpg" alt="Project">
<h3>Project Title</h3>
</div>
</div>
<main class="main-content">
<section id="about">
<h2>About Me</h2>
<p>My journey...</p>
</section>
</main>
<section id="about">
<h2>About Me</h2>
<p>My journey...</p>
</section>
</main>
<aside class="sidebar">
<div class="skills">
<h3>Skills</h3>
<ul>
<li>JavaScript</li>
</ul>
</div>
</aside>
<div class="skills">
<h3>Skills</h3>
<ul>
<li>JavaScript</li>
</ul>
</div>
</aside>
<!DOCTYPE html>
<html>
<body>
<div id="root"></div>
<script src="app.js"></script>
</body>
</html>
<html>
<body>
<div id="root"></div>
<script src="app.js"></script>
</body>
</html>
.navbar {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem 2rem;
}
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem 2rem;
}
.project-card {
background: white;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
transition: transform 0.3s ease;
}
background: white;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
transition: transform 0.3s ease;
}
@media (max-width: 768px) {
.navbar {
flex-direction: column;
gap: 1rem;
}
}
.navbar {
flex-direction: column;
gap: 1rem;
}
}
:root {
--primary-color: #48182F;
--secondary-color: #6d2747;
--text-color: #333;
--bg-color: #f8f9fa;
}
--primary-color: #48182F;
--secondary-color: #6d2747;
--text-color: #333;
--bg-color: #f8f9fa;
}
.btn-primary {
background: var(--primary-color);
color: white;
padding: 12px 24px;
border: none;
border-radius: 4px;
}
background: var(--primary-color);
color: white;
padding: 12px 24px;
border: none;
border-radius: 4px;
}
.hero {
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
}
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
}
.grid-container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 2rem;
padding: 2rem;
}
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 2rem;
padding: 2rem;
}
.card:hover {
transform: translateY(-5px);
box-shadow: 0 8px 25px rgba(0,0,0,0.15);
}
transform: translateY(-5px);
box-shadow: 0 8px 25px rgba(0,0,0,0.15);
}
const projects = [
{
name: "E-commerce",
tech: ["React", "Node.js"],
featured: true
}
];
{
name: "E-commerce",
tech: ["React", "Node.js"],
featured: true
}
];
function fetchProjects() {
return fetch('/api/projects')
.then(response => response.json())
.then(data => data.projects);
}
return fetch('/api/projects')
.then(response => response.json())
.then(data => data.projects);
}
class Project {
constructor(name, technologies) {
this.name = name;
this.technologies = technologies;
}
}
constructor(name, technologies) {
this.name = name;
this.technologies = technologies;
}
}
const featuredProjects = projects
.filter(project => project.featured)
.map(project => ({
...project,
slug: project.name.toLowerCase()
}));
.filter(project => project.featured)
.map(project => ({
...project,
slug: project.name.toLowerCase()
}));
document.addEventListener('DOMContentLoaded', () => {
const navbar = document.querySelector('.navbar');
window.addEventListener('scroll', () => {
navbar.classList.toggle('scrolled', window.scrollY > 100);
});
});
const navbar = document.querySelector('.navbar');
window.addEventListener('scroll', () => {
navbar.classList.toggle('scrolled', window.scrollY > 100);
});
});
async function loadProjects() {
try {
const response = await fetch('/api/projects');
const projects = await response.json();
return projects;
} catch (error) {
console.error('Failed to load projects:', error);
}
}
try {
const response = await fetch('/api/projects');
const projects = await response.json();
return projects;
} catch (error) {
console.error('Failed to load projects:', error);
}
}
const projectService = {
getAll: () => fetch('/api/projects'),
getById: (id) => fetch(`/api/projects/${id}`),
create: (project) => fetch('/api/projects', {
method: 'POST',
body: JSON.stringify(project)
})
};
getAll: () => fetch('/api/projects'),
getById: (id) => fetch(`/api/projects/${id}`),
create: (project) => fetch('/api/projects', {
method: 'POST',
body: JSON.stringify(project)
})
};
const debounce = (func, wait) => {
let timeout;
return function executedFunction(...args) {
clearTimeout(timeout);
timeout = setTimeout(() => func(...args), wait);
};
};
let timeout;
return function executedFunction(...args) {
clearTimeout(timeout);
timeout = setTimeout(() => func(...args), wait);
};
};
import React, { useState, useEffect } from 'react';
const ProjectList = () => {
const [projects, setProjects] = useState([]);
useEffect(() => { fetchProjects(); }, []);
return (<div>{projects.map(renderProject)}</div>);
};
const ProjectList = () => {
const [projects, setProjects] = useState([]);
useEffect(() => { fetchProjects(); }, []);
return (<div>{projects.map(renderProject)}</div>);
};
const ProjectCard = ({ project }) => {
return (
<div className="project-card">
<h3>{project.title}</h3>
<p>{project.description}</p>
</div>
);
};
return (
<div className="project-card">
<h3>{project.title}</h3>
<p>{project.description}</p>
</div>
);
};
import { createContext, useContext } from 'react';
const PortfolioContext = createContext();
export const usePortfolio = () => useContext(PortfolioContext);
const PortfolioContext = createContext();
export const usePortfolio = () => useContext(PortfolioContext);
const useProjects = () => {
const [projects, setProjects] = useState([]);
const [loading, setLoading] = useState(true);
useEffect(() => { loadProjects(); }, []);
return { projects, loading };
};
const [projects, setProjects] = useState([]);
const [loading, setLoading] = useState(true);
useEffect(() => { loadProjects(); }, []);
return { projects, loading };
};
const ProjectGrid = () => {
const { projects, loading } = useProjects();
if (loading) return <div>Loading...</div>;
return (
<div className="grid">
{projects.map(project => (
<ProjectCard key={project.id} project={project} />
))}
</div>
);
};
const { projects, loading } = useProjects();
if (loading) return <div>Loading...</div>;
return (
<div className="grid">
{projects.map(project => (
<ProjectCard key={project.id} project={project} />
))}
</div>
);
};
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
const App = () => (
<Router>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/projects" element={<Projects />} />
</Routes>
</Router>
);
const App = () => (
<Router>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/projects" element={<Projects />} />
</Routes>
</Router>
);
@RestController
public class ProjectController {
@GetMapping("/api/projects")
public List<Project> getProjects() {
return projectService.findAll();
}
}
public class ProjectController {
@GetMapping("/api/projects")
public List<Project> getProjects() {
return projectService.findAll();
}
}
@Entity
@Table(name = "projects")
public class Project {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
}
@Table(name = "projects")
public class Project {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
}
@Service
public class ProjectService {
@Autowired
private ProjectRepository repository;
public List<Project> findFeaturedProjects() {
return repository.findByFeaturedTrue();
}
}
public class ProjectService {
@Autowired
private ProjectRepository repository;
public List<Project> findFeaturedProjects() {
return repository.findByFeaturedTrue();
}
}
public interface ProjectRepository
extends JpaRepository<Project, Long> {
List<Project> findByFeaturedTrue();
List<Project> findByTechnologiesContaining(String tech);
}
extends JpaRepository<Project, Long> {
List<Project> findByFeaturedTrue();
List<Project> findByTechnologiesContaining(String tech);
}
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
return http.csrf().disable().build();
}
}
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
return http.csrf().disable().build();
}
}
@SpringBootApplication
public class PortfolioApplication {
public static void main(String[] args) {
SpringApplication.run(PortfolioApplication.class, args);
}
}
public class PortfolioApplication {
public static void main(String[] args) {
SpringApplication.run(PortfolioApplication.class, args);
}
}
SELECT name, description, created_at
FROM projects
WHERE featured = true
ORDER BY created_at DESC
LIMIT 6;
FROM projects
WHERE featured = true
ORDER BY created_at DESC
LIMIT 6;
INSERT INTO projects (name, description, featured)
VALUES ('Portfolio Website', 'Personal portfolio site', true);
VALUES ('Portfolio Website', 'Personal portfolio site', true);
CREATE TABLE projects (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
description TEXT,
featured BOOLEAN DEFAULT false,
created_at TIMESTAMP DEFAULT NOW()
);
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
description TEXT,
featured BOOLEAN DEFAULT false,
created_at TIMESTAMP DEFAULT NOW()
);
SELECT p.name, COUNT(s.id) as skills_count
FROM projects p
LEFT JOIN project_skills ps ON p.id = ps.project_id
LEFT JOIN skills s ON ps.skill_id = s.id
GROUP BY p.id, p.name;
FROM projects p
LEFT JOIN project_skills ps ON p.id = ps.project_id
LEFT JOIN skills s ON ps.skill_id = s.id
GROUP BY p.id, p.name;
describe('Project Page', () => {
it('should display projects', () => {
cy.visit('/projects');
cy.get('.project-card').should('have.length.at.least', 1);
});
});
it('should display projects', () => {
cy.visit('/projects');
cy.get('.project-card').should('have.length.at.least', 1);
});
});
it('should filter projects by technology', () => {
cy.get('[data-testid="filter-react"]').click();
cy.get('.project-card').each($card => {
expect($card).to.contain('React');
});
});
cy.get('[data-testid="filter-react"]').click();
cy.get('.project-card').each($card => {
expect($card).to.contain('React');
});
});
describe('Navigation', () => {
beforeEach(() => {
cy.visit('/');
});
it('should navigate to projects page', () => {
cy.get('nav a[href="/projects"]').click();
cy.url().should('include', '/projects');
});
});
beforeEach(() => {
cy.visit('/');
});
it('should navigate to projects page', () => {
cy.get('nav a[href="/projects"]').click();
cy.url().should('include', '/projects');
});
});
#!/bin/bash
# Build and deploy script
npm run build
git add .
git commit -m "Deploy: $(date)"
git push origin main
# Build and deploy script
npm run build
git add .
git commit -m "Deploy: $(date)"
git push origin main
#!/bin/bash
# Database backup script
pg_dump mydatabase > backup_$(date +%Y%m%d).sql
gzip backup_$(date +%Y%m%d).sql
echo "Backup completed"
# Database backup script
pg_dump mydatabase > backup_$(date +%Y%m%d).sql
gzip backup_$(date +%Y%m%d).sql
echo "Backup completed"
#!/bin/bash
# Server deployment
ssh user@server 'cd /app && git pull && npm install && pm2 restart app'
# Server deployment
ssh user@server 'cd /app && git pull && npm install && pm2 restart app'
public partial class MainWindow : Window
{
public ObservableCollection<Project> Projects { get; set; }
public MainWindow()
{
InitializeComponent();
DataContext = this;
}
}
{
public ObservableCollection<Project> Projects { get; set; }
public MainWindow()
{
InitializeComponent();
DataContext = this;
}
}
<Window x:Class="Portfolio.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Grid>
<ListBox ItemsSource="{Binding Projects}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</Window>
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Grid>
<ListBox ItemsSource="{Binding Projects}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</Window>
<section class="greeting">
<h2> Hey, I'm tiillouy. Take a look and let's connect </h2>
</section>