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"