/* resume.jsx — 5 one-column, ATS-safe résumé templates via one themed renderer.
All templates: single column, standard fonts, real headings, no tables/graphics
columns — so an ATS parser reads them top-to-bottom cleanly. */
const DEFAULT_ORDER = ["experience", "projects", "education", "skills", "certs"];
const TEMPLATES = {
classic: {
name: "Meridian",
badge: "Serif",
font: '"Poppins", "Helvetica Neue", Arial, sans-serif',
headFont: '"Poppins", "Helvetica Neue", Arial, sans-serif',
align: "center",
nameSize: 30, nameWeight: 400, nameCase: "none", nameSpace: ".01em",
titleStyle: { case: "none", color: "muted", size: 14, weight: 400, italic: true },
contact: { sep: "•", align: "center", accent: false },
sec: { case: "uppercase", size: 12.5, weight: 700, space: ".12em", rule: "full", color: "ink", accent: false, mt: 22 },
body: 13, lh: 1.5, gap: 1, accentName: false,
},
modern: {
name: "Veritas",
badge: "Sans",
font: '"Poppins", "Helvetica Neue", Arial, sans-serif',
headFont: '"Poppins", "Helvetica Neue", Arial, sans-serif',
align: "left",
nameSize: 30, nameWeight: 700, nameCase: "none", nameSpace: "-.01em",
titleStyle: { case: "none", color: "accent", size: 14.5, weight: 600, italic: false },
contact: { sep: "|", align: "left", accent: true },
sec: { case: "uppercase", size: 12, weight: 700, space: ".13em", rule: "accent", color: "ink", accent: false, mt: 22 },
body: 13, lh: 1.5, gap: 1, accentName: false,
},
minimal: {
name: "Lumen",
badge: "Airy",
font: '"Poppins", "Helvetica Neue", Arial, sans-serif',
headFont: '"Poppins", "Helvetica Neue", Arial, sans-serif',
align: "left",
nameSize: 32, nameWeight: 600, nameCase: "none", nameSpace: "-.02em",
titleStyle: { case: "none", color: "muted", size: 14, weight: 400, italic: false },
contact: { sep: "·", align: "left", accent: false },
sec: { case: "uppercase", size: 11, weight: 700, space: ".18em", rule: "none", color: "soft", accent: false, mt: 28 },
body: 13, lh: 1.6, gap: 1.25, accentName: false,
},
executive: {
name: "Prestige",
badge: "Refined",
font: 'Georgia, "Times New Roman", serif',
headFont: 'Georgia, "Times New Roman", serif',
align: "center",
nameSize: 31, nameWeight: 700, nameCase: "uppercase", nameSpace: ".06em",
titleStyle: { case: "uppercase", color: "accent", size: 12, weight: 600, italic: false, space: ".18em" },
contact: { sep: "•", align: "center", accent: false },
sec: { case: "smallcaps", size: 14.5, weight: 700, space: ".02em", rule: "shortAccent", color: "ink", accent: false, mt: 24 },
body: 13, lh: 1.52, gap: 1.05, accentName: false, headerRule: true,
},
technical: {
name: "Cipher",
badge: "Engineer",
font: 'Arial, Helvetica, sans-serif',
headFont: '"Poppins", "Helvetica Neue", Arial, sans-serif',
align: "left",
nameSize: 27, nameWeight: 700, nameCase: "none", nameSpace: "-.01em",
titleStyle: { case: "none", color: "accent", size: 13.5, weight: 600, italic: false, mono: true },
contact: { sep: "/", align: "left", accent: true, mono: true },
sec: { case: "uppercase", size: 12, weight: 700, space: ".08em", rule: "block", color: "ink", accent: true, mt: 20 },
body: 12.5, lh: 1.5, gap: .9, accentName: false, mono: true,
},
novo: {
name: "Kova",
badge: "Modern",
custom: true,
defaultAccent: "#E0533D",
font: '"Poppins", "Helvetica Neue", Arial, sans-serif',
},
slate: {
name: "Ashton",
badge: "Corporate",
custom: true,
defaultAccent: "#33414F",
font: '"Poppins", "Helvetica Neue", Arial, sans-serif',
},
academic: {
name: "Scholars", badge: "Academic", defaultAccent: "#333A47",
font: '"Poppins", "Helvetica Neue", Arial, sans-serif', headFont: '"Poppins", "Helvetica Neue", Arial, sans-serif',
align: "center", nameSize: 30, nameWeight: 400, nameCase: "uppercase", nameSpace: ".1em",
titleStyle: { case: "none", color: "muted", size: 13, weight: 400, italic: false },
contact: { sep: "·", align: "center", accent: false },
sec: { case: "none", size: 14.5, weight: 700, space: ".01em", rule: "full", color: "ink", mt: 22 },
body: 13, lh: 1.5, gap: 1, accentName: false,
},
cobalt: {
name: "Harbor", badge: "Bold", defaultAccent: "#2D7DD2",
font: '"Poppins", "Helvetica Neue", Arial, sans-serif', headFont: '"Poppins", "Helvetica Neue", Arial, sans-serif',
align: "left", nameSplit: true, nameSize: 31, nameWeight: 800, nameCase: "uppercase", nameSpace: "-.01em",
titleStyle: { case: "none", color: "muted", size: 13.5, weight: 600, italic: false },
contact: { sep: "|", align: "left", accent: false, bar: true },
sec: { case: "none", size: 14.5, weight: 700, space: "0", rule: "accent", color: "ink", mt: 20 },
body: 13, lh: 1.5, gap: 1, accentName: false,
},
slab: {
name: "Forged", badge: "Heavy", defaultAccent: "#1B7FE0",
font: '"Poppins", "Helvetica Neue", Arial, sans-serif', headFont: '"Poppins", "Helvetica Neue", Arial, sans-serif',
align: "left", nameSize: 31, nameWeight: 800, nameCase: "uppercase", nameSpace: "-.01em",
titleStyle: { case: "none", color: "accent", size: 14, weight: 700, italic: false },
contact: { sep: "•", align: "left", accent: true },
sec: { case: "uppercase", size: 16, weight: 800, space: ".02em", rule: "thick", color: "ink", mt: 22 },
body: 13, lh: 1.5, gap: 1, accentName: false,
},
indigo: {
name: "Dusk", badge: "Minimal", defaultAccent: "#5B5FCF",
font: '"Helvetica Neue", Arial, sans-serif', headFont: '"Helvetica Neue", Arial, sans-serif',
align: "left", nameSize: 31, nameWeight: 700, nameCase: "none", nameSpace: "-.01em",
titleStyle: { case: "none", color: "soft", size: 14.5, weight: 400, italic: false },
contact: { sep: "·", align: "left", accent: false },
sec: { case: "uppercase", size: 12.5, weight: 700, space: ".08em", rule: "none", color: "soft", mt: 24 },
body: 13, lh: 1.5, gap: 1, accentName: false,
},
timeline: {
name: "Chronicle", badge: "Modern", custom: true, defaultAccent: "#2E8B57",
font: '"Poppins", "Helvetica Neue", Arial, sans-serif',
},
sidebar: {
name: "Verso", badge: "Two-column", custom: true, defaultAccent: "#1FA89F", side: "left", nameColor: "#2b2d33",
font: '"Poppins", "Helvetica Neue", Arial, sans-serif',
},
split: {
name: "Duet", badge: "Two-column", custom: true, defaultAccent: "#E8732A", side: "right", nameColor: "#13296B",
font: '"Poppins", "Helvetica Neue", Arial, sans-serif',
},
};
function clr(token, accent) {
if (token === "accent") return accent;
if (token === "muted") return "#444";
if (token === "soft") return "#6b7280";
return "#15171f";
}
function SectionTitle({ t, accent, children }) {
const s = t.sec;
const base = {
fontFamily: t.headFont,
fontSize: s.size,
fontWeight: s.weight,
letterSpacing: s.space,
textTransform: s.case === "smallcaps" ? "none" : s.case,
fontVariant: s.case === "smallcaps" ? "small-caps" : "normal",
color: clr(s.color, accent),
margin: `${s.mt}px 0 9px`,
paddingBottom: 5,
lineHeight: 1.1,
};
if (s.rule === "full") { base.borderBottom = "1px solid #c9ced6"; }
if (s.rule === "thick") { base.borderBottom = "2.5px solid #1c2230"; base.paddingBottom = 6; }
if (s.rule === "accent") { base.borderBottom = `2px solid ${accent}`; }
if (s.rule === "shortAccent") {
return (
);
}
if (s.rule === "block") {
return (
{children}
);
}
return {children}
;
}
const FONTS = [
{ key: "poppins", label: "Poppins", stack: '"Poppins", "Helvetica Neue", Arial, sans-serif', note: "Default" },
{ key: "auto", label: "Template default", stack: null },
{ key: "arial", label: "Arial", stack: 'Arial, Helvetica, sans-serif' },
{ key: "helvetica", label: "Helvetica", stack: '"Helvetica Neue", Helvetica, Arial, sans-serif' },
{ key: "calibri", label: "Calibri", stack: 'Calibri, Carlito, "Segoe UI", sans-serif' },
{ key: "verdana", label: "Verdana", stack: 'Verdana, Geneva, sans-serif' },
{ key: "georgia", label: "Georgia", stack: 'Georgia, "Times New Roman", serif' },
{ key: "times", label: "Times New Roman", stack: '"Times New Roman", Times, serif' },
{ key: "garamond", label: "Garamond", stack: 'Garamond, "Palatino Linotype", Georgia, serif' },
{ key: "ubuntu", label: "Ubuntu", stack: '"Ubuntu", "Segoe UI", Arial, sans-serif', note: "Novoresume" },
{ key: "lato", label: "Lato", stack: '"Lato", "Helvetica Neue", Arial, sans-serif' },
{ key: "roboto", label: "Roboto", stack: '"Roboto", Arial, sans-serif' },
{ key: "opensans", label: "Open Sans", stack: '"Open Sans", "Segoe UI", Arial, sans-serif' },
];
const FONT_STACKS = Object.fromEntries(FONTS.map((f) => [f.key, f.stack]));
window.FONTS = FONTS;
const RESUME_ACCENTS = ["#0A0E39", "#1C9BE6", "#34C77F", "#0E7490", "#6D5AE0", "#475569", "#C2410C", "#BE185D", "#111827"];
function NovoResume({ data, accent = "#E0533D", design = {}, sectionOrder = DEFAULT_ORDER }) {
const { basics = {}, summary, experience = [], education = [], skills = [], projects = [], certs = [], custom = [], languages = [], activities = [], profdegrees = [], references = [], refsOnRequest } = data;
const f = design.scale === "small" ? 0.93 : design.scale === "large" ? 1.09 : 1;
const sp = design.spacing === "compact" ? 0.9 : design.spacing === "relaxed" ? 1.14 : 1;
const fontOverride = design.font && design.font !== "auto" ? FONT_STACKS[design.font] : null;
const font = fontOverride || '"Poppins", "Helvetica Neue", Arial, sans-serif';
const lh = +(1.5 * sp).toFixed(3);
const body = 13.2 * f;
const STEEL = "#7E94A8"; // skill pills
const STEEL_DK = "#2E4A63"; // leading section diamond
const LINE = "#C4CDD7"; // divider line + end diamonds
const INK = "#2b2d33";
const SUB = "#54565c";
const Dia = ({ s = 9, color = LINE, fill = "none", sw = 1.4 }) => (
);
const SectionHead = ({ children }) => (
);
const Bullet = ({ children }) => (
•
{children}
);
const Bullets = ({ items }) => (items || []).filter(Boolean).map((b, i) => {b});
const contact = [
basics.email && { icon: "mail", text: basics.email },
basics.phone && { icon: "phone", text: basics.phone },
basics.location && { icon: "pin", text: basics.location },
basics.website && { icon: "globe", text: basics.website },
basics.linkedin && { icon: "link", text: basics.linkedin },
].filter(Boolean);
const skillItems = skills.flatMap((g) => g.items || []);
const Entry = ({ title, sub, date, children }) => (
{title}
{sub &&
{sub}
}
{date &&
{date}
}
{children}
);
return (
{/* Header */}
{basics.name || "Your Name"}
{basics.title &&
{basics.title}
}
{basics.photo &&

}
{summary &&
{summary}
}
{contact.length > 0 && (
{contact.map((c, i) => (
{c.text}
))}
)}
{skillItems.length > 0 && (
Areas of Expertise
{skillItems.map((s, i) => (
{s}
))}
)}
{sectionOrder.map(key => {
if (key === "experience" && experience.length > 0) return (
Work Experience
{experience.map((x, i) => (
))}
);
if (key === "projects" && projects.length > 0) return (
Projects
{projects.map((p, i) => (
{p.detail && {p.detail}
}
))}
);
if (key === "education" && education.length > 0) return (
Education
{education.map((e, i) => (
{e.detail && {e.detail}
}
))}
);
if (key === "certs" && certs.length > 0) return (
Certifications
{certs.filter(Boolean).map((c, i) => {c})}
);
if (key === "languages" && languages.length > 0) return (
Languages
{languages.filter(l => l.lang).map((l, i) => {l.lang}{l.level ? ` - ${l.level}` : ""})}
);
if (key === "activities" && activities.length > 0) return (
Extracurricular Activities
{activities.map((a, i) => (
{a.title}{a.org ? ` - ${a.org}` : ""}
{a.dates && {a.dates}}
{a.detail &&
{a.detail}
}
))}
);
if (key === "profdegrees" && profdegrees.length > 0) return (
Professional Credentials
{profdegrees.filter(Boolean).map((c, i) => {c})}
);
if (key === "references") return (
References
{refsOnRequest || !references.length ? (
Available upon request
) : (
{references.filter(r => r.name).map((r, i) => (
{r.name}
{r.title &&
{r.title}{r.company ? `, ${r.company}` : ""}
}
{r.email &&
{r.email}
}
{r.phone &&
{r.phone}
}
))}
)}
);
return null;
})}
{custom.filter((c) => (c.heading && c.heading.trim()) || (c.body && c.body.replace(/<[^>]*>/g, "").trim())).map((c) => (
))}
);
}
function SlateResume({ data, accent = "#33414F", design = {}, sectionOrder = DEFAULT_ORDER }) {
const { basics = {}, summary, experience = [], education = [], skills = [], projects = [], certs = [], custom = [], languages = [], activities = [], profdegrees = [], references = [], refsOnRequest } = data;
const f = design.scale === "small" ? 0.93 : design.scale === "large" ? 1.09 : 1;
const sp = design.spacing === "compact" ? 0.9 : design.spacing === "relaxed" ? 1.14 : 1;
const fontOverride = design.font && design.font !== "auto" ? FONT_STACKS[design.font] : null;
const font = fontOverride || '"Poppins", "Helvetica Neue", Arial, sans-serif';
const lh = +(1.5 * sp).toFixed(3);
const body = 13.2 * f;
const PAD = 56;
const INK = "#2b2d33";
const SUB = "#54565c";
const META = "#8a8d94";
const contact = [
basics.email && { icon: "mail", text: basics.email },
basics.phone && { icon: "phone", text: basics.phone },
basics.location && { icon: "pin", text: basics.location },
basics.linkedin && { icon: "link", text: basics.linkedin },
basics.website && { icon: "globe", text: basics.website },
].filter(Boolean);
const skillItems = skills.flatMap((g) => g.items || []);
const SectionHead = ({ children }) => (
{children}
);
const Ring = () => (
);
const Bullets = ({ items }) => (items || []).filter(Boolean).map((b, i) => (
•
{b}
));
const Entry = ({ title, sub, dateL, dateR, children }) => (
{title}
{sub &&
{sub}
}
{(dateL || dateR) && (
{dateL}{dateR}
)}
{children}
);
return (
{basics.name || "Your Name"}
{basics.title &&
{basics.title}
}
{summary &&
{summary}
}
{/* Dark full-width contact bar */}
{contact.length > 0 && (
{contact.map((c, i) => (
{c.text}
))}
)}
{skillItems.length > 0 && (
Skills
{skillItems.map((s, i) =>
{s}
)}
)}
{sectionOrder.map(key => {
if (key === "experience" && experience.length > 0) return (
Work Experience
{experience.map((x, i) => (
))}
);
if (key === "projects" && projects.length > 0) return (
Projects
{projects.map((p, i) => (
{p.detail && {p.detail}
}
))}
);
if (key === "education" && education.length > 0) return (
Education
{education.map((e, i) => (
{e.detail && {e.detail}
}
))}
);
if (key === "certs" && certs.length > 0) return (
);
if (key === "languages" && languages.length > 0) return (
Languages
{languages.filter(l => l.lang).map((l, i) => {l.lang}{l.level ? ` - ${l.level}` : ""})}
);
if (key === "activities" && activities.length > 0) return (
Extracurricular Activities
{activities.map((a, i) => (
{a.title}{a.org ? ` - ${a.org}` : ""}
{a.dates && {a.dates}}
{a.detail &&
{a.detail}
}
))}
);
if (key === "profdegrees" && profdegrees.length > 0) return (
);
if (key === "references") return (
References
{refsOnRequest || !references.length ? (
Available upon request
) : (
{references.filter(r => r.name).map((r, i) => (
{r.name}
{r.title &&
{r.title}{r.company ? `, ${r.company}` : ""}
}
{r.email &&
{r.email}
}
{r.phone &&
{r.phone}
}
))}
)}
);
return null;
})}
{custom.filter((c) => (c.heading && c.heading.trim()) || (c.body && c.body.replace(/<[^>]*>/g, "").trim())).map((c) => (
))}
);
}
function makeContact(basics) {
return [
basics.phone && { icon: "phone", text: basics.phone },
basics.email && { icon: "mail", text: basics.email },
basics.linkedin && { icon: "link", text: basics.linkedin },
basics.website && { icon: "globe", text: basics.website },
basics.location && { icon: "pin", text: basics.location },
].filter(Boolean);
}
function TimelineResume({ data, accent = "#2E8B57", design = {}, sectionOrder = DEFAULT_ORDER }) {
const { basics = {}, summary, experience = [], education = [], skills = [], projects = [], certs = [], custom = [], languages = [], activities = [], profdegrees = [], references = [], refsOnRequest } = data;
const f = design.scale === "small" ? 0.93 : design.scale === "large" ? 1.09 : 1;
const sp = design.spacing === "compact" ? 0.9 : design.spacing === "relaxed" ? 1.14 : 1;
const fontOverride = design.font && design.font !== "auto" ? FONT_STACKS[design.font] : null;
const font = fontOverride || '"Poppins", "Helvetica Neue", Arial, sans-serif';
const lh = +(1.5 * sp).toFixed(3);
const body = 13.2 * f;
const PAD = 54, INK = "#2b2d33", SUB = "#54565c", META = "#6b7280";
const contact = makeContact(basics);
const skillItems = skills.flatMap((g) => g.items || []);
const SectionHead = ({ children }) => (
{children}
);
const Bullets = ({ items }) => (items || []).filter(Boolean).map((b, i) => (
•
{b}
));
const TLItem = ({ dateL, loc, role, org, last, children }) => (
{!last && }
{role}
{org &&
{org}
}
{children &&
{children}
}
);
return (
{basics.name || "Your Name"}
{basics.title &&
{basics.title}
}
{contact.length > 0 && (
{contact.map((c, i) => (
{c.text}
))}
)}
{basics.photo &&

}
{summary && (
)}
{sectionOrder.map(key => {
if (key === "experience" && experience.length > 0) return (
Experience
{experience.map((x, i) => (
))}
);
if (key === "education" && education.length > 0) return (
Education
{education.map((e, i) => (
{e.detail && {e.detail}
}
))}
);
if (key === "projects" && projects.length > 0) return (
Projects
{projects.map((p, i) => (
{p.name}{p.tech && · {p.tech}}
{p.detail &&
{p.detail}
}
))}
);
if (key === "skills" && skillItems.length > 0) return (
Skills{skillItems.join(", ")}
);
if (key === "certs" && certs.length > 0) return (
);
if (key === "languages" && languages.length > 0) return (
Languages
{languages.filter(l => l.lang).map((l, i) => `${l.lang}${l.level ? ` (${l.level})` : ""}`).join(" · ")}
);
if (key === "activities" && activities.length > 0) return (
Extracurricular Activities
{activities.map((a, i) => (
{a.title}{a.org ? ` - ${a.org}` : ""}{a.dates ? · {a.dates} : ""}
{a.detail &&
{a.detail}
}
))}
);
if (key === "profdegrees" && profdegrees.length > 0) return (
);
if (key === "references") return (
References
{refsOnRequest || !references.length ? (
Available upon request
) : references.filter(r => r.name).map((r, i) => (
{r.name}
{r.title &&
{r.title}{r.company ? `, ${r.company}` : ""}
}
{r.email &&
{r.email}
}
))}
);
return null;
})}
{custom.filter((c) => (c.heading && c.heading.trim()) || (c.body && c.body.replace(/<[^>]*>/g, "").trim())).map((c) => (
))}
);
}
function TwoColResume({ data, accent = "#1FA89F", design = {}, side = "left", nameColor = "#2b2d33", sectionOrder = DEFAULT_ORDER, sidebarSections = DEFAULT_SIDEBAR }) {
const { basics = {}, summary, experience = [], education = [], skills = [], projects = [], certs = [], custom = [], languages = [], activities = [], profdegrees = [], references = [], refsOnRequest } = data;
const f = design.scale === "small" ? 0.93 : design.scale === "large" ? 1.09 : 1;
const sp = design.spacing === "compact" ? 0.9 : design.spacing === "relaxed" ? 1.14 : 1;
const fontOverride = design.font && design.font !== "auto" ? FONT_STACKS[design.font] : null;
const font = fontOverride || '"Poppins", "Helvetica Neue", Arial, sans-serif';
const lh = +(1.5 * sp).toFixed(3);
const body = 12.6 * f;
const PAD = 46, SUB = "#54565c", META = "#7c828c";
const contact = makeContact(basics);
const skillItems = skills.flatMap((g) => g.items || []);
const inSidebar = (id) => sidebarSections.includes(id);
const Head = ({ children, small }) => (
{children}
);
const Bullets = ({ items }) => (items || []).filter(Boolean).map((b, i) => (
•
{b}
));
const meta = (txt, icon) => {txt};
const ExpBlock = ({ items }) => items.map((x, i) => (
{x.role}
{x.company}
{meta(`${x.start} - ${x.end}`, "calendar")}{x.location && meta(x.location, "pin")}
));
const Main = (
{summary && (
)}
{sectionOrder.filter(id => !inSidebar(id)).map(key => {
if (key === "experience" && experience.length > 0) return (
);
if (key === "education" && education.length > 0) return (
Education
{education.map((e, i) => (
{e.degree}
{e.school}
{meta(`${e.start} - ${e.end}`, "briefcase")}{e.location && meta(e.location, "pin")}
))}
);
if (key === "projects" && projects.length > 0) return (
Projects
{projects.map((p, i) => (
{p.name}
{p.detail &&
{p.detail}
}
))}
);
if (key === "skills" && skillItems.length > 0) return (
Skills
{skillItems.map((s, i) => (
{s}
))}
);
if (key === "certs" && certs.length > 0) return (
Training & Courses
{certs.filter(Boolean).map((c, i) => {c}
)}
);
if (key === "languages" && languages.length > 0) return (
Languages
{languages.filter(l => l.lang).map((l, i) => {l.lang}{l.level ? ` - ${l.level}` : ""}
)}
);
if (key === "activities" && activities.length > 0) return (
Extracurricular Activities
{activities.map((a, i) => (
{a.title}{a.org ? ` - ${a.org}` : ""}
{a.dates &&
{a.dates}
}
{a.detail &&
{a.detail}
}
))}
);
if (key === "profdegrees" && profdegrees.length > 0) return (
Professional Credentials
{profdegrees.filter(Boolean).map((c, i) => {c}
)}
);
if (key === "references") return (
References
{refsOnRequest || !references.length ? (
Available upon request
) : references.filter(r => r.name).map((r, i) => (
{r.name}
{r.title &&
{r.title}{r.company ? `, ${r.company}` : ""}
}
{r.email &&
{r.email}
}
))}
);
return null;
})}
);
const Side = (
{sectionOrder.filter(id => inSidebar(id)).map(key => {
if (key === "skills" && skillItems.length > 0) return (
Skills
{skillItems.map((s, i) => (
{s}
))}
);
if (key === "certs" && certs.length > 0) return (
Training & Courses
{certs.filter(Boolean).map((c, i) => {c}
)}
);
if (key === "education" && education.length > 0) return (
Education
{education.map((e, i) => (
{e.degree}
{e.school}
{e.start} - {e.end}{e.location ? ` · ${e.location}` : ""}
))}
);
if (key === "experience" && experience.length > 0) return (
);
if (key === "projects" && projects.length > 0) return (
Projects
{projects.map((p, i) => (
{p.name}
{p.detail &&
{p.detail}
}
))}
);
if (key === "languages" && languages.length > 0) return (
Languages
{languages.filter(l => l.lang).map((l, i) => {l.lang}{l.level ? ` - ${l.level}` : ""}
)}
);
if (key === "activities" && activities.length > 0) return (
Extracurricular Activities
{activities.map((a, i) => (
{a.title}{a.org ? ` - ${a.org}` : ""}
{a.dates &&
{a.dates}
}
))}
);
if (key === "profdegrees" && profdegrees.length > 0) return (
Professional Credentials
{profdegrees.filter(Boolean).map((c, i) => {c}
)}
);
if (key === "references") return (
References
{refsOnRequest || !references.length ? (
Available upon request
) : references.filter(r => r.name).map((r, i) => (
{r.name}
{r.title &&
{r.title}
}
{r.email &&
{r.email}
}
))}
);
return null;
})}
{custom.filter((c) => (c.heading && c.heading.trim()) || (c.body && c.body.replace(/<[^>]*>/g, "").trim())).map((c) => (
))}
);
return (
{basics.name || "Your Name"}
{basics.title &&
{basics.title}
}
{contact.length > 0 && (
{contact.map((c, i) => (
{c.text}
))}
)}
{basics.photo &&

}
{side === "left" ? <>{Side}{Main}> : <>{Main}{Side}>}
);
}
const DEFAULT_SIDEBAR = ["skills", "certs", "education"];
function Resume({ data, template = "classic", accent = "#1C9BE6", design = {}, sectionOrder = DEFAULT_ORDER, sidebarSections = DEFAULT_SIDEBAR }) {
if (template === "novo") return ;
if (template === "slate") return ;
if (template === "timeline") return ;
if (template === "sidebar" || template === "split") {
const cfg = TEMPLATES[template];
return ;
}
const t0 = TEMPLATES[template] || TEMPLATES.classic;
const f = design.scale === "small" ? 0.93 : design.scale === "large" ? 1.09 : 1;
const sp = design.spacing === "compact" ? 0.9 : design.spacing === "relaxed" ? 1.14 : 1;
const fontOverride = design.font && design.font !== "auto" ? FONT_STACKS[design.font] : null;
const t = {
...t0,
font: fontOverride || t0.font,
headFont: fontOverride || t0.headFont,
mono: fontOverride ? false : t0.mono,
nameSize: t0.nameSize * f,
body: t0.body * f,
lh: +(t0.lh * sp).toFixed(3),
gap: t0.gap * sp,
sec: { ...t0.sec, size: t0.sec.size * f },
titleStyle: { ...t0.titleStyle, size: t0.titleStyle.size * f, mono: fontOverride ? false : t0.titleStyle.mono },
contact: { ...t0.contact, mono: fontOverride ? false : t0.contact.mono },
contactSize: (t0.contact.mono && !fontOverride ? 11.5 : 12.2) * f,
};
const { basics = {}, summary, experience = [], education = [], skills = [], projects = [], certs = [], custom = [], languages = [], activities = [], profdegrees = [], references = [], refsOnRequest } = data;
const pad = template === "minimal" ? 64 : template === "technical" ? 48 : 56;
const g = t.gap;
const contactItems = [
basics.location, basics.phone, basics.email, basics.website, basics.linkedin,
].filter(Boolean);
const linkColor = t.contact.accent ? accent : clr("ink", accent);
const wrapStyle = {
fontFamily: t.font,
fontSize: t.body,
lineHeight: t.lh,
color: "#15171f",
padding: `${pad}px ${pad}px ${pad + 8}px`,
minHeight: 1056,
};
const Bullets = ({ items }) => (
{(items || []).filter(Boolean).map((b, i) => (
- {b}
))}
);
const photo = basics.photo;
const avatarRadius = (template === "classic" || template === "executive") ? "50%" : "10px";
const Avatar = photo ? (
) : null;
const Header = () => {
const TextBlock = (
{t.nameSplit ? (() => { const parts = (basics.name || "Your Name").split(" "); const last = parts.length > 1 ? parts.pop() : ""; return (<>{parts.join(" ")}{last && {last}}>); })() : (basics.name || "Your Name")}
{basics.title && (
{basics.title}
)}
{!t.contact.bar && (
{contactItems.map((c, i) => {
const isLink = c === basics.email || c === basics.website || c === basics.linkedin;
return (
{c}
{i < contactItems.length - 1 && {t.contact.sep}}
);
})}
)}
);
if (t.align === "center") {
return (
{Avatar && {Avatar}
}
{TextBlock}
{t.headerRule && }
);
}
return (
);
};
const ExpItem = (x, i) => (
{x.role}
{x.start} – {x.end}
);
return (
{summary && (
{template === "executive" ? "Profile" : "Summary"}
{summary}
)}
{sectionOrder.map(key => {
if (key === "experience" && experience.length > 0) return (
Experience
{experience.map(ExpItem)}
);
if (key === "projects" && projects.length > 0) return (
Projects
{projects.map((p, i) => (
{p.name}
{p.tech &&
{p.tech}
}
{p.detail &&
{p.detail}
}
))}
);
if (key === "education" && education.length > 0) return (
Education
{education.map((e, i) => (
{e.school}
{e.start} – {e.end}
{e.detail &&
{e.detail}
}
))}
);
if (key === "skills" && skills.length > 0) return (
Skills
{skills.map((grp, i) => (
{grp.group && (
{grp.group}
)}
{(grp.items || []).join(" • ")}
))}
);
if (key === "certs" && certs.length > 0) return (
Certifications
{certs.map((c, i) => - {c}
)}
);
if (key === "languages" && languages.length > 0) return (
Languages
{languages.filter(l => l.lang).map((l, i) => (
{l.lang}{l.level ? ` - ${l.level}` : ""}
))}
);
if (key === "activities" && activities.length > 0) return (
Extracurricular Activities
{activities.map((a, i) => (
{a.title}{a.org ? ` - ${a.org}` : ""}
{a.dates && {a.dates}}
{a.detail &&
{a.detail}
}
))}
);
if (key === "profdegrees" && profdegrees.length > 0) return (
Professional Credentials
{profdegrees.filter(Boolean).map((c, i) => - {c}
)}
);
if (key === "references") return (
References
{refsOnRequest || !references.length ? (
Available upon request
) : (
{references.filter(r => r.name).map((r, i) => (
{r.name}
{r.title &&
{r.title}{r.company ? `, ${r.company}` : ""}
}
{r.email &&
{r.email}
}
{r.phone &&
{r.phone}
}
))}
)}
);
return null;
})}
{custom.filter(c => (c.heading && c.heading.trim()) || (c.body && c.body.replace(/<[^>]*>/g, "").trim())).map((c) => (
))}
);
}
Object.assign(window, { Resume, TEMPLATES, FONTS, RESUME_ACCENTS });