Compare commits
31 Commits
0340ce23e7
...
temp
Author | SHA1 | Date | |
---|---|---|---|
282a5e774e | |||
1a7727cd7d | |||
63cab3af76 | |||
aa0dfd15c9 | |||
a18f197141 | |||
63cc1858eb | |||
69c446da5a | |||
abab04eb1d | |||
7f4a81be3f | |||
3ab21267c6 | |||
fe0a8febc2 | |||
22e1fc2eb8 | |||
43123a3e5b | |||
c18b1b0fb6 | |||
b314df57fb | |||
85059ab1bf | |||
8bbc4cd77c | |||
5382c4394b | |||
58a1236c71 | |||
b1788a6102 | |||
574c5d8fb8 | |||
012dd7c52a | |||
3e47016cd9 | |||
cd620f686e | |||
d6e81e47f4 | |||
e1ed3d53db | |||
57a50a5810 | |||
aa795fb090 | |||
5c674e1541 | |||
3cef2f4107 | |||
ee8e51f62b |
40
.gitea/workflows/ci.yml
Normal file
40
.gitea/workflows/ci.yml
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
name: Build and Deploy
|
||||||
|
on: [push]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
Build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- name: Use Nodejs
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: 18
|
||||||
|
- run: npm install
|
||||||
|
- run: npm run build
|
||||||
|
|
||||||
|
|
||||||
|
Deploy:
|
||||||
|
runs-on: ubuntu-docker
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- name: Use Nodejs
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: 18
|
||||||
|
- run: npm install
|
||||||
|
- run: npm run build
|
||||||
|
|
||||||
|
- uses: docker/setup-qemu-action@v2
|
||||||
|
- uses: docker/setup-buildx-action@v2
|
||||||
|
with:
|
||||||
|
platforms: linux/amd64,linux/arm64
|
||||||
|
- uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
registry: gitea.xeovalyte.dev
|
||||||
|
username: ${{ secrets.USERNAME }}
|
||||||
|
password: ${{ secrets.PASSWORD }}
|
||||||
|
- run: docker buildx build -t gitea.xeovalyte.dev/xeovalyte/portfolio --platform=linux/amd64,linux/arm64 .
|
||||||
|
- run: docker inspect gitea.xeovalyte.dev/xeovalyte/portfolio
|
||||||
|
- run: docker push gitea.xeovalyte.dev/xeovalyte/portfolio
|
@@ -1,13 +0,0 @@
|
|||||||
pipeline:
|
|
||||||
publish:
|
|
||||||
image: plugins/docker
|
|
||||||
secrets:
|
|
||||||
- docker_password
|
|
||||||
settings:
|
|
||||||
username: xeovalyte
|
|
||||||
password:
|
|
||||||
from_secret: docker_password
|
|
||||||
repo: gitea.xeovalyte.dev/xeovalyte/website
|
|
||||||
tags:
|
|
||||||
- latest
|
|
||||||
registry: gitea.xeovalyte.dev
|
|
@@ -2,11 +2,8 @@ FROM node:18
|
|||||||
|
|
||||||
WORKDIR /usr/src/app
|
WORKDIR /usr/src/app
|
||||||
|
|
||||||
COPY . .
|
COPY .output .
|
||||||
|
|
||||||
RUN npm install
|
|
||||||
RUN npm run build
|
|
||||||
|
|
||||||
EXPOSE 3000
|
EXPOSE 3000
|
||||||
|
|
||||||
CMD [ "node", ".output/server/index.mjs" ]
|
CMD [ "node", "server/index.mjs" ]
|
||||||
|
21
assets/icons/logo.svg
Normal file
21
assets/icons/logo.svg
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
width="48"
|
||||||
|
height="48"
|
||||||
|
viewBox="0 0 12.7 12.7"
|
||||||
|
version="1.1"
|
||||||
|
id="svg5"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<defs
|
||||||
|
id="defs2" />
|
||||||
|
<g
|
||||||
|
id="layer1">
|
||||||
|
<path
|
||||||
|
id="rect753"
|
||||||
|
style="fill:#0080ff;fill-opacity:1;stroke-width:0.367356"
|
||||||
|
d="M 0.8196733,1.5362707 5.1211071,5.8377046 4.3020509,6.657378 -2e-7,2.355327 V 4.81373 L 3.0725407,7.8862709 0.8196733,10.139138 H 3.2774591 L 4.3014337,9.1151643 5.1211071,9.9342203 6.35,11.163729 7.578893,9.9342203 8.3985664,9.1151643 9.4225412,10.139138 H 11.880326 L 9.6274592,7.8862709 12.7,4.81373 V 2.355327 L 8.3979491,6.657378 7.578893,5.8377046 11.880326,1.5362707 H 9.4225412 L 6.35,4.6088116 3.2774591,1.5362707 Z M 6.35,7.0665975 7.1696734,7.8856537 6.35,8.7053271 5.5303266,7.8856537 Z" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 958 B |
17
components/layout/Leftbar.vue
Normal file
17
components/layout/Leftbar.vue
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<template>
|
||||||
|
<div class="fixed hidden lg:block left-3 top-1/2 text-primary-500 space-y-1 z-50">
|
||||||
|
<div @click="scrollToElement('heading')" class="py-2 hover:cursor-pointer">
|
||||||
|
<div class="h-1 rounded-full bg-primary-500 transition-all duration-300 hover:cursor-pointer" :class="route.hash === '#heading' ? 'w-16' : 'w-8'" />
|
||||||
|
</div>
|
||||||
|
<div @click="scrollToElement('about')" class="py-2 hover:cursor-pointer">
|
||||||
|
<div class="h-1 rounded-full bg-primary-500 transition-all duration-300 hover:cursor-pointer" :class="route.hash === '#about' ? 'w-16' : 'w-8'" />
|
||||||
|
</div>
|
||||||
|
<div @click="scrollToElement('skills')" class="py-2 hover:cursor-pointer">
|
||||||
|
<div class="h-1 rounded-full bg-primary-500 transition-all duration-300 hover:cursor-pointer" :class="route.hash === '#skills' ? 'w-16' : 'w-8'" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
const route = useRoute()
|
||||||
|
</script>
|
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<section class="flex h-screen snap-center items-center justify-center">
|
<section class="flex h-screen snap-center items-center justify-center">
|
||||||
<div
|
<div
|
||||||
class="my-40 flex w-full max-w-xl flex-wrap items-center justify-center gap-5 whitespace-pre-wrap text-lg text-primary-500"
|
class="my-40 mx-3 flex w-full max-w-xl flex-wrap items-center justify-center gap-5 whitespace-pre-wrap text-lg text-primary-500"
|
||||||
>
|
>
|
||||||
<h2
|
<h2
|
||||||
v-animate="{ preset: 'slide-right', duration: 500 }"
|
v-animate="{ preset: 'slide-right', duration: 500 }"
|
@@ -7,14 +7,14 @@
|
|||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
v-animate="{ preset: 'slide-left', delay: 300 }"
|
v-animate="{ preset: 'slide-left', delay: 300 }"
|
||||||
src="../assets/icons/logo.svg"
|
src="../../assets/icons/logo.svg"
|
||||||
alt="Logo Xeovalyte"
|
alt="Logo Xeovalyte"
|
||||||
width="150"
|
width="150"
|
||||||
/>
|
/>
|
||||||
<div class="space-y-2">
|
<div class="space-y-2">
|
||||||
<h1
|
<h1
|
||||||
v-animate="{ preset: 'slide-up', delay: 450 }"
|
v-animate="{ preset: 'slide-up', delay: 450 }"
|
||||||
class="text-7xl font-bold"
|
class="sm:text-7xl text-6xl font-bold"
|
||||||
>
|
>
|
||||||
Xeovalyte
|
Xeovalyte
|
||||||
</h1>
|
</h1>
|
||||||
@@ -31,6 +31,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<Icon
|
<Icon
|
||||||
|
@click="scrollToElement('about')"
|
||||||
size="2em"
|
size="2em"
|
||||||
name="ph:arrow-fat-line-down"
|
name="ph:arrow-fat-line-down"
|
||||||
class="absolute bottom-20 basis-full animate-bounce hover:cursor-pointer"
|
class="absolute bottom-20 basis-full animate-bounce hover:cursor-pointer"
|
||||||
@@ -38,3 +39,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
</script>
|
4
composables/scrollToElement.js
Normal file
4
composables/scrollToElement.js
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
export default function (hash) {
|
||||||
|
const element = document.getElementById(hash)
|
||||||
|
element.scrollIntoView({ behavior: 'smooth' })
|
||||||
|
}
|
@@ -7,7 +7,27 @@ export default defineNuxtConfig({
|
|||||||
"nuxt-icons",
|
"nuxt-icons",
|
||||||
"@nuxtjs/robots",
|
"@nuxtjs/robots",
|
||||||
"@nuxtjs/i18n",
|
"@nuxtjs/i18n",
|
||||||
|
"@nuxtjs/plausible",
|
||||||
],
|
],
|
||||||
|
plausible: {
|
||||||
|
domain: 'xeovalyte.com',
|
||||||
|
apiHost: 'https://plausible.xeovalyte.dev'
|
||||||
|
},
|
||||||
|
app: {
|
||||||
|
head: {
|
||||||
|
title: 'Xeovalyte | Timo Boomers Portfolio',
|
||||||
|
link: [
|
||||||
|
{
|
||||||
|
"rel": "icon",
|
||||||
|
"href": "/favicon.ico",
|
||||||
|
"type": "image/png"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
meta: [
|
||||||
|
{ name: 'description', content: 'This is the official portfolio of Xeovalyte or Timo Boomers'}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
i18n: {
|
i18n: {
|
||||||
baseUrl: 'https://xeovalyte.com',
|
baseUrl: 'https://xeovalyte.com',
|
||||||
locales: [
|
locales: [
|
||||||
|
4063
package-lock.json
generated
4063
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
14
package.json
14
package.json
@@ -8,19 +8,19 @@
|
|||||||
"postinstall": "nuxt prepare"
|
"postinstall": "nuxt prepare"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@nuxtjs/tailwindcss": "^6.2.0",
|
"@nuxtjs/tailwindcss": "^6.3.1",
|
||||||
"@vueuse/core": "^9.8.2",
|
"@vueuse/core": "^9.12.0",
|
||||||
"@vueuse/nuxt": "^9.8.2",
|
"@vueuse/nuxt": "^9.12.0",
|
||||||
"nuxt": "3.0.0",
|
"nuxt": "3.2.0",
|
||||||
"nuxt-icon": "^0.1.8",
|
"nuxt-icon": "^0.2.11",
|
||||||
"prettier": "^2.8.3",
|
"prettier": "^2.8.4",
|
||||||
"prettier-plugin-tailwindcss": "^0.2.2"
|
"prettier-plugin-tailwindcss": "^0.2.2"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@nuxtjs/i18n": "^8.0.0-beta.9",
|
"@nuxtjs/i18n": "^8.0.0-beta.9",
|
||||||
|
"@nuxtjs/plausible": "^0.2.0",
|
||||||
"@nuxtjs/robots": "^3.0.0",
|
"@nuxtjs/robots": "^3.0.0",
|
||||||
"locomotive-scroll": "^4.1.4",
|
"locomotive-scroll": "^4.1.4",
|
||||||
"motion": "^10.15.5",
|
|
||||||
"nuxt-icons": "^3.1.0"
|
"nuxt-icons": "^3.1.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,9 +1,29 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="h-screen snap-y snap-mandatory overflow-y-auto bg-dark-200">
|
<LayoutLeftbar />
|
||||||
<Heading />
|
<div id="observe" class="h-screen snap-y snap-mandatory overflow-y-auto overflow-x-hidden bg-dark-200">
|
||||||
<About />
|
<SlidesHeading id="heading" />
|
||||||
<Skills />
|
<SlidesAbout id="about" />
|
||||||
|
<SlidesSkills id="skills" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup></script>
|
<script setup>
|
||||||
|
const router = useRouter()
|
||||||
|
|
||||||
|
const callback = (entries, observer) => {
|
||||||
|
entries.forEach(entry => {
|
||||||
|
if (entry.isIntersecting) {
|
||||||
|
router.replace({ hash: '#' + entry.target.id})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
let targets = document.querySelectorAll('section')
|
||||||
|
const observer = new IntersectionObserver(callback, { root: document.querySelector('#observe'), threshold: 0.9 })
|
||||||
|
|
||||||
|
targets.forEach(target => {
|
||||||
|
observer.observe(target)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
BIN
public/favicon.ico
Normal file
BIN
public/favicon.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 91 KiB |
Reference in New Issue
Block a user