diff --git a/src/components/blocks/PreviewPane.astro b/src/components/blocks/PreviewPane.astro
new file mode 100644
index 0000000..4224ddd
--- /dev/null
+++ b/src/components/blocks/PreviewPane.astro
@@ -0,0 +1,343 @@
+---
+// PreviewPane — the dark code/markdown preview block in the review panel.
+//
+// The pane has three body modes (source / rendered Markdown / diff / lens)
+// plus the file-tab strip. The lens view is rendered by ChangeLens instead,
+// so this component only owns the source and rendered-markdown bodies. The
+// toggle between them is task 16's job; this component ships zero JS.
+//
+// CSS hooks asserted by scripts/verify.mjs that live in the legacy
+// stylesheet and must survive in the new architecture:
+// .preview — the section wrapper
+// .preview-title — the upper-left title cluster
+// .preview-markdown— the "Preview Markdown" / "View source" toggle
+// .markdown-preview— the rendered-HTML container
+// max-height:540px — the bounded reading surface
+// .markdown-table-wrap, .markdown-frontmatter, .markdown-toc
+// — sub-blocks inside the rendered Markdown
+
+interface Props {
+ /** Label rendered above the file name. Source: "FILE PREVIEW". */
+ title: string;
+ /** Smaller subtitle that names the version. Source: e.g.
+ * "ORIGINAL / SAFETY-REDACTED WHERE NEEDED". */
+ subtitle: string;
+ /** True when the "Preview Markdown" toggle is active — the body should
+ * render the slot as HTML, otherwise the slot is treated as plain
+ * source. */
+ rendered: boolean;
+}
+
+const { title, subtitle, rendered } = Astro.props;
+---
+
+
+
+