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,51 @@
<template>
<div :class="variant === 'desktop' ? 'dpr-address-picker dpr-address-picker--desktop' : 'h-120 flex flex-col'">
<div v-if="variant !== 'desktop'" class="text-center">انتخاب آدرس</div>
<div :class="variant === 'desktop' ? 'dpr-address-picker__list' : 'overflow-y-scroll h-85'">
<ARadioGroup v-model:value="selectedAddressID">
<div class="flex flex-col">
<div
v-for="addr in addresses"
:key="addr.id"
:class="variant === 'desktop' ? 'dpr-address-picker__item' : 'text-base rounded-lg p-4 m-2 shadow-md font-medium'"
>
<ARadio :value="addr.id">
{{ addr.province }} / {{ addr.city }} / {{ addr.address }}
</ARadio>
</div>
</div>
</ARadioGroup>
</div>
<div :class="variant === 'desktop' ? 'dpr-address-picker__actions' : 'flex gap-2 pt-2'">
<BasicButton @click="emit('addAddress')">افزودن آدرس +</BasicButton>
<BasicButton
:class="variant === 'desktop' ? '' : 'w-2/3'"
type="primary"
@click="emit('submit')"
>
ثبت نهایی
</BasicButton>
</div>
</div>
</template>
<script setup lang="ts">
import BasicButton from '@/components/BasicPacks/BasicButton.vue'
import type { Address } from '@/models/address'
interface Props {
addresses?: Address[]
variant?: 'mobile' | 'desktop'
}
withDefaults(defineProps<Props>(), {
variant: 'mobile',
})
const selectedAddressID = defineModel<number | undefined>('selectedAddressID')
const emit = defineEmits<{
addAddress: []
submit: []
}>()
</script>