start of services section

This commit is contained in:
Sascha 2025-08-25 17:57:39 +02:00
parent 3fbe565c17
commit c22c97b23a
8 changed files with 227 additions and 59 deletions

View File

@ -3,6 +3,7 @@ import '../scss/App.scss';
import Navbar from '../components/layout/Navigation'; import Navbar from '../components/layout/Navigation';
import HeroSection from '../components/sections/HeroSection'; import HeroSection from '../components/sections/HeroSection';
import AboutSection from '../components/sections/AboutSection'; import AboutSection from '../components/sections/AboutSection';
import ServicesSection from '../components/sections/ServicesSection';
function PortfolioApp() { function PortfolioApp() {
const [theme, setTheme] = useState<'light' | 'dark'>('light'); const [theme, setTheme] = useState<'light' | 'dark'>('light');
@ -16,7 +17,7 @@ function PortfolioApp() {
<Navbar theme={theme} setTheme={setTheme} /> <Navbar theme={theme} setTheme={setTheme} />
<HeroSection /> <HeroSection />
<AboutSection /> <AboutSection />
<h1>Aktuelles Theme: {theme} </h1> <ServicesSection />
</> </>
); );
} }

View File

@ -0,0 +1,64 @@
import { Code, Laptop, Lightbulb, Palette, Rocket, ShieldCheck } from "lucide-react";
export default function ServicesSection() {
const services = [
{
icon: <Code className="services-section__icon" />,
title: "Modern Framework Development",
description: "Building scalable, maintainable web applications using Angular and React frameworks with TypeScript and modern development practices."
},
{
icon: <Palette className="services-section__icon" />,
title: "Responsive Web Design",
description: "Creating mobile-first, responsive interfaces that provide optimal viewing experiences across all devices and screen sizes."
},
{
icon: <ShieldCheck className="services-section__icon" />,
title: "Cross-Browser Testing",
description: "Ensuring consistent functionality and appearance across all major browsers including Chrome, Firefox, Safari, and Edge."
},
{
icon: <Laptop className="services-section__icon" />,
title: "Frontend Architecture",
description: "Designing and implementing scalable frontend architectures with component-based development and modern tooling."
},
{
icon: <Lightbulb className="services-section__icon" />,
title: "Performance Optimization",
description: "Optimizing web applications for speed and efficiency through code splitting, lazy loading, and performance best practices."
},
{
icon: <Rocket className="services-section__icon" />,
title: "Testing & Quality Assurance",
description: "Implementing comprehensive testing strategies using Cypress for end-to-end testing and ensuring code quality."
}
];
return (
<section id="services" className="services-section">
<div className="services-section__container">
<div className="services-section__header">
<h2 className="services-section__title">
Services I Offer
</h2>
<p className="services-section__subtitle">
Solutions tailored to your needs
</p>
</div>
<div className="services-section__grid">
{services.map((service, index) => (
<div key={index} className="services-section__card">
<div className="services-section__card-header">
{service.icon}
<h3 className="services-section__card-title">{service.title}</h3>
</div>
<div className="services-section__card-content">
<p className="services-section__card-description">{service.description}</p>
</div>
</div>
))}
</div>
</div>
</section>
);
}

View File

@ -5,6 +5,7 @@
@use 'topbar'; @use 'topbar';
@use 'hero-section'; @use 'hero-section';
@use 'about-section'; @use 'about-section';
@use 'services-section';
// Import Geist font from Google Fonts or local files // Import Geist font from Google Fonts or local files
@import url('https://fonts.googleapis.com/css2?family=Geist:wght@100;200;300;400;500;600;700;800;900&display=swap'); @import url('https://fonts.googleapis.com/css2?family=Geist:wght@100;200;300;400;500;600;700;800;900&display=swap');
@ -27,7 +28,8 @@
} }
body { body {
font-family: 'Geist', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif; font-family: 'Geist', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI',
'Roboto', sans-serif;
background-color: var(--color-background); background-color: var(--color-background);
color: var(--color-text); color: var(--color-text);
margin: 0; // Explicitly remove body margin margin: 0; // Explicitly remove body margin
@ -35,6 +37,7 @@ body {
} }
section { section {
height: 100vh; min-height: 100vh;
padding: 1rem 1rem;
margin: 0; // Remove any section margins margin: 0; // Remove any section margins
} }

View File

@ -1,7 +1,6 @@
@use 'globals'; @use 'globals';
.about-section { .about-section {
padding: 5rem 0;
background: var(--about-background); background: var(--about-background);
&__container { &__container {

View File

@ -18,9 +18,7 @@
} }
.hero-section { .hero-section {
min-height: 100vh;
@include flex-center; @include flex-center;
padding: $spacing-xl $spacing-md;
background: var(--hero-background); background: var(--hero-background);
&__container { &__container {

View File

@ -0,0 +1,85 @@
@use 'globals';
@use 'variables' as *;
@use 'mixins' as *;
.services-section {
background: linear-gradient(135deg, #fff7ed 0%, #fee2e2 100%);
&__container {
max-width: 1120px;
margin: 0 auto;
padding: 0 $spacing-md;
}
&__header {
text-align: center;
margin-bottom: $spacing-3xl;
}
&__title {
font-size: 2.25rem;
font-weight: bold;
margin-bottom: $spacing-md;
background: linear-gradient(90deg, #ea580c 0%, #dc2626 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
color: transparent;
}
&__subtitle {
font-size: 1.25rem;
color: #6b7280;
}
&__grid {
display: grid;
grid-template-columns: 1fr;
gap: $spacing-xl;
}
&__card {
background: linear-gradient(135deg, #fff 0%, #f3f4f6 100%);
border-radius: $border-radius-lg;
box-shadow: 0 4px 24px 0 rgba(0, 0, 0, 0.07);
padding: $spacing-xl $spacing-lg;
text-align: center;
transition: box-shadow 0.3s;
border: none;
&:hover {
box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.12);
transform: translateY(-2px);
}
}
&__card-header {
display: flex;
flex-direction: column;
align-items: center;
margin-bottom: $spacing-md;
}
&__icon {
width: 2.5rem;
height: 2.5rem;
margin-bottom: $spacing-sm;
color: #ea580c;
}
&__card-title {
font-size: 1.25rem;
font-weight: 600;
margin-bottom: $spacing-xs;
}
&__card-content {
min-height: 60px;
}
&__card-description {
font-size: 1rem;
color: #6b7280;
line-height: 1.5;
}
}

View File

@ -31,11 +31,12 @@ $light-theme: (
stat-quaternary-label: #7c3aed, stat-quaternary-label: #7c3aed,
// About section colors // About section colors
about-background: linear-gradient(135deg, #f0fdf4 0%, #ecfdf5 50%, #f0fdfa 100%), about-background:
linear-gradient(135deg, #f0fdf4 0%, #ecfdf5 50%, #f0fdfa 100%),
gradient-about-title: linear-gradient(90deg, #059669, #0d9488), gradient-about-title: linear-gradient(90deg, #059669, #0d9488),
about-greeting-color: #047857, about-greeting-color: #047857,
gradient-image-overlay: linear-gradient(45deg, rgba(59, 130, 246, 0.2), rgba(147, 51, 234, 0.2)), gradient-image-overlay:
linear-gradient(45deg, rgba(59, 130, 246, 0.2), rgba(147, 51, 234, 0.2)),
// Skill badge colors using visual hierarchy // Skill badge colors using visual hierarchy
skill-badge-primary-bg: #dbeafe, skill-badge-primary-bg: #dbeafe,
skill-badge-primary-text: #1e40af, skill-badge-primary-text: #1e40af,
@ -50,7 +51,6 @@ $light-theme: (
feature-card-primary-bg: linear-gradient(135deg, #dbeafe, #bfdbfe), feature-card-primary-bg: linear-gradient(135deg, #dbeafe, #bfdbfe),
feature-card-secondary-bg: linear-gradient(135deg, #e9d5ff, #ddd6fe), feature-card-secondary-bg: linear-gradient(135deg, #e9d5ff, #ddd6fe),
feature-card-tertiary-bg: linear-gradient(135deg, #ccfbf1, #99f6e4), feature-card-tertiary-bg: linear-gradient(135deg, #ccfbf1, #99f6e4),
feature-icon-primary: #2563eb, feature-icon-primary: #2563eb,
feature-icon-secondary: #9333ea, feature-icon-secondary: #9333ea,
feature-icon-tertiary: #0d9488, feature-icon-tertiary: #0d9488,
@ -66,7 +66,7 @@ $light-theme: (
// Shadow variables // Shadow variables
box-shadow-sm: #{$shadow-sm}, box-shadow-sm: #{$shadow-sm},
box-shadow-md: #{$shadow-md}, box-shadow-md: #{$shadow-md},
box-shadow-lg: #{$shadow-lg} box-shadow-lg: #{$shadow-lg},
); );
// Dark Theme Colors // Dark Theme Colors
@ -82,28 +82,37 @@ $dark-theme: (
gradient-text: $gradient-text, gradient-text: $gradient-text,
// Stat colors using visual hierarchy // Stat colors using visual hierarchy
stat-primary-bg: linear-gradient(135deg, rgba(30, 58, 138, 0.3), rgba(30, 64, 175, 0.3)), stat-primary-bg:
linear-gradient(135deg, rgba(30, 58, 138, 0.3), rgba(30, 64, 175, 0.3)),
stat-primary-value: #2563eb, stat-primary-value: #2563eb,
stat-primary-label: #93c5fd, stat-primary-label: #93c5fd,
stat-secondary-bg: linear-gradient(135deg, rgba(20, 83, 45, 0.3), rgba(22, 101, 52, 0.3)), stat-secondary-bg:
linear-gradient(135deg, rgba(20, 83, 45, 0.3), rgba(22, 101, 52, 0.3)),
stat-secondary-value: #16a34a, stat-secondary-value: #16a34a,
stat-secondary-label: #86efac, stat-secondary-label: #86efac,
stat-tertiary-bg: linear-gradient(135deg, rgba(19, 78, 74, 0.3), rgba(17, 94, 89, 0.3)), stat-tertiary-bg:
linear-gradient(135deg, rgba(19, 78, 74, 0.3), rgba(17, 94, 89, 0.3)),
stat-tertiary-value: #0d9488, stat-tertiary-value: #0d9488,
stat-tertiary-label: #5eead4, stat-tertiary-label: #5eead4,
stat-quaternary-bg: linear-gradient(135deg, rgba(88, 28, 135, 0.3), rgba(107, 33, 168, 0.3)), stat-quaternary-bg:
linear-gradient(135deg, rgba(88, 28, 135, 0.3), rgba(107, 33, 168, 0.3)),
stat-quaternary-value: #9333ea, stat-quaternary-value: #9333ea,
stat-quaternary-label: #c4b5fd, stat-quaternary-label: #c4b5fd,
// About section colors // About section colors
about-background: linear-gradient(135deg, rgba(20, 83, 45, 0.2) 0%, rgba(6, 78, 59, 0.2) 100%), about-background:
linear-gradient(
135deg,
rgba(20, 83, 45, 0.2) 0%,
rgba(6, 78, 59, 0.2) 100%
),
gradient-about-title: linear-gradient(90deg, #10b981, #14b8a6), gradient-about-title: linear-gradient(90deg, #10b981, #14b8a6),
about-greeting-color: #34d399, about-greeting-color: #34d399,
gradient-image-overlay: linear-gradient(45deg, rgba(59, 130, 246, 0.2), rgba(147, 51, 234, 0.2)), gradient-image-overlay:
linear-gradient(45deg, rgba(59, 130, 246, 0.2), rgba(147, 51, 234, 0.2)),
// Skill badge colors using visual hierarchy // Skill badge colors using visual hierarchy
skill-badge-primary-bg: rgba(30, 58, 138, 0.3), skill-badge-primary-bg: rgba(30, 58, 138, 0.3),
skill-badge-primary-text: #93c5fd, skill-badge-primary-text: #93c5fd,
@ -115,10 +124,12 @@ $dark-theme: (
skill-badge-quaternary-text: #fdba74, skill-badge-quaternary-text: #fdba74,
// Feature card colors using visual hierarchy // Feature card colors using visual hierarchy
feature-card-primary-bg: linear-gradient(135deg, rgba(30, 58, 138, 0.3), rgba(30, 64, 175, 0.3)), feature-card-primary-bg:
feature-card-secondary-bg: linear-gradient(135deg, rgba(88, 28, 135, 0.3), rgba(107, 33, 168, 0.3)), linear-gradient(135deg, rgba(30, 58, 138, 0.3), rgba(30, 64, 175, 0.3)),
feature-card-tertiary-bg: linear-gradient(135deg, rgba(19, 78, 74, 0.3), rgba(17, 94, 89, 0.3)), feature-card-secondary-bg:
linear-gradient(135deg, rgba(88, 28, 135, 0.3), rgba(107, 33, 168, 0.3)),
feature-card-tertiary-bg:
linear-gradient(135deg, rgba(19, 78, 74, 0.3), rgba(17, 94, 89, 0.3)),
feature-icon-primary: #3b82f6, feature-icon-primary: #3b82f6,
feature-icon-secondary: #a855f7, feature-icon-secondary: #a855f7,
feature-icon-tertiary: #14b8a6, feature-icon-tertiary: #14b8a6,
@ -134,7 +145,7 @@ $dark-theme: (
// Shadow variables // Shadow variables
box-shadow-sm: #{$shadow-sm}, box-shadow-sm: #{$shadow-sm},
box-shadow-md: #{$shadow-md}, box-shadow-md: #{$shadow-md},
box-shadow-lg: #{$shadow-lg} box-shadow-lg: #{$shadow-lg},
); );
// Mixin: SCSS-Map CSS-Variables // Mixin: SCSS-Map CSS-Variables
@ -196,8 +207,14 @@ $dark-theme: (
--feature-title-tertiary: #{map.get($theme, feature-title-tertiary)}; --feature-title-tertiary: #{map.get($theme, feature-title-tertiary)};
--feature-description-primary: #{map.get($theme, feature-description-primary)}; --feature-description-primary: #{map.get($theme, feature-description-primary)};
--feature-description-secondary: #{map.get($theme, feature-description-secondary)}; --feature-description-secondary: #{map.get(
--feature-description-tertiary: #{map.get($theme, feature-description-tertiary)}; $theme,
feature-description-secondary
)};
--feature-description-tertiary: #{map.get(
$theme,
feature-description-tertiary
)};
// Shadow variables // Shadow variables
--box-shadow-sm: #{map.get($theme, box-shadow-sm)} var(--box-shadow-hover); --box-shadow-sm: #{map.get($theme, box-shadow-sm)} var(--box-shadow-hover);

View File

@ -14,6 +14,7 @@ $shadow-lg: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
// Border radius variables // Border radius variables
$border-radius-sm: 0.375rem; $border-radius-sm: 0.375rem;
$border-radius-md: 0.5rem; $border-radius-md: 0.5rem;
$border-radius-lg: 1rem;
$border-radius-full: 9999px; $border-radius-full: 9999px;
// Spacing variables // Spacing variables