${first ? `` : `Cover Letter Continued
`}`;
+ })
+ .join("")}`;
+}
diff --git a/apps/studio/templates/cover-letter/web.tsx b/apps/studio/templates/cover-letter/web.tsx
new file mode 100644
index 0000000..e90a2ef
--- /dev/null
+++ b/apps/studio/templates/cover-letter/web.tsx
@@ -0,0 +1,53 @@
+import type { CoverLetterContent } from "@/features/cover-letter/types";
+import { DocumentFontLoader } from "@/features/documents/components/DocumentFontLoader";
+
+import {
+ buildCoverLetterText,
+ buildCoverLetterMarkdown,
+ COVER_LETTER_VERIWORKLY_ID,
+} from "./shared";
+import {
+ ProfessionalCoverLetterPreview,
+ buildProfessionalCoverLetterHtml,
+} from "./professional/web";
+import { VeriworklyCoverLetterPreview, buildVeriworklyCoverLetterHtml } from "./veriworkly/web";
+
+export { buildCoverLetterMarkdown, buildCoverLetterText };
+export { splitContactLinks, splitMarkdownLines, splitRichTextBlocks } from "./shared";
+
+interface CoverLetterPreviewProps {
+ content: CoverLetterContent;
+ templateId: string;
+}
+
+export function renderCoverLetterWeb(content: CoverLetterContent) {
+ return buildCoverLetterText(content);
+}
+
+export function CoverLetterPreview({ content, templateId }: CoverLetterPreviewProps) {
+ const fontFamily = content.appearance?.fontFamily;
+
+ if (templateId === COVER_LETTER_VERIWORKLY_ID) {
+ return (
+ <>
+