diff --git a/package-lock.json b/package-lock.json
index 268623a..e055868 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,6 +10,7 @@
"devDependencies": {
"@eslint/compat": "^1.4.0",
"@eslint/js": "^9.39.1",
+ "@lucide/svelte": "^0.563.1",
"@sveltejs/adapter-auto": "^7.0.0",
"@sveltejs/kit": "^2.49.1",
"@sveltejs/vite-plugin-svelte": "^6.2.1",
@@ -749,6 +750,16 @@
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
+ "node_modules/@lucide/svelte": {
+ "version": "0.563.1",
+ "resolved": "https://registry.npmjs.org/@lucide/svelte/-/svelte-0.563.1.tgz",
+ "integrity": "sha512-Kt+MbnE5D9RsuI/csmf7M+HWxALe57x3A0DhQ8pPnnUpneh7zuldrYjlT+veWtk+tVnp5doQtaAAxLujzIlhBw==",
+ "dev": true,
+ "license": "ISC",
+ "peerDependencies": {
+ "svelte": "^5"
+ }
+ },
"node_modules/@polka/url": {
"version": "1.0.0-next.29",
"resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz",
@@ -3251,24 +3262,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/yaml": {
- "version": "2.8.2",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz",
- "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==",
- "dev": true,
- "license": "ISC",
- "optional": true,
- "peer": true,
- "bin": {
- "yaml": "bin.mjs"
- },
- "engines": {
- "node": ">= 14.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/eemeli"
- }
- },
"node_modules/yocto-queue": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
diff --git a/package.json b/package.json
index 3b0a963..1fdbc20 100644
--- a/package.json
+++ b/package.json
@@ -16,6 +16,7 @@
"devDependencies": {
"@eslint/compat": "^1.4.0",
"@eslint/js": "^9.39.1",
+ "@lucide/svelte": "^0.563.1",
"@sveltejs/adapter-auto": "^7.0.0",
"@sveltejs/kit": "^2.49.1",
"@sveltejs/vite-plugin-svelte": "^6.2.1",
diff --git a/src/lib/components/Footer.svelte b/src/lib/components/Footer.svelte
new file mode 100644
index 0000000..7854e85
--- /dev/null
+++ b/src/lib/components/Footer.svelte
@@ -0,0 +1,80 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/src/lib/components/Header.svelte b/src/lib/components/Header.svelte
index 6719d56..156ce23 100644
--- a/src/lib/components/Header.svelte
+++ b/src/lib/components/Header.svelte
@@ -21,7 +21,7 @@
header {
position: fixed;
inset-inline: 0;
- bottom: 5rem;
+ bottom: 2rem;
z-index: var(--z-index-header);
width: fit-content;
diff --git a/src/lib/data/data.json b/src/lib/data/data.json
index 848ebbd..fd5f25f 100644
--- a/src/lib/data/data.json
+++ b/src/lib/data/data.json
@@ -18,5 +18,12 @@
"href": "#contact"
}
]
+ },
+ "footer": {
+ "links": {
+ "git": "https://gitea.fennert.org",
+ "linkedin": "https://www.linkedin.com/in/adrian-fennert-b3148920a/"
+ },
+ "copyright": "© 2026 Adrian Fennert. Alle Rechte vorbehalten."
}
}
diff --git a/src/lib/styles/app.css b/src/lib/styles/app.css
index 1371e0c..3c3c2a9 100644
--- a/src/lib/styles/app.css
+++ b/src/lib/styles/app.css
@@ -1,8 +1,13 @@
:root {
--color-body-background: oklch(0.21 0.034 264.665);
+ --color-footer-background: oklch(0.13 0.028 261.692);
+
--color-header-border: oklab(0.623 -0.0378409 -0.210628 / 0.3);
--color-dark-blue: oklab(0.21 -0.00316128 -0.0338527 / 0.95);
+
--color-text-primary: oklch(0.872 0.01 258.338);
+ --color-text-secondary: oklch(0.551 0.027 264.364);
+
--color-accent-primary: oklch(70.7% 0.165 254.624);
--color-accent-secondary:oklch(0.585 0.233 277.117);
diff --git a/src/lib/types/data.ts b/src/lib/types/data.ts
index fe1b7a3..da09f8e 100644
--- a/src/lib/types/data.ts
+++ b/src/lib/types/data.ts
@@ -1,12 +1,24 @@
export type Data = {
header: Header;
-}
+ footer: Footer;
+};
export type Header = {
links: HeaderLink[];
-}
+};
export type HeaderLink = {
label: string;
href: string;
-}
\ No newline at end of file
+};
+
+export type Footer = {
+ links: FooterLink;
+ copyright: string;
+};
+
+export type FooterLink = {
+ [key in FooterLinkKey]: string;
+};
+
+export type FooterLinkKey = 'git' | 'linkedin';
diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte
index 0679e9d..c4baccd 100644
--- a/src/routes/+layout.svelte
+++ b/src/routes/+layout.svelte
@@ -5,6 +5,7 @@
import Header from '$lib/components/Header.svelte';
import content from '$lib/data/data.json';
import type { Data } from '$lib/types/data';
+ import Footer from '$lib/components/Footer.svelte';
let { children } = $props();
let data: Data = content;
@@ -16,3 +17,4 @@
{@render children()}
+
diff --git a/svelte.config.js b/svelte.config.js
index 10c4eeb..1295460 100644
--- a/svelte.config.js
+++ b/svelte.config.js
@@ -1,7 +1,12 @@
import adapter from '@sveltejs/adapter-auto';
+import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';
/** @type {import('@sveltejs/kit').Config} */
const config = {
+ // Consult https://svelte.dev/docs/kit/integrations
+ // for more information about preprocessors
+ preprocess: vitePreprocess(),
+
kit: {
// adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list.
// If your environment is not supported, or you settled on a specific environment, switch out the adapter.