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 */
--color-bg: light-dark(#fafafa, #0c0c0e);
--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-hot: light-dark(#c2410c, #fb923c);

View File

@@ -2,12 +2,9 @@
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" type="image/png" sizes="32x32" href="%sveltekit.assets%/favicon-32x32.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" />
<link rel="icon" href="%sveltekit.assets%/favicon.png" />
<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="#22d3ee" media="(prefers-color-scheme: dark)" />
%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 TimelineItem from './TimelineItem.svelte';
interface Props {
education: Education[];
}
let { education }: Props = $props();
let { education }: { education: Education[] } = $props();
</script>
<Section title="Education">

View File

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

View File

@@ -8,14 +8,14 @@
href="https://svelte.dev"
target="_blank"
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
href="https://sveltiacms.app/"
target="_blank"
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 class="mt-2">

View File

@@ -1,13 +1,8 @@
<script lang="ts">
import type { Profile } from '$lib/types.js';
import BracketLabel from './BracketLabel.svelte';
import EncodedEmail from './EncodedEmail.svelte';
interface Props {
profile: Profile;
}
let { profile }: Props = $props();
let { profile }: { profile: Profile } = $props();
</script>
<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 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" />
</div>
<div class="flex items-center gap-2 text-muted">
<BracketLabel label="L" />
<span class="text-accent">[L]</span>
{profile.location}
</div>
@@ -48,7 +43,7 @@
rel="noopener noreferrer"
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}
</a>
@@ -59,7 +54,7 @@
rel="noopener noreferrer"
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?:\/\//, '')}
</a>
{/if}

View File

@@ -6,19 +6,26 @@
import PDFTimelineItem from './PDFTimelineItem.svelte';
import { MailIcon, MapPinIcon, GithubIcon, GlobeIcon } from 'svelte-feather-icons';
interface Props {
let {
profile,
experience,
education,
skills,
ownProjects,
contributions,
}: {
profile: Profile;
experience: Experience[];
education: Education[];
skills: Skill[];
ownProjects: Project[];
contributions: Project[];
}
let { profile, experience, education, skills, ownProjects, contributions }: Props = $props();
} = $props();
</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 class="mb-6 pb-4 border-b-2 border-pdf-fg">
<div class="flex items-start justify-between gap-4">

View File

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

View File

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

View File

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

View File

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

View File

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