feat: new Tehrani brand logo, custom button audience, trim dashboard

- Replace the crown logo with logo.svg / logo_bk.svg across both frontends;
  regenerate favicons and PWA icons via scripts/generate-brand-icons.cjs
- Custom button: admin chooses whether it shows before login or only after
- Dashboard: drop the survey-majority banner, hide the custom-order row

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
mahmood
2026-11-14 16:53:25 +03:30
co-authored by Cursor
parent 0f6ad79ae7
commit de13445109
37 changed files with 428 additions and 105 deletions
+2 -2
View File
@@ -3,8 +3,8 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="icon" type="image/png" href="/favicon.png?v=2" />
<link rel="shortcut icon" href="/favicon.ico?v=2" />
<link rel="icon" type="image/png" href="/favicon.png?v=3" />
<link rel="shortcut icon" href="/favicon.ico?v=3" />
<title>%BRAND_TITLE%</title>
</head>
<body>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

@@ -19,7 +19,7 @@
>
<div class="nav-header" :class="{ 'is-collapsed': collapsed }">
<span class="nav-logo">
<img src="../../assets/images/logo/brand-icon.png" alt="" />
<img src="../../assets/images/logo/brand-logo.svg" alt="" />
</span>
<span v-if="!collapsed" class="nav-brand">
<span class="nav-title">{{ title }}</span>
@@ -207,8 +207,9 @@ function onClick({ key }: { key: string | number }) {
padding: 0;
}
.nav-logo {
width: 38px;
height: 38px;
/* wide: the mark is about 1.45:1 */
width: 54px;
height: 40px;
flex-shrink: 0;
display: grid;
place-items: center;
@@ -218,7 +219,7 @@ function onClick({ key }: { key: string | number }) {
box-shadow: 0 4px 12px -6px rgba(28, 45, 86, 0.35);
}
.nav-logo img {
width: 64%;
width: 86%;
}
.nav-brand {
display: flex;
+6 -5
View File
@@ -20,7 +20,7 @@
<section class="hero" aria-hidden="true">
<div class="brand-row">
<div class="logo-chip">
<img src="../../assets/images/logo/brand-icon.png" alt="" />
<img src="../../assets/images/logo/brand-logo.svg" alt="" />
</div>
<span class="brand-name">{{ brand.nameEn }}</span>
</div>
@@ -83,7 +83,7 @@
<div class="glass-card">
<div class="card-head">
<div class="logo-chip logo-chip--sm">
<img src="../../assets/images/logo/brand-icon.png" :alt="brand.nameEn" />
<img src="../../assets/images/logo/brand-logo.svg" :alt="brand.nameEn" />
</div>
<span class="eyebrow"><span class="dot"></span>پنل مدیریت</span>
</div>
@@ -347,7 +347,8 @@ async function loginJWT() {
gap: 12px;
}
.logo-chip {
width: 52px;
/* wide: the mark is about 1.45:1 */
width: 72px;
height: 52px;
display: grid;
place-items: center;
@@ -358,7 +359,7 @@ async function loginJWT() {
0 10px 30px -8px rgba(242, 201, 92, 0.45);
}
.logo-chip img {
width: 64%;
width: 82%;
}
.brand-name {
font-size: 16px;
@@ -492,7 +493,7 @@ async function loginJWT() {
justify-content: space-between;
}
.logo-chip--sm {
width: 44px;
width: 60px;
height: 44px;
border-radius: 14px;
}
+1 -1
View File
@@ -9,7 +9,7 @@
<div class="flex gap-6 w-full justify-center h-screen branch-login-page">
<div class="flex flex-col h-screen items-center justify-center">
<img
src="../../assets/images/logo/brand-icon.png"
src="../../assets/images/logo/brand-logo.svg"
width="150"
alt="login"
class="mx-auto mb-5"
@@ -121,7 +121,7 @@
<ul>
<li class="comment-item">
<img src="../../../assets/images/logo/brand-icon.png" alt="comment author" class="img border" />
<img src="../../../assets/images/logo/brand-logo.svg" alt="comment author" class="img border" />
<div class="comment-body">
<h5>ادمین</h5>
<span v-if="tempRow.reply && tempRow.reply[0]" class="time">
@@ -271,6 +271,12 @@ async function submitChanges(row: Record<string, any>) {
border: 1px solid grey;
border-radius: 50%;
}
img.img {
object-fit: contain;
padding: 10px;
box-sizing: border-box;
background: #fff;
}
@media (max-width: 575px) {
.comment-item {
+14 -1
View File
@@ -142,6 +142,12 @@
un-checked-children="غیرفعال"
/>
</a-form-item>
<a-form-item label="نمایش به">
<a-radio-group v-model:value="customButton.audience">
<a-radio value="all">همه (قبل و بعد از ورود)</a-radio>
<a-radio value="loggedIn">فقط بعد از ورود</a-radio>
</a-radio-group>
</a-form-item>
<a-form-item label="عنوان دکمه">
<a-input
v-model:value="customButton.title"
@@ -248,7 +254,12 @@ const tagsInputValue = ref('');
const sliders = ref<{ image: string; link: string }[]>([]);
// ── custom button (Setting key: custom_button)
const customButton = ref({ enabled: false, title: '', link: '' });
const customButton = ref<{ enabled: boolean; title: string; link: string; audience: 'all' | 'loggedIn' }>({
enabled: false,
title: '',
link: '',
audience: 'all',
});
// ── collections
const collections = ref<{ id: string; title: string }[]>([]);
@@ -360,6 +371,7 @@ async function saveCustomButton() {
enabled: customButton.value.enabled,
title,
link,
audience: customButton.value.audience,
},
});
message.success('دکمه سفارشی ذخیره شد');
@@ -428,6 +440,7 @@ onMounted(async () => {
enabled: Boolean(btn.data.enabled),
title: String(btn.data.title ?? ''),
link: String(btn.data.link ?? ''),
audience: btn.data.audience === 'loggedIn' ? 'loggedIn' : 'all',
};
}
} catch (e) {