From 32ee621e7cbcb3c0c4cf066b8d6fec54e0100fef Mon Sep 17 00:00:00 2001 From: Ali Farooq Date: Sun, 19 May 2024 13:39:14 +0500 Subject: [PATCH] feat(saas): Replacing next-mdx-remote to fumadocs for blog --- pnpm-lock.yaml | 51 ++++++-- .../content/blogs/create-saas-in-1-day.mdx | 65 ++++++++++ .../saas/content/blogs/introduction.mdx | 120 ++++++++++++++++++ starterkits/saas/package.json | 2 +- .../{blog/[slug] => blogs/[...slug]}/page.tsx | 91 +++++++------ .../{blog => blogs}/_constants/page-config.ts | 0 .../src/app/(web)/{blog => blogs}/page.tsx | 31 +++-- .../saas/src/app/docs/[[...slug]]/page.tsx | 2 + starterkits/saas/src/app/layout.tsx | 1 - starterkits/saas/src/app/sitemap.ts | 2 +- starterkits/saas/src/app/source.ts | 18 ++- starterkits/saas/src/config/header.ts | 2 +- starterkits/saas/src/config/sidebar.ts | 2 +- starterkits/saas/src/config/support.ts | 2 +- starterkits/saas/src/config/urls.ts | 4 +- starterkits/saas/src/server/actions/blog.ts | 11 -- .../saas/src/server/actions/changelog.ts | 14 -- starterkits/saas/src/server/actions/docs.ts | 11 -- starterkits/saas/src/styles/globals.css | 12 -- starterkits/saas/src/styles/prism.css | 110 ---------------- 20 files changed, 309 insertions(+), 242 deletions(-) create mode 100644 starterkits/saas/content/blogs/create-saas-in-1-day.mdx create mode 100644 starterkits/saas/content/blogs/introduction.mdx rename starterkits/saas/src/app/(web)/{blog/[slug] => blogs/[...slug]}/page.tsx (54%) rename starterkits/saas/src/app/(web)/{blog => blogs}/_constants/page-config.ts (100%) rename starterkits/saas/src/app/(web)/{blog => blogs}/page.tsx (72%) delete mode 100644 starterkits/saas/src/server/actions/blog.ts delete mode 100644 starterkits/saas/src/server/actions/changelog.ts delete mode 100644 starterkits/saas/src/server/actions/docs.ts delete mode 100644 starterkits/saas/src/styles/prism.css diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cbb1854..0753eb3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -312,7 +312,7 @@ importers: version: 1.0.7(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.2.0)(react@18.2.0) '@t3-oss/env-nextjs': specifier: ^0.9.2 - version: 0.9.2(typescript@5.4.5)(zod@3.23.4) + version: 0.9.2(typescript@5.4.5)(zod@3.23.8) '@tanstack/react-query': specifier: ^5.29.2 version: 5.32.0(react@18.2.0) @@ -342,7 +342,7 @@ importers: version: 0.29.5(@types/react@18.3.1)(pg@8.11.5)(postgres@3.4.4)(react@18.2.0) drizzle-zod: specifier: ^0.5.1 - version: 0.5.1(drizzle-orm@0.29.5)(zod@3.23.4) + version: 0.5.1(drizzle-orm@0.29.5)(zod@3.23.8) fumadocs-core: specifier: ^11.1.1 version: 11.1.1(@types/react@18.3.1)(next@14.2.3)(react-dom@18.2.0)(react@18.2.0) @@ -440,8 +440,8 @@ importers: specifier: ^0.9.0 version: 0.9.0(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.2.0)(react@18.2.0) zod: - specifier: ^3.22.4 - version: 3.23.4 + specifier: ^3.23.8 + version: 3.23.8 zustand: specifier: ^4.5.2 version: 4.5.2(@types/react@18.3.1)(react@18.2.0) @@ -1309,14 +1309,14 @@ packages: engines: {node: '>=18.14.1'} dev: true - /@hono/zod-validator@0.2.1(hono@4.2.9)(zod@3.23.4): + /@hono/zod-validator@0.2.1(hono@4.2.9)(zod@3.23.8): resolution: {integrity: sha512-HFoxln7Q6JsE64qz2WBS28SD33UB2alp3aRKmcWnNLDzEL1BLsWfbdX6e1HIiUprHYTIXf5y7ax8eYidKUwyaA==} peerDependencies: hono: '>=3.9.0' zod: ^3.19.1 dependencies: hono: 4.2.9 - zod: 3.23.4 + zod: 3.23.8 dev: true /@hookform/resolvers@3.3.4(react-hook-form@7.51.3): @@ -2991,6 +2991,19 @@ packages: zod: 3.23.4 dev: false + /@t3-oss/env-core@0.9.2(typescript@5.4.5)(zod@3.23.8): + resolution: {integrity: sha512-KgWXljUTHgO3o7GMZQPAD5+P+HqpauMNNHowlm7V2b9IeMitSUpNKwG6xQrup/xARWHTdxRVIl0mSI4wCevQhQ==} + peerDependencies: + typescript: '>=5.0.0' + zod: ^3.0.0 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + typescript: 5.4.5 + zod: 3.23.8 + dev: false + /@t3-oss/env-nextjs@0.9.2(typescript@5.4.5)(zod@3.23.4): resolution: {integrity: sha512-dklHrgKLESStNVB67Jdbu6osxDYA+xNKaPBRerlnkEvzbCccSKMvZENx6EZebJuR4snqB3/yRykNMn/bdIAyiQ==} peerDependencies: @@ -3005,6 +3018,20 @@ packages: zod: 3.23.4 dev: false + /@t3-oss/env-nextjs@0.9.2(typescript@5.4.5)(zod@3.23.8): + resolution: {integrity: sha512-dklHrgKLESStNVB67Jdbu6osxDYA+xNKaPBRerlnkEvzbCccSKMvZENx6EZebJuR4snqB3/yRykNMn/bdIAyiQ==} + peerDependencies: + typescript: '>=5.0.0' + zod: ^3.0.0 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@t3-oss/env-core': 0.9.2(typescript@5.4.5)(zod@3.23.8) + typescript: 5.4.5 + zod: 3.23.8 + dev: false + /@tailwindcss/typography@0.5.13(tailwindcss@3.4.3): resolution: {integrity: sha512-ADGcJ8dX21dVVHIwTRgzrcunY6YY9uSlAHHGVKvkA+vLc5qLwEszvKts40lx7z0qc4clpjclwLeK5rVCV2P/uw==} peerDependencies: @@ -4503,7 +4530,7 @@ packages: dependencies: '@esbuild-kit/esm-loader': 2.6.5 '@hono/node-server': 1.11.1 - '@hono/zod-validator': 0.2.1(hono@4.2.9)(zod@3.23.4) + '@hono/zod-validator': 0.2.1(hono@4.2.9)(zod@3.23.8) camelcase: 7.0.1 chalk: 5.3.0 commander: 9.5.0 @@ -4517,7 +4544,7 @@ packages: minimatch: 7.4.6 semver: 7.6.0 superjson: 2.2.1 - zod: 3.23.4 + zod: 3.23.8 transitivePeerDependencies: - supports-color dev: true @@ -4534,7 +4561,7 @@ packages: glob: 8.1.0 hanji: 0.0.5 json-diff: 0.9.0 - zod: 3.23.4 + zod: 3.23.8 transitivePeerDependencies: - supports-color dev: true @@ -4700,14 +4727,14 @@ packages: postgres: 3.4.4 dev: false - /drizzle-zod@0.5.1(drizzle-orm@0.29.5)(zod@3.23.4): + /drizzle-zod@0.5.1(drizzle-orm@0.29.5)(zod@3.23.8): resolution: {integrity: sha512-C/8bvzUH/zSnVfwdSibOgFjLhtDtbKYmkbPbUCq46QZyZCH6kODIMSOgZ8R7rVjoI+tCj3k06MRJMDqsIeoS4A==} peerDependencies: drizzle-orm: '>=0.23.13' zod: '*' dependencies: drizzle-orm: 0.29.5(@types/react@18.3.1)(pg@8.11.5)(postgres@3.4.4)(react@18.2.0) - zod: 3.23.4 + zod: 3.23.8 dev: false /eastasianwidth@0.2.0: @@ -10300,10 +10327,10 @@ packages: /zod@3.23.4: resolution: {integrity: sha512-/AtWOKbBgjzEYYQRNfoGKHObgfAZag6qUJX1VbHo2PRBgS+wfWagEY2mizjfyAPcGesrJOcx/wcl0L9WnVrHFw==} + dev: false /zod@3.23.8: resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} - dev: false /zustand@4.5.2(@types/react@18.3.1)(react@18.2.0): resolution: {integrity: sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==} diff --git a/starterkits/saas/content/blogs/create-saas-in-1-day.mdx b/starterkits/saas/content/blogs/create-saas-in-1-day.mdx new file mode 100644 index 0000000..a47a6a3 --- /dev/null +++ b/starterkits/saas/content/blogs/create-saas-in-1-day.mdx @@ -0,0 +1,65 @@ +--- +title: Create a SaaS in 1 day +publishedAt: 2022-01-01 +readTime: 5 min +tags: ["saas", "introduction"] +description: This is the introduction +thumbnail: https://fakeimg.pl/700x400/d1d1d1/6b6b6b +--- + + +## This is the introduction + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. + + + + + +### This is the long heading 3 + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. + + +### This is the long heading 4 + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. + + +### This is the long heading 5 + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. + +### short heading 6 + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. + + + + + +## This is the first step + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. + + + + + +## This is the first step + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. + +This is the first step + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. + + + + \ No newline at end of file diff --git a/starterkits/saas/content/blogs/introduction.mdx b/starterkits/saas/content/blogs/introduction.mdx new file mode 100644 index 0000000..7d7d8fe --- /dev/null +++ b/starterkits/saas/content/blogs/introduction.mdx @@ -0,0 +1,120 @@ +--- +title: Introduction +publishedAt: 2022-01-01 +readTime: 5 min +tags: ["introduction", "saas"] +description: This is the introduction +thumbnail: https://fakeimg.pl/700x400/d1d1d1/6b6b6b +--- + +## Introduction + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. + + +## Heading 2 + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. + + +### Heading 3 + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. + + +#### Heading 4 + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. + + +##### Heading 5 + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. + +###### Heading 6 + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. + + + + + +This is the first step + + + + + +This is the second step + + + + + +```tsx +import {useState} from "react"; + +function Counter() { + const [count, setCount] = useState(0); + + return ( +
+

