Compare commits
2 Commits
ed12465263
...
8647da389d
| Author | SHA1 | Date | |
|---|---|---|---|
| 8647da389d | |||
| 9bc15030b3 |
@@ -23,6 +23,14 @@
|
|||||||
link: "/art/music",
|
link: "/art/music",
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
function getBannerSrc(p: Project): string {
|
||||||
|
if (p.banner.startsWith("/")) {
|
||||||
|
return p.banner;
|
||||||
|
} else {
|
||||||
|
return `${p.category}/${p.id}/${p.banner}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<svelte:head>
|
<svelte:head>
|
||||||
@@ -65,11 +73,21 @@
|
|||||||
|
|
||||||
{#snippet projectContent(p: Project)}
|
{#snippet projectContent(p: Project)}
|
||||||
<div class="project-content-container">
|
<div class="project-content-container">
|
||||||
<img class="project-banner" src={p.banner} alt={p.bannerAlt}>
|
<img class="project-banner" src={getBannerSrc(p)} alt={p.bannerAlt}>
|
||||||
<div class="project-text-container">
|
<div class="project-text-container">
|
||||||
<p class="project-title">{p.title}</p>
|
<div class="project-text-left">
|
||||||
<p class="project-subtitle">{p.subtitle}</p>
|
<p class="project-title">
|
||||||
<p class="project-date">{p.date}</p>
|
{#if p.isHighlight}
|
||||||
|
✿
|
||||||
|
{/if}
|
||||||
|
{p.title}
|
||||||
|
</p>
|
||||||
|
<p class="project-subtitle">{p.subtitle}</p>
|
||||||
|
<p class="project-date">{p.date}</p>
|
||||||
|
</div>
|
||||||
|
<div class="project-text-right">
|
||||||
|
<p class="project-category">{p.category}</p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{/snippet}
|
{/snippet}
|
||||||
@@ -107,20 +125,23 @@
|
|||||||
|
|
||||||
<style>
|
<style>
|
||||||
.project-container {
|
.project-container {
|
||||||
display: grid;
|
display: flex;
|
||||||
/* grid-template-columns: 1fr 1fr; */
|
/* grid-template-columns: 1fr 1fr; */
|
||||||
grid-template-columns: 1fr;
|
/* grid-template-columns: 1fr; */
|
||||||
gap: 4px;
|
gap: 4px;
|
||||||
|
margin: 0 auto;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: stretch;
|
||||||
}
|
}
|
||||||
|
|
||||||
.project-wrapper {
|
.project-wrapper {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
/* border-radius: var(--border-radius); */
|
|
||||||
/* gap: 4px; */
|
/* gap: 4px; */
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
|
transition: border-radius var(--duration-animation) var(--anim-curve);
|
||||||
}
|
}
|
||||||
|
|
||||||
.project-content-container {
|
.project-content-container {
|
||||||
@@ -136,7 +157,7 @@
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
z-index: -1;
|
z-index: -1;
|
||||||
filter: brightness(60%) saturate(40%) blur(4px);
|
filter: brightness(40%) saturate(40%) blur(1px);
|
||||||
transition: filter var(--duration-animation) var(--anim-curve);
|
transition: filter var(--duration-animation) var(--anim-curve);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,8 +165,16 @@
|
|||||||
filter: brightness(60%) saturate(100%) blur(0);
|
filter: brightness(60%) saturate(100%) blur(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.project-wrapper:hover {
|
||||||
|
border-radius: var(--border-radius);
|
||||||
|
}
|
||||||
|
|
||||||
.project-text-container {
|
.project-text-container {
|
||||||
padding: 8px 16px;
|
padding: 16px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: end;
|
||||||
}
|
}
|
||||||
|
|
||||||
.project-text-container p {
|
.project-text-container p {
|
||||||
@@ -153,9 +182,14 @@
|
|||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.project-highlight-marker {
|
||||||
|
color: aqua;
|
||||||
|
}
|
||||||
|
|
||||||
.project-title {
|
.project-title {
|
||||||
font-family: var(--font-mono);
|
font-family: var(--font-mono);
|
||||||
font-size: 1.4rem;
|
font-size: 1.5rem;
|
||||||
|
line-height: 1.8rem;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -168,6 +202,24 @@
|
|||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.project-category {
|
||||||
|
font-family: var(--font-mono);
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 1.0rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 800px) {
|
||||||
|
.project-title {
|
||||||
|
font-size: 1.3rem;
|
||||||
|
line-height: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.project-subtitle, .project-date, .project-category {
|
||||||
|
font-size: 1.0rem;
|
||||||
|
line-height: 1.4rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* .project-subtitle {
|
/* .project-subtitle {
|
||||||
font-family: var(--font-mono);
|
font-family: var(--font-mono);
|
||||||
|
|||||||
@@ -49,6 +49,7 @@
|
|||||||
color: var(--color-text);
|
color: var(--color-text);
|
||||||
padding: 4px 12px;
|
padding: 4px 12px;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
font-weight: 600;
|
||||||
|
|
||||||
border-top: var(--border-style) var(--border-dash-size) var(--color-highlight-alt);
|
border-top: var(--border-style) var(--border-dash-size) var(--color-highlight-alt);
|
||||||
border-bottom: var(--border-style) var(--border-dash-size) var(--color-highlight-alt);
|
border-bottom: var(--border-style) var(--border-dash-size) var(--color-highlight-alt);
|
||||||
|
|||||||
@@ -3,17 +3,8 @@ import { projects, type Project } from '../../projects2';
|
|||||||
export async function load({ params }) {
|
export async function load({ params }) {
|
||||||
const post = await import(`../../${params.category}/${params.id}.md`);
|
const post = await import(`../../${params.category}/${params.id}.md`);
|
||||||
|
|
||||||
// const tag: string = `${params.year}/${params.date}`; // link to the page. not to be confused with tags. i know it's confusing naming
|
const projectDetails: Project = projects.find((p: Project) => p.category.toString() == params.category.toString() && p.id == params.id)!;
|
||||||
const projectDetails = projects.find((p: Project) => p.category.toString() == params.category.toString() && p.id == params.id);
|
|
||||||
const content = post.default;
|
const content = post.default;
|
||||||
// const title: string = postValues?.title ?? "";
|
|
||||||
// const subtitle: string = postValues?.subtitle ?? "";
|
|
||||||
// const date: string = postValues?.date ?? "";
|
|
||||||
// const dateUpdated: string = postValues?.dateUpdated ?? "";
|
|
||||||
// const time: string = postValues?.time ?? "";
|
|
||||||
// const banner: string = postValues?.banner ?? "";
|
|
||||||
// const description: string = postValues?.description ?? "";
|
|
||||||
// const tags: BlogPostTag[] = postValues?.tags ?? []; // blog post tags. should be renamed 'keywords'
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
content,
|
content,
|
||||||
|
|||||||
@@ -9,8 +9,10 @@ export interface Project {
|
|||||||
description: string;
|
description: string;
|
||||||
isOngoing: boolean; // whether the project is currently active (true) or a past project (false)
|
isOngoing: boolean; // whether the project is currently active (true) or a past project (false)
|
||||||
date: string;
|
date: string;
|
||||||
|
dateUpdated?: string;
|
||||||
status: ProjectStatus;
|
status: ProjectStatus;
|
||||||
links: Link[]; // may pass an empty array
|
links: Link[]; // may pass an empty array
|
||||||
|
isHighlight?: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
export interface Link {
|
export interface Link {
|
||||||
@@ -63,7 +65,7 @@ export const projects: Project[] = [
|
|||||||
banner: "/projects/projectn5/banner2.webp",
|
banner: "/projects/projectn5/banner2.webp",
|
||||||
bannerAlt: "",
|
bannerAlt: "",
|
||||||
title: "Homesick",
|
title: "Homesick",
|
||||||
subtitle: "",
|
subtitle: "my main video game project",
|
||||||
description: "",
|
description: "",
|
||||||
isOngoing: true,
|
isOngoing: true,
|
||||||
date: "September 2023 – now",
|
date: "September 2023 – now",
|
||||||
@@ -82,6 +84,7 @@ export const projects: Project[] = [
|
|||||||
// link: "https://files.natconf.dev/public/projectn5",
|
// link: "https://files.natconf.dev/public/projectn5",
|
||||||
// },
|
// },
|
||||||
],
|
],
|
||||||
|
isHighlight: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
// 2026
|
// 2026
|
||||||
@@ -126,7 +129,7 @@ export const projects: Project[] = [
|
|||||||
{
|
{
|
||||||
category: ProjectCategory.GAMES,
|
category: ProjectCategory.GAMES,
|
||||||
id: "magician",
|
id: "magician",
|
||||||
banner: "/projects/magician/banner.webp",
|
banner: "banner.webp",
|
||||||
bannerAlt: "",
|
bannerAlt: "",
|
||||||
title: "Magician",
|
title: "Magician",
|
||||||
subtitle: "Online Multiplayer Card Game",
|
subtitle: "Online Multiplayer Card Game",
|
||||||
@@ -144,10 +147,10 @@ export const projects: Project[] = [
|
|||||||
{
|
{
|
||||||
category: ProjectCategory.GAMES,
|
category: ProjectCategory.GAMES,
|
||||||
id: "projektike",
|
id: "projektike",
|
||||||
banner: "/projects/projektike/banner.webp",
|
banner: "banner.webp",
|
||||||
bannerAlt: "",
|
bannerAlt: "",
|
||||||
title: "Projektike",
|
title: "Projektike",
|
||||||
subtitle: "PvP Game",
|
subtitle: "Local PvP Game",
|
||||||
description: "",
|
description: "",
|
||||||
isOngoing: false,
|
isOngoing: false,
|
||||||
date: "August 2024 – May 2025",
|
date: "August 2024 – May 2025",
|
||||||
@@ -160,7 +163,7 @@ export const projects: Project[] = [
|
|||||||
{
|
{
|
||||||
category: ProjectCategory.ELECTRONICS,
|
category: ProjectCategory.ELECTRONICS,
|
||||||
id: "3ds-usb-c",
|
id: "3ds-usb-c",
|
||||||
banner: "",
|
banner: "finished.webp",
|
||||||
bannerAlt: "",
|
bannerAlt: "",
|
||||||
title: "3DS USB-C mod",
|
title: "3DS USB-C mod",
|
||||||
subtitle: "DIY charging port mod",
|
subtitle: "DIY charging port mod",
|
||||||
@@ -196,7 +199,7 @@ export const projects: Project[] = [
|
|||||||
{
|
{
|
||||||
category: ProjectCategory.ELECTRONICS,
|
category: ProjectCategory.ELECTRONICS,
|
||||||
id: "deej0461",
|
id: "deej0461",
|
||||||
banner: "",
|
banner: "finished.webp",
|
||||||
bannerAlt: "",
|
bannerAlt: "",
|
||||||
title: "deej0461",
|
title: "deej0461",
|
||||||
subtitle: "PC companion audio source controller",
|
subtitle: "PC companion audio source controller",
|
||||||
@@ -210,7 +213,7 @@ export const projects: Project[] = [
|
|||||||
{
|
{
|
||||||
category: ProjectCategory.APPS,
|
category: ProjectCategory.APPS,
|
||||||
id: "weserplaner",
|
id: "weserplaner",
|
||||||
banner: "/projects/weserplaner/banner.webp",
|
banner: "banner.webp",
|
||||||
bannerAlt: "",
|
bannerAlt: "",
|
||||||
title: "WeserPlaner",
|
title: "WeserPlaner",
|
||||||
subtitle: "University Timetable & Canteen Info App",
|
subtitle: "University Timetable & Canteen Info App",
|
||||||
@@ -234,7 +237,7 @@ export const projects: Project[] = [
|
|||||||
{
|
{
|
||||||
category: ProjectCategory.APPS,
|
category: ProjectCategory.APPS,
|
||||||
id: "textbasic",
|
id: "textbasic",
|
||||||
banner: "",
|
banner: "icon.webp",
|
||||||
bannerAlt: "",
|
bannerAlt: "",
|
||||||
title: "Text Basic",
|
title: "Text Basic",
|
||||||
subtitle: "Extremely Basic Text Widget App",
|
subtitle: "Extremely Basic Text Widget App",
|
||||||
@@ -256,7 +259,7 @@ export const projects: Project[] = [
|
|||||||
{
|
{
|
||||||
category: ProjectCategory.GAMES,
|
category: ProjectCategory.GAMES,
|
||||||
id: "swordsnstuff",
|
id: "swordsnstuff",
|
||||||
banner: "/projects/swordsnstuff/banner.webp",
|
banner: "banner.webp",
|
||||||
bannerAlt: "",
|
bannerAlt: "",
|
||||||
title: "Swords & Stuff",
|
title: "Swords & Stuff",
|
||||||
subtitle: "Unity 2D RPG",
|
subtitle: "Unity 2D RPG",
|
||||||
@@ -274,7 +277,7 @@ export const projects: Project[] = [
|
|||||||
{
|
{
|
||||||
category: ProjectCategory.GAMES,
|
category: ProjectCategory.GAMES,
|
||||||
id: "tads",
|
id: "tads",
|
||||||
banner: "/projects/tads/banner.webp",
|
banner: "banner.webp",
|
||||||
bannerAlt: "",
|
bannerAlt: "",
|
||||||
title: "Totally Accurate Dating Simulator",
|
title: "Totally Accurate Dating Simulator",
|
||||||
subtitle: "HTML Text Adventure",
|
subtitle: "HTML Text Adventure",
|
||||||
@@ -298,7 +301,7 @@ export const projects: Project[] = [
|
|||||||
{
|
{
|
||||||
category: ProjectCategory.MUSIC,
|
category: ProjectCategory.MUSIC,
|
||||||
id: "dreamworld",
|
id: "dreamworld",
|
||||||
banner: "/projects/dreamworld/banner.webp",
|
banner: "banner.webp",
|
||||||
bannerAlt: "",
|
bannerAlt: "",
|
||||||
title: "Dreamworld",
|
title: "Dreamworld",
|
||||||
subtitle: "My First Album",
|
subtitle: "My First Album",
|
||||||
@@ -318,7 +321,7 @@ export const projects: Project[] = [
|
|||||||
{
|
{
|
||||||
category: ProjectCategory.APPS,
|
category: ProjectCategory.APPS,
|
||||||
id: "qwark",
|
id: "qwark",
|
||||||
banner: "",
|
banner: "icon.webp",
|
||||||
bannerAlt: "",
|
bannerAlt: "",
|
||||||
title: "Qwark Grade Log",
|
title: "Qwark Grade Log",
|
||||||
subtitle: "Grade Logging App",
|
subtitle: "Grade Logging App",
|
||||||
@@ -336,7 +339,7 @@ export const projects: Project[] = [
|
|||||||
{
|
{
|
||||||
category: ProjectCategory.APPS,
|
category: ProjectCategory.APPS,
|
||||||
id: "avhplan",
|
id: "avhplan",
|
||||||
banner: "",
|
banner: "icon.webp",
|
||||||
bannerAlt: "",
|
bannerAlt: "",
|
||||||
title: "AvH-Vertretungsplan",
|
title: "AvH-Vertretungsplan",
|
||||||
subtitle: "Substitution Plan App",
|
subtitle: "Substitution Plan App",
|
||||||
@@ -360,10 +363,10 @@ export const projects: Project[] = [
|
|||||||
{
|
{
|
||||||
category: ProjectCategory.MUSIC,
|
category: ProjectCategory.MUSIC,
|
||||||
id: "anewbeginning",
|
id: "anewbeginning",
|
||||||
banner: "",
|
banner: "cover.webp",
|
||||||
bannerAlt: "",
|
bannerAlt: "",
|
||||||
title: "A New Beginning",
|
title: "A New Beginning",
|
||||||
subtitle: "",
|
subtitle: "Coming-of-age EP",
|
||||||
description: "",
|
description: "",
|
||||||
isOngoing: false,
|
isOngoing: false,
|
||||||
date: "May – August 2018",
|
date: "May – August 2018",
|
||||||
@@ -380,7 +383,7 @@ export const projects: Project[] = [
|
|||||||
{
|
{
|
||||||
category: ProjectCategory.MUSIC,
|
category: ProjectCategory.MUSIC,
|
||||||
id: "soundcloud",
|
id: "soundcloud",
|
||||||
banner: "",
|
banner: "icon2.webp",
|
||||||
bannerAlt: "",
|
bannerAlt: "",
|
||||||
title: "Soundcloud",
|
title: "Soundcloud",
|
||||||
subtitle: "Demo Dump & Archive",
|
subtitle: "Demo Dump & Archive",
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 7.6 KiB |
|
Before Width: | Height: | Size: 7.8 KiB After Width: | Height: | Size: 7.8 KiB |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 78 KiB |
|
Before Width: | Height: | Size: 6.6 KiB After Width: | Height: | Size: 6.6 KiB |
|
Before Width: | Height: | Size: 102 KiB After Width: | Height: | Size: 102 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 180 KiB After Width: | Height: | Size: 180 KiB |
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 135 KiB After Width: | Height: | Size: 135 KiB |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 40 KiB |
BIN
static/projects/music/soundcloud/icon2.webp
Normal file
|
After Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 132 KiB |