From 5d161a9e139b7fd6e23a36ca59bbae74e282b062 Mon Sep 17 00:00:00 2001 From: Gautam25Raj Date: Fri, 22 May 2026 00:50:01 +0530 Subject: [PATCH] feat: add VeriWorkly cover letter template with PDF and web rendering - Introduced a new cover letter template "VeriWorkly Special" and "Professional" with a two-column layout. - Implemented PDF rendering for the cover letter using React PDF. - Developed web rendering for the cover letter, including dynamic content handling. - Updated the cover letter preview and HTML generation functions to support the new template. - Refactored existing resume template metadata to align with new TemplateMeta type. - Removed obsolete ResumeTemplateMeta interface to streamline template management. --- README.md | 21 +- .../components/dashboard/StudioShell.tsx | 28 +- apps/studio/features/cover-letter/defaults.ts | 68 +- .../cover-letter/editor/CoverLetterEditor.tsx | 794 +++++++++++++++++- .../features/cover-letter/render/pdf.tsx | 26 - .../features/cover-letter/render/web.tsx | 7 - apps/studio/features/cover-letter/schema.ts | 79 +- apps/studio/features/cover-letter/types.ts | 39 + .../features/documents/core/registry.tsx | 2 +- .../documents/core/template-catalog.ts | 43 +- apps/studio/features/documents/core/types.ts | 7 +- .../templates/cover-letter/professional.png | Bin 0 -> 135388 bytes .../cover-letter/veriworkly-special.png | Bin 0 -> 149074 bytes .../public/templates/executive-clarity.png | Bin 631923 -> 0 bytes .../studio/public/templates/precision-ats.png | Bin 132555 -> 0 bytes .../templates/resume/executive-clarity.png | Bin 0 -> 170205 bytes .../public/templates/resume/precision-ats.png | Bin 0 -> 154658 bytes apps/studio/templates/cover-letter/pdf.tsx | 19 + .../cover-letter/professional/meta.ts | 12 + .../cover-letter/professional/pdf.tsx | 326 +++++++ .../cover-letter/professional/web.tsx | 547 ++++++++++++ apps/studio/templates/cover-letter/shared.ts | 274 ++++++ .../templates/cover-letter/veriworkly/meta.ts | 11 + .../templates/cover-letter/veriworkly/pdf.tsx | 374 +++++++++ .../templates/cover-letter/veriworkly/web.tsx | 631 ++++++++++++++ apps/studio/templates/cover-letter/web.tsx | 53 ++ apps/studio/templates/index.ts | 10 +- apps/studio/templates/pdf/fonts.ts | 11 +- .../resume/executive-clarity/meta.ts | 15 +- .../templates/resume/precision-ats/meta.ts | 15 +- apps/studio/templates/resume/types.ts | 21 - 31 files changed, 3278 insertions(+), 155 deletions(-) delete mode 100644 apps/studio/features/cover-letter/render/pdf.tsx delete mode 100644 apps/studio/features/cover-letter/render/web.tsx create mode 100644 apps/studio/public/templates/cover-letter/professional.png create mode 100644 apps/studio/public/templates/cover-letter/veriworkly-special.png delete mode 100644 apps/studio/public/templates/executive-clarity.png delete mode 100644 apps/studio/public/templates/precision-ats.png create mode 100644 apps/studio/public/templates/resume/executive-clarity.png create mode 100644 apps/studio/public/templates/resume/precision-ats.png create mode 100644 apps/studio/templates/cover-letter/pdf.tsx create mode 100644 apps/studio/templates/cover-letter/professional/meta.ts create mode 100644 apps/studio/templates/cover-letter/professional/pdf.tsx create mode 100644 apps/studio/templates/cover-letter/professional/web.tsx create mode 100644 apps/studio/templates/cover-letter/shared.ts create mode 100644 apps/studio/templates/cover-letter/veriworkly/meta.ts create mode 100644 apps/studio/templates/cover-letter/veriworkly/pdf.tsx create mode 100644 apps/studio/templates/cover-letter/veriworkly/web.tsx create mode 100644 apps/studio/templates/cover-letter/web.tsx delete mode 100644 apps/studio/templates/resume/types.ts diff --git a/README.md b/README.md index afc14d5..1b1eb1a 100644 --- a/README.md +++ b/README.md @@ -42,19 +42,36 @@ All while maintaining **100% open-source transparency** and enabling self-hostin ## Templates +### Resume Templates +
- Precision ATS + Precision ATS
Precision ATS
- Executive Clarity + Executive Clarity
Executive Clarity
+### Cover Letter Templates + + + + + + +
+ Professional +
Professional +
+ Veriworkly Special +
Veriworkly Special +
+ ## Architecture and Technology Stack VeriWorkly utilizes a modern, type-safe monorepo architecture to ensure service isolation and scalability. diff --git a/apps/studio/components/dashboard/StudioShell.tsx b/apps/studio/components/dashboard/StudioShell.tsx index 569dc4c..db761e8 100644 --- a/apps/studio/components/dashboard/StudioShell.tsx +++ b/apps/studio/components/dashboard/StudioShell.tsx @@ -17,11 +17,13 @@ import { } from "@/components/dashboard/StudioNavigation"; import { ThemeToggle } from "@/components/dashboard/ThemeToggle"; import { AccountMenu } from "@/components/dashboard/AccountMenu"; -import { NewDocumentButton } from "@/components/dashboard/NewDocumentModal"; +import { NewDocumentButton, NewDocumentModal } from "@/components/dashboard/NewDocumentModal"; import { WorkspaceSearchModal } from "@/components/dashboard/WorkspaceSearchModal"; import { createResume } from "@/features/resume/services/resume-service"; import { signOutCurrentUser } from "@/features/auth/services/current-user"; +import { createDocument } from "@/features/documents/services/document-workspace-service"; +import type { DocumentType } from "@/features/documents/core/document-types"; import { cn } from "@/lib/utils"; @@ -43,13 +45,21 @@ const StudioShell = ({ children, mainClassName }: StudioShellProps) => { const [collapsed, setCollapsed] = useState(false); const [searchOpen, setSearchOpen] = useState(false); const [mobileNavOpen, setMobileNavOpen] = useState(false); + const [newDocumentOpen, setNewDocumentOpen] = useState(false); const email = user?.email || "No account connected"; const displayName = user?.name || user?.email?.split("@")[0] || "Local builder"; - const createNewResume = () => { - const resume = createResume(); - router.push(`/editor/resume/${resume.id}`); + const createNewDocument = (type: DocumentType) => { + if (type === "RESUME") { + const resume = createResume(); + router.push(`/editor/resume/${resume.id}`); + + return; + } + + const document = createDocument(type); + router.push(`/editor/${type.toLowerCase()}/${document.id}`); }; const handleLogout = async () => { @@ -126,7 +136,7 @@ const StudioShell = ({ children, mainClassName }: StudioShellProps) => {
- + setNewDocumentOpen(true)} />
{!collapsed ? ( @@ -187,7 +197,7 @@ const StudioShell = ({ children, mainClassName }: StudioShellProps) => {
- + setNewDocumentOpen(true)} />