Намутил фронтенда
This commit is contained in:
parent
07c26791b7
commit
4eb5d8d5b8
|
@ -10,6 +10,7 @@
|
|||
"pinia": "^2.1.7",
|
||||
"typescript": "^5.3.3",
|
||||
"vue": "^3.4.14",
|
||||
"vue-router": "^4.4.0",
|
||||
"vuetify": "^3.4.10"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
@ -1196,6 +1197,20 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"node_modules/vue-router": {
|
||||
"version": "4.4.0",
|
||||
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.4.0.tgz",
|
||||
"integrity": "sha512-HB+t2p611aIZraV2aPSRNXf0Z/oLZFrlygJm+sZbdJaW6lcFqEDQwnzUBXn+DApw+/QzDU/I9TeWx9izEjTmsA==",
|
||||
"dependencies": {
|
||||
"@vue/devtools-api": "^6.5.1"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/posva"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"vue": "^3.2.0"
|
||||
}
|
||||
},
|
||||
"node_modules/vuetify": {
|
||||
"version": "3.6.1",
|
||||
"resolved": "https://registry.npmjs.org/vuetify/-/vuetify-3.6.1.tgz",
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
"pinia": "^2.1.7",
|
||||
"typescript": "^5.3.3",
|
||||
"vue": "^3.4.14",
|
||||
"vue-router": "^4.4.0",
|
||||
"vuetify": "^3.4.10"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,52 +1,87 @@
|
|||
<template>
|
||||
<v-app>
|
||||
<v-sheet class="bg-gradient justify-center d-flex flex-column" style="height: 100%">
|
||||
<v-sheet class="rounded-lg main-bg h-auto mt-10 mr-10 ml-10 mb-3 pa-5">
|
||||
<p class="text-h3">Меню</p>
|
||||
<div v-if="!isWide" class="d-flex justify-end mr-10 mt-3">
|
||||
<v-btn
|
||||
class="bg-grey-darken-3 d-flex justify-center"
|
||||
size="large"
|
||||
density="compact"
|
||||
rounded="xl"
|
||||
@click="openMenu"
|
||||
icon
|
||||
>
|
||||
<v-icon>
|
||||
<svg class="ham hamRotate ham1" viewBox="0 0 100 100" onclick="this.classList.toggle('active')">
|
||||
<path
|
||||
class="line top"
|
||||
d="m 30,33 h 40 c 0,0 9.044436,-0.654587 9.044436,-8.508902 0,-7.854315 -8.024349,-11.958003 -14.89975,-10.85914 -6.875401,1.098863 -13.637059,4.171617 -13.637059,16.368042 v 40" />
|
||||
<path
|
||||
class="line middle"
|
||||
d="m 30,50 h 40" />
|
||||
<path
|
||||
class="line bottom"
|
||||
d="m 30,67 h 40 c 12.796276,0 15.357889,-11.717785 15.357889,-26.851538 0,-15.133752 -4.786586,-27.274118 -16.667516,-27.274118 -11.88093,0 -18.499247,6.994427 -18.435284,17.125656 l 0.252538,40" />
|
||||
</svg>
|
||||
</v-icon>
|
||||
</v-btn>
|
||||
</div>
|
||||
<v-sheet
|
||||
v-if="isWide || menuOpen"
|
||||
class="d-flex justify-end rounded-lg main-bg h-auto mr-10 ml-10"
|
||||
:class="menuOpen ? 'mt-2 mb-2 pa-2' : 'mt-10 mb-3 pa-5'"
|
||||
>
|
||||
<p class="ml-3 mr-3" :class="menuOpen ? 'text-body-1' : 'text-h6'"><RouterLink to="/" class="nav-link text-decoration-none">Главная</RouterLink></p>
|
||||
<p class="ml-3 mr-3" :class="menuOpen ? 'text-body-1' : 'text-h6'"><RouterLink to="/login" class="nav-link text-decoration-none">Войти</RouterLink></p>
|
||||
<p class="ml-3 mr-3" :class="menuOpen ? 'text-body-1' : 'text-h6'"><RouterLink to="/register" class="nav-link text-decoration-none">Регистрация</RouterLink></p>
|
||||
</v-sheet>
|
||||
<v-sheet class="rounded-lg main-bg h-100 mt-3 mr-10 ml-10 mb-10 pa-5">
|
||||
<Login></Login>
|
||||
<RouterView v-slot="{ Component }">
|
||||
<Component
|
||||
:is="Component"
|
||||
:is-wide="isWide"
|
||||
/>
|
||||
</RouterView>
|
||||
</v-sheet>
|
||||
</v-sheet>
|
||||
</v-app>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Login from "./views/Login.vue";
|
||||
import {th} from "vuetify/locale";
|
||||
|
||||
export default {
|
||||
name: "App",
|
||||
components: {Login}
|
||||
data: () => ({
|
||||
windowHeight: document.documentElement.clientHeight,
|
||||
windowWidth: document.documentElement.clientWidth,
|
||||
isWide: window.innerWidth >= 460,
|
||||
menuOpen: false
|
||||
}),
|
||||
methods: {
|
||||
resizeEventHandler(e) {
|
||||
this.windowHeight = document.documentElement.clientHeight;
|
||||
this.windowWidth = document.documentElement.clientWidth;
|
||||
this.isWide = this.windowWidth >= 460;
|
||||
if (this.isWide){
|
||||
this.menuOpen = false;
|
||||
}
|
||||
},
|
||||
openMenu(){
|
||||
this.menuOpen = !this.menuOpen;
|
||||
}
|
||||
},
|
||||
created() {
|
||||
window.addEventListener("resize", this.resizeEventHandler);
|
||||
},
|
||||
mounted() {
|
||||
this.resizeEventHandler();
|
||||
window.addEventListener("resize", this.resizeEventHandler, { passive: true });
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
.main-bg {
|
||||
background-color: #424242;
|
||||
color: #e0e0e0;
|
||||
text-decoration-color: #e0e0e0;
|
||||
}
|
||||
|
||||
.bg-gradient {
|
||||
background: linear-gradient(-45deg, #f103b0, #f0a068, #4fdbfeff);
|
||||
background-size: 200% 200%;
|
||||
animation: gradient 15s ease infinite;
|
||||
height: 200vh;
|
||||
}
|
||||
|
||||
@keyframes gradient {
|
||||
0% {
|
||||
background-position: 0 50%;
|
||||
}
|
||||
50% {
|
||||
background-position: 100% 50%;
|
||||
}
|
||||
100% {
|
||||
background-position: 0 50%;
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
|
||||
|
|
|
@ -6,10 +6,25 @@ import 'vuetify/styles'
|
|||
import * as components from 'vuetify/components'
|
||||
import * as directives from 'vuetify/directives'
|
||||
import '@mdi/font/css/materialdesignicons.css'
|
||||
import Login from "./views/Login.vue";
|
||||
import About from "./views/About.vue";
|
||||
import Register from "./views/Register.vue";
|
||||
import {createMemoryHistory, createRouter} from "vue-router";
|
||||
|
||||
const routes = [
|
||||
{path: '/', component: About, props: true},
|
||||
{path: '/login', component: Login, props: true},
|
||||
{path: '/register', component: Register, props: true}
|
||||
]
|
||||
|
||||
const router = createRouter({
|
||||
history: createMemoryHistory(),
|
||||
routes,
|
||||
})
|
||||
|
||||
const vuetify = createVuetify({
|
||||
components,
|
||||
directives
|
||||
})
|
||||
|
||||
createApp(App).use(vuetify).mount("#app")
|
||||
createApp(App).use(vuetify).use(router).mount("#app")
|
||||
|
|
|
@ -0,0 +1,209 @@
|
|||
.main-bg {
|
||||
background-color: #424242!important;
|
||||
color: #e0e0e0!important;
|
||||
text-decoration-color: #e0e0e0!important;
|
||||
}
|
||||
|
||||
.bg-gradient {
|
||||
background: linear-gradient(-45deg, #f103b0, #f0a068, #4fdbfeff)!important;
|
||||
background-size: 200% 200%!important;
|
||||
animation: gradient 15s ease infinite!important;
|
||||
height: 100vh!important;
|
||||
}
|
||||
|
||||
@keyframes gradient {
|
||||
0% {
|
||||
background-position: 0 50%!important;
|
||||
}
|
||||
50% {
|
||||
background-position: 100% 50%!important;
|
||||
}
|
||||
100% {
|
||||
background-position: 0 50%!important;
|
||||
}
|
||||
}
|
||||
|
||||
.nav-link:link {
|
||||
color: #4FDBFEFF!important;
|
||||
}
|
||||
|
||||
.nav-link:visited {
|
||||
color: #F0A068FF!important;
|
||||
}
|
||||
|
||||
.nav-link:hover {
|
||||
color: #F103B0FF!important;
|
||||
}
|
||||
|
||||
.nav-link:active {
|
||||
color: #F103B0FF!important;
|
||||
}
|
||||
|
||||
.link-no-color:link {
|
||||
color: #000000 !important;
|
||||
}
|
||||
|
||||
.link-no-color:visited {
|
||||
color: #000000 !important;
|
||||
}
|
||||
|
||||
.link-no-color:hover {
|
||||
color: #000000 !important;
|
||||
}
|
||||
|
||||
.link-no-color:active {
|
||||
color: #000000 !important;
|
||||
}
|
||||
.ham {
|
||||
cursor: pointer;
|
||||
-webkit-tap-highlight-color: transparent;
|
||||
transition: transform 400ms;
|
||||
-moz-user-select: none;
|
||||
-webkit-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
.hamRotate.active {
|
||||
transform: rotate(45deg);
|
||||
}
|
||||
.hamRotate180.active {
|
||||
transform: rotate(180deg);
|
||||
}
|
||||
.line {
|
||||
fill:none;
|
||||
transition: stroke-dasharray 400ms, stroke-dashoffset 400ms;
|
||||
stroke: #ffffff;
|
||||
stroke-width:5.5;
|
||||
stroke-linecap:round;
|
||||
}
|
||||
.ham1 .top {
|
||||
stroke-dasharray: 40 139;
|
||||
}
|
||||
.ham1 .bottom {
|
||||
stroke-dasharray: 40 180;
|
||||
}
|
||||
.ham1.active .top {
|
||||
stroke-dashoffset: -98px;
|
||||
}
|
||||
.ham1.active .bottom {
|
||||
stroke-dashoffset: -138px;
|
||||
}
|
||||
.ham2 .top {
|
||||
stroke-dasharray: 40 121;
|
||||
}
|
||||
.ham2 .bottom {
|
||||
stroke-dasharray: 40 121;
|
||||
}
|
||||
.ham2.active .top {
|
||||
stroke-dashoffset: -102px;
|
||||
}
|
||||
.ham2.active .bottom {
|
||||
stroke-dashoffset: -102px;
|
||||
}
|
||||
.ham3 .top {
|
||||
stroke-dasharray: 40 130;
|
||||
}
|
||||
.ham3 .middle {
|
||||
stroke-dasharray: 40 140;
|
||||
}
|
||||
.ham3 .bottom {
|
||||
stroke-dasharray: 40 205;
|
||||
}
|
||||
.ham3.active .top {
|
||||
stroke-dasharray: 75 130;
|
||||
stroke-dashoffset: -63px;
|
||||
}
|
||||
.ham3.active .middle {
|
||||
stroke-dashoffset: -102px;
|
||||
}
|
||||
.ham3.active .bottom {
|
||||
stroke-dasharray: 110 205;
|
||||
stroke-dashoffset: -86px;
|
||||
}
|
||||
.ham4 .top {
|
||||
stroke-dasharray: 40 121;
|
||||
}
|
||||
.ham4 .bottom {
|
||||
stroke-dasharray: 40 121;
|
||||
}
|
||||
.ham4.active .top {
|
||||
stroke-dashoffset: -68px;
|
||||
}
|
||||
.ham4.active .bottom {
|
||||
stroke-dashoffset: -68px;
|
||||
}
|
||||
.ham5 .top {
|
||||
stroke-dasharray: 40 82;
|
||||
}
|
||||
.ham5 .bottom {
|
||||
stroke-dasharray: 40 82;
|
||||
}
|
||||
.ham5.active .top {
|
||||
stroke-dasharray: 14 82;
|
||||
stroke-dashoffset: -72px;
|
||||
}
|
||||
.ham5.active .bottom {
|
||||
stroke-dasharray: 14 82;
|
||||
stroke-dashoffset: -72px;
|
||||
}
|
||||
.ham6 .top {
|
||||
stroke-dasharray: 40 172;
|
||||
}
|
||||
.ham6 .middle {
|
||||
stroke-dasharray: 40 111;
|
||||
}
|
||||
.ham6 .bottom {
|
||||
stroke-dasharray: 40 172;
|
||||
}
|
||||
.ham6.active .top {
|
||||
stroke-dashoffset: -132px;
|
||||
}
|
||||
.ham6.active .middle {
|
||||
stroke-dashoffset: -71px;
|
||||
}
|
||||
.ham6.active .bottom {
|
||||
stroke-dashoffset: -132px;
|
||||
}
|
||||
.ham7 .top {
|
||||
stroke-dasharray: 40 82;
|
||||
}
|
||||
.ham7 .middle {
|
||||
stroke-dasharray: 40 111;
|
||||
}
|
||||
.ham7 .bottom {
|
||||
stroke-dasharray: 40 161;
|
||||
}
|
||||
.ham7.active .top {
|
||||
stroke-dasharray: 17 82;
|
||||
stroke-dashoffset: -62px;
|
||||
}
|
||||
.ham7.active .middle {
|
||||
stroke-dashoffset: 23px;
|
||||
}
|
||||
.ham7.active .bottom {
|
||||
stroke-dashoffset: -83px;
|
||||
}
|
||||
.ham8 .top {
|
||||
stroke-dasharray: 40 160;
|
||||
}
|
||||
.ham8 .middle {
|
||||
stroke-dasharray: 40 142;
|
||||
transform-origin: 50%;
|
||||
transition: transform 400ms;
|
||||
}
|
||||
.ham8 .bottom {
|
||||
stroke-dasharray: 40 85;
|
||||
transform-origin: 50%;
|
||||
transition: transform 400ms, stroke-dashoffset 400ms;
|
||||
}
|
||||
.ham8.active .top {
|
||||
stroke-dashoffset: -64px;
|
||||
}
|
||||
.ham8.active .middle {
|
||||
//stroke-dashoffset: -20px;
|
||||
transform: rotate(90deg);
|
||||
}
|
||||
.ham8.active .bottom {
|
||||
stroke-dashoffset: -64px;
|
||||
}
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
<script>
|
||||
export default {
|
||||
name: "About"
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<v-label class="text-h3">Hello World!</v-label>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
|
||||
</style>
|
|
@ -1,10 +1,26 @@
|
|||
<template>
|
||||
<p class="text-h1">Hello world!</p>
|
||||
<div class="w-100 h-100 d-flex justify-center">
|
||||
<div class="d-flex flex-column justify-center h-100" :class="isWide ? 'w-50' : 'w-75'">
|
||||
<v-label>Логин:</v-label>
|
||||
<v-text-field label="Логин" class="flex-grow-0"></v-text-field>
|
||||
<v-label>Пароль:</v-label>
|
||||
<v-text-field label="Пароль" class="flex-grow-0"></v-text-field>
|
||||
<div class="d-flex justify-center" :class="isWide ? '' : 'flex-column align-center'">
|
||||
<v-btn color="#F0A068FF" class="ma-5" :class="isWide ? 'w-25' : 'w-100 text-body-1'">Войти</v-btn>
|
||||
<router-link to="/register" class="text-decoration-none link-no-color ma-5" :class="isWide ? 'w-25' : 'w-100'">
|
||||
<v-btn color="#F0A068FF" :class="isWide ? 'w-100' : 'w-100 text-body-1'">Регистрация</v-btn>
|
||||
</router-link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: "Login"
|
||||
name: "Login",
|
||||
props: {
|
||||
isWide: Boolean
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
<script>
|
||||
export default {
|
||||
name: "Register",
|
||||
props: {
|
||||
isWide: Boolean
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="w-100 h-100 d-flex justify-center">
|
||||
<div class="d-flex flex-column justify-center h-100" :class="isWide ? 'w-50' : 'w-75'">
|
||||
<v-label>Логин:</v-label>
|
||||
<v-text-field label="Логин" class="flex-grow-0"></v-text-field>
|
||||
<v-label>E-mail:</v-label>
|
||||
<v-text-field label="E-mail" class="flex-grow-0"></v-text-field>
|
||||
<v-label>Пароль:</v-label>
|
||||
<v-text-field label="Пароль" class="flex-grow-0"></v-text-field>
|
||||
<div class="d-flex justify-center" :class="isWide ? '' : 'flex-column align-center'">
|
||||
<v-btn color="#F0A068FF" class="ma-5" :class="isWide ? 'w-25' : 'w-100 text-body-1'">Зарегистрироваться</v-btn>
|
||||
<router-link to="/login" class="text-decoration-none link-no-color ma-5" :class="isWide ? 'w-25' : 'w-100'">
|
||||
<v-btn color="#F0A068FF" :class="isWide ? 'w-100' : 'w-100 text-body-1'">Вход</v-btn>
|
||||
</router-link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
|
||||
</style>
|
Loading…
Reference in New Issue