diff --git a/src/renderer/components/preview/PreviewPane.tsx b/src/renderer/components/preview/PreviewPane.tsx
new file mode 100644
index 0000000..16acf53
--- /dev/null
+++ b/src/renderer/components/preview/PreviewPane.tsx
@@ -0,0 +1,20 @@
+import { MarkdownRenderer } from './MarkdownRenderer';
+import { usePreviewStore } from '@/stores/preview-store';
+
+export function PreviewPane() {
+ const { source } = usePreviewStore();
+
+ if (!source) {
+ return (
+
+
Nothing to preview. Start typing in the editor.
+
+ );
+ }
+
+ return (
+
+
+
+ );
+}
diff --git a/tests/component/preview/PreviewPane.test.tsx b/tests/component/preview/PreviewPane.test.tsx
new file mode 100644
index 0000000..e2f8677
--- /dev/null
+++ b/tests/component/preview/PreviewPane.test.tsx
@@ -0,0 +1,30 @@
+import { describe, it, expect, beforeEach } from 'vitest';
+import { render, screen } from '@testing-library/react';
+import { ThemeProvider } from '@/components/theme-provider';
+import { PreviewPane } from '@/components/preview/PreviewPane';
+import { usePreviewStore } from '@/stores/preview-store';
+
+describe('PreviewPane', () => {
+ beforeEach(() => {
+ usePreviewStore.setState({ scrollRatio: 0, source: '' });
+ });
+
+ it('renders empty state when no source', () => {
+ render(
+
+
+
+ );
+ expect(screen.getByText(/nothing to preview/i)).toBeInTheDocument();
+ });
+
+ it('renders markdown when source is set', () => {
+ usePreviewStore.setState({ source: '# Hello' });
+ render(
+
+
+
+ );
+ expect(screen.getByRole('heading', { level: 1, name: /hello/i })).toBeInTheDocument();
+ });
+});