diff --git a/package.json b/package.json index 664bf1b..0831ec3 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ }, "dependencies": { "@aws-sdk/client-s3": "^3.956.0", + "@floating-ui/dom": "^1.6.0", "@radix-ui/react-alert-dialog": "^1.1.15", "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-dropdown-menu": "^2.1.2", @@ -67,8 +68,7 @@ "sanitize-html": "^2.13.0", "swr": "^2.3.0", "tailwind-merge": "^3.4.0", - "zustand": "^4.5.4", - "@floating-ui/dom": "^1.6.0" + "zustand": "^4.5.4" }, "devDependencies": { "@playwright/test": "^1.49.1", @@ -82,6 +82,7 @@ "@types/node": "24.0.3", "@types/prismjs": "^1.26.3", "@types/react": "^18.3.26", + "@types/react-dom": "^18.2.0", "@types/react-grid-layout": "^1.3.5", "@types/sanitize-html": "^2.16.0", "autoprefixer": "^10.4.16", @@ -95,12 +96,11 @@ "tsconfig-paths-webpack-plugin": "^4.2.0", "tsx": "^4.7.1", "typescript": "^5.4.2", - "vitest": "^4.0.7", - "@types/react-dom": "^18.2.0" + "vitest": "^4.0.7" }, "resolutions": { "glob": "10.5.0", "@opentelemetry/api": "1.4.1" }, "packageManager": "yarn@4.12.0" -} \ No newline at end of file +} diff --git a/tests/unit/components/MarkdownSection.test.tsx b/tests/unit/components/MarkdownSection.test.tsx deleted file mode 100644 index a5e4928..0000000 --- a/tests/unit/components/MarkdownSection.test.tsx +++ /dev/null @@ -1,73 +0,0 @@ -import { render, screen, waitFor } from '@testing-library/react' -import { afterEach, describe, expect, it, vi } from 'vitest' - -import MarkdownSection, { type MarkdownRenderResult } from '@components/MarkdownSection' - -describe('MarkdownSection', () => { - afterEach(() => { - vi.restoreAllMocks() - }) - - it('renders prefetched content and notifies listeners', () => { - const prefetched: MarkdownRenderResult = { - path: 'homepage/intro.md', - html: '

Prefetched body

', - meta: { title: 'Intro Title', heading: 'h3' }, - } - const onMetaChange = vi.fn() - - const { container } = render( - - ) - - expect(screen.getByRole('region', { name: 'Intro Title' })).toBeInTheDocument() - expect(screen.getByRole('heading', { level: 3, name: 'Intro Title' })).toBeInTheDocument() - expect(container.querySelector('.prose')).toHaveTextContent('Prefetched body') - expect(onMetaChange).toHaveBeenCalledWith(prefetched.meta) - }) - - it('fetches markdown content when no prefetched data is provided', async () => { - const response: MarkdownRenderResult = { - path: 'homepage/features.md', - html: '

Loaded from network

', - meta: { title: 'Loaded Title', heading: 'h4' }, - } - const fetchMock = vi.fn().mockResolvedValue({ - ok: true, - json: () => Promise.resolve(response), - }) - vi.stubGlobal('fetch', fetchMock) - const onMetaChange = vi.fn() - - render( - - ) - - expect(screen.getByText('Loading content…')).toBeInTheDocument() - - await waitFor(() => { - expect(screen.getByRole('heading', { level: 4, name: 'Loaded Title' })).toBeInTheDocument() - }) - - expect(fetchMock).toHaveBeenCalledWith('/api/render-markdown?path=homepage%2Ffeatures.md', expect.any(Object)) - expect(onMetaChange).toHaveBeenCalledWith(response.meta) - expect(screen.queryByText('Loading content…')).not.toBeInTheDocument() - }) - - it('shows the error fallback when the fetch fails', async () => { - const fetchMock = vi.fn().mockResolvedValue({ - ok: false, - status: 500, - json: () => Promise.resolve({ error: 'Something went wrong' }), - }) - vi.stubGlobal('fetch', fetchMock) - - render() - - await waitFor(() => { - expect(screen.getByText('Failed to load content.')).toBeInTheDocument() - }) - - expect(screen.queryByText('Loading content…')).not.toBeInTheDocument() - }) -}) diff --git a/yarn.lock b/yarn.lock index c623cb0..15416ec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1447,6 +1447,15 @@ __metadata: languageName: node linkType: hard +"@floating-ui/core@npm:^1.7.4": + version: 1.7.4 + resolution: "@floating-ui/core@npm:1.7.4" + dependencies: + "@floating-ui/utils": "npm:^0.2.10" + checksum: 10/b750f306a99be879f0bce879108c440d5b0a67303d3d8318e153687f6ed1af27908428e27cc955475253bd902b95452a3434bd4f0cf96e66e5b5d0db1aa8ea3c + languageName: node + linkType: hard + "@floating-ui/dom@npm:^1.0.0, @floating-ui/dom@npm:^1.7.4": version: 1.7.4 resolution: "@floating-ui/dom@npm:1.7.4" @@ -1457,6 +1466,16 @@ __metadata: languageName: node linkType: hard +"@floating-ui/dom@npm:^1.6.0": + version: 1.7.5 + resolution: "@floating-ui/dom@npm:1.7.5" + dependencies: + "@floating-ui/core": "npm:^1.7.4" + "@floating-ui/utils": "npm:^0.2.10" + checksum: 10/2764990da82bd5cfe942211480aa82352926326008de93f5f3f19749cc8b171fe05b77526a2652605eadcbeab902c6506f18d60a4c43281f2651802047de100b + languageName: node + linkType: hard + "@floating-ui/react-dom@npm:^2.0.0": version: 2.1.6 resolution: "@floating-ui/react-dom@npm:2.1.6" @@ -2203,10 +2222,10 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/api@npm:^1.0.0, @opentelemetry/api@npm:^1.4.1": - version: 1.9.0 - resolution: "@opentelemetry/api@npm:1.9.0" - checksum: 10/a607f0eef971893c4f2ee2a4c2069aade6ec3e84e2a1f5c2aac19f65c5d9eeea41aa72db917c1029faafdd71789a1a040bdc18f40d63690e22ccae5d7070f194 +"@opentelemetry/api@npm:1.4.1": + version: 1.4.1 + resolution: "@opentelemetry/api@npm:1.4.1" + checksum: 10/8637f66c2f7d94c377c9bb22a0528f1349e02a93c0c829de56e487aa4ae02561462a24bfb11a2be25c82e53af9f7737c1fc5d3533e0eb8b1ebf4928204f66ac6 languageName: node linkType: hard @@ -4990,7 +5009,7 @@ __metadata: languageName: node linkType: hard -"@types/react-dom@npm:^18.0.0": +"@types/react-dom@npm:^18.0.0, @types/react-dom@npm:^18.2.0": version: 18.3.7 resolution: "@types/react-dom@npm:18.3.7" peerDependencies: @@ -6764,6 +6783,7 @@ __metadata: resolution: "dashboard@workspace:." dependencies: "@aws-sdk/client-s3": "npm:^3.956.0" + "@floating-ui/dom": "npm:^1.6.0" "@playwright/test": "npm:^1.49.1" "@radix-ui/react-alert-dialog": "npm:^1.1.15" "@radix-ui/react-dialog": "npm:^1.1.15" @@ -6791,6 +6811,7 @@ __metadata: "@types/node": "npm:24.0.3" "@types/prismjs": "npm:^1.26.3" "@types/react": "npm:^18.3.26" + "@types/react-dom": "npm:^18.2.0" "@types/react-grid-layout": "npm:^1.3.5" "@types/sanitize-html": "npm:^2.16.0" "@vercel/analytics": "npm:^1.6.1"