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 77f8ae0707..2218f4543f 100644 --- a/frontend/__tests__/unit/components/ProgramCard.test.tsx +++ b/frontend/__tests__/unit/components/ProgramCard.test.tsx @@ -278,8 +278,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') }) @@ -298,7 +297,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..1b52723eda 100644 --- a/frontend/src/app/globals.css +++ b/frontend/src/app/globals.css @@ -131,6 +131,28 @@ 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; + } + + a .md-wrapper ul, + a .md-wrapper ol, + a .md-wrapper li { + color: inherit; + } + .navlink { color: inherit; } @@ -253,6 +275,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 f392fac470..fae64ca9ac 100644 --- a/frontend/src/components/CardDetailsPage.tsx +++ b/frontend/src/components/CardDetailsPage.tsx @@ -21,6 +21,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' @@ -76,14 +77,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 = { + chapter: 'gap-2 md:col-span-3', + module: 'gap-2 md:col-span-7', + program: 'gap-2 md:col-span-7', + } + const secondaryCardStyles = typeStylesMap[type] ?? 'gap-2 md:col-span-5' return (
{description}
{summary && ({summary}
+{description}
+{module.description}
+