Add view transition

This commit is contained in:
Daniel Kluge 2024-03-02 17:52:29 +01:00
parent 78dc90de5e
commit 0ebcf1d5a2
No known key found for this signature in database
26 changed files with 59 additions and 57 deletions

View File

@ -4,14 +4,15 @@ interface Props {
description: string; description: string;
published?: Date; published?: Date;
path: string; path: string;
slug: string;
} }
const { title, description, published, path } = Astro.props; const { title, description, published, path, slug } = Astro.props;
--- ---
<a href={path} class="nostyle"> <a href={path} class="nostyle">
<div class="card"> <div class="card" transition:name={`markdown-border-${slug}`}>
<h3>{title}</h3> <h3 transition:name={`markdown-title-${slug}`}>{title}</h3>
<p>{description}</p> <p>{description}</p>
</div> </div>
</a> </a>

View File

@ -2,7 +2,7 @@
import { Icon } from "astro-icon"; import { Icon } from "astro-icon";
--- ---
<div class="switch"> <div class="switch" transition:persist="theme-switch">
<Icon name="mdi:language-javascript" title="Theme switching needs JS to be enabled." data-theme-ph /> <Icon name="mdi:language-javascript" title="Theme switching needs JS to be enabled." data-theme-ph />
<Icon name="mdi:white-balance-sunny" title="Switch to dark theme" data-theme-sun /> <Icon name="mdi:white-balance-sunny" title="Switch to dark theme" data-theme-sun />
<Icon name="mdi:weather-night" title="Switch to light theme" data-theme-moon /> <Icon name="mdi:weather-night" title="Switch to light theme" data-theme-moon />
@ -26,18 +26,34 @@ import { Icon } from "astro-icon";
const switchThemeDark = () => { const switchThemeDark = () => {
document.dispatchEvent(new CustomEvent('set-theme', { detail: 'dark' })); document.dispatchEvent(new CustomEvent('set-theme', { detail: 'dark' }));
moons.forEach(m => m.classList.remove("fadeOut")); moons.forEach(m => m.classList.remove("fadeOut", "fadeOutDone"));
moons.forEach(m => m.classList.add("fadeIn")); moons.forEach(m => m.classList.add("fadeIn"));
suns.forEach(s => s.classList.remove("fadeIn")); setTimeout(() => moons.forEach(m => {
m.classList.add("fadeInDone");
m.classList.remove("fadeIn");
}), 250); // After 0.2s animation is completed
suns.forEach(s => s.classList.remove("fadeIn", "fadeInDone"));
suns.forEach(s => s.classList.add("fadeOut")); suns.forEach(s => s.classList.add("fadeOut"));
setTimeout(() => suns.forEach(s => {
s.classList.add("fadeOutDone");
s.classList.remove("fadeOut");
}), 250); // After 0.2s animation is completed
} }
const switchThemeLight = () => { const switchThemeLight = () => {
document.dispatchEvent(new CustomEvent('set-theme', { detail: 'light' })); document.dispatchEvent(new CustomEvent('set-theme', { detail: 'light' }));
moons.forEach(m => m.classList.remove("fadeIn")); moons.forEach(m => m.classList.remove("fadeIn", "fadeInDone"));
moons.forEach(m => m.classList.add("fadeOut")); moons.forEach(m => m.classList.add("fadeOut"));
suns.forEach(s => s.classList.remove("fadeOut")); setTimeout(() => moons.forEach(m => {
m.classList.add("fadeOutDone");
m.classList.remove("fadeOut");
}), 250); // After 0.2s animation is completed
suns.forEach(s => s.classList.remove("fadeOut", "fadeOutDone"));
suns.forEach(s => s.classList.add("fadeIn")); suns.forEach(s => s.classList.add("fadeIn"));
setTimeout(() => suns.forEach(s => {
s.classList.add("fadeInDone");
s.classList.remove("fadeIn");
}), 250); // After 0.2s animation is completed
} }
moons.forEach(m => m.addEventListener("click", switchThemeLight)); moons.forEach(m => m.addEventListener("click", switchThemeLight));
@ -66,11 +82,21 @@ import { Icon } from "astro-icon";
animation-fill-mode: forwards; animation-fill-mode: forwards;
} }
.fadeOutDone {
opacity: 0;
transform: translate(0, -100%);
}
.fadeIn { .fadeIn {
animation: fadeIn 0.2s ease-in-out; animation: fadeIn 0.2s ease-in-out;
animation-fill-mode: forwards; animation-fill-mode: forwards;
} }
.fadeInDone {
opacity: 1;
transform: translate(0, 0);
}
.placeHolder { .placeHolder {
opacity: 1 !important; opacity: 1 !important;
transform: translate(0, 0) !important; transform: translate(0, 0) !important;

View File

@ -5,6 +5,7 @@ const projectsCol = defineCollection({
type: "content", type: "content",
schema: z.object({ schema: z.object({
title: z.string(), title: z.string(),
site_title: z.string().optional(),
description: z.string(), description: z.string(),
descriptionShort: z.string(), descriptionShort: z.string(),
repository: z.string().url().optional(), repository: z.string().url().optional(),
@ -19,6 +20,7 @@ const diaryMainPages = defineCollection({
type: "content", type: "content",
schema: z.object({ schema: z.object({
title: z.string(), title: z.string(),
site_title: z.string().optional(),
description: z.string(), description: z.string(),
descriptionShort: z.string(), descriptionShort: z.string(),
repository: z.string().url().optional(), repository: z.string().url().optional(),
@ -33,6 +35,7 @@ const diarySubPages = defineCollection({
type: "content", type: "content",
schema: z.object({ schema: z.object({
title: z.string(), title: z.string(),
site_title: z.string().optional(),
repository: z.string().url().optional(), repository: z.string().url().optional(),
relatedWebsite: z.string().url().optional(), relatedWebsite: z.string().url().optional(),
published: z.date().optional(), published: z.date().optional(),

View File

@ -6,6 +6,4 @@ descriptionShort: "Me learning Rust (German)."
relatedWebsite: https://doc.rust-lang.org/book/ relatedWebsite: https://doc.rust-lang.org/book/
--- ---
# Learning Rust
In this diary I want to document my progress through the [Rust book](https://doc.rust-lang.org/book/) and documenting some stuff for myself. In this diary I want to document my progress through the [Rust book](https://doc.rust-lang.org/book/) and documenting some stuff for myself.

View File

@ -8,8 +8,6 @@ published: 2022-06-13T13:07:27.205Z
import { Image } from "astro:assets"; import { Image } from "astro:assets";
import screenshot from "./data_infoscreen/screenshot.jpg"; import screenshot from "./data_infoscreen/screenshot.jpg";
# Infoscreen
This document is about a screen that shows information. This document is about a screen that shows information.
Shocking, I know. Shocking, I know.

View File

@ -1,13 +1,11 @@
--- ---
title: Overleaf Git Sync title: Overleaf Sync with Git
description: "Overleaf is a LaTeX editor for the web and honestly great to use. But there is no way to back up your project to a cloud drive or git without paying them money. Even the self-hosted community version has no such functionality. I decided that's BS and made my own script to sync a project to git." description: "Overleaf is a LaTeX editor for the web and honestly great to use. But there is no way to back up your project to a cloud drive or git without paying them money. Even the self-hosted community version has no such functionality. I decided that's BS and made my own script to sync a project to git."
descriptionShort: "I created a script that pushes Overleaf projects to a git remote." descriptionShort: "I created a script that pushes Overleaf projects to a git remote."
repository: "https://git.c0ntroller.de/c0ntroller/overleaf-git-sync" repository: "https://git.c0ntroller.de/c0ntroller/overleaf-git-sync"
published: 2022-10-18T17:56:27+02:00 published: 2022-10-18T17:56:27+02:00
--- ---
# Overleaf Sync with Git
## The Problem ## The Problem
When I was writing some important stuff for uni I wanted as many backups as possible. When I was writing some important stuff for uni I wanted as many backups as possible.

View File

@ -1,13 +1,11 @@
--- ---
title: Photo Sync title: Google Photo Sync
description: "Giving random apps access to your Google Photos can be bad. To still use an album as screensaver etc. I wrote this script. It syncs all your photos to your drive while giving you maximum privacy." description: "Giving random apps access to your Google Photos can be bad. To still use an album as screensaver etc. I wrote this script. It syncs all your photos to your drive while giving you maximum privacy."
descriptionShort: "A script that syncs a Google Photos album to your drive." descriptionShort: "A script that syncs a Google Photos album to your drive."
repository: https://git.c0ntroller.de/c0ntroller/google-photo-album-sync repository: https://git.c0ntroller.de/c0ntroller/google-photo-album-sync
published: 2022-08-08T12:19:20+02:00 published: 2022-08-08T12:19:20+02:00
--- ---
# Google Photo Sync
Why give up privacy for a screensaver? Why give up privacy for a screensaver?
## Storytime ## Storytime

View File

@ -6,8 +6,6 @@ repository: "https://git.c0ntroller.de/c0ntroller/simple-callback-server"
published: 2022-10-18T17:56:27+02:00 published: 2022-10-18T17:56:27+02:00
--- ---
# Simple Callback Server
This is probably my simplest project. This is probably my simplest project.
## What is this? ## What is this?

View File

@ -6,8 +6,6 @@ repository: https://git.c0ntroller.de/c0ntroller/frontpage
published: 2022-10-18T17:56:27+02:00 published: 2022-10-18T17:56:27+02:00
--- ---
# Terminal
Hello and welcome to my website. This documentation is for the [cli on my website](https://c0ntroller.de/terminal) so check it out if you haven't! Hello and welcome to my website. This documentation is for the [cli on my website](https://c0ntroller.de/terminal) so check it out if you haven't!
## Why did I do this? ## Why did I do this?

View File

@ -7,8 +7,6 @@ relatedWebsite: https://tu-fast.de/
published: 2022-06-23T12:53:07.207Z published: 2022-06-23T12:53:07.207Z
--- ---
# TUfast
My work on a browser extension that is used by multiple thousand students. My work on a browser extension that is used by multiple thousand students.
## What is TUfast? ## What is TUfast?

View File

@ -5,8 +5,6 @@ sorting: 0
slug: hello-world slug: hello-world
--- ---
# Hello world!
_[Link zum Buch](https://doc.rust-lang.org/book/ch01-02-hello-world.html)_ _[Link zum Buch](https://doc.rust-lang.org/book/ch01-02-hello-world.html)_
## How to `println!` ## How to `println!`

View File

@ -5,8 +5,6 @@ sorting: 1
slug: cargo slug: cargo
--- ---
# Cargo
_[Link zum Buch](https://doc.rust-lang.org/book/ch01-03-hello-cargo.html)_ _[Link zum Buch](https://doc.rust-lang.org/book/ch01-03-hello-cargo.html)_
## Was ist Cargo? ## Was ist Cargo?

View File

@ -5,8 +5,6 @@ sorting: 2
slug: higher-lower-game slug: higher-lower-game
--- ---
# Erstes Spiel
[Link zum Buch](https://doc.rust-lang.org/book/ch02-00-guessing-game-tutorial.html) [Link zum Buch](https://doc.rust-lang.org/book/ch02-00-guessing-game-tutorial.html)
## Projekt erstellen ## Projekt erstellen

View File

@ -5,8 +5,6 @@ sorting: 3
slug: konzepte slug: konzepte
--- ---
# Konzepte
[Link zum Buch](https://doc.rust-lang.org/book/ch03-00-common-programming-concepts.html) [Link zum Buch](https://doc.rust-lang.org/book/ch03-00-common-programming-concepts.html)

View File

@ -5,8 +5,6 @@ sorting: 4
slug: ownership slug: ownership
--- ---
# Ownership
[Link zum Buch](https://doc.rust-lang.org/book/ch04-00-understanding-ownership.html) [Link zum Buch](https://doc.rust-lang.org/book/ch04-00-understanding-ownership.html)
## Was ist das? ## Was ist das?

View File

@ -5,8 +5,6 @@ sorting: 5
slug: structs slug: structs
--- ---
# Structs
[Link zum Buch](https://doc.rust-lang.org/book/ch05-00-structs.html) [Link zum Buch](https://doc.rust-lang.org/book/ch05-00-structs.html)
## Was sind Structs ## Was sind Structs

View File

@ -1,12 +1,11 @@
--- ---
title: Enums & Matching title: Enums & Matching
site_title: Enums und Pattern Matching
published: 2022-10-18T17:56:26+02:00 published: 2022-10-18T17:56:26+02:00
sorting: 6 sorting: 6
slug: enums slug: enums
--- ---
# Enums und Pattern Matching
[Link zum Buch](https://doc.rust-lang.org/book/ch06-00-enums.html) [Link zum Buch](https://doc.rust-lang.org/book/ch06-00-enums.html)
## Enums ## Enums

View File

@ -5,8 +5,6 @@ sorting: 7
slug: projektmanagement slug: projektmanagement
--- ---
# How to: Projektmanagement
[Link zum Buch](https://doc.rust-lang.org/book/ch07-00-managing-growing-projects-with-packages-crates-and-modules.html) [Link zum Buch](https://doc.rust-lang.org/book/ch07-00-managing-growing-projects-with-packages-crates-and-modules.html)
## Packages, Crates, Modules, was? ## Packages, Crates, Modules, was?

View File

@ -5,8 +5,6 @@ sorting: 8
slug: collections slug: collections
--- ---
# Standard Collections
[Link zum Buch](https://doc.rust-lang.org/book/ch08-00-common-collections.html) [Link zum Buch](https://doc.rust-lang.org/book/ch08-00-common-collections.html)
## `Vec<T>` - Vektoren ## `Vec<T>` - Vektoren

View File

@ -5,8 +5,6 @@ sorting: 9
slug: errors-and-panic slug: errors-and-panic
--- ---
# Errors und `panic!`
[Link zum Buch](https://doc.rust-lang.org/book/ch09-00-error-handling.html) [Link zum Buch](https://doc.rust-lang.org/book/ch09-00-error-handling.html)
## `panic!` ## `panic!`

View File

@ -1,21 +1,24 @@
--- ---
import Navbar from "../components/LayoutComponents/Navbar.astro"; import { ViewTransitions } from 'astro:transitions';
import Themes from "astro-themes"; import Themes from "astro-themes";
import Icon from "astro-icon"; import Icon from "astro-icon";
import Navbar from "../components/LayoutComponents/Navbar.astro";
import socials from "../data/socials.json"; import socials from "../data/socials.json";
interface Props { interface Props {
title: string; title: string;
showAfterMain?: boolean; showAfterMain?: boolean;
mainTransitionName?: string;
} }
const { title, showAfterMain } = Astro.props; const { title, showAfterMain, mainTransitionName } = Astro.props;
--- ---
<!doctype html> <!doctype html>
<html lang="en"> <html lang="en">
<head> <head>
<Themes defaultTheme="dark" /> <Themes defaultTheme="dark" />
<ViewTransitions />
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta <meta
@ -115,18 +118,18 @@ const { title, showAfterMain } = Astro.props;
<title>{title}</title> <title>{title}</title>
</head> </head>
<body> <body>
<span id="top" aria-hidden></span> <span id="top" aria-hidden="true"></span>
<header> <header transition:persist="nav">
<Navbar /> <Navbar />
</header> </header>
<main> <main transition:name={ mainTransitionName }>
<slot /> <slot />
</main> </main>
{showAfterMain ? <div class="after-main"> {showAfterMain ? <div class="after-main">
<slot name="after-main" /> <slot name="after-main" />
</div> : null </div> : null
} }
<footer id="bottom"> <footer id="bottom" transition:persist="footer">
<span style="visibility:hidden">▲</span> <span style="visibility:hidden">▲</span>
<span class="spacer"></span> <span class="spacer"></span>
<span class="footerContent"> <span class="footerContent">

View File

@ -4,6 +4,7 @@ import { Icon } from "astro-icon";
interface Props { interface Props {
title: string; title: string;
slug: string;
published?: Date; published?: Date;
srcPath?: string; srcPath?: string;
moreLinks?: { moreLinks?: {
@ -12,11 +13,11 @@ interface Props {
}[]; }[];
} }
const { title, srcPath, published, moreLinks } = Astro.props; const { title, srcPath, published, moreLinks, slug } = Astro.props;
const gitUrl = `https://git.c0ntroller.de/c0ntroller/frontpage/src/branch/dev/src/content/${srcPath}` const gitUrl = `https://git.c0ntroller.de/c0ntroller/frontpage/src/branch/dev/src/content/${srcPath}`
--- ---
<Layout title={title} showAfterMain={Astro.slots.has("footer-nav")}> <Layout title={title} showAfterMain={Astro.slots.has("footer-nav")} mainTransitionName={`markdown-border-${slug}`}>
{Astro.slots.has("main-nav") ? {Astro.slots.has("main-nav") ?
<slot name="main-nav" /> : <slot name="main-nav" /> :
null} null}
@ -26,6 +27,7 @@ const gitUrl = `https://git.c0ntroller.de/c0ntroller/frontpage/src/branch/dev/sr
{ moreLinks.map(l => <a href={l.href} referrerpolicy="no-referrer" class="nostyle" style={{ display: "inline-block", width: "2em" }}><Icon name={l.icon} /></a>) } { moreLinks.map(l => <a href={l.href} referrerpolicy="no-referrer" class="nostyle" style={{ display: "inline-block", width: "2em" }}><Icon name={l.icon} /></a>) }
</div> </div>
: null} : null}
<h1 transition:name={`markdown-title-${slug}`}>{title}</h1>
<slot /> <slot />
{ published || srcPath ? <> { published || srcPath ? <>
<hr /> <hr />

View File

@ -38,7 +38,7 @@ if (diaryMain.data.repository) {
} }
--- ---
<MarkdownLayout title={diaryMain.data.title} srcPath={`diaryMainPages/${diaryMain.id}`} moreLinks={moreLinks}> <MarkdownLayout title={diaryMain.data.site_title || diaryMain.data.title} slug={diaryMain.slug} srcPath={`diaryMainPages/${diaryMain.id}`} moreLinks={moreLinks}>
<Content /> <Content />
<h2>Pages</h2> <h2>Pages</h2>

View File

@ -27,7 +27,7 @@ const { entry } = Astro.props;
const { Content } = await entry.render(); const { Content } = await entry.render();
--- ---
<MarkdownLayout title={entry.data.title} srcPath={`${diary}/${entry.id}`} published={entry.data.published}> <MarkdownLayout title={entry.data.site_title || entry.data.title} slug={entry.slug} srcPath={`${diary}/${entry.id}`} published={entry.data.published}>
<DiaryNavTop collectionName="rust" slot="main-nav" /> <DiaryNavTop collectionName="rust" slot="main-nav" />
<Content /> <Content />
<DiaryNavBar collectionName="rust" slot="footer-nav" /> <DiaryNavBar collectionName="rust" slot="footer-nav" />

View File

@ -35,6 +35,6 @@ if (entry.data.repository) {
--- ---
<MarkdownLayout title={entry.data.title} srcPath={`projects/${entry.id}`} published={entry.data.published} moreLinks={moreLinks}> <MarkdownLayout title={entry.data.site_title || entry.data.title} slug={entry.slug} srcPath={`projects/${entry.id}`} published={entry.data.published} moreLinks={moreLinks}>
<Content /> <Content />
</MarkdownLayout> </MarkdownLayout>

View File

@ -22,11 +22,11 @@ const diaries = (await getCollection("diaryMainPages")).sort((a, b) => a.data.la
</p> </p>
<h2>Projects</h2> <h2>Projects</h2>
<div class="contentList"> <div class="contentList">
{ projects.map(p => <ContentCard title={p.data.title} description={p.data.description} path={`/blog/${p.slug}`} />) } { projects.map(p => <ContentCard title={p.data.title} description={p.data.description} path={`/blog/${p.slug}`} slug={p.slug} />) }
</div> </div>
<h2>Diaries</h2> <h2>Diaries</h2>
<div class="contentList"> <div class="contentList">
{ diaries.map(p => <ContentCard title={p.data.title} description={p.data.description} path={`/blog/${p.slug}`} />) } { diaries.map(p => <ContentCard title={p.data.title} description={p.data.description} path={`/blog/${p.slug}`} slug={p.slug} />) }
</div> </div>
</Layout> </Layout>