diff --git a/.claude/launch.json b/.claude/launch.json new file mode 100644 index 0000000..1685a8a --- /dev/null +++ b/.claude/launch.json @@ -0,0 +1,17 @@ +{ + "version": "0.0.1", + "configurations": [ + { + "name": "Next.js Dev (Turbopack)", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "dev"], + "port": 3000 + }, + { + "name": "Cloudflare Workers Preview", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "preview"], + "port": 8787 + } + ] +} diff --git a/app/[lang]/(main)/blog/[slug]/page.tsx b/app/[lang]/(main)/blog/[slug]/page.tsx index d054aac..8a4fc14 100644 --- a/app/[lang]/(main)/blog/[slug]/page.tsx +++ b/app/[lang]/(main)/blog/[slug]/page.tsx @@ -5,7 +5,7 @@ import defaultMdxComponents from "fumadocs-ui/mdx"; import { blog } from "@/lib/source"; import { File, Files, Folder } from "fumadocs-ui/components/files"; import { Tab, Tabs } from "fumadocs-ui/components/tabs"; -import { Language, uiDictionary, localizeUrl, i18n } from "@/lib/i18n"; +import { Language, localizeUrl, i18n } from "@/lib/i18n"; import { displayDate } from "@/lib/date"; import { createBlogMetadata, baseUrl } from "@/lib/metadata"; import { ArticleJsonLd } from "@/components/JsonLd"; @@ -32,7 +32,6 @@ export default async function Page(props: { }) { const params = await props.params; const page = blog.getPage([params.slug], params.lang); - const t = uiDictionary[params.lang].blog; if (!page) notFound(); @@ -46,7 +45,7 @@ export default async function Page(props: { return (
-
+
{/* Structured data for the article */} @@ -55,18 +54,24 @@ export default async function Page(props: { description={data.description ?? data.title} datePublished={new Date(data.date).toISOString()} dateModified={new Date(data.lastModified ?? data.date).toISOString()} - authorName={data.author} + authorName={data.author ?? ""} url={canonical} imageUrl={data.image} /> -
-

+
+ +

{data.title}

{data.description}

-
-
+
+
-
-
-

{t.writtenBy}

-

{data.author}

-
-
-

{t.at}

-

- {displayDate(new Date(data.date), params.lang)} -

-
-

@@ -133,7 +126,7 @@ export async function generateMetadata(props: { description: data.description ?? data.title, publishedTime, modifiedTime, - authors: [data.author], + authors: data.author ? [data.author] : [], tags, image: ogImageUrl, url: canonical, diff --git a/app/[lang]/(main)/blog/atom.xml/route.ts b/app/[lang]/(main)/blog/atom.xml/route.ts index 8210875..866c659 100644 --- a/app/[lang]/(main)/blog/atom.xml/route.ts +++ b/app/[lang]/(main)/blog/atom.xml/route.ts @@ -38,7 +38,7 @@ export async function GET( ${link} ${updated} ${escape(data.description ?? data.title)} - ${escape(data.author)} + ${data.author ? `${escape(data.author)}` : ""} `; }) .join(""); diff --git a/app/[lang]/(main)/blog/page.tsx b/app/[lang]/(main)/blog/page.tsx index 2d4923c..d5462d7 100644 --- a/app/[lang]/(main)/blog/page.tsx +++ b/app/[lang]/(main)/blog/page.tsx @@ -60,22 +60,6 @@ export default async function Page({ {post.data.description}

-
- {/* eslint-disable-next-line @next/next/no-img-element */} - {`${post.data.author} -
-

- - - {post.data.author} - -

-
-
))}
diff --git a/app/[lang]/(main)/blog/rss.xml/route.ts b/app/[lang]/(main)/blog/rss.xml/route.ts index c1fbad8..832739c 100644 --- a/app/[lang]/(main)/blog/rss.xml/route.ts +++ b/app/[lang]/(main)/blog/rss.xml/route.ts @@ -38,7 +38,7 @@ export async function GET( ${link} ${pub} ${escape(data.description ?? data.title)} - ${escape(data.author)} + ${data.author ? `${escape(data.author)}` : ""} `; }) .join(""); diff --git a/source.config.ts b/source.config.ts index 0559d72..e9ffdde 100644 --- a/source.config.ts +++ b/source.config.ts @@ -21,9 +21,9 @@ export const blog = defineCollections({ type: "doc", dir: "content/blog", schema: frontmatterSchema.extend({ - author: z.string(), - authorAvatarLink: z.string().url().or(z.string()), - authorLink: z.string().url(), + author: z.string().optional(), + authorAvatarLink: z.string().url().or(z.string()).optional(), + authorLink: z.string().url().optional(), date: z.date(), // Optional SEO fields image: z.string().url().optional(),