Split desktop and mobile layouts with shared page data so APIs fetch once per context.

Add layout shells, desktop views, module-level page caches, and UI fixes for auth, home, wallet, transactions, address, and related pages.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-14 10:08:46 +03:30
co-authored by Cursor
parent 4404b4cb92
commit a5e458ed25
234 changed files with 18425 additions and 5503 deletions
@@ -0,0 +1,50 @@
<template>
<div class="dabout">
<div class="dabout__container">
<header class="dabout-topbar">
<button type="button" class="dabout-topbar__back" @click="router.back()">
<BasicIcon icon="vuesax-linear:arrow-right-1" size="18" />
<span>بازگشت</span>
</button>
<div class="dabout-topbar__meta">
<p class="dabout-topbar__eyebrow">اطلاعات</p>
<h1 class="dabout-topbar__title">درباره ما</h1>
</div>
</header>
<div class="dabout-layout">
<section class="dabout-surface dabout-main">
<div class="dabout-main__intro">
<div class="dabout-main__logo">
<BasicIcon icon="vuesax-linear:info-circle" size="28" />
</div>
<div>
<h2 class="dabout-main__project">{{ config.config.name_fa }}</h2>
<p class="dabout-main__tagline">آشنایی با خدمات و چشم‌انداز ما</p>
</div>
</div>
<AboutSectionsContent variant="desktop" />
</section>
<aside class="dabout-surface dabout-side">
<h3 class="dabout-side__title">پشتیبانی و ارتباط</h3>
<p class="dabout-side__text">
در صورت نیاز به راهنمایی یا پاسخ به سوالات، از راه‌های زیر با ما در ارتباط باشید.
</p>
<AboutSupportActions variant="desktop" />
</aside>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import BasicIcon from '@/components/BasicPacks/BasicIcon.vue'
import router from '@/router'
import AboutSectionsContent from '../components/AboutSectionsContent.vue'
import AboutSupportActions from '../components/AboutSupportActions.vue'
import { useAboutPageContext } from '../composables/useAboutPage'
const { config } = useAboutPageContext()
</script>
@@ -0,0 +1,234 @@
/* Premium desktop about page */
.dabout {
min-height: 100%;
background: #f6f7f9;
color: #111827;
}
.dabout__container {
max-width: 1080px;
margin: 0 auto;
padding: 28px 36px 40px;
}
.dabout-topbar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
margin-bottom: 28px;
padding-bottom: 24px;
border-bottom: 1px solid rgba(15, 23, 42, 0.06);
&__back {
display: inline-flex;
align-items: center;
gap: 8px;
border: none;
background: transparent;
color: #6b7280;
font-size: 13px;
font-weight: 500;
font-family: inherit;
cursor: pointer;
padding: 8px 0;
&:hover {
color: #111827;
}
}
&__meta {
flex: 1;
min-width: 0;
}
&__eyebrow {
font-size: 12px;
font-weight: 500;
color: #9ca3af;
margin: 0 0 4px;
}
&__title {
font-size: 26px;
font-weight: 600;
letter-spacing: -0.03em;
color: #111827;
margin: 0;
line-height: 1.2;
}
}
.dabout-layout {
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(0, 300px);
gap: 20px;
align-items: start;
}
.dabout-surface {
background: #fff;
border: 1px solid rgba(15, 23, 42, 0.06);
border-radius: 16px;
box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04);
}
.dabout-main {
padding: 28px;
&__intro {
display: flex;
align-items: center;
gap: 16px;
margin-bottom: 24px;
padding-bottom: 20px;
border-bottom: 1px solid #eef0f3;
}
&__logo {
display: flex;
align-items: center;
justify-content: center;
width: 56px;
height: 56px;
border-radius: 14px;
background: rgba(9, 61, 81, 0.08);
color: @App-primary-color;
flex-shrink: 0;
}
&__project {
font-size: 18px;
font-weight: 700;
color: #111827;
margin: 0 0 4px;
}
&__tagline {
font-size: 13px;
color: #6b7280;
margin: 0;
}
}
.dabout-content {
&--default {
padding: 0;
background: transparent;
color: #374151;
}
&--boursecu {
padding: 20px;
border: 1px solid rgba(9, 61, 81, 0.15);
border-radius: 12px;
background: rgba(9, 61, 81, 0.03);
color: @App-primary-color;
}
&__divider {
width: 100%;
height: 1px;
background: #eef0f3;
margin: 20px 0;
}
&__title {
font-size: 16px;
font-weight: 700;
color: inherit;
margin: 0 0 10px;
}
&__paragraph {
font-size: 14px;
line-height: 1.9;
color: inherit;
text-align: justify;
margin: 0 0 12px;
&:last-child {
margin-bottom: 0;
}
}
&__list {
list-style: none;
margin: 0;
padding: 0;
display: flex;
flex-direction: column;
gap: 8px;
}
&__list-item {
position: relative;
padding-right: 16px;
font-size: 14px;
line-height: 1.7;
color: inherit;
&::before {
content: '';
position: absolute;
right: 0;
top: 10px;
width: 6px;
height: 6px;
border-radius: 50%;
background: currentColor;
opacity: 0.6;
}
}
}
.dabout-side {
padding: 24px;
position: sticky;
top: 24px;
&__title {
font-size: 15px;
font-weight: 600;
color: #111827;
margin: 0 0 8px;
}
&__text {
font-size: 13px;
line-height: 1.7;
color: #6b7280;
margin: 0 0 20px;
}
}
.dabout-support {
display: flex;
flex-direction: row;
align-items: center;
gap: 8px;
> a:first-child {
flex: 1;
min-width: 0;
}
&__bale {
width: 40px;
height: 40px;
object-fit: contain;
flex-shrink: 0;
}
}
@media (max-width: 1023.98px) {
.dabout-layout {
grid-template-columns: 1fr;
}
.dabout-side {
position: static;
}
}