diff --git a/frontend/__tests__/unit/components/MarkdownWrapper.test.tsx b/frontend/__tests__/unit/components/MarkdownWrapper.test.tsx index 83d3579c7e..d55a46d9f2 100644 --- a/frontend/__tests__/unit/components/MarkdownWrapper.test.tsx +++ b/frontend/__tests__/unit/components/MarkdownWrapper.test.tsx @@ -6,7 +6,7 @@ jest.mock('dompurify', () => ({ sanitize: (html: string) => html, })) -jest.mock('markdown-it/index.mjs', () => { +jest.mock('markdown-it', () => { return jest.fn().mockImplementation(() => ({ render: (content: string) => { // Very simple mock: replace **bold** and [link](url) diff --git a/frontend/__tests__/unit/components/ProgramCard.test.tsx b/frontend/__tests__/unit/components/ProgramCard.test.tsx index 3dfc2177d1..9d471820ad 100644 --- a/frontend/__tests__/unit/components/ProgramCard.test.tsx +++ b/frontend/__tests__/unit/components/ProgramCard.test.tsx @@ -276,8 +276,7 @@ describe('ProgramCard', () => { ) expect(screen.getByText(longDescription)).toBeInTheDocument() - expect(screen.getByText(longDescription)).toBeInTheDocument() - const descriptionElement = screen.getByText(longDescription) + const descriptionElement = screen.getByText(longDescription).closest('.md-wrapper') expect(descriptionElement).toHaveClass('line-clamp-8') }) @@ -296,7 +295,7 @@ describe('ProgramCard', () => { expect(screen.getByText('Short description')).toBeInTheDocument() - const descriptionElement = screen.getByText('Short description') + const descriptionElement = screen.getByText('Short description').closest('.md-wrapper') expect(descriptionElement).toHaveClass('line-clamp-8') }) diff --git a/frontend/src/app/globals.css b/frontend/src/app/globals.css index 844eb03bc8..59cec9fdca 100644 --- a/frontend/src/app/globals.css +++ b/frontend/src/app/globals.css @@ -131,6 +131,22 @@ color: #1d7bd7; } + a .md-wrapper { + color: rgb(75 85 99); /* gray-600 */ + } + + .dark a .md-wrapper { + color: rgb(156 163 175); /* gray-400 */ + } + + a .md-wrapper a { + color: #1d7bd7; + } + + .dark a .md-wrapper a { + color: #1d7bd7; + } + .navlink { color: inherit; } @@ -253,6 +269,24 @@ transition: transform 1s ease; } + .md-wrapper ul, + .md-wrapper ol { + margin: 0 0 1em 1.5em; + padding-left: 1.5em; + } + + .md-wrapper ul { + list-style-type: disc; + } + + .md-wrapper ol { + list-style-type: decimal; + } + + .md-wrapper li { + margin: 0.25em 0; + } + .flip-container:hover .icon-flip { transform: rotateY(180deg); } diff --git a/frontend/src/components/CardDetailsPage.tsx b/frontend/src/components/CardDetailsPage.tsx index ab5d4a2314..c62c2f1e0b 100644 --- a/frontend/src/components/CardDetailsPage.tsx +++ b/frontend/src/components/CardDetailsPage.tsx @@ -22,6 +22,7 @@ import HealthMetrics from 'components/HealthMetrics' import InfoBlock from 'components/InfoBlock' import Leaders from 'components/Leaders' import LeadersList from 'components/LeadersList' +import Markdown from 'components/MarkdownWrapper' import MenteeContributorsList from 'components/MenteeContributorsList' import MetricsScoreCircle from 'components/MetricsScoreCircle' import Milestones from 'components/Milestones' @@ -77,14 +78,12 @@ const DetailsCard = ({ const { data } = useSession() // compute styles based on type prop - const secondaryCardStyles = (() => { - if (type === 'program' || type === 'module') { - return 'gap-2 md:col-span-7' - } else if (type === 'chapter') { - return 'gap-2 md:col-span-3' - } - return 'gap-2 md:col-span-5' - })() + const typeStylesMap = new Map([ + ['program', 'gap-2 md:col-span-7'], + ['module', 'gap-2 md:col-span-7'], + ['chapter', 'gap-2 md:col-span-3'], + ]) + const secondaryCardStyles = typeStylesMap.get(type) ?? 'gap-2 md:col-span-5' return (
{description}
{summary && ({summary}
+{description}
+{module.description}
+