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 */
|
||||
--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);
|
||||
|
||||
|
||||
@@ -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%
|
||||
|
||||
@@ -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 TimelineItem from './TimelineItem.svelte';
|
||||
|
||||
interface Props {
|
||||
education: Education[];
|
||||
}
|
||||
|
||||
let { education }: Props = $props();
|
||||
let { education }: { education: Education[] } = $props();
|
||||
</script>
|
||||
|
||||
<Section title="Education">
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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],
|
||||
};
|
||||
|
||||
@@ -9,5 +9,6 @@
|
||||
<style>
|
||||
@page {
|
||||
size: A4;
|
||||
margin: 15mm;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -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
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