- {new Date(data.date).toLocaleDateString("en-US", {
+ {new Date(page.data.date).toLocaleDateString("en-US", {
month: "long",
day: "numeric",
year: "numeric",
@@ -80,11 +67,11 @@ export default async function BlogPostPage(props: PageProps) {
- {data.title}
+ {page.data.title}
- {data.description}
+ {page.data.description}
diff --git a/apps/blog-platform/app/not-found.tsx b/apps/blog-platform/app/not-found.tsx
index c569882..1fa65e7 100644
--- a/apps/blog-platform/app/not-found.tsx
+++ b/apps/blog-platform/app/not-found.tsx
@@ -24,11 +24,11 @@ const NotFound = () => {
diff --git a/apps/blog-platform/app/page.tsx b/apps/blog-platform/app/page.tsx
index 41e3d98..f27dd7e 100644
--- a/apps/blog-platform/app/page.tsx
+++ b/apps/blog-platform/app/page.tsx
@@ -9,20 +9,9 @@ import { CTASection } from "../features/landing/components/CTASection";
import { FeaturedPost } from "../features/landing/components/FeaturedPost";
const BlogHome = () => {
- const toBlogMeta = (data: unknown) =>
- data as {
- title: string;
- description: string;
- author: string;
- date: string;
- };
-
const allPosts = blog
.getPages()
- .sort(
- (a, b) =>
- new Date(toBlogMeta(b.data).date).getTime() - new Date(toBlogMeta(a.data).date).getTime(),
- );
+ .sort((a, b) => new Date(b.data.date).getTime() - new Date(a.data.date).getTime());
const featuredPost = allPosts[0];
const remainingPosts = allPosts.slice(1, 4);
diff --git a/apps/blog-platform/collections.d.ts b/apps/blog-platform/collections.d.ts
deleted file mode 100644
index db82ac4..0000000
--- a/apps/blog-platform/collections.d.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-declare module "collections/server" {
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- export const blogPosts: any;
-}
diff --git a/apps/blog-platform/lib/source.ts b/apps/blog-platform/lib/source.ts
index 14e2b36..2638160 100644
--- a/apps/blog-platform/lib/source.ts
+++ b/apps/blog-platform/lib/source.ts
@@ -1,9 +1,13 @@
+import type { PageData } from "fumadocs-core/source";
+
import { loader } from "fumadocs-core/source";
import { toFumadocsSource } from "fumadocs-mdx/runtime/server";
import { blogPosts } from "collections/server";
+type BlogPostPage = (typeof blogPosts)[number] & PageData;
+
export const blog = loader({
baseUrl: "/",
- source: toFumadocsSource(blogPosts, []),
+ source: toFumadocsSource
(blogPosts as BlogPostPage[], []),
});
diff --git a/apps/blog-platform/source.config.ts b/apps/blog-platform/source.config.ts
index 35f3d15..791d3f2 100644
--- a/apps/blog-platform/source.config.ts
+++ b/apps/blog-platform/source.config.ts
@@ -1,8 +1,15 @@
+import { z } from "zod";
import { defineCollections, defineConfig } from "fumadocs-mdx/config";
export const blogPosts = defineCollections({
type: "doc",
dir: "content/blog",
+ schema: z.object({
+ title: z.string(),
+ description: z.string(),
+ author: z.string(),
+ date: z.string().or(z.date()),
+ }),
});
export default defineConfig();
diff --git a/apps/docs-platform/content/docs/contributing/index.mdx b/apps/docs-platform/content/docs/contributing/index.mdx
index cde2209..8ded844 100644
--- a/apps/docs-platform/content/docs/contributing/index.mdx
+++ b/apps/docs-platform/content/docs/contributing/index.mdx
@@ -81,6 +81,7 @@ Your branch name should start with one of the following prefixes based on the wo
### Pre-commit Quality Verification
Before committing and pushing your changes, run automated scripts to ensure style guides and formats are preserved:
+
```bash
# Run typescript compilation and linter
npm run lint
diff --git a/apps/studio/templates/cover-letter/professional/web.tsx b/apps/studio/templates/cover-letter/professional/web.tsx
index a7213d7..9cb35dd 100644
--- a/apps/studio/templates/cover-letter/professional/web.tsx
+++ b/apps/studio/templates/cover-letter/professional/web.tsx
@@ -538,9 +538,7 @@ export function buildProfessionalCoverLetterHtml(content: CoverLetterContent): s
*{box-sizing:border-box}body{margin:0;padding:32px 16px;background:#f4f4f5;color:${appearance.textColor};font-family:${fontFamily}}.page{width:794px;height:1123px;margin:0 auto 24px;overflow:hidden;background:${appearance.pageColor};color:${appearance.textColor};box-shadow:0 0 0 1px #e4e4e7;page-break-after:always}.page:last-child{page-break-after:auto}p{margin:0 0 ${appearance.paragraphSpacing}px;line-height:${appearance.lineHeight}}.label{color:${appearance.accentColor};font-size:10px;font-weight:700;letter-spacing:.22em;text-transform:uppercase}.body{margin-top:28px;font-size:15px}.body-list,.proof{background:#f4f4f5;margin:16px 0;padding:14px 18px 14px 28px;line-height:${appearance.lineHeight}}.proof li::marker{color:${appearance.accentColor}}.signature{font-weight:700}.postscript{border-top:1px solid #e4e4e7;padding-top:14px;color:#52525b}.continued{border-bottom:1px solid #dbe4f0;padding-bottom:20px;color:#64748b;font-size:10px;font-weight:700;letter-spacing:.22em;text-transform:uppercase}.professional-page{padding:${appearance.pageMargin}px}.professional-page header{display:grid;grid-template-columns:1fr 230px;gap:32px;border-bottom:2px solid #09090b;padding-bottom:28px}.professional-page h1{margin:0;font-size:34px;line-height:1.1}.professional-page .contact{text-align:right;color:#52525b}.professional-page .contact a{display:block;color:#09090b;font-weight:600;text-underline-offset:4px}.professional-page .meta{display:grid;grid-template-columns:1fr 180px;gap:32px;margin-top:36px;color:#3f3f46}.professional-page .subject{border-top:1px solid #e4e4e7;border-bottom:1px solid #e4e4e7;margin-top:32px;padding:16px 0}.professional-page h2{margin:8px 0 0;font-size:20px}@media print{body{padding:0;background:white}.page{box-shadow:none;margin:0}}${pages
.map((blocks, pageIndex) => {
const first = pageIndex === 0;
- const body = blocks
- .map((item) => renderProfessionalHtmlItem(item))
- .join("");
+ const body = blocks.map((item) => renderProfessionalHtmlItem(item)).join("");
return `${first ? `` : `Cover Letter Continued
`}${body}`;
})
.join("")}