diff --git a/src/components/MermaidDiagram.test.tsx b/src/components/MermaidDiagram.test.tsx
index 43721925..54e2cac2 100644
--- a/src/components/MermaidDiagram.test.tsx
+++ b/src/components/MermaidDiagram.test.tsx
@@ -59,6 +59,28 @@ describe('MermaidDiagram', () => {
expect(screen.getByTestId('mermaid-diagram-dialog-viewport').querySelector('svg')).not.toBeNull()
})
+ it('keeps rendered SVG pointer events inside the Mermaid block', async () => {
+ const onBlockPointer = vi.fn()
+ render(
+
+ B'}
+ source={'```mermaid\nflowchart LR\nA --> B\n```'}
+ />
+
,
+ )
+
+ await waitFor(() => {
+ expect(screen.getByTestId('mermaid-diagram-viewport').querySelector('svg')).not.toBeNull()
+ })
+
+ const viewport = screen.getByTestId('mermaid-diagram-viewport')
+ fireEvent.mouseDown(viewport)
+ fireEvent.click(viewport)
+
+ expect(onBlockPointer).not.toHaveBeenCalled()
+ })
+
it('tags Mermaid SVG style elements with the runtime CSP nonce', async () => {
mermaidMock.render.mockResolvedValueOnce({
svg: '',
diff --git a/src/components/MermaidDiagram.tsx b/src/components/MermaidDiagram.tsx
index 26380d1a..ff0d5ada 100644
--- a/src/components/MermaidDiagram.tsx
+++ b/src/components/MermaidDiagram.tsx
@@ -1,5 +1,5 @@
import { ArrowsOut as Maximize2 } from '@phosphor-icons/react'
-import { useEffect, useId, useMemo, useState } from 'react'
+import { useEffect, useId, useMemo, useState, type SyntheticEvent } from 'react'
import { Button } from '@/components/ui/button'
import {
Dialog,
@@ -106,14 +106,27 @@ function MermaidSvgViewport({ ariaLabel, className, svg, testId }: MermaidSvgVie
)
}
+function stopMermaidViewportEvent(event: SyntheticEvent): void {
+ event.stopPropagation()
+}
+
function MermaidLightbox({ svg }: { svg: string }) {
return (