diff --git a/components/elements/response.tsx b/components/elements/response.tsx index 711617327..a753ee2f7 100644 --- a/components/elements/response.tsx +++ b/components/elements/response.tsx @@ -78,6 +78,16 @@ type MarkdownTableHeaderCellProps = ComponentProps<"th"> & { node?: unknown; }; +const TABLE_DRAG_INTERACTIVE_SELECTOR = + "a, button, input, textarea, select, summary, [role='button'], [contenteditable='true'], [data-no-drag='true']"; + +function isTableDragInteractiveTarget(target: EventTarget | null) { + return ( + target instanceof HTMLElement && + Boolean(target.closest(TABLE_DRAG_INTERACTIVE_SELECTOR)) + ); +} + function HorizontalDragScrollArea({ children, className, @@ -126,6 +136,7 @@ function HorizontalDragScrollArea({ onPointerCancel={endDrag} onPointerDown={(event) => { if (event.button !== 0) return; + if (isTableDragInteractiveTarget(event.target)) return; const element = scrollRef.current; if (!element || element.scrollWidth <= element.clientWidth) return; @@ -712,6 +723,30 @@ export const Response = ({ table: DownloadableMarkdownTable, td: MarkdownTableCell, th: MarkdownTableHeaderCell, + a: ({ + children, + className, + href, + onClick, + ...linkProps + }: ComponentProps<"a">) => ( + { + event.stopPropagation(); + onClick?.(event); + }} + rel="noreferrer" + target="_blank" + > + {children} + + ), }; const renderImagePreview = (src: string, alt: string | undefined, key: string) => (