1
0

Start implementation for blog posts

This commit is contained in:
Michael Rieger
2025-10-20 09:13:19 +02:00
parent 39e20d9816
commit 1361095a76
11 changed files with 150 additions and 27 deletions
+3
View File
@@ -19,6 +19,9 @@ const isEnglish = Astro.currentLocale === "en";
<nav> <nav>
<ul> <ul>
<li>
<a class="hoverable" href="/blog">Blog</a>
</li>
<li> <li>
<a class="hoverable" href="/imprint">Imprint</a> <a class="hoverable" href="/imprint">Imprint</a>
</li> </li>
+13
View File
@@ -0,0 +1,13 @@
// 1. Import utilities from `astro:content`
import { defineCollection, z } from 'astro:content';
// 2. Import loader(s)
import { glob, file } from 'astro/loaders';
// 3. Define your collection(s)
const blog = defineCollection({
loader: glob({ pattern: "**/*.md", base: "./src/data/blog" }),
});
// 4. Export a single `collections` object to register your collection(s)
export const collections = { blog };
View File
@@ -2,9 +2,12 @@
import Cursor from "../components/Cursor.astro"; import Cursor from "../components/Cursor.astro";
import GlobalStyles from "../components/GlobalStyles.astro"; import GlobalStyles from "../components/GlobalStyles.astro";
import Header from "../components/Header.astro"; import Header from "../components/Header.astro";
import Logo from "../assets/ci/icon-only.svg";
const { title } = Astro.props; const { pageTitle } = Astro.props;
const isDev = import.meta.env.DEV;
const title = pageTitle
? `${pageTitle} | Tideshift Digital`
: "Tideshift Digital - Building The Web On Your Terms";
--- ---
<!doctype html> <!doctype html>
@@ -15,7 +18,7 @@ const { title } = Astro.props;
<link rel="icon" type="image/svg+xml" href="/favicon.svg" /> <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<meta name="generator" content={Astro.generator} /> <meta name="generator" content={Astro.generator} />
<title> <title>
Tideshift Digital - {title || "Building The Web On Your Terms"} {title}
</title> </title>
<meta <meta
name="description" name="description"
@@ -28,11 +31,7 @@ const { title } = Astro.props;
<meta name="author" content="Michael Rieger" /> <meta name="author" content="Michael Rieger" />
<meta name="application-name" content="Tideshift Digital" /> <meta name="application-name" content="Tideshift Digital" />
<link rel="canonical" href="https://tideshiftdigital.com/" /> <link rel="canonical" href="https://tideshiftdigital.com/" />
<meta <meta property="og:title" content={title} />
property="og:title"
content={"Tideshift Digital - " + title ||
"Building The Web On Your Terms"}
/>
<meta <meta
property="og:description" property="og:description"
content="From concept to launch — websites, apps, and digital solutions that work hard, so you can play hard. Based in Vienna, we turn ideas into live products." content="From concept to launch — websites, apps, and digital solutions that work hard, so you can play hard. Based in Vienna, we turn ideas into live products."
@@ -42,22 +41,23 @@ const { title } = Astro.props;
<meta property="og:image" content="/assets/img/og-image.jpg" /> <meta property="og:image" content="/assets/img/og-image.jpg" />
<meta property="og:site_name" content="Tideshift Digital" /> <meta property="og:site_name" content="Tideshift Digital" />
<meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:card" content="summary_large_image" />
<meta <meta name="twitter:title" content={title} />
name="twitter:title"
content={"Tideshift Digital - " + title ||
"Building The Web On Your Terms"}
/>
<meta <meta
name="twitter:description" name="twitter:description"
content="From concept to launch — websites, apps, and digital solutions that work hard, so you can play hard. Based in Vienna." content="From concept to launch — websites, apps, and digital solutions that work hard, so you can play hard. Based in Vienna."
/> />
<meta name="twitter:image" content="/assets/img/og-image.jpg" /> <meta name="twitter:image" content="/assets/img/og-image.jpg" />
<script {
is:inline !isDev ? (
defer <script
src="https://analytics.tideshiftdigital.com/script.js" is:inline
data-website-id="00c032c0-8fd5-436c-a210-9df51c071c7b"></script> defer
src="https://analytics.tideshiftdigital.com/script.js"
data-website-id="00c032c0-8fd5-436c-a210-9df51c071c7b"
/>
) : null
}
</head> </head>
<body> <body>
<GlobalStyles /> <GlobalStyles />
+44
View File
@@ -0,0 +1,44 @@
---
import Cursor from "../components/Cursor.astro";
import GlobalStyles from "../components/GlobalStyles.astro";
const isDev = import.meta.env.DEV;
---
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<meta name="generator" content={Astro.generator} />
<title>Oops, this is weird</title>
<meta name="author" content="Michael Rieger" />
<meta name="application-name" content="Tideshift Digital" />
<link rel="canonical" href="https://tideshiftdigital.com/" />
{
!isDev ? (
<script
is:inline
defer
src="https://analytics.tideshiftdigital.com/script.js"
data-website-id="00c032c0-8fd5-436c-a210-9df51c071c7b"
/>
) : null
}
</head>
<body>
<GlobalStyles />
<slot />
<Cursor />
</body>
</html>
<style>
body {
width: 100%;
height: 100dvh;
}
</style>
+8
View File
@@ -0,0 +1,8 @@
---
const { frontmatter } = Astro.props;
---
<meta charset="utf-8" />
<h1>{frontmatter.title}</h1>
<p>Written by {frontmatter.author}</p>
<slot />
+35
View File
@@ -0,0 +1,35 @@
---
import ErrorLayout from "../layouts/ErrorLayout.astro";
---
<ErrorLayout pageTitle="Building The Web On Your Terms">
<div class="error">
<p class="number">404</p>
<h1 class="title">Page not found</h1>
<p class="description">Seems like you got lost in the waves</p>
<a href="/">Back to home</a>
</div>
</ErrorLayout>
<style>
.error {
display: flex;
width: 100%;
height: 100%;
flex-direction: column;
justify-content: center;
align-items: center;
}
.number {
font-size: clamp(3rem, 20vw + 2rem, 12rem);
line-height: 1;
font-weight: bold;
color: var(--clr-ts-warm-red);
}
.title {
}
</style>
+20
View File
@@ -0,0 +1,20 @@
---
import BaseLayout from "../layouts/BaseLayout.astro";
const allPosts = Object.values(
import.meta.glob("./posts/*.md", { eager: true }),
);
const pageTitle = "My Astro Learning Blog";
---
<BaseLayout pageTitle={pageTitle}>
<p>This is where I will post about my journey learning Astro.</p>
<ul>
{
allPosts.map((post: any) => (
<li>
<a href={post.url}>{post.frontmatter.title}</a>
</li>
))
}
</ul>
</BaseLayout>
+3 -3
View File
@@ -1,8 +1,8 @@
--- ---
import Layout from "../layouts/Layout.astro"; import BaseLayout from "../layouts/BaseLayout.astro";
--- ---
<Layout title="Imprint"> <BaseLayout pageTitle="Imprint">
<main class="imprint"> <main class="imprint">
<h1>Imprint</h1> <h1>Imprint</h1>
@@ -28,7 +28,7 @@ import Layout from "../layouts/Layout.astro";
<p>E-Mail: office@tideshiftdigital.com</p> <p>E-Mail: office@tideshiftdigital.com</p>
</div> </div>
</main> </main>
</Layout> </BaseLayout>
<style scoped> <style scoped>
h1 { h1 {
+3 -3
View File
@@ -1,8 +1,8 @@
--- ---
import Hero from "../components/Hero.astro"; import Hero from "../components/Hero.astro";
import Layout from "../layouts/Layout.astro"; import BaseLayout from "../layouts/BaseLayout.astro";
--- ---
<Layout title="Building The Web On Your Terms"> <BaseLayout pageTitle="Building The Web On Your Terms">
<Hero /> <Hero />
</Layout> </BaseLayout>
+3 -3
View File
@@ -1,8 +1,8 @@
--- ---
import Layout from "../layouts/Layout.astro"; import BaseLayout from "../layouts/BaseLayout.astro";
--- ---
<Layout title="Privacy Policy"> <BaseLayout pageTitle="Privacy Policy">
<main class="content"> <main class="content">
<h1>Privacy Policy</h1> <h1>Privacy Policy</h1>
@@ -81,7 +81,7 @@ import Layout from "../layouts/Layout.astro";
</p> </p>
</div> </div>
</main> </main>
</Layout> </BaseLayout>
<style> <style>
* + * { * + * {