From 67b9f1e703816c455b85936070d829f33df3ae10 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 12 Feb 2026 16:29:12 +0000 Subject: [PATCH 1/2] Initial plan From 0611babfe10a4ba2e9d2c30f34904fdb631fa3fe Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 12 Feb 2026 16:31:06 +0000 Subject: [PATCH 2/2] Add rehype-sanitize and error handling to MarkdownPreview Co-authored-by: naheel0 <191262736+naheel0@users.noreply.github.com> --- package-lock.json | 30 ++++++++++++++++++++ package.json | 1 + src/components/Generator/MarkdownPreview.tsx | 16 +++++++---- 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index f08ba05..3c2e980 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,7 @@ "react-dom": "19.2.4", "react-markdown": "^10.1.0", "rehype-raw": "^7.0.0", + "rehype-sanitize": "^6.0.0", "remark-gfm": "^4.0.1" }, "devDependencies": { @@ -5864,6 +5865,21 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-sanitize": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-5.0.2.tgz", + "integrity": "sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "unist-util-position": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-to-jsx-runtime": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", @@ -8783,6 +8799,20 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/rehype-sanitize": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/rehype-sanitize/-/rehype-sanitize-6.0.0.tgz", + "integrity": "sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-sanitize": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-gfm": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", diff --git a/package.json b/package.json index 08a931e..272aa68 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "react-dom": "19.2.4", "react-markdown": "^10.1.0", "rehype-raw": "^7.0.0", + "rehype-sanitize": "^6.0.0", "remark-gfm": "^4.0.1" }, "devDependencies": { diff --git a/src/components/Generator/MarkdownPreview.tsx b/src/components/Generator/MarkdownPreview.tsx index 641e746..7eb7b1c 100644 --- a/src/components/Generator/MarkdownPreview.tsx +++ b/src/components/Generator/MarkdownPreview.tsx @@ -3,7 +3,8 @@ import React, { useState } from 'react'; import ReactMarkdown from 'react-markdown'; import remarkGfm from 'remark-gfm'; -import rehypeRaw from 'rehype-raw'; // Add this +import rehypeRaw from 'rehype-raw'; +import rehypeSanitize from 'rehype-sanitize'; import { Copy, Check, FileCode, } from 'lucide-react'; export const MarkdownPreview = ({ content }: { content: string }) => { @@ -11,9 +12,14 @@ export const MarkdownPreview = ({ content }: { content: string }) => { const [copied, setCopied] = useState(false); const handleCopy = async () => { - await navigator.clipboard.writeText(content); - setCopied(true); - setTimeout(() => setCopied(false), 2000); + try { + await navigator.clipboard.writeText(content); + setCopied(true); + setTimeout(() => setCopied(false), 2000); + } catch (error) { + console.error('Failed to copy to clipboard:', error); + setCopied(false); + } }; if (!content) return null; @@ -70,7 +76,7 @@ export const MarkdownPreview = ({ content }: { content: string }) => {