Rebrand the product to Montact and point local UI at production API.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-07 11:49:54 +03:30
co-authored by Cursor
parent 8357676e6c
commit 48d3469eea
56 changed files with 309 additions and 216 deletions
+2 -1
View File
@@ -15,6 +15,7 @@ import JalaliDateInput from '@/components/JalaliDateInput.vue';
import VoiceToTextButton from '@/components/VoiceToTextButton.vue';
import { appendSpokenText } from '@/lib/spoken-text';
import UiIcon from '@/components/UiIcon.vue';
import { brand } from '@mento/shared';
import UserAvatar from '@/components/UserAvatar.vue';
import type {
ActivityDto,
@@ -498,7 +499,7 @@ watch([id, isNew], () => void load(), { immediate: true });
<input v-model="reminderNotifyApp" type="checkbox" />
<span>
<strong>اعلان داخل پنل</strong>
<small>در زنگوله اعلان‌های منتو نشان داده می‌شود</small>
<small>در زنگوله اعلان‌های {{ brand.nameFa }} نشان داده می‌شود</small>
</span>
</label>
<label class="channel">
+2 -1
View File
@@ -13,6 +13,7 @@ import type {
PersonDto,
PersonMood,
} from '@mento/shared';
import { brand } from '@mento/shared';
import { PERSON_MOOD_LABELS, PERSON_MOODS } from '@/lib/person-mood';
type Tab = 'people' | 'companies';
@@ -178,7 +179,7 @@ async function exportExcel() {
const a = document.createElement('a');
a.href = url;
a.download =
tab.value === 'people' ? 'mento-people.xlsx' : 'mento-companies.xlsx';
tab.value === 'people' ? `${brand.filePrefix}-people.xlsx` : `${brand.filePrefix}-companies.xlsx`;
a.click();
URL.revokeObjectURL(url);
} catch {
+13 -1
View File
@@ -12,6 +12,8 @@ import { formatLocalDateInput, toFaDigits } from '@/lib/jalali';
import JalaliDateInput from '@/components/JalaliDateInput.vue';
import MoneyInput from '@/components/MoneyInput.vue';
import UiIcon from '@/components/UiIcon.vue';
import BrandName from '@/components/brand/BrandName.vue';
import { brand } from '@mento/shared';
import type {
CreateInvoiceRequest,
CreatePaymentRequest,
@@ -763,7 +765,8 @@ onMounted(load);
<form v-else class="form" @submit.prevent="save">
<div class="print-banner">
<strong>منتو</strong>
<img :src="brand.logo" :alt="brand.name" class="print-logo" />
<BrandName />
<span v-if="number">{{ number }}</span>
</div>
@@ -2357,12 +2360,21 @@ h1 {
.print-banner {
display: flex;
align-items: center;
gap: 0.6rem;
justify-content: space-between;
border-bottom: 1px solid #ccc;
padding-bottom: 0.5rem;
margin-bottom: 0.5rem;
}
.print-logo {
width: 36px;
height: 36px;
object-fit: contain;
border-radius: 8px;
}
.page {
max-width: none;
}
+5 -3
View File
@@ -6,6 +6,8 @@ import AuthBrandPanel from '@/components/auth/AuthBrandPanel.vue';
import MentoLogo from '@/components/brand/MentoLogo.vue';
import axios from 'axios';
import type { LoginChallengeResponse } from '@mento/shared';
import { brand } from '@mento/shared';
import BrandName from '@/components/brand/BrandName.vue';
const auth = useAuthStore();
const router = useRouter();
@@ -111,8 +113,8 @@ function backToOtpMobile() {
<section class="form-panel">
<header class="mobile-brand">
<MentoLogo :size="52" :show-text="false" />
<strong>منتو</strong>
<span>نرم‌افزار مدیریت ارتباط با مشتری</span>
<BrandName />
<span>{{ brand.taglineFa }}</span>
</header>
<div class="form-inner">
@@ -260,7 +262,7 @@ function backToOtpMobile() {
</div>
<footer class="auth-footer">
<p>۱۴۰۵ منتو. تمامی حقوق محفوظ است.</p>
<p>۱۴۰۵ {{ brand.nameFa }}. تمامی حقوق محفوظ است.</p>
<nav>
<a href="#">حریم خصوصی</a>
<span>|</span>
+2 -1
View File
@@ -18,6 +18,7 @@ import type {
LoyaltyStatsDto,
LoyaltyTierDto,
} from '@mento/shared';
import { brand } from '@mento/shared';
type MobileTab = 'levels' | 'members' | 'rewards';
type Modal =
@@ -416,7 +417,7 @@ async function exportExcel() {
const url = URL.createObjectURL(data);
const a = document.createElement('a');
a.href = url;
a.download = 'mento-loyalty-members.xlsx';
a.download = `${brand.filePrefix}-loyalty-members.xlsx`;
a.click();
URL.revokeObjectURL(url);
} catch {
+2 -1
View File
@@ -17,6 +17,7 @@ import {
import UiIcon from '@/components/UiIcon.vue';
import CustomerMoodFace from '@/components/CustomerMoodFace.vue';
import MentoAiAvatar from '@/components/brand/MentoAiAvatar.vue';
import { brand } from '@mento/shared';
import MentoMemoryPanel from '@/components/MentoMemoryPanel.vue';
import AskMentoPanel from '@/components/AskMentoPanel.vue';
import ProfileEmptyState from '@/components/person-profile/ProfileEmptyState.vue';
@@ -846,7 +847,7 @@ watch(() => route.query.tab, readTab, { immediate: true });
<div>
<h2>
<UiIcon name="sparkle" :size="14" />
خلاصه هوشمند منتو
خلاصه هوشمند {{ brand.nameFa }}
</h2>
<p>{{ shownSmart.text }}</p>
</div>
+2 -1
View File
@@ -15,6 +15,7 @@ import type {
PortalRequestOtpResponse,
PortalTicketDto,
} from '@mento/shared';
import { brand } from '@mento/shared';
const route = useRoute();
const router = useRouter();
@@ -269,7 +270,7 @@ watch(slug, () => {
<div class="portal">
<header class="top">
<div>
<p class="brand">منتو · پرتال مشتری</p>
<p class="brand">{{ brand.nameFa }} · پرتال مشتری</p>
<h1>{{ org?.name || '…' }}</h1>
</div>
<button v-if="person" class="linkish" type="button" @click="logout">
+5 -4
View File
@@ -4,6 +4,7 @@ import { RouterLink, useRoute, useRouter } from 'vue-router';
import { useAuthStore } from '@/stores/auth';
import { api } from '@/lib/api';
import type { AskMentoResponse } from '@mento/shared';
import { brand, brandSuggestionFa } from '@mento/shared';
import { formatCompactMoney } from '@/lib/money';
import {
calendarDaysBetween,
@@ -145,9 +146,9 @@ const smartText = computed(() => {
const smartCta = computed(() => {
if (daysSinceContact.value != null && daysSinceContact.value <= 1) {
return 'پیشنهاد منتو: پیگیری بعدی را ثبت کن';
return brandSuggestionFa('پیگیری بعدی را ثبت کن');
}
return 'پیشنهاد منتو: امروز با مشتری تماس بگیر';
return brandSuggestionFa('امروز با مشتری تماس بگیر');
});
const kpis = computed(() => [
@@ -377,12 +378,12 @@ watch(() => auth.user?.id, () => void load(), { immediate: true });
<div>
<h2>
<UiIcon name="sparkle" :size="14" />
خلاصه هوشمند منتو
خلاصه هوشمند {{ brand.nameFa }}
</h2>
<p>{{ smartText }}</p>
</div>
</header>
<AskMentoPanel placeholder="از منتو درباره کار امروز بپرس..." />
<AskMentoPanel :placeholder="`${brand.askLabelFa} درباره کار امروز...`" />
<button class="smart-cta" type="button" @click="onSmartCta">
<span>{{ smartCta }}</span>
<UiIcon name="chevron" :size="16" />
+6 -5
View File
@@ -6,7 +6,8 @@ import { BUSINESS_FIELDS, BUSINESS_FIELD_LABELS } from '@/lib/business-fields';
import AuthBrandPanel from '@/components/auth/AuthBrandPanel.vue';
import MentoLogo from '@/components/brand/MentoLogo.vue';
import axios from 'axios';
import type { RegisterChallengeResponse } from '@mento/shared';
import { brand, type RegisterChallengeResponse } from '@mento/shared';
import BrandName from '@/components/brand/BrandName.vue';
const auth = useAuthStore();
const router = useRouter();
@@ -106,15 +107,15 @@ function backToForm() {
<div class="auth-shell">
<AuthBrandPanel
headline="همه ارتباطات، یکجا مدیریت می‌شوند"
description="با ساخت حساب منتو، سازمان خود را راه‌اندازی کنید و فروش و پشتیبانی را از یکجا پیش ببرید."
:description="`با ساخت حساب ${brand.nameFa}، سازمان خود را راه‌اندازی کنید و فروش و پشتیبانی را از یکجا پیش ببرید.`"
/>
<section class="form-panel">
<header class="mobile-brand">
<RouterLink class="back-link" to="/login">بازگشت</RouterLink>
<MentoLogo :size="48" :show-text="false" />
<strong>منتو</strong>
<span>نرم‌افزار مدیریت ارتباط با مشتری</span>
<BrandName />
<span>{{ brand.taglineFa }}</span>
</header>
<div class="form-inner">
@@ -329,7 +330,7 @@ function backToForm() {
</div>
<footer class="auth-footer">
<p>۱۴۰۵ منتو. تمامی حقوق محفوظ است.</p>
<p>۱۴۰۵ {{ brand.nameFa }}. تمامی حقوق محفوظ است.</p>
<nav>
<a href="#">پشتیبانی</a>
<span>|</span>
+3 -2
View File
@@ -13,6 +13,7 @@ import {
import JalaliDateInput from '@/components/JalaliDateInput.vue';
import UiIcon from '@/components/UiIcon.vue';
import type { OrganizationDto, ReportsDashboardDto } from '@mento/shared';
import { brand } from '@mento/shared';
type PeriodKey = 'today' | 'week' | 'month' | 'quarter' | 'year' | 'custom';
@@ -137,7 +138,7 @@ function exportReport() {
if (!data.value) return;
const d = data.value;
const lines: string[] = [
'گزارشات منتو',
`گزارشات ${brand.nameFa}`,
`بازه,${rangeLabel()}`,
'',
'شاخص,مقدار,تغییر٪',
@@ -170,7 +171,7 @@ function exportReport() {
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = `mento-report-${from.value || 'from'}-${to.value || 'to'}.csv`;
a.download = `${brand.filePrefix}-report-${from.value || 'from'}-${to.value || 'to'}.csv`;
a.click();
URL.revokeObjectURL(url);
}
+4 -3
View File
@@ -8,6 +8,7 @@ import type {
TahesabConnectionDto,
UpdateTahesabConnectionRequest,
} from '@mento/shared';
import { brand } from '@mento/shared';
const loading = ref(false);
const saving = ref(false);
@@ -315,7 +316,7 @@ async function importBulk(mode: 'results' | 'range') {
}
if (
!confirm(
`${codes.length} مشتری جدید از ته‌حساب به‌عنوان شخص در منتو ساخته و لینک می‌شوند. ادامه؟`,
`${codes.length} مشتری جدید از ته‌حساب به‌عنوان شخص در ${brand.nameFa} ساخته و لینک می‌شوند. ادامه؟`,
)
) {
return;
@@ -327,7 +328,7 @@ async function importBulk(mode: 'results' | 'range') {
if (!fromRaw && !toRaw) {
if (
!confirm(
'همهٔ مشتریان ته‌حساب وارد منتو می‌شوند (قبلاً لینک‌شده‌ها رد می‌شوند). ممکن است کمی طول بکشد. ادامه؟',
`همهٔ مشتریان ته‌حساب وارد ${brand.nameFa} می‌شوند (قبلاً لینک‌شده‌ها رد می‌شوند). ممکن است کمی طول بکشد. ادامه؟`,
)
) {
return;
@@ -342,7 +343,7 @@ async function importBulk(mode: 'results' | 'range') {
}
if (
!confirm(
`همهٔ مشتریان ته‌حساب با کد ${fromCode} تا ${toCode} وارد منتو می‌شوند (قبلاً لینک‌شده‌ها رد می‌شوند). ادامه؟`,
`همهٔ مشتریان ته‌حساب با کد ${fromCode} تا ${toCode} وارد ${brand.nameFa} می‌شوند (قبلاً لینک‌شده‌ها رد می‌شوند). ادامه؟`,
)
) {
return;