From a8cf72e981f486508201c3fc616dca658e2ed424 Mon Sep 17 00:00:00 2001 From: Rainnny7 Date: Sat, 20 Apr 2024 01:33:33 -0400 Subject: [PATCH] Docs page --- Frontend/bun.lockb | Bin 180391 -> 258643 bytes Frontend/next.config.mjs | 11 ++- Frontend/package.json | 5 ++ .../src/app/(pages)/docs/[[...slug]]/page.tsx | 26 +++++++ Frontend/src/app/(pages)/docs/layout.tsx | 20 ++++++ Frontend/src/app/(pages)/docs/page.tsx | 48 ------------- Frontend/src/app/(pages)/mojang/page.tsx | 2 +- .../app/(pages)/player/[[...slug]]/page.tsx | 10 +-- .../app/(pages)/server/[[...slug]]/page.tsx | 4 +- Frontend/src/app/common/mdxUtils.ts | 66 ++++++++++++++++++ .../src/app/{lib => common}/stringUtils.ts | 0 Frontend/src/app/{lib => common}/utils.ts | 0 Frontend/src/app/components/counter.tsx | 2 +- Frontend/src/app/components/docs/sidebar.tsx | 13 ++++ Frontend/src/app/components/footer.tsx | 2 +- .../src/app/components/github-star-button.tsx | 9 +-- .../src/app/components/landing/background.tsx | 2 +- .../components/landing/featured-content.tsx | 2 +- Frontend/src/app/components/landing/hero.tsx | 2 +- .../src/app/components/minecraft-button.tsx | 2 +- Frontend/src/app/components/navbar.tsx | 2 +- .../app/components/player/player-result.tsx | 7 +- .../app/components/server/server-result.tsx | 2 +- .../app/components/server/server-search.tsx | 2 +- Frontend/src/app/components/ui/alert.tsx | 2 +- Frontend/src/app/components/ui/badge.tsx | 2 +- Frontend/src/app/components/ui/button.tsx | 2 +- .../src/app/components/ui/context-menu.tsx | 2 +- Frontend/src/app/components/ui/input.tsx | 2 +- Frontend/src/app/components/ui/label.tsx | 2 +- Frontend/src/app/components/ui/select.tsx | 2 +- Frontend/src/app/components/ui/skeleton.tsx | 2 +- Frontend/src/app/components/ui/toast.tsx | 2 +- Frontend/src/app/components/ui/tooltip.tsx | 2 +- Frontend/src/app/layout.tsx | 2 +- Frontend/src/app/not-found.tsx | 2 +- Frontend/src/app/types/mdx.d.ts | 41 +++++++++++ Frontend/src/markdown/docs/bob.mdx | 8 +++ Frontend/src/markdown/docs/home.mdx | 8 +++ Frontend/src/mdx-components.tsx | 10 +++ Frontend/tailwind.config.ts | 2 +- Frontend/tsconfig.json | 3 +- 42 files changed, 241 insertions(+), 94 deletions(-) create mode 100644 Frontend/src/app/(pages)/docs/[[...slug]]/page.tsx create mode 100644 Frontend/src/app/(pages)/docs/layout.tsx delete mode 100644 Frontend/src/app/(pages)/docs/page.tsx create mode 100644 Frontend/src/app/common/mdxUtils.ts rename Frontend/src/app/{lib => common}/stringUtils.ts (100%) rename Frontend/src/app/{lib => common}/utils.ts (100%) create mode 100644 Frontend/src/app/components/docs/sidebar.tsx create mode 100644 Frontend/src/app/types/mdx.d.ts create mode 100644 Frontend/src/markdown/docs/bob.mdx create mode 100644 Frontend/src/markdown/docs/home.mdx create mode 100644 Frontend/src/mdx-components.tsx diff --git a/Frontend/bun.lockb b/Frontend/bun.lockb index a4ee358a8cb6d715f7d77c8c3968a131e49c3ba1..0bfd867ba5327b714b306c5f41c1b0494fd5aad6 100644 GIT binary patch delta 85507 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ΞNH>~ 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 delta 35179 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 { + const content: DocsContentMetadata | undefined = getDocsContent().find( + (metadata: DocsContentMetadata): boolean => + metadata.slug === (slug ? slug[0] : "home") + ); // Get the content to display based on the provided slug + + // Return a 404 if the content is not found + if (!content) { + notFound(); + } + + return
{content.title}
; +}; +export default ContentPage; diff --git a/Frontend/src/app/(pages)/docs/layout.tsx b/Frontend/src/app/(pages)/docs/layout.tsx new file mode 100644 index 0000000..fb1fb01 --- /dev/null +++ b/Frontend/src/app/(pages)/docs/layout.tsx @@ -0,0 +1,20 @@ +import { ReactElement, ReactNode } from "react"; +import Sidebar from "@/components/docs/sidebar"; + +/** + * The layout for the docs page. + * + * @param children the children of this layout + * @returns the layout jsx + */ +const DocumentationLayout = ({ + children, +}: Readonly<{ + children: ReactNode; +}>): ReactElement => ( +
+ + {children} +
+); +export default DocumentationLayout; diff --git a/Frontend/src/app/(pages)/docs/page.tsx b/Frontend/src/app/(pages)/docs/page.tsx deleted file mode 100644 index 681ed1b..0000000 --- a/Frontend/src/app/(pages)/docs/page.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import Creeper from "@/components/creeper"; -import { minecrafter } from "@/font/fonts"; -import { cn } from "@/lib/utils"; -import { Metadata } from "next"; -import Link from "next/link"; -import { ReactElement } from "react"; - -/** - * Page metadata. - */ -export const metadata: Metadata = { - title: "Docs", -}; - -/** - * The documentation page. - * - * @returns the page jsx - */ -const DocsPage = (): ReactElement => ( -
- {/* Creeper */} - - - {/* Header */} -

- Documentation -

- - {/* Error */} -

- This page is still under construction, however we do have a{" "} - - Wiki - - ! -

-
-); -export default DocsPage; diff --git a/Frontend/src/app/(pages)/mojang/page.tsx b/Frontend/src/app/(pages)/mojang/page.tsx index 917f6e9..dca65c2 100644 --- a/Frontend/src/app/(pages)/mojang/page.tsx +++ b/Frontend/src/app/(pages)/mojang/page.tsx @@ -1,5 +1,5 @@ import { minecrafter } from "@/font/fonts"; -import { cn } from "@/lib/utils"; +import { cn } from "@/app/common/utils"; import { Metadata } from "next"; import Link from "next/link"; import { ReactElement } from "react"; diff --git a/Frontend/src/app/(pages)/player/[[...slug]]/page.tsx b/Frontend/src/app/(pages)/player/[[...slug]]/page.tsx index c39fa6f..88c185d 100644 --- a/Frontend/src/app/(pages)/player/[[...slug]]/page.tsx +++ b/Frontend/src/app/(pages)/player/[[...slug]]/page.tsx @@ -3,7 +3,7 @@ import PlayerResult from "@/components/player/player-result"; import PlayerSearch from "@/components/player/player-search"; import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; import { minecrafter } from "@/font/fonts"; -import { cn } from "@/lib/utils"; +import { cn } from "@/app/common/utils"; import { PageProps } from "@/types/page"; import { ExclamationCircleIcon } from "@heroicons/react/24/outline"; import { Metadata, Viewport } from "next"; @@ -70,7 +70,7 @@ const PlayerPage = async ({ params }: PageProps): Promise => { export const generateMetadata = async ({ params, }: PageProps): Promise => { - const embed: Metadata | undefined = await getPageEmbed( + const embed: Metadata | undefined = await getPlayerEmbed( trimQuery(params.slug?.[0]) ); // Get the page embed @@ -92,10 +92,10 @@ export const generateMetadata = async ({ export const generateViewport = async ({ params, }: PageProps): Promise => { - const embed: Metadata | undefined = await getPageEmbed( + const embed: Metadata | undefined = await getPlayerEmbed( trimQuery(params.slug?.[0]) ); // Get the page embed - return embed ? {} : { themeColor: "#FF5555" }; + return embed ? {} : { themeColor: "#AA0000" }; }; /** @@ -118,7 +118,7 @@ const trimQuery = (query: string | undefined): string | undefined => { * @param query the query to embed, if any * @returns the page embed */ -const getPageEmbed = async ( +const getPlayerEmbed = async ( query: string | undefined ): Promise => { if (!query) { diff --git a/Frontend/src/app/(pages)/server/[[...slug]]/page.tsx b/Frontend/src/app/(pages)/server/[[...slug]]/page.tsx index ee77fdb..392ea38 100644 --- a/Frontend/src/app/(pages)/server/[[...slug]]/page.tsx +++ b/Frontend/src/app/(pages)/server/[[...slug]]/page.tsx @@ -3,8 +3,8 @@ import ServerResult from "@/components/server/server-result"; import ServerSearch from "@/components/server/server-search"; import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; import { minecrafter } from "@/font/fonts"; -import { capitalize } from "@/lib/stringUtils"; -import { cn } from "@/lib/utils"; +import { capitalize } from "@/app/common/stringUtils"; +import { cn } from "@/app/common/utils"; import { PageProps } from "@/types/page"; import { ExclamationCircleIcon } from "@heroicons/react/24/outline"; import { Metadata } from "next"; diff --git a/Frontend/src/app/common/mdxUtils.ts b/Frontend/src/app/common/mdxUtils.ts new file mode 100644 index 0000000..865fc85 --- /dev/null +++ b/Frontend/src/app/common/mdxUtils.ts @@ -0,0 +1,66 @@ +import * as fs from "node:fs"; +import path from "node:path"; + +/** + * The regex to match for metadata. + */ +const METADATA_REGEX: RegExp = /---\s*([\s\S]*?)\s*---/; + +/** + * Get the content to + * display in the docs. + */ +export const getDocsContent = (): DocsContentMetadata[] => + getMetadata( + path.join(process.cwd(), "src", "markdown", "docs") + ); + +/** + * Get the metadata of mdx + * files in the given directory. + * + * @param directory the directory to search + */ +export const getMetadata = (directory: string): T[] => { + const files: string[] = fs + .readdirSync(directory) + .filter((file: string): boolean => path.extname(file) === ".mdx"); // Read the MDX files + return files.map((file: string): T => { + const filePath: string = path.join(directory, file); // The path of the file + return { + ...parseMetadata(fs.readFileSync(filePath, "utf-8")), + slug: path.basename(file, path.extname(file)), + }; // Map each file to its metadata + }); +}; + +/** + * Parse the metadata from + * the given content. + * + * @param content the content to parse + * @returns the metadata and content + * @template T the type of metadata + */ +const parseMetadata = (content: string): T => { + const metadataBlock: string = METADATA_REGEX.exec(content)![1]; // Get the block of metadata + content = content.replace(METADATA_REGEX, "").trim(); // Remove the metadata block from the content + let metadata: Partial<{ + [key: string]: string; + }> = {}; // The metadata to return + + // Parse the metadata block as a key-value pair + metadataBlock + .trim() // Trim any leading or trailing whitespace + .split("\n") // Get each line + .forEach((line: string): void => { + const split: string[] = line.split(": "); // Split the metadata by the colon + let value: string = split[1].trim(); // The value of the metadata + value = value.replace(/^['"](.*)['"]$/, "$1"); // Remove quotes + metadata[split[0].trim()] = value; // Add the metadata to the object + }); + + // Return the metadata and content. The initial + // slug is empty, and is defined later on. + return { ...metadata, content } as T; +}; diff --git a/Frontend/src/app/lib/stringUtils.ts b/Frontend/src/app/common/stringUtils.ts similarity index 100% rename from Frontend/src/app/lib/stringUtils.ts rename to Frontend/src/app/common/stringUtils.ts diff --git a/Frontend/src/app/lib/utils.ts b/Frontend/src/app/common/utils.ts similarity index 100% rename from Frontend/src/app/lib/utils.ts rename to Frontend/src/app/common/utils.ts diff --git a/Frontend/src/app/components/counter.tsx b/Frontend/src/app/components/counter.tsx index 774dea3..8914f49 100644 --- a/Frontend/src/app/components/counter.tsx +++ b/Frontend/src/app/components/counter.tsx @@ -1,7 +1,7 @@ "use client"; import { minecrafter } from "@/font/fonts"; -import { cn } from "@/lib/utils"; +import { cn } from "@/app/common/utils"; import CountUp from "react-countup"; import { ReactElement } from "react"; diff --git a/Frontend/src/app/components/docs/sidebar.tsx b/Frontend/src/app/components/docs/sidebar.tsx new file mode 100644 index 0000000..c8ab3af --- /dev/null +++ b/Frontend/src/app/components/docs/sidebar.tsx @@ -0,0 +1,13 @@ +import { ReactElement } from "react"; + +/** + * The sidebar for the docs page. + * + * @returns the sidebar jsx + */ +const Sidebar = (): ReactElement => ( +
+

SIDEBAR

+
+); +export default Sidebar; diff --git a/Frontend/src/app/components/footer.tsx b/Frontend/src/app/components/footer.tsx index 01671e9..c8d00bf 100644 --- a/Frontend/src/app/components/footer.tsx +++ b/Frontend/src/app/components/footer.tsx @@ -3,7 +3,7 @@ import Link from "next/link"; import { ReactElement } from "react"; import config from "@/config"; import { minecrafter } from "@/font/fonts"; -import { cn } from "@/lib/utils"; +import { cn } from "@/app/common/utils"; import { FooterLinks } from "@/types/config"; /** diff --git a/Frontend/src/app/components/github-star-button.tsx b/Frontend/src/app/components/github-star-button.tsx index 312a432..75e607e 100644 --- a/Frontend/src/app/components/github-star-button.tsx +++ b/Frontend/src/app/components/github-star-button.tsx @@ -4,14 +4,7 @@ import MinecraftButton from "@/components/minecraft-button"; import { Skeleton } from "@/components/ui/skeleton"; import { StarIcon } from "@heroicons/react/24/outline"; import Link from "next/link"; -import { - Dispatch, - ReactElement, - SetStateAction, - Suspense, - useEffect, - useState, -} from "react"; +import { Dispatch, ReactElement, SetStateAction, Suspense, useEffect, useState } from "react"; /** * The button to display the amount diff --git a/Frontend/src/app/components/landing/background.tsx b/Frontend/src/app/components/landing/background.tsx index dbafa9d..84f7fce 100644 --- a/Frontend/src/app/components/landing/background.tsx +++ b/Frontend/src/app/components/landing/background.tsx @@ -1,5 +1,5 @@ import { ReactElement } from "react"; -import { cn } from "../../lib/utils"; +import { cn } from "@/app/common/utils"; /** * The background hero component. diff --git a/Frontend/src/app/components/landing/featured-content.tsx b/Frontend/src/app/components/landing/featured-content.tsx index 89c9a69..e84b0ee 100644 --- a/Frontend/src/app/components/landing/featured-content.tsx +++ b/Frontend/src/app/components/landing/featured-content.tsx @@ -1,6 +1,6 @@ import config from "@/config"; import { minecrafter } from "@/font/fonts"; -import { cn } from "@/lib/utils"; +import { cn } from "@/app/common/utils"; import { FeaturedItemProps } from "@/types/config"; import Link from "next/link"; import { ReactElement } from "react"; diff --git a/Frontend/src/app/components/landing/hero.tsx b/Frontend/src/app/components/landing/hero.tsx index 860a3e2..e9def42 100644 --- a/Frontend/src/app/components/landing/hero.tsx +++ b/Frontend/src/app/components/landing/hero.tsx @@ -2,7 +2,7 @@ import GitHubStarButton from "@/components/github-star-button"; import MinecraftButton from "@/components/minecraft-button"; import config from "@/config"; import { minecrafter } from "@/font/fonts"; -import { cn } from "@/lib/utils"; +import { cn } from "@/app/common/utils"; import Link from "next/link"; import { ReactElement } from "react"; diff --git a/Frontend/src/app/components/minecraft-button.tsx b/Frontend/src/app/components/minecraft-button.tsx index fc00ecc..a0841db 100644 --- a/Frontend/src/app/components/minecraft-button.tsx +++ b/Frontend/src/app/components/minecraft-button.tsx @@ -1,5 +1,5 @@ import { Button } from "@/components/ui/button"; -import { cn } from "@/lib/utils"; +import { cn } from "@/app/common/utils"; import { ButtonHTMLAttributes, ReactElement, ReactNode } from "react"; /** diff --git a/Frontend/src/app/components/navbar.tsx b/Frontend/src/app/components/navbar.tsx index e4830bd..089d9d4 100644 --- a/Frontend/src/app/components/navbar.tsx +++ b/Frontend/src/app/components/navbar.tsx @@ -3,7 +3,7 @@ import GitHubStarButton from "@/components/github-star-button"; import config from "@/config"; import { minecrafter } from "@/font/fonts"; -import { cn } from "@/lib/utils"; +import { cn } from "@/app/common/utils"; import Image from "next/image"; import Link from "next/link"; import { usePathname } from "next/navigation"; diff --git a/Frontend/src/app/components/player/player-result.tsx b/Frontend/src/app/components/player/player-result.tsx index 7dabdbd..b332f97 100644 --- a/Frontend/src/app/components/player/player-result.tsx +++ b/Frontend/src/app/components/player/player-result.tsx @@ -1,11 +1,6 @@ import CopyButton from "@/components/copy-button"; import { Badge } from "@/components/ui/badge"; -import { - ContextMenu, - ContextMenuContent, - ContextMenuItem, - ContextMenuTrigger, -} from "@/components/ui/context-menu"; +import { ContextMenu, ContextMenuContent, ContextMenuItem, ContextMenuTrigger } from "@/components/ui/context-menu"; import config from "@/config"; import Image from "next/image"; import Link from "next/link"; diff --git a/Frontend/src/app/components/server/server-result.tsx b/Frontend/src/app/components/server/server-result.tsx index 9a6341a..f8e70f1 100644 --- a/Frontend/src/app/components/server/server-result.tsx +++ b/Frontend/src/app/components/server/server-result.tsx @@ -1,4 +1,4 @@ -import { cn } from "@/lib/utils"; +import { cn } from "@/app/common/utils"; import Image from "next/image"; import { ReactElement } from "react"; import { diff --git a/Frontend/src/app/components/server/server-search.tsx b/Frontend/src/app/components/server/server-search.tsx index 850fd76..4a2a0d3 100644 --- a/Frontend/src/app/components/server/server-search.tsx +++ b/Frontend/src/app/components/server/server-search.tsx @@ -9,7 +9,7 @@ import { SelectTrigger, SelectValue, } from "@/components/ui/select"; -import { capitalize } from "@/lib/stringUtils"; +import { capitalize } from "@/app/common/stringUtils"; import { redirect } from "next/navigation"; import { ReactElement } from "react"; import { ServerPlatform } from "restfulmc-lib"; diff --git a/Frontend/src/app/components/ui/alert.tsx b/Frontend/src/app/components/ui/alert.tsx index b4eeba6..e101ac8 100644 --- a/Frontend/src/app/components/ui/alert.tsx +++ b/Frontend/src/app/components/ui/alert.tsx @@ -1,7 +1,7 @@ import { cva, type VariantProps } from "class-variance-authority"; import * as React from "react"; -import { cn } from "@/app/lib/utils"; +import { cn } from "@/app/common/utils"; const alertVariants = cva( "relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground", diff --git a/Frontend/src/app/components/ui/badge.tsx b/Frontend/src/app/components/ui/badge.tsx index 5990b73..a358d76 100644 --- a/Frontend/src/app/components/ui/badge.tsx +++ b/Frontend/src/app/components/ui/badge.tsx @@ -1,7 +1,7 @@ import * as React from "react"; import { cva, type VariantProps } from "class-variance-authority"; -import { cn } from "@/app/lib/utils"; +import { cn } from "@/app/common/utils"; const badgeVariants = cva( "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2", diff --git a/Frontend/src/app/components/ui/button.tsx b/Frontend/src/app/components/ui/button.tsx index dc76d90..f222dc1 100644 --- a/Frontend/src/app/components/ui/button.tsx +++ b/Frontend/src/app/components/ui/button.tsx @@ -2,7 +2,7 @@ import * as React from "react"; import { Slot } from "@radix-ui/react-slot"; import { cva, type VariantProps } from "class-variance-authority"; -import { cn } from "@/app/lib/utils"; +import { cn } from "@/app/common/utils"; const buttonVariants = cva( "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50", diff --git a/Frontend/src/app/components/ui/context-menu.tsx b/Frontend/src/app/components/ui/context-menu.tsx index a7812cc..0d89fb2 100644 --- a/Frontend/src/app/components/ui/context-menu.tsx +++ b/Frontend/src/app/components/ui/context-menu.tsx @@ -4,7 +4,7 @@ import * as React from "react"; import * as ContextMenuPrimitive from "@radix-ui/react-context-menu"; import { Check, ChevronRight, Circle } from "lucide-react"; -import { cn } from "@/app/lib/utils"; +import { cn } from "@/app/common/utils"; const ContextMenu = ContextMenuPrimitive.Root; diff --git a/Frontend/src/app/components/ui/input.tsx b/Frontend/src/app/components/ui/input.tsx index bc0e2df..8a07036 100644 --- a/Frontend/src/app/components/ui/input.tsx +++ b/Frontend/src/app/components/ui/input.tsx @@ -1,6 +1,6 @@ import * as React from "react"; -import { cn } from "@/app/lib/utils"; +import { cn } from "@/app/common/utils"; export interface InputProps extends React.InputHTMLAttributes {} diff --git a/Frontend/src/app/components/ui/label.tsx b/Frontend/src/app/components/ui/label.tsx index dbb2d78..c1259fa 100644 --- a/Frontend/src/app/components/ui/label.tsx +++ b/Frontend/src/app/components/ui/label.tsx @@ -4,7 +4,7 @@ import * as LabelPrimitive from "@radix-ui/react-label"; import { cva, type VariantProps } from "class-variance-authority"; import * as React from "react"; -import { cn } from "@/app/lib/utils"; +import { cn } from "@/app/common/utils"; const labelVariants = cva( "text-sm font-medium text-zinc-300 leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70" diff --git a/Frontend/src/app/components/ui/select.tsx b/Frontend/src/app/components/ui/select.tsx index 5329a24..bb86cb8 100644 --- a/Frontend/src/app/components/ui/select.tsx +++ b/Frontend/src/app/components/ui/select.tsx @@ -4,7 +4,7 @@ import * as React from "react"; import * as SelectPrimitive from "@radix-ui/react-select"; import { Check, ChevronDown, ChevronUp } from "lucide-react"; -import { cn } from "@/app/lib/utils"; +import { cn } from "@/app/common/utils"; const Select = SelectPrimitive.Root; diff --git a/Frontend/src/app/components/ui/skeleton.tsx b/Frontend/src/app/components/ui/skeleton.tsx index e8cde28..0020342 100644 --- a/Frontend/src/app/components/ui/skeleton.tsx +++ b/Frontend/src/app/components/ui/skeleton.tsx @@ -1,4 +1,4 @@ -import { cn } from "@/app/lib/utils"; +import { cn } from "@/app/common/utils"; function Skeleton({ className, diff --git a/Frontend/src/app/components/ui/toast.tsx b/Frontend/src/app/components/ui/toast.tsx index a32532a..cd8ad97 100644 --- a/Frontend/src/app/components/ui/toast.tsx +++ b/Frontend/src/app/components/ui/toast.tsx @@ -5,7 +5,7 @@ import { cva, type VariantProps } from "class-variance-authority"; import { X } from "lucide-react"; import * as React from "react"; -import { cn } from "@/app/lib/utils"; +import { cn } from "@/app/common/utils"; const ToastProvider = ToastPrimitives.Provider; diff --git a/Frontend/src/app/components/ui/tooltip.tsx b/Frontend/src/app/components/ui/tooltip.tsx index 7853f95..3c5f228 100644 --- a/Frontend/src/app/components/ui/tooltip.tsx +++ b/Frontend/src/app/components/ui/tooltip.tsx @@ -3,7 +3,7 @@ import * as React from "react"; import * as TooltipPrimitive from "@radix-ui/react-tooltip"; -import { cn } from "@/app/lib/utils"; +import { cn } from "@/app/common/utils"; const TooltipProvider = TooltipPrimitive.Provider; diff --git a/Frontend/src/app/layout.tsx b/Frontend/src/app/layout.tsx index c258a06..58affc6 100644 --- a/Frontend/src/app/layout.tsx +++ b/Frontend/src/app/layout.tsx @@ -4,7 +4,7 @@ import { Toaster } from "@/components/ui/sonner"; import { TooltipProvider } from "@/components/ui/tooltip"; import config from "@/config"; import { notoSans } from "@/font/fonts"; -import { cn } from "@/lib/utils"; +import { cn } from "@/app/common/utils"; import type { Metadata, Viewport } from "next"; import PlausibleProvider from "next-plausible"; import { ReactElement, ReactNode } from "react"; diff --git a/Frontend/src/app/not-found.tsx b/Frontend/src/app/not-found.tsx index 7d077bc..e5b3efc 100644 --- a/Frontend/src/app/not-found.tsx +++ b/Frontend/src/app/not-found.tsx @@ -1,6 +1,6 @@ import Creeper from "@/components/creeper"; import { minecrafter } from "@/font/fonts"; -import { cn } from "@/lib/utils"; +import { cn } from "@/app/common/utils"; import { ReactElement } from "react"; /** diff --git a/Frontend/src/app/types/mdx.d.ts b/Frontend/src/app/types/mdx.d.ts new file mode 100644 index 0000000..d813282 --- /dev/null +++ b/Frontend/src/app/types/mdx.d.ts @@ -0,0 +1,41 @@ +/** + * Metadata for documentation content. + */ +type DocsContentMetadata = MDXMetadata & { + /** + * The title of this content. + */ + title: string; + + /** + * The date this content was published. + */ + published: string; + + /** + * The summary of this content. + */ + summary: string; +}; + +/** + * Metadata for an MDX file. + */ +type MDXMetadata = { + /** + * The slug of the file, defined once read. + */ + slug: string; + + /** + * The metadata of the file. + */ + metadata: { + [key: string]: string; + }; + + /** + * The content of the file. + */ + content: string; +}; diff --git a/Frontend/src/markdown/docs/bob.mdx b/Frontend/src/markdown/docs/bob.mdx new file mode 100644 index 0000000..8c48765 --- /dev/null +++ b/Frontend/src/markdown/docs/bob.mdx @@ -0,0 +1,8 @@ +--- +title: 'option utinam malorum tempor sapien.' +published: '04-19-2024' +summary: 'utinam delicata nominavi ornare eirmod pharetra decore interesset necessitatibus.' +--- + +# bob +HELLO JOHN \ No newline at end of file diff --git a/Frontend/src/markdown/docs/home.mdx b/Frontend/src/markdown/docs/home.mdx new file mode 100644 index 0000000..0b0f139 --- /dev/null +++ b/Frontend/src/markdown/docs/home.mdx @@ -0,0 +1,8 @@ +--- +title: 'HOME YES.' +published: '04-19-2024' +summary: 'utinam delicata nominavi ornare eirmod pharetra decore interesset necessitatibus.' +--- + +# bob +HELLO JOHN \ No newline at end of file diff --git a/Frontend/src/mdx-components.tsx b/Frontend/src/mdx-components.tsx new file mode 100644 index 0000000..107f5c3 --- /dev/null +++ b/Frontend/src/mdx-components.tsx @@ -0,0 +1,10 @@ +import type { MDXComponents } from "mdx/types"; + +export const useMDXComponents = (components: MDXComponents): MDXComponents => { + return { + h1: ({ children }) => ( +

{children}

+ ), + ...components, + }; +}; diff --git a/Frontend/tailwind.config.ts b/Frontend/tailwind.config.ts index a894293..b6750b8 100644 --- a/Frontend/tailwind.config.ts +++ b/Frontend/tailwind.config.ts @@ -4,7 +4,7 @@ const { screens } = require("tailwindcss/defaultTheme"); const config = { darkMode: ["class"], - content: ["./src/app/**/*.{ts,tsx}"], + content: ["./src/app/**/*.{ts,tsx,mdx}"], theme: { container: { center: true, diff --git a/Frontend/tsconfig.json b/Frontend/tsconfig.json index bce7d9a..9dc3f85 100644 --- a/Frontend/tsconfig.json +++ b/Frontend/tsconfig.json @@ -24,7 +24,8 @@ "@/provider/*": ["./src/app/provider/*"], "@/font/*": ["./src/app/font/*"], "@/types/*": ["./src/app/types/*"], - "@/lib/*": ["./src/app/lib/*"], + "@/lib/*": ["./src/app/common/*"], + "@/markdown/*": ["./src/markdown/*"], "@/configJson": ["./config.json"] } },