diff --git a/src/components/DocsLayout.tsx b/src/components/DocsLayout.tsx
index 8818e7e80..940052193 100644
--- a/src/components/DocsLayout.tsx
+++ b/src/components/DocsLayout.tsx
@@ -74,6 +74,14 @@ const useMenuConfig = ({
label: 'Contributors',
to: '/$libraryId/$version/docs/contributors',
},
+ ...(config.sections.find((d) => d.label === 'Community Resources')
+ ? [
+ {
+ label: 'Community Resources',
+ to: '/$libraryId/$version/docs/community-resources',
+ },
+ ]
+ : []),
{
label: (
diff --git a/src/routeTree.gen.ts b/src/routeTree.gen.ts
index efca7c5cb..74234e274 100644
--- a/src/routeTree.gen.ts
+++ b/src/routeTree.gen.ts
@@ -55,6 +55,7 @@ import { Route as LibrariesConfigVersionIndexRouteImport } from './routes/_libra
import { Route as LibraryIdVersionDocsIndexRouteImport } from './routes/$libraryId/$version.docs.index'
import { Route as LibraryIdVersionDocsChar123Char125DotmdRouteImport } from './routes/$libraryId/$version.docs.{$}[.]md'
import { Route as LibraryIdVersionDocsContributorsRouteImport } from './routes/$libraryId/$version.docs.contributors'
+import { Route as LibraryIdVersionDocsCommunityResourcesDotmdRouteImport } from './routes/$libraryId/$version.docs.community-resources[.]md'
import { Route as LibraryIdVersionDocsSplatRouteImport } from './routes/$libraryId/$version.docs.$'
import { Route as LibraryIdVersionDocsFrameworkIndexRouteImport } from './routes/$libraryId/$version.docs.framework.index'
import { Route as LibraryIdVersionDocsFrameworkFrameworkIndexRouteImport } from './routes/$libraryId/$version.docs.framework.$framework.index'
@@ -305,6 +306,12 @@ const LibraryIdVersionDocsContributorsRoute =
path: '/contributors',
getParentRoute: () => LibraryIdVersionDocsRoute,
} as any)
+const LibraryIdVersionDocsCommunityResourcesDotmdRoute =
+ LibraryIdVersionDocsCommunityResourcesDotmdRouteImport.update({
+ id: '/community-resources.md',
+ path: '/community-resources.md',
+ getParentRoute: () => LibraryIdVersionDocsRoute,
+ } as any)
const LibraryIdVersionDocsSplatRoute =
LibraryIdVersionDocsSplatRouteImport.update({
id: '/$',
@@ -374,6 +381,7 @@ export interface FileRoutesByFullPath {
'/blog/': typeof LibrariesBlogIndexRoute
'/stats/npm': typeof StatsNpmIndexRoute
'/$libraryId/$version/docs/$': typeof LibraryIdVersionDocsSplatRoute
+ '/$libraryId/$version/docs/community-resources.md': typeof LibraryIdVersionDocsCommunityResourcesDotmdRoute
'/$libraryId/$version/docs/contributors': typeof LibraryIdVersionDocsContributorsRoute
'/$libraryId/$version/docs/{$}.md': typeof LibraryIdVersionDocsChar123Char125DotmdRoute
'/$libraryId/$version/docs/': typeof LibraryIdVersionDocsIndexRoute
@@ -423,6 +431,7 @@ export interface FileRoutesByTo {
'/blog': typeof LibrariesBlogIndexRoute
'/stats/npm': typeof StatsNpmIndexRoute
'/$libraryId/$version/docs/$': typeof LibraryIdVersionDocsSplatRoute
+ '/$libraryId/$version/docs/community-resources.md': typeof LibraryIdVersionDocsCommunityResourcesDotmdRoute
'/$libraryId/$version/docs/contributors': typeof LibraryIdVersionDocsContributorsRoute
'/$libraryId/$version/docs/{$}.md': typeof LibraryIdVersionDocsChar123Char125DotmdRoute
'/$libraryId/$version/docs': typeof LibraryIdVersionDocsIndexRoute
@@ -478,6 +487,7 @@ export interface FileRoutesById {
'/_libraries/blog/': typeof LibrariesBlogIndexRoute
'/stats/npm/': typeof StatsNpmIndexRoute
'/$libraryId/$version/docs/$': typeof LibraryIdVersionDocsSplatRoute
+ '/$libraryId/$version/docs/community-resources.md': typeof LibraryIdVersionDocsCommunityResourcesDotmdRoute
'/$libraryId/$version/docs/contributors': typeof LibraryIdVersionDocsContributorsRoute
'/$libraryId/$version/docs/{$}.md': typeof LibraryIdVersionDocsChar123Char125DotmdRoute
'/$libraryId/$version/docs/': typeof LibraryIdVersionDocsIndexRoute
@@ -533,6 +543,7 @@ export interface FileRouteTypes {
| '/blog/'
| '/stats/npm'
| '/$libraryId/$version/docs/$'
+ | '/$libraryId/$version/docs/community-resources.md'
| '/$libraryId/$version/docs/contributors'
| '/$libraryId/$version/docs/{$}.md'
| '/$libraryId/$version/docs/'
@@ -582,6 +593,7 @@ export interface FileRouteTypes {
| '/blog'
| '/stats/npm'
| '/$libraryId/$version/docs/$'
+ | '/$libraryId/$version/docs/community-resources.md'
| '/$libraryId/$version/docs/contributors'
| '/$libraryId/$version/docs/{$}.md'
| '/$libraryId/$version/docs'
@@ -636,6 +648,7 @@ export interface FileRouteTypes {
| '/_libraries/blog/'
| '/stats/npm/'
| '/$libraryId/$version/docs/$'
+ | '/$libraryId/$version/docs/community-resources.md'
| '/$libraryId/$version/docs/contributors'
| '/$libraryId/$version/docs/{$}.md'
| '/$libraryId/$version/docs/'
@@ -995,6 +1008,13 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof LibraryIdVersionDocsContributorsRouteImport
parentRoute: typeof LibraryIdVersionDocsRoute
}
+ '/$libraryId/$version/docs/community-resources.md': {
+ id: '/$libraryId/$version/docs/community-resources.md'
+ path: '/community-resources.md'
+ fullPath: '/$libraryId/$version/docs/community-resources.md'
+ preLoaderRoute: typeof LibraryIdVersionDocsCommunityResourcesDotmdRouteImport
+ parentRoute: typeof LibraryIdVersionDocsRoute
+ }
'/$libraryId/$version/docs/$': {
id: '/$libraryId/$version/docs/$'
path: '/$'
@@ -1042,6 +1062,7 @@ declare module '@tanstack/react-router' {
interface LibraryIdVersionDocsRouteChildren {
LibraryIdVersionDocsSplatRoute: typeof LibraryIdVersionDocsSplatRoute
+ LibraryIdVersionDocsCommunityResourcesDotmdRoute: typeof LibraryIdVersionDocsCommunityResourcesDotmdRoute
LibraryIdVersionDocsContributorsRoute: typeof LibraryIdVersionDocsContributorsRoute
LibraryIdVersionDocsChar123Char125DotmdRoute: typeof LibraryIdVersionDocsChar123Char125DotmdRoute
LibraryIdVersionDocsIndexRoute: typeof LibraryIdVersionDocsIndexRoute
@@ -1054,6 +1075,8 @@ interface LibraryIdVersionDocsRouteChildren {
const LibraryIdVersionDocsRouteChildren: LibraryIdVersionDocsRouteChildren = {
LibraryIdVersionDocsSplatRoute: LibraryIdVersionDocsSplatRoute,
+ LibraryIdVersionDocsCommunityResourcesDotmdRoute:
+ LibraryIdVersionDocsCommunityResourcesDotmdRoute,
LibraryIdVersionDocsContributorsRoute: LibraryIdVersionDocsContributorsRoute,
LibraryIdVersionDocsChar123Char125DotmdRoute:
LibraryIdVersionDocsChar123Char125DotmdRoute,
diff --git a/src/routes/$libraryId/$version.docs.community-resources[.]md.tsx b/src/routes/$libraryId/$version.docs.community-resources[.]md.tsx
new file mode 100644
index 000000000..6eba20d2b
--- /dev/null
+++ b/src/routes/$libraryId/$version.docs.community-resources[.]md.tsx
@@ -0,0 +1,155 @@
+import { createFileRoute } from '@tanstack/react-router'
+import { twMerge } from 'tailwind-merge'
+import { DocContainer } from '~/components/DocContainer'
+import { DocTitle } from '~/components/DocTitle'
+import { findLibrary, getBranch, getLibrary } from '~/libraries'
+import { seo } from '~/utils/seo'
+import { loadDocs } from '~/utils/docs'
+
+export const Route = createFileRoute(
+ '/$libraryId/$version/docs/community-resources.md'
+)({
+ staleTime: 1000 * 60 * 5,
+ loader: async (ctx) => {
+ const { libraryId, version } = ctx.params
+ const library = findLibrary(libraryId)
+
+ if (!library) return { doc: null as null | any }
+
+ const root = library.docsRoot || 'docs'
+
+ try {
+ const doc = await loadDocs({
+ repo: library.repo,
+ branch: getBranch(library, version),
+ docsPath: `${root}/community-resources`,
+ currentPath: ctx.location.pathname,
+ redirectPath: `/${library.id}/${version}/docs/overview`,
+ })
+
+ return { doc }
+ } catch {
+ return { doc: null as null | any }
+ }
+ },
+ head: ({ params, loaderData }) => {
+ const library = getLibrary(params.libraryId)
+ const doc = (loaderData as any)?.doc
+ return {
+ meta: seo({
+ title: `${library.name} Community Resources`,
+ description: `A collection of community resources for ${library.name}.`,
+ }),
+ }
+ },
+ component: RouteComponent,
+})
+
+type ResourceType = 'article' | 'media' | 'utility' | 'other'
+
+type Resource = {
+ title: string
+ description: string
+ url: string
+}
+
+function RouteComponent() {
+ const { libraryId } = Route.useParams()
+ const library = getLibrary(libraryId)
+ const data = Route.useLoaderData().doc?.frontmatter
+
+ return (
+
+
+
+
+
+ {(data?.title as string | undefined) ||
+ `${library.name} Community Resources`}
+
+
+
+
+
+ {(data?.frontmatter?.description as string | undefined) || (
+ <>
+ Discover resources created by the{' '}
+ {library.name} community. Have something to
+ share?{' '}
+
+ Submit a PR on GitHub
+ {' '}
+ to contribute to this list.
+ >
+ )}
+
+ {data?.frontmatter?.articles > 1 && (
+
+ )}
+ {data?.frontmatter?.media > 1 && (
+
+ )}
+ {data?.frontmatter?.utilities > 1 && (
+
+ )}
+ {data?.frontmatter?.others > 1 && (
+
+ )}
+
+
+
+ )
+}
+
+function CommunitySection({
+ resources,
+ type,
+}: {
+ resources: Resource[]
+ type: ResourceType
+}) {
+ return (
+
+ )
+}
diff --git a/src/utils/docs.ts b/src/utils/docs.ts
index 31ce0d272..ae42a9d19 100644
--- a/src/utils/docs.ts
+++ b/src/utils/docs.ts
@@ -85,6 +85,7 @@ export const fetchDocs = createServerFn({ method: 'GET' })
description,
filePath,
content: frontMatter.content,
+ frontmatter: frontMatter.data,
}
})