You clicked {count} times

+ +
+ ); +} +``` + +```tsx +import {useState} from "react"; + +function Counter() { + const [count, setCount] = useState(0); + + return ( +
+

You clicked {count} times

+ +
+ ); +} +``` + +```tsx title="Counter.tsx" +import {useState} from "react"; + +function Counter() { + const [count, setCount] = useState(0); + + return ( +
+

You clicked {count} times

+ +
+ ); +} +``` + +```tsx +import {useState} from "react"; + +function Counter() { + const [count, setCount] = useState(0); + + return ( +
+

You clicked {count} times

+ +
+ ); +} +``` \ No newline at end of file diff --git a/starterkits/saas/package.json b/starterkits/saas/package.json index e327840..6ea4f3b 100644 --- a/starterkits/saas/package.json +++ b/starterkits/saas/package.json @@ -76,7 +76,7 @@ "uploadthing": "^6.9.0", "uuid": "^9.0.1", "vaul": "^0.9.0", - "zod": "^3.22.4", + "zod": "^3.23.8", "zustand": "^4.5.2" }, "devDependencies": { diff --git a/starterkits/saas/src/app/(web)/blog/[slug]/page.tsx b/starterkits/saas/src/app/(web)/blogs/[...slug]/page.tsx similarity index 54% rename from starterkits/saas/src/app/(web)/blog/[slug]/page.tsx rename to starterkits/saas/src/app/(web)/blogs/[...slug]/page.tsx index 833e423..7fb99d5 100644 --- a/starterkits/saas/src/app/(web)/blog/[slug]/page.tsx +++ b/starterkits/saas/src/app/(web)/blogs/[...slug]/page.tsx @@ -1,97 +1,94 @@ import { WebPageWrapper } from "@/app/(web)/_components/general-components"; import { Badge } from "@/components/ui/badge"; -import { siteUrls } from "@/config/urls"; -import { getBlogs } from "@/server/actions/blog"; import { format } from "date-fns"; import Image from "next/image"; -import { notFound, redirect } from "next/navigation"; +import { notFound } from "next/navigation"; import { type Metadata } from "next"; +import { blogs } from "@/app/source"; +import { useMDXComponents } from "mdx-components"; +import { DocsBody } from "fumadocs-ui/page"; export const dynamic = "force-static"; type BlogSlugPageProps = { params: { - slug: string; + slug: string[]; }; }; -export async function generateMetadata({ - params, -}: BlogSlugPageProps): Promise { - const slug = params.slug; - - const blog = (await getBlogs()).find((b) => b.metaData.slug === slug); - - if (!blog) { - return notFound(); - } - - return { - title: blog.metaData.title, - description: blog.metaData.description, - }; -} - -export async function generateStaticParams() { - const blogs = await getBlogs(); - - return blogs.map((blog) => ({ - slug: blog.metaData.slug, - })); -} - export default async function BlogSlugPage({ params }: BlogSlugPageProps) { - if (!params.slug) { - return redirect(siteUrls.blog); - } + const blog = blogs.getPage(params.slug); - const slug = params.slug; + if (blog == null) { + notFound(); + } - const blog = (await getBlogs()).find((b) => b.metaData.slug === slug); + const MDX = blog.data.exports.default; - if (!blog) { - return notFound(); - } + const components = useMDXComponents(); return (

- {blog.metaData.title} + {blog.data.title}

{blog.metaData.title}
- {blog.metaData?.tags && blog.metaData.tags.length > 0 && ( + {blog.data.tags && blog.data.tags.length > 0 && (
- {blog.metaData.tags.map((tag) => ( + {blog.data.tags.map((tag) => ( {tag} ))}
)} +

- {format(new Date(blog.metaData.publishedAt), "PPP")} •{" "} - {blog.metaData.readTime} read + {format(new Date(blog.data.publishedAt), "PPP")} •{" "} + {blog.data.readTime} read

- {blog.metaData.updatedAt && ( + {blog.data.exports.lastModified && (

Last updated at{" "} - {format(new Date(blog.metaData.updatedAt), "PPP")} + {format( + new Date(blog.data.exports.lastModified), + "PPP", + )}

)}
- {blog.content} + + +
); } + +export async function generateStaticParams() { + return blogs.getPages().map((page) => ({ + slug: page.slugs, + })); +} + +export function generateMetadata({ params }: { params: { slug?: string[] } }) { + const page = blogs.getPage(params.slug); + + if (page == null) notFound(); + + return { + title: page.data.title, + description: page.data.description, + } satisfies Metadata; +} diff --git a/starterkits/saas/src/app/(web)/blog/_constants/page-config.ts b/starterkits/saas/src/app/(web)/blogs/_constants/page-config.ts similarity index 100% rename from starterkits/saas/src/app/(web)/blog/_constants/page-config.ts rename to starterkits/saas/src/app/(web)/blogs/_constants/page-config.ts diff --git a/starterkits/saas/src/app/(web)/blog/page.tsx b/starterkits/saas/src/app/(web)/blogs/page.tsx similarity index 72% rename from starterkits/saas/src/app/(web)/blog/page.tsx rename to starterkits/saas/src/app/(web)/blogs/page.tsx index ccdb5a5..9e79e8f 100644 --- a/starterkits/saas/src/app/(web)/blog/page.tsx +++ b/starterkits/saas/src/app/(web)/blogs/page.tsx @@ -3,13 +3,12 @@ import { WebPageWrapper, } from "@/app/(web)/_components/general-components"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; -import { siteUrls } from "@/config/urls"; -import { getBlogs } from "@/server/actions/blog"; import { format } from "date-fns"; import Image from "next/image"; import Link from "next/link"; import { type Metadata } from "next"; -import { blogPageConfig } from "@/app/(web)/blog/_constants/page-config"; +import { blogPageConfig } from "@/app/(web)/blogs/_constants/page-config"; +import { blogs } from "@/app/source"; export const metadata: Metadata = { title: blogPageConfig.title, @@ -18,8 +17,6 @@ export const metadata: Metadata = { export const dynamic = "force-static"; export default async function BlogsPage() { - const blogs = await getBlogs(); - return ( @@ -35,37 +32,39 @@ export default async function BlogsPage() { - {blogs?.map((blog) => ( + {blogs.getPages()?.map((blog) => (
{blog.metaData.title}

- {blog.metaData.title} + {blog.data.title}

-

{blog.metaData.description}

+

{blog.data.description}

{format( - new Date(blog.metaData.publishedAt), + new Date(blog.data.publishedAt), "PPP", )}{" "} - • {blog.metaData.readTime} read + • {blog.data.readTime} read

- {blog.metaData.updatedAt && ( + {blog.data.exports.lastModified && (

Last updated at{" "} {format( - new Date(blog.metaData.updatedAt), + new Date( + blog.data.exports.lastModified, + ), "PPP", )}

diff --git a/starterkits/saas/src/app/docs/[[...slug]]/page.tsx b/starterkits/saas/src/app/docs/[[...slug]]/page.tsx index 7148a89..2949ca1 100644 --- a/starterkits/saas/src/app/docs/[[...slug]]/page.tsx +++ b/starterkits/saas/src/app/docs/[[...slug]]/page.tsx @@ -5,6 +5,8 @@ import { notFound } from "next/navigation"; import { useMDXComponents } from "mdx-components"; import { RollButton } from "fumadocs-ui/components/roll-button"; +export const dynamic = "force-static"; + export default async function Page({ params, }: { diff --git a/starterkits/saas/src/app/layout.tsx b/starterkits/saas/src/app/layout.tsx index f98910c..55b051c 100644 --- a/starterkits/saas/src/app/layout.tsx +++ b/starterkits/saas/src/app/layout.tsx @@ -2,7 +2,6 @@ import React from "react"; import { Providers } from "@/components/providers"; import { Toaster } from "@/components/ui/sonner"; import "@/styles/globals.css"; -import "@/styles/prism.css"; import { fontHeading, fontSans } from "@/lib/fonts"; import { type Metadata } from "next"; import { diff --git a/starterkits/saas/src/app/sitemap.ts b/starterkits/saas/src/app/sitemap.ts index ec8ac6e..70ba4a5 100644 --- a/starterkits/saas/src/app/sitemap.ts +++ b/starterkits/saas/src/app/sitemap.ts @@ -9,7 +9,7 @@ export default async function sitemap(): Promise { const allBlogs = await getBlogs(); const blogs = allBlogs.map((blog) => ({ - url: addPathToBaseURL(`${siteUrls.blog}/${blog.metaData.slug}`), + url: addPathToBaseURL(`${siteUrls.blogs}/${blog.metaData.slug}`), lastModified: new Date(blog.metaData.updatedAt), })); diff --git a/starterkits/saas/src/app/source.ts b/starterkits/saas/src/app/source.ts index e86360e..1772e40 100644 --- a/starterkits/saas/src/app/source.ts +++ b/starterkits/saas/src/app/source.ts @@ -1,9 +1,25 @@ import { map } from "@/../.map"; -import { createMDXSource } from "fumadocs-mdx"; +import { createMDXSource, defaultSchemas } from "fumadocs-mdx"; import { loader } from "fumadocs-core/source"; +import { z } from "zod"; export const docs = loader({ baseUrl: "/docs", rootDir: "docs", source: createMDXSource(map), }); + +const blogsFronmatterSchema = defaultSchemas.frontmatter.extend({ + thumbnail: z.string().url(), + publishedAt: z.date(), + readTime: z.string(), + tags: z.array(z.string()), +}); + +export const blogs = loader({ + baseUrl: "/blogs", + rootDir: "blogs", + source: createMDXSource(map, { + schema: { frontmatter: blogsFronmatterSchema }, + }), +}); diff --git a/starterkits/saas/src/config/header.ts b/starterkits/saas/src/config/header.ts index b067333..6f7fdbe 100644 --- a/starterkits/saas/src/config/header.ts +++ b/starterkits/saas/src/config/header.ts @@ -36,7 +36,7 @@ export const navigation: NavigationItem[] = [ }, { id: "blog", - href: siteUrls.blog, + href: siteUrls.blogs, label: "Blog", }, { diff --git a/starterkits/saas/src/config/sidebar.ts b/starterkits/saas/src/config/sidebar.ts index c4be061..26a35ec 100644 --- a/starterkits/saas/src/config/sidebar.ts +++ b/starterkits/saas/src/config/sidebar.ts @@ -175,7 +175,7 @@ const navigation: SidebarNavItems[] = [ { label: "Blog", icon: PenLineIcon, - href: siteUrls.blog, + href: siteUrls.blogs, }, { label: "Support", diff --git a/starterkits/saas/src/config/support.ts b/starterkits/saas/src/config/support.ts index 78cfd00..ab81d79 100644 --- a/starterkits/saas/src/config/support.ts +++ b/starterkits/saas/src/config/support.ts @@ -51,7 +51,7 @@ export const supportInfos: SupportInfo[] = [ title: "Our Blog", description: "Read our blog to learn more about our products and the latest updates.", - buttonHref: `${siteUrls.blog}`, + buttonHref: `${siteUrls.blogs}`, buttonText: "Read Blog", }, ]; diff --git a/starterkits/saas/src/config/urls.ts b/starterkits/saas/src/config/urls.ts index d9c25bd..76882ec 100644 --- a/starterkits/saas/src/config/urls.ts +++ b/starterkits/saas/src/config/urls.ts @@ -14,7 +14,7 @@ export const siteUrls = { pricing: "/pricing", features: "/features", support: "/support", - blog: "/blog", + blogs: "/blogs", docs: "/docs", changelog: "/changelog", maintenance: "/maintenance", @@ -58,7 +58,7 @@ export const publicRoutes: string[] = [ siteUrls.pricing, siteUrls.features, siteUrls.support, - siteUrls.blog, + siteUrls.blogs, siteUrls.docs, siteUrls.changelog, siteUrls.maintenance, diff --git a/starterkits/saas/src/server/actions/blog.ts b/starterkits/saas/src/server/actions/blog.ts deleted file mode 100644 index da0a42c..0000000 --- a/starterkits/saas/src/server/actions/blog.ts +++ /dev/null @@ -1,11 +0,0 @@ -import "server-only"; - -import { getMDXData } from "@/lib/mdx"; -import { type BlogMetaData, blogMetaSchema } from "@/validations/mdx-content"; - -export async function getBlogs() { - const dir = "src/content/blog"; - return (await getMDXData(dir, blogMetaSchema)).filter( - (blog) => !blog.metaData.isDraft, - ); -} diff --git a/starterkits/saas/src/server/actions/changelog.ts b/starterkits/saas/src/server/actions/changelog.ts deleted file mode 100644 index bfd217c..0000000 --- a/starterkits/saas/src/server/actions/changelog.ts +++ /dev/null @@ -1,14 +0,0 @@ -import "server-only"; - -import { getMDXData } from "@/lib/mdx"; -import { - type ChangelogMetaData, - changelogMetaSchema, -} from "@/validations/mdx-content"; - -export async function getChangelogs() { - const dir = "src/content/changelogs"; - return ( - await getMDXData(dir, changelogMetaSchema) - ).filter((changelog) => !changelog.metaData.isDraft); -} diff --git a/starterkits/saas/src/server/actions/docs.ts b/starterkits/saas/src/server/actions/docs.ts deleted file mode 100644 index 08c1e8e..0000000 --- a/starterkits/saas/src/server/actions/docs.ts +++ /dev/null @@ -1,11 +0,0 @@ -import "server-only"; - -import { getMDXData } from "@/lib/mdx"; -import { type DocsMetaData, docsMetaSchema } from "@/validations/mdx-content"; - -export async function getDocs() { - const dir = "src/content/docs"; - return (await getMDXData(dir, docsMetaSchema)).filter( - (doc) => !doc.metaData.isDraft, - ); -} diff --git a/starterkits/saas/src/styles/globals.css b/starterkits/saas/src/styles/globals.css index a640ca9..37410ae 100644 --- a/starterkits/saas/src/styles/globals.css +++ b/starterkits/saas/src/styles/globals.css @@ -59,15 +59,3 @@ text-rendering: optimizeLegibility; } } - -@layer utilities { - .step { - counter-increment: step; - } - - .step:before { - @apply absolute inline-flex h-9 w-9 items-center justify-center rounded-full border-4 border-background bg-muted text-center -indent-px font-mono text-base font-medium; - @apply ml-[-50px] mt-[-4px]; - content: counter(step); - } -} diff --git a/starterkits/saas/src/styles/prism.css b/starterkits/saas/src/styles/prism.css deleted file mode 100644 index a3eba58..0000000 --- a/starterkits/saas/src/styles/prism.css +++ /dev/null @@ -1,110 +0,0 @@ -.token.tag, -.token.class-name, -.token.selector, -.token.selector .class, -.token.selector.class, -.token.function { - color: theme("colors.pink.400"); -} - -.token.attr-name, -.token.keyword, -.token.rule, -.token.pseudo-class, -.token.important { - color: theme("colors.blue.300"); -} - -.token.module { - color: theme("colors.purple.300"); -} - -.token.attr-value { - color: theme("colors.blue.300"); -} - -.token.string { - color: theme("colors.orange.300"); -} - -.token.class { - color: theme("colors.teal.300"); -} - -.token.punctuation, -.token.attr-equals { - color: theme("colors.zinc.500"); -} - -.token.unit, -.language-css .token.function { - color: theme("colors.sky.200"); -} - -.token.comment { - color: theme("colors.emerald.400"); - opacity: 0.7; -} - -.token.property, -.token.operator, -.token.combinator { - color: theme("colors.zinc.400"); -} - -.code-highlight { - float: left; /* 1 */ - min-width: 100%; /* 2 */ -} - -.code-line { - display: block; - padding-left: 16px; - padding-right: 16px; - margin-left: -16px; - margin-right: -16px; - border-left: 4px solid rgba(0, 0, 0, 0); /* Set placeholder for highlight accent border color to transparent */ - line-height: 1.5rem; -} - -.code-line.inserted { - background-color: theme( - "colors.emerald.900" - ); /* Set inserted line (+) color */ -} - -.code-line.deleted { - background-color: theme("colors.red.900"); /* Set deleted line (-) color */ -} - -.highlight-line { - margin-left: -14px; - margin-right: -16px; - background-color: theme("colors.zinc.800"); /* Set highlight bg color */ - border-left: 2px solid theme("colors.amber.400"); /* Set highlight accent border color */ -} - -.line-number::before { - display: inline-block; - width: 1rem; - text-align: right; - margin-right: 16px; - margin-left: -8px; - color: theme("colors.zinc.500"); - content: attr(line); -} - -.rehype-code-title { - margin: 0 !important; - display: inline-flex; - position: relative; - top: 1rem; - left: 2rem; - background: theme("colors.zinc.900"); - color: theme("colors.zinc.100"); - font-family: theme("fontFamily.mono"); - padding: 0.25rem 1.5rem; - border-radius: 0.5rem 0.5rem 0 0; - border-top: 4px solid theme("colors.indigo.600"); - font-size: 0.8rem; -}