Add view transition
This commit is contained in:
		| @@ -4,14 +4,15 @@ interface Props { | ||||
|     description: string; | ||||
|     published?: Date; | ||||
|     path: string; | ||||
|     slug: string; | ||||
| } | ||||
|  | ||||
| const { title, description, published, path } = Astro.props; | ||||
| const { title, description, published, path, slug } = Astro.props; | ||||
| --- | ||||
|  | ||||
| <a href={path} class="nostyle"> | ||||
|     <div class="card"> | ||||
|         <h3>{title}</h3> | ||||
|     <div class="card" transition:name={`markdown-border-${slug}`}> | ||||
|         <h3 transition:name={`markdown-title-${slug}`}>{title}</h3> | ||||
|         <p>{description}</p> | ||||
|     </div> | ||||
| </a> | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
| 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:white-balance-sunny" title="Switch to dark theme" data-theme-sun /> | ||||
|     <Icon name="mdi:weather-night" title="Switch to light theme" data-theme-moon /> | ||||
| @@ -26,18 +26,34 @@ import { Icon } from "astro-icon"; | ||||
|  | ||||
|     const switchThemeDark = () => { | ||||
|         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")); | ||||
|         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")); | ||||
|         setTimeout(() => suns.forEach(s => { | ||||
|             s.classList.add("fadeOutDone"); | ||||
|             s.classList.remove("fadeOut"); | ||||
|         }), 250); // After 0.2s animation is completed | ||||
|     } | ||||
|  | ||||
|     const switchThemeLight = () => { | ||||
|         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")); | ||||
|         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")); | ||||
|         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)); | ||||
| @@ -66,11 +82,21 @@ import { Icon } from "astro-icon"; | ||||
|         animation-fill-mode: forwards; | ||||
|     } | ||||
|  | ||||
|     .fadeOutDone { | ||||
|         opacity: 0; | ||||
|         transform: translate(0, -100%); | ||||
|     } | ||||
|  | ||||
|     .fadeIn { | ||||
|         animation: fadeIn 0.2s ease-in-out; | ||||
|         animation-fill-mode: forwards; | ||||
|     } | ||||
|  | ||||
|     .fadeInDone { | ||||
|         opacity: 1; | ||||
|         transform: translate(0, 0); | ||||
|     } | ||||
|  | ||||
|     .placeHolder { | ||||
|         opacity: 1 !important; | ||||
|         transform: translate(0, 0) !important; | ||||
|   | ||||
| @@ -5,6 +5,7 @@ const projectsCol = defineCollection({ | ||||
|   type: "content", | ||||
|   schema: z.object({ | ||||
|     title: z.string(), | ||||
|     site_title: z.string().optional(), | ||||
|     description: z.string(), | ||||
|     descriptionShort: z.string(), | ||||
|     repository: z.string().url().optional(), | ||||
| @@ -19,6 +20,7 @@ const diaryMainPages = defineCollection({ | ||||
|   type: "content", | ||||
|   schema: z.object({ | ||||
|     title: z.string(), | ||||
|     site_title: z.string().optional(), | ||||
|     description: z.string(), | ||||
|     descriptionShort: z.string(), | ||||
|     repository: z.string().url().optional(), | ||||
| @@ -33,6 +35,7 @@ const diarySubPages = defineCollection({ | ||||
|   type: "content", | ||||
|   schema: z.object({ | ||||
|     title: z.string(), | ||||
|     site_title: z.string().optional(), | ||||
|     repository: z.string().url().optional(), | ||||
|     relatedWebsite: z.string().url().optional(), | ||||
|     published: z.date().optional(), | ||||
|   | ||||
| @@ -6,6 +6,4 @@ descriptionShort: "Me learning Rust (German)." | ||||
| 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. | ||||
| @@ -8,8 +8,6 @@ published: 2022-06-13T13:07:27.205Z | ||||
| import { Image } from "astro:assets"; | ||||
| import screenshot from "./data_infoscreen/screenshot.jpg"; | ||||
|  | ||||
| # Infoscreen | ||||
|  | ||||
| This document is about a screen that shows information. | ||||
| Shocking, I know. | ||||
|  | ||||
|   | ||||
| @@ -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." | ||||
| descriptionShort: "I created a script that pushes Overleaf projects to a git remote." | ||||
| repository: "https://git.c0ntroller.de/c0ntroller/overleaf-git-sync" | ||||
| published: 2022-10-18T17:56:27+02:00 | ||||
| --- | ||||
|  | ||||
| # Overleaf Sync with Git | ||||
|  | ||||
| ## The Problem | ||||
|  | ||||
| When I was writing some important stuff for uni I wanted as many backups as possible.  | ||||
|   | ||||
| @@ -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." | ||||
| descriptionShort: "A script that syncs a Google Photos album to your drive." | ||||
| repository: https://git.c0ntroller.de/c0ntroller/google-photo-album-sync | ||||
| published: 2022-08-08T12:19:20+02:00 | ||||
| --- | ||||
|  | ||||
| # Google Photo Sync | ||||
|  | ||||
| Why give up privacy for a screensaver? | ||||
|  | ||||
| ## Storytime | ||||
|   | ||||
| @@ -6,8 +6,6 @@ repository: "https://git.c0ntroller.de/c0ntroller/simple-callback-server" | ||||
| published: 2022-10-18T17:56:27+02:00 | ||||
| --- | ||||
|  | ||||
| # Simple Callback Server | ||||
|  | ||||
| This is probably my simplest project. | ||||
|  | ||||
| ## What is this? | ||||
|   | ||||
| @@ -6,8 +6,6 @@ repository: https://git.c0ntroller.de/c0ntroller/frontpage | ||||
| 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! | ||||
|  | ||||
| ## Why did I do this? | ||||
|   | ||||
| @@ -7,8 +7,6 @@ relatedWebsite: https://tu-fast.de/ | ||||
| published: 2022-06-23T12:53:07.207Z | ||||
| --- | ||||
|  | ||||
| # TUfast | ||||
|  | ||||
| My work on a browser extension that is used by multiple thousand students. | ||||
|  | ||||
| ## What is TUfast? | ||||
|   | ||||
| @@ -5,8 +5,6 @@ sorting: 0 | ||||
| slug: hello-world | ||||
| --- | ||||
|  | ||||
| # Hello world! | ||||
|  | ||||
| _[Link zum Buch](https://doc.rust-lang.org/book/ch01-02-hello-world.html)_  | ||||
|  | ||||
| ## How to `println!` | ||||
|   | ||||
| @@ -5,8 +5,6 @@ sorting: 1 | ||||
| slug: cargo | ||||
| --- | ||||
|  | ||||
| # Cargo | ||||
|  | ||||
| _[Link zum Buch](https://doc.rust-lang.org/book/ch01-03-hello-cargo.html)_ | ||||
|  | ||||
| ## Was ist Cargo? | ||||
|   | ||||
| @@ -5,8 +5,6 @@ sorting: 2 | ||||
| slug: higher-lower-game | ||||
| --- | ||||
|  | ||||
| # Erstes Spiel | ||||
|  | ||||
| [Link zum Buch](https://doc.rust-lang.org/book/ch02-00-guessing-game-tutorial.html) | ||||
|  | ||||
| ## Projekt erstellen | ||||
|   | ||||
| @@ -5,8 +5,6 @@ sorting: 3 | ||||
| slug: konzepte | ||||
| --- | ||||
|  | ||||
| # Konzepte | ||||
|  | ||||
| [Link zum Buch](https://doc.rust-lang.org/book/ch03-00-common-programming-concepts.html) | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -5,8 +5,6 @@ sorting: 4 | ||||
| slug: ownership | ||||
| --- | ||||
|  | ||||
| # Ownership | ||||
|  | ||||
| [Link zum Buch](https://doc.rust-lang.org/book/ch04-00-understanding-ownership.html) | ||||
|  | ||||
| ## Was ist das? | ||||
|   | ||||
| @@ -5,8 +5,6 @@ sorting: 5 | ||||
| slug: structs | ||||
| --- | ||||
|  | ||||
| # Structs | ||||
|  | ||||
| [Link zum Buch](https://doc.rust-lang.org/book/ch05-00-structs.html) | ||||
|  | ||||
| ## Was sind Structs | ||||
|   | ||||
| @@ -1,12 +1,11 @@ | ||||
| --- | ||||
| title: Enums & Matching | ||||
| site_title: Enums und Pattern Matching | ||||
| published: 2022-10-18T17:56:26+02:00 | ||||
| sorting: 6 | ||||
| slug: enums | ||||
| --- | ||||
|  | ||||
| # Enums und Pattern Matching | ||||
|  | ||||
| [Link zum Buch](https://doc.rust-lang.org/book/ch06-00-enums.html) | ||||
|  | ||||
| ## Enums | ||||
|   | ||||
| @@ -5,8 +5,6 @@ sorting: 7 | ||||
| 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) | ||||
|  | ||||
| ## Packages, Crates, Modules, was? | ||||
|   | ||||
| @@ -5,8 +5,6 @@ sorting: 8 | ||||
| slug: collections | ||||
| --- | ||||
|  | ||||
| # Standard Collections | ||||
|  | ||||
| [Link zum Buch](https://doc.rust-lang.org/book/ch08-00-common-collections.html) | ||||
|  | ||||
| ## `Vec<T>` - Vektoren | ||||
|   | ||||
| @@ -5,8 +5,6 @@ sorting: 9 | ||||
| slug: errors-and-panic | ||||
| --- | ||||
|  | ||||
| # Errors und `panic!` | ||||
|  | ||||
| [Link zum Buch](https://doc.rust-lang.org/book/ch09-00-error-handling.html) | ||||
|  | ||||
| ## `panic!` | ||||
|   | ||||
| @@ -1,21 +1,24 @@ | ||||
| --- | ||||
| import Navbar from "../components/LayoutComponents/Navbar.astro"; | ||||
| import { ViewTransitions } from 'astro:transitions'; | ||||
| import Themes from "astro-themes"; | ||||
| import Icon from "astro-icon"; | ||||
| import Navbar from "../components/LayoutComponents/Navbar.astro"; | ||||
| import socials from "../data/socials.json"; | ||||
|  | ||||
| interface Props { | ||||
| 	title: string; | ||||
| 	showAfterMain?: boolean; | ||||
| 	mainTransitionName?: string; | ||||
| } | ||||
|  | ||||
| const { title, showAfterMain } = Astro.props; | ||||
| const { title, showAfterMain, mainTransitionName } = Astro.props; | ||||
| --- | ||||
|  | ||||
| <!doctype html> | ||||
| <html lang="en"> | ||||
| 	<head> | ||||
| 		<Themes defaultTheme="dark" /> | ||||
| 		<ViewTransitions /> | ||||
|  | ||||
| 		<meta charset="utf-8" /> | ||||
| 		<meta | ||||
| @@ -115,18 +118,18 @@ const { title, showAfterMain } = Astro.props; | ||||
| 		<title>{title}</title> | ||||
| 	</head> | ||||
| 	<body> | ||||
| 		<span id="top" aria-hidden></span> | ||||
| 		<header> | ||||
| 		<span id="top" aria-hidden="true"></span> | ||||
| 		<header transition:persist="nav"> | ||||
| 			<Navbar /> | ||||
| 		</header> | ||||
| 		<main> | ||||
| 		<main transition:name={ mainTransitionName }> | ||||
| 			<slot /> | ||||
| 		</main> | ||||
| 		{showAfterMain ? <div class="after-main"> | ||||
| 			<slot name="after-main" />		 | ||||
| 		</div> : null | ||||
| 		} | ||||
| 		<footer id="bottom"> | ||||
| 		<footer id="bottom" transition:persist="footer"> | ||||
| 			<span style="visibility:hidden">▲</span> | ||||
| 			<span class="spacer"></span> | ||||
| 			<span class="footerContent"> | ||||
|   | ||||
| @@ -4,6 +4,7 @@ import { Icon } from "astro-icon"; | ||||
|  | ||||
| interface Props { | ||||
| 	title: string; | ||||
|   slug: string; | ||||
|   published?: Date; | ||||
|   srcPath?: string; | ||||
|   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}` | ||||
| --- | ||||
|  | ||||
| <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") ?  | ||||
|       <slot name="main-nav" /> : | ||||
|     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>) } | ||||
|       </div>   | ||||
|     : null} | ||||
|     <h1 transition:name={`markdown-title-${slug}`}>{title}</h1> | ||||
|     <slot /> | ||||
|     { published || srcPath ? <> | ||||
|       <hr /> | ||||
|   | ||||
| @@ -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 /> | ||||
|  | ||||
|     <h2>Pages</h2> | ||||
|   | ||||
| @@ -27,7 +27,7 @@ const { entry } = Astro.props; | ||||
| 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" /> | ||||
|   <Content /> | ||||
|   <DiaryNavBar collectionName="rust" slot="footer-nav" /> | ||||
|   | ||||
| @@ -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 /> | ||||
| </MarkdownLayout> | ||||
|   | ||||
| @@ -22,11 +22,11 @@ const diaries = (await getCollection("diaryMainPages")).sort((a, b) => a.data.la | ||||
| 	</p> | ||||
| 	<h2>Projects</h2> | ||||
| 	<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> | ||||
| 	<h2>Diaries</h2> | ||||
| 	<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> | ||||
| </Layout> | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user