Compare commits
1 Commits
main
...
c8044259cc
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c8044259cc
|
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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%
|
||||||
|
|||||||
@@ -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>
|
|
||||||
@@ -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">
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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],
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -9,5 +9,6 @@
|
|||||||
<style>
|
<style>
|
||||||
@page {
|
@page {
|
||||||
size: A4;
|
size: A4;
|
||||||
|
margin: 15mm;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -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
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 |
Reference in New Issue
Block a user