diff --git a/nx-dev/feature-doc-viewer/src/lib/doc-viewer.tsx b/nx-dev/feature-doc-viewer/src/lib/doc-viewer.tsx
index f42552eabf..b0d96fa983 100644
--- a/nx-dev/feature-doc-viewer/src/lib/doc-viewer.tsx
+++ b/nx-dev/feature-doc-viewer/src/lib/doc-viewer.tsx
@@ -1,6 +1,5 @@
import {
categorizeRelatedDocuments,
- generateRelatedDocumentsTemplate,
ProcessedDocument,
RelatedDocument,
} from '@nx/nx-dev/models-document';
@@ -11,6 +10,7 @@ import { useRouter } from 'next/router';
import { cx } from '@nx/nx-dev/ui-primitives';
import { useRef } from 'react';
import { collectHeadings, TableOfContents } from './table-of-contents';
+import { RelatedDocumentsSection } from './related-documents-section';
export function DocViewer({
document,
@@ -42,14 +42,7 @@ export function DocViewer({
description: metadata['description'] ?? document.description,
mediaImage: document.mediaImage,
content: node,
- relatedContent: renderMarkdown(
- generateRelatedDocumentsTemplate(
- categorizeRelatedDocuments(relatedDocuments)
- ),
- {
- filePath: '',
- }
- ).node,
+ relatedContentData: categorizeRelatedDocuments(relatedDocuments),
tableOfContent: collectHeadings(treeNode),
};
@@ -129,11 +122,17 @@ export function DocViewer({
)}
{/*RELATED CONTENT*/}
+
- {vm.relatedContent}
+
diff --git a/nx-dev/feature-doc-viewer/src/lib/related-documents-section.tsx b/nx-dev/feature-doc-viewer/src/lib/related-documents-section.tsx
new file mode 100644
index 0000000000..3cc077a5eb
--- /dev/null
+++ b/nx-dev/feature-doc-viewer/src/lib/related-documents-section.tsx
@@ -0,0 +1,65 @@
+import { RelatedDocumentsCategory } from '@nx/nx-dev/models-document';
+import {
+ CubeTransparentIcon,
+ ArrowRightIcon,
+ ClipboardDocumentIcon,
+ LightBulbIcon,
+ MagnifyingGlassIcon,
+ InformationCircleIcon,
+} from '@heroicons/react/24/outline';
+
+export function RelatedDocumentsSection({
+ relatedCategories,
+}: {
+ relatedCategories: RelatedDocumentsCategory[];
+}) {
+ return (
+
+ {relatedCategories.length > 0 &&
+ relatedCategories.map((category) => (
+
+ ))}
+
+ );
+}
+
+const iconMap: { [key: string]: JSX.Element } = {
+ concepts:
,
+ recipes: (
+
+ ),
+ reference:
,
+ 'see-also': (
+
+ ),
+ default: (
+
+ ),
+};
+
+function CategoryBox({ category }: { category: RelatedDocumentsCategory }) {
+ return (
+
+
+ {iconMap[category.id] ?? iconMap.default}
+ {category.name}
+
+
+ {category.relatedDocuments.map((d) => (
+ -
+
+ {d.name}
+
+
+
+ ))}
+
+
+ );
+}
diff --git a/nx-dev/models-document/src/lib/related-documents.utils.ts b/nx-dev/models-document/src/lib/related-documents.utils.ts
index d444ebfefc..68786e3231 100644
--- a/nx-dev/models-document/src/lib/related-documents.utils.ts
+++ b/nx-dev/models-document/src/lib/related-documents.utils.ts
@@ -1,6 +1,6 @@
import { RelatedDocument } from './documents.models';
-interface RelatedDocumentsCategory {
+export interface RelatedDocumentsCategory {
id: string;
/**
* Matcher that will be evaluated against a path.
@@ -49,19 +49,3 @@ export function categorizeRelatedDocuments(
return categories.filter((c) => !!c.relatedDocuments.length);
}
-
-export function generateRelatedDocumentsTemplate(
- relatedDocumentCategories: RelatedDocumentsCategory[]
-): string {
- if (!relatedDocumentCategories.length) return '';
-
- const template = relatedDocumentCategories.map((c) => {
- const header = `### ${c.name}`;
- const template = c.relatedDocuments
- .map((d) => `- [${d.name}](${d.path})`)
- .join('\n');
- return [header, template].join('\n');
- });
-
- return ['\n## Related Documentation\n', ...template].join('\n');
-}
diff --git a/nx-dev/nx-dev-e2e/src/recipes.spec.ts b/nx-dev/nx-dev-e2e/src/recipes.spec.ts
index d31c200670..9745a1cf82 100644
--- a/nx-dev/nx-dev-e2e/src/recipes.spec.ts
+++ b/nx-dev/nx-dev-e2e/src/recipes.spec.ts
@@ -3,9 +3,7 @@ import { test, expect } from '@playwright/test';
test.describe('nx-dev: Recipes pages', () => {
test('should list related recipes based on tags', async ({ page }) => {
await page.goto('/recipes/other/deno-deploy');
- const relatedDocs = page.locator(
- '[data-document="related"] > article > ul > li'
- );
+ const relatedDocs = page.locator('[data-document="related"] li');
const relatedDocsText = await relatedDocs.allInnerTexts();
expect(relatedDocsText.length, 'has related docs').toBeGreaterThan(0);