Compare commits

..

1 Commits

Author SHA1 Message Date
Joakim Repomaa
c8044259cc cleanup
All checks were successful
Build and Deploy / build (push) Successful in 1m45s
2026-02-19 22:03:32 +02:00
18 changed files with 36 additions and 61 deletions

View File

@@ -35,7 +35,7 @@ body {
/* Web layout - 5 colors using light-dark() for dark mode */ /* Web layout - 5 colors using light-dark() for dark mode */
--color-bg: light-dark(#fafafa, #0c0c0e); --color-bg: light-dark(#fafafa, #0c0c0e);
--color-fg: light-dark(#18181b, #fafafa); --color-fg: light-dark(#18181b, #fafafa);
--color-muted: light-dark(#56565d, #a1a1aa); --color-muted: light-dark(#71717a, #a1a1aa);
--color-accent: light-dark(#0e7490, #22d3ee); --color-accent: light-dark(#0e7490, #22d3ee);
--color-hot: light-dark(#c2410c, #fb923c); --color-hot: light-dark(#c2410c, #fb923c);

View File

@@ -2,12 +2,9 @@
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<link rel="icon" type="image/png" sizes="32x32" href="%sveltekit.assets%/favicon-32x32.png" /> <link rel="icon" href="%sveltekit.assets%/favicon.png" />
<link rel="icon" type="image/png" sizes="16x16" href="%sveltekit.assets%/favicon-16x16.png" />
<link rel="apple-touch-icon" sizes="180x180" href="%sveltekit.assets%/apple-touch-icon.png" />
<link rel="icon" type="image/png" sizes="192x192" href="%sveltekit.assets%/icon-192x192.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="description" content="Developer Portfolio" /> <meta name="description" content="Professional CV - Developer Portfolio" />
<meta name="theme-color" content="#0891b2" media="(prefers-color-scheme: light)" /> <meta name="theme-color" content="#0891b2" media="(prefers-color-scheme: light)" />
<meta name="theme-color" content="#22d3ee" media="(prefers-color-scheme: dark)" /> <meta name="theme-color" content="#22d3ee" media="(prefers-color-scheme: dark)" />
%sveltekit.head% %sveltekit.head%

View File

@@ -1,9 +0,0 @@
<script lang="ts">
interface Props {
label: string;
}
let { label }: Props = $props();
</script>
<span class="text-accent before:content-['['] after:content-[']']">{label}</span>

View File

@@ -3,11 +3,7 @@
import Section from './Section.svelte'; import Section from './Section.svelte';
import TimelineItem from './TimelineItem.svelte'; import TimelineItem from './TimelineItem.svelte';
interface Props { let { education }: { education: Education[] } = $props();
education: Education[];
}
let { education }: Props = $props();
</script> </script>
<Section title="Education"> <Section title="Education">

View File

@@ -3,11 +3,7 @@
import Section from './Section.svelte'; import Section from './Section.svelte';
import TimelineItem from './TimelineItem.svelte'; import TimelineItem from './TimelineItem.svelte';
interface Props { let { experience }: { experience: Experience[] } = $props();
experience: Experience[];
}
let { experience }: Props = $props();
</script> </script>
<Section title="Experience"> <Section title="Experience">

View File

@@ -8,14 +8,14 @@
href="https://svelte.dev" href="https://svelte.dev"
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
class="text-accent hover:text-accent/80 transition-colors">SvelteKit</a class="text-accent hover:text-accent transition-colors">SvelteKit</a
> >
+ +
<a <a
href="https://sveltiacms.app/" href="https://sveltiacms.app/"
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
class="text-accent hover:text-accent/80 transition-colors">Sveltia CMS</a class="text-accent hover:text-accent transition-colors">Sveltia CMS</a
> >
</p> </p>
<p class="mt-2"> <p class="mt-2">

View File

@@ -1,13 +1,8 @@
<script lang="ts"> <script lang="ts">
import type { Profile } from '$lib/types.js'; import type { Profile } from '$lib/types.js';
import BracketLabel from './BracketLabel.svelte';
import EncodedEmail from './EncodedEmail.svelte'; import EncodedEmail from './EncodedEmail.svelte';
interface Props { let { profile }: { profile: Profile } = $props();
profile: Profile;
}
let { profile }: Props = $props();
</script> </script>
<header class="border-b-2 border-fg/10 pb-8 mb-8"> <header class="border-b-2 border-fg/10 pb-8 mb-8">
@@ -33,12 +28,12 @@
<div class="flex flex-col gap-2 text-sm"> <div class="flex flex-col gap-2 text-sm">
<div class="flex items-center gap-2 text-muted hover:text-accent transition-colors"> <div class="flex items-center gap-2 text-muted hover:text-accent transition-colors">
<BracketLabel label="E" /> <span class="text-accent">[E]</span>
<EncodedEmail email={profile.email} class="hover:text-accent transition-colors" /> <EncodedEmail email={profile.email} class="hover:text-accent transition-colors" />
</div> </div>
<div class="flex items-center gap-2 text-muted"> <div class="flex items-center gap-2 text-muted">
<BracketLabel label="L" /> <span class="text-accent">[L]</span>
{profile.location} {profile.location}
</div> </div>
@@ -48,7 +43,7 @@
rel="noopener noreferrer" rel="noopener noreferrer"
class="flex items-center gap-2 text-muted hover:text-accent transition-colors" class="flex items-center gap-2 text-muted hover:text-accent transition-colors"
> >
<BracketLabel label="G" /> <span class="text-accent">[G]</span>
github.com/{profile.github} github.com/{profile.github}
</a> </a>
@@ -59,7 +54,7 @@
rel="noopener noreferrer" rel="noopener noreferrer"
class="flex items-center gap-2 text-muted hover:text-accent transition-colors" class="flex items-center gap-2 text-muted hover:text-accent transition-colors"
> >
<BracketLabel label="W" /> <span class="text-accent">[W]</span>
{profile.website.replace(/^https?:\/\//, '')} {profile.website.replace(/^https?:\/\//, '')}
</a> </a>
{/if} {/if}

View File

@@ -6,19 +6,26 @@
import PDFTimelineItem from './PDFTimelineItem.svelte'; import PDFTimelineItem from './PDFTimelineItem.svelte';
import { MailIcon, MapPinIcon, GithubIcon, GlobeIcon } from 'svelte-feather-icons'; import { MailIcon, MapPinIcon, GithubIcon, GlobeIcon } from 'svelte-feather-icons';
interface Props { let {
profile,
experience,
education,
skills,
ownProjects,
contributions,
}: {
profile: Profile; profile: Profile;
experience: Experience[]; experience: Experience[];
education: Education[]; education: Education[];
skills: Skill[]; skills: Skill[];
ownProjects: Project[]; ownProjects: Project[];
contributions: Project[]; contributions: Project[];
} } = $props();
let { profile, experience, education, skills, ownProjects, contributions }: Props = $props();
</script> </script>
<div class="font-sans max-w-[210mm] mx-auto bg-pdf-bg text-pdf-fg leading-relaxed text-sm"> <div
class="font-sans max-w-[210mm] mx-auto px-[20mm] py-[18mm] bg-pdf-bg text-pdf-fg leading-relaxed text-sm"
>
<!-- Header --> <!-- Header -->
<header class="mb-6 pb-4 border-b-2 border-pdf-fg"> <header class="mb-6 pb-4 border-b-2 border-pdf-fg">
<div class="flex items-start justify-between gap-4"> <div class="flex items-start justify-between gap-4">

View File

@@ -3,13 +3,11 @@
import ProjectList from './ProjectList.svelte'; import ProjectList from './ProjectList.svelte';
import Section from './Section.svelte'; import Section from './Section.svelte';
interface Props { let {
ownProjects: Project[]; ownProjects,
contributions: Project[]; contributions,
username: string; username,
} }: { ownProjects: Project[]; contributions: Project[]; username: string } = $props();
let { ownProjects, contributions, username }: Props = $props();
</script> </script>
<Section title="Projects"> <Section title="Projects">

View File

@@ -3,11 +3,7 @@
import Section from './Section.svelte'; import Section from './Section.svelte';
import Tags from './Tags.svelte'; import Tags from './Tags.svelte';
interface Props { let { skills }: { skills: Skill[] } = $props();
skills: Skill[];
}
let { skills }: Props = $props();
</script> </script>
<Section title="Skills"> <Section title="Skills">

View File

@@ -125,8 +125,6 @@ const config: CmsConfig = {
name: 'gitea', name: 'gitea',
app_id: 'a046b53c-787a-4b76-bd3a-633221a38954', app_id: 'a046b53c-787a-4b76-bd3a-633221a38954',
repo: 'repomaa/cv', repo: 'repomaa/cv',
base_url: 'https://git.freun.dev',
api_root: 'https://git.freun.dev/api/v1',
}, },
collections: [profile, experience, education, skills], collections: [profile, experience, education, skills],
}; };

View File

@@ -9,5 +9,6 @@
<style> <style>
@page { @page {
size: A4; size: A4;
margin: 15mm;
} }
</style> </style>

View File

@@ -1,5 +1,5 @@
import type { RequestHandler } from './$types.js'; import type { RequestHandler } from './$types.js';
import type { LaunchOptions, PDFOptions } from 'puppeteer'; import type { LaunchOptions } from 'puppeteer';
import { dev } from '$app/environment'; import { dev } from '$app/environment';
import puppeteer from 'puppeteer'; import puppeteer from 'puppeteer';
import * as cheerio from 'cheerio'; import * as cheerio from 'cheerio';
@@ -12,14 +12,14 @@ export const prerender = true;
const cwd = process.cwd(); const cwd = process.cwd();
// PDF generation configuration // PDF generation configuration
const PDF_CONFIG: PDFOptions = { const PDF_CONFIG = {
format: 'A4', format: 'A4' as const,
printBackground: true, printBackground: true,
preferCSSPageSize: true, preferCSSPageSize: true,
margin: { margin: {
top: '15mm', top: '20mm',
right: '20mm', right: '20mm',
bottom: '15mm', bottom: '20mm',
left: '20mm', left: '20mm',
}, },
}; };

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

BIN
static/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB