Added options, preparing for Quasar rewrite
|
@ -12,7 +12,7 @@ module.exports = {
|
||||||
plugins: [],
|
plugins: [],
|
||||||
rules: {
|
rules: {
|
||||||
lintOnStart: 0,
|
lintOnStart: 0,
|
||||||
indent: ['error', 2],
|
indent: ['error', 2, { SwitchCase: 1 }],
|
||||||
quotes: [2, 'single', { avoidEscape: true }],
|
quotes: [2, 'single', { avoidEscape: true }],
|
||||||
'no-console': 'off',
|
'no-console': 'off',
|
||||||
'vue/no-multiple-template-root': 'off',
|
'vue/no-multiple-template-root': 'off',
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
[{"D:\\Software\\Development\\Websites\\enderman.ch\\index\\assets\\styles\\transitions.scss":"1","D:\\Software\\Development\\Websites\\enderman.ch\\index\\components\\Logo.vue":"2","D:\\Software\\Development\\Websites\\enderman.ch\\index\\components\\LinkButton.vue":"3","D:\\Software\\Development\\Websites\\enderman.ch\\index\\components\\TransitionY.vue":"4","D:\\Software\\Development\\Websites\\enderman.ch\\index\\app.vue":"5","D:\\Software\\Development\\Websites\\enderman.ch\\index\\components\\EMail.vue":"6","D:\\Software\\Development\\Websites\\enderman.ch\\index\\components\\Navigation.vue":"7","D:\\Software\\Development\\Websites\\enderman.ch\\index\\components\\Separator.vue":"8","D:\\Software\\Development\\Websites\\enderman.ch\\index\\components\\Flooter.vue":"9","D:\\Software\\Development\\Websites\\enderman.ch\\index\\components\\Portal.vue":"10","D:\\Software\\Development\\Websites\\enderman.ch\\index\\pages\\about.vue":"11","D:\\Software\\Development\\Websites\\enderman.ch\\index\\pages\\index.vue":"12","D:\\Software\\Development\\Websites\\enderman.ch\\index\\pages\\projects.vue":"13","D:\\Software\\Development\\Websites\\enderman.ch\\index\\pages\\social.vue":"14","D:\\Software\\Development\\Websites\\enderman.ch\\index\\layouts\\Card.vue":"15"},{"size":165,"mtime":1700688268778,"hashOfConfig":"16"},{"size":1113,"mtime":1700251498711,"hashOfConfig":"16"},{"size":986,"mtime":1700324714794,"hashOfConfig":"16"},{"size":1513,"mtime":1700430002840,"hashOfConfig":"16"},{"size":1550,"mtime":1700850776284,"hashOfConfig":"16"},{"size":804,"mtime":1700688952880,"hashOfConfig":"16"},{"size":1252,"mtime":1700694015567,"hashOfConfig":"16"},{"size":300,"mtime":1700689033070,"hashOfConfig":"16"},{"size":2055,"mtime":1701085637656,"hashOfConfig":"16"},{"size":16907,"mtime":1700919582401,"hashOfConfig":"16"},{"size":2135,"mtime":1700689265787,"hashOfConfig":"16"},{"size":3117,"mtime":1700689271383,"hashOfConfig":"16"},{"size":2304,"mtime":1700689265769,"hashOfConfig":"16"},{"size":3232,"mtime":1700689265781,"hashOfConfig":"16"},{"size":1623,"mtime":1700748530633,"hashOfConfig":"16"},"5tgxr3"]
|
[{"D:\\Software\\Development\\Websites\\enderman.ch\\index\\assets\\styles\\transitions.scss":"1","D:\\Software\\Development\\Websites\\enderman.ch\\index\\components\\TransitionY.vue":"2","D:\\Software\\Development\\Websites\\enderman.ch\\index\\app.vue":"3","D:\\Software\\Development\\Websites\\enderman.ch\\index\\components\\EMail.vue":"4","D:\\Software\\Development\\Websites\\enderman.ch\\index\\pages\\about.vue":"5","D:\\Software\\Development\\Websites\\enderman.ch\\index\\pages\\index.vue":"6","D:\\Software\\Development\\Websites\\enderman.ch\\index\\pages\\projects.vue":"7","D:\\Software\\Development\\Websites\\enderman.ch\\index\\pages\\social.vue":"8","D:\\Software\\Development\\Websites\\enderman.ch\\index\\layouts\\Card.vue":"9","D:\\Software\\Development\\Websites\\enderman.ch\\index\\components\\blocks\\Options.vue":"10","D:\\Software\\Development\\Websites\\enderman.ch\\index\\components\\blocks\\Flooter.vue":"11","D:\\Software\\Development\\Websites\\enderman.ch\\index\\components\\blocks\\SwipeControls.vue":"12","D:\\Software\\Development\\Websites\\enderman.ch\\index\\components\\blocks\\Logo.vue":"13","D:\\Software\\Development\\Websites\\enderman.ch\\index\\components\\blocks\\Route.vue":"14","D:\\Software\\Development\\Websites\\enderman.ch\\index\\components\\ui\\Dialog.vue":"15","D:\\Software\\Development\\Websites\\enderman.ch\\index\\components\\animations\\Portal.vue":"16"},{"size":165,"mtime":1700688268778,"hashOfConfig":"17"},{"size":1513,"mtime":1700430002840,"hashOfConfig":"17"},{"size":1550,"mtime":1700850776284,"hashOfConfig":"17"},{"size":804,"mtime":1700688952880,"hashOfConfig":"17"},{"size":2135,"mtime":1700689265787,"hashOfConfig":"17"},{"size":3117,"mtime":1700689271383,"hashOfConfig":"17"},{"size":2304,"mtime":1700689265769,"hashOfConfig":"17"},{"size":3232,"mtime":1700689265781,"hashOfConfig":"17"},{"size":1623,"mtime":1700748530633,"hashOfConfig":"17"},{"size":1150,"mtime":1706039004185,"hashOfConfig":"17"},{"size":2119,"mtime":1706017145787,"hashOfConfig":"17"},{"size":1345,"mtime":1706015856048,"hashOfConfig":"17"},{"size":1135,"mtime":1706030243608,"hashOfConfig":"17"},{"size":979,"mtime":1706003786966,"hashOfConfig":"17"},{"size":1519,"mtime":1706031675155,"hashOfConfig":"17"},{"size":16911,"mtime":1706027251875,"hashOfConfig":"17"},"5tgxr3"]
|
47
app.vue
|
@ -5,6 +5,8 @@ import { useRuntimeConfig } from '#imports'
|
||||||
const config = useRuntimeConfig()
|
const config = useRuntimeConfig()
|
||||||
const quasar = useQuasar()
|
const quasar = useQuasar()
|
||||||
|
|
||||||
|
quasar.dark.set('auto')
|
||||||
|
|
||||||
useHead({
|
useHead({
|
||||||
titleTemplate: (chunk) => {
|
titleTemplate: (chunk) => {
|
||||||
return !chunk || chunk === config.public.websiteName
|
return !chunk || chunk === config.public.websiteName
|
||||||
|
@ -15,33 +17,28 @@ useHead({
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<NuxtLoadingIndicator color="purple" />
|
|
||||||
|
|
||||||
<div
|
<div
|
||||||
id="ender-layout"
|
id="ender-layout"
|
||||||
class="d-flex flex-column align-items-center pt-sm-5 h-100"
|
class="d-flex flex-column align-items-center pt-sm-5 h-100"
|
||||||
>
|
>
|
||||||
|
<AClientOnly appear render="xs" mode="out-in">
|
||||||
|
<SwipeControls />
|
||||||
|
</AClientOnly>
|
||||||
|
|
||||||
<NuxtLayout
|
<NuxtLayout
|
||||||
name="card"
|
name="card"
|
||||||
class="animate__animated-sm animate__delay-1-5s animate__fadeInDown"
|
class="animate__animated-sm animate__delay-1-5s animate__fadeInDown"
|
||||||
>
|
>
|
||||||
<template #footer>
|
<template #footer>
|
||||||
<ClientOnly>
|
<AClientOnly
|
||||||
<template #fallback> </template>
|
appear
|
||||||
<Transition
|
render="xs"
|
||||||
appear
|
mode="in-out"
|
||||||
enter-active-class="animate__animated animate__delay-1s animate__fadeIn"
|
enter="animate__animated animate__delay-1s animate__fadeIn"
|
||||||
leave-active-class="animate__animated animate__fadeOut"
|
leave="animate__animated animate__fadeOut"
|
||||||
mode="out-in"
|
>
|
||||||
>
|
<Flooter opaque />
|
||||||
<Flooter
|
</AClientOnly>
|
||||||
v-if="
|
|
||||||
quasar.screen.width && quasar.screen.height && quasar.screen.xs
|
|
||||||
"
|
|
||||||
opaque
|
|
||||||
/>
|
|
||||||
</Transition>
|
|
||||||
</ClientOnly>
|
|
||||||
</template>
|
</template>
|
||||||
</NuxtLayout>
|
</NuxtLayout>
|
||||||
</div>
|
</div>
|
||||||
|
@ -51,15 +48,13 @@ useHead({
|
||||||
<Portal layout="#ender-layout" animate randomize fade />
|
<Portal layout="#ender-layout" animate randomize fade />
|
||||||
</ClientOnly>
|
</ClientOnly>
|
||||||
|
|
||||||
<Transition
|
<AClientOnly
|
||||||
appear
|
appear
|
||||||
enter-active-class="animate__animated animate__delay-1s animate__fadeInUpBig animate__slow"
|
render="sm-up"
|
||||||
leave-active-class="animate__animated animate__fadeOutDown"
|
|
||||||
mode="out-in"
|
mode="out-in"
|
||||||
|
enter="animate__animated animate__delay-1s animate__fadeInUpBig animate__slow"
|
||||||
|
leave="animate__animated animate__fadeOutDown"
|
||||||
>
|
>
|
||||||
<Flooter
|
<Flooter class="floaty mb-2 px-2" />
|
||||||
v-if="quasar.screen.width && quasar.screen.height && !quasar.screen.xs"
|
</AClientOnly>
|
||||||
class="floaty mb-2 px-2"
|
|
||||||
/>
|
|
||||||
</Transition>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
After Width: | Height: | Size: 79 KiB |
After Width: | Height: | Size: 60 KiB |
After Width: | Height: | Size: 902 KiB |
Before Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 139 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
|
@ -36,7 +36,7 @@ body {
|
||||||
position: sticky;
|
position: sticky;
|
||||||
|
|
||||||
background-color: rgb(6 25 28);
|
background-color: rgb(6 25 28);
|
||||||
background-image: url('~/assets/images/sky.png');
|
background-image: url('~/assets/images/textures/sky.png');
|
||||||
background-attachment: fixed;
|
background-attachment: fixed;
|
||||||
background-blend-mode: multiply;
|
background-blend-mode: multiply;
|
||||||
background-size: cover;
|
background-size: cover;
|
||||||
|
@ -61,6 +61,26 @@ body {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Helper classes that don't exist in Bootstrap.
|
// Helper classes that don't exist in Bootstrap.
|
||||||
|
.nobr {
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.clickable {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.overlay {
|
||||||
|
grid-area: 1 / 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pass-through {
|
||||||
|
pointer-events: none;
|
||||||
|
|
||||||
|
> * {
|
||||||
|
pointer-events: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.no-decoration {
|
.no-decoration {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
color: inherit;
|
color: inherit;
|
||||||
|
@ -78,7 +98,7 @@ body {
|
||||||
grid-template-columns: repeat(2, minmax(0, 1fr));
|
grid-template-columns: repeat(2, minmax(0, 1fr));
|
||||||
}
|
}
|
||||||
|
|
||||||
.display-xs-none {
|
.display-sm {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -87,10 +107,6 @@ body {
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
}
|
}
|
||||||
|
|
||||||
.smooth-glide {
|
|
||||||
transition: height 0.4s linear;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Query-overridable classes.
|
// Query-overridable classes.
|
||||||
.background {
|
.background {
|
||||||
background-color: rgb(0 0 0 / 50%);
|
background-color: rgb(0 0 0 / 50%);
|
||||||
|
@ -101,6 +117,42 @@ body {
|
||||||
min-height: 100%;
|
min-height: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.dialog {
|
||||||
|
display: grid;
|
||||||
|
|
||||||
|
min-width: 240px;
|
||||||
|
max-width: 640px;
|
||||||
|
|
||||||
|
background-color: rgb(25 20 40 / 95%);
|
||||||
|
box-shadow: rgb(81 75 89 / 50%) 7px 7px 2em;
|
||||||
|
border-radius: 16px !important;
|
||||||
|
|
||||||
|
> div.background {
|
||||||
|
background-image: url('~/assets/images/textures/aero.png');
|
||||||
|
background-attachment: scroll;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-size: cover;
|
||||||
|
background-blend-mode: lighten;
|
||||||
|
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
|
opacity: 0.2;
|
||||||
|
|
||||||
|
box-shadow: azure 0 0 20rem;
|
||||||
|
filter: blur(5px);
|
||||||
|
}
|
||||||
|
|
||||||
|
> div.content > img.icon-badge {
|
||||||
|
position: fixed;
|
||||||
|
margin-top: -20px;
|
||||||
|
margin-left: -20px;
|
||||||
|
transform: rotate(-25deg);
|
||||||
|
width: 60px;
|
||||||
|
height: 60px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
%link {
|
%link {
|
||||||
color: inherit;
|
color: inherit;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
|
@ -164,7 +216,7 @@ body {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
@media (prefers-color-scheme: light) {
|
||||||
body {
|
body {
|
||||||
color: black;
|
color: black;
|
||||||
}
|
}
|
||||||
|
@ -240,11 +292,11 @@ body {
|
||||||
mask-image: linear-gradient(to bottom, rgb(0 0 0 / 0%), rgb(0 0 0 / 100%) 5%, rgb(0 0 0 / 100%) 95%, rgb(0 0 0 / 0%));
|
mask-image: linear-gradient(to bottom, rgb(0 0 0 / 0%), rgb(0 0 0 / 100%) 5%, rgb(0 0 0 / 100%) 95%, rgb(0 0 0 / 0%));
|
||||||
}
|
}
|
||||||
|
|
||||||
.rounded-1 {
|
.rounded-1-sm {
|
||||||
border-radius: 1em;
|
border-radius: 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.display-xs-none {
|
.display-sm {
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -264,7 +316,7 @@ body {
|
||||||
|
|
||||||
@include bootstrap.media-breakpoint-up(lg) {
|
@include bootstrap.media-breakpoint-up(lg) {
|
||||||
.dimensions {
|
.dimensions {
|
||||||
width: 60%;
|
width: 70%;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,97 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { useQuasar } from 'quasar'
|
||||||
|
import type { PropType } from 'vue'
|
||||||
|
|
||||||
|
type ModeOptions = 'in-out' | 'out-in' | 'default' | undefined
|
||||||
|
type RenderOptions =
|
||||||
|
| 'never'
|
||||||
|
| 'always'
|
||||||
|
| 'xs'
|
||||||
|
| 'sm'
|
||||||
|
| 'sm-down'
|
||||||
|
| 'sm-up'
|
||||||
|
| 'md'
|
||||||
|
| 'md-down'
|
||||||
|
| 'md-up'
|
||||||
|
| 'lg'
|
||||||
|
| 'lg-down'
|
||||||
|
| 'lg-up'
|
||||||
|
| 'xl'
|
||||||
|
| undefined
|
||||||
|
|
||||||
|
const quasar = useQuasar()
|
||||||
|
const props = defineProps({
|
||||||
|
fallback: {
|
||||||
|
type: String,
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
|
render: {
|
||||||
|
type: String as PropType<RenderOptions>,
|
||||||
|
default: 'always',
|
||||||
|
},
|
||||||
|
appear: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
mode: {
|
||||||
|
type: String as PropType<ModeOptions>,
|
||||||
|
default: 'out-in',
|
||||||
|
},
|
||||||
|
enter: {
|
||||||
|
type: String,
|
||||||
|
default: 'animate__fadeIn',
|
||||||
|
},
|
||||||
|
leave: {
|
||||||
|
type: String,
|
||||||
|
default: 'animate__fadeOut',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
const render = computed(() => {
|
||||||
|
switch (props.render) {
|
||||||
|
case 'never':
|
||||||
|
return false
|
||||||
|
case 'always':
|
||||||
|
return true
|
||||||
|
case 'xs':
|
||||||
|
return quasar.screen.xs
|
||||||
|
case 'sm':
|
||||||
|
return quasar.screen.sm
|
||||||
|
case 'sm-down':
|
||||||
|
return quasar.screen.xs || quasar.screen.sm
|
||||||
|
case 'sm-up':
|
||||||
|
return !quasar.screen.xs
|
||||||
|
case 'md':
|
||||||
|
return quasar.screen.md
|
||||||
|
case 'md-down':
|
||||||
|
return !quasar.screen.lg && !quasar.screen.xl
|
||||||
|
case 'md-up':
|
||||||
|
return !quasar.screen.xs && !quasar.screen.sm
|
||||||
|
case 'lg':
|
||||||
|
return quasar.screen.lg
|
||||||
|
case 'lg-down':
|
||||||
|
return !quasar.screen.xl
|
||||||
|
case 'lg-up':
|
||||||
|
return quasar.screen.lg || quasar.screen.xl
|
||||||
|
case 'xl':
|
||||||
|
return quasar.screen.xl
|
||||||
|
default:
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<ClientOnly>
|
||||||
|
<template #fallback>{{ props.fallback }}</template>
|
||||||
|
|
||||||
|
<Transition
|
||||||
|
:appear="props.appear"
|
||||||
|
:mode="props.mode"
|
||||||
|
:enter-active-class="`animate__animated ${props.enter}`"
|
||||||
|
:leave-active-class="`animate__animated ${props.leave}`"
|
||||||
|
>
|
||||||
|
<slot v-if="(quasar.screen.width || quasar.screen.height) && render" />
|
||||||
|
</Transition>
|
||||||
|
</ClientOnly>
|
||||||
|
</template>
|
|
@ -1,6 +1,6 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import sky from '~/assets/images/portal/sky.png'
|
import sky from '~/assets/images/textures/sky.png'
|
||||||
import particles from '~/assets/images/portal/particles.png'
|
import particles from '~/assets/images/textures/particles.png'
|
||||||
|
|
||||||
const resources: string[] = [sky, particles]
|
const resources: string[] = [sky, particles]
|
||||||
|
|
|
@ -21,7 +21,10 @@ const mailTemplate = `I've just found a bug on https://enderman.ch and would lik
|
||||||
<footer class="user-select-none text-align-center line-height-1-5">
|
<footer class="user-select-none text-align-center line-height-1-5">
|
||||||
<span
|
<span
|
||||||
class="font-small"
|
class="font-small"
|
||||||
:class="{ transpaque: !props.opaque, 'text-shadow': !props.opaque }"
|
:class="{
|
||||||
|
'footer-transparent': !props.opaque,
|
||||||
|
'text-shadow': !props.opaque,
|
||||||
|
}"
|
||||||
>
|
>
|
||||||
<EMail
|
<EMail
|
||||||
:class="{
|
:class="{
|
||||||
|
@ -45,7 +48,8 @@ const mailTemplate = `I've just found a bug on https://enderman.ch and would lik
|
||||||
href="https://enderman.ch"
|
href="https://enderman.ch"
|
||||||
>Enderman</a
|
>Enderman</a
|
||||||
>. All rights reserved.
|
>. All rights reserved.
|
||||||
<sub>
|
<wbr />
|
||||||
|
<sub class="nobr">
|
||||||
β{{ version ? version : '?.?.?' }} ({{
|
β{{ version ? version : '?.?.?' }} ({{
|
||||||
buildDate ? buildDate : '1970-01-01'
|
buildDate ? buildDate : '1970-01-01'
|
||||||
}})
|
}})
|
||||||
|
@ -55,15 +59,15 @@ const mailTemplate = `I've just found a bug on https://enderman.ch and would lik
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
.transpaque {
|
.footer-transparent {
|
||||||
color: white;
|
color: white;
|
||||||
|
|
||||||
opacity: 0.25;
|
opacity: 0.25;
|
||||||
transition: ease 0.3s;
|
transition: ease 0.3s;
|
||||||
}
|
|
||||||
|
|
||||||
.transpaque:hover {
|
&:hover {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.line-height-1-5 {
|
.line-height-1-5 {
|
|
@ -28,9 +28,10 @@ const props = defineProps({
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<NuxtLink class="no-decoration user-select-none" to="/">
|
<div class="d-flex flex-row justify-content-sm-center">
|
||||||
<div
|
<NuxtLink
|
||||||
class="logo d-flex flex-row align-items-center justify-content-sm-center"
|
class="no-decoration logo d-flex flex-row align-items-center user-select-none"
|
||||||
|
to="/"
|
||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
class="logo-image"
|
class="logo-image"
|
||||||
|
@ -45,8 +46,8 @@ const props = defineProps({
|
||||||
<Separator />
|
<Separator />
|
||||||
<p class="mb-0">{{ props.description }}</p>
|
<p class="mb-0">{{ props.description }}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</NuxtLink>
|
||||||
</NuxtLink>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
|
@ -3,28 +3,11 @@ import { storeToRefs } from 'pinia'
|
||||||
import { usePageStore } from '~/stores/pages'
|
import { usePageStore } from '~/stores/pages'
|
||||||
|
|
||||||
import logo from '~/assets/images/logo.gif'
|
import logo from '~/assets/images/logo.gif'
|
||||||
import aboutIcon from '~/assets/images/icons/info.png'
|
|
||||||
import projectIcon from '~/assets/images/icons/defrag.png'
|
|
||||||
import socialIcon from '~/assets/images/icons/user.png'
|
|
||||||
|
|
||||||
const pageStore = usePageStore()
|
const pageStore = usePageStore()
|
||||||
const { pages } = storeToRefs(pageStore)
|
const { pages } = storeToRefs(pageStore)
|
||||||
|
|
||||||
const links = toRaw(pages.value).filter((page) => page.path !== '/')
|
const links = toRaw(pages.value).filter((page) => page.path !== '/')
|
||||||
const icons = [
|
|
||||||
{
|
|
||||||
src: aboutIcon,
|
|
||||||
alt: 'Information',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
src: projectIcon,
|
|
||||||
alt: 'Blocks',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
src: socialIcon,
|
|
||||||
alt: 'Users',
|
|
||||||
},
|
|
||||||
]
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
@ -41,11 +24,11 @@ const icons = [
|
||||||
class="navbar-nav flex-row align-items-center align-items-sm-start align-items-lg-center justify-content-center gap-3 m-2 m-sm-0 mx-lg-2 my-sm-2 my-lg-0"
|
class="navbar-nav flex-row align-items-center align-items-sm-start align-items-lg-center justify-content-center gap-3 m-2 m-sm-0 mx-lg-2 my-sm-2 my-lg-0"
|
||||||
>
|
>
|
||||||
<li v-for="(page, index) in links" :key="index" class="nav-item">
|
<li v-for="(page, index) in links" :key="index" class="nav-item">
|
||||||
<LinkButton
|
<Route
|
||||||
:path="page.path"
|
:path="page.path"
|
||||||
:name="page.name"
|
:name="page.name"
|
||||||
:icon="icons[index].src"
|
:icon="page.icon!.src"
|
||||||
:alt="icons[index].alt"
|
:alt="page.icon!.alt"
|
||||||
/>
|
/>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
|
@ -0,0 +1,66 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { useQuasar } from 'quasar'
|
||||||
|
|
||||||
|
import Dialog from '~/components/ui/Dialog.vue'
|
||||||
|
import cogIcon from '~/assets/images/icons/cog.png'
|
||||||
|
import pearlIcon from '~/assets/images/icons/pearl.gif'
|
||||||
|
|
||||||
|
const quasar = useQuasar()
|
||||||
|
|
||||||
|
function optionsMenu() {
|
||||||
|
quasar
|
||||||
|
.dialog({
|
||||||
|
component: Dialog,
|
||||||
|
componentProps: {
|
||||||
|
icon: pearlIcon,
|
||||||
|
alt: 'Pearl',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
.onOk(() => {
|
||||||
|
console.log('OK')
|
||||||
|
})
|
||||||
|
.onCancel(() => {
|
||||||
|
console.log('Cancel')
|
||||||
|
})
|
||||||
|
.onDismiss(() => {
|
||||||
|
console.log('OK or Cancel (Dialog Dismissed)')
|
||||||
|
})
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="options-layout pass-through">
|
||||||
|
<div class="options clickable" @click="optionsMenu()">
|
||||||
|
<img
|
||||||
|
class="logo user-select-none"
|
||||||
|
draggable="false"
|
||||||
|
:src="cogIcon"
|
||||||
|
alt="Options"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.options {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
padding: 10px;
|
||||||
|
|
||||||
|
&-layout {
|
||||||
|
position: fixed;
|
||||||
|
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo {
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -33,7 +33,7 @@ const props = defineProps({
|
||||||
:src="props.icon"
|
:src="props.icon"
|
||||||
:alt="props.alt"
|
:alt="props.alt"
|
||||||
/>
|
/>
|
||||||
<span class="display-xs-none">
|
<span class="display-sm">
|
||||||
<strong>
|
<strong>
|
||||||
{{ props.name }}
|
{{ props.name }}
|
||||||
</strong>
|
</strong>
|
||||||
|
@ -48,8 +48,8 @@ const props = defineProps({
|
||||||
}
|
}
|
||||||
|
|
||||||
&-image {
|
&-image {
|
||||||
width: 1.5em;
|
width: 32px;
|
||||||
height: 1.5em;
|
height: 32px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
|
@ -0,0 +1,61 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'
|
||||||
|
import { storeToRefs } from 'pinia'
|
||||||
|
import { usePageStore } from '~/stores/pages'
|
||||||
|
|
||||||
|
const pageStore = usePageStore()
|
||||||
|
const { pages } = storeToRefs(pageStore)
|
||||||
|
|
||||||
|
const route = useRoute()
|
||||||
|
const state = computed(() => {
|
||||||
|
const i = pages.value.indexOf(
|
||||||
|
pages.value.find((page) => page.path === route.fullPath)!,
|
||||||
|
)
|
||||||
|
|
||||||
|
return {
|
||||||
|
current: route.fullPath,
|
||||||
|
index: i,
|
||||||
|
next: toRaw(pages.value)[(i + 1) % pages.value.length].path,
|
||||||
|
prev: toRaw(pages.value)[i - 1 < 0 ? pages.value.length - (i + 1) : i - 1]
|
||||||
|
.path,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="control-layout pass-through">
|
||||||
|
<NuxtLink class="control-icon no-decoration" :to="state.prev">
|
||||||
|
<FontAwesomeIcon icon="fa-solid fa-angle-left" fixed-width />
|
||||||
|
</NuxtLink>
|
||||||
|
|
||||||
|
<NuxtLink class="control-icon no-decoration" :to="state.next">
|
||||||
|
<FontAwesomeIcon icon="fa-solid fa-angle-right" fixed-width />
|
||||||
|
</NuxtLink>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.control {
|
||||||
|
&-layout {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
position: fixed;
|
||||||
|
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
&-icon {
|
||||||
|
opacity: 0.25;
|
||||||
|
transition: 0.15s ease;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -0,0 +1,84 @@
|
||||||
|
<script setup>
|
||||||
|
import { useDialogPluginComponent } from 'quasar'
|
||||||
|
|
||||||
|
const { dialogRef, onDialogHide, onDialogOK, onDialogCancel } =
|
||||||
|
useDialogPluginComponent()
|
||||||
|
|
||||||
|
defineEmits({
|
||||||
|
...useDialogPluginComponent.emitsObject,
|
||||||
|
})
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
icon: {
|
||||||
|
type: String,
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
|
alt: {
|
||||||
|
type: String,
|
||||||
|
default: 'Icon',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
const theme = ref(false)
|
||||||
|
const animation = ref(true)
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<QDialog ref="dialogRef" @hide="onDialogHide">
|
||||||
|
<QCard class="dialog">
|
||||||
|
<div class="overlay background"></div>
|
||||||
|
<div class="overlay content">
|
||||||
|
<img
|
||||||
|
class="icon-badge user-select-none"
|
||||||
|
draggable="false"
|
||||||
|
:src="props.icon"
|
||||||
|
:alt="props.alt"
|
||||||
|
/>
|
||||||
|
<QCardSection>
|
||||||
|
<h3 class="alex text-align-center">Site options</h3>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12 col-sm-6">
|
||||||
|
<p>
|
||||||
|
<strong>Theme</strong><br />
|
||||||
|
Available in all flavors, vanilla and chocolate.
|
||||||
|
</p>
|
||||||
|
<QToggle
|
||||||
|
v-model="theme"
|
||||||
|
class="px-5"
|
||||||
|
color="black"
|
||||||
|
dense
|
||||||
|
size="xl"
|
||||||
|
:unchecked-icon="mdiWhiteBalanceSunny"
|
||||||
|
:checked-icon="mdiWeatherNight"
|
||||||
|
icon-color="primary"
|
||||||
|
@change="theme = !theme"
|
||||||
|
/>
|
||||||
|
<QCheckbox v-model="theme" />
|
||||||
|
</div>
|
||||||
|
<div class="col-12 col-sm-6">
|
||||||
|
<p>
|
||||||
|
<strong>Animation</strong><br />
|
||||||
|
Some computers may have issues rendering that gorgeous
|
||||||
|
background animation. Enabling it substantially increases power
|
||||||
|
consumption.
|
||||||
|
</p>
|
||||||
|
<QToggle
|
||||||
|
v-model="animation"
|
||||||
|
color="purple"
|
||||||
|
dense
|
||||||
|
size="xl"
|
||||||
|
:unchecked-icon="mdiStop"
|
||||||
|
:checked-icon="mdiPlay"
|
||||||
|
@change="theme = !theme"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
Report a bug
|
||||||
|
<QCardActions>
|
||||||
|
<QBtn label="OK" @click="onDialogOK" />
|
||||||
|
</QCardActions>
|
||||||
|
</QCardSection>
|
||||||
|
</div>
|
||||||
|
</QCard>
|
||||||
|
</QDialog>
|
||||||
|
</template>
|
|
@ -10,7 +10,6 @@ const card = ref<HTMLElement | null>(null)
|
||||||
|
|
||||||
const pageStore = usePageStore()
|
const pageStore = usePageStore()
|
||||||
const { pages } = storeToRefs(pageStore)
|
const { pages } = storeToRefs(pageStore)
|
||||||
|
|
||||||
const swipe = useSwipe(card, {
|
const swipe = useSwipe(card, {
|
||||||
passive: true,
|
passive: true,
|
||||||
onSwipeEnd: (_touch: TouchEvent, _direction: UseSwipeDirection) => {
|
onSwipeEnd: (_touch: TouchEvent, _direction: UseSwipeDirection) => {
|
||||||
|
@ -42,8 +41,9 @@ const swipe = useSwipe(card, {
|
||||||
<template>
|
<template>
|
||||||
<main
|
<main
|
||||||
ref="card"
|
ref="card"
|
||||||
class="dimensions background rounded-1 overflow-auto d-flex flex-column gap-3 gap-sm-2 px-4 pt-4 pb-3"
|
class="dimensions background rounded-1-sm overflow-auto d-flex flex-column gap-3 gap-sm-2 px-4 pt-4 pb-3"
|
||||||
>
|
>
|
||||||
|
<Options />
|
||||||
<Navigation />
|
<Navigation />
|
||||||
<slot name="header" />
|
<slot name="header" />
|
||||||
<NuxtPage
|
<NuxtPage
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
import packageJSON from './package.json'
|
import packageJSON from './package.json'
|
||||||
|
|
||||||
const websiteName = "Enderman's Website"
|
const websiteName = "Enderman's Website"
|
||||||
const websiteURL = 'https://enderman.ch'
|
const websiteURL = 'https://enderman.ch'
|
||||||
|
|
||||||
|
@ -59,6 +58,7 @@ export default defineNuxtConfig({
|
||||||
'nuxt-simple-robots',
|
'nuxt-simple-robots',
|
||||||
'nuxt-link-checker',
|
'nuxt-link-checker',
|
||||||
'nuxt-og-image',
|
'nuxt-og-image',
|
||||||
|
'@nuxtjs/strapi',
|
||||||
],
|
],
|
||||||
nitro: {
|
nitro: {
|
||||||
prerender: {
|
prerender: {
|
||||||
|
@ -70,6 +70,26 @@ export default defineNuxtConfig({
|
||||||
},
|
},
|
||||||
quasar: {
|
quasar: {
|
||||||
lang: 'en-US',
|
lang: 'en-US',
|
||||||
|
plugins: ['Dark', 'Dialog'],
|
||||||
|
config: {
|
||||||
|
brand: {
|
||||||
|
primary: '#271249',
|
||||||
|
secondary: '#00A2ED',
|
||||||
|
accent: '#9C27B0',
|
||||||
|
|
||||||
|
dark: '#1D1D1D',
|
||||||
|
'dark-page': '#121212',
|
||||||
|
|
||||||
|
positive: '#21BA45',
|
||||||
|
negative: '#C10015',
|
||||||
|
info: '#31CCEC',
|
||||||
|
warning: '#F2C037',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
extras: {
|
||||||
|
font: null,
|
||||||
|
svgIcons: ['mdi-v7'],
|
||||||
|
},
|
||||||
},
|
},
|
||||||
googleFonts: {
|
googleFonts: {
|
||||||
download: true,
|
download: true,
|
||||||
|
|
60
package.json
|
@ -14,51 +14,53 @@
|
||||||
"lintfix": "prettier --write --list-different . && npm run lint:js -- --fix"
|
"lintfix": "prettier --write --list-different . && npm run lint:js -- --fix"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@nuxt/content": "^2.9.0",
|
"@nuxt/content": "^2.11.0",
|
||||||
"@nuxt/devtools": "latest",
|
"@nuxt/devtools": "latest",
|
||||||
"@nuxt/types": "^2.17.2",
|
"@nuxt/types": "^2.17.3",
|
||||||
"@nuxtjs/color-mode": "^3.3.2",
|
"@nuxtjs/color-mode": "^3.3.2",
|
||||||
"@nuxtjs/eslint-config-typescript": "^12.1.0",
|
"@nuxtjs/eslint-config-typescript": "^12.1.0",
|
||||||
"@nuxtjs/eslint-module": "^4.1.0",
|
"@nuxtjs/eslint-module": "^4.1.0",
|
||||||
"@nuxtjs/google-fonts": "^3.1.0",
|
"@nuxtjs/google-fonts": "^3.1.3",
|
||||||
|
"@nuxtjs/strapi": "^1.11.0",
|
||||||
"@nuxtjs/stylelint-module": "^5.1.0",
|
"@nuxtjs/stylelint-module": "^5.1.0",
|
||||||
"@pinia/nuxt": "^0.5.1",
|
"@pinia/nuxt": "^0.5.1",
|
||||||
"@quasar/extras": "^1.16.8",
|
"@typescript-eslint/parser": "^6.19.1",
|
||||||
"@typescript-eslint/parser": "^6.10.0",
|
"animate.css": "latest",
|
||||||
"caniuse-lite": "^1.0.30001564",
|
"bootstrap": "^5.3.2",
|
||||||
|
"caniuse-lite": "^1.0.30001579",
|
||||||
"csso": "^5.0.5",
|
"csso": "^5.0.5",
|
||||||
"eslint": "^8.53.0",
|
"eslint": "^8.56.0",
|
||||||
"eslint-config-prettier": "^9.0.0",
|
"eslint-config-prettier": "^9.1.0",
|
||||||
"eslint-plugin-nuxt": "^4.0.0",
|
"eslint-plugin-nuxt": "^4.0.0",
|
||||||
"eslint-plugin-prettier": "^5.0.1",
|
"eslint-plugin-prettier": "^5.1.3",
|
||||||
"nuxt": "^3.8.1",
|
"nuxt": "^3.9.3",
|
||||||
"nuxt-link-checker": "^2.1.10",
|
"nuxt-link-checker": "^2.1.11",
|
||||||
"nuxt-og-image": "^2.2.4",
|
"nuxt-og-image": "^2.2.4",
|
||||||
"nuxt-quasar-ui": "^2.0.6",
|
"nuxt-quasar-ui": "^2.0.7",
|
||||||
"nuxt-simple-robots": "^3.1.9",
|
"nuxt-simple-robots": "^4.0.0-rc.13",
|
||||||
"nuxt-simple-sitemap": "^4.1.6",
|
"nuxt-simple-sitemap": "^4.4.1",
|
||||||
|
"nuxt-site-config": "^2.2.8",
|
||||||
"pinia": "^2.1.7",
|
"pinia": "^2.1.7",
|
||||||
"prettier": "^3.1.0",
|
"prettier": "^3.2.4",
|
||||||
"quasar": "^2.14.0",
|
"quasar": "^2.14.2",
|
||||||
"sass": "^1.69.5",
|
"sass": "^1.70.0",
|
||||||
"stylelint": "^15.11.0",
|
"stylelint": "^15.11.0",
|
||||||
"stylelint-config-recommended-vue": "^1.5.0",
|
"stylelint-config-recommended-vue": "^1.5.0",
|
||||||
"stylelint-config-standard-scss": "^11.1.0",
|
"stylelint-config-standard-scss": "^11.0.0",
|
||||||
"typescript": "^5.3.2",
|
"typescript": "^5.3.3",
|
||||||
"vite-plugin-require": "^0.0.3",
|
"vite-plugin-require": "^1.1.14",
|
||||||
"vue": "^3.3.8",
|
"vue": "^3.4.15",
|
||||||
"vue-router": "^4.2.5",
|
"vue-router": "^4.2.5",
|
||||||
"vue-tsc": "^1.8.22"
|
"vue-tsc": "^1.8.27"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fortawesome/fontawesome-free": "^6.4.2",
|
"@fortawesome/fontawesome-free": "^6.5.1",
|
||||||
"@fortawesome/fontawesome-svg-core": "^6.4.2",
|
"@fortawesome/fontawesome-svg-core": "^6.5.1",
|
||||||
"@fortawesome/free-brands-svg-icons": "^6.4.2",
|
"@fortawesome/free-brands-svg-icons": "^6.5.1",
|
||||||
"@fortawesome/free-regular-svg-icons": "^6.4.2",
|
"@fortawesome/free-regular-svg-icons": "^6.5.1",
|
||||||
"@fortawesome/free-solid-svg-icons": "^6.4.2",
|
"@fortawesome/free-solid-svg-icons": "^6.5.1",
|
||||||
"@fortawesome/vue-fontawesome": "^3.0.5",
|
"@fortawesome/vue-fontawesome": "^3.0.5",
|
||||||
"animate.css": "^4.1.1",
|
"@quasar/extras": "^1.16.9"
|
||||||
"bootstrap": "^5.3.2"
|
|
||||||
},
|
},
|
||||||
"version": "0.1.3"
|
"version": "0.1.3"
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,8 +37,6 @@ useHead({
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
})
|
})
|
||||||
|
|
||||||
defineRobotMeta()
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
|
|
@ -37,8 +37,6 @@ useHead({
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
})
|
})
|
||||||
|
|
||||||
defineRobotMeta()
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
|
|
@ -64,8 +64,6 @@ useHead({
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
})
|
})
|
||||||
|
|
||||||
defineRobotMeta()
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
|
|
@ -84,8 +84,6 @@ useHead({
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
})
|
})
|
||||||
|
|
||||||
defineRobotMeta()
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
@ -93,6 +91,7 @@ defineRobotMeta()
|
||||||
<h3 class="alex">Online presence</h3>
|
<h3 class="alex">Online presence</h3>
|
||||||
<hr />
|
<hr />
|
||||||
<p>
|
<p>
|
||||||
|
<FontAwesomeIcon icon="fa-solid fa-" fixed-width />
|
||||||
<strong>🚧 This page is currently under construction.</strong> Expect a
|
<strong>🚧 This page is currently under construction.</strong> Expect a
|
||||||
lot more content to be added as time passes.
|
lot more content to be added as time passes.
|
||||||
<em>Please report all bugs you encounter via the link in the footer</em>,
|
<em>Please report all bugs you encounter via the link in the footer</em>,
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
import { library, config } from '@fortawesome/fontawesome-svg-core'
|
import { library, config } from '@fortawesome/fontawesome-svg-core'
|
||||||
import { fab } from '@fortawesome/free-brands-svg-icons'
|
import { fab } from '@fortawesome/free-brands-svg-icons'
|
||||||
|
import { fas } from '@fortawesome/free-solid-svg-icons'
|
||||||
|
|
||||||
import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'
|
import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'
|
||||||
|
|
||||||
// Add icon packs.
|
// Add icon packs.
|
||||||
library.add(fab)
|
library.add(fab, fas)
|
||||||
|
|
||||||
// Let Nuxt manage CSS.
|
// Let Nuxt manage CSS.
|
||||||
config.autoAddCss = false
|
config.autoAddCss = false
|
||||||
|
|
|
@ -7,4 +7,6 @@ export default defineNuxtPlugin(() => {
|
||||||
lg: 1281,
|
lg: 1281,
|
||||||
xl: 1921,
|
xl: 1921,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Screen.setDebounce(0)
|
||||||
})
|
})
|
||||||
|
|
|
@ -1,5 +1,10 @@
|
||||||
import { defineStore } from 'pinia'
|
import { defineStore } from 'pinia'
|
||||||
|
|
||||||
|
import aboutIcon from '~/assets/images/icons/info.png'
|
||||||
|
import projectIcon from '~/assets/images/icons/defrag.png'
|
||||||
|
import socialIcon from '~/assets/images/icons/user.png'
|
||||||
|
import blogIcon from '~/assets/images/icons/book.png'
|
||||||
|
|
||||||
export const usePageStore = defineStore('page', () => {
|
export const usePageStore = defineStore('page', () => {
|
||||||
const title: string = 'Enderman'
|
const title: string = 'Enderman'
|
||||||
const description: string = 'official website'
|
const description: string = 'official website'
|
||||||
|
@ -14,14 +19,34 @@ export const usePageStore = defineStore('page', () => {
|
||||||
{
|
{
|
||||||
name: 'About',
|
name: 'About',
|
||||||
path: '/about',
|
path: '/about',
|
||||||
|
icon: {
|
||||||
|
src: aboutIcon,
|
||||||
|
alt: 'Information',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'Projects',
|
name: 'Projects',
|
||||||
path: '/projects',
|
path: '/projects',
|
||||||
|
icon: {
|
||||||
|
src: projectIcon,
|
||||||
|
alt: 'Blocks',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'Socials',
|
name: 'Socials',
|
||||||
path: '/social',
|
path: '/social',
|
||||||
|
icon: {
|
||||||
|
src: socialIcon,
|
||||||
|
alt: 'Users',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Blog',
|
||||||
|
path: '/blog',
|
||||||
|
icon: {
|
||||||
|
src: blogIcon,
|
||||||
|
alt: 'Book',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|