Port modular features into boursecu and fix desktop login UX.

Add support chat, piggy funds, PWA banner, notification/SSE sync, and messenger legacy guards while keeping boursecu theme; also balance login panels and unblock login navigation.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-06 20:14:46 +02:00
co-authored by Cursor
parent be896fe247
commit 42aef88064
55 changed files with 7488 additions and 434 deletions
+10 -3
View File
@@ -32,9 +32,15 @@
:aria-label="entry.label"
@click.stop="select(entry)"
>
<span class="inline-flex items-center gap-2 h-11 rounded-full bg-white shadow-md py-1 pl-3 pr-1 w-full">
<span class="block w-[30px] h-[30px] shrink-0">
<SupportMessengerBrandIcon :messenger="entry.messenger" />
<span class="support-picker-item-inner inline-flex items-center gap-2 min-h-[38px] rounded-full bg-white shadow-md py-1 pl-3 pr-1 w-full">
<span class="block w-[30px] h-[30px] shrink-0 flex items-center justify-center">
<BasicIcon
v-if="entry.messenger === 'chat'"
:icon="entry.icon || 'vuesax-linear:messages-2'"
size="22"
:color="entry.accent || '#16a34a'"
/>
<SupportMessengerBrandIcon v-else :messenger="entry.messenger" />
</span>
<span class="text-sm font-600 text-slate-800 whitespace-nowrap leading-none">
{{ entry.label }}
@@ -49,6 +55,7 @@
<script lang="ts" setup>
import { nextTick, onBeforeUnmount, ref, watch } from 'vue'
import SupportMessengerBrandIcon from '@/components/SupportMessengerBrandIcon.vue'
import BasicIcon from '@/components/BasicPacks/BasicIcon.vue'
import type { ResolvedSupportMessengerEntry } from '@/utils/supportMessenger'
import { APP_Z_SUPPORT_PICKER } from '@/utils/zIndex'
+70
View File
@@ -0,0 +1,70 @@
<script setup lang="ts">
defineProps<{
visible: boolean
}>()
const emit = defineEmits<{
install: []
dismiss: []
}>()
</script>
<template>
<Transition name="pwa-install-banner">
<button
v-if="visible"
type="button"
class="pwa-install-banner"
@click="emit('install')"
>
نصب وب اپلیکیشن
</button>
</Transition>
</template>
<style scoped lang="less">
.pwa-install-banner {
position: fixed;
left: 50%;
z-index: 5095;
display: inline-flex;
align-items: center;
justify-content: center;
width: fit-content;
max-width: calc(100% - 24px);
padding: 10px 18px;
border-radius: 999px;
background: #fff;
border: 1px solid rgba(15, 23, 42, 0.08);
box-shadow: 0 10px 28px rgba(15, 23, 42, 0.12);
font-size: 13px;
font-weight: 700;
color: @App-primary-color;
white-space: nowrap;
cursor: pointer;
transform: translateX(-50%);
bottom: calc(var(--app-bottom-chrome-height, 108px) + 8px);
}
@media screen and (min-width: 768px) {
.pwa-install-banner {
/* بالاتر از متن نسخه در پنل برند لاگین */
bottom: 64px;
}
html.app-layout--desktop:not(.app-layout--desktop-no-sidebar) .pwa-install-banner {
left: calc(50% - var(--app-desktop-sidebar-width, 260px) / 2);
}
}
.pwa-install-banner-enter-active,
.pwa-install-banner-leave-active {
transition: opacity 0.2s ease, transform 0.2s ease;
}
.pwa-install-banner-enter-from,
.pwa-install-banner-leave-to {
opacity: 0;
transform: translate(-50%, 12px);
}
</style>