ADD: project component

Finish Project component
This commit is contained in:
webfussel 2025-06-05 08:00:04 +02:00
parent aa4b3002c4
commit 4dbd4b3109
4 changed files with 118 additions and 156 deletions

View file

@ -17,88 +17,6 @@
align-items: center; align-items: center;
justify-content: center; justify-content: center;
flex-wrap: wrap; flex-wrap: wrap;
& > article {
flex-grow: 1;
flex-shrink: 0;
flex-basis: clamp(350px, calc(33% - 3rem), 400px);
height: 350px;
display: grid;
overflow: hidden;
& .bg {
padding: 0;
height: 350px;
width: 100%;
& img {
width: 100%;
height: 100%;
object-fit: cover;
}
}
& > * {
grid-column: 1;
grid-row: 1;
}
& > div {
display: flex;
align-items: center;
justify-content: center;
background-color: rgba(0, 0, 0, 0.88);
backdrop-filter: blur(1px);
transition: var(--transition-time);
height: 100%;
text-shadow: 0 0 5px rgba(0, 0, 0, .7);
text-align: center;
padding: 1rem;
& > main {
display: flex;
flex-direction: column;
align-items: center;
gap: 1rem;
max-height: 6rem;
overflow: hidden;
transition: var(--transition-time);
& .customer {
font-size: 1rem;
color: var(--color-white-transparent);
}
& .title {
margin-top: -1rem;
}
& ul {
gap: 1rem;
justify-content: center;
}
& a {
color: var(--color-orange);
&:hover {
color: var(--color-white);
}
}
}
&:hover {
backdrop-filter: blur(5px);
& > main {
max-height: 25rem;
}
}
}
}
} }
} }

View file

@ -1,3 +1,80 @@
.Project { .Project {
flex-grow: 1;
flex-shrink: 0;
flex-basis: clamp(350px, calc(33% - 3rem), 400px);
height: 350px;
display: grid;
overflow: hidden;
& .bg {
padding: 0;
height: 350px;
width: 100%;
& img {
width: 100%;
height: 100%;
object-fit: cover;
}
}
& > * {
grid-column: 1;
grid-row: 1;
}
& > div {
display: flex;
align-items: center;
justify-content: center;
background-color: rgba(0, 0, 0, 0.88);
backdrop-filter: blur(1px);
transition: var(--transition-time);
height: 100%;
text-shadow: 0 0 5px rgba(0, 0, 0, .7);
text-align: center;
padding: 1rem;
& > main {
display: flex;
flex-direction: column;
align-items: center;
gap: 1rem;
max-height: 6rem;
overflow: hidden;
transition: var(--transition-time);
& .customer {
font-size: 1rem;
color: var(--color-white-transparent);
}
& .title {
margin-top: -1rem;
}
& ul {
gap: 1rem;
justify-content: center;
}
& a {
color: var(--color-orange);
&:hover {
color: var(--color-white);
}
}
}
&:hover {
backdrop-filter: blur(5px);
& > main {
max-height: 25rem;
}
}
}
} }

View file

@ -1,6 +1,21 @@
<template> <template>
<article class="Project"> <article class="Project">
<div class="bg">
<img height="350" width="400" loading="lazy" :alt="title" :src="`/img/projects/${img}.webp`" aria-hidden="true"/>
</div>
<div>
<main>
<small class="customer">{{ company }}</small>
<h3 class="title">{{ title }}</h3>
<ul>
<li v-for="skill in tech">
<Technology v-bind="skill" link="" />
</li>
</ul>
<p v-for="d in desc">{{ d }}</p>
<a v-if="link" :href="link" target="_blank">Zur Seite</a>
</main>
</div>
</article> </article>
</template> </template>
@ -11,7 +26,10 @@ type Props = {
img : string img : string
company : string company : string
title : string title : string
desc : string[]
link ?: string link ?: string
tech : Skill[] tech : Skill[]
} }
defineProps<Props>()
</script> </script>

View file

@ -15,24 +15,7 @@
</div> </div>
<h2 class="margin-top-big">Projektauswahl</h2> <h2 class="margin-top-big">Projektauswahl</h2>
<div class="projects-list margin-top"> <div class="projects-list margin-top">
<article v-for="pr in projects"> <Project v-for="pr in projects" v-bind="pr" />
<div class="bg">
<img height="350" width="400" loading="lazy" :alt="pr.title" :src="pr.image" aria-hidden="true"/>
</div>
<div>
<main>
<small class="customer">{{ pr.customer }}</small>
<h3 class="title">{{ pr.title }}</h3>
<ul>
<li v-for="skill in pr.technologies">
<Technology v-bind="skill" link="" />
</li>
</ul>
<p v-for="d in pr.desc">{{ d }}</p>
<a v-if="pr.link" :href="pr.link" target="_blank">Zur {{pr.type ?? 'Seite'}}</a>
</main>
</div>
</article>
</div> </div>
</section> </section>
</template> </template>
@ -103,113 +86,79 @@ const customers = [
] ]
const projects = [ const projects = [
// {
// title: 'Kauft Körrie! App',
// customer: 'KVK Berlin',
// image: '/img/projects/koerrie_app.webp',
// desc: [
// 'Entwicklung einer Android Info-App für die Gewürzmischungen "Körrie" und passendem Zubehör.',
// 'Zusätzlich die Übertragung des Körrie-O-Mat von der Landingpage in die App mit Ergebnisverlauf.',
// ],
// technologies: [flutter, dart, android],
// link: 'https://play.google.com/store/apps/details?id=com.koerrieomat&hl=de',
// type: 'App',
// },
{ {
title: 'ProPapier', title: 'ProPapier',
customer: 'webfussel', company: 'webfussel',
image: '/img/projects/propapier.webp', img: 'propapier',
desc: [ desc: [
'Klopapier-Preise einfach vergleichen.', 'Klopapier-Preise einfach vergleichen.',
'Zahlst du zu viel für\'s Papier?', 'Zahlst du zu viel für\'s Papier?',
], ],
technologies: [nuxt, ts, pcss], tech: [nuxt, ts, pcss],
link: 'https://pro-papier.de', link: 'https://pro-papier.de',
}, },
{ {
title: 'Unterricht', title: 'Unterricht',
customer: 'SAE Institute Germany', company: 'SAE Institute Germany',
image: '/img/projects/education.webp', img: 'education',
desc: [ desc: [
'Vorbereitung und Durchführung von Unterricht in JavaScript und TypeScript.', 'Vorbereitung und Durchführung von Unterricht in JavaScript und TypeScript.',
], ],
technologies: [js, ts] tech: [js, ts]
}, },
{ {
title: 'Headless CMS & Cache', title: 'Headless CMS & Cache',
customer: 'DEKRA', company: 'DEKRA',
image: '/img/projects/dekra.webp', img: 'dekra',
desc: [ desc: [
'Anbindung an ein Headless CMS und Entwicklung der dazugehörigen Komponentenbibliothek unter Einsatz von Tailwind, sowie serverseitiges Caching.', 'Anbindung an ein Headless CMS und Entwicklung der dazugehörigen Komponentenbibliothek unter Einsatz von Tailwind, sowie serverseitiges Caching.',
], ],
technologies: [ts, nuxt, tw, njs] tech: [ts, nuxt, tw, njs]
}, },
{ {
title: 'Bounce Script', title: 'Bounce Script',
customer: 'Bounce Commerce', company: 'Bounce Commerce',
link: 'https://bounce-commerce.de', link: 'https://bounce-commerce.de',
image: '/img/projects/bounce.webp', img: 'bounce',
desc: [ desc: [
'Script zum Einbinden in Web Shops für Bounce Management.', 'Script zum Einbinden in Web Shops für Bounce Management.',
'Pures JavaScript, so klein gehalten wie möglich zur einfach Integration.', 'Pures JavaScript, so klein gehalten wie möglich zur einfach Integration.',
], ],
technologies: [js] tech: [js]
}, },
{ {
title: 'WEB.DE / GMX', title: 'WEB.DE / GMX',
customer: '1&1 Mail & Media', company: '1&1 Mail & Media',
link: 'https://web.de', link: 'https://web.de',
image: '/img/projects/webde.webp', img: 'webde',
desc: [ desc: [
'Neubau der Seiten web.de und GMX mit einem komponentenbasierten Ansatz unter Verwendung von VueJS.', 'Neubau der Seiten web.de und GMX mit einem komponentenbasierten Ansatz unter Verwendung von VueJS.',
'Optimiert für moderne Browser, während Internet Explorer in einer Extraversion angefertigt wurde.', 'Optimiert für moderne Browser, während Internet Explorer in einer Extraversion angefertigt wurde.',
], ],
technologies: [js, vue, scss] tech: [js, vue, scss]
}, },
{ {
title: 'Körrie! Landingpage', title: 'Körrie! Landingpage',
customer: 'KVK Berlin', company: 'KVK Berlin',
link: 'https://körrie.de', link: 'https://körrie.de',
image: '/img/projects/krrie.webp', img: 'krrie',
desc: [ desc: [
'Neubau der Landingpage für "Kauft Körrie!". Die Prämisse war: Kein Schnickschnack.', 'Neubau der Landingpage für "Kauft Körrie!". Die Prämisse war: Kein Schnickschnack.',
'Deshalb aufgebaut mit simplem Js, HTML und CSS', 'Deshalb aufgebaut mit simplem Js, HTML und CSS',
], ],
technologies: [html, css, js], tech: [html, css, js],
}, },
{ {
title: 'UI Tools', title: 'UI Tools',
customer: 'webfussel', company: 'webfussel',
link: 'https://uitools.webfussel.de', link: 'https://uitools.webfussel.de',
image: '/img/projects/uitools.webp', img: 'uitools',
desc: [ desc: [
'Eine kleine Sammlung an Tools für die Erstellung von UIs.', 'Eine kleine Sammlung an Tools für die Erstellung von UIs.',
'Farbpalette, Kontraste und CSS Variablen.', 'Farbpalette, Kontraste und CSS Variablen.',
'Ist in aktiver Entwicklung.', 'Ist in aktiver Entwicklung.',
], ],
technologies: [nuxt, ts, pcss] tech: [nuxt, ts, pcss]
}, },
// {
// customer: 'webfussel',
// title: 'Shnaik - Teh Gaem',
// link: 'https://shnaik.webfussel.de',
// image: '/img/projects/shnaik.webp',
// desc: [
// 'Nachbau des bekannten Spiels "Snake" für die damaligen Nokia Handys.',
// 'Meine erste Erfahrung mit Gaming Libraries und wurde eher als Experiment und Zeitvertreib angefertigt.',
// ],
// technologies: [ts, css]
// },
// {
// title: 'PixelPalette',
// customer: 'webfussel',
// link: 'https://pixelpalette.webfussel.de',
// image: '/img/projects/pp.webp',
// desc: [
// 'Ich hatte einige Tage eine Idee, wie man Grafiken mit 4 Farben - angelehnt den Gameboy - komprimieren und im Speicher unterbringen kann.',
// 'Prototypisch zum Spaß erstellt.',
// ],
// technologies: [js, html, css]
// },
] ]
</script> </script>