Merge branch 'kashkool' of https://get.feep.ir/ghatreh/ghatreh_user into kashkool

This commit is contained in:
2026-07-16 15:22:50 +03:30
8 changed files with 271 additions and 37 deletions
+1
View File
@@ -10,6 +10,7 @@
@import (less) '../../views/base/user/desktop/styles/desktop-user.less';
@import (less) '../../views/base/priceTrigger/desktop/styles/desktop-price-trigger.less';
@import (less) '../../views/base/home/desktop/styles/desktop-home.less';
@import (less) '../../views/login/desktop/styles/desktop-login.less';
@import (less) '../../layouts/desktop/styles/desktop-inner-pages.less';
html {
+7
View File
@@ -172,3 +172,10 @@ html.app-layout--desktop .app-splash-screen {
left: 0 !important;
width: 100vw !important;
}
html.app-layout--desktop .login-page-root {
width: 100%;
height: 100%;
min-height: 0;
overflow: hidden;
}
@@ -0,0 +1,21 @@
import { onMounted, ref } from 'vue'
import router from '@/router'
export function useLoginPage() {
const enterType = ref(false)
function setEnterType(val: boolean) {
enterType.value = val
}
onMounted(() => {
if (router.currentRoute.value.query.id) {
enterType.value = true
}
})
return {
enterType,
setEnterType,
}
}
@@ -0,0 +1,50 @@
<template>
<div class="dlogin login-page">
<div class="dlogin__bg" aria-hidden="true">
<div class="dlogin__bg-top">
<img :src="img_topGradiant" alt="" class="dlogin__bg-cover" />
<img :src="img_pattern" alt="" class="dlogin__bg-pattern" />
</div>
<div class="dlogin__bg-bottom">
<img :src="img_bottomGradiant" alt="" class="dlogin__bg-cover" />
<img :src="img_pattern" alt="" class="dlogin__bg-pattern" />
</div>
</div>
<div class="dlogin__container">
<div class="dlogin__card">
<transition mode="out-in" name="fade">
<Login v-if="!enterType" class="dlogin__form" @register="setEnterType" />
<Register v-else class="dlogin__form" @register="setEnterType" />
</transition>
</div>
<button type="button" class="dlogin__back" @click="router.push({ name: 'buyProduct' })">
بازگشت به فروشگاه
</button>
</div>
</div>
</template>
<script lang="ts" setup>
import Login from '@/views/login/components/Login.vue'
import Register from '@/views/login/components/Register.vue'
import img_topGradiant from '../assets/img/gr_top_white.svg'
import img_bottomGradiant from '../assets/img/gr_bottom_white.svg'
import img_pattern from '../assets/img/pattern.svg'
import router from '@/router'
defineProps<{
enterType: boolean
}>()
const emit = defineEmits<{
register: [val: boolean]
}>()
function setEnterType(val: boolean) {
emit('register', val)
}
</script>
<style lang="less" src="./styles/desktop-login.less"></style>
@@ -0,0 +1,114 @@
html.app-layout--desktop {
.login-page-root {
height: 100%;
min-height: 0;
overflow: hidden;
}
.dlogin {
position: relative;
display: flex;
align-items: center;
justify-content: center;
min-height: 100vh;
height: 100%;
padding: 32px 24px;
box-sizing: border-box;
overflow-y: auto;
background: #fff;
}
.dlogin__bg {
position: absolute;
inset: 0;
overflow: hidden;
pointer-events: none;
}
.dlogin__bg-top,
.dlogin__bg-bottom {
position: absolute;
left: 0;
right: 0;
height: 34%;
overflow: hidden;
}
.dlogin__bg-top {
top: 0;
}
.dlogin__bg-bottom {
bottom: 0;
}
.dlogin__bg-cover {
position: absolute;
inset: 0;
z-index: 1;
width: 100%;
height: 100%;
object-fit: cover;
}
.dlogin__bg-pattern {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
object-fit: none;
}
.dlogin__container {
position: relative;
z-index: 2;
display: flex;
flex-direction: column;
align-items: center;
width: 100%;
max-width: 460px;
gap: 20px;
}
.dlogin__card {
width: 100%;
max-height: calc(100vh - 120px);
padding: 36px 32px 28px;
border-radius: 20px;
background: rgba(255, 255, 255, 0.96);
border: 1px solid rgba(15, 23, 42, 0.06);
box-shadow:
0 18px 48px rgba(15, 23, 42, 0.08),
0 2px 8px rgba(15, 23, 42, 0.04);
backdrop-filter: blur(8px);
box-sizing: border-box;
overflow-y: auto;
overscroll-behavior: contain;
}
.dlogin__form {
width: 100%;
}
.dlogin__form img {
width: 132px !important;
height: auto;
margin-bottom: 28px !important;
}
.dlogin__back {
border: none;
background: transparent;
color: @primary-color;
font-size: 14px;
font-weight: 600;
font-family: inherit;
cursor: pointer;
padding: 8px 12px;
transition: opacity 0.2s ease;
&:hover {
opacity: 0.8;
}
}
}
+34 -37
View File
@@ -1,49 +1,46 @@
<template>
<div class="flex items-center h-[92vh] justify-center ">
<!-- <PhoneVerify/>-->
<div class="fixed top-0 right-0 left-0 h-1/3 w-screen flex">
<img :src="img_topGradiant" alt="" class="absolute z-10 w-screen h-full object-cover">
<img :src="img_pattern" alt="" class="absolute w-screen h-full object-none">
</div>
<div class="fixed bottom-0 right-0 left-0 h-1/3 w-screen">
<img :src="img_bottomGradiant" alt="" class="absolute z-10 w-screen h-full object-cover">
<img :src="img_pattern" alt="" class="absolute w-screen h-full object-none">
</div>
<div class="z-1000 w-full p-5">
<transition mode="out-in" name="fade">
<Login v-if="!enterType" @register="setEnterType"/>
<Register v-else @register="setEnterType"/>
</transition>
<div class="text-center text-primary font-500" @click="router.push({name:'buyProduct'})">بازگشت به فروشگاه</div>
</div>
<div class="login-page-root">
<DesktopLoginView
v-show="isDesktop"
:enter-type="enterType"
@register="setEnterType"
/>
<MobileLoginView
v-show="!isDesktop"
:enter-type="enterType"
@register="setEnterType"
/>
</div>
</template>
<script lang="ts" setup>
import { onUnmounted, watch } from 'vue'
import { useDesktopBreakpoint } from '@/layouts/composables/useAppLayout'
import { useLoginPage } from './composables/useLoginPage'
import DesktopLoginView from './desktop/DesktopLoginView.vue'
import MobileLoginView from './mobile/MobileLoginView.vue'
import Login from "@/views/login/components/Login.vue";
import Register from "@/views/login/components/Register.vue";
import { onMounted, ref } from 'vue'
import img_topGradiant from './assets/img/gr_top_white.svg'
import img_bottomGradiant from './assets/img/gr_bottom_white.svg'
import img_pattern from './assets/img/pattern.svg'
import router from '@/router'
const NO_SIDEBAR_CLASS = 'app-layout--desktop-no-sidebar'
const isDesktop = useDesktopBreakpoint()
const { enterType, setEnterType } = useLoginPage()
const enterType = ref<boolean>(false)
watch(
isDesktop,
(desktop) => {
document.documentElement.classList.toggle(NO_SIDEBAR_CLASS, desktop)
},
{ immediate: true }
)
function setEnterType(val: boolean) {
enterType.value = val
}
onMounted(() => {
if (router.currentRoute.value.query.id)
enterType.value = true
onUnmounted(() => {
document.documentElement.classList.remove(NO_SIDEBAR_CLASS)
})
</script>
<style>
<style scoped>
.login-page-root {
width: 100%;
min-height: 100%;
height: 100%;
}
</style>
@@ -0,0 +1,42 @@
<template>
<div class="login-page flex items-center h-[92vh] justify-center">
<div class="fixed top-0 right-0 left-0 h-1/3 w-screen flex">
<img :src="img_topGradiant" alt="" class="absolute z-10 w-screen h-full object-cover" />
<img :src="img_pattern" alt="" class="absolute w-screen h-full object-none" />
</div>
<div class="fixed bottom-0 right-0 left-0 h-1/3 w-screen">
<img :src="img_bottomGradiant" alt="" class="absolute z-10 w-screen h-full object-cover" />
<img :src="img_pattern" alt="" class="absolute w-screen h-full object-none" />
</div>
<div class="z-1000 w-full p-5">
<transition mode="out-in" name="fade">
<Login v-if="!enterType" @register="setEnterType" />
<Register v-else @register="setEnterType" />
</transition>
<div class="text-center text-primary font-500" @click="router.push({ name: 'buyProduct' })">
بازگشت به فروشگاه
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import Login from '@/views/login/components/Login.vue'
import Register from '@/views/login/components/Register.vue'
import img_topGradiant from '../assets/img/gr_top_white.svg'
import img_bottomGradiant from '../assets/img/gr_bottom_white.svg'
import img_pattern from '../assets/img/pattern.svg'
import router from '@/router'
defineProps<{
enterType: boolean
}>()
const emit = defineEmits<{
register: [val: boolean]
}>()
function setEnterType(val: boolean) {
emit('register', val)
}
</script>