From 324e5676b8f7e18079e489bea663fc5719e6aa8d Mon Sep 17 00:00:00 2001 From: Amit Haridas Date: Sat, 6 Jun 2026 08:11:10 +0530 Subject: [PATCH] feat(renderer): ReplPanel (markdown snippet preview) --- src/renderer/components/tools/ReplPanel.tsx | 57 +++++++++++++++++++++ tests/component/tools/ReplPanel.test.tsx | 34 ++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 src/renderer/components/tools/ReplPanel.tsx create mode 100644 tests/component/tools/ReplPanel.test.tsx diff --git a/src/renderer/components/tools/ReplPanel.tsx b/src/renderer/components/tools/ReplPanel.tsx new file mode 100644 index 0000000..e474e7f --- /dev/null +++ b/src/renderer/components/tools/ReplPanel.tsx @@ -0,0 +1,57 @@ +import { useState, useEffect } from 'react'; +import { X } from 'lucide-react'; +import { Textarea } from '@/components/ui/textarea'; +import { Button } from '@/components/ui/button'; +import { useSettingsStore } from '@/stores/settings-store'; +import { renderMarkdown } from '@/lib/markdown'; + +export function ReplPanel() { + const replOpen = useSettingsStore((s) => s.replOpen); + const setSetting = useSettingsStore((s) => s.setSetting); + const [source, setSource] = useState('# Markdown preview\n\nType here…'); + const [debouncedSource, setDebouncedSource] = useState(source); + + useEffect(() => { + const t = setTimeout(() => setDebouncedSource(source), 300); + return () => clearTimeout(t); + }, [source]); + + if (!replOpen) return null; + + const html = renderMarkdown(debouncedSource); + + return ( +
+
+ REPL — Markdown snippet preview + +
+
+