diff --git a/src/routes/cv/[lang]/avatar.png b/src/lib/assets/avatar.png
similarity index 100%
rename from src/routes/cv/[lang]/avatar.png
rename to src/lib/assets/avatar.png
diff --git a/src/lib/components/Gradients.svelte b/src/lib/components/Gradients.svelte
new file mode 100644
index 0000000..3518ab1
--- /dev/null
+++ b/src/lib/components/Gradients.svelte
@@ -0,0 +1,26 @@
+
+
{@render children()}
diff --git a/src/lib/components/cv/internals/PageWrapper.svelte b/src/lib/components/cv/internals/PageWrapper.svelte
new file mode 100644
index 0000000..038a524
--- /dev/null
+++ b/src/lib/components/cv/internals/PageWrapper.svelte
@@ -0,0 +1,15 @@
+
+
+
+ {@render children()}
+
diff --git a/src/lib/components/cv/internals/Text.svelte b/src/lib/components/cv/internals/Text.svelte
new file mode 100644
index 0000000..0c05ff7
--- /dev/null
+++ b/src/lib/components/cv/internals/Text.svelte
@@ -0,0 +1,15 @@
+
+
+
+ {@render children()}
+
diff --git a/src/lib/components/cv/internals/index.ts b/src/lib/components/cv/internals/index.ts
new file mode 100644
index 0000000..9aa78c7
--- /dev/null
+++ b/src/lib/components/cv/internals/index.ts
@@ -0,0 +1,8 @@
+export { default as DownloadButton } from './Download.svelte';
+export { default as Page } from './Page.svelte';
+export { default as PageWrapper } from './PageWrapper.svelte';
+export { default as Text } from './Text.svelte';
+
+export * as Metadata from './metadata';
+export * as Section from './section';
+export * as Table from './table';
diff --git a/src/lib/components/cv/internals/metadata/MetadataItem.svelte b/src/lib/components/cv/internals/metadata/MetadataItem.svelte
new file mode 100644
index 0000000..428e249
--- /dev/null
+++ b/src/lib/components/cv/internals/metadata/MetadataItem.svelte
@@ -0,0 +1,14 @@
+
+
+
+ {@render children()}
+
diff --git a/src/lib/components/cv/internals/metadata/MetadataLabel.svelte b/src/lib/components/cv/internals/metadata/MetadataLabel.svelte
new file mode 100644
index 0000000..6a692b0
--- /dev/null
+++ b/src/lib/components/cv/internals/metadata/MetadataLabel.svelte
@@ -0,0 +1,13 @@
+
+
+
{@render children()}
diff --git a/src/lib/components/cv/internals/metadata/MetadataLink.svelte b/src/lib/components/cv/internals/metadata/MetadataLink.svelte
new file mode 100644
index 0000000..b2cf010
--- /dev/null
+++ b/src/lib/components/cv/internals/metadata/MetadataLink.svelte
@@ -0,0 +1,19 @@
+
+
+
+ {@render children()}
+
diff --git a/src/lib/components/cv/internals/metadata/MetadataRoot.svelte b/src/lib/components/cv/internals/metadata/MetadataRoot.svelte
new file mode 100644
index 0000000..18b7cf5
--- /dev/null
+++ b/src/lib/components/cv/internals/metadata/MetadataRoot.svelte
@@ -0,0 +1,15 @@
+
+
+
diff --git a/src/lib/components/cv/internals/metadata/index.ts b/src/lib/components/cv/internals/metadata/index.ts
new file mode 100644
index 0000000..c71850d
--- /dev/null
+++ b/src/lib/components/cv/internals/metadata/index.ts
@@ -0,0 +1,4 @@
+export { default as Root } from './MetadataRoot.svelte';
+export { default as Link } from './MetadataLink.svelte';
+export { default as Item } from './MetadataItem.svelte';
+export { default as Label } from './MetadataLabel.svelte';
diff --git a/src/lib/components/cv/internals/section/SectionRoot.svelte b/src/lib/components/cv/internals/section/SectionRoot.svelte
new file mode 100644
index 0000000..e5c6792
--- /dev/null
+++ b/src/lib/components/cv/internals/section/SectionRoot.svelte
@@ -0,0 +1,15 @@
+
+
+
+ {@render children()}
+
diff --git a/src/lib/components/cv/internals/section/SectionTitle.svelte b/src/lib/components/cv/internals/section/SectionTitle.svelte
new file mode 100644
index 0000000..fb62f14
--- /dev/null
+++ b/src/lib/components/cv/internals/section/SectionTitle.svelte
@@ -0,0 +1,15 @@
+
+
+
+ {@render children()}
+
diff --git a/src/lib/components/cv/internals/section/index.ts b/src/lib/components/cv/internals/section/index.ts
new file mode 100644
index 0000000..70c7d5d
--- /dev/null
+++ b/src/lib/components/cv/internals/section/index.ts
@@ -0,0 +1,2 @@
+export { default as Root } from './SectionRoot.svelte';
+export { default as Title } from './SectionTitle.svelte';
diff --git a/src/lib/components/cv/internals/table/TableContent.svelte b/src/lib/components/cv/internals/table/TableContent.svelte
new file mode 100644
index 0000000..6757e65
--- /dev/null
+++ b/src/lib/components/cv/internals/table/TableContent.svelte
@@ -0,0 +1,15 @@
+
+
+
+ {@render children()}
+
diff --git a/src/lib/components/cv/internals/table/TableDescription.svelte b/src/lib/components/cv/internals/table/TableDescription.svelte
new file mode 100644
index 0000000..107ce05
--- /dev/null
+++ b/src/lib/components/cv/internals/table/TableDescription.svelte
@@ -0,0 +1,14 @@
+
+
+
+ {@render children()}
+
diff --git a/src/lib/components/cv/internals/table/TableItem.svelte b/src/lib/components/cv/internals/table/TableItem.svelte
new file mode 100644
index 0000000..f4808e3
--- /dev/null
+++ b/src/lib/components/cv/internals/table/TableItem.svelte
@@ -0,0 +1,15 @@
+
+
+
+ {@render children()}
+
diff --git a/src/lib/components/cv/internals/table/TableLabel.svelte b/src/lib/components/cv/internals/table/TableLabel.svelte
new file mode 100644
index 0000000..b69f4cb
--- /dev/null
+++ b/src/lib/components/cv/internals/table/TableLabel.svelte
@@ -0,0 +1,15 @@
+
+
+
+ {@render children()}
+
diff --git a/src/lib/components/cv/internals/table/TableRoot.svelte b/src/lib/components/cv/internals/table/TableRoot.svelte
new file mode 100644
index 0000000..1be5aa3
--- /dev/null
+++ b/src/lib/components/cv/internals/table/TableRoot.svelte
@@ -0,0 +1,15 @@
+
+
+
diff --git a/src/lib/components/cv/internals/table/TableTitle.svelte b/src/lib/components/cv/internals/table/TableTitle.svelte
new file mode 100644
index 0000000..0a258dd
--- /dev/null
+++ b/src/lib/components/cv/internals/table/TableTitle.svelte
@@ -0,0 +1,15 @@
+
+
+
+ {@render children()}
+
diff --git a/src/lib/components/cv/internals/table/index.ts b/src/lib/components/cv/internals/table/index.ts
new file mode 100644
index 0000000..32801a1
--- /dev/null
+++ b/src/lib/components/cv/internals/table/index.ts
@@ -0,0 +1,6 @@
+export { default as Root } from './TableRoot.svelte';
+export { default as Description } from './TableDescription.svelte';
+export { default as Label } from './TableLabel.svelte';
+export { default as Title } from './TableTitle.svelte';
+export { default as Item } from './TableItem.svelte';
+export { default as Content } from './TableContent.svelte';
diff --git a/src/lib/components/List.svelte b/src/lib/components/list/List.svelte
similarity index 100%
rename from src/lib/components/List.svelte
rename to src/lib/components/list/List.svelte
diff --git a/src/lib/components/ListDescription.svelte b/src/lib/components/list/ListDescription.svelte
similarity index 100%
rename from src/lib/components/ListDescription.svelte
rename to src/lib/components/list/ListDescription.svelte
diff --git a/src/lib/components/ListItem.svelte b/src/lib/components/list/ListItem.svelte
similarity index 100%
rename from src/lib/components/ListItem.svelte
rename to src/lib/components/list/ListItem.svelte
diff --git a/src/lib/components/ListTitle.svelte b/src/lib/components/list/ListTitle.svelte
similarity index 100%
rename from src/lib/components/ListTitle.svelte
rename to src/lib/components/list/ListTitle.svelte
diff --git a/src/lib/components/list/index.ts b/src/lib/components/list/index.ts
new file mode 100644
index 0000000..dc26cfa
--- /dev/null
+++ b/src/lib/components/list/index.ts
@@ -0,0 +1,4 @@
+export { default as List } from './List.svelte';
+export { default as ListItem } from './ListItem.svelte';
+export { default as ListDescription } from './ListDescription.svelte';
+export { default as ListTitle } from './ListTitle.svelte';
diff --git a/src/lib/data.ts b/src/lib/data.ts
new file mode 100644
index 0000000..1dc5678
--- /dev/null
+++ b/src/lib/data.ts
@@ -0,0 +1,100 @@
+export type CV = typeof cvEn;
+
+export const cvEn = {
+ metadata: [
+ {
+ label: 'Address',
+ value: 'Blusuvollsbakken 6A, 7052 Trondheim'
+ },
+ {
+ label: 'Mobile',
+ value: '+47 479 04 470'
+ },
+ {
+ label: 'E-mail',
+ value: 'me@omfj.no'
+ },
+ {
+ label: 'Date of birth',
+ value: '17th December 2002'
+ },
+ {
+ label: 'Nationality',
+ value: 'Norwegian'
+ },
+ {
+ label: 'Languages',
+ value: 'Norwegian, English'
+ },
+ {
+ label: 'Website',
+ value: 'https://omfj.no',
+ link: 'https://omfj.no'
+ },
+ {
+ label: 'GitHub',
+ value: 'https://github.com/omfj',
+ link: 'https://github.com/omfj'
+ },
+ {
+ label: 'LinkedIn',
+ value: 'https://www.linkedin.com/in/omfj',
+ link: 'https://www.linkedin.com/in/omfj'
+ }
+ ],
+ education: [
+ {
+ year: '08.2021 - 06.2024',
+ title: 'Bachelor in Computer Technology',
+ institution: 'University of Bergen'
+ },
+ {
+ year: '2018 - 2021',
+ title: 'Upper Secondary School',
+ institution: 'Trondheim Cathedral School'
+ }
+ ],
+ skills: [
+ {
+ title: 'Programming languages',
+ description: 'Java, Kotlin, TypeScript, JavaScript, Python, SQL'
+ },
+ {
+ title: 'Frameworks',
+ description: 'React, Next.js, Quarkus, Ktor, Hono'
+ },
+ {
+ title: 'Tools',
+ description: 'Git, Docker'
+ },
+ {
+ title: 'Other',
+ description: 'TailwindCSS, Cloudflare, Vercel, GitHub Actions'
+ }
+ ],
+
+ workExperience: [
+ {
+ year: '09.2023 - Present',
+ title: 'Software Developer',
+ company: 'Sportradar AS',
+ description: 'Worked part-time with the same project from my summer internship'
+ },
+ {
+ year: '06.2023 - 08.2023',
+ title: 'Engineering Intern',
+ company: 'Sportradar AS',
+ description:
+ 'Worked as a full-stack developer for Sportradar. I was involved in developing an internal tool using Quarkus and Kotlin for the backend, as well as React and TypeScript for the frontend.'
+ }
+ ],
+ volunteerExperience: [
+ {
+ year: '09.2021 - Present',
+ title: 'Board member',
+ company: 'echo Webkom',
+ description:
+ "I have been involved in managing echo's web solutions. Through my role, I have held positions as a board member, deputy chairman, and now I am the chief technology officer. I also spearheaded the development of the new website. Here, we have used many modern technologies such as TailwindCSS, Next.js, Vercel, Kotlin, Ktor to name a few."
+ }
+ ]
+};
diff --git a/src/routes/(app)/+page.svelte b/src/routes/(app)/+page.svelte
index 417786c..20b8e02 100644
--- a/src/routes/(app)/+page.svelte
+++ b/src/routes/(app)/+page.svelte
@@ -1,8 +1,5 @@
-
-
-
-
-
window.print()}
- class="text-center bg-white hover:bg-gray-100 z-50 w-fit mx-auto text-gray-700 text-sm h-8 flex items-center justify-center mt-6 hover:text-blue-500 shadow-inner rounded-xl px-4 transition-all"
- >Download as PDF
-
-
-
-
-
-
-
-
-
-
Ole Magnus Fon Johnsen
-
- {#each metadata as { label, value, link }}
-
-
- {label}: {' '}
- {#if link}
- {value}
- {:else}
- {value}
- {/if}
-
-
- {/each}
-
-
-
-
-
-
About me
-
-
- I am an outgoing and curious person who loves to learn. Ever since I was young, I have had a
- great interest in everything related to computers and technology. When I am not studying, I
- enjoy playing video games, or tennis with friends if the weather is nice.
-
-
-
-
-
Education
-
-
- {#each education as { year, title, institution }}
-
- {year}
-
- {title} at {institution}
-
-
- {/each}
-
-
-
-
-
Work experience
-
-
- {#each workExperience as { year, title, company, description }}
-
- {year}
-
-
- {title} at {company}
-
-
{description}
-
-
- {/each}
-
-
-
-
-
Volunteer experience
-
-
- {#each volunteerExperience as { year, title, company, description }}
-
- {year}
-
-
- {title} at {company}
-
-
{description}
-
-
- {/each}
-
-
-
-
-
Skills
-
-
- {#each skills as { title, description }}
-
- {title}
- {description}
-
- {/each}
-
-
-
-
-
Other
-
-
- See some of my other projects on my GitHub, @omfj. (https://www.github.com/omfj)
-
-
- I also have some certificates on Codecademy. (https://www.codecademy.com/profiles/omfj)
-
-
-
-
-
-
+
+
+