main layout
This commit is contained in:
parent
62990170de
commit
f1e6e8b8d3
38 changed files with 1353 additions and 20 deletions
|
@ -2,9 +2,9 @@
|
|||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" href="/favicon.ico" />
|
||||
<link rel="icon" type="image/svg" href="/FW-Wappen.svg" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Fireportal</title>
|
||||
<title>Mitgliederverwaltung</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
|
|
20
package-lock.json
generated
20
package-lock.json
generated
|
@ -10,7 +10,9 @@
|
|||
"license": "GPL-3.0-only",
|
||||
"dependencies": {
|
||||
"@headlessui/vue": "^1.7.13",
|
||||
"@heroicons/vue": "^1.0.6",
|
||||
"axios": "^0.26.1",
|
||||
"jwt-decode": "^4.0.0",
|
||||
"nprogress": "^0.2.0",
|
||||
"pdf-dist": "^1.0.0",
|
||||
"pinia": "^2.1.7",
|
||||
|
@ -2417,6 +2419,15 @@
|
|||
"vue": "^3.2.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@heroicons/vue": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/@heroicons/vue/-/vue-1.0.6.tgz",
|
||||
"integrity": "sha512-ng2YcCQrdoQWEFpw+ipFl2rZo8mZ56v0T5+MyfQQvNqfKChwgP6DMloZLW+rl17GEcHkE3H82UTAMKBKZr4+WA==",
|
||||
"license": "MIT",
|
||||
"peerDependencies": {
|
||||
"vue": ">= 3"
|
||||
}
|
||||
},
|
||||
"node_modules/@humanwhocodes/config-array": {
|
||||
"version": "0.11.14",
|
||||
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
|
||||
|
@ -6500,6 +6511,15 @@
|
|||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/jwt-decode": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz",
|
||||
"integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/keyv": {
|
||||
"version": "4.5.4",
|
||||
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
|
||||
|
|
|
@ -25,7 +25,9 @@
|
|||
"license": "GPL-3.0-only",
|
||||
"dependencies": {
|
||||
"@headlessui/vue": "^1.7.13",
|
||||
"@heroicons/vue": "^1.0.6",
|
||||
"axios": "^0.26.1",
|
||||
"jwt-decode": "^4.0.0",
|
||||
"nprogress": "^0.2.0",
|
||||
"pdf-dist": "^1.0.0",
|
||||
"pinia": "^2.1.7",
|
||||
|
|
1
public/FFW-Logo.svg
Normal file
1
public/FFW-Logo.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 6.4 KiB |
BIN
public/FW-Wappen.ico
Normal file
BIN
public/FW-Wappen.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 56 KiB |
BIN
public/FW-Wappen.png
Normal file
BIN
public/FW-Wappen.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 516 KiB |
1
public/FW-Wappen.svg
Normal file
1
public/FW-Wappen.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 295 KiB |
35
src/App.vue
35
src/App.vue
|
@ -1,9 +1,32 @@
|
|||
<template>
|
||||
<Header @contextmenu.prevent />
|
||||
<div class="grow overflow-x-hidden overflow-y-auto p-2 md:p-4" @contextmenu.prevent>
|
||||
<RouterView />
|
||||
</div>
|
||||
<Footer @contextmenu.prevent />
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { RouterLink, RouterView } from "vue-router";
|
||||
import { defineComponent } from "vue";
|
||||
import { RouterView } from "vue-router";
|
||||
import Header from "./components/Header.vue";
|
||||
import Footer from "./components/Footer.vue";
|
||||
import { mapState } from "pinia";
|
||||
import { useAuthStore } from "./stores/auth";
|
||||
import { isAuthenticatedPromise } from "./router/authGuards";
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<header>Header</header>
|
||||
|
||||
<RouterView />
|
||||
</template>
|
||||
<script lang="ts">
|
||||
export default defineComponent({
|
||||
computed: {
|
||||
...mapState(useAuthStore, ["authCheck"]),
|
||||
},
|
||||
mounted() {
|
||||
if (!this.authCheck && localStorage.getItem("access_token")) {
|
||||
isAuthenticatedPromise().catch(() => {
|
||||
localStorage.removeItem("access_token");
|
||||
});
|
||||
}
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
|
61
src/components/FailureXMark.vue
Normal file
61
src/components/FailureXMark.vue
Normal file
|
@ -0,0 +1,61 @@
|
|||
<template>
|
||||
<svg class="checkmark min-w-fit min-h-fit" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 52 52">
|
||||
<circle class="checkmark__circle" cx="26" cy="26" r="25" fill="none" />
|
||||
<path class="checkmark__check" fill="none" d="M 11 11 l 30 30 M 11 41 l 30 -30" />
|
||||
<!-- <path class="checkmark__check" fill="none" d="M14.1 27.2l7.1 7.2 16.7-16.8" /> -->
|
||||
</svg>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.checkmark__circle {
|
||||
stroke-dasharray: 166;
|
||||
stroke-dashoffset: 166;
|
||||
stroke-width: 2;
|
||||
stroke-miterlimit: 10;
|
||||
stroke: #ff0000;
|
||||
fill: none;
|
||||
animation: stroke 0.6s cubic-bezier(0.65, 0, 0.45, 1) forwards;
|
||||
}
|
||||
|
||||
.checkmark {
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
border-radius: 50%;
|
||||
display: block;
|
||||
stroke-width: 5;
|
||||
stroke: #fff;
|
||||
stroke-miterlimit: 10;
|
||||
margin: auto 0;
|
||||
box-shadow: inset 0px 0px 0px #ff0000;
|
||||
animation:
|
||||
fill 0.4s ease-in-out 0.4s forwards,
|
||||
scale 0.3s ease-in-out 0.9s both;
|
||||
}
|
||||
|
||||
.checkmark__check {
|
||||
transform-origin: 50% 50%;
|
||||
stroke-dasharray: 48;
|
||||
stroke-dashoffset: 48;
|
||||
animation: stroke 0.3s cubic-bezier(0.65, 0, 0.45, 1) 0.8s forwards;
|
||||
}
|
||||
|
||||
@keyframes stroke {
|
||||
100% {
|
||||
stroke-dashoffset: 0;
|
||||
}
|
||||
}
|
||||
@keyframes scale {
|
||||
0%,
|
||||
100% {
|
||||
transform: none;
|
||||
}
|
||||
50% {
|
||||
transform: scale3d(1.1, 1.1, 1);
|
||||
}
|
||||
}
|
||||
@keyframes fill {
|
||||
100% {
|
||||
box-shadow: inset 0px 0px 0px 30px #ff0000;
|
||||
}
|
||||
}
|
||||
</style>
|
30
src/components/Footer.vue
Normal file
30
src/components/Footer.vue
Normal file
|
@ -0,0 +1,30 @@
|
|||
<template>
|
||||
<footer
|
||||
v-if="authCheck && routeName == 'admin'"
|
||||
class="md:hidden flex flex-row h-16 justify-center md:justify-normal p-1 bg-white"
|
||||
>
|
||||
<div class="w-full flex flex-row gap-2 h-full align-middle">
|
||||
<TopLevelLink v-for="item in topLevel" :key="item.key" :link="item" :disableSubLink="true" />
|
||||
</div>
|
||||
</footer>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { mapState } from "pinia";
|
||||
import { useAuthStore } from "../stores/auth";
|
||||
import { useNavigationStore } from "../stores/admin/navigation";
|
||||
import TopLevelLink from "./admin/TopLevelLink.vue";
|
||||
</script>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent } from "vue";
|
||||
export default defineComponent({
|
||||
computed: {
|
||||
...mapState(useAuthStore, ["authCheck"]),
|
||||
...mapState(useNavigationStore, ["topLevel"]),
|
||||
routeName() {
|
||||
return this.$route.name;
|
||||
},
|
||||
},
|
||||
});
|
||||
</script>
|
36
src/components/Header.vue
Normal file
36
src/components/Header.vue
Normal file
|
@ -0,0 +1,36 @@
|
|||
<template>
|
||||
<header class="flex flex-row h-16 justify-between p-3 md:px-5 bg-white shadow-sm">
|
||||
<RouterLink to="/" class="flex flex-row gap-2 align-bottom w-fit">
|
||||
<img src="/FFW-Logo.svg" alt="LOGO" class="h-full w-auto" />
|
||||
<h1 v-if="false" class="font-bold text-3xl w-fit whitespace-nowrap">Mitgliederverwaltung</h1>
|
||||
</RouterLink>
|
||||
<div class="flex flex-row gap-2 items-center">
|
||||
<div v-if="authCheck && routeName == 'admin'" class="hidden md:flex flex-row gap-2 h-full align-middle">
|
||||
<TopLevelLink v-for="item in topLevel" :key="item.key" :link="item" />
|
||||
</div>
|
||||
<UserMenu v-if="authCheck" />
|
||||
</div>
|
||||
</header>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { RouterLink } from "vue-router";
|
||||
import { mapState } from "pinia";
|
||||
import { useAuthStore } from "../stores/auth";
|
||||
import { useNavigationStore } from "../stores/admin/navigation";
|
||||
import TopLevelLink from "./admin/TopLevelLink.vue";
|
||||
import UserMenu from "./UserMenu.vue";
|
||||
</script>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent } from "vue";
|
||||
export default defineComponent({
|
||||
computed: {
|
||||
...mapState(useAuthStore, ["authCheck"]),
|
||||
...mapState(useNavigationStore, ["topLevel"]),
|
||||
routeName() {
|
||||
return this.$route.name;
|
||||
},
|
||||
},
|
||||
});
|
||||
</script>
|
3
src/components/Spinner.vue
Normal file
3
src/components/Spinner.vue
Normal file
|
@ -0,0 +1,3 @@
|
|||
<template>
|
||||
<div class="w-5 h-5 border-y-2 rounded-full border-gray-700 animate-spin" />
|
||||
</template>
|
60
src/components/SuccessCheckmark.vue
Normal file
60
src/components/SuccessCheckmark.vue
Normal file
|
@ -0,0 +1,60 @@
|
|||
<template>
|
||||
<svg class="checkmark min-w-fit min-h-fit" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 52 52">
|
||||
<circle class="checkmark__circle" cx="26" cy="26" r="25" fill="none" />
|
||||
<path class="checkmark__check" fill="none" d="M14.1 27.2l7.1 7.2 16.7-16.8" />
|
||||
</svg>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.checkmark__circle {
|
||||
stroke-dasharray: 166;
|
||||
stroke-dashoffset: 166;
|
||||
stroke-width: 2;
|
||||
stroke-miterlimit: 10;
|
||||
stroke: #7ac142;
|
||||
fill: none;
|
||||
animation: stroke 0.6s cubic-bezier(0.65, 0, 0.45, 1) forwards;
|
||||
}
|
||||
|
||||
.checkmark {
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
border-radius: 50%;
|
||||
display: block;
|
||||
stroke-width: 5;
|
||||
stroke: #fff;
|
||||
stroke-miterlimit: 10;
|
||||
margin: auto 0;
|
||||
box-shadow: inset 0px 0px 0px #7ac142;
|
||||
animation:
|
||||
fill 0.4s ease-in-out 0.4s forwards,
|
||||
scale 0.3s ease-in-out 0.9s both;
|
||||
}
|
||||
|
||||
.checkmark__check {
|
||||
transform-origin: 50% 50%;
|
||||
stroke-dasharray: 48;
|
||||
stroke-dashoffset: 48;
|
||||
animation: stroke 0.3s cubic-bezier(0.65, 0, 0.45, 1) 0.8s forwards;
|
||||
}
|
||||
|
||||
@keyframes stroke {
|
||||
100% {
|
||||
stroke-dashoffset: 0;
|
||||
}
|
||||
}
|
||||
@keyframes scale {
|
||||
0%,
|
||||
100% {
|
||||
transform: none;
|
||||
}
|
||||
50% {
|
||||
transform: scale3d(1.1, 1.1, 1);
|
||||
}
|
||||
}
|
||||
@keyframes fill {
|
||||
100% {
|
||||
box-shadow: inset 0px 0px 0px 30px #7ac142;
|
||||
}
|
||||
}
|
||||
</style>
|
53
src/components/UserMenu.vue
Normal file
53
src/components/UserMenu.vue
Normal file
|
@ -0,0 +1,53 @@
|
|||
<template>
|
||||
<Menu as="div" class="relative inline-block text-left self-center">
|
||||
<MenuButton class="cursor-pointer flex flex-row gap-2 p-1 w-fit h-fit box-content self-center">
|
||||
<UserIcon class="text-gray-500 h-6 w-6 cursor-pointer" />
|
||||
</MenuButton>
|
||||
|
||||
<transition
|
||||
enter-active-class="transition duration-100 ease-out"
|
||||
enter-from-class="transform scale-95 opacity-0"
|
||||
enter-to-class="transform scale-100 opacity-100"
|
||||
leave-active-class="transition duration-75 ease-in"
|
||||
leave-from-class="transform scale-100 opacity-100"
|
||||
leave-to-class="transform scale-95 opacity-0"
|
||||
>
|
||||
<MenuItems
|
||||
class="absolute right-0 mt-2 w-56 z-10 origin-top-right divide-y divide-gray-100 rounded-md bg-white shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none"
|
||||
>
|
||||
<div class="px-3 py-1 pt-2">
|
||||
<p class="text-xs">Angemeldet als</p>
|
||||
<p class="font-bold leading-4 text-base">{{ firstname + " " + lastname }}</p>
|
||||
</div>
|
||||
<div class="px-1 py-1 w-full flex flex-col gap-2">
|
||||
<MenuItem v-slot="{ close }">
|
||||
<RouterLink to="/account">
|
||||
<button button primary @click="close">Mein Account</button>
|
||||
</RouterLink>
|
||||
</MenuItem>
|
||||
<MenuItem>
|
||||
<button primary-outline @click="logoutAccount">ausloggen</button>
|
||||
</MenuItem>
|
||||
</div>
|
||||
</MenuItems>
|
||||
</transition>
|
||||
</Menu>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Menu, MenuButton, MenuItems, MenuItem } from "@headlessui/vue";
|
||||
import { mapState, mapActions } from "pinia";
|
||||
import { UserIcon } from "@heroicons/vue/outline";
|
||||
import { useAccountStore } from "@/stores/account";
|
||||
</script>
|
||||
|
||||
<script lang="ts">
|
||||
export default {
|
||||
computed: {
|
||||
...mapState(useAccountStore, ["firstname", "lastname"]),
|
||||
},
|
||||
methods: {
|
||||
...mapActions(useAccountStore, ["logoutAccount"]),
|
||||
},
|
||||
};
|
||||
</script>
|
38
src/components/admin/RoutingLink.vue
Normal file
38
src/components/admin/RoutingLink.vue
Normal file
|
@ -0,0 +1,38 @@
|
|||
<template>
|
||||
<div
|
||||
v-if="link"
|
||||
class="cursor-pointer w-full px-2 py-3"
|
||||
:class="
|
||||
activeLink?.key == link.key
|
||||
? 'rounded-r-lg bg-red-200 border-l-4 border-l-primary'
|
||||
: 'pl-3 hover:bg-red-200 rounded-lg'
|
||||
"
|
||||
@click="setLink(link.key)"
|
||||
>
|
||||
{{ link.title }}
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { mapState, mapActions } from "pinia";
|
||||
import { useNavigationStore, type navigationLinkModel } from "@/stores/admin/navigation";
|
||||
</script>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent, type PropType } from "vue";
|
||||
export default defineComponent({
|
||||
props: {
|
||||
link: {
|
||||
type: Object as PropType<navigationLinkModel>,
|
||||
default: null,
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
...mapState(useNavigationStore, ["activeLink"]),
|
||||
},
|
||||
methods: {
|
||||
...mapActions(useNavigationStore, ["setLink"]),
|
||||
},
|
||||
});
|
||||
</script>
|
||||
@/stores/contest/viewManager
|
41
src/components/admin/TopLevelLink.vue
Normal file
41
src/components/admin/TopLevelLink.vue
Normal file
|
@ -0,0 +1,41 @@
|
|||
<template>
|
||||
<div
|
||||
v-if="link"
|
||||
class="cursor-pointer w-full flex flex-col md:flex-row items-center md:gap-2 justify-center p-1 md:rounded-full md:px-3 font-medium text-center text-base self-center"
|
||||
:class="
|
||||
activeNavigation == link.key
|
||||
? 'text-primary md:bg-primary md:text-white'
|
||||
: 'text-gray-700 hover:text-accent md:hover:bg-accent md:hover:text-white'
|
||||
"
|
||||
@click="setTopLevel(link.key, disableSubLink)"
|
||||
>
|
||||
{{ link.title }}
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { mapState, mapActions } from "pinia";
|
||||
import { useNavigationStore, type topLevelNavigationModel } from "@/stores/admin/navigation";
|
||||
</script>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent, type PropType } from "vue";
|
||||
export default defineComponent({
|
||||
props: {
|
||||
link: {
|
||||
type: Object as PropType<topLevelNavigationModel>,
|
||||
default: null,
|
||||
},
|
||||
disableSubLink: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
...mapState(useNavigationStore, ["activeNavigation"]),
|
||||
},
|
||||
methods: {
|
||||
...mapActions(useNavigationStore, ["setTopLevel"]),
|
||||
},
|
||||
});
|
||||
</script>
|
15
src/globalProperties.config.ts
Normal file
15
src/globalProperties.config.ts
Normal file
|
@ -0,0 +1,15 @@
|
|||
import type { AxiosInstance } from "axios";
|
||||
import type { NProgress } from "nprogress";
|
||||
import type { Router } from "vue-router";
|
||||
|
||||
declare module "@vue/runtime-core" {
|
||||
interface ComponentCustomProperties {
|
||||
$dev: boolean;
|
||||
$http: AxiosInstance;
|
||||
$progress: NProgress;
|
||||
$router: Router;
|
||||
$route: any;
|
||||
}
|
||||
}
|
||||
|
||||
export {}; // Important! See note.
|
7
src/layouts/FullContent.vue
Normal file
7
src/layouts/FullContent.vue
Normal file
|
@ -0,0 +1,7 @@
|
|||
<template>
|
||||
<div class="w-full h-full flex flex-row gap-4">
|
||||
<div class="max-w-full flex grow gap-4 md:flex-row flex-col">
|
||||
<slot name="main"></slot>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
36
src/layouts/Sidebar.vue
Normal file
36
src/layouts/Sidebar.vue
Normal file
|
@ -0,0 +1,36 @@
|
|||
<template>
|
||||
<div class="w-full h-full flex flex-row gap-4">
|
||||
<div
|
||||
class="flex-col gap-4 md:min-w-72 lg:min-w-96"
|
||||
:class="defaultRoute && defaultSidebar ? 'flex w-full md:w-72 lg:w-96' : 'hidden md:flex'"
|
||||
>
|
||||
<slot name="sidebar"></slot>
|
||||
</div>
|
||||
<div class="max-w-full grow flex-col gap-4" :class="defaultRoute && defaultSidebar ? 'hidden md:flex' : 'flex'">
|
||||
<slot name="main"></slot>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { defineComponent } from "vue";
|
||||
import { mapState, mapActions } from "pinia";
|
||||
import { useNavigationStore } from "../stores/admin/navigation";
|
||||
</script>
|
||||
|
||||
<script lang="ts">
|
||||
export default defineComponent({
|
||||
props: {
|
||||
defaultSidebar: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
...mapState(useNavigationStore, ["activeLink"]),
|
||||
defaultRoute() {
|
||||
return this.activeLink == null;
|
||||
},
|
||||
},
|
||||
});
|
||||
</script>
|
47
src/main.css
47
src/main.css
|
@ -2,6 +2,27 @@
|
|||
@tailwind components;
|
||||
@tailwind utilities;
|
||||
|
||||
@layer base {
|
||||
:root {
|
||||
--primary: #990b00;
|
||||
--secondary: #0c6672;
|
||||
--accent: #bb1e10;
|
||||
--error: #9a0d55;
|
||||
--warning: #bb6210;
|
||||
--info: #388994;
|
||||
--success: #73ad0f;
|
||||
}
|
||||
.dark {
|
||||
--primary: #ff0d00;
|
||||
--secondary: #0f9aa9;
|
||||
--accent: #bb1e10;
|
||||
--error: #9a0d55;
|
||||
--warning: #bb6210;
|
||||
--info: #4ccbda;
|
||||
--success: #73ad0f;
|
||||
}
|
||||
}
|
||||
|
||||
/* ===== Scrollbar CSS ===== */
|
||||
/* Firefox */
|
||||
* {
|
||||
|
@ -27,10 +48,34 @@
|
|||
|
||||
html,
|
||||
body {
|
||||
@apply h-full w-screen m-0 p-0 overflow-hidden bg-white;
|
||||
@apply h-full w-screen m-0 p-0 overflow-hidden bg-gray-100;
|
||||
height: 100svh;
|
||||
}
|
||||
|
||||
#app {
|
||||
@apply w-full h-full overflow-hidden flex flex-col;
|
||||
}
|
||||
|
||||
button:not([headlessui]),
|
||||
a[button]:not([headlessui]) {
|
||||
@apply relative box-border h-10 w-full flex justify-center py-2 px-4 text-sm font-medium rounded-md focus:outline-none focus:ring-0;
|
||||
}
|
||||
|
||||
button[primary]:not([primary="false"]),
|
||||
a[button][primary]:not([primary="false"]) {
|
||||
@apply border border-transparent text-white bg-primary hover:bg-primary;
|
||||
}
|
||||
|
||||
button[primary-outline]:not([primary-outline="false"]),
|
||||
a[button][primary-outline]:not([primary-outline="false"]) {
|
||||
@apply border-2 border-primary text-black hover:bg-primary;
|
||||
}
|
||||
|
||||
button:disabled {
|
||||
@apply opacity-75 pointer-events-none;
|
||||
}
|
||||
|
||||
input:not([type="checkbox"]),
|
||||
textarea {
|
||||
@apply rounded-md shadow-sm relative block w-full px-3 py-2 border border-gray-300 focus:border-primary placeholder-gray-500 text-gray-900 rounded-b-md focus:outline-none focus:ring-0 focus:z-10 sm:text-sm resize-none;
|
||||
}
|
||||
|
|
|
@ -3,11 +3,19 @@ import { createPinia } from "pinia";
|
|||
|
||||
import App from "./App.vue";
|
||||
import router from "./router";
|
||||
import NProgress from "nprogress";
|
||||
import "../node_modules/nprogress/nprogress.css";
|
||||
|
||||
import { http } from "./serverCom";
|
||||
import "./main.css";
|
||||
|
||||
NProgress.configure({ showSpinner: false });
|
||||
|
||||
const app = createApp(App);
|
||||
|
||||
app.use(createPinia());
|
||||
app.use(router);
|
||||
app.config.globalProperties.$http = http;
|
||||
app.config.globalProperties.$progress = NProgress;
|
||||
|
||||
app.mount("#app");
|
||||
|
|
9
src/router/accountGuard.ts
Normal file
9
src/router/accountGuard.ts
Normal file
|
@ -0,0 +1,9 @@
|
|||
import { useAccountStore } from "@/stores/account";
|
||||
|
||||
export async function loadAccountData(to: any, from: any, next: any) {
|
||||
const account = useAccountStore();
|
||||
account.fetchAccountContests();
|
||||
account.fetchAccountInvites();
|
||||
account.fetchAccountLicense();
|
||||
next();
|
||||
}
|
41
src/router/authGuards.ts
Normal file
41
src/router/authGuards.ts
Normal file
|
@ -0,0 +1,41 @@
|
|||
import NProgress from "nprogress";
|
||||
import { useAuthStore } from "@/stores/auth";
|
||||
import { useAccountStore } from "@/stores/account";
|
||||
import { jwtDecode, type JwtPayload } from "jwt-decode";
|
||||
|
||||
type Payload = JwtPayload & { userId: number; username: string; firstname: string; lastname: string; mail: string };
|
||||
|
||||
export async function isAuthenticated(to: any, from: any, next: any) {
|
||||
const auth = useAuthStore();
|
||||
NProgress.start();
|
||||
if (auth.authCheck && localStorage.getItem("access_token")) {
|
||||
NProgress.done();
|
||||
next();
|
||||
return;
|
||||
}
|
||||
await isAuthenticatedPromise()
|
||||
.then(async (result: any) => {
|
||||
NProgress.done();
|
||||
next();
|
||||
})
|
||||
.catch((err: Error) => {
|
||||
NProgress.done();
|
||||
next({ name: "login" });
|
||||
});
|
||||
}
|
||||
|
||||
export async function isAuthenticatedPromise(): Promise<Payload> {
|
||||
return new Promise<Payload>((resolve, reject) => {
|
||||
const auth = useAuthStore();
|
||||
const account = useAccountStore();
|
||||
let decoded = jwtDecode<Payload>(localStorage.getItem("accessToken") ?? "");
|
||||
|
||||
auth.setSuccess();
|
||||
if (typeof decoded == "string" || !decoded) {
|
||||
reject("jwt failed");
|
||||
}
|
||||
var { firstname, lastname, mail, username } = decoded;
|
||||
account.setAccountData(firstname, lastname, mail, username);
|
||||
resolve(decoded);
|
||||
});
|
||||
}
|
|
@ -1,13 +1,31 @@
|
|||
import { createRouter, createWebHistory } from "vue-router";
|
||||
import HomeView from "../views/HomeView.vue";
|
||||
import { createRouter, createWebHistory, createWebHashHistory } from "vue-router";
|
||||
import Login from "../views/Login.vue";
|
||||
|
||||
import { isAuthenticated } from "./authGuards";
|
||||
import { loadAccountData } from "./accountGuard";
|
||||
|
||||
const router = createRouter({
|
||||
history: createWebHistory(import.meta.env.BASE_URL),
|
||||
routes: [
|
||||
{
|
||||
path: "/",
|
||||
name: "home",
|
||||
component: HomeView,
|
||||
redirect: { name: "admin" },
|
||||
},
|
||||
{
|
||||
path: "/login",
|
||||
name: "login",
|
||||
component: Login,
|
||||
},
|
||||
{
|
||||
path: "/admin",
|
||||
name: "admin",
|
||||
component: () => import("../views/admin/View.vue"),
|
||||
beforeEnter: [isAuthenticated],
|
||||
},
|
||||
{
|
||||
path: "/:pathMatch(.*)*",
|
||||
name: "404",
|
||||
component: () => import("../views/notFound.vue"),
|
||||
},
|
||||
],
|
||||
});
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import axios from "axios";
|
||||
|
||||
const http = axios.create({
|
||||
baseURL: "https://localhost:5000",
|
||||
baseURL: "http://localhost:5000",
|
||||
headers: {
|
||||
"Cache-Control": "no-cache",
|
||||
Pragma: "no-cache",
|
||||
|
@ -30,6 +30,10 @@ http.interceptors.response.use(
|
|||
return response;
|
||||
},
|
||||
async (error) => {
|
||||
if (error.config.url.includes("/auth")) {
|
||||
return Promise.reject(error);
|
||||
}
|
||||
|
||||
const originalRequest = error.config;
|
||||
|
||||
// Handle token expiration and retry the request with a refreshed token
|
||||
|
|
5
src/shims-vue.d.ts
vendored
Normal file
5
src/shims-vue.d.ts
vendored
Normal file
|
@ -0,0 +1,5 @@
|
|||
declare module "*.vue" {
|
||||
import type { DefineComponent } from "vue";
|
||||
const component: DefineComponent<{}, {}, any>;
|
||||
export default component;
|
||||
}
|
25
src/stores/account.ts
Normal file
25
src/stores/account.ts
Normal file
|
@ -0,0 +1,25 @@
|
|||
import { defineStore } from "pinia";
|
||||
|
||||
export const useAccountStore = defineStore("account", {
|
||||
state: () => {
|
||||
return {
|
||||
firstname: "" as string,
|
||||
lastname: "" as string,
|
||||
mail: "" as string,
|
||||
alias: "" as string,
|
||||
};
|
||||
},
|
||||
actions: {
|
||||
logoutAccount() {
|
||||
localStorage.removeItem("accessToken");
|
||||
localStorage.removeItem("refreshToken");
|
||||
window.open("/login", "_self");
|
||||
},
|
||||
setAccountData(firstname: string, lastname: string, mail: string, alias: string) {
|
||||
this.firstname = firstname;
|
||||
this.lastname = lastname;
|
||||
this.mail = mail;
|
||||
this.alias = alias;
|
||||
},
|
||||
},
|
||||
});
|
151
src/stores/admin/navigation.ts
Normal file
151
src/stores/admin/navigation.ts
Normal file
|
@ -0,0 +1,151 @@
|
|||
import { defineStore } from "pinia";
|
||||
import { shallowRef, defineAsyncComponent } from "vue";
|
||||
|
||||
export interface navigationModel {
|
||||
club: navigationSplitModel;
|
||||
settings: navigationSplitModel;
|
||||
user: navigationSplitModel;
|
||||
}
|
||||
|
||||
export interface navigationSplitModel {
|
||||
topTitle?: string;
|
||||
top?: Array<navigationLinkModel>;
|
||||
mainTitle: string;
|
||||
main: Array<navigationLinkModel>;
|
||||
}
|
||||
|
||||
export type topLevelNavigationType = "club" | "settings" | "user";
|
||||
|
||||
export interface topLevelNavigationModel {
|
||||
key: topLevelNavigationType;
|
||||
title: string;
|
||||
levelDefault: string;
|
||||
}
|
||||
|
||||
export interface navigationLinkModel {
|
||||
key: string;
|
||||
title: string;
|
||||
component: any;
|
||||
}
|
||||
|
||||
export const useNavigationStore = defineStore("navigation", {
|
||||
state: () => {
|
||||
return {
|
||||
activeNavigation: "club" as topLevelNavigationType,
|
||||
activeLink: null as null | navigationLinkModel,
|
||||
topLevel: [
|
||||
{
|
||||
key: "club",
|
||||
title: "Verein",
|
||||
levelDefault: "#members",
|
||||
},
|
||||
{
|
||||
key: "settings",
|
||||
title: "Einstellungen",
|
||||
levelDefault: "#qualification",
|
||||
},
|
||||
] as Array<topLevelNavigationModel>,
|
||||
navigation: {
|
||||
club: {
|
||||
mainTitle: "Verein",
|
||||
main: [
|
||||
{
|
||||
key: "#members",
|
||||
title: "Mitglieder",
|
||||
component: shallowRef(defineAsyncComponent(() => import("@/views/admin/members/Overview.vue"))),
|
||||
},
|
||||
{
|
||||
key: "#calendar",
|
||||
title: "Termine",
|
||||
component: shallowRef(defineAsyncComponent(() => import("@/views/admin/members/Overview.vue"))),
|
||||
},
|
||||
{
|
||||
key: "#newsletter",
|
||||
title: "Newsletter",
|
||||
component: shallowRef(defineAsyncComponent(() => import("@/views/admin/members/Overview.vue"))),
|
||||
},
|
||||
{
|
||||
key: "#protocol",
|
||||
title: "Prookolle",
|
||||
component: shallowRef(defineAsyncComponent(() => import("@/views/admin/members/Overview.vue"))),
|
||||
},
|
||||
],
|
||||
},
|
||||
settings: {
|
||||
mainTitle: "Einstellungen",
|
||||
main: [
|
||||
{
|
||||
key: "#qualification",
|
||||
title: "Qualifikationen",
|
||||
component: shallowRef(defineAsyncComponent(() => import("@/views/admin/members/Overview.vue"))),
|
||||
},
|
||||
{
|
||||
key: "#award",
|
||||
title: "Auszeichnungen",
|
||||
component: shallowRef(defineAsyncComponent(() => import("@/views/admin/members/Overview.vue"))),
|
||||
},
|
||||
{
|
||||
key: "#executive_position",
|
||||
title: "Vereinsämter",
|
||||
component: shallowRef(defineAsyncComponent(() => import("@/views/admin/members/Overview.vue"))),
|
||||
},
|
||||
{
|
||||
key: "#communication",
|
||||
title: "Mitgliederdaten",
|
||||
component: shallowRef(defineAsyncComponent(() => import("@/views/admin/members/Overview.vue"))),
|
||||
},
|
||||
],
|
||||
},
|
||||
user: {
|
||||
mainTitle: "Benutzer",
|
||||
main: [
|
||||
{
|
||||
key: "#user",
|
||||
title: "Benutzer",
|
||||
component: shallowRef(defineAsyncComponent(() => import("@/views/admin/members/Overview.vue"))),
|
||||
},
|
||||
{
|
||||
key: "#roles",
|
||||
title: "Rollen",
|
||||
component: shallowRef(defineAsyncComponent(() => import("@/views/admin/members/Overview.vue"))),
|
||||
},
|
||||
],
|
||||
},
|
||||
} as navigationModel,
|
||||
};
|
||||
},
|
||||
getters: {
|
||||
activeNavigationObject: (state) => (state.navigation[state.activeNavigation] ?? {}) as navigationSplitModel,
|
||||
activeTopLevelObject: (state) =>
|
||||
(state.topLevel.find((elem) => elem.key == state.activeNavigation) ?? {}) as topLevelNavigationModel,
|
||||
},
|
||||
actions: {
|
||||
setTopLevel(key: topLevelNavigationType, disableSubLink: boolean = true) {
|
||||
let level = this.topLevel.find((e) => e.key == key) ?? null;
|
||||
if (!level) {
|
||||
this.activeNavigation = "club";
|
||||
if (!disableSubLink) this.setLink(this.topLevel.find((e) => e.key == "club")?.levelDefault ?? null);
|
||||
else this.setLink(null);
|
||||
} else {
|
||||
this.activeNavigation = level.key;
|
||||
if (!disableSubLink) this.setLink(level.levelDefault);
|
||||
else this.setLink(null);
|
||||
}
|
||||
},
|
||||
setLink(key: string | null) {
|
||||
let nav = this.navigation[this.activeNavigation];
|
||||
if (!nav) {
|
||||
this.activeLink = null;
|
||||
return;
|
||||
}
|
||||
let links = [...Object.values(nav.main), ...Object.values(nav.top ?? {})];
|
||||
this.activeLink = links.find((e) => e.key == key) ?? null;
|
||||
},
|
||||
setTopLevelNav(topLeveLinks: Array<topLevelNavigationModel>) {
|
||||
this.topLevel = topLeveLinks;
|
||||
},
|
||||
resetNavigation() {
|
||||
this.$reset();
|
||||
},
|
||||
},
|
||||
});
|
14
src/stores/auth.ts
Normal file
14
src/stores/auth.ts
Normal file
|
@ -0,0 +1,14 @@
|
|||
import { defineStore } from "pinia";
|
||||
|
||||
export const useAuthStore = defineStore("auth", {
|
||||
state: () => {
|
||||
return {
|
||||
authCheck: false,
|
||||
};
|
||||
},
|
||||
actions: {
|
||||
setSuccess() {
|
||||
this.authCheck = true;
|
||||
},
|
||||
},
|
||||
});
|
56
src/templates/Main.vue
Normal file
56
src/templates/Main.vue
Normal file
|
@ -0,0 +1,56 @@
|
|||
<template>
|
||||
<div v-if="!defaultRoute && showBack" class="flex md:hidden flex-row items-baseline">
|
||||
<p v-if="!defaultRoute && showBack" class="text-indigo-500" @click="setLink(null)">zur Übersicht</p>
|
||||
</div>
|
||||
<slot v-if="headerInsert" name="headerInsert"></slot>
|
||||
<div
|
||||
class="max-w-full w-full grow flex flex-col divide-y-2 divide-gray-300 bg-white rounded-lg justify-center overflow-hidden"
|
||||
>
|
||||
<slot name="topBar"></slot>
|
||||
<div class="flex flex-col gap-2 grow py-5 overflow-hidden">
|
||||
<slot name="diffMain"></slot>
|
||||
<div v-if="!diffMain" class="flex flex-col gap-2 grow px-7 overflow-y-scroll">
|
||||
<slot name="main"></slot>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { defineComponent } from "vue";
|
||||
import { mapState, mapActions } from "pinia";
|
||||
import { useNavigationStore } from "../stores/admin/navigation";
|
||||
</script>
|
||||
|
||||
<script lang="ts">
|
||||
export default defineComponent({
|
||||
props: {
|
||||
header: {
|
||||
type: String,
|
||||
default: null,
|
||||
},
|
||||
showBack: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
...mapState(useNavigationStore, ["activeLink"]),
|
||||
defaultRoute() {
|
||||
return this.activeLink == null;
|
||||
},
|
||||
diffMain() {
|
||||
return this.$slots.diffMain;
|
||||
},
|
||||
headerInsert() {
|
||||
return this.$slots.headerInsert;
|
||||
},
|
||||
mid() {
|
||||
return window.matchMedia("(min-width: 800px)").matches;
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
...mapActions(useNavigationStore, ["setLink"]),
|
||||
},
|
||||
});
|
||||
</script>
|
75
src/templates/Sidebar.vue
Normal file
75
src/templates/Sidebar.vue
Normal file
|
@ -0,0 +1,75 @@
|
|||
<template>
|
||||
<div v-if="topButtonsPassed" class="flex flex-row gap-2 empty:contents">
|
||||
<slot name="topButtons"></slot>
|
||||
</div>
|
||||
<div
|
||||
v-if="showTopList"
|
||||
class="w-full h-fit max-h-1/2 flex flex-col divide-y-2 divide-gray-300 bg-white rounded-lg justify-center overflow-hidden"
|
||||
>
|
||||
<div v-if="topSearchPassed" class="flex flex-row gap-1 justify-end items-center pt-5 pb-3 px-7">
|
||||
<slot name="searchTop"></slot>
|
||||
</div>
|
||||
<div class="flex flex-col gap-2 grow overflow-hidden" :class="topTitlePassed ? 'pb-5 pt-2' : ' py-5'">
|
||||
<p v-if="topTitlePassed" class="px-2">{{ topTitle }}</p>
|
||||
<div class="flex flex-col gap-2 h-full px-7 overflow-y-auto">
|
||||
<slot name="topList"></slot>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="w-full grow flex flex-col divide-y-2 divide-gray-300 bg-white rounded-lg justify-center overflow-hidden">
|
||||
<div v-if="searchPassed" class="flex flex-row gap-1 justify-end items-center pt-5 pb-3 px-7">
|
||||
<slot name="search"></slot>
|
||||
</div>
|
||||
<div class="flex flex-col gap-2 grow overflow-hidden" :class="titlePassed ? 'pb-5 pt-2' : ' py-5'">
|
||||
<p v-if="titlePassed" class="px-2">{{ mainTitle }}</p>
|
||||
<div class="flex flex-col gap-2 h-full px-7 overflow-y-auto">
|
||||
<slot name="list"></slot>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="bottomButtonsPassed" class="flex flex-col gap-2 empty:contents">
|
||||
<slot name="bottomButtons"></slot>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
export default {
|
||||
props: {
|
||||
topTitle: {
|
||||
type: String,
|
||||
default: null,
|
||||
},
|
||||
mainTitle: {
|
||||
type: String,
|
||||
default: null,
|
||||
},
|
||||
showTopList: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
defaultRoute() {
|
||||
return ((this.$route?.name as string) ?? "").includes("-default");
|
||||
},
|
||||
topButtonsPassed() {
|
||||
return !!this.$slots.topButtons;
|
||||
},
|
||||
topTitlePassed() {
|
||||
return !!this.topTitle;
|
||||
},
|
||||
topSearchPassed() {
|
||||
return !!this.$slots.searchTop;
|
||||
},
|
||||
titlePassed() {
|
||||
return !!this.mainTitle;
|
||||
},
|
||||
searchPassed() {
|
||||
return !!this.$slots.search;
|
||||
},
|
||||
bottomButtonsPassed() {
|
||||
return !!this.$slots.bottomButtons;
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
|
@ -1,5 +0,0 @@
|
|||
<template>
|
||||
<p>Home</p>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts"></script>
|
83
src/views/Login.vue
Normal file
83
src/views/Login.vue
Normal file
|
@ -0,0 +1,83 @@
|
|||
<template>
|
||||
<div class="grow flex items-center justify-center py-12 px-4 sm:px-6 lg:px-8">
|
||||
<div class="max-w-md w-full space-y-8 pb-20">
|
||||
<div class="flex flex-col items-center gap-4">
|
||||
<img src="/FFW-Logo.svg" alt="LOGO" class="h-36" />
|
||||
<h2 class="text-center text-5xl font-extrabold text-gray-900">Mitgliederverwaltung</h2>
|
||||
</div>
|
||||
|
||||
<form class="flex flex-col gap-2" @submit.prevent="login">
|
||||
<div class="-space-y-px">
|
||||
<div>
|
||||
<input id="username" name="username" type="text" required placeholder="Benutzer" class="!rounded-b-none" />
|
||||
</div>
|
||||
<div>
|
||||
<input id="totp" name="totp" type="text" required placeholder="TOTP" class="!rounded-t-none" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="flex flex-row gap-2">
|
||||
<button type="submit" primary :disabled="loginStatus == 'loading' || loginStatus == 'success'">
|
||||
anmelden
|
||||
</button>
|
||||
<Spinner v-if="loginStatus == 'loading'" class="my-auto" />
|
||||
<SuccessCheckmark v-else-if="loginStatus == 'success'" />
|
||||
<FailureXMark v-else-if="loginStatus == 'failed'" />
|
||||
</div>
|
||||
<p v-if="loginError" class="text-center">{{ loginError }}</p>
|
||||
</form>
|
||||
|
||||
<div class="flex flex-col text-gray-400 text-sm mt-4 items-center">
|
||||
<div class="flex flex-row gap-2 justify-center">
|
||||
<a href="#">Datenschutz</a>
|
||||
<a href="#">Impressum</a>
|
||||
</div>
|
||||
<a href="#"> © Admin-Portal by JK Effects </a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { defineComponent } from "vue";
|
||||
import { RouterLink } from "vue-router";
|
||||
import Spinner from "@/components/Spinner.vue";
|
||||
import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
|
||||
import FailureXMark from "@/components/FailureXMark.vue";
|
||||
</script>
|
||||
|
||||
<script lang="ts">
|
||||
export default defineComponent({
|
||||
data() {
|
||||
return {
|
||||
loginStatus: undefined as undefined | "loading" | "success" | "failed",
|
||||
loginError: "" as string,
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
login(e: any) {
|
||||
let formData = e.target.elements;
|
||||
this.loginStatus = "loading";
|
||||
this.loginError = "";
|
||||
this.$http
|
||||
.post(`/auth/login`, {
|
||||
username: formData.username.value,
|
||||
totp: formData.totp.value,
|
||||
})
|
||||
.then((result) => {
|
||||
this.loginStatus = "success";
|
||||
console.log(result);
|
||||
localStorage.setItem("accessToken", result.data.accessToken),
|
||||
localStorage.setItem("refreshToken", result.data.refreshToken),
|
||||
setTimeout(() => {
|
||||
this.$router.push(`/admin`);
|
||||
}, 1000);
|
||||
})
|
||||
.catch((err) => {
|
||||
this.loginStatus = "failed";
|
||||
this.loginError = err.response.data;
|
||||
});
|
||||
},
|
||||
},
|
||||
});
|
||||
</script>
|
7
src/views/RouterView.vue
Normal file
7
src/views/RouterView.vue
Normal file
|
@ -0,0 +1,7 @@
|
|||
<template>
|
||||
<RouterView />
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { RouterView } from "vue-router";
|
||||
</script>
|
54
src/views/admin/View.vue
Normal file
54
src/views/admin/View.vue
Normal file
|
@ -0,0 +1,54 @@
|
|||
<template>
|
||||
<SidebarLayout>
|
||||
<template #sidebar>
|
||||
<SidebarTemplate
|
||||
:mainTitle="activeNavigationObject.mainTitle"
|
||||
:topTitle="activeNavigationObject.topTitle"
|
||||
:showTopList="activeNavigationObject.top != null"
|
||||
>
|
||||
<template #topList>
|
||||
<RoutingLink v-for="item in activeNavigationObject.top" :key="item.key" :link="item" />
|
||||
</template>
|
||||
<template #list>
|
||||
<RoutingLink v-for="item in activeNavigationObject.main" :key="item.key" :link="item" />
|
||||
</template>
|
||||
</SidebarTemplate>
|
||||
</template>
|
||||
<template #main>
|
||||
<component v-if="activeLink?.component" :is="activeLink.component" />
|
||||
<div v-else class="w-full h-full bg-white rounded-lg"></div>
|
||||
</template>
|
||||
</SidebarLayout>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { defineComponent } from "vue";
|
||||
import { mapState, mapActions } from "pinia";
|
||||
import { useNavigationStore } from "@/stores/admin/navigation";
|
||||
import SidebarLayout from "@/layouts/Sidebar.vue";
|
||||
import SidebarTemplate from "@/templates/Sidebar.vue";
|
||||
import RoutingLink from "@/components/admin/RoutingLink.vue";
|
||||
</script>
|
||||
|
||||
<script lang="ts">
|
||||
export default defineComponent({
|
||||
props: {
|
||||
contestId: {
|
||||
type: String,
|
||||
default: "",
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
...mapState(useNavigationStore, ["activeNavigationObject", "activeTopLevelObject", "activeLink"]),
|
||||
},
|
||||
created() {
|
||||
this.setLink(this.activeTopLevelObject.levelDefault);
|
||||
},
|
||||
beforeUnmount() {
|
||||
this.resetNavigation();
|
||||
},
|
||||
methods: {
|
||||
...mapActions(useNavigationStore, ["setLink", "resetNavigation", "setTopLevel"]),
|
||||
},
|
||||
});
|
||||
</script>
|
24
src/views/admin/members/Overview.vue
Normal file
24
src/views/admin/members/Overview.vue
Normal file
|
@ -0,0 +1,24 @@
|
|||
<template>
|
||||
<MainTemplate>
|
||||
<template v-slot:topBar>
|
||||
<div class="flex flex-row items-center justify-between pt-5 pb-3 px-7">
|
||||
<h1 class="font-bold text-xl h-8">Übersicht</h1>
|
||||
</div>
|
||||
</template>
|
||||
<template v-slot:diffMain>
|
||||
<div class="flex flex-col gap-2 justify-center items-center h-full"></div>
|
||||
</template>
|
||||
</MainTemplate>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { defineComponent } from "vue";
|
||||
import { mapState } from "pinia";
|
||||
import MainTemplate from "@/templates/Main.vue";
|
||||
</script>
|
||||
|
||||
<script lang="ts">
|
||||
export default defineComponent({
|
||||
computed: {},
|
||||
});
|
||||
</script>
|
282
src/views/notFound.vue
Normal file
282
src/views/notFound.vue
Normal file
|
@ -0,0 +1,282 @@
|
|||
<template>
|
||||
<main class="bg-white relative overflow-hidden h-full">
|
||||
<div class="container mx-auto px-6 md:px-12 relative z-10 flex items-center py-32">
|
||||
<div class="container mx-auto px-6 flex flex-col justify-between items-center relative">
|
||||
<div class="flex w-full items-center justify-center space-x-12 flex-col md:flex-row mb-16 md:mb-8">
|
||||
<h1 class="font-thin text-center text-6xl text-gray-800">GOT LOST ?</h1>
|
||||
<a
|
||||
href="/"
|
||||
class="px-3 py-2 w-auto font-light transition ease-in duration-200 uppercase hover:bg-yellow-600 hover:text-white border-b text-2xl border-yellow-600 focus:outline-none"
|
||||
>
|
||||
Back Home?
|
||||
</a>
|
||||
</div>
|
||||
<div class="block w-full mx-auto mt-6 md:mt-0 relative">
|
||||
<svg class="max-w-2xl m-auto" viewBox="0 0 1440 1024" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="1440" height="1024" fill="white"></rect>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
clip-rule="evenodd"
|
||||
d="M694.758 533.139C670.668 535.918 652.182 535.585 639.301 532.14C626.419 528.695 616.261 521.367 608.824 510.157C600.718 493.011 596.222 483.185 595.335 480.679C590.988 468.398 590.506 456.326 591.338 448.204C592.424 437.596 598.253 423.774 608.824 406.736C610.33 394.89 612.828 384.398 616.319 375.26C619.809 366.122 626.804 352.965 637.302 335.79L638.801 279.333C643.231 266.41 647.394 257.251 651.292 251.854C655.189 246.458 659.686 243.627 664.781 243.361C669.081 242.953 673.078 243.952 676.772 246.359C680.466 248.765 687.461 254.927 697.756 264.845C706.258 250.007 715.917 238.682 726.734 230.87C737.55 223.059 751.872 217.063 769.7 212.884L772.199 207.888L772.5 178.5L764.205 106.965H753.213L770.2 81.9844C771.716 76.48 773.215 72.483 774.697 69.9935C776.178 67.504 778.946 64.673 783 61.5004C783.074 60.5805 786.407 60.0805 793 60.0004C799.593 59.9203 809.979 60.2537 824.159 61.0004C830.212 62.3907 834.375 64.2227 836.649 66.4962C838.922 68.7697 840.921 73.5994 842.644 80.9851L867 107L851.637 107.964L850.138 155.428C848.001 163.568 846.003 169.064 844.143 171.916C842.283 174.767 839.286 176.932 835.15 178.411L810.669 179.909L807.671 208.887L809.67 212.884C822.173 216.458 830.667 219.289 835.15 221.378C845.917 226.393 855.656 233.655 863.128 246.359C868.36 255.252 873.774 267.538 881.115 280.333C887.578 291.597 899.402 311.416 916.587 339.787L933.574 354.776L942.068 371.763L962.552 387.251L972.045 356.275C952.726 326.964 943.067 308.311 943.067 300.317C943.067 296.976 945.085 293.827 947.064 291.824C949.819 289.035 953.603 287.321 960.054 287.827C964.354 288.164 968.518 290.829 972.544 295.821L1030 450.203C1024.28 468.944 1019.29 482.933 1015.01 492.171C1010.74 501.408 1004.41 510.568 996.026 519.65C983.947 526.425 973.788 530.422 965.55 531.64C957.311 532.859 943.821 531.693 925.081 528.143C918.518 525.139 914.188 522.308 912.091 519.65C904.316 509.794 901.064 497.293 897.102 490.672C891.537 481.372 888.207 472.712 887.11 464.692L861.13 380.256L748.717 376.759L738.225 462.194C732.49 485.413 726.328 502.4 719.739 513.155C713.15 523.909 704.823 530.571 694.758 533.139Z"
|
||||
fill="white"
|
||||
></path>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
clip-rule="evenodd"
|
||||
d="M702.5 551.544C700.465 551.177 698.965 550.996 698 551C694.295 551.016 691.271 550.825 689.5 548C687.037 544.071 687.703 539.405 691.5 534L702 530.5H707L743.5 532L755 530.5L795.5 529C799.833 531 801.333 534.833 800 540.5C798.667 546.167 795 549.667 789 551L777 551.544L696 922.955H644C652.902 864.607 660.068 820.725 665.5 791.309C670.932 761.894 683.265 681.972 702.5 551.544ZM829.5 551.544C829.421 550.364 826.254 550.183 820 551C814.667 548.333 812.5 544.167 813.5 538.5C814.5 532.833 817 529.833 821 529.5L828.5 530.5H851.5L874.5 532L900 529.5C908 530.167 912 533.833 912 540.5C912 544.289 910.723 546.257 909 548C908.128 548.883 906.461 549.883 904 551L896 551.544L916.5 923.455H862.5C855.225 856.574 850.559 809.689 848.5 782.8C846.048 750.774 832.176 591.586 829.5 551.544Z"
|
||||
fill="white"
|
||||
></path>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
clip-rule="evenodd"
|
||||
d="M702.5 551.044H777L696 922.454H644C652.902 864.106 660.068 820.224 665.5 790.809C670.932 761.393 683.265 681.472 702.5 551.044ZM829.5 551.044H896L916.5 922.955H862.5C855.225 856.074 850.559 809.189 848.5 782.299C846.048 750.274 832.176 591.086 829.5 551.044Z"
|
||||
stroke="#263E4B"
|
||||
stroke-width="1.5"
|
||||
></path>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
clip-rule="evenodd"
|
||||
d="M749 219.678L692.627 219.943C664.502 220.075 641.378 242.152 639.945 270.241L639 288.754C639.881 279.234 641.047 272.56 642.5 268.732C644.806 262.655 647.469 259.16 650.5 255.217C655.082 249.255 660.272 244.225 664.5 243.204C674.167 240.868 685 248.376 697 265.729C699.01 261.841 700.677 258.838 702 256.719C704.642 252.487 707.455 247.918 712.5 243.204C722.5 233.86 734.667 226.018 749 219.678Z"
|
||||
fill="#fa9b60"
|
||||
></path>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
clip-rule="evenodd"
|
||||
d="M703 529.52C708.143 531.396 717.81 532.231 732 532.023C739.727 531.91 753.636 529.603 765.5 529.019C772.116 528.694 782.116 528.694 795.5 529.019L807 498.486H818L821.5 529.019C833.201 529.751 841.534 530.252 846.5 530.521C857.179 531.1 866.062 531.522 873 531.522C884.778 531.522 893.444 530.688 899 529.019L873.5 386.362L755 390.867C753.451 412.59 747.785 436.45 738 462.446C735.915 467.986 735.581 474.989 733.5 481.967C730.328 492.601 726.835 502.885 723 509.998C719.362 516.746 712.695 523.253 703 529.52Z"
|
||||
fill="#fa9b60"
|
||||
></path>
|
||||
<path
|
||||
d="M898.21 529.352L886.761 462.573C886.691 462.164 886.965 461.776 887.373 461.706C887.782 461.636 888.169 461.91 888.239 462.319L899.632 528.769H901.25C907.601 528.769 912.75 533.923 912.75 540.282C912.75 546.64 907.601 551.795 901.25 551.795H822.354C816.724 551.795 812.16 547.225 812.16 541.588C812.16 541.117 812.192 540.645 812.257 540.178L812.856 535.88C813.396 532.012 816.39 528.986 820.182 528.362L817.32 499.236H807.519L796.528 528.419C799.594 529.129 801.766 531.994 801.517 535.231C801.495 535.51 801.456 535.788 801.399 536.062L800.484 540.436C799.101 547.054 793.271 551.795 786.517 551.795H695.048C690.833 551.795 687.416 548.374 687.416 544.154C687.416 543.356 687.541 542.562 687.787 541.803C688.454 539.739 689.286 537.073 690.283 533.805C690.404 533.409 690.823 533.186 691.219 533.307C691.615 533.428 691.838 533.848 691.717 534.244C690.718 537.519 689.884 540.192 689.214 542.265C689.016 542.875 688.916 543.513 688.916 544.154C688.916 547.545 691.661 550.293 695.048 550.293H786.517C792.561 550.293 797.778 546.051 799.016 540.128L799.931 535.754C799.975 535.543 800.005 535.33 800.021 535.116C800.232 532.38 798.192 529.991 795.463 529.77C789.259 529.648 784.869 529.586 782.298 529.583C775.337 529.575 755.707 530.715 751.6 531.265C742.277 532.514 737.34 532.694 729.276 532.422C729.014 532.413 729.014 532.413 728.751 532.404C725.87 532.307 724.492 532.273 722.654 532.273C715.984 532.273 711.002 532.105 707.695 531.769C703.815 531.373 702.058 530.82 702.257 529.414L703.743 529.626C703.758 529.517 703.728 529.435 703.708 529.399C703.813 529.48 704.029 529.58 704.347 529.68C705.083 529.911 706.256 530.112 707.847 530.275C711.092 530.605 716.031 530.771 722.654 530.771C724.514 530.771 725.905 530.805 728.802 530.904C729.064 530.913 729.064 530.913 729.326 530.921C737.312 531.191 742.168 531.014 751.401 529.777C755.579 529.217 775.275 528.073 782.3 528.081C784.812 528.084 789.04 528.143 794.985 528.258L806.298 498.221C806.408 497.928 806.688 497.735 807 497.735H818H824.5C824.914 497.735 825.25 498.071 825.25 498.486C825.25 498.9 824.914 499.236 824.5 499.236H818.828L821.697 528.445C825.009 528.992 831.626 529.27 841.5 529.27C845.212 529.27 863.352 530.284 868.57 530.775C874.516 531.334 884.405 530.861 898.21 529.352ZM899.028 530.271L899.083 530.767C884.813 532.348 874.605 532.851 868.43 532.27C863.255 531.783 845.16 530.771 841.5 530.771C830.942 530.771 824.079 530.457 820.855 529.819L820.861 529.786C817.508 530.134 814.81 532.728 814.342 536.087L813.743 540.386C813.687 540.784 813.66 541.186 813.66 541.588C813.66 546.396 817.552 550.293 822.354 550.293H901.25C906.773 550.293 911.25 545.811 911.25 540.282C911.25 534.753 906.773 530.271 901.25 530.271H899.028Z"
|
||||
fill="#263E4B"
|
||||
></path>
|
||||
<path
|
||||
d="M811.713 179.884L808.802 210.648C832.503 218.712 847.657 225.715 854.324 231.718C862.968 239.502 885.127 284.488 896.483 314.012C899.912 322.929 905.228 328.577 918.128 339.03L919.213 339.909C932.168 350.407 937.463 356.075 940.705 365.084C945.711 378.993 955.727 382.335 971.185 375.169C971.56 374.995 972.006 375.158 972.18 375.535C972.354 375.911 972.191 376.357 971.815 376.531C955.601 384.048 944.617 380.383 939.294 365.593C936.176 356.929 931.015 351.405 918.27 341.076L917.185 340.197C904.085 329.582 898.638 323.796 895.083 314.552C883.826 285.287 861.713 240.391 853.32 232.834C846.802 226.965 831.594 219.96 807.759 211.879C807.43 211.768 807.22 211.444 807.253 211.097L810.206 179.884H801.5C801.086 179.884 800.75 179.547 800.75 179.133C800.75 178.718 801.086 178.382 801.5 178.382H811.021C811.027 178.382 811.032 178.382 811.038 178.382H827.694C838.014 178.382 844.001 174.181 847.126 165.692C849.638 158.87 850.25 150.985 850.25 134.129V122.648C850.25 122.49 850.25 122.361 850.25 122.069C850.258 116.487 850 113.272 848.804 108.368C848.778 108.339 848.743 108.303 848.701 108.261C848.584 108.144 848.421 107.991 848.214 107.804H776.707C776.293 107.804 775.957 107.468 775.957 107.053C775.957 106.638 776.293 106.302 776.707 106.302H848.5C848.683 106.302 848.86 106.369 848.997 106.491C849.882 107.276 850.146 107.539 850.228 107.875C851.487 112.996 851.758 116.327 851.75 122.07C851.75 122.362 851.75 122.49 851.75 122.648V134.129C851.75 151.175 851.131 159.159 848.534 166.211C845.191 175.289 838.644 179.884 827.694 179.884H811.713ZM1030.78 449.219L1032.22 449.643C1019.66 492.358 1006.31 517.257 992.03 524.385C969.545 535.605 942.05 536.468 919.669 525.479C916.712 524.027 914.39 521.998 912.033 518.881C910.353 516.659 908.696 513.985 906.05 509.344C905.358 508.13 902.72 503.454 902.331 502.768C900.674 499.845 899.243 497.356 897.716 494.763C895.626 491.211 892.659 483.368 888.785 471.183L890.214 470.727C894.053 482.804 896.995 490.579 899.009 494.001C900.54 496.602 901.975 499.097 903.636 502.027C904.026 502.716 906.663 507.389 907.353 508.6C909.968 513.188 911.599 515.819 913.229 517.975C915.452 520.915 917.597 522.789 920.33 524.131C942.276 534.907 969.281 534.059 991.361 523.041C1005.14 516.166 1018.33 491.544 1030.78 449.219Z"
|
||||
fill="#263E4B"
|
||||
></path>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
clip-rule="evenodd"
|
||||
d="M825 217.675L834 221.179C840.333 240.534 845.167 257.052 848.5 270.734C851.833 284.416 854 304.772 855 331.802L842.5 328.298C843.5 306.607 841.667 287.419 837 270.734C834.967 263.467 830.967 245.781 825 217.675ZM748.5 219.678L757 216.174C759 230.968 760 242.648 760 251.213C760 259.778 760 268.454 760 277.241L747 295.762C749 289.755 750 276.24 750 255.217C750 234.194 749.5 222.347 748.5 219.678Z"
|
||||
fill="#fa9b60"
|
||||
></path>
|
||||
<path
|
||||
d="M824.767 217.832L824.478 216.472L835.103 220.608L835.213 220.946C841.552 240.318 846.39 256.854 849.729 270.556C853.077 284.297 855.248 304.698 856.25 331.774L856.288 332.802L842.223 328.86L842.251 328.263C843.247 306.649 841.422 287.54 836.778 270.937C834.739 263.648 830.738 245.954 824.767 217.832ZM838.222 270.532C842.869 287.146 844.719 306.214 843.776 327.736L854.712 330.801C853.697 304.329 851.548 284.361 848.272 270.912C844.963 257.331 840.171 240.943 833.898 221.751L826.523 218.879C832.327 246.179 836.229 263.404 838.222 270.532ZM748.298 219.942L748.043 219.261L758.113 215.109L758.243 216.073C760.248 230.898 761.25 242.608 761.25 251.213V277.479L745.169 300.389L746.789 295.525C748.754 289.623 749.75 276.156 749.75 255.217C749.75 234.36 749.249 222.48 748.298 219.942ZM751.25 255.217C751.25 272.575 750.572 284.831 749.199 292.036L759.75 277.004V251.213C759.75 242.873 758.796 231.546 756.886 217.239L749.91 220.115C750.817 223.874 751.25 235.476 751.25 255.217Z"
|
||||
fill="#263E4B"
|
||||
></path>
|
||||
<path
|
||||
d="M810.781 219.891L812.219 219.464L880.237 449.29C884.124 469.604 898.133 479.715 922.5 479.715C946.878 479.715 966.921 463.424 982.65 430.7L984.001 431.351C968.045 464.547 947.537 481.217 922.5 481.217C897.451 481.217 882.794 470.638 878.781 449.645L810.781 219.891ZM847.759 405.769L849.241 405.998C841.523 456.053 827.015 481.217 805.5 481.217C788.093 481.217 776.511 427.001 771.751 323.327C770.853 303.778 770.353 270.399 770.25 223.183L771.75 223.18C771.853 270.375 772.353 303.737 773.249 323.258C777.948 425.582 789.512 479.715 805.5 479.715C825.985 479.715 840.143 455.157 847.759 405.769Z"
|
||||
fill="#263E4B"
|
||||
></path>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
clip-rule="evenodd"
|
||||
d="M922.478 381.147L974.869 375.64L977.968 405.124L925.577 410.63L922.478 381.147ZM873.885 328.292L868.962 281.447C870.937 276.381 876.142 273.405 884.576 272.519C893.01 271.633 898.72 273.461 901.706 278.005L906.629 324.851L873.885 328.292ZM1011.41 313.838L978.667 317.279L973.743 270.434C975.719 265.368 980.923 262.392 989.358 261.506C997.792 260.62 1003.5 262.448 1006.49 266.992L1011.41 313.838Z"
|
||||
fill="#263E4B"
|
||||
></path>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
clip-rule="evenodd"
|
||||
d="M869.771 380.309L862.162 307.912C865.35 300.069 873.692 295.439 887.187 294.02C900.681 292.602 909.803 295.397 914.553 302.405L922.162 374.803L869.771 380.309ZM1026.94 363.79L974.552 369.296L966.943 296.899C970.132 289.056 978.473 284.426 991.968 283.007C1005.46 281.589 1014.58 284.384 1019.33 291.392L1026.94 363.79Z"
|
||||
fill="white"
|
||||
></path>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
clip-rule="evenodd"
|
||||
d="M869.442 380.511L861.832 308.114C865.021 300.271 873.362 295.641 886.857 294.222C900.351 292.804 909.474 295.599 914.223 302.607L921.832 375.005L869.442 380.511ZM1026.61 363.992L974.223 369.499L966.614 297.101C969.802 289.258 978.144 284.628 991.638 283.209C1005.13 281.791 1014.25 284.586 1019 291.594L1026.61 363.992Z"
|
||||
fill="white"
|
||||
stroke="#263E4B"
|
||||
stroke-width="1.5"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
></path>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
clip-rule="evenodd"
|
||||
d="M868.156 460.551L859.353 376.796C863.907 367.633 875.462 362.076 894.017 360.125C912.572 358.175 925.03 361.208 931.39 369.225L940.193 452.979L868.156 460.551ZM1044.97 441.966L972.937 449.538L964.134 365.783C968.689 356.62 980.243 351.063 998.798 349.112C1017.35 347.162 1029.81 350.195 1036.17 358.212L1044.97 441.966Z"
|
||||
fill="white"
|
||||
></path>
|
||||
<path
|
||||
d="M868.003 461.322C867.592 461.365 867.222 461.066 867.179 460.654L858.376 376.9C858.361 376.758 858.387 376.614 858.451 376.487C863.144 367.043 874.924 361.378 893.708 359.403C912.492 357.429 925.192 360.522 931.746 368.783C931.835 368.895 931.89 369.029 931.905 369.171L940.708 452.926C940.751 453.338 940.453 453.707 940.041 453.751L868.003 461.322ZM939.138 452.336L930.436 369.548C924.228 361.902 912.058 358.985 893.865 360.897C875.672 362.809 864.374 368.193 859.891 376.962L868.592 459.75L939.138 452.336ZM1045.49 441.913C1045.53 442.325 1045.23 442.695 1044.82 442.738L972.785 450.309C972.373 450.353 972.004 450.053 971.96 449.641L963.157 365.887C963.143 365.745 963.168 365.601 963.232 365.474C967.925 356.03 979.706 350.365 998.489 348.391C1017.27 346.416 1029.97 349.509 1036.53 357.77C1036.62 357.882 1036.67 358.016 1036.69 358.158L1045.49 441.913ZM1043.92 441.323L1035.22 358.535C1029.01 350.889 1016.84 347.972 998.646 349.884C980.453 351.796 969.156 357.18 964.672 365.949L973.374 448.737L1043.92 441.323Z"
|
||||
fill="#263E4B"
|
||||
></path>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
clip-rule="evenodd"
|
||||
d="M905.235 469.074C885.342 471.165 868.638 467.36 867.925 460.575C867.212 453.791 882.76 446.596 902.652 444.505C922.545 442.414 939.249 446.219 939.962 453.004C940.675 459.788 925.127 466.983 905.235 469.074ZM1010.02 458.061C990.124 460.152 973.419 456.347 972.706 449.562C971.993 442.778 987.541 435.583 1007.43 433.492C1027.33 431.401 1044.03 435.206 1044.74 441.991C1045.46 448.775 1029.91 455.97 1010.02 458.061Z"
|
||||
fill="#263E4B"
|
||||
></path>
|
||||
<path
|
||||
d="M850.217 394.465C856.507 393.804 861.069 388.167 860.408 381.875C859.746 375.582 854.112 371.017 847.822 371.678C841.533 372.339 836.971 377.976 837.632 384.268C838.293 390.561 843.928 395.126 850.217 394.465ZM850.06 392.972C844.595 393.546 839.699 389.579 839.124 384.112C838.549 378.644 842.514 373.746 847.979 373.172C853.445 372.597 858.341 376.564 858.916 382.031C859.49 387.499 855.526 392.397 850.06 392.972Z"
|
||||
fill="#263E4B"
|
||||
></path>
|
||||
<path
|
||||
d="M610.14 406.854L620.244 403.176C620.633 403.034 621.063 403.235 621.205 403.625C621.346 404.014 621.146 404.445 620.756 404.587L611.773 407.857L620.882 413.246C621.238 413.457 621.356 413.917 621.146 414.274C620.935 414.631 620.475 414.75 620.119 414.539L609.947 408.522L609.756 408.591C609.668 408.624 609.577 408.638 609.488 408.637C591.125 433.118 586.878 457.269 596.694 481.182C606.263 504.493 610.564 512.813 617.814 519.994C626.172 528.273 637.682 532.576 657.583 534.781C695.112 538.938 717.031 526.488 726.793 498.737C732.892 481.398 736.381 469.257 737.256 462.352C737.308 461.94 737.684 461.649 738.094 461.701C738.505 461.753 738.796 462.129 738.744 462.541C737.852 469.582 734.341 481.801 728.208 499.236C718.204 527.673 695.614 540.505 657.418 536.273C637.212 534.034 625.397 529.618 616.759 521.062C609.311 513.684 604.958 505.264 595.306 481.753C585.223 457.19 589.671 432.351 608.595 407.328C610.632 381.922 619.844 358.142 636.223 336.003C652.552 313.931 669.379 297.338 686.712 286.227C698.426 255.155 715.435 234.346 737.746 223.846C748.862 218.615 757.205 215.138 762.789 213.411C766.529 212.254 769.191 211.829 770.68 212.298L773.251 165.077C773.274 164.663 773.627 164.345 774.041 164.366C774.455 164.39 774.772 164.744 774.749 165.158L772.075 214.282C772.022 215.255 770.576 215.215 770.576 214.241C770.576 213.322 768.261 213.291 763.232 214.846C757.729 216.547 749.442 220.001 738.384 225.205C716.404 235.549 699.617 256.129 688.028 286.99C687.971 287.142 687.866 287.271 687.729 287.359C670.49 298.363 653.721 314.874 637.428 336.897C621.341 358.642 612.248 381.957 610.14 406.854Z"
|
||||
fill="#263E4B"
|
||||
></path>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
clip-rule="evenodd"
|
||||
d="M771.5 208.165L764.475 225.953C764.07 226.981 764.573 228.142 765.601 228.548C766.005 228.708 766.451 228.731 766.87 228.615L796.873 220.291L816.729 227.364C817.77 227.734 818.913 227.191 819.284 226.151C819.506 225.529 819.406 224.837 819.017 224.303L808 209.166C805.957 210.946 801.579 211.836 794.867 211.836C788.155 211.836 780.366 210.612 771.5 208.165Z"
|
||||
fill="white"
|
||||
></path>
|
||||
<path
|
||||
d="M796.406 220.838L767.571 228.838C766.995 228.998 766.382 228.965 765.826 228.745C764.413 228.186 763.721 226.587 764.279 225.173L771.303 207.388C771.443 207.032 771.83 206.839 772.199 206.941C781.005 209.371 788.729 210.584 795.367 210.584C801.909 210.584 806.142 209.724 808.008 208.099C808.339 207.81 808.847 207.868 809.106 208.223L820.119 223.355C820.654 224.09 820.792 225.042 820.488 225.899C819.978 227.331 818.406 228.079 816.975 227.57L797.909 220.778C797.943 221.063 797.982 221.398 798.026 221.782C798.214 223.41 798.495 225.935 798.871 229.357C799.621 236.198 800.746 246.627 802.246 260.643C802.29 261.055 801.992 261.426 801.58 261.47C801.168 261.514 800.798 261.215 800.754 260.803C799.254 246.788 798.129 236.361 797.379 229.521C797.005 226.101 796.723 223.579 796.536 221.954C796.486 221.517 796.442 221.145 796.406 220.838ZM796.387 212.079C796.552 212.723 796.709 213.439 796.859 214.222C797.105 215.498 797.297 216.725 797.523 218.344L797.619 219.029C797.622 219.048 797.624 219.066 797.627 219.084L817.478 226.155C818.128 226.387 818.843 226.047 819.074 225.396C819.213 225.006 819.15 224.573 818.907 224.239L808.343 209.725C806.078 211.235 802.105 211.999 796.387 212.079ZM796.15 219.351C796.145 219.316 796.14 219.279 796.134 219.239L796.038 218.552C795.815 216.956 795.626 215.751 795.386 214.506C795.211 213.595 795.028 212.783 794.837 212.084C788.34 212.023 780.879 210.849 772.45 208.566L765.674 225.725C765.42 226.368 765.735 227.095 766.377 227.349C766.63 227.449 766.909 227.464 767.171 227.391L796.15 219.351Z"
|
||||
fill="#263E4B"
|
||||
></path>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
clip-rule="evenodd"
|
||||
d="M694 380.003C735.492 313.794 759.325 277.254 765.5 270.382C770.319 265.019 778.573 264.578 783.937 269.397C787.95 273.003 789.332 278.708 787.413 283.751L772.5 322.94"
|
||||
fill="white"
|
||||
></path>
|
||||
<path
|
||||
d="M694.461 380.754C735.906 314.621 759.754 278.058 765.883 271.236C770.428 266.179 778.207 265.767 783.259 270.316C787.04 273.721 788.339 279.102 786.529 283.859L771.625 323.025L773.027 323.56L787.93 284.394C789.961 279.057 788.504 273.019 784.263 269.2C778.595 264.096 769.867 264.558 764.768 270.232C758.548 277.154 734.73 313.671 693.19 379.956L694.461 380.754Z"
|
||||
fill="#263E4B"
|
||||
></path>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
clip-rule="evenodd"
|
||||
d="M786.682 136.615C785.515 136.27 784.279 136.085 783 136.085C775.82 136.085 770 141.912 770 149.1C770 155.207 774.202 160.331 779.869 161.734L779.281 173.844C779.124 177.073 776.437 179.598 773.204 179.552L757.774 179.336C756.784 179.322 755.801 179.174 754.851 178.898C749.019 177.198 745.668 171.093 747.367 165.26L764.325 107.053H766.333L766.341 107.042L768.693 107.053H777.5L777.502 107.096L798.419 107.196C796.004 118.304 793.835 125.727 791.912 129.465C790.54 132.134 788.796 134.517 786.682 136.615ZM857.746 107.053C859.715 115.396 856.668 119.567 848.605 119.567C840.543 119.567 828.45 115.396 812.325 107.053H857.746Z"
|
||||
fill="#263E4B"
|
||||
></path>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
clip-rule="evenodd"
|
||||
d="M672.687 397.476L740.579 336.982C750.462 328.176 763.283 323.387 776.52 323.557L853.826 324.552C864.386 324.688 873.017 333.016 873.53 343.565C874.016 353.548 866.316 362.035 856.332 362.521C856.105 362.532 855.878 362.539 855.651 362.541L790.201 363.257C786.197 363.301 782.986 366.583 783.03 370.587C783.03 370.589 783.03 370.592 783.03 370.595C783.079 374.649 786.32 377.94 790.373 378.051L857.931 379.903C867.136 380.155 874.482 387.665 874.53 396.874C874.578 405.948 867.26 413.344 858.186 413.392C858.157 413.392 858.128 413.392 858.099 413.392H793.701C789.741 413.392 786.53 416.603 786.53 420.564C786.53 420.592 786.53 420.621 786.53 420.65C786.582 425.005 789.36 428.86 793.474 430.288L834.71 444.604C841.846 447.081 845.622 454.874 843.145 462.009C843.035 462.326 842.913 462.639 842.78 462.947C839.479 470.591 830.877 474.437 822.978 471.802L755.943 449.432L719.676 473.637C701.076 486.05 675.935 481.035 663.522 462.436C662.354 460.686 661.325 458.849 660.443 456.94C657.284 450.103 656.299 440.307 657.487 427.553C658.567 415.966 663.998 405.218 672.687 397.476Z"
|
||||
fill="white"
|
||||
></path>
|
||||
<path
|
||||
d="M669.986 468.57L682.632 460.432C678.293 456.284 674.789 451.188 671.829 445.263C667.54 436.674 668.95 420.252 675.979 395.89L673.584 398.024C665.023 405.652 659.672 416.248 658.612 427.672C657.442 440.282 658.416 449.936 661.506 456.625C662.368 458.489 663.372 460.284 664.51 461.993C666.129 464.424 667.969 466.62 669.986 468.57ZM671.121 469.625C684.3 481.406 704.235 483.295 719.62 473.027L723.119 470.691C709.216 473.205 697.907 471.153 688.845 465.331C687.039 464.17 685.352 462.886 683.773 461.483L671.121 469.625ZM676.778 393.167C676.779 393.163 676.78 393.159 676.781 393.155C676.867 392.869 677.107 392.672 677.383 392.628L740.468 336.417C750.488 327.488 763.481 322.634 776.895 322.806L854.239 323.802C865.184 323.943 874.13 332.584 874.662 343.528C875.167 353.925 867.158 362.764 856.772 363.271C856.536 363.282 856.299 363.289 856.063 363.292L790.584 364.008C786.998 364.047 784.123 366.989 784.163 370.578L784.163 370.586C784.207 374.236 787.123 377.201 790.768 377.301L858.352 379.153C867.952 379.416 875.612 387.256 875.663 396.87C875.713 406.359 868.069 414.092 858.59 414.143L858.5 414.143H794.076C790.534 414.143 787.662 417.018 787.662 420.564C787.662 420.602 787.662 420.602 787.663 420.641C787.711 424.679 790.284 428.253 794.096 429.577L835.35 443.898C842.865 446.507 846.845 454.722 844.239 462.246C844.122 462.584 843.993 462.917 843.851 463.245C840.395 471.248 831.398 475.275 823.135 472.518L756.436 450.26L720.452 474.276C701.501 486.924 675.896 481.798 663.262 462.826C662.081 461.052 661.039 459.19 660.145 457.255C656.925 450.287 655.926 440.383 657.119 427.533C658.214 415.73 663.742 404.783 672.586 396.902L676.778 393.167ZM678.093 394.005C670.587 419.29 668.975 436.191 673.171 444.591C677.317 452.893 682.539 459.495 689.655 464.067C698.919 470.019 710.646 471.889 725.342 468.72C725.547 468.676 725.75 468.72 725.913 468.827L756.215 448.603L823.61 471.093C831.134 473.604 839.327 469.937 842.474 462.649C842.601 462.355 842.717 462.057 842.822 461.754C845.157 455.014 841.591 447.654 834.858 445.317L793.605 430.996C789.196 429.465 786.219 425.33 786.163 420.659C786.162 420.611 786.162 420.611 786.162 420.564C786.162 416.188 789.705 412.641 794.076 412.641H858.5L858.583 412.641C867.233 412.595 874.208 405.538 874.163 396.878C874.116 388.074 867.102 380.895 858.311 380.654L790.727 378.802C786.276 378.68 782.716 375.061 782.663 370.604L782.663 370.595C782.614 366.176 786.154 362.555 790.567 362.506L856.046 361.79C856.264 361.788 856.482 361.781 856.699 361.771C866.258 361.305 873.629 353.17 873.164 343.601C872.67 333.449 864.372 325.434 854.22 325.303L776.875 324.308C763.836 324.14 751.206 328.859 741.465 337.538L678.093 394.005Z"
|
||||
fill="#263E4B"
|
||||
></path>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
clip-rule="evenodd"
|
||||
d="M1011.08 342.03L1011.09 344.065C1011.14 354.446 1019.56 362.836 1029.95 362.836H1044.17C1032.42 363.74 1024.75 367.578 1021.17 374.349C1015.54 385.013 1019.62 398.224 1030.29 403.857C1033.43 405.517 1036.93 406.384 1040.48 406.384H1046.67L1044.98 407.214C1033.09 413.053 1028.17 427.43 1034.01 439.327C1034.36 440.045 1034.75 440.744 1035.17 441.423C1040.86 449.341 1051.89 451.151 1059.8 445.466C1060.33 445.087 1060.84 444.678 1061.32 444.242L1072.36 434.297C1078.46 428.805 1081.32 420.58 1079.96 412.489C1079.87 411.9 1079.77 411.367 1079.67 410.889C1079.1 407.971 1077.1 403.633 1073.67 397.875C1076.01 393.203 1076.67 387.53 1075.67 380.856C1074.67 374.182 1071.84 368.342 1067.17 363.337C1069.45 357.51 1069.78 351.003 1068.17 343.815C1067.54 340.969 1066.66 338.543 1065.53 336.538C1063.47 332.86 1059.75 330.413 1055.55 329.973L1027.64 327.042C1019.4 326.177 1012.02 332.155 1011.16 340.394C1011.1 340.937 1011.08 341.483 1011.08 342.03Z"
|
||||
fill="white"
|
||||
></path>
|
||||
<path
|
||||
d="M1046.88 405.132L1073.47 396.754C1075.61 392.285 1076.22 386.861 1075.26 380.466C1074.28 373.961 1071.53 368.274 1066.99 363.388L1066.99 363.586L1043.94 363.134C1032.77 364.104 1025.54 367.807 1022.16 374.199C1016.73 384.491 1020.65 397.246 1030.94 402.688C1033.97 404.293 1037.35 405.132 1040.78 405.132H1046.88ZM1047.28 406.582L1045.62 407.394C1034.12 413.041 1029.36 426.958 1035 438.478C1035.35 439.179 1035.72 439.862 1036.11 440.484C1041.56 448.073 1052.12 449.804 1059.7 444.349C1060.2 443.988 1060.68 443.599 1061.14 443.186L1072.17 433.25C1078.09 427.921 1080.87 419.933 1079.54 412.077C1079.45 411.509 1079.35 410.994 1079.26 410.534C1078.73 407.806 1076.86 403.704 1073.66 398.269L1047.28 406.582ZM1044.5 361.643L1066.98 362.084C1069.03 356.526 1069.3 350.329 1067.77 343.478C1067.15 340.703 1066.29 338.348 1065.21 336.412C1063.26 332.943 1059.76 330.634 1055.8 330.219L1027.89 327.288C1020.06 326.466 1013.05 332.152 1012.23 339.988C1012.18 340.504 1012.15 341.023 1012.15 341.542L1012.16 343.561C1012.21 353.529 1020.29 361.584 1030.25 361.584H1044.5L1044.5 361.643ZM1020.84 373.497C1023.51 368.442 1028.34 364.978 1035.3 363.086H1030.25C1019.47 363.086 1010.71 354.362 1010.66 343.568L1010.65 341.549C1010.65 340.975 1010.68 340.402 1010.74 339.831C1011.65 331.17 1019.4 324.886 1028.05 325.794L1055.96 328.725C1060.4 329.191 1064.33 331.783 1066.52 335.677C1067.68 337.748 1068.58 340.24 1069.23 343.15C1070.83 350.299 1070.54 356.81 1068.37 362.669C1072.95 367.708 1075.74 373.572 1076.74 380.244C1077.74 386.888 1077.11 392.591 1074.85 397.339C1078.19 402.992 1080.15 407.28 1080.74 410.243C1080.83 410.718 1080.93 411.246 1081.02 411.827C1082.43 420.19 1079.47 428.693 1073.17 434.366L1062.15 444.302C1061.65 444.752 1061.12 445.175 1060.58 445.568C1052.32 451.507 1040.82 449.623 1034.86 441.319C1034.42 440.613 1034.02 439.885 1033.66 439.139C1027.84 427.257 1032.41 412.98 1043.84 406.634H1040.78C1037.1 406.634 1033.48 405.735 1030.23 404.015C1019.22 398.186 1015.01 384.522 1020.84 373.497ZM1030.23 331.285C1030.64 331.279 1030.98 331.611 1030.99 332.025C1030.99 332.44 1030.66 332.781 1030.25 332.787C1024.72 332.865 1022.27 336.172 1022.74 343.099C1023.22 350.056 1025.68 353.178 1030.19 352.863C1030.61 352.834 1030.96 353.146 1030.99 353.56C1031.02 353.973 1030.71 354.332 1030.3 354.361C1024.81 354.745 1021.77 350.892 1021.25 343.201C1020.72 335.479 1023.76 331.377 1030.23 331.285ZM1037.4 374.102C1037.81 374.067 1038.17 374.374 1038.21 374.787C1038.24 375.2 1037.94 375.563 1037.52 375.598C1032.01 376.062 1029.8 379.532 1030.75 386.408C1031.71 393.315 1034.39 396.258 1038.87 395.629C1039.28 395.572 1039.66 395.858 1039.71 396.268C1039.77 396.679 1039.48 397.059 1039.07 397.116C1033.63 397.882 1030.33 394.25 1029.27 386.615C1028.2 378.948 1030.95 374.644 1037.4 374.102ZM1047.91 417.887C1048.32 417.802 1048.71 418.062 1048.8 418.468C1048.88 418.874 1048.62 419.272 1048.22 419.357C1042.81 420.488 1041.03 424.203 1042.82 430.911C1044.61 437.65 1047.62 440.245 1051.99 439.075C1052.39 438.968 1052.8 439.206 1052.91 439.606C1053.02 440.007 1052.78 440.418 1052.38 440.525C1047.07 441.949 1043.35 438.747 1041.37 431.298C1039.37 423.818 1041.58 419.211 1047.91 417.887Z"
|
||||
fill="#263E4B"
|
||||
></path>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
clip-rule="evenodd"
|
||||
d="M398.221 552.239L422.5 805.797H435L423.095 549.797C422.783 543.079 417.084 537.887 410.366 538.199C410.16 538.209 409.955 538.223 409.75 538.243C402.705 538.93 397.546 545.192 398.221 552.239Z"
|
||||
fill="white"
|
||||
></path>
|
||||
<path
|
||||
d="M397.474 551.838L421.818 806.075H435.786L423.844 549.29C423.513 542.158 417.463 536.646 410.331 536.978C410.113 536.988 409.895 537.003 409.677 537.025C402.22 537.752 396.76 544.38 397.474 551.838ZM423.182 804.575L398.968 551.695C398.332 545.06 403.189 539.164 409.823 538.518C410.015 538.499 410.208 538.485 410.401 538.476C416.705 538.183 422.053 543.055 422.346 549.359L434.214 804.575H423.182Z"
|
||||
fill="#263E4B"
|
||||
></path>
|
||||
<path
|
||||
d="M416.373 813.117C416.216 813.5 415.778 813.684 415.395 813.527C415.011 813.37 414.828 812.933 414.985 812.549C424.88 788.355 430.64 771.45 432.261 761.875C432.33 761.467 432.717 761.191 433.125 761.261C433.534 761.33 433.809 761.717 433.74 762.125C432.095 771.842 426.308 788.825 416.373 813.117ZM431.711 728.464C431.843 728.857 431.631 729.282 431.239 729.414C430.846 729.545 430.421 729.334 430.289 728.941C425.885 715.808 416.988 704.604 403.573 695.319C403.233 695.083 403.148 694.616 403.383 694.276C403.619 693.935 404.086 693.85 404.427 694.086C418.097 703.548 427.2 715.01 431.711 728.464ZM420.951 781.645C420.78 782.022 420.336 782.189 419.959 782.018C419.581 781.847 419.414 781.403 419.585 781.026C420.923 778.073 421.819 775.669 422.272 773.821C428.497 748.44 424.638 729.892 413.617 716.708C413.351 716.391 413.393 715.918 413.711 715.652C414.029 715.386 414.502 715.428 414.768 715.746C426.103 729.306 430.064 748.345 423.728 774.179C423.25 776.13 422.324 778.615 420.951 781.645ZM403.272 539.843C403.22 539.432 403.51 539.056 403.921 539.004C404.332 538.952 404.708 539.242 404.76 539.653C411.259 590.601 435.649 617.544 478.035 620.707C478.448 620.738 478.758 621.098 478.727 621.511C478.696 621.924 478.336 622.234 477.923 622.203C434.775 618.983 409.856 591.456 403.272 539.843ZM414.253 539.071C414.214 538.659 414.517 538.293 414.929 538.253C415.342 538.214 415.708 538.517 415.747 538.929C420.007 583.791 440.287 607.18 476.723 609.861C477.136 609.891 477.446 610.251 477.416 610.664C477.386 611.077 477.026 611.387 476.613 611.357C439.391 608.618 418.578 584.615 414.253 539.071Z"
|
||||
fill="#263E4B"
|
||||
></path>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
clip-rule="evenodd"
|
||||
d="M813.5 141.091C811.567 141.091 810 139.298 810 137.086C810 134.875 811.567 133.082 813.5 133.082C815.433 133.082 817 134.875 817 137.086C817 139.298 815.433 141.091 813.5 141.091ZM844.5 141.091C842.567 141.091 841 139.298 841 137.086C841 134.875 842.567 133.082 844.5 133.082C846.433 133.082 848 134.875 848 137.086C848 139.298 846.433 141.091 844.5 141.091ZM806.572 133.567C806.305 133.884 805.831 133.923 805.515 133.655C805.199 133.387 805.16 132.913 805.428 132.597C805.547 132.456 805.762 132.221 806.061 131.923C806.556 131.431 807.114 130.94 807.725 130.48C809.504 129.139 811.364 128.327 813.241 128.327C815.957 128.327 817.444 128.976 818.945 130.625C819.182 130.885 819.422 131.17 819.737 131.559C819.83 131.673 820.402 132.387 820.582 132.608C820.843 132.929 820.795 133.402 820.474 133.664C820.153 133.926 819.68 133.878 819.419 133.556C819.235 133.331 818.661 132.615 818.572 132.505C818.273 132.136 818.05 131.872 817.836 131.636C816.621 130.302 815.537 129.828 813.241 129.828C811.747 129.828 810.169 130.517 808.627 131.68C808.074 132.096 807.567 132.543 807.118 132.989C806.851 133.255 806.665 133.458 806.572 133.567ZM838.59 133.546C838.334 133.872 837.862 133.928 837.536 133.672C837.211 133.416 837.154 132.944 837.41 132.618C837.521 132.477 837.721 132.241 838 131.943C838.461 131.45 838.98 130.958 839.548 130.496C841.211 129.147 842.955 128.327 844.724 128.327C847.273 128.327 848.675 128.987 850.078 130.646C850.298 130.906 850.521 131.191 850.814 131.58C850.9 131.695 851.432 132.409 851.598 132.629C851.848 132.96 851.783 133.431 851.452 133.681C851.122 133.931 850.652 133.866 850.402 133.535C850.232 133.309 849.699 132.594 849.616 132.484C849.339 132.115 849.131 131.851 848.933 131.616C847.814 130.292 846.829 129.828 844.724 129.828C843.363 129.828 841.914 130.51 840.492 131.663C839.981 132.078 839.512 132.524 839.095 132.969C838.848 133.234 838.675 133.437 838.59 133.546ZM833.326 147.348H839.229L832.627 130.351C832.476 129.964 832.668 129.529 833.054 129.379C833.44 129.229 833.874 129.42 834.025 129.806L841.025 147.826C841.216 148.319 840.853 148.849 840.326 148.849H833.326C832.911 148.849 832.576 148.513 832.576 148.099C832.576 147.684 832.911 147.348 833.326 147.348ZM829.68 157.77C829.315 157.966 828.86 157.829 828.665 157.463C828.469 157.097 828.606 156.642 828.971 156.447C831.688 154.99 834.305 154.99 836.717 156.468C837.071 156.685 837.182 157.147 836.965 157.501C836.749 157.854 836.287 157.965 835.934 157.749C833.991 156.558 831.941 156.558 829.68 157.77Z"
|
||||
fill="#263E4B"
|
||||
></path>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
clip-rule="evenodd"
|
||||
d="M278 597.553L318 721.189L515.5 694.66V550L320.391 589.065L318 606.062L305.204 592.106L278 597.553Z"
|
||||
fill="white"
|
||||
></path>
|
||||
<path
|
||||
d="M305.757 591.141C305.58 590.948 305.314 590.861 305.057 590.912L277.853 596.359C277.413 596.447 277.148 596.899 277.286 597.326L317.286 720.962C317.398 721.307 317.741 721.523 318.1 721.475L515.6 694.945C515.972 694.895 516.25 694.578 516.25 694.202V549.542C516.25 549.069 515.817 548.714 515.353 548.807L320.244 587.872C319.931 587.934 319.692 588.187 319.648 588.503L317.479 603.926L305.757 591.141ZM304.937 592.466L317.447 606.111C317.876 606.578 318.654 606.336 318.743 605.709L321.059 589.238L514.75 550.457V693.546L318.521 719.905L278.973 597.665L304.937 592.466Z"
|
||||
fill="#263E4B"
|
||||
></path>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
clip-rule="evenodd"
|
||||
d="M234 941.714H300.5C326.694 873.466 350.743 830.856 372.648 813.883C373.942 812.881 366.226 801.765 349.5 780.536C360.342 789.118 367.842 794.624 372 797.054C373.958 798.198 374.125 781.847 372.5 748L390.404 802.257C397.221 798.831 402.419 796.429 406 795.052C456.333 775.697 497.667 824.585 530 941.714H1206"
|
||||
fill="white"
|
||||
></path>
|
||||
<path
|
||||
d="M371.622 797.463C372.335 797.88 372.979 797.493 373.33 796.742C373.558 796.255 373.733 795.516 373.876 794.497C374.147 792.557 374.302 789.535 374.344 785.418C374.418 778.132 374.138 767.392 373.503 753.194L389.692 802.254C389.836 802.688 390.332 802.894 390.741 802.689C397.537 799.272 402.716 796.88 406.269 795.513C456.011 776.386 497.048 824.924 529.277 941.675C529.367 942 529.663 942.225 530 942.225H1206C1206.41 942.225 1206.75 941.889 1206.75 941.475C1206.75 941.061 1206.41 940.725 1206 940.725H530.571C498.155 823.614 456.577 774.561 405.731 794.113C402.26 795.448 397.301 797.729 390.844 800.959L373.212 747.526C372.939 746.697 371.709 746.925 371.751 747.797C372.563 764.707 372.927 777.244 372.844 785.402C372.802 789.461 372.65 792.428 372.39 794.289C372.283 795.053 372.159 795.617 372.031 795.962C367.846 793.457 360.482 788.034 349.965 779.709C349.268 779.157 348.36 780.063 348.911 780.761C357.265 791.365 363.368 799.441 367.215 804.983C369.128 807.74 370.48 809.865 371.266 811.348C371.644 812.06 371.884 812.613 371.987 812.991C372.007 813.065 372.02 813.127 372.028 813.176C350.076 830.301 326.09 872.801 299.985 940.725H234C233.586 940.725 233.25 941.061 233.25 941.475C233.25 941.889 233.586 942.225 234 942.225H300.5C300.811 942.225 301.089 942.034 301.2 941.744C327.347 873.619 351.344 831.1 373.107 814.237C374.337 813.285 372.831 810.443 368.447 804.128C365.195 799.443 360.353 792.975 353.92 784.72C362.189 791.151 368.084 795.396 371.622 797.463Z"
|
||||
fill="#263E4B"
|
||||
></path>
|
||||
<path
|
||||
d="M821.226 59.2505H792.821C780.06 59.2505 769.699 69.5437 769.572 82.2896L752.709 106.625C752.364 107.123 752.72 107.804 753.325 107.804H867.325C867.987 107.804 868.325 107.009 867.865 106.532L843.474 81.2199C843.311 69.0586 833.413 59.2505 821.226 59.2505ZM770.938 82.9542C771.025 82.8285 771.071 82.6792 771.071 82.5262C771.071 70.5007 780.809 60.7521 792.821 60.7521H821.226C832.686 60.7521 841.976 70.0525 841.976 81.5251C841.976 81.7196 842.052 81.9064 842.187 82.0464L865.56 106.302H754.759L770.938 82.9542Z"
|
||||
fill="#263E4B"
|
||||
></path>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
clip-rule="evenodd"
|
||||
d="M842.419 82.0259L770 83.027L765 90.5353H850.5L842.419 82.0259Z"
|
||||
fill="#fa9b60"
|
||||
></path>
|
||||
<path
|
||||
d="M842.909 80.7745L770.49 81.7757C770.243 81.7791 770.013 81.9041 769.876 82.1099L764.876 89.6182C764.544 90.1172 764.901 90.7855 765.5 90.7855H851C851.659 90.7855 851.998 89.9956 851.544 89.5174L843.463 81.008C843.319 80.8563 843.118 80.7717 842.909 80.7745ZM849.252 89.2839H766.902L770.905 83.2717L842.602 82.2806L849.252 89.2839Z"
|
||||
fill="#263E4B"
|
||||
></path>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
clip-rule="evenodd"
|
||||
d="M639.5 921.954L631 962.999H664H792C784.618 947.405 775.952 936.56 766 930.463C756.048 924.367 737.882 921.53 711.5 921.954L725 851.876L644 852.377L643 904.935L639.5 921.954Z"
|
||||
fill="white"
|
||||
></path>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
clip-rule="evenodd"
|
||||
d="M857 915.947V963.5L877 962.999H1005C997.618 947.405 988.952 936.56 979 930.463C969.048 924.367 950.882 921.53 924.5 921.954L937 853L849.5 852.377L856 904.935L857 915.947Z"
|
||||
fill="white"
|
||||
></path>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
clip-rule="evenodd"
|
||||
d="M643 905.436C650.656 906.675 656.656 911.514 661 919.952C665.344 928.389 667.678 939.735 668 953.989L633 953.489"
|
||||
fill="#fa9b60"
|
||||
></path>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
clip-rule="evenodd"
|
||||
d="M857 905.436C870.656 908.678 879.656 914.517 884 922.955C888.344 931.392 890.344 941.737 890 953.989L857 953.489V905.436Z"
|
||||
fill="#fa9b60"
|
||||
></path>
|
||||
<path
|
||||
d="M667.872 851.98L673.44 813.583H661.5V812.083H673.657L676.633 791.559H666V790.059H724V791.559H712.374L708.571 812.083H719.5V813.583H708.293L701.217 851.774L725.909 851.621L714.849 909.034L718.669 898.56C718.829 898.12 719.029 897.695 719.266 897.291C721.435 893.596 726.188 892.359 729.883 894.527C730.505 894.892 731.066 895.353 731.544 895.893C734.052 898.726 733.79 903.055 730.958 905.563L713.181 921.306C716.527 920.474 724.742 918.362 736.811 915.221C737.212 915.117 737.622 915.357 737.726 915.758C737.83 916.159 737.59 916.568 737.189 916.673C728.397 918.961 722.057 920.601 717.872 921.666C740.958 921.771 757.119 924.643 766.392 930.324C776.483 936.506 785.239 947.463 792.678 963.179L793.185 964.249H630.079L638.765 922.303L642.252 905.352L643.264 852.132L667.872 851.98ZM669.389 851.97L683.894 851.881L689.756 813.583H674.956L669.389 851.97ZM685.413 851.871L699.69 851.783L706.768 813.583H691.273L685.413 851.871ZM712.136 923.195C712.071 923.207 712.005 923.211 711.938 923.206L695.022 923.704C694.608 923.716 694.263 923.391 694.25 922.977C694.238 922.563 694.564 922.217 694.978 922.205L710.085 921.76L691.796 905.563C688.964 903.055 688.701 898.726 691.209 895.893C691.688 895.353 692.248 894.892 692.87 894.527C696.565 892.359 701.319 893.596 703.487 897.291C703.724 897.695 703.924 898.12 704.085 898.56L711.377 918.556L711.611 917.914L724.091 853.132L644.736 853.623L643.761 904.873C659.331 909.501 668.256 925.523 668.739 952.738H785.371C779.466 943.098 772.876 936.055 765.608 931.603C755.888 925.648 738.048 922.827 712.136 923.195ZM713.061 918.315L712.807 919.633L729.963 904.44C732.175 902.481 732.38 899.1 730.421 896.888C730.048 896.466 729.61 896.106 729.124 895.821C726.143 894.072 722.309 895.07 720.56 898.05C720.369 898.376 720.208 898.719 720.078 899.074L713.061 918.315ZM786.272 954.238H633.684L631.921 962.749H790.81C789.346 959.726 787.834 956.889 786.272 954.238ZM633.994 952.738H667.239C666.764 926.266 658.233 910.881 643.571 906.383L640.234 922.606L633.994 952.738ZM702.676 899.074C702.546 898.719 702.385 898.376 702.194 898.05C700.444 895.07 696.61 894.072 693.63 895.821C693.144 896.106 692.706 896.466 692.332 896.888C690.373 899.1 690.578 902.481 692.791 904.44L710.281 919.93L702.676 899.074ZM710.848 791.559H694.644L691.503 812.083H707.046L710.848 791.559ZM693.127 791.559H678.149L675.173 812.083H689.985L693.127 791.559Z"
|
||||
fill="#263E4B"
|
||||
></path>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M636.5 317.786H620L638 289.255" fill="#fa9b60"></path>
|
||||
<path
|
||||
d="M867.076 851.727L861.545 813.583H852V812.083H861.327L858.351 791.559H849V790.059H909.5V791.559H896.579L898.646 812.083H910V813.583H898.797L902.659 851.931L937.89 852.132L926.484 918.261L933.669 898.56C933.829 898.12 934.029 897.695 934.266 897.291C936.435 893.596 941.188 892.359 944.883 894.527C945.505 894.892 946.066 895.353 946.544 895.893C949.053 898.726 948.79 903.055 945.958 905.563L928.977 920.601C933.207 919.526 940.317 917.692 949.811 915.221C950.212 915.117 950.622 915.357 950.726 915.758C950.83 916.159 950.59 916.568 950.189 916.673C941.402 918.96 935.064 920.599 930.879 921.664C954.228 921.731 970.553 924.603 979.892 930.324C989.983 936.506 998.739 947.463 1006.18 963.179L1006.68 964.249H856.257L856.25 963.506L855.757 905.533L848.644 851.622L867.076 851.727ZM868.592 851.736L883.654 851.822L880.265 813.583H863.06L868.592 851.736ZM885.16 851.831L901.15 851.922L897.29 813.583H881.771L885.16 851.831ZM857.154 904.701C878.876 909.078 890.088 925.167 890.735 952.738H998.871C992.966 943.098 986.376 936.055 979.108 931.603C969.423 925.669 951.678 922.848 925.917 923.191C925.817 923.213 925.716 923.214 925.619 923.195C925.441 923.197 925.263 923.2 925.084 923.203C925.036 923.209 924.987 923.21 924.938 923.206L908.022 923.704C907.608 923.716 907.263 923.391 907.25 922.977C907.238 922.563 907.564 922.217 907.978 922.205L923.085 921.76L904.796 905.563C901.964 903.055 901.701 898.726 904.209 895.893C904.688 895.353 905.248 894.892 905.871 894.527C909.566 892.359 914.319 893.596 916.487 897.291C916.724 897.695 916.924 898.12 917.085 898.56L924.74 919.551L936.111 853.622L850.356 853.132L857.154 904.701ZM857.257 906.254L857.657 952.738H889.235C888.6 926.013 877.958 910.593 857.257 906.254ZM999.772 954.238H857.67L857.744 962.749H1004.31C1002.85 959.726 1001.33 956.889 999.772 954.238ZM915.676 899.074C915.546 898.719 915.385 898.376 915.194 898.05C913.444 895.07 909.61 894.072 906.63 895.821C906.144 896.106 905.706 896.466 905.332 896.888C903.373 899.1 903.578 902.481 905.791 904.44L923.281 919.93L915.676 899.074ZM935.078 899.074L927.472 919.93L944.963 904.44C947.175 902.481 947.38 899.1 945.421 896.888C945.048 896.466 944.61 896.106 944.124 895.821C941.143 894.072 937.309 895.07 935.56 898.05C935.369 898.376 935.208 898.719 935.078 899.074ZM895.072 791.559H879.82L881.638 812.083H897.139L895.072 791.559ZM878.314 791.559H859.867L862.843 812.083H880.132L878.314 791.559Z"
|
||||
fill="#263E4B"
|
||||
></path>
|
||||
<path
|
||||
d="M379.158 651.096L380.634 660.414L372.06 661.772L373.167 668.761L362.145 670.506L361.038 663.518L330.787 668.309L329.311 658.991L355.348 627.593L366.371 625.847L370.585 652.454L379.158 651.096ZM341.191 657.109L359.562 654.199L357.096 638.628L341.191 657.109ZM409.823 663.583C392.799 666.28 383.473 659.713 381.211 645.429C378.958 631.206 385.808 622.14 402.832 619.444C419.794 616.758 429.182 623.315 431.425 637.476C433.677 651.699 426.785 660.897 409.823 663.583ZM408.357 654.326C418.032 652.794 421.674 647.253 420.402 639.222C419.14 631.252 413.973 627.169 404.298 628.701C394.623 630.234 390.961 635.652 392.233 643.683C393.515 651.775 398.681 655.859 408.357 654.326ZM485.71 634.22L487.185 643.538L478.612 644.896L479.719 651.884L468.697 653.63L467.59 646.642L437.339 651.433L435.863 642.115L461.9 610.717L472.922 608.971L477.136 635.577L485.71 634.22ZM447.743 640.233L466.114 637.323L463.648 621.752L447.743 640.233Z"
|
||||
fill="#60a5fa"
|
||||
></path>
|
||||
<path
|
||||
d="M380.26 649.745L381.971 660.545L373.398 661.903L374.505 668.892L362.001 670.872L360.894 663.883L330.643 668.675L328.996 658.281L355.43 626.405L367.473 624.497L371.687 651.103L380.26 649.745ZM370.44 652.819L366.226 626.213L356.224 627.798L330.584 658.716L331.89 666.959L362.141 662.167L363.247 669.156L372.788 667.645L371.682 660.656L380.255 659.298L379.013 651.462L370.44 652.819ZM339.768 657.677L358.062 636.42L360.899 654.331L339.768 657.677ZM359.183 653.084L357.087 639.852L343.572 655.556L359.183 653.084ZM410.419 663.832C393.305 666.543 383.322 660.038 380.949 645.054C378.587 630.139 386.072 620.923 403.194 618.211C420.251 615.509 430.292 622.01 432.645 636.866C435.008 651.791 427.47 661.131 410.419 663.832ZM410.185 662.35C426.449 659.774 433.392 651.172 431.163 637.101C428.946 623.1 419.701 617.115 403.428 619.693C387.092 622.28 380.204 630.76 382.431 644.819C384.668 658.949 393.856 664.936 410.185 662.35ZM408.953 654.575C399.176 656.123 393.365 652.104 391.972 643.308C390.589 634.581 394.878 629.017 404.66 627.468C414.418 625.922 420.246 629.923 421.622 638.612C423.009 647.369 418.708 653.03 408.953 654.575ZM408.718 653.093C417.669 651.676 421.395 646.771 420.14 638.847C418.897 630.995 413.852 627.531 404.894 628.95C395.913 630.372 392.204 635.184 393.453 643.074C394.714 651.035 399.745 654.515 408.718 653.093ZM486.812 632.869L488.523 643.669L479.95 645.027L481.056 652.016L468.552 653.996L467.445 647.007L437.195 651.799L435.548 641.405L461.982 609.528L474.025 607.621L478.239 634.227L486.812 632.869ZM476.992 635.943L472.778 609.337L462.776 610.921L437.136 641.84L438.441 650.082L468.692 645.291L469.799 652.28L479.34 650.769L478.233 643.78L486.807 642.422L485.565 634.585L476.992 635.943ZM446.32 640.801L464.614 619.543L467.451 637.454L446.32 640.801ZM465.735 636.208L463.639 622.976L450.124 638.68L465.735 636.208Z"
|
||||
fill="#263E4B"
|
||||
></path>
|
||||
<path
|
||||
d="M637.805 288.449C637.896 288.108 637.973 287.791 638.037 287.498L638.857 270.188C640.216 241.493 663.851 218.927 692.547 218.927H749V220.428H692.547C664.652 220.428 641.676 242.365 640.355 270.259L640.117 275.292C642.768 265.113 647.88 256.007 655.462 248.187C666.89 236.399 681.042 242.274 697.608 265.29C697.851 265.626 697.775 266.095 697.438 266.338C697.102 266.58 696.634 266.504 696.392 266.167C680.291 243.799 667.11 238.328 656.538 249.233C646.588 259.495 641.003 272.011 639.747 286.317C639.712 286.715 639.64 287.173 639.53 287.693L637.249 335.841L635.751 335.77L636.591 318.036H620.5C619.909 318.036 619.55 317.384 619.866 316.885L637.805 288.449ZM636.662 316.535L637.863 291.169L621.861 316.535H636.662Z"
|
||||
fill="#263E4B"
|
||||
></path>
|
||||
<path
|
||||
d="M859.16 355.654C858.746 355.638 858.423 355.289 858.439 354.875C858.455 354.461 858.803 354.138 859.217 354.153C864.742 354.365 867.365 351.19 867.254 344.249C867.141 337.276 864.846 334.029 860.326 334.108C859.912 334.115 859.57 333.785 859.563 333.37C859.555 332.956 859.885 332.614 860.299 332.606C865.797 332.51 868.629 336.516 868.754 344.225C868.878 351.964 865.624 355.901 859.16 355.654ZM857.56 408.47C857.147 408.432 856.843 408.067 856.881 407.654C856.918 407.241 857.283 406.937 857.695 406.974C863.202 407.474 865.988 404.442 866.24 397.504C866.492 390.534 864.37 387.172 859.852 387.014C859.438 386.999 859.114 386.652 859.128 386.237C859.143 385.823 859.49 385.499 859.904 385.513C865.4 385.705 868.018 389.854 867.739 397.558C867.458 405.293 864.003 409.055 857.56 408.47ZM824.775 466.912C824.396 466.746 824.223 466.303 824.39 465.923C824.556 465.544 824.999 465.371 825.378 465.537C830.475 467.771 833.872 466.306 835.93 460.972C838.001 455.603 836.914 452.29 832.659 450.657C832.272 450.509 832.079 450.074 832.228 449.687C832.377 449.3 832.811 449.107 833.197 449.255C838.297 451.213 839.678 455.424 837.329 461.512C834.967 467.636 830.663 469.493 824.775 466.912ZM770.775 267.037L772.225 267.424C769.489 277.696 763.78 283.757 755.147 285.486L754.853 284.013C762.887 282.405 768.178 276.787 770.775 267.037Z"
|
||||
fill="#263E4B"
|
||||
></path>
|
||||
<path
|
||||
d="M686.776 286.945L688.776 294.454C688.882 294.854 689.293 295.093 689.693 294.986C690.094 294.879 690.332 294.467 690.225 294.067L688.225 286.559C688.118 286.158 687.707 285.92 687.307 286.027C686.907 286.133 686.669 286.545 686.776 286.945Z"
|
||||
fill="#263E4B"
|
||||
></path>
|
||||
<path
|
||||
d="M687.332 287.484L693.832 288.985C694.235 289.078 694.638 288.827 694.731 288.422C694.824 288.018 694.572 287.615 694.169 287.522L687.669 286.02C687.265 285.927 686.863 286.179 686.769 286.583C686.676 286.987 686.928 287.39 687.332 287.484Z"
|
||||
fill="#263E4B"
|
||||
></path>
|
||||
<path
|
||||
d="M969.573 292.237C964.517 286.131 955.726 285.486 948.478 290.259C945.655 292.119 943.596 294.767 942.628 297.794C940.19 305.42 949.769 324.909 971.38 356.751C971.612 357.094 972.079 357.183 972.421 356.95C972.764 356.717 972.853 356.25 972.62 355.907C951.361 324.583 941.835 305.201 944.057 298.251C944.918 295.558 946.761 293.188 949.303 291.514C955.948 287.137 963.884 287.72 968.418 293.195C968.683 293.514 969.156 293.558 969.474 293.294C969.793 293.029 969.837 292.556 969.573 292.237Z"
|
||||
fill="#263E4B"
|
||||
></path>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</template>
|
|
@ -2,7 +2,17 @@
|
|||
export default {
|
||||
content: ["./index.html", "./src/**/*.{vue,js,ts,jsx,tsx}"],
|
||||
theme: {
|
||||
extend: {},
|
||||
extend: {
|
||||
colors: {
|
||||
primary: "var(--primary)",
|
||||
secondary: "var(--secondary)",
|
||||
accent: "var(--accent)",
|
||||
error: "var(--error)",
|
||||
warning: "var(--warning)",
|
||||
info: "var(--info)",
|
||||
success: "var(--success)",
|
||||
},
|
||||
},
|
||||
},
|
||||
plugins: [],
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue