feat(cv): rebuild professional resume studio

This commit is contained in:
cesnimda
2026-08-24 20:21:23 +02:00
parent dca5daa1a2
commit 367b70681a
27 changed files with 827 additions and 187 deletions
+27 -1
View File
@@ -15,6 +15,22 @@ export type CvVariantSettings = {
dateFormat?: string | null;
language?: string | null;
headline?: string | null;
textColor?: string | null;
mutedColor?: string | null;
headingColor?: string | null;
backgroundColor?: string | null;
baseFontSizePt?: number | null;
headingSizePt?: number | null;
lineHeight?: number | null;
pageMarginMm?: number | null;
sectionGapMm?: number | null;
entryGapMm?: number | null;
headingStyle?: "caps-rule" | "underline" | "plain" | "bar" | null;
headerStyle?: "plain" | "band" | "centered" | "kicker" | null;
skillsStyle?: "tags" | "text" | null;
layout?: "single" | "sidebar-left" | "sidebar-right" | "header-band" | null;
sidebarWidthMm?: number | null;
sidebarSections?: string[] | null;
showPhoto: boolean;
showPageNumbers: boolean;
showIcons: boolean;
@@ -47,10 +63,13 @@ export type CvVariantSummary = {
id: number;
name: string;
themeId: string;
language?: string | null;
publicSlug: string;
isPublic: boolean;
version: number;
jobApplicationId: number | null;
jobTitle?: string | null;
companyName?: string | null;
updatedAtUtc: string;
};
@@ -74,6 +93,7 @@ export const AI_ACTIONS: { key: string; label: string }[] = [
{ key: "shorten", label: "Shorten" },
{ key: "expand", label: "Expand" },
{ key: "grammar", label: "Fix grammar" },
{ key: "impact", label: "Add measurable impact" },
{ key: "ats", label: "ATS optimise" },
{ key: "bullets", label: "Generate bullets" },
{ key: "summary", label: "Generate summary" },
@@ -82,7 +102,8 @@ export const AI_ACTIONS: { key: string; label: string }[] = [
];
export const DEFAULT_SECTION_ORDER = [
"summary", "experience", "education", "projects", "skills", "certifications", "languages", "interests",
"summary", "experience", "education", "projects", "skills", "certifications", "languages", "awards",
"publications", "organisations", "interests", "references",
];
export const SECTION_LABELS: Record<string, string> = {
@@ -94,6 +115,10 @@ export const SECTION_LABELS: Record<string, string> = {
certifications: "Certifications",
languages: "Languages",
interests: "Interests",
awards: "Awards",
publications: "Publications",
organisations: "Organisations",
references: "References",
};
const CSS_PIXELS_PER_MM = 96 / 25.4;
@@ -166,6 +191,7 @@ export function wrapSelection(
export const cvBuilderApi = {
themes: () => api.get<CvTheme[]>("/cv/themes").then((r) => r.data),
themePreview: (themeId: string) => api.get<CvRender>(`/cv/themes/${encodeURIComponent(themeId)}/preview`).then((r) => r.data),
outline: () => api.get<CvOutline>("/cv/outline").then((r) => r.data),
list: () => api.get<CvVariantSummary[]>("/cv/variants").then((r) => r.data),
create: (body: { name?: string; jobApplicationId?: number | null; settings?: CvVariantSettings }) =>