Compare commits
3 Commits
fe43779a67
...
9b0e5bfcf7
Author | SHA1 | Date | |
---|---|---|---|
9b0e5bfcf7 | |||
3ca0b5be81 | |||
400f878939 |
@ -2,6 +2,7 @@ import { getDocumentation } from "@/app/common/documentation";
|
|||||||
import { CustomMDX } from "@/app/components/mdx-components";
|
import { CustomMDX } from "@/app/components/mdx-components";
|
||||||
import { Metadata } from "next";
|
import { Metadata } from "next";
|
||||||
import { generateEmbed } from "@/app/common/embed";
|
import { generateEmbed } from "@/app/common/embed";
|
||||||
|
import { Title } from "@/app/components/title";
|
||||||
|
|
||||||
type DocumentationPageParams = {
|
type DocumentationPageParams = {
|
||||||
params: {
|
params: {
|
||||||
@ -17,16 +18,30 @@ export async function generateStaticParams() {
|
|||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function generateMetadata({ params: { slug } }: DocumentationPageParams): Promise<Metadata> {
|
/**
|
||||||
const pageSlug = slug?.join("/");
|
* Gets a documentation page by its slug.
|
||||||
|
*
|
||||||
|
* @param slug The slug of the documentation page.
|
||||||
|
*/
|
||||||
|
function getPage(slug?: string) {
|
||||||
const documentationPages = getDocumentation();
|
const documentationPages = getDocumentation();
|
||||||
let page = documentationPages.find(page => page.slug === pageSlug);
|
let page = documentationPages.find(page => page.slug === slug);
|
||||||
|
|
||||||
// Use the landing page on "/documentation"
|
// Fallback to the landing page
|
||||||
if (!page && !slug) {
|
if (!page && !slug) {
|
||||||
page = documentationPages.find(page => page.slug === "landing");
|
page = documentationPages.find(page => page.slug === "landing");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We still can't find the page, return undefined
|
||||||
|
if (!page) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
return page;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function generateMetadata({ params: { slug } }: DocumentationPageParams): Promise<Metadata> {
|
||||||
|
const page = getPage(slug?.join("/"));
|
||||||
|
|
||||||
// Fallback to page not found
|
// Fallback to page not found
|
||||||
if (!page) {
|
if (!page) {
|
||||||
return generateEmbed({
|
return generateEmbed({
|
||||||
@ -36,20 +51,13 @@ export async function generateMetadata({ params: { slug } }: DocumentationPagePa
|
|||||||
}
|
}
|
||||||
|
|
||||||
return generateEmbed({
|
return generateEmbed({
|
||||||
title: page.metadata.title,
|
title: `${page.metadata.title} - Documentation`,
|
||||||
description: `${page.metadata.description}\n\nClick to view this page`,
|
description: `${page.metadata.description}\n\nClick to view this page`,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function Page({ params: { slug } }: DocumentationPageParams) {
|
export default function Page({ params: { slug } }: DocumentationPageParams) {
|
||||||
const pageSlug = slug?.join("/");
|
const page = getPage(slug?.join("/"));
|
||||||
const documentationPages = getDocumentation();
|
|
||||||
let page = documentationPages.find(page => page.slug === pageSlug);
|
|
||||||
|
|
||||||
// Use the landing page on "/documentation"
|
|
||||||
if (!page && !slug) {
|
|
||||||
page = documentationPages.find(page => page.slug === "landing");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Page was not found, show an error page
|
// Page was not found, show an error page
|
||||||
if (!page) {
|
if (!page) {
|
||||||
@ -65,8 +73,7 @@ export default function Page({ params: { slug } }: DocumentationPageParams) {
|
|||||||
<div className="w-full px-4 flex flex-col gap-4">
|
<div className="w-full px-4 flex flex-col gap-4">
|
||||||
{/* The documentation page title and description */}
|
{/* The documentation page title and description */}
|
||||||
<div className="text-center mb-4">
|
<div className="text-center mb-4">
|
||||||
{page.metadata.title && <h1 className="text-2xl">{page.metadata.title}</h1>}
|
<Title title={page.metadata.title} subtitle={page.metadata.description} />
|
||||||
{page.metadata.description && <h1>{page.metadata.description}</h1>}
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* The content of the documentation page */}
|
{/* The content of the documentation page */}
|
||||||
|
@ -14,7 +14,7 @@ type Metadata = {
|
|||||||
/**
|
/**
|
||||||
* The description of the documentation page.
|
* The description of the documentation page.
|
||||||
*/
|
*/
|
||||||
description?: string;
|
description: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import { CodeHighlighter } from "@/app/components/code-highlighter";
|
import { CodeHighlighter } from "@/app/components/code-highlighter";
|
||||||
import { Separator } from "@/app/components/ui/separator";
|
import { Separator } from "@/app/components/ui/separator";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
|
import { ReactElement } from "react";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a heading component.
|
* Create a heading component.
|
||||||
@ -8,7 +9,7 @@ import Link from "next/link";
|
|||||||
* @param level The level of the heading.
|
* @param level The level of the heading.
|
||||||
* @param props The props to pass to the heading.
|
* @param props The props to pass to the heading.
|
||||||
*/
|
*/
|
||||||
export function formatHeading(level: number, props: any) {
|
export function formatHeading(level: number, props: any): ReactElement {
|
||||||
const Tag = `h${level}`;
|
const Tag = `h${level}`;
|
||||||
const paddingBottom = level > 1 ? "pt-6" : "";
|
const paddingBottom = level > 1 ? "pt-6" : "";
|
||||||
const textSize = 4 - level;
|
const textSize = 4 - level;
|
||||||
@ -26,7 +27,7 @@ export function formatHeading(level: number, props: any) {
|
|||||||
*
|
*
|
||||||
* @param props The props to pass to the code block.
|
* @param props The props to pass to the code block.
|
||||||
*/
|
*/
|
||||||
export function formatCode(props: any) {
|
export function formatCode(props: any): ReactElement {
|
||||||
if (!props.className) {
|
if (!props.className) {
|
||||||
return <code className="text-xs bg-secondary p-1 rounded-md leading-none" {...props} />;
|
return <code className="text-xs bg-secondary p-1 rounded-md leading-none" {...props} />;
|
||||||
}
|
}
|
||||||
@ -46,7 +47,7 @@ export function formatCode(props: any) {
|
|||||||
*
|
*
|
||||||
* @param props The props to pass to the list.
|
* @param props The props to pass to the list.
|
||||||
*/
|
*/
|
||||||
export function formatList(props: any) {
|
export function formatList(props: any): ReactElement {
|
||||||
return <ul className="list-disc pl-4 ml-2 pt-2">{props.children}</ul>;
|
return <ul className="list-disc pl-4 ml-2 pt-2">{props.children}</ul>;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -55,7 +56,7 @@ export function formatList(props: any) {
|
|||||||
*
|
*
|
||||||
* @param props The props to pass to the link.
|
* @param props The props to pass to the link.
|
||||||
*/
|
*/
|
||||||
export function formatLink(props: any) {
|
export function formatLink(props: any): ReactElement {
|
||||||
return (
|
return (
|
||||||
<Link href={props.href} className="text-primary hover:opacity-85 transition-all transform-gpu">
|
<Link href={props.href} className="text-primary hover:opacity-85 transition-all transform-gpu">
|
||||||
{props.children}
|
{props.children}
|
||||||
|
Reference in New Issue
Block a user