Update .env.example with clearer instructions for PRINTER_APP_URL, remove pdf-lib dependency from package.json, and adjust translations for alignment and zoom features across multiple locales. Improve template layout consistency in various components.

This commit is contained in:
Amruth Pillai
2026-01-24 10:43:12 +01:00
parent 4e73a81d4b
commit c875cc858d
79 changed files with 1399 additions and 1142 deletions
+1 -1
View File
@@ -8,7 +8,7 @@ type Props = z.infer<typeof levelDesignSchema> & React.ComponentProps<"div"> & {
export function LevelDisplay({ icon, type, level, className, ...props }: Props) {
if (level === 0) return null;
if (type === "hidden") return null;
if (type === "hidden" || icon === "") return null;
return (
<div
@@ -163,7 +163,7 @@ export function getSectionComponent(
return (
<section className={cn(`page-section page-section-custom page-section-${id}`, sectionClassName)}>
<h6 className="mb-1 text-(--page-primary-color)">{customSection.title}</h6>
<h6 className="mb-1.5 text-(--page-primary-color)">{customSection.title}</h6>
<div
className="section-content grid gap-x-(--page-gap-x) gap-y-(--page-gap-y)"
@@ -19,7 +19,7 @@ export function PageSection<T extends SectionType>({ type, className, children }
return (
<section className={cn(`page-section page-section-${type}`, className)}>
<h6 className="mb-2 text-(--page-primary-color)">{section.title || getSectionTitle(type)}</h6>
<h6 className="mb-1.5 text-(--page-primary-color)">{section.title || getSectionTitle(type)}</h6>
<div
className="section-content grid gap-x-(--page-gap-x) gap-y-(--page-gap-y)"
@@ -19,7 +19,7 @@ export function PageSummary({ className }: PageSummaryProps) {
className,
)}
>
<h6 className="mb-2 text-(--page-primary-color)">{section.title || getSectionTitle("summary")}</h6>
<h6 className="mb-1.5 text-(--page-primary-color)">{section.title || getSectionTitle("summary")}</h6>
<div className="section-content">
<TiptapContent style={{ columnCount: section.columns }} content={section.content} />
+1 -1
View File
@@ -61,7 +61,7 @@ export function AzurillTemplate({ pageIndex, pageLayout }: TemplateProps) {
const { main, sidebar, fullWidth } = pageLayout;
return (
<div className="template-azurill page-content space-y-(--page-gap-y) px-(--page-margin-x) py-(--page-margin-y) print:p-0">
<div className="template-azurill page-content space-y-(--page-gap-y) px-(--page-margin-x) pt-(--page-margin-y) print:p-0">
{isFirstPage && <Header />}
<div className="flex gap-x-(--page-gap-x)">
+1 -1
View File
@@ -23,7 +23,7 @@ export function BronzorTemplate({ pageIndex, pageLayout }: TemplateProps) {
const { main, sidebar, fullWidth } = pageLayout;
return (
<div className="template-bronzor page-content space-y-(--page-gap-y) px-(--page-margin-x) py-(--page-margin-y) print:p-0">
<div className="template-bronzor page-content space-y-(--page-gap-y) px-(--page-margin-x) pt-(--page-margin-y) print:p-0">
{isFirstPage && <Header />}
<div className="space-y-(--page-gap-y)">
@@ -46,7 +46,7 @@ export function ChikoritaTemplate({ pageIndex, pageLayout }: TemplateProps) {
<div className="flex">
<main
data-layout="main"
className="group page-main z-10 flex-1 space-y-4 px-(--page-margin-x) py-(--page-margin-y)"
className="group page-main z-10 flex-1 space-y-4 px-(--page-margin-x) pt-(--page-margin-y)"
>
{main.map((section) => {
const Component = getSectionComponent(section, { sectionClassName });
@@ -57,7 +57,7 @@ export function ChikoritaTemplate({ pageIndex, pageLayout }: TemplateProps) {
{!fullWidth && (
<aside
data-layout="sidebar"
className="group page-sidebar z-10 w-(--page-sidebar-width) shrink-0 space-y-4 overflow-x-hidden px-(--page-margin-x) py-(--page-margin-y) text-(--page-background-color)"
className="group page-sidebar z-10 w-(--page-sidebar-width) shrink-0 space-y-4 overflow-x-hidden px-(--page-margin-x) pt-(--page-margin-y) text-(--page-background-color)"
>
{sidebar.map((section) => {
const Component = getSectionComponent(section, { sectionClassName });
+2 -2
View File
@@ -44,7 +44,7 @@ export function DitgarTemplate({ pageIndex, pageLayout }: TemplateProps) {
<aside data-layout="sidebar" className="sidebar group z-10 flex w-(--page-sidebar-width) shrink-0 flex-col">
{isFirstPage && <Header />}
<div className="flex-1 space-y-4 px-(--page-margin-x) py-(--page-margin-y)">
<div className="flex-1 space-y-4 px-(--page-margin-x) pt-(--page-margin-y)">
{sidebar.map((section) => {
const Component = getSectionComponent(section, { sectionClassName });
return <Component key={section} id={section} />;
@@ -55,7 +55,7 @@ export function DitgarTemplate({ pageIndex, pageLayout }: TemplateProps) {
<main data-layout="main" className={cn("main group z-10", !fullWidth ? "col-span-2" : "col-span-3")}>
{isFirstPage && <SummaryComponent id="summary" />}
<div className="space-y-4 px-(--page-margin-x) py-(--page-margin-y)">
<div className="space-y-4 px-(--page-margin-x) pt-(--page-margin-y)">
{main
.filter((section) => section !== "summary")
.map((section) => {
+1 -1
View File
@@ -24,7 +24,7 @@ export function DittoTemplate({ pageIndex, pageLayout }: TemplateProps) {
<div className="template-ditto page-content">
{isFirstPage && <Header />}
<div className="flex py-(--page-margin-y)">
<div className="flex pt-(--page-margin-y)">
{!fullWidth && (
<aside
data-layout="sidebar"
+2 -2
View File
@@ -39,7 +39,7 @@ export function GengarTemplate({ pageIndex, pageLayout }: TemplateProps) {
{isFirstPage && <Header />}
{!fullWidth && (
<div className="shrink-0 space-y-4 overflow-x-hidden px-(--page-margin-x) pt-4 pb-(--page-margin-y)">
<div className="shrink-0 space-y-4 overflow-x-hidden px-(--page-margin-x) pt-(--page-margin-y)">
{sidebar
.filter((section) => section !== "summary")
.map((section) => {
@@ -61,7 +61,7 @@ export function GengarTemplate({ pageIndex, pageLayout }: TemplateProps) {
/>
)}
<div className="space-y-4 px-(--page-margin-x) pt-4 pb-(--page-margin-y)">
<div className="space-y-4 px-(--page-margin-x) pt-(--page-margin-y)">
{main
.filter((section) => section !== "summary")
.map((section) => {
+2 -2
View File
@@ -33,7 +33,7 @@ export function GlalieTemplate({ pageIndex, pageLayout }: TemplateProps) {
<div className="flex">
<aside
data-layout="sidebar"
className="group page-sidebar flex w-(--page-sidebar-width) shrink-0 flex-col space-y-4 px-(--page-margin-x) py-(--page-margin-y)"
className="group page-sidebar flex w-(--page-sidebar-width) shrink-0 flex-col space-y-4 px-(--page-margin-x) pt-(--page-margin-y)"
>
{isFirstPage && <Header />}
@@ -48,7 +48,7 @@ export function GlalieTemplate({ pageIndex, pageLayout }: TemplateProps) {
</aside>
<main data-layout="main" className="group page-main">
<div className="space-y-4 px-(--page-margin-x) py-(--page-margin-y)">
<div className="space-y-4 px-(--page-margin-x) pt-(--page-margin-y)">
{main.map((section) => {
const Component = getSectionComponent(section, { sectionClassName });
return <Component key={section} id={section} />;
+1 -1
View File
@@ -20,7 +20,7 @@ export function KakunaTemplate({ pageIndex, pageLayout }: TemplateProps) {
const { main, sidebar, fullWidth } = pageLayout;
return (
<div className="template-kakuna page-content space-y-4 px-(--page-margin-x) py-(--page-margin-y) print:p-0">
<div className="template-kakuna page-content space-y-4 px-(--page-margin-x) pt-(--page-margin-y) print:p-0">
{isFirstPage && <Header />}
<main data-layout="main" className="group page-main space-y-4">
+4 -4
View File
@@ -12,7 +12,7 @@ const sectionClassName = cn(
"rounded-(--container-border-radius) border border-(--page-text-color)/10 bg-(--page-background-color) p-4",
// Section Heading
"[&>h6]:-mt-(--heading-negative-margin) [&>h6]:max-w-fit [&>h6]:bg-(--page-background-color) [&>h6]:px-4 [&>h6]:pb-0.5",
"[&>h6]:-mt-(--heading-negative-margin) [&>h6]:max-w-fit [&>h6]:bg-(--page-background-color) [&>h6]:px-4",
);
/**
@@ -33,11 +33,11 @@ export function LaprasTemplate({ pageIndex, pageLayout }: TemplateProps) {
"--heading-negative-margin": `${headingNegativeMargin}pt`,
} as React.CSSProperties
}
className="template-lapras page-content space-y-7 px-(--page-margin-x) py-(--page-margin-y) print:p-0"
className="template-lapras page-content space-y-6 px-(--page-margin-x) pt-(--page-margin-y) print:p-0"
>
{isFirstPage && <Header />}
<main data-layout="main" className="group page-main space-y-7">
<main data-layout="main" className="group page-main space-y-6">
{main.map((section) => {
const Component = getSectionComponent(section, { sectionClassName });
return <Component key={section} id={section} />;
@@ -45,7 +45,7 @@ export function LaprasTemplate({ pageIndex, pageLayout }: TemplateProps) {
</main>
{!fullWidth && (
<aside data-layout="sidebar" className="group page-sidebar space-y-7">
<aside data-layout="sidebar" className="group page-sidebar space-y-6">
{sidebar.map((section) => {
const Component = getSectionComponent(section, { sectionClassName });
return <Component key={section} id={section} />;
+1 -1
View File
@@ -24,7 +24,7 @@ export function LeafishTemplate({ pageIndex, pageLayout }: TemplateProps) {
<div className="template-leafish page-content space-y-4">
{isFirstPage && <Header />}
<div className="flex gap-x-(--page-margin-x) px-(--page-margin-x) pb-(--page-margin-y)">
<div className="flex gap-x-(--page-margin-x) px-(--page-margin-x) pt-(--page-margin-y)">
<main data-layout="main" className="group page-main space-y-4">
{main
.filter((section) => section !== "summary")
+2 -2
View File
@@ -17,7 +17,7 @@ export function OnyxTemplate({ pageIndex, pageLayout }: TemplateProps) {
const { main, sidebar, fullWidth } = pageLayout;
return (
<div className="template-onyx page-content space-y-(--page-gap-y) px-(--page-margin-x) py-(--page-margin-y) print:p-0">
<div className="template-onyx page-content space-y-(--page-gap-y) px-(--page-margin-x) pt-(--page-margin-y) print:p-0">
{isFirstPage && <Header />}
<main data-layout="main" className="group page-main space-y-(--page-gap-y)">
@@ -43,7 +43,7 @@ function Header() {
const basics = useResumeStore((state) => state.resume.data.basics);
return (
<div className="page-header flex items-center gap-x-4 border-(--page-primary-color) border-b pb-(--page-gap-y)">
<div className="page-header flex items-center gap-x-4 border-(--page-primary-color) border-b pb-(--page-margin-y)">
<PagePicture />
<div className="page-basics space-y-2">
+26 -28
View File
@@ -24,39 +24,37 @@ export function PikachuTemplate({ pageIndex, pageLayout }: TemplateProps) {
const { main, sidebar, fullWidth } = pageLayout;
return (
<div className="template-pikachu page-content px-(--page-margin-x) py-(--page-margin-y) print:p-0">
<div className="flex gap-x-(--page-margin-x)">
<aside
data-layout="sidebar"
className="group page-sidebar flex w-(--page-sidebar-width) shrink-0 flex-col space-y-3"
>
{isFirstPage && (
<div className="flex items-center justify-center">
<PagePicture />
</div>
)}
<div className="template-pikachu page-content flex gap-x-(--page-margin-x) px-(--page-margin-x) pt-(--page-margin-y) print:p-0">
<aside
data-layout="sidebar"
className="group page-sidebar flex w-(--page-sidebar-width) shrink-0 flex-col space-y-(--page-gap-y)"
>
{isFirstPage && (
<div className="flex max-w-(--page-sidebar-width) items-center justify-start">
<PagePicture />
</div>
)}
{!fullWidth && (
<div className="shrink-0 space-y-4 overflow-x-hidden">
{sidebar.map((section) => {
const Component = getSectionComponent(section, { sectionClassName });
return <Component key={section} id={section} />;
})}
</div>
)}
</aside>
<main data-layout="main" className="group page-main flex-1 space-y-3">
{isFirstPage && <Header />}
<div className="space-y-4 pb-(--page-margin-y)">
{main.map((section) => {
{!fullWidth && (
<div className="shrink-0 space-y-(--page-gap-y) overflow-x-hidden">
{sidebar.map((section) => {
const Component = getSectionComponent(section, { sectionClassName });
return <Component key={section} id={section} />;
})}
</div>
</main>
</div>
)}
</aside>
<main data-layout="main" className="group page-main flex-1 space-y-(--page-margin-y)">
{isFirstPage && <Header />}
<div className="space-y-(--page-gap-y)">
{main.map((section) => {
const Component = getSectionComponent(section, { sectionClassName });
return <Component key={section} id={section} />;
})}
</div>
</main>
</div>
);
}
+1 -1
View File
@@ -20,7 +20,7 @@ export function RhyhornTemplate({ pageIndex, pageLayout }: TemplateProps) {
const { main, sidebar, fullWidth } = pageLayout;
return (
<div className="template-rhyhorn page-content space-y-4 px-(--page-margin-x) py-(--page-margin-y) print:p-0">
<div className="template-rhyhorn page-content space-y-4 px-(--page-margin-x) pt-(--page-margin-y) print:p-0">
{isFirstPage && <Header />}
<main data-layout="main" className="group page-main space-y-4">
+2 -1
View File
@@ -1,5 +1,6 @@
import z from "zod";
import { resumeDataSchema, sampleResumeData } from "@/schema/resume/data";
import { resumeDataSchema } from "@/schema/resume/data";
import { sampleResumeData } from "@/schema/resume/sample";
import { generateRandomName, slugify } from "@/utils/string";
import { protectedProcedure, publicProcedure, serverOnlyProcedure } from "../context";
import { resumeService } from "../services/resume";
+2 -2
View File
@@ -138,7 +138,7 @@ export const printerService = {
if (!Number.isNaN(heightValue)) {
// Subtract top + bottom margins from page height
const newHeight = `${heightValue - marginY * 2}px`;
const newHeight = `${heightValue - marginY}px`;
if (container) container.style.setProperty("--page-height", newHeight);
root.style.setProperty("--page-height", newHeight);
}
@@ -170,7 +170,7 @@ export const printerService = {
margin: {
top: marginY,
right: marginX,
bottom: marginY,
// bottom: marginY,
left: marginX,
},
});
@@ -36,9 +36,9 @@ export function BuilderDock() {
);
const publicUrl = useMemo(() => {
if (!session || !resume) return "";
if (!session?.user.username || !resume?.slug) return "";
return `${window.location.origin}/${session.user.username}/${resume.slug}`;
}, [session, resume]);
}, [session?.user.username, resume?.slug]);
const onCopyUrl = useCallback(async () => {
await copyToClipboard(publicUrl);
@@ -46,22 +46,27 @@ export function BuilderDock() {
}, [publicUrl, copyToClipboard]);
const onDownloadJSON = useCallback(async () => {
if (!resume) return;
const jsonString = JSON.stringify(resume, null, 2);
const blob = new Blob([jsonString], { type: "application/json" });
if (!resume?.data) return;
const filename = generateFilename(resume.data.basics.name, "json");
const jsonString = JSON.stringify(resume.data, null, 2);
const blob = new Blob([jsonString], { type: "application/json" });
downloadWithAnchor(blob, filename);
}, [resume]);
}, [resume?.data]);
const onDownloadPDF = useCallback(async () => {
if (!resume) return;
if (!resume?.id) return;
const filename = generateFilename(resume.data.basics.name, "pdf");
const { url } = await printResumeAsPDF({ id: resume.id });
downloadFromUrl(url, filename);
}, [resume, printResumeAsPDF]);
try {
const { url } = await printResumeAsPDF({ id: resume.id });
downloadFromUrl(url, filename);
} catch (error) {
toast.error(t`There was a problem while generating the PDF, please try again in some time.`);
console.error("[Error from printResumeAsPDF]:", error);
}
}, [resume?.id, resume?.data.basics.name, printResumeAsPDF]);
return (
<div className="fixed inset-x-0 bottom-4 flex items-center justify-center">
@@ -1,7 +1,9 @@
import { t } from "@lingui/core/macro";
import { Trans } from "@lingui/react/macro";
import { CircleNotchIcon, FileJsIcon, FilePdfIcon } from "@phosphor-icons/react";
import { useMutation } from "@tanstack/react-query";
import { useCallback } from "react";
import { toast } from "sonner";
import { useResumeStore } from "@/components/resume/store/resume";
import { Button } from "@/components/ui/button";
import { orpc } from "@/integrations/orpc/client";
@@ -17,7 +19,7 @@ export function ExportSectionBuilder() {
const onDownloadJSON = useCallback(() => {
const filename = generateFilename(resume.data.basics.name, "json");
const jsonString = JSON.stringify(resume, null, 2);
const jsonString = JSON.stringify(resume.data, null, 2);
const blob = new Blob([jsonString], { type: "application/json" });
downloadWithAnchor(blob, filename);
@@ -25,9 +27,14 @@ export function ExportSectionBuilder() {
const onDownloadPDF = useCallback(async () => {
const filename = generateFilename(resume.data.basics.name, "pdf");
const { url } = await printResumeAsPDF({ id: resume.id });
downloadFromUrl(url, filename);
try {
const { url } = await printResumeAsPDF({ id: resume.id });
downloadFromUrl(url, filename);
} catch (error) {
toast.error(t`There was a problem while generating the PDF, please try again in some time.`);
console.error("[Error from printResumeAsPDF]:", error);
}
}, [resume, printResumeAsPDF]);
return (
-520
View File
@@ -617,523 +617,3 @@ export const defaultResumeData: ResumeData = {
notes: "",
},
};
export const sampleResumeData: ResumeData = {
picture: {
hidden: false,
url: `https://i.imgur.com/o4Jpt1p.jpeg`,
size: 100,
rotation: 0,
aspectRatio: 1,
borderRadius: 0,
borderColor: "rgba(0, 0, 0, 0.5)",
borderWidth: 0,
shadowColor: "rgba(0, 0, 0, 0.5)",
shadowWidth: 0,
},
basics: {
name: "David Kowalski",
headline: "Game Developer | Unity & Unreal Engine Specialist",
email: "david.kowalski@email.com",
phone: "+1 (555) 291-4756",
location: "Seattle, WA",
website: {
url: "https://davidkowalski.games",
label: "davidkowalski.games",
},
customFields: [
{
id: "cf1",
icon: "github-logo",
text: "github.com/dkowalski-dev",
link: "https://github.com/dkowalski-dev",
},
{
id: "cf2",
icon: "game-controller",
text: "itch.io/dkowalski",
link: "https://itch.io/dkowalski",
},
],
},
summary: {
title: "Professional Summary",
columns: 1,
hidden: false,
content:
"<p>Passionate game developer with 5+ years of professional experience creating engaging gameplay systems and polished player experiences across multiple platforms. Specialized in Unity and Unreal Engine with strong expertise in C#, C++, and game design principles. Proven ability to collaborate effectively with cross-functional teams including designers, artists, and QA to deliver high-quality games on time and within scope. Deep understanding of game mechanics, AI systems, physics, and performance optimization for PC, console, and mobile platforms.</p>",
},
sections: {
profiles: {
title: "Online Presence",
columns: 3,
hidden: false,
items: [
{
id: "profile1",
hidden: false,
icon: "github-logo",
network: "GitHub",
username: "dkowalski-dev",
website: {
url: "https://github.com/dkowalski-dev",
label: "github.com/dkowalski-dev",
},
},
{
id: "profile2",
hidden: false,
icon: "linkedin-logo",
network: "LinkedIn",
username: "davidkowalski",
website: {
url: "https://linkedin.com/in/davidkowalski",
label: "linkedin.com/in/davidkowalski",
},
},
{
id: "profile3",
hidden: false,
icon: "game-controller",
network: "itch.io",
username: "dkowalski",
website: {
url: "https://itch.io/dkowalski",
label: "itch.io/dkowalski",
},
},
],
},
experience: {
title: "Professional Experience",
columns: 1,
hidden: false,
items: [
{
id: "exp1",
hidden: false,
company: "Cascade Studios",
position: "Senior Game Developer",
location: "Seattle, WA",
period: "March 2022 - Present",
website: {
url: "",
label: "",
},
description:
"<ul><li>Lead gameplay programmer on an unannounced AAA action-adventure title built in Unreal Engine 5 for PC and next-gen consoles</li><li>Architected and implemented core combat system including hit detection, combo mechanics, and enemy AI behavior trees serving 15+ enemy types</li><li>Developed custom editor tools in C++ that reduced level designer iteration time by 40% and improved workflow efficiency across the team</li><li>Optimized rendering pipeline and gameplay systems to maintain 60 FPS performance target on all supported platforms, achieving 95% frame rate stability</li><li>Mentor two junior developers on programming best practices, code architecture, and game engine fundamentals</li><li>Collaborate with design team to prototype and iterate on new gameplay mechanics, balancing player agency with technical feasibility</li><li>Participate in code reviews and maintain high code quality standards across 200K+ lines of C++ codebase</li></ul>",
},
{
id: "exp2",
hidden: false,
company: "Pixel Forge Interactive",
position: "Game Developer",
location: "Bellevue, WA",
period: "June 2020 - February 2022",
website: {
url: "",
label: "",
},
description:
"<ul><li>Core developer on 'Starbound Odyssey,' a sci-fi roguelike that achieved 500K+ sales on Steam with 'Very Positive' user reviews</li><li>Implemented procedural generation systems for level layouts, enemy encounters, and loot drops using Unity and C#</li><li>Designed and programmed player progression systems including skill trees, equipment upgrades, and meta-progression mechanics</li><li>Created robust save/load system supporting cloud saves and cross-platform play between PC and Nintendo Switch</li><li>Integrated third-party SDKs for analytics (GameAnalytics), achievements (Steamworks), and multiplayer networking (Photon)</li><li>Fixed critical bugs and balanced gameplay based on community feedback and telemetry data, releasing 12 post-launch content updates</li><li>Worked closely with artists to implement VFX, animations, and shaders that enhanced visual polish while maintaining performance targets</li></ul>",
},
{
id: "exp3",
hidden: false,
company: "Mobile Games Studio",
position: "Junior Game Developer",
location: "Remote",
period: "September 2018 - May 2020",
website: {
url: "",
label: "",
},
description:
"<ul><li>Contributed to development of three mobile puzzle games built in Unity, collectively downloaded 2M+ times on iOS and Android</li><li>Implemented UI systems, touch controls, and gesture recognition optimized for mobile devices and various screen sizes</li><li>Developed monetization features including rewarded video ads, in-app purchases, and daily reward systems that increased retention by 25%</li><li>Optimized memory usage and load times for mobile platforms, reducing app size by 35% through asset compression and code optimization</li><li>Collaborated with game designers to balance puzzle difficulty curves and progression pacing using A/B testing data</li><li>Maintained live operations for released games, pushing regular content updates and seasonal events to sustain player engagement</li></ul>",
},
],
},
education: {
title: "Education",
columns: 1,
hidden: false,
items: [
{
id: "edu1",
hidden: false,
school: "University of Washington",
degree: "Bachelor of Science",
area: "Computer Science",
grade: "3.6 GPA",
location: "Seattle, WA",
period: "2014 - 2018",
website: {
url: "",
label: "",
},
description:
"<p>Concentration in Game Development. Relevant Coursework: Game Engine Architecture, Computer Graphics, Artificial Intelligence, Physics Simulation, 3D Mathematics, Software Engineering, Data Structures & Algorithms</p>",
},
],
},
projects: {
title: "Notable Projects",
columns: 1,
hidden: false,
items: [
{
id: "proj1",
hidden: false,
name: "Echoes of the Void (Indie Game)",
period: "2023 - Present",
website: {
url: "https://itch.io/echoes-of-the-void",
label: "View on itch.io",
},
description:
"<p>Solo developer for a narrative-driven 2D platformer built in Unity. Features custom dialogue system, branching story paths, and atmospheric pixel art. Currently in development with demo released on itch.io garnering 5K+ downloads and positive community feedback. Planned Steam release Q2 2025.</p>",
},
{
id: "proj2",
hidden: false,
name: "Open Source: Unity Dialogue Framework",
period: "2021 - 2023",
website: {
url: "https://github.com/dkowalski-dev/unity-dialogue",
label: "View on GitHub",
},
description:
"<p>Created and maintain an open-source dialogue system for Unity with visual node-based editor, localization support, and voice acting integration. Project has 800+ GitHub stars and is actively used by indie developers worldwide. Includes comprehensive documentation and example projects.</p>",
},
{
id: "proj3",
hidden: false,
name: "Game Jam Participation",
period: "2019 - Present",
website: {
url: "",
label: "",
},
description:
"<p>Regular participant in Ludum Dare and Global Game Jam events. Created 12+ game prototypes exploring experimental mechanics and art styles. Won 'Best Gameplay' award at Ludum Dare 48 with puzzle game 'Deeper and Deeper' that ranked in top 5% overall.</p>",
},
],
},
skills: {
title: "Technical Skills",
columns: 1,
hidden: false,
items: [
{
id: "skill1",
hidden: false,
icon: "code",
name: "Unity Engine",
proficiency: "Expert",
level: 5,
keywords: ["C#", "Editor Tools", "Performance Profiling"],
},
{
id: "skill2",
hidden: false,
icon: "brackets-curly",
name: "Unreal Engine",
proficiency: "Advanced",
level: 4,
keywords: ["C++", "Blueprints", "UE5 Features"],
},
{
id: "skill3",
hidden: false,
icon: "cpu",
name: "Programming Languages",
proficiency: "Expert",
level: 5,
keywords: ["C#", "C++", "Python", "HLSL/GLSL"],
},
{
id: "skill4",
hidden: false,
icon: "brain",
name: "Game AI",
proficiency: "Advanced",
level: 4,
keywords: ["Behavior Trees", "FSM", "Pathfinding", "Navigation"],
},
{
id: "skill5",
hidden: false,
icon: "shooting-star",
name: "Physics & Mathematics",
proficiency: "Advanced",
level: 4,
keywords: ["3D Math", "Collision Detection", "Rigid Body Dynamics"],
},
{
id: "skill6",
hidden: false,
icon: "chart-line-up",
name: "Performance Optimization",
proficiency: "Advanced",
level: 4,
keywords: ["Profiling", "Memory Management", "Frame Rate"],
},
],
},
languages: {
title: "Languages",
columns: 2,
hidden: false,
items: [
{
id: "lang1",
hidden: false,
language: "English",
fluency: "Native",
level: 5,
},
{
id: "lang2",
hidden: false,
language: "Polish",
fluency: "Conversational",
level: 3,
},
],
},
interests: {
title: "Interests",
columns: 1,
hidden: false,
items: [
{
id: "int1",
hidden: false,
icon: "game-controller",
name: "Game Design",
keywords: ["Mechanics", "Level Design", "Player Psychology"],
},
{
id: "int2",
hidden: false,
icon: "robot",
name: "AI & Procedural Generation",
keywords: ["PCG", "Machine Learning", "Emergent Gameplay"],
},
{
id: "int3",
hidden: false,
icon: "book-open",
name: "Indie Game Development",
keywords: ["Solo Dev", "Game Jams", "Community"],
},
{
id: "int4",
hidden: false,
icon: "pen-nib",
name: "Technical Art",
keywords: ["Shaders", "VFX", "Optimization"],
},
],
},
awards: {
title: "Awards & Recognition",
columns: 1,
hidden: false,
items: [
{
id: "award1",
hidden: false,
title: "Best Gameplay - Ludum Dare 48",
awarder: "Ludum Dare",
date: "April 2021",
website: {
url: "",
label: "",
},
description:
"<p>Awarded for puzzle game 'Deeper and Deeper' which ranked in the top 5% overall among 3,000+ submissions</p>",
},
{
id: "award2",
hidden: false,
title: "Employee Excellence Award",
awarder: "Pixel Forge Interactive",
date: "December 2021",
website: {
url: "",
label: "",
},
description:
"<p>Recognized for exceptional contributions to 'Starbound Odyssey' development and dedication to code quality</p>",
},
],
},
certifications: {
title: "Certifications",
columns: 1,
hidden: false,
items: [
{
id: "cert1",
hidden: false,
title: "Unity Certified Expert: Programmer",
issuer: "Unity Technologies",
date: "March 2022",
website: {
url: "",
label: "",
},
description: "",
},
{
id: "cert2",
hidden: false,
title: "Unreal Engine 5 C++ Developer",
issuer: "Epic Games (Udemy)",
date: "June 2023",
website: {
url: "",
label: "",
},
description: "",
},
],
},
publications: {
title: "Publications & Talks",
columns: 1,
hidden: false,
items: [
{
id: "pub1",
hidden: false,
title: "Optimizing Unity Games for Mobile: A Practical Guide",
publisher: "Game Developer Magazine",
date: "September 2021",
website: {
url: "",
label: "",
},
description:
"<p>Technical article covering mobile optimization techniques including draw call batching, LOD systems, and memory management</p>",
},
{
id: "pub2",
hidden: false,
title: "Building Modular Dialogue Systems",
publisher: "Seattle Indie Game Developers Meetup",
date: "May 2022",
website: {
url: "",
label: "",
},
description:
"<p>Presented talk on designing flexible dialogue systems for narrative games, attended by 60+ local developers</p>",
},
],
},
volunteer: {
title: "Community Involvement",
columns: 1,
hidden: false,
items: [
{
id: "vol1",
hidden: false,
organization: "Seattle Indies",
location: "Seattle, WA",
period: "2020 - Present",
website: {
url: "",
label: "",
},
description:
"<p>Active member of local indie game development community. Organize monthly game showcases and provide mentorship to aspiring game developers through code reviews and technical guidance.</p>",
},
{
id: "vol2",
hidden: false,
organization: "Code.org Game Development Workshops",
location: "Seattle, WA",
period: "2021 - Present",
website: {
url: "",
label: "",
},
description:
"<p>Volunteer instructor teaching basic game programming concepts to middle school students. Led 8+ workshops introducing Unity fundamentals and game design principles.</p>",
},
],
},
references: {
title: "References",
columns: 1,
hidden: false,
items: [
{
id: "ref1",
hidden: false,
name: "Available upon request",
position: "",
website: { url: "", label: "" },
phone: "",
description: "",
},
],
},
},
customSections: [],
metadata: {
template: "onyx",
layout: {
sidebarWidth: 35,
pages: [
{
fullWidth: false,
main: ["profiles", "summary", "education", "experience", "projects", "volunteer", "references"],
sidebar: ["skills", "certifications", "awards", "languages", "interests", "publications"],
},
],
},
css: {
enabled: false,
value: "",
},
page: {
gapX: 4,
gapY: 6,
marginX: 18,
marginY: 16,
format: "a4",
locale: "en-US",
hideIcons: false,
},
design: {
level: {
icon: "star",
type: "circle",
},
colors: {
primary: "rgba(239, 68, 68, 1)",
text: "rgba(0, 0, 0, 1)",
background: "rgba(255, 255, 255, 1)",
},
},
typography: {
body: {
fontFamily: "IBM Plex Serif",
fontWeights: ["400", "600"],
fontSize: 11,
lineHeight: 1.5,
},
heading: {
fontFamily: "Oswald",
fontWeights: ["600"],
fontSize: 15,
lineHeight: 1.5,
},
},
notes: "",
},
};
+533
View File
@@ -0,0 +1,533 @@
import type { ResumeData } from "./data";
export const sampleResumeData: ResumeData = {
picture: {
hidden: false,
url: "https://i.imgur.com/o4Jpt1p.jpeg",
size: 100,
rotation: 0,
aspectRatio: 1,
borderRadius: 0,
borderColor: "rgba(0, 0, 0, 0.5)",
borderWidth: 0,
shadowColor: "rgba(0, 0, 0, 0.5)",
shadowWidth: 0,
},
basics: {
name: "David Kowalski",
headline: "Game Developer | Unity & Unreal Engine Specialist",
email: "david.kowalski@email.com",
phone: "+1 (555) 291-4756",
location: "Seattle, WA",
website: {
url: "https://davidkowalski.games",
label: "davidkowalski.games",
},
customFields: [
{
id: "019bef5a-0477-77e0-968b-5d0e2ecb34e3",
icon: "github-logo",
text: "github.com/dkowalski-dev",
link: "https://github.com/dkowalski-dev",
},
{
id: "019bef5a-93e4-7746-ad39-3a132360f823",
icon: "game-controller",
text: "itch.io/dkowalski",
link: "https://itch.io/dkowalski",
},
],
},
summary: {
title: "",
columns: 1,
hidden: false,
content:
"<p>Passionate game developer with 5+ years of professional experience creating engaging gameplay systems and polished player experiences across multiple platforms. Specialized in Unity and Unreal Engine with strong expertise in C#, C++, and game design principles. Proven ability to collaborate effectively with cross-functional teams including designers, artists, and QA to deliver high-quality games on time and within scope. Est anim est quis nostrud ipsum deserunt do anim Lorem mollit nostrud minim. Est anim est quis nostrud ipsum.</p>",
},
sections: {
profiles: {
title: "",
columns: 1,
hidden: false,
items: [
{
id: "019bef5a-93e4-7746-ad39-3d42ddc9b4d8",
hidden: false,
icon: "github-logo",
network: "GitHub",
username: "dkowalski-dev",
website: {
url: "https://github.com/dkowalski-dev",
label: "github.com/dkowalski-dev",
},
},
{
id: "019bef5a-93e4-7746-ad39-43c470b77f4a",
hidden: false,
icon: "linkedin-logo",
network: "LinkedIn",
username: "davidkowalski",
website: {
url: "https://linkedin.com/in/davidkowalski",
label: "linkedin.com/in/davidkowalski",
},
},
],
},
experience: {
title: "",
columns: 1,
hidden: false,
items: [
{
id: "019bef5a-93e4-7746-ad39-44d8cec98ca4",
hidden: false,
company: "Cascade Studios",
position: "Senior Game Developer",
location: "Seattle, WA",
period: "March 2022 - Present",
website: {
url: "",
label: "",
},
description:
"<ul><li><p>Lead gameplay programmer on an unannounced AAA action-adventure title built in Unreal Engine 5 for PC and next-gen consoles</p></li><li><p>Architected and implemented core combat system including hit detection, combo mechanics, and enemy AI behavior trees serving 15+ enemy types</p></li><li><p>Developed custom editor tools in C++ that reduced level designer iteration time by 40% and improved workflow efficiency across the team</p></li><li><p>Optimized rendering pipeline and gameplay systems to maintain 60 FPS performance target on all supported platforms, achieving 95% frame rate stability</p></li><li><p>Ad nostrud enim adipisicing ea proident aliqua veniam nisi amet ea irure et mollit.</p></li></ul><p></p>",
},
],
},
education: {
title: "",
columns: 1,
hidden: false,
items: [
{
id: "019bef5a-93e4-7746-ad39-48455f6cef9e",
hidden: false,
school: "University of Washington",
degree: "Bachelor of Science",
area: "Computer Science",
grade: "3.6 GPA",
location: "Seattle, WA",
period: "2014 - 2018",
website: {
url: "",
label: "",
},
description:
"<p>Concentration in Game Development. Relevant Coursework: Game Engine Architecture, Computer Graphics, Artificial Intelligence, Physics Simulation, 3D Mathematics, Software Engineering, Data Structures & Algorithms</p>",
},
],
},
projects: {
title: "",
columns: 1,
hidden: false,
items: [
{
id: "019bef5a-93e4-7746-ad39-4d2603fe2801",
hidden: false,
name: "Echoes of the Void (Indie Game)",
period: "2023 - Present",
website: {
url: "https://itch.io/echoes-of-the-void",
label: "View on itch.io",
},
description:
"<p>Solo developer for a narrative-driven 2D platformer built in Unity. Features custom dialogue system, branching story paths, and atmospheric pixel art. Currently in development with demo released on itch.io garnering 5K+ downloads and positive community feedback. Planned Steam release Q2 2025.</p>",
},
{
id: "019bef5a-93e4-7746-ad39-524195dd7eff",
hidden: false,
name: "Open Source: Unity Dialogue Framework",
period: "2021 - 2023",
website: {
url: "https://github.com/dkowalski-dev/unity-dialogue",
label: "View on GitHub",
},
description:
"<p>Created and maintain an open-source dialogue system for Unity with visual node-based editor, localization support, and voice acting integration. Project has 800+ GitHub stars and is actively used by indie developers worldwide. Includes comprehensive documentation and example projects.</p>",
},
{
id: "019bef5a-93e4-7746-ad39-549106273c73",
hidden: false,
name: "Game Jam Participation",
period: "2019 - Present",
website: {
url: "",
label: "",
},
description:
"<p>Regular participant in Ludum Dare and Global Game Jam events. Created 12+ game prototypes exploring experimental mechanics and art styles. Won 'Best Gameplay' award at Ludum Dare 48 with puzzle game 'Deeper and Deeper' that ranked in top 5% overall.</p>",
},
],
},
skills: {
title: "",
columns: 1,
hidden: false,
items: [
{
id: "019bef5a-93e4-7746-ad39-5a52dcf50ed4",
hidden: false,
icon: "code",
name: "Unity Engine",
proficiency: "Expert",
level: 5,
keywords: ["C#", "Editor Tools", "Performance Profiling"],
},
{
id: "019bef5a-93e4-7746-ad39-5e8bb7cacbc8",
hidden: false,
icon: "brackets-curly",
name: "Unreal Engine",
proficiency: "Advanced",
level: 4,
keywords: ["C++", "Blueprints", "UE5 Features"],
},
{
id: "019bef5a-93e4-7746-ad39-622f9d41da55",
hidden: false,
icon: "cpu",
name: "Programming Languages",
proficiency: "Expert",
level: 5,
keywords: ["C#", "C++", "Python", "HLSL/GLSL"],
},
{
id: "019bef5a-93e4-7746-ad39-6574ab6814bd",
hidden: false,
icon: "brain",
name: "Game AI",
proficiency: "Advanced",
level: 4,
keywords: ["Behavior Trees", "FSM", "Pathfinding", "Navigation"],
},
{
id: "019bef5a-93e4-7746-ad39-6a8e22bec684",
hidden: false,
icon: "shooting-star",
name: "Physics & Mathematics",
proficiency: "Advanced",
level: 4,
keywords: ["3D Math", "Collision Detection", "Rigid Body Dynamics"],
},
{
id: "019bef5a-93e4-7746-ad39-6d8bf7be7514",
hidden: true,
icon: "chart-line-up",
name: "Performance Optimization",
proficiency: "Advanced",
level: 4,
keywords: ["Profiling", "Memory Management", "Frame Rate"],
},
],
},
languages: {
title: "",
columns: 1,
hidden: false,
items: [
{
id: "019bef5a-93e4-7746-ad39-73807ccc48b5",
hidden: false,
language: "English",
fluency: "Native",
level: 5,
},
{
id: "019bef5a-93e4-7746-ad39-768670459358",
hidden: false,
language: "Polish",
fluency: "Conversational",
level: 3,
},
],
},
interests: {
title: "",
columns: 1,
hidden: false,
items: [
{
id: "019bef5a-93e4-7746-ad39-7821b4de95f7",
hidden: false,
icon: "game-controller",
name: "Game Design",
keywords: ["Mechanics", "Level Design", "Player Psychology"],
},
{
id: "019bef5a-93e4-7746-ad39-7c64c1a607d3",
hidden: false,
icon: "robot",
name: "AI & Procedural Generation",
keywords: ["PCG", "Machine Learning", "Emergent Gameplay"],
},
{
id: "019bef5a-93e4-7746-ad39-80bccce3c0ef",
hidden: false,
icon: "book-open",
name: "Indie Game Development",
keywords: ["Solo Dev", "Game Jams", "Community"],
},
{
id: "019bef5a-93e4-7746-ad39-84bb7e9af005",
hidden: false,
icon: "pen-nib",
name: "Technical Art",
keywords: ["Shaders", "VFX", "Optimization"],
},
],
},
awards: {
title: "",
columns: 1,
hidden: false,
items: [
{
id: "019bef5a-93e4-7746-ad39-8a8bb9fbe182",
hidden: false,
title: "Best Gameplay - Ludum Dare 48",
awarder: "Ludum Dare",
date: "April 2021",
website: {
url: "",
label: "",
},
description:
"<p>Awarded for puzzle game 'Deeper and Deeper' which ranked in the top 5% overall among 3,000+ submissions</p>",
},
{
id: "019bef5a-93e4-7746-ad39-8dd81379c7c9",
hidden: false,
title: "Employee Excellence Award",
awarder: "Pixel Forge Interactive",
date: "December 2021",
website: {
url: "",
label: "",
},
description:
"<p>Recognized for exceptional contributions to 'Starbound Odyssey' development and dedication to code quality</p>",
},
],
},
certifications: {
title: "",
columns: 1,
hidden: false,
items: [
{
id: "019bef5a-93e4-7746-ad39-91fe8a4dfea6",
hidden: false,
title: "Unity Certified Expert: Programmer",
issuer: "Unity Technologies",
date: "March 2022",
website: {
url: "",
label: "",
},
description: "",
},
{
id: "019bef5a-93e4-7746-ad39-961afccc2508",
hidden: false,
title: "Unreal Engine 5 C++ Developer",
issuer: "Epic Games (Udemy)",
date: "June 2023",
website: {
url: "",
label: "",
},
description: "",
},
],
},
publications: {
title: "",
columns: 1,
hidden: false,
items: [
{
id: "019bef5a-93e4-7746-ad39-9816f0081895",
hidden: false,
title: "Optimizing Unity Games for Mobile: A Practical Guide",
publisher: "Game Developer Magazine",
date: "September 2021",
website: {
url: "",
label: "",
},
description:
"<p>Technical article covering mobile optimization techniques including draw call batching, LOD systems, and memory management</p>",
},
{
id: "019bef5a-93e4-7746-ad39-9cf55c272c05",
hidden: false,
title: "Building Modular Dialogue Systems",
publisher: "Seattle Indie Game Developers Meetup",
date: "May 2022",
website: {
url: "",
label: "",
},
description:
"<p>Presented talk on designing flexible dialogue systems for narrative games, attended by 60+ local developers</p>",
},
],
},
volunteer: {
title: "",
columns: 1,
hidden: false,
items: [
{
id: "019bef5a-93e4-7746-ad39-a02580473e05",
hidden: false,
organization: "Seattle Indies",
location: "Seattle, WA",
period: "2020 - Present",
website: {
url: "",
label: "",
},
description:
"<p>Active member of local indie game development community. Organize monthly game showcases and provide mentorship to aspiring game developers through code reviews and technical guidance.</p>",
},
{
id: "019bef5a-93e4-7746-ad39-a731c5b1b286",
hidden: false,
organization: "Code.org Game Development Workshops",
location: "Seattle, WA",
period: "2021 - Present",
website: {
url: "",
label: "",
},
description:
"<p>Volunteer instructor teaching basic game programming concepts to middle school students. Led 8+ workshops introducing Unity fundamentals and game design principles.</p>",
},
],
},
references: {
title: "",
columns: 1,
hidden: false,
items: [
{
id: "019bef5a-93e4-7746-ad39-a945c0f42dd5",
hidden: false,
name: "Available upon request",
position: "",
website: {
url: "",
label: "",
},
phone: "",
description: "",
},
],
},
},
customSections: [
{
title: "Experience",
columns: 1,
hidden: false,
id: "019becaf-0b87-769d-98a6-46ccf558c0e8",
type: "experience",
items: [
{
id: "019bef5a-d1fa-7289-a87c-2677688d9e75",
hidden: false,
company: "Pixel Forge Interactive",
position: "Game Developer",
location: "Bellevue, WA",
period: "June 2020 - February 2022",
website: {
url: "",
label: "",
},
description:
"<ul><li>Core developer on 'Starbound Odyssey,' a sci-fi roguelike that achieved 500K+ sales on Steam with 'Very Positive' user reviews</li><li>Implemented procedural generation systems for level layouts, enemy encounters, and loot drops using Unity and C#</li><li>Designed and programmed player progression systems including skill trees, equipment upgrades, and meta-progression mechanics</li><li>Created robust save/load system supporting cloud saves and cross-platform play between PC and Nintendo Switch</li><li>Integrated third-party SDKs for analytics (GameAnalytics), achievements (Steamworks), and multiplayer networking (Photon)</li><li>Fixed critical bugs and balanced gameplay based on community feedback and telemetry data, releasing 12 post-launch content updates</li><li>Worked closely with artists to implement VFX, animations, and shaders that enhanced visual polish while maintaining performance targets</li></ul>",
},
{
id: "019bef5a-db0e-73c6-9b6e-4471703864f1",
hidden: false,
company: "Mobile Games Studio",
position: "Junior Game Developer",
location: "Remote",
period: "September 2018 - May 2020",
website: {
url: "",
label: "",
},
description:
"<ul><li><p>Contributed to development of three mobile puzzle games built in Unity, collectively downloaded 2M+ times on iOS and Android</p></li><li><p>Implemented UI systems, touch controls, and gesture recognition optimized for mobile devices and various screen sizes</p></li><li><p>Developed monetization features including rewarded video ads, in-app purchases, and daily reward systems that increased retention by 25%</p></li><li><p>Optimized memory usage and load times for mobile platforms, reducing app size by 35% through asset compression and code optimization</p></li><li><p>Collaborated with game designers to balance puzzle difficulty curves and progression pacing using A/B testing data</p></li></ul><p></p>",
},
],
},
],
metadata: {
template: "azurill",
layout: {
sidebarWidth: 30,
pages: [
{
fullWidth: false,
main: ["summary", "education", "experience"],
sidebar: ["profiles", "skills"],
},
{
fullWidth: false,
main: ["019becaf-0b87-769d-98a6-46ccf558c0e8", "awards"],
sidebar: ["languages", "certifications", "interests", "references"],
},
{
fullWidth: true,
main: ["projects", "publications", "volunteer"],
sidebar: [],
},
],
},
css: {
enabled: false,
value: "",
},
page: {
gapX: 4,
gapY: 8,
marginX: 16,
marginY: 14,
format: "a4",
locale: "en-US",
hideIcons: false,
},
design: {
level: {
icon: "acorn",
type: "circle",
},
colors: {
primary: "rgba(0, 132, 209, 1)",
text: "rgba(0, 0, 0, 1)",
background: "rgba(255, 255, 255, 1)",
},
},
typography: {
body: {
fontFamily: "IBM Plex Serif",
fontWeights: ["400", "600"],
fontSize: 11,
lineHeight: 1.5,
},
heading: {
fontFamily: "Fira Sans Condensed",
fontWeights: ["500"],
fontSize: 18,
lineHeight: 1.5,
},
},
notes: "",
},
};