feat(renderer): PreviewPane with empty state and MarkdownRenderer

This commit is contained in:
2026-06-05 13:07:55 +05:30
parent d81d8c28d2
commit b75f436aaa
2 changed files with 50 additions and 0 deletions
@@ -0,0 +1,20 @@
import { MarkdownRenderer } from './MarkdownRenderer';
import { usePreviewStore } from '@/stores/preview-store';
export function PreviewPane() {
const { source } = usePreviewStore();
if (!source) {
return (
<div className="flex h-full items-center justify-center text-muted-foreground">
<p>Nothing to preview. Start typing in the editor.</p>
</div>
);
}
return (
<div className="h-full overflow-auto bg-card/10">
<MarkdownRenderer source={source} />
</div>
);
}
@@ -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(
<ThemeProvider defaultTheme="dark" attribute="class">
<PreviewPane />
</ThemeProvider>
);
expect(screen.getByText(/nothing to preview/i)).toBeInTheDocument();
});
it('renders markdown when source is set', () => {
usePreviewStore.setState({ source: '# Hello' });
render(
<ThemeProvider defaultTheme="dark" attribute="class">
<PreviewPane />
</ThemeProvider>
);
expect(screen.getByRole('heading', { level: 1, name: /hello/i })).toBeInTheDocument();
});
});