Add OpenGraph head tags and more tests

This commit is contained in:
thiloho
2024-10-04 17:09:51 +02:00
parent f2d114dac4
commit e96b78b7ce
20 changed files with 468 additions and 273 deletions

View File

@@ -299,18 +299,26 @@ const header = {
export interface Home {
website_id: string;
main_content: string;
meta_description: string | null;
last_modified_at: Date;
last_modified_by: string | null;
}
export interface HomeInput {
website_id: string;
main_content: string;
meta_description?: string | null;
last_modified_at?: Date;
last_modified_by?: string | null;
}
const home = {
tableName: "home",
columns: ["website_id", "main_content", "last_modified_at", "last_modified_by"],
columns: [
"website_id",
"main_content",
"meta_description",
"last_modified_at",
"last_modified_by"
],
requiredForInsert: ["website_id", "main_content"],
primaryKey: "website_id",
foreignKeys: {

View File

@@ -8,8 +8,10 @@
const {
websiteOverview,
article,
apiUrl
}: { websiteOverview: WebsiteOverview; article: Article; apiUrl: string } = $props();
apiUrl,
websiteUrl
}: { websiteOverview: WebsiteOverview; article: Article; apiUrl: string; websiteUrl: string } =
$props();
</script>
<Head
@@ -18,6 +20,7 @@
{apiUrl}
title={article.title}
metaDescription={article.meta_description}
{websiteUrl}
/>
<Nav {websiteOverview} isDocsTemplate={false} isIndexPage={false} {apiUrl} />

View File

@@ -7,8 +7,14 @@
const {
websiteOverview,
apiUrl,
isLegalPage
}: { websiteOverview: WebsiteOverview; apiUrl: string; isLegalPage: boolean } = $props();
isLegalPage,
websiteUrl
}: {
websiteOverview: WebsiteOverview;
apiUrl: string;
isLegalPage: boolean;
websiteUrl: string;
} = $props();
</script>
<Head
@@ -16,6 +22,8 @@
nestingLevel={0}
{apiUrl}
title={isLegalPage ? "Legal information" : websiteOverview.title}
metaDescription={websiteOverview.home.meta_description}
{websiteUrl}
/>
<Nav {websiteOverview} isDocsTemplate={false} isIndexPage={true} {apiUrl} />

View File

@@ -1,31 +1,86 @@
<script lang="ts">
import type { WebsiteOverview } from "../../utils";
import { slugify, type WebsiteOverview } from "../../utils";
const {
websiteOverview,
nestingLevel,
apiUrl,
title,
metaDescription
metaDescription,
websiteUrl
}: {
websiteOverview: WebsiteOverview;
nestingLevel: number;
apiUrl: string;
title: string;
metaDescription?: string | null;
websiteUrl: string;
} = $props();
const constructedTitle =
websiteOverview.title === title ? title : `${websiteOverview.title} | ${title}`;
let ogUrl = `${websiteUrl.replace(/\/$/, "")}${nestingLevel === 0 ? (websiteOverview.title === title ? "" : `/${slugify(title)}`) : `/articles/${slugify(title)}`}`;
</script>
<svelte:head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>{websiteOverview.title === title ? title : `${websiteOverview.title} | ${title}`}</title>
<title>{constructedTitle}</title>
<meta name="description" content={metaDescription ?? title} />
<link rel="stylesheet" href={`${"../".repeat(nestingLevel)}styles.css`} />
<link rel="stylesheet" href={`${"../".repeat(nestingLevel)}variables.css`} />
<link rel="stylesheet" href={`${"../".repeat(nestingLevel)}common.css`} />
<link rel="stylesheet" href={`${"../".repeat(nestingLevel)}scoped.css`} />
{#if websiteOverview.settings.favicon_image}
<link
rel="icon"
href="{apiUrl}/rpc/retrieve_file?id={websiteOverview.settings.favicon_image}"
/>
{/if}
<meta property="og:site_name" content={websiteOverview.title} />
<meta property="og:title" content={constructedTitle} />
<meta property="og:description" content={metaDescription ?? title} />
<meta property="og:type" content="article" />
<meta property="og:url" content={ogUrl} />
{#if websiteOverview.header.logo_image}
<meta
property="og:image"
content="{apiUrl}/rpc/retrieve_file?id={websiteOverview.header.logo_image}"
/>
{/if}
<script>
const determineTheme = (skipSetTheme = false) => {
const lightMode = window
.getComputedStyle(document.documentElement)
.getPropertyValue("--display-light");
const darkMode = window
.getComputedStyle(document.documentElement)
.getPropertyValue("--display-dark");
if (!skipSetTheme && lightMode === "none") {
localStorage.setItem("theme", "light");
}
if (!skipSetTheme && darkMode === "none") {
localStorage.setItem("theme", "dark");
}
const currentTheme = localStorage.getItem("theme");
window.addEventListener("DOMContentLoaded", (event) => {
const prefersDarkScheme = window.matchMedia("(prefers-color-scheme: dark)");
document.querySelector("#toggle-theme").checked =
darkMode === "none" ? currentTheme === "light" : currentTheme === "dark";
});
};
determineTheme(true);
window.addEventListener("DOMContentLoaded", (event) => {
document.querySelector('label[for="toggle-theme"]').addEventListener("click", () => {
determineTheme();
});
});
</script>
</svelte:head>

View File

@@ -70,7 +70,7 @@
</ul>
</section>
{/if}
<a href={isIndexPage ? "." : ".."}>
<svelte:element this={isIndexPage ? "span" : "a"} href="..">
{#if websiteOverview.header.logo_type === "text"}
<strong>{websiteOverview.header.logo_text}</strong>
{:else}
@@ -81,7 +81,7 @@
alt=""
/>
{/if}
</a>
</svelte:element>
<label style="margin-inline-start: auto;" for="toggle-theme">
<input type="checkbox" id="toggle-theme" hidden />
<svg

View File

@@ -8,8 +8,10 @@
const {
websiteOverview,
article,
apiUrl
}: { websiteOverview: WebsiteOverview; article: Article; apiUrl: string } = $props();
apiUrl,
websiteUrl
}: { websiteOverview: WebsiteOverview; article: Article; apiUrl: string; websiteUrl: string } =
$props();
</script>
<Head
@@ -18,6 +20,7 @@
{apiUrl}
title={article.title}
metaDescription={article.meta_description}
{websiteUrl}
/>
<Nav {websiteOverview} isDocsTemplate={true} isIndexPage={false} {apiUrl} />

View File

@@ -7,8 +7,14 @@
const {
websiteOverview,
apiUrl,
isLegalPage
}: { websiteOverview: WebsiteOverview; apiUrl: string; isLegalPage: boolean } = $props();
isLegalPage,
websiteUrl
}: {
websiteOverview: WebsiteOverview;
apiUrl: string;
isLegalPage: boolean;
websiteUrl: string;
} = $props();
</script>
<Head
@@ -16,6 +22,8 @@
nestingLevel={0}
{apiUrl}
title={isLegalPage ? "Legal information" : websiteOverview.title}
metaDescription={websiteOverview.home.meta_description}
{websiteUrl}
/>
<Nav {websiteOverview} isDocsTemplate={true} isIndexPage={true} {apiUrl} />