2025-04-01 13:55:54 +02:00
< script lang = "ts" >
2026-01-21 17:42:59 +01:00
import Banner2 from "$lib/banner2.svelte";
2026-02-15 13:36:29 +01:00
import TableOfContents from "$lib/components/table-of-contents.svelte";
2026-02-25 19:16:21 +01:00
import { type Project , games , hardware , apps , music , getStatusText , getStatusCode } from './projects';
2026-01-23 14:19:20 +01:00
import LinkList from "$lib/lists/link-list.svelte";
import Content from "$lib/viewport/content.svelte";
2025-04-01 13:55:54 +02:00
< / script >
2025-04-04 10:37:25 +02:00
< svelte:head >
< title > Projects | denizk0461< / title >
< / svelte:head >
2026-01-21 17:42:59 +01:00
< Content >
< Banner2
title="My Disordered Projects"
banner="/projects/banner.webp"
2026-02-07 18:51:14 +01:00
bannerAlt="An upside-down New 3DS XL lying open on a desk with a small USB-C breakout board attached to it, and a USB-C cable plugged in. The 3DS is glowing to indicate that it is charging."
2026-01-21 17:42:59 +01:00
subtitle="Things I have worked on" />
2025-04-01 21:30:20 +02:00
2026-01-21 17:42:59 +01:00
< TableOfContents / >
2025-04-18 16:15:00 +02:00
2026-01-21 17:42:59 +01:00
< h2 id = "games" > Games< / h2 >
2026-02-07 18:53:53 +01:00
{ #each games as project }
{ @render projectSummary ({ project : project })}
2026-01-21 17:42:59 +01:00
{ /each }
2026-02-07 18:53:53 +01:00
2026-01-21 17:42:59 +01:00
< h2 id = "hardware" > Hardware< / h2 >
2026-02-07 18:53:53 +01:00
{ #each hardware as project }
{ @render projectSummary ({ project : project })}
2026-01-21 17:42:59 +01:00
{ /each }
2026-02-07 18:53:53 +01:00
2026-01-21 17:42:59 +01:00
< h2 id = "apps" > Apps< / h2 >
2026-02-07 18:53:53 +01:00
{ #each apps as project }
{ @render projectSummary ({ project : project })}
2026-01-21 17:42:59 +01:00
{ /each }
2026-02-07 18:53:53 +01:00
2026-01-21 17:42:59 +01:00
< h2 id = "music" > Music< / h2 >
2026-02-25 19:23:59 +01:00
< p > I made a lot of music in the past; over a hundred songs in total. There's at least a small story behind pretty much every one of them here, and I am chronicling my memories on a subpage.< / p >
< p > You can find this < a href = "my-tracks" > here< / a > , if you're interested.< / p >
2026-02-07 18:53:53 +01:00
{ #each music as project }
{ @render projectSummary ({ project : project })}
2026-01-21 17:42:59 +01:00
{ /each }
< / Content >
2025-04-01 13:55:54 +02:00
{ # snippet projectSummary ({
project
}: {
project: Project;
})}
2026-01-21 17:42:59 +01:00
< h3 id = " { project . id } " > { project . title } </ h3 >
{ #if project . subtitle }
< p class = "project-subtitle" > [ { project . subtitle } ]</ p >
{ /if }
{ #if project . banner }
2025-08-16 21:40:51 +02:00
< div class = "project-banner-container" >
2025-08-18 19:44:53 +02:00
< img class = "project-banner" src = " { project . banner } " alt = "Overview banner for { project . title } " >
2025-08-16 21:40:51 +02:00
< / div >
2026-02-25 19:16:21 +01:00
{ /if }
< p class = "project-info project-status-c- { getStatusCode ( project )} " >
2026-01-23 17:26:52 +01:00
{ #if project . date }
2026-02-25 19:16:21 +01:00
{ project . date } |
2026-01-23 17:26:52 +01:00
{ /if }
2026-02-25 19:16:21 +01:00
{ getStatusText ( project )}
< / p >
2026-01-21 17:42:59 +01:00
{ #if project . icon }
2025-08-18 19:44:53 +02:00
< img class = "project-icon" src = " { project . icon } " alt = "Icon for { project . title } " >
2026-01-21 17:42:59 +01:00
{ /if }
{ #each project . paragraphs as paragraph }
< p > { @html paragraph } </ p >
{ /each }
< LinkList entries = { project . links } / >
{ /snippet }
< style >
.project-subtitle {
font-family: var(--font-mono);
font-size: 1.0rem;
margin-top: 0;
}
.project-banner-container {
position: relative;
width: fit-content;
margin-left: auto;
margin-right: auto;
}
.project-banner {
margin: 0; /* reset left/right margins */
width: 100%;
2026-01-23 14:19:20 +01:00
max-height: 300px;
2026-01-21 17:42:59 +01:00
}
.project-icon {
float: left;
margin: 16px 16px 16px 0;
width: 20%;
}
.project-date-embed {
position: absolute;
left: 0;
bottom: 0;
}
2026-02-25 19:16:21 +01:00
.project-info {
width: fit-content;
display: flex;
flex-direction: row;
margin-top: 16px;
background-color: color-mix(in srgb, var(--color-status) 6%, transparent);
border: var(--border-style) var(--border-dash-size) var(--color-status);
padding: 2px 8px;
font-family: var(--font-mono);
font-size: 1.0rem;
font-weight: 700;
color: var(--color-status);
}
/* #region Project Status Colours */
.project-status-c-act {
--color-status: var(--color-highlight);
}
.project-status-c-ina {
--color-status: #B89751;
}
.project-status-c-aba {
--color-status: #D15555;
}
.project-status-c-fin {
--color-status: #5486D8;
}
.project-status-c-eol {
--color-status: #C353C1;
}
/* #endregion */
2026-01-21 17:42:59 +01:00
< / style >