moved CSS rules so that link lists and ul look identical; adjusted header

This commit is contained in:
2026-01-21 17:42:59 +01:00
parent 01feb485bf
commit df73da9ae2
14 changed files with 271 additions and 302 deletions

View File

@@ -57,11 +57,18 @@
flex-direction: row; flex-direction: row;
align-items: flex-end; align-items: flex-end;
gap: 12px; gap: 12px;
margin: var(--margin-header-top) 0 var(--margin-header-bottom) 0;
}
.title-container + hr {
/* Add top margin if no date element exists */
margin-top: 16px;
} }
.title { .title {
box-sizing: border-box; box-sizing: border-box;
height: fit-content; height: fit-content;
margin: 0;
} }
.date { .date {
@@ -75,5 +82,6 @@
font-family: var(--font-mono); font-family: var(--font-mono);
font-weight: 500; font-weight: 500;
font-size: 1.0rem; font-size: 1.0rem;
margin: 0;
} }
</style> </style>

View File

@@ -1,47 +1,28 @@
{#snippet headerContent()} {#snippet headerContent()}
<a class="favicon" href="/"> <a href="/">Home</a>
<img class="favicon-image" src="/favicon.webp" alt="Favicon">
</a>
<a href="/projects">Projects</a> <a href="/projects">Projects</a>
<a href="/projects/projectn5/devlog">Project N5</a> <a href="/projects/projectn5/devlog">Project N5</a>
<a href="/blog">Blog</a> <a href="/blog">Blog</a>
<a href="/about">About</a> <a href="/about">About</a>
{/snippet} {/snippet}
<!-- <div class="header-content coloured-header"> <div class="header-content">
{@render headerContent()} {@render headerContent()}
</div> --> </div>
<style> <style>
.header-content { .header-content {
box-sizing: border-box; box-sizing: border-box;
width: 100%; width: 100%;
min-height: 72px; max-width: var(--page-width);
/* min-height: 72px; */
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: flex-start; justify-content: flex-start;
gap: 20px; gap: 16px;
align-items: center; align-items: center;
padding: 0 24px; padding: 0 var(--margin-content-side);
} margin: 0 auto;
.coloured-header {
background: linear-gradient(90deg, var(--color-background-highlight) 62%, var(--color-header-highlight) 95%);
}
/* .transparent-header {
background: linear-gradient(90deg, var(--color-background-highlight) 62%, var(--color-header-highlight) 95%);
} */
.favicon {
background: url("/favicon.webp");
color: black;
}
.favicon-image {
width: initial;
max-height: 32px;
} }
a { a {
@@ -49,7 +30,6 @@
font-size: 1rem; font-size: 1rem;
font-weight: bold; font-weight: bold;
text-decoration: none; text-decoration: none;
transition: 0.2s ease-in-out color;
} }
a:link { a:link {

View File

@@ -12,55 +12,17 @@
} = $props(); } = $props();
</script> </script>
<ul class="styled-list"> {#snippet listEntry({ entry }: { entry: LinkEntry })}
{#each entries as entry}
<li>
<a href={entry.link}>
{#if entry.icon} {#if entry.icon}
<img height="24px" src={entry.icon} alt="Icon"> <img height="24px" src={entry.icon} alt="Icon">
{/if} {/if}
{@html entry.text} {@html entry.text}
{/snippet}
<div class="list">
{#each entries as entry}
<a href={entry.link}>
{@render listEntry({entry})}
</a> </a>
</li>
{/each} {/each}
</ul> </div>
<style>
li {
--notch-size-link: 10px;
clip-path: polygon(
0% var(--notch-size-link),
var(--notch-size-link) 0%,
calc(100% - var(--notch-size-link)) 0%,
100% var(--notch-size-link),
100% calc(100% - var(--notch-size-link)),
calc(100% - var(--notch-size-link)) 100%,
var(--notch-size-link) 100%,
0% calc(100% - var(--notch-size-link))
);
}
li:hover {
background-color: var(--color-background-highlight-hover);
}
a {
width: 100%;
transition: color 0.2s ease-in-out;
}
a:link, a:visited {
color: var(--color-text);
text-decoration: none;
}
a:hover {
color: var(--color-highlight);
}
img {
filter: var(--color-text-img);
margin-top: 4px;
margin-bottom: -4px;
width: fit-content !important;
margin-left: 0;
margin-right: 0;
display: inline;
}
</style>

View File

@@ -2,9 +2,9 @@
import {onMount} from 'svelte'; import {onMount} from 'svelte';
let { let {
disableStickyScrolling, stickyScrolling,
}: { }: {
disableStickyScrolling?: boolean; stickyScrolling?: boolean;
} = $props(); } = $props();
let idCounter: number = 0; let idCounter: number = 0;
@@ -64,12 +64,12 @@
} }
</script> </script>
{#if disableStickyScrolling} {#if stickyScrolling}
<div class="toc-container notched" bind:this={root}> <div class="toc-container notched sticky-toc" bind:this={root}>
{@render tocList()} {@render tocList()}
</div> </div>
{:else} {:else}
<div class="toc-container notched sticky-toc" bind:this={root}> <div class="toc-container notched" bind:this={root}>
{@render tocList()} {@render tocList()}
</div> </div>
{/if} {/if}

View File

@@ -6,10 +6,10 @@
</div> </div>
<div class="webring-row"> <div class="webring-row">
<span></span> <span></span>
<a href="https://www.rainbowcemetery.com/devring/prev.php?id=18"> PREV</a> <a href="https://www.rainbowcemetery.com/devring/prev.php?id=18">&lt;&lt; PREV</a>
<a href="https://www.rainbowcemetery.com/devring/rand.php?id=18">RAND</a> <a href="https://www.rainbowcemetery.com/devring/rand.php?id=18">RAND</a>
<a href="https://www.rainbowcemetery.com/devring/list.php?id=18">LIST</a> <a href="https://www.rainbowcemetery.com/devring/list.php?id=18">LIST</a>
<a href="https://www.rainbowcemetery.com/devring/next.php?id=18">NEXT </a> <a href="https://www.rainbowcemetery.com/devring/next.php?id=18">NEXT &gt;&gt;</a>
<span></span> <span></span>
</div> </div>
</div> </div>
@@ -26,7 +26,7 @@
margin: 0 4px; margin: 0 4px;
text-decoration: none; text-decoration: none;
} }
a:link, a:visited { a:link, a:visited, span {
color: var(--color-highlight); color: var(--color-highlight);
} }
a:hover { a:hover {
@@ -40,5 +40,6 @@
} }
span { span {
margin: 0; margin: 0;
font-weight: bold;
} }
</style> </style>

View File

@@ -131,6 +131,9 @@
--font-size-h3: 1.3rem; --font-size-h3: 1.3rem;
--font-size-h4: 1.2rem; --font-size-h4: 1.2rem;
--margin-header-top: 16px;
--margin-header-bottom: 8px;
/* page sizing */ /* page sizing */
--page-width: 1000px; --page-width: 1000px;
--screen-width-mobile: 800px; --screen-width-mobile: 800px;
@@ -181,27 +184,6 @@
margin: 12px 0; margin: 12px 0;
font-weight: 400; font-weight: 400;
} }
ul {
padding: 0;
}
li::before {
content: "";
font-weight: 900;
color: var(--color-highlight);
padding-right: 8px;
}
li {
display: flex;
padding-left: 0;
margin-top: 4px;
margin-bottom: 4px;
transition: background-color 0.2s ease-in-out;
padding: 2px 12px;
}
li a {
display: inline;
}
/* #region Headers */ /* #region Headers */
/* All headers */ /* All headers */
@@ -209,8 +191,8 @@
font-weight: 700; font-weight: 700;
font-family: var(--font-mono); font-family: var(--font-mono);
color: var(--color-highlight); color: var(--color-highlight);
margin-top: 16px; margin-top: var(--margin-header-top);
margin-bottom: 8px; margin-bottom: var(--margin-header-bottom);
width: fit-content; width: fit-content;
} }
@@ -259,6 +241,7 @@
height: 1px; height: 1px;
border: none; border: none;
border-top: 2px dashed var(--color-highlight); border-top: 2px dashed var(--color-highlight);
margin: 8px 0;
} }
code, .code-block { code, .code-block {
@@ -342,59 +325,58 @@
); );
} }
.project-subtitle {
color: var(--color-highlight);
font-weight: 700;
font-style: italic;
margin-top: 0;
font-family: var(--font-mono);
}
.project-banner-container {
position: relative;
width: 80%;
margin-left: auto;
margin-right: auto;
display: flex;
}
.project-banner {
margin: 0; /* reset left/right margins */
width: 100%;
}
.project-icon {
float: left;
margin: 16px 16px 16px 0;
width: 20%;
}
.project-date {
font-size: 1rem;
font-weight: 700;
line-height: 1rem;
width: fit-content;
margin: 0;
padding: 0;
color: var(--color-text-dark);
background-color: var(--color-highlight);
font-family: var(--font-stylised);
padding: 4px;
}
.project-date-embed {
position: absolute;
left: 0;
bottom: 0;
}
.pixelated-img { .pixelated-img {
image-rendering: pixelated; image-rendering: pixelated;
} }
/* #region Lists (ul and LinkList) */
.list, ul {
display: flex;
flex-direction: column;
padding: 0;
}
.list a, li {
width: 100%;
/* transition: color 0.1s ease-in-out; */
margin: 0;
padding: 4px 0;
list-style-type: none;
}
.list a::before, li::before {
content: "";
font-family: var(--font-mono);
font-weight: bold;
color: var(--color-highlight);
margin: 0 4px 0 12px;
}
li::before {
padding-right: 8px;
}
.list a:hover::before {
content: ">";
}
.list a:link, .list a:visited, li {
color: var(--color-text);
text-decoration: none;
}
.list a:hover {
color: var(--color-highlight);
}
.list img {
filter: var(--color-text-img);
margin-top: 4px;
margin-bottom: -4px;
width: fit-content !important;
margin-left: 0;
margin-right: 0;
display: inline;
}
/* #endregion */
@media screen and (max-width: 800px) { @media screen and (max-width: 800px) {
h1 { /* h1 {
font-size: 2.3rem; font-size: 2.3rem;
line-height: 2.4rem; line-height: 2.4rem;
} }
@@ -412,7 +394,7 @@
h4, h5, h6 { h4, h5, h6 {
font-size: 1.4rem; font-size: 1.4rem;
line-height: 1.4rem; line-height: 1.4rem;
} } */
/* p, span, li, pre, a { /* p, span, li, pre, a {
} */ } */

View File

@@ -1,6 +1,6 @@
<script lang="ts"> <script lang="ts">
import BannerTitleAlt from "$lib/banner-title-alt.svelte"; import Banner2 from "$lib/banner2.svelte";
import ContentSidebar from "$lib/content-sidebar.svelte"; import Content from "$lib/content.svelte";
import TableOfContents from "$lib/table-of-contents.svelte"; import TableOfContents from "$lib/table-of-contents.svelte";
import LinkList, { type LinkEntry } from "$lib/link-list.svelte"; import LinkList, { type LinkEntry } from "$lib/link-list.svelte";
@@ -36,19 +36,16 @@
<title>About Me | denizk0461</title> <title>About Me | denizk0461</title>
</svelte:head> </svelte:head>
<BannerTitleAlt <Content>
<Banner2
title="About Me" title="About Me"
banner="/common/me/b.webp" banner="/common/me/b.webp"
bannerAlt="Mirror picture of me, pixelated beyond recognition" bannerAlt="Mirror picture of me, pixelated beyond recognition"
subtitle="If you'd like to learn more about me" subtitle="If you'd like to learn more about me"
pixelated pixelated />
/>
<ContentSidebar> <TableOfContents />
<TableOfContents slot="side-left" />
<div slot="main">
<p>Hi there! I'm Deniz (he/him/they). Welcome to my website!</p> <p>Hi there! I'm Deniz (he/him/they). Welcome to my website!</p>
<p>On this website, I share my programming projects, but also a couple of other creative works. If you scroll down, though, you can find out a little more about me!</p> <p>On this website, I share my programming projects, but also a couple of other creative works. If you scroll down, though, you can find out a little more about me!</p>
@@ -57,7 +54,7 @@
<p>I like dabbling in all kinds of creative endeavours. What I do most is programming, but there are other things too! I do...</p> <p>I like dabbling in all kinds of creative endeavours. What I do most is programming, but there are other things too! I do...</p>
<ul class="styled-list"> <ul>
<li>Game development using Godot</li> <li>Game development using Godot</li>
<li>3D modelling in Blender</li> <li>3D modelling in Blender</li>
<li>CAD in Fusion 360 for 3D printing (and starting to learn FreeCAD)</li> <li>CAD in Fusion 360 for 3D printing (and starting to learn FreeCAD)</li>
@@ -93,7 +90,7 @@
<p>Other games I've enjoyed include:</p> <p>Other games I've enjoyed include:</p>
<ul class="styled-list"> <ul>
<li>1000xRESIST</li> <li>1000xRESIST</li>
<li>A Hat in Time</li> <li>A Hat in Time</li>
<li>Balatro</li> <li>Balatro</li>
@@ -111,5 +108,4 @@
<p>I'm also not a social media person. I've tried for years to use it so I could connect with my friends, who all used it extensively, but I was never able to stick with it. I had three Instagram accounts, a Twitter account, some Reddit accounts, and even two Facebook accounts in the past, but they are all gone now. Currently, I do have a <a href="https://bsky.app/denizk0461.dev">Bluesky</a> account, but it's not seen much use either. In fact, in recent times, I've tried getting away from social media and phone overuse to waste less time on slop posted on social media and have more time free to pursue hobbies and other things I enjoy doing.</p> <p>I'm also not a social media person. I've tried for years to use it so I could connect with my friends, who all used it extensively, but I was never able to stick with it. I had three Instagram accounts, a Twitter account, some Reddit accounts, and even two Facebook accounts in the past, but they are all gone now. Currently, I do have a <a href="https://bsky.app/denizk0461.dev">Bluesky</a> account, but it's not seen much use either. In fact, in recent times, I've tried getting away from social media and phone overuse to waste less time on slop posted on social media and have more time free to pursue hobbies and other things I enjoy doing.</p>
<p><i>Last updated: 2025-12-20</i></p> <p><i>Last updated: 2025-12-20</i></p>
</div> </Content>
</ContentSidebar>

View File

@@ -1,9 +1,9 @@
<script lang="ts"> <script lang="ts">
import Banner2 from "$lib/banner2.svelte"; import Banner2 from "$lib/banner2.svelte";
import Content from "$lib/content.svelte"; import Content from "$lib/content.svelte";
import LinkList, { type LinkEntry } from "$lib/link-list.svelte"; import List, { type ListEntry } from "$lib/link-list.svelte";
let feeds: LinkEntry[] = [ let feeds: ListEntry[] = [
{ {
text: "Project N5 devlog", text: "Project N5 devlog",
link: "/projects/projectn5/devlog/feed.xml", link: "/projects/projectn5/devlog/feed.xml",
@@ -24,5 +24,5 @@
<Content> <Content>
<p>This is a list of RSS feeds I maintain on this website. You can subscribe to them by adding the link of any feed to an RSS reader of your liking.</p> <p>This is a list of RSS feeds I maintain on this website. You can subscribe to them by adding the link of any feed to an RSS reader of your liking.</p>
<LinkList entries={feeds} /> <List entries={feeds} />
</Content> </Content>

View File

@@ -1,10 +1,10 @@
<script lang="ts"> <script lang="ts">
import BannerTitleAlt from "$lib/banner-title-alt.svelte"; import Banner2 from "$lib/banner2.svelte";
import TableOfContents from "$lib/table-of-contents.svelte"; import TableOfContents from "$lib/table-of-contents.svelte";
import type { Project } from './projects'; import type { Project } from './projects';
import { projects } from './projects'; import { projects } from './projects';
import LinkList from "$lib/link-list.svelte"; import LinkList from "$lib/link-list.svelte";
import ContentSidebar from "$lib/content-sidebar.svelte"; import Content from "$lib/content.svelte";
let getActiveProjects = function(projects: Project[], isActive: boolean): Project[] { let getActiveProjects = function(projects: Project[], isActive: boolean): Project[] {
var result: Project[] = []; var result: Project[] = [];
@@ -21,17 +21,15 @@
<title>Projects | denizk0461</title> <title>Projects | denizk0461</title>
</svelte:head> </svelte:head>
<BannerTitleAlt <Content>
<Banner2
title="My Disordered Projects" title="My Disordered Projects"
banner="/projects/banner.webp" banner="/projects/banner.webp"
bannerAlt="Closeup of the purple protagonist from Project N5" bannerAlt="Closeup of the purple protagonist from Project N5"
subtitle="Things I have worked on" subtitle="Things I have worked on" />
/>
<ContentSidebar> <TableOfContents />
<TableOfContents slot="side-left" />
<div slot="main">
<h2 id="games">Games</h2> <h2 id="games">Games</h2>
{#each projects as project} {#each projects as project}
{#if project.type == "game"} {#if project.type == "game"}
@@ -56,18 +54,16 @@
{@render projectSummary({ project: project })} {@render projectSummary({ project: project })}
{/if} {/if}
{/each} {/each}
</div> </Content>
</ContentSidebar>
{#snippet projectSummary({ {#snippet projectSummary({
project project
}: { }: {
project: Project; project: Project;
})} })}
<div>
<h3 id="{project.id}">{project.title}</h3> <h3 id="{project.id}">{project.title}</h3>
{#if project.subtitle} {#if project.subtitle}
<p class="project-subtitle">» {project.subtitle}</p> <p class="project-subtitle">[ {project.subtitle} ]</p>
{/if} {/if}
{#if project.banner} {#if project.banner}
<div class="project-banner-container"> <div class="project-banner-container">
@@ -88,5 +84,52 @@
<p>{@html paragraph}</p> <p>{@html paragraph}</p>
{/each} {/each}
<LinkList entries={project.links} /> <LinkList entries={project.links} />
</div>
{/snippet} {/snippet}
<style>
.project-subtitle {
font-family: var(--font-mono);
font-size: 1.0rem;
margin-top: 0;
}
.project-banner-container {
position: relative;
width: fit-content;
height: 300px;
margin-left: auto;
margin-right: auto;
display: flex;
}
.project-banner {
margin: 0; /* reset left/right margins */
width: 100%;
}
.project-icon {
float: left;
margin: 16px 16px 16px 0;
width: 20%;
}
.project-date {
font-size: 1rem;
font-weight: 700;
line-height: 1rem;
width: fit-content;
margin: 0;
padding: 0;
color: var(--color-text-dark);
background-color: var(--color-highlight);
font-family: var(--font-stylised);
padding: 4px;
}
.project-date-embed {
position: absolute;
left: 0;
bottom: 0;
}
</style>

View File

@@ -1,5 +1,5 @@
<script lang="ts"> <script lang="ts">
import BannerTitleAlt from "$lib/banner-title-alt.svelte"; import Banner2 from "$lib/banner2.svelte";
import Content from "$lib/content.svelte"; import Content from "$lib/content.svelte";
import TableOfContents from "$lib/table-of-contents.svelte"; import TableOfContents from "$lib/table-of-contents.svelte";
</script> </script>
@@ -8,19 +8,20 @@
<title>Daisy FM Synth | denizk0461</title> <title>Daisy FM Synth | denizk0461</title>
</svelte:head> </svelte:head>
<BannerTitleAlt <Content>
<Banner2
title="Daisy FM Synth" title="Daisy FM Synth"
date="2025-04-04"
banner="/projects/daisyfm/banner.webp" banner="/projects/daisyfm/banner.webp"
bannerAlt="Close-up of Daisy, focussed on the effect knobs"/> bannerAlt="Close-up of Daisy, focussed on the effect knobs"/>
<Content>
<img src="/projects/daisyfm/fullview.webp" alt="Top view of the Daisy FM synth"> <img src="/projects/daisyfm/fullview.webp" alt="Top view of the Daisy FM synth">
<p>A friend showed me the <a href="https://electro-smith.com/products/daisy-seed">Daisy Seed</a>, an Arduino-compatible microcontroller made for developing audio equipment. With a little bit of motivation and absolutely no experience in either programming synthesisers or electronics in general, I quickly got my hands on one and started to toy around.</p> <p>A friend showed me the <a href="https://electro-smith.com/products/daisy-seed">Daisy Seed</a>, an Arduino-compatible microcontroller made for developing audio equipment. With a little bit of motivation and absolutely no experience in either programming synthesisers or electronics in general, I quickly got my hands on one and started to toy around.</p>
<p>So... <i>how did we get here?</i></p> <p>So... <i>how did we get here?</i></p>
<TableOfContents disableStickyScrolling /> <TableOfContents />
<h2 id="creation">How did I make this?</h2> <h2 id="creation">How did I make this?</h2>

View File

@@ -1,5 +1,5 @@
<script lang="ts"> <script lang="ts">
import BannerTitleAlt from "$lib/banner-title-alt.svelte"; import Banner2 from "$lib/banner2.svelte";
import Content from "$lib/content.svelte"; import Content from "$lib/content.svelte";
// import type { DevlogPost } from "./devlog-posts"; // import type { DevlogPost } from "./devlog-posts";
import { posts, type DevlogPost } from "./posts"; import { posts, type DevlogPost } from "./posts";
@@ -19,13 +19,11 @@
<title>Project N5 Devlog | denizk0461</title> <title>Project N5 Devlog | denizk0461</title>
</svelte:head> </svelte:head>
<BannerTitleAlt
title="Project N5; Development Log"
banner="/projects/projectn5/banner2.webp"
wide
/>
<Content> <Content>
<Banner2
title="Project N5; Development Log"
banner="/projects/projectn5/banner2.webp" />
<p>This is the development log for my game <strong>Project N5</strong>! It's an action-adventure jump-and-run game inspired by games such as Ratchet & Clank. Development started on <b>2023-09-16</b> and rebooted on <b>2025-05-16</b>.</p> <p>This is the development log for my game <strong>Project N5</strong>! It's an action-adventure jump-and-run game inspired by games such as Ratchet & Clank. Development started on <b>2023-09-16</b> and rebooted on <b>2025-05-16</b>.</p>
<p>2023 progress updates summarise an entire month's work, respectively. Progress updates thereafter denote noteworthy developments in a more collected format.</p> <p>2023 progress updates summarise an entire month's work, respectively. Progress updates thereafter denote noteworthy developments in a more collected format.</p>

View File

@@ -1,7 +1,7 @@
<script lang="ts"> <script lang="ts">
import LinkList, { type LinkEntry } from "$lib/link-list.svelte"; import List, { type ListEntry } from "$lib/link-list.svelte";
let builds: LinkEntry[] = [ let builds: ListEntry[] = [
{ {
text: "2023-10-07 (Protagonist #1)", text: "2023-10-07 (Protagonist #1)",
link: "https://files.denizk0461.dev/projectn5/2023-10-07.zip", link: "https://files.denizk0461.dev/projectn5/2023-10-07.zip",
@@ -37,7 +37,7 @@ The game, in its state from 2025-05-16 (before the reboot), is available to play
I've also uploaded old builds of the game [here](https://files.denizk0461.dev/projectn5). You'll find the following builds, one for each protagonist: I've also uploaded old builds of the game [here](https://files.denizk0461.dev/projectn5). You'll find the following builds, one for each protagonist:
<LinkList entries={builds} /> <List entries={builds} />
The 2025-08-16 build has not seen work put into it after [2025-05-16](/projects/projectn5/devlog/2025/0523/), bar the build notice on the pause screen. The 2025-08-16 build has not seen work put into it after [2025-05-16](/projects/projectn5/devlog/2025/0523/), bar the build notice on the pause screen.

View File

@@ -21,10 +21,8 @@
bannerAlt="{data.bannerAlt}" bannerAlt="{data.bannerAlt}"
/> />
<TableOfContents disableStickyScrolling /> <TableOfContents />
<!-- <div slot="main"> -->
<svelte:component this={data.content} /> <svelte:component this={data.content} />
<!-- </div> -->
</Content> </Content>

View File

@@ -274,11 +274,11 @@ export const projects: Project[] = [
title: "Magician", title: "Magician",
subtitle: "Online Multiplayer Card Game", subtitle: "Online Multiplayer Card Game",
paragraphs: [ paragraphs: [
"<b>Magician</b> is a clone of the card game <i>Wizard</i>. I've made it primarily to play with friends, but it's also a test for programming client-server multiplayer games. The clients are programmed in Godot, the server in Python, and they communicate via TCP/IP websockets. The game works with 3 to 6 players and requires an active connection to the server, which should be reachable most times.", "<b>Magician</b> is a clone of the card game <i>Wizard</i>. I've made it primarily to play with friends, but it's also a test for programming client-server multiplayer games. The clients are programmed in Godot, the server in Python, and they communicate via TCP/IP websockets. The game works with 3 to 6 players.",
], ],
links: [ links: [
{ {
text: "Play <b>Magician</b>", text: "View the latest <b>Magician</b> build",
link: "//apps.denizk0461.dev/magician", link: "//apps.denizk0461.dev/magician",
}, },
], ],