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 @@ +
+
+ + diff --git a/src/lib/components/cv/CV.svelte b/src/lib/components/cv/CV.svelte new file mode 100644 index 0000000..09190cd --- /dev/null +++ b/src/lib/components/cv/CV.svelte @@ -0,0 +1,143 @@ + + + + +
+
+ Ole Magnus +
+ +
+

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) + + +
+
+ + diff --git a/src/lib/components/cv/internals/Download.svelte b/src/lib/components/cv/internals/Download.svelte new file mode 100644 index 0000000..aa744ec --- /dev/null +++ b/src/lib/components/cv/internals/Download.svelte @@ -0,0 +1,5 @@ + diff --git a/src/routes/cv/[lang]/_components/Page.svelte b/src/lib/components/cv/internals/Page.svelte similarity index 76% rename from src/routes/cv/[lang]/_components/Page.svelte rename to src/lib/components/cv/internals/Page.svelte index e42f475..1f19b56 100644 --- a/src/routes/cv/[lang]/_components/Page.svelte +++ b/src/lib/components/cv/internals/Page.svelte @@ -10,6 +10,6 @@ let { children, class: className, ...props }: Props = $props(); -
+
{@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 @@ - -
    -
    - - - -
    - -
    -
    - Ole Magnus -
    - -
    -

    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) -

    -
    -
    -
    - - + + +