feat: add table of content element
Some checks failed
Deploy to SFTP Server / build (push) Has been cancelled

This commit is contained in:
max_richter 2024-04-07 02:36:02 +02:00
parent f76477db98
commit 0ab1e1068d
10 changed files with 86 additions and 21 deletions

View File

@ -9,13 +9,18 @@ h3 {
font-family: 'Roboto', sans-serif; font-family: 'Roboto', sans-serif;
} }
article>h1 {
font-size: 28px;
margin-top: 24px;
}
article>h2 { article>h2 {
font-size: 24px; font-size: 22px;
margin-top: 20px; margin-top: 20px;
} }
article>h3 { article>h3 {
font-size: 20px; font-size: 18px;
margin-top: 16px; margin-top: 16px;
} }

View File

@ -55,7 +55,7 @@
</script> </script>
<div <div
class="wrapper grid overflow-hidden rounded-xl border border-light" class="wrapper grid overflow-hidden rounded-xl border border-neutral"
class:title class:title
class:not-loaded={!loaded} class:not-loaded={!loaded}
class:loaded class:loaded

View File

@ -10,7 +10,7 @@ const t = useTranslations(Astro.url);
--- ---
<Card <Card
classes="googley-eye-target relative rounded-diag-md border border-neutral gradient grid xs:grid-cols-[250px_1fr] min-h-[180px] sm:h-[180px] mt-8" classes="googley-eye-target relative rounded-diag-md border border-neutral bg-dark grid xs:grid-cols-[250px_1fr] min-h-[180px] sm:h-[180px] mt-8"
> >
<div <div
class="image relative h-[130%] self-end items-end flex overflow-hidden order-last xs:order-first" class="image relative h-[130%] self-end items-end flex overflow-hidden order-last xs:order-first"
@ -55,6 +55,21 @@ const t = useTranslations(Astro.url);
bottom: 0; bottom: 0;
background: linear-gradient(-12deg, var(--background) 0%, transparent 50%); background: linear-gradient(-12deg, var(--background) 0%, transparent 50%);
} }
.image {
filter: brightness(1.1) contrast(0.9);
}
:global(.dark) .image {
filter: brightness(0.9);
}
:global(.dark) .image::before {
background: linear-gradient(
-12deg,
var(--background-dark) 0%,
transparent 50%
);
}
.image > :global(img) { .image > :global(img) {
height: 100%; height: 100%;

36
src/components/TOC.astro Normal file
View File

@ -0,0 +1,36 @@
---
import { useTranslations } from "@i18n/utils";
import type { MarkdownHeading } from "astro";
const t = useTranslations(Astro.url);
type Props = {
headings: MarkdownHeading[];
};
const { headings } = Astro.props;
---
<div class="toc-wrapper lg:fixed lg:left-6 lg:top-6">
<details
class="py-2 px-4 rounded-xl border border-neutral flex flex-col bg gap-2"
>
<summary class="text-lg cursor-pointer select-none"
>{t("toc.title")}</summary
>
<div class="flex flex-col gap-[2px] my-2">
{
headings.map((heading) => {
return (
<a
href={`#${heading.slug}`}
style={{ marginLeft: `${(heading.depth - 1) * 1}rem` }}
class={`block text my-0`}
>
{heading.text}
</a>
);
})
}
</div>
</details>
</div>

View File

@ -2,6 +2,7 @@
title: "Erasmus Valencia" title: "Erasmus Valencia"
date: 2022-09-02 date: 2022-09-02
cover: ./images/MAX_8218 - MAX_8230.jpg cover: ./images/MAX_8218 - MAX_8230.jpg
toc: true
--- ---
import Image from "@components/Image.astro" import Image from "@components/Image.astro"
@ -42,24 +43,24 @@ import ImageGallery from "@components/ImageGallery.svelte"
2022 hatte ich das Privileg mit der Unterstützung von Erasmus 5 Monate in Valencia zu studieren, dass hier sind die Bilder, die dabei entstanden sind. 2022 hatte ich das Privileg mit der Unterstützung von Erasmus 5 Monate in Valencia zu studieren, dass hier sind die Bilder, die dabei entstanden sind.
## Wandern in Chullila # Wandern in Chullila
<Image src={MAX_8126} alt="Einzelner Baum auf der Seite eines Berges, nebliges Licht"/> <Image src={MAX_8126} alt="Einzelner Baum auf der Seite eines Berges, nebliges Licht"/>
<Image src={MAX_8133} alt="Seite eines Berges mit einer einzelnen Straße, großer See in der Ferne"/> <Image src={MAX_8133} alt="Seite eines Berges mit einer einzelnen Straße, großer See in der Ferne"/>
<Image src={MAX_8154} alt="Typ steht auf einer Straße unter einer Brücke die sehr groß ist"/> <Image src={MAX_8154} alt="Typ steht auf einer Straße unter einer Brücke die sehr groß ist"/>
## Valencia Harbour # Valencia Harbour
<Image src={MAX_8194} alt=""/> <Image src={MAX_8194} alt=""/>
<Image src={MAX_8416_NEF_shotwell} alt=""/> <Image src={MAX_8416_NEF_shotwell} alt=""/>
## Hunde # Hunde
<Image src={MAX_8197_NEF_shotwell} alt=""/> <Image src={MAX_8197_NEF_shotwell} alt=""/>
<Image src={MAX_8212_NEF_shotwell} alt=""/> <Image src={MAX_8212_NEF_shotwell} alt=""/>
<Image src={MAX_8404_NEF_shotwell} alt=""/> <Image src={MAX_8404_NEF_shotwell} alt=""/>
## Botanik # Botanik
<Image src={MAX_8249} alt=""/> <Image src={MAX_8249} alt=""/>
<Image src={MAX_8310_NEF_shotwell} alt=""/> <Image src={MAX_8310_NEF_shotwell} alt=""/>
@ -71,7 +72,7 @@ import ImageGallery from "@components/ImageGallery.svelte"
<Image src={MAX_8396} alt="Hand made vase"/> <Image src={MAX_8396} alt="Hand made vase"/>
<Image src={MAX_8551_NEF_shotwell} alt=""/> <Image src={MAX_8551_NEF_shotwell} alt=""/>
## Landschaften # Landschaften
<Image src={MAX_8218_MAX_8230} alt=""/> <Image src={MAX_8218_MAX_8230} alt=""/>
<Image src={MAX_8276} alt=""/> <Image src={MAX_8276} alt=""/>
<Image src={MAX_8426} alt=""/> <Image src={MAX_8426} alt=""/>

View File

@ -3,8 +3,8 @@ title: "K.A.R.L"
date: 2021-04-01 date: 2021-04-01
cover: ./images/Indicatrices_of_Distortion.png cover: ./images/Indicatrices_of_Distortion.png
license: "CC-BY-SA:4.0" license: "CC-BY-SA:4.0"
comments: true
featured: true featured: true
toc: true
links: links:
[ [
["live", "https://max-richter.dev/karl"], ["live", "https://max-richter.dev/karl"],

View File

@ -45,9 +45,9 @@ import ImageGallery from "@components/ImageGallery.svelte"
Schon gar nicht schlecht, aber wie das mit Prototypen so ist gab es noch einiges zu verbessern. Also eine Kurze Historie der größten Änderungen bis heute: Schon gar nicht schlecht, aber wie das mit Prototypen so ist gab es noch einiges zu verbessern. Also eine Kurze Historie der größten Änderungen bis heute:
## Refactors # Refactors
### Svelte Rewrite ## Svelte Rewrite
Der erste Prototyp war handgeschriebenes ungetestes Javascript. Das kann man sich etwa so vorstellen als ob man ein Auto nur aus Zahnstochern und Ducttape bauen muss. Der erste Prototyp war handgeschriebenes ungetestes Javascript. Das kann man sich etwa so vorstellen als ob man ein Auto nur aus Zahnstochern und Ducttape bauen muss.
Man kriegt es eventuell hin, ist vielleicht sogar ganz begeistert von seiner Kreation, wenn man sich das ganze aber dann ne Woche später nochmal anschaut oder schlimmer noch Verbesserungen daran machen will wird es recht schnell schwierig. Das hieß es war Zeit für die Lieblingsbeschäftigung eines jeden Web Entwicklers; herausfinden was gerade der heiße Scheiß in der Welt der Webentwicklung ist. Sobald man sich dann für eine der tausenden möglichen Technologien entschieden hat, macht man diese zu seiner persönlichen Religion und verteidigt sie mit religiösem Fanatismus. Ganz einfach, oder? Man kriegt es eventuell hin, ist vielleicht sogar ganz begeistert von seiner Kreation, wenn man sich das ganze aber dann ne Woche später nochmal anschaut oder schlimmer noch Verbesserungen daran machen will wird es recht schnell schwierig. Das hieß es war Zeit für die Lieblingsbeschäftigung eines jeden Web Entwicklers; herausfinden was gerade der heiße Scheiß in der Welt der Webentwicklung ist. Sobald man sich dann für eine der tausenden möglichen Technologien entschieden hat, macht man diese zu seiner persönlichen Religion und verteidigt sie mit religiösem Fanatismus. Ganz einfach, oder?
@ -67,7 +67,9 @@ Im Hinterkopf hatte ich eigentlich schon die Lösung für das Problem, war mir n
Die Lösung sind Node-Systeme! Hmm, was ist das denn? Die Lösung sind Node-Systeme! Hmm, was ist das denn?
<div class="center my-4">
![Node-Systeme](./images/nodes.svg) ![Node-Systeme](./images/nodes.svg)
</div>
Node-Systeme bestehen aus Nodes und Connections. Nodes haben inputs und outputs und man kann diese miteinander verbinden. Node-Systeme bestehen aus Nodes und Connections. Nodes haben inputs und outputs und man kann diese miteinander verbinden.
@ -86,15 +88,17 @@ Das coole ist das man dieses System sehr generisch gestalten kann und zum beispi
### Svelte-Kit Rewrite ### Svelte-Kit Rewrite
## Architektur # Architektur
## Design # Design
## Zukunft # Zukunft
## Abschluss # Abschluss
Aktuell sieht die Architectur in etwa so aus: Aktuell sieht die Architectur in etwa so aus:
<div class="center my-4">
![Architecture](./images/architecture.svg) ![Architecture](./images/architecture.svg)
</div>

View File

@ -22,6 +22,7 @@ export const ui = {
'nav.projects': 'Projects', 'nav.projects': 'Projects',
'nav.videos': 'Videos', 'nav.videos': 'Videos',
'nav.photos': 'Photos', 'nav.photos': 'Photos',
'toc.title': 'Table of Contents',
}, },
de: { de: {
"en": "English", "en": "English",
@ -38,6 +39,7 @@ export const ui = {
'nav.projects': 'Projekte', 'nav.projects': 'Projekte',
'nav.videos': 'Videos', 'nav.videos': 'Videos',
'nav.photos': 'Fotos', 'nav.photos': 'Fotos',
'toc.title': 'Inhaltsverzeichnis',
}, },
} as const; } as const;

View File

@ -118,11 +118,11 @@ const { title, width = "compact" } = Astro.props;
})(); })();
</script> </script>
</head> </head>
<body class=`layout-${width} bg-dark text-neutral p-2`> <body class="bg-dark text-neutral p-2 flex flex-col gap-4">
<header> <header>
<Nav /> <Nav />
</header> </header>
<main id="main-content" class="flex flex-col mt-4xl gap-y-2xl"> <main id="main-content" class="flex flex-col gap-4">
<slot /> <slot />
</main> </main>
<footer class="px-4 flex gap-8 mb-4"> <footer class="px-4 flex gap-8 mb-4">
@ -135,7 +135,7 @@ const { title, width = "compact" } = Astro.props;
</a> </a>
</footer> </footer>
<style> <style>
.layout-compact { body {
max-width: 600px; max-width: 600px;
margin: 0 auto; margin: 0 auto;
} }

View File

@ -1,5 +1,6 @@
--- ---
import Layout from "./Layout.astro"; import Layout from "./Layout.astro";
import TOC from "@components/TOC.astro";
import { useTranslatedPath, useTranslations } from "@i18n/utils"; import { useTranslatedPath, useTranslations } from "@i18n/utils";
import type { MarkdownLayoutProps } from "astro"; import type { MarkdownLayoutProps } from "astro";
@ -10,7 +11,7 @@ type Props = MarkdownLayoutProps<{
toc?: boolean; toc?: boolean;
}>; }>;
const { frontmatter } = Astro.props; const { frontmatter, headings } = Astro.props;
const t = useTranslations(Astro.url); const t = useTranslations(Astro.url);
const { title, url, date: dateString, links, toc } = frontmatter; const { title, url, date: dateString, links, toc } = frontmatter;
const collection = url?.split("/")[2]; const collection = url?.split("/")[2];
@ -56,11 +57,12 @@ const backlinkContent = t(`nav.${collection}`).toLowerCase();
</div> </div>
</div> </div>
<article class={`flex flex-col gap-4 ${toc ? "show-toc" : ""}`}> <article class={`flex flex-col gap-4 ${toc ? "show-toc" : ""}`}>
<div class="mb-4 flex flex-col gap-1"> <div class="flex flex-col gap-1">
<h1 class="text-4xl"> <h1 class="text-4xl">
{title} {title}
</h1> </h1>
</div> </div>
{toc && <TOC headings={headings} />}
<slot /> <slot />
</article> </article>
</Layout> </Layout>