aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/app.css201
-rw-r--r--src/app.html10
-rw-r--r--src/lib/blog/InfoCard.svelte0
-rw-r--r--src/lib/blog/Post.svelte45
-rw-r--r--src/lib/blog/Post.ts28
-rw-r--r--src/lib/blog/TableWrapper.svelte15
-rw-r--r--src/lib/fonts/Ac437_IBM_EGA_8x14.css8
-rw-r--r--src/lib/fonts/Px437_DOS-V_re_JPN12.css8
-rw-r--r--src/lib/fonts/PxPlus_IBM_EGA_8x14.css8
-rw-r--r--src/lib/fonts/all-local-after-woff2.css10
-rw-r--r--src/lib/fonts/all.css10
-rw-r--r--src/lib/index.ts10
-rw-r--r--src/lib/styles.ts8
-rw-r--r--src/params/int.ts3
-rw-r--r--src/routes/+layout.svelte10
-rw-r--r--src/routes/+layout.ts8
-rw-r--r--src/routes/+page.svelte2
-rw-r--r--src/routes/IndexPage.svelte2
-rw-r--r--src/routes/anim-gen.ts10
-rw-r--r--src/routes/blog/+page.server.ts13
-rw-r--r--src/routes/blog/+page.svelte52
-rw-r--r--src/routes/blog/[id=int]-[slug]/+page.server.ts2
-rw-r--r--src/routes/blog/[id=int]-[slug]/+page.svelte8
-rw-r--r--src/routes/blog/[id=int]-[slug]/+page.ts2
-rw-r--r--src/routes/blog/[id=int]/+page.server.ts12
-rw-r--r--src/routes/blog/[id=int]/+page.svelte31
-rw-r--r--src/routes/blog/[id=int]/+page.ts12
-rw-r--r--src/routes/blog/base-post.svx15
-rw-r--r--src/routes/blog/dynamic-posts.ts4
-rw-r--r--src/routes/blog/posts.ts6
-rw-r--r--src/routes/blog/posts/test-post.svx190
-rw-r--r--src/routes/canaries/keystore.ts2
-rw-r--r--src/routes/distro-info.ts8
-rw-r--r--src/routes/shared.ts8
34 files changed, 699 insertions, 62 deletions
diff --git a/src/app.css b/src/app.css
index 0199fc9..679174a 100644
--- a/src/app.css
+++ b/src/app.css
@@ -1,15 +1,20 @@
/*
- Copyright (C) 2024 memdmp
+ Copyright (C) 2024-2026 memdmp
- This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+ This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by Affero, Inc., at version 1.
- This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
+ This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Affero General Public License for more details.
- You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.
+ You should have received a copy of the Affero General Public License along with this program. If not, see <https://spdx.org/licenses/AGPL-1.0-only>.
*/
@import 'tailwindcss';
@theme {
+ --font-sans:
+ InterVariable, Inter, "Noto Sans",
+ ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji",
+ "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji", sans-serif;
+ --font-space-grotesk: "Space Grotesk", var(--font-sans), sans-serif;
--font-bios:
'Ac437 IBM EGA 8x14', 'Hack', 'Courier New', 'Courier', 'monospace';
--font-grub:
@@ -17,6 +22,194 @@
'Courier', 'monospace';
--font-mono:
'PxPlus IBM EGA 8x14', 'Hack', 'Courier New', 'Courier', 'monospace';
+ --font-genericmono:
+ 'JetBrainsMono NF', 'Jetbrains Mono', 'JetBrains Mono', monospace;
+ --color-formatted-table-border: var(--color-neutral-900);
+ --color-formatted-table-background: var(--color-neutral-950);
+ --color-codeblock-border: var(--color-neutral-900);
+ --color-codeblock-background: var(--color-neutral-950);
+ --color-accent-primary: var(--color-red-400);
+}
+
+@utility afterunderline-* {
+ @apply relative;
+ &::before {
+ content: '';
+ background: --value(--color-*);
+ @apply absolute top-full left-0 -mt-0.5 h-[0.2rem] w-full transition-all -z-10;
+ }
+}
+@utility afterunderline-hoverstate {
+ &::before {
+ @apply top-0 left-0 mt-0 h-full w-full;
+ }
+}
+
+@utility formatted-table {
+ @apply relative overflow-x-auto shadow-xs rounded-xl border bg-formatted-table-background border-formatted-table-border;
+ table {
+ @apply w-full text-sm text-left rtl:text-right bg-formatted-table-background;
+ thead {
+ @apply text-sm border-b rounded-xl border-formatted-table-border;
+ }
+ tbody tr {
+ @apply not-last:border-b border-formatted-table-border;
+ }
+ th,td {
+ @apply px-6 py-3;
+ }
+ td > b:first-child:last-child {
+ @apply px-6 py-4 font-medium whitespace-nowrap;
+ }
+ }
+}
+@utility quicklink {
+ @apply text-accent-primary transition-all afterunderline-accent-primary hover:afterunderline-hoverstate hover:text-white;
+}
+
+@utility internal-header-active {
+ &:not(:is(p)) {
+ @apply text-white/95;
+ }
+ &:is(blockquote) {
+ &::before {
+ background-color: var(--colour-full);
+ }
+ }
+ &::after {
+ @apply -ml-3 bg-gray-200/50;
+ }
+}
+#postmd {
+ @apply font-sans;
+ a {
+ @apply quicklink;
+ }
+ h1 {
+ @apply text-4xl mb-1.5 mt-2;
+ }
+ h2 {
+ @apply my-1.5 text-2xl;
+ }
+ h3 {
+ @apply my-1 text-xl;
+ }
+ h4 {
+ @apply my-1 text-lg;
+ }
+ h1,h2,h3,h4,h5,h6,p {
+ @apply relative text-white/90 hover:text-white;
+ &::after {
+ content: "";
+ @apply absolute top-[20%] left-0 h-[60%] w-0.5 -ml-4 rounded-full transition-all;
+ }
+ &:is(p)::after {
+ @apply bg-gray-200/5;
+ }
+ &:not(:is(p))::after {
+ @apply bg-gray-200/15;
+ }
+ &:hover::after {
+ @apply -ml-3 bg-gray-200/75;
+ }
+ &:hover ~ p:is(p)::after {
+ @apply bg-gray-200/4;
+ }
+ }
+ h1 {
+ &:not(:hover):has(~*:hover):not(:has(~h1~*:hover)) {
+ @apply internal-header-active;
+ }
+ }
+ h2 {
+ &:not(:hover):has(~*:hover):not(:has(~h1~*:hover,~h2~*:hover)) {
+ @apply internal-header-active;
+ }
+ }
+ h3 {
+ &:not(:hover):has(~*:hover):not(:has(~h1~*:hover,~h2~*:hover,~h3~*:hover)) {
+ @apply internal-header-active;
+ }
+ }
+ h4 {
+ &:not(:hover):has(~*:hover):not(:has(~h1~*:hover,~h2~*:hover,~h3~*:hover,~h4~*:hover)) {
+ @apply internal-header-active;
+ }
+ }
+ h5,h6,p {
+ &:not(:hover):has(~*:hover):not(:has(~h1~*:hover,~h2~*:hover,~h3~*:hover,~h4~*:hover,~h5~*:hover)) {
+ @apply internal-header-active;
+ }
+ }
+ p::after {
+ @apply h-[90%] top-[5%];
+ }
+ p {
+ @apply my-1;
+ }
+ code {
+ @apply font-genericmono;
+ }
+ p code {
+ @apply bg-codeblock-background -my-1 p-1 rounded-lg;
+ }
+ pre {
+ @apply p-3 -mx-2 overflow-scroll bg-codeblock-background border border-codeblock-border rounded-lg transition-colors max-h-[min(75vh,38rem)];
+ code {
+ .token {
+ @apply text-red-500;
+ }
+ &,
+ .token.builtin,
+ .token.interpolation {
+ @apply text-[#9CDCFE] selection:bg-[#9CDCFE] selection:text-black;
+ }
+ .token.operator {
+ @apply text-[#d4d4d4] selection:bg-[#d4d4d4] selection:text-black;
+ }
+ .token.class-name {
+ @apply text-[#4ec9b0] selection:bg-[#4ec9b0] selection:text-black;
+ }
+ .token.number {
+ @apply text-[#b5cea8] selection:bg-[#b5cea8] selection:text-black;
+ }
+ .token.comment {
+ @apply text-[#6a9955] selection:bg-[#6a9955] selection:text-black;
+ }
+ .token.keyword {
+ @apply text-[#c586c0] selection:bg-[#c586c0] selection:text-black;
+ }
+ .token.punctuation {
+ @apply text-[white] selection:bg-[white] selection:text-black;
+ }
+ .token.function {
+ @apply text-[#dcdcaa] selection:bg-[#dcdcaa] selection:text-black;
+ }
+ .token.string {
+ @apply text-[#ce9178] selection:bg-[#ce9178] selection:text-black;
+ }
+ .token.boolean,
+ .token.interpolation-punctuation {
+ @apply text-[#5293c9] selection:bg-[#5293c9] selection:text-black;
+ }
+ }
+ }
+ blockquote:not(.default-blockquote) {
+ @apply -ml-1 pl-4 p-2 relative my-1;
+ &::before {
+ @apply absolute w-1 bg-accent-primary/50 transition-colors left-0 top-[10%] h-[80%];
+ content: '';
+ --colour-full: var(--color-accent-primary);
+ }
+ &:hover::before {
+ background-color: var(--colour-full);
+ }
+ p {
+ &::after {
+ @apply hidden;
+ }
+ }
+ }
}
/*
diff --git a/src/app.html b/src/app.html
index 72dfdc1..edf3372 100644
--- a/src/app.html
+++ b/src/app.html
@@ -1,11 +1,11 @@
<!--
/**
* @generated
- * @license AGPL-3.0-OR-LATER
- * @copyright 2024 memdmp
+ * @license AGPL-1.0-only
+ * @copyright 2024-2026 memdmp
* @upstream see https://[currentdomain]/upstream
*
- * Copyright (C) 2024 memdmp
+ * Copyright (C) 2024-2026 memdmp
*
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
@@ -15,11 +15,13 @@
*/
-->
<!DOCTYPE html>
-<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
+<html lang="en" xmlns="http://www.w3.org/1999/xhtml" class='-z-50 bg-black text-white'>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="icon" href="%sveltekit.assets%/favicon.webp" />
+ <link rel="stylesheet" href="%sveltekit.assets%/inter/inter.css" />
+ <link rel="stylesheet" href="%sveltekit.assets%/spacegrotesk/spacegrotesk.css" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
%sveltekit.head%
</head>
diff --git a/src/lib/blog/InfoCard.svelte b/src/lib/blog/InfoCard.svelte
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/lib/blog/InfoCard.svelte
diff --git a/src/lib/blog/Post.svelte b/src/lib/blog/Post.svelte
new file mode 100644
index 0000000..2c61621
--- /dev/null
+++ b/src/lib/blog/Post.svelte
@@ -0,0 +1,45 @@
+<script lang="ts" module>
+ export * from './Post';
+</script>
+
+<script lang="ts">
+ import { parsePostMetadata, type Post } from './Post';
+
+ let {
+ post,
+ filename,
+ }: {
+ post: Post;
+ filename?: string;
+ } = $props();
+
+ let meta = $derived(parsePostMetadata(post.metadata));
+
+ let PostComp = $derived(post.default);
+</script>
+
+<div class="flex justify-center">
+ <div class="max-w-2xl w-full">
+ <h1 class="font-space-grotesk text-5xl mt-8 mb-4">
+ <span class="text-accent-primary select-none">:&nbsp;</span
+ >{meta.title}<span class="text-accent-primary select-none">;</span>
+ </h1>
+ <p class="my-4 font-genericmono">
+ ctime: {meta.created.toISOString().split('T')[0]}<span class="select-none"
+ >&MediumSpace;▒&MediumSpace;</span
+ >mtime: {meta.updated.toISOString().split('T')[0]}{#if filename}<span
+ class="select-none">&MediumSpace;▒&MediumSpace;</span
+ ><a
+ href={encodeURI(
+ `https://codeberg.org/dmpmem/tilde/src/branch/master/src/routes/blog/${filename}`,
+ )}
+ class="quicklink"
+ target="_blank"
+ rel="noopener noreferrer">src</a
+ >{/if}
+ </p>
+ <article id="postmd">
+ <PostComp />
+ </article>
+ </div>
+</div>
diff --git a/src/lib/blog/Post.ts b/src/lib/blog/Post.ts
new file mode 100644
index 0000000..440dffa
--- /dev/null
+++ b/src/lib/blog/Post.ts
@@ -0,0 +1,28 @@
+
+import type { Component } from 'svelte';
+
+export type PostMetadata<Parsed extends boolean = false> = {
+ title: string;
+ blurb: string;
+ author: string | null;
+ slug: string;
+ id: string | number;
+ created: Parsed extends true ? Date : string;
+ updated: Parsed extends true ? Date : string;
+};
+export type Post<MetadataParsed extends boolean = false> = {
+ metadata: PostMetadata<MetadataParsed>;
+ default: Component;
+};
+
+export const parsePostMetadata = (
+ m: PostMetadata<boolean>,
+): PostMetadata<true> => ({
+ ...m,
+ created: new Date(m.created),
+ updated: new Date(m.updated),
+});
+export const parsePost = (p: Post<boolean>): Post<true> => ({
+ ...p,
+ metadata: parsePostMetadata(p.metadata),
+});
diff --git a/src/lib/blog/TableWrapper.svelte b/src/lib/blog/TableWrapper.svelte
new file mode 100644
index 0000000..ddf3d73
--- /dev/null
+++ b/src/lib/blog/TableWrapper.svelte
@@ -0,0 +1,15 @@
+<script lang="ts">
+ import type { Snippet } from 'svelte';
+
+ const {
+ children,
+ maxwidth = false,
+ }: {
+ children: Snippet;
+ maxwidth?: boolean;
+ } = $props();
+</script>
+
+<div class={{ 'formatted-table my-1': true, 'w-max': !maxwidth }}>
+ {@render children()}
+</div>
diff --git a/src/lib/fonts/Ac437_IBM_EGA_8x14.css b/src/lib/fonts/Ac437_IBM_EGA_8x14.css
index 01a053b..519fc96 100644
--- a/src/lib/fonts/Ac437_IBM_EGA_8x14.css
+++ b/src/lib/fonts/Ac437_IBM_EGA_8x14.css
@@ -1,11 +1,11 @@
/*
- Copyright (C) 2024 memdmp
+ Copyright (C) 2024-2026 memdmp
- This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+ This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by Affero, Inc., at version 1.
- This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
+ This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Affero General Public License for more details.
- You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.
+ You should have received a copy of the Affero General Public License along with this program. If not, see <https://spdx.org/licenses/AGPL-1.0-only>.
*/
@font-face {
font-family: "Ac437 IBM EGA 8x14";
diff --git a/src/lib/fonts/Px437_DOS-V_re_JPN12.css b/src/lib/fonts/Px437_DOS-V_re_JPN12.css
index 410e9de..9a628de 100644
--- a/src/lib/fonts/Px437_DOS-V_re_JPN12.css
+++ b/src/lib/fonts/Px437_DOS-V_re_JPN12.css
@@ -1,11 +1,11 @@
/*
- Copyright (C) 2024 memdmp
+ Copyright (C) 2024-2026 memdmp
- This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+ This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by Affero, Inc., at version 1.
- This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
+ This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Affero General Public License for more details.
- You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.
+ You should have received a copy of the Affero General Public License along with this program. If not, see <https://spdx.org/licenses/AGPL-1.0-only>.
*/
@font-face {
font-family: "Px437 DOS/V re. JPN12";
diff --git a/src/lib/fonts/PxPlus_IBM_EGA_8x14.css b/src/lib/fonts/PxPlus_IBM_EGA_8x14.css
index d1a3a97..7f3dbda 100644
--- a/src/lib/fonts/PxPlus_IBM_EGA_8x14.css
+++ b/src/lib/fonts/PxPlus_IBM_EGA_8x14.css
@@ -1,11 +1,11 @@
/*
- Copyright (C) 2024 memdmp
+ Copyright (C) 2024-2026 memdmp
- This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+ This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by Affero, Inc., at version 1.
- This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
+ This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Affero General Public License for more details.
- You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.
+ You should have received a copy of the Affero General Public License along with this program. If not, see <https://spdx.org/licenses/AGPL-1.0-only>.
*/
@font-face {
font-family: "PxPlus IBM EGA 8x14";
diff --git a/src/lib/fonts/all-local-after-woff2.css b/src/lib/fonts/all-local-after-woff2.css
index 9bc8d65..deb4acf 100644
--- a/src/lib/fonts/all-local-after-woff2.css
+++ b/src/lib/fonts/all-local-after-woff2.css
@@ -1,11 +1,11 @@
/*
- Copyright (C) 2024 memdmp
+ Copyright (C) 2024-2026 memdmp
- This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+ This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by Affero, Inc., at version 1.
- This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
+ This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Affero General Public License for more details.
- You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.
+ You should have received a copy of the Affero General Public License along with this program. If not, see <https://spdx.org/licenses/AGPL-1.0-only>.
*/
@font-face {
font-family: "Ac437 IBM EGA 8x14";
@@ -16,6 +16,7 @@
url("./Ac437_IBM_EGA_8x14.ttf") format("opentype");
font-display: swap;
}
+
@font-face {
font-family: "PxPlus IBM EGA 8x14";
src:
@@ -25,6 +26,7 @@
url("./PxPlus_IBM_EGA_8x14.ttf") format("opentype");
font-display: swap;
}
+
@font-face {
font-family: "Px437 DOS/V re. JPN12";
src:
diff --git a/src/lib/fonts/all.css b/src/lib/fonts/all.css
index 7b30c9a..ef83aaf 100644
--- a/src/lib/fonts/all.css
+++ b/src/lib/fonts/all.css
@@ -1,11 +1,11 @@
/*
- Copyright (C) 2024 memdmp
+ Copyright (C) 2024-2026 memdmp
- This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+ This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by Affero, Inc., at version 1.
- This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
+ This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Affero General Public License for more details.
- You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.
+ You should have received a copy of the Affero General Public License along with this program. If not, see <https://spdx.org/licenses/AGPL-1.0-only>.
*/
@font-face {
font-family: "Ac437 IBM EGA 8x14";
@@ -16,6 +16,7 @@
url("./Ac437_IBM_EGA_8x14.ttf") format("opentype");
font-display: swap;
}
+
@font-face {
font-family: "PxPlus IBM EGA 8x14";
src:
@@ -25,6 +26,7 @@
url("./PxPlus_IBM_EGA_8x14.ttf") format("opentype");
font-display: swap;
}
+
@font-face {
font-family: "Px437 DOS/V re. JPN12";
src:
diff --git a/src/lib/index.ts b/src/lib/index.ts
index 13c5889..c83493b 100644
--- a/src/lib/index.ts
+++ b/src/lib/index.ts
@@ -1,10 +1,12 @@
/*
- Copyright (C) 2024 memdmp
+ Copyright (C) 2024-2026 memdmp
- This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+ This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by Affero, Inc., at version 1.
- This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
+ This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Affero General Public License for more details.
- You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.
+ You should have received a copy of the Affero General Public License along with this program. If not, see <https://spdx.org/licenses/AGPL-1.0-only>.
*/
export * as styles from "./styles.ts";
+
+export const forceTrailingSlash = (v: string) => v.endsWith('/') ? v : `${v}/`;
diff --git a/src/lib/styles.ts b/src/lib/styles.ts
index 02f3805..0c60aa0 100644
--- a/src/lib/styles.ts
+++ b/src/lib/styles.ts
@@ -1,10 +1,10 @@
/*
- Copyright (C) 2024 memdmp
+ Copyright (C) 2024-2026 memdmp
- This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+ This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by Affero, Inc., at version 1.
- This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
+ This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Affero General Public License for more details.
- You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.
+ You should have received a copy of the Affero General Public License along with this program. If not, see <https://spdx.org/licenses/AGPL-1.0-only>.
*/
export const button = "bg-white/10 text-white p-4 rounded-xl";
diff --git a/src/params/int.ts b/src/params/int.ts
new file mode 100644
index 0000000..3d77400
--- /dev/null
+++ b/src/params/int.ts
@@ -0,0 +1,3 @@
+import type { ParamMatcher } from '@sveltejs/kit';
+
+export const match = ((param: string): param is `${number}` => !isNaN(parseInt(param))) satisfies ParamMatcher;
diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte
index 80bd58c..325cd61 100644
--- a/src/routes/+layout.svelte
+++ b/src/routes/+layout.svelte
@@ -1,12 +1,10 @@
<script lang="ts">
- import "$/lib/console";
- import "../app.css";
- import "$lib/fonts/all-local-after-woff2.css";
+ import '$/lib/console';
+ import '../app.css';
+ import '$lib/fonts/all-local-after-woff2.css';
const { children } = $props();
</script>
-<div
- class="w-screen h-screen fixed top-0 left-0 bg-black text-white p-4 overflow-y-auto"
->
+<div class="min-w-screen min-h-screen p-4 relative">
{@render children()}
</div>
diff --git a/src/routes/+layout.ts b/src/routes/+layout.ts
index 2c01569..ff02056 100644
--- a/src/routes/+layout.ts
+++ b/src/routes/+layout.ts
@@ -1,11 +1,11 @@
/*
- Copyright (C) 2024 memdmp
+ Copyright (C) 2024-2026 memdmp
- This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+ This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by Affero, Inc., at version 1.
- This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
+ This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Affero General Public License for more details.
- You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.
+ You should have received a copy of the Affero General Public License along with this program. If not, see <https://spdx.org/licenses/AGPL-1.0-only>.
*/
export const prerender = true;
export const trailingSlash = 'always';
diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte
index f70592b..cb1b7ef 100644
--- a/src/routes/+page.svelte
+++ b/src/routes/+page.svelte
@@ -1,6 +1,6 @@
<!--
/**
- * @license AGPL-3.0-OR-LATER
+ * @license AGPL-1.0-ONLY
* @copyright 2024 memdmp
*
* Copyright (C) 2024 memdmp
diff --git a/src/routes/IndexPage.svelte b/src/routes/IndexPage.svelte
index fec5d44..b79ae01 100644
--- a/src/routes/IndexPage.svelte
+++ b/src/routes/IndexPage.svelte
@@ -1,6 +1,6 @@
<!--
/**
- * @license AGPL-3.0-OR-LATER
+ * @license AGPL-1.0-ONLY
* @copyright 2024 memdmp
*
* Copyright (C) 2024 memdmp
diff --git a/src/routes/anim-gen.ts b/src/routes/anim-gen.ts
index 1aaaa37..49c9cbd 100644
--- a/src/routes/anim-gen.ts
+++ b/src/routes/anim-gen.ts
@@ -1,11 +1,11 @@
/*
- Copyright (C) 2024 memdmp
+ Copyright (C) 2024-2026 memdmp
- This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+ This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by Affero, Inc., at version 1.
- This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
+ This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Affero General Public License for more details.
- You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.
+ You should have received a copy of the Affero General Public License along with this program. If not, see <https://spdx.org/licenses/AGPL-1.0-only>.
*/
import { Animation, MultiObjectKeyframe } from '@memdmp/keyframegen';
import {
@@ -433,7 +433,7 @@ handleSteps.push(() => {
nextStep();
const comment = `/**
* @generated
- * @license AGPL-3.0-OR-LATER
+ * @license AGPL-1.0-ONLY
* @copyright 2024 memdmp
*
* Copyright (C) 2024 memdmp
diff --git a/src/routes/blog/+page.server.ts b/src/routes/blog/+page.server.ts
new file mode 100644
index 0000000..7c4726e
--- /dev/null
+++ b/src/routes/blog/+page.server.ts
@@ -0,0 +1,13 @@
+import { parsePost, type Post } from '$/lib/blog/Post.svelte'
+
+const posts = import.meta.glob("./posts/*.svx") as Record<string, () => Promise<Post>>
+const returnedData = Promise.all(Object.entries(posts).map(v => v[1]().then(r => [v[0], {
+ ...parsePost(r as Post),
+ default: null,
+}] as const)));
+
+export const load = async () => {
+ return {
+ posts: Object.fromEntries(await returnedData)
+ }
+}
diff --git a/src/routes/blog/+page.svelte b/src/routes/blog/+page.svelte
new