mirror of
https://github.com/AmruthPillai/Reactive-Resume.git
synced 2026-07-15 15:26:59 +10:00
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:
@@ -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} />
|
||||
|
||||
@@ -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)">
|
||||
|
||||
@@ -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 });
|
||||
|
||||
@@ -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) => {
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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) => {
|
||||
|
||||
@@ -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} />;
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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} />;
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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 (
|
||||
|
||||
@@ -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: "",
|
||||
},
|
||||
};
|
||||
|
||||
@@ -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: "",
|
||||
},
|
||||
};
|
||||
Reference in New Issue
Block a user