Pull request #2466: Feature/TEAMMSBMOB-22759 reclame campaign

Merge in MCB_FE/mcb-platform-monorepo from feature/TEAMMSBMOB-22759_reclame-campaign to release-1.10.0

* commit '12eb00e98a03fcd334a72327e1b1cc7799ee17d0':
  feat(TEAMMSBMOB-22759): изменение цвета текста
  feat(TEAMMSBMOB-22759): рекламная капания 5
This commit is contained in:
Егор Онуфрийчук
2026-01-30 17:56:44 +03:00
21 changed files with 110 additions and 102 deletions
+1
View File
@@ -164,6 +164,7 @@ const EXTERNAL_LINKS = {
REGULATIONS_CERTIFICATION_CENTER: 'https://www.gazprombank.ru/corporate/settlement_cash_services/client_bank/#tab_432725',
CRYPTO_PRO: 'https://passport.gbo.gazprombank.ru/help#cm61',
SALARY_PROJECTS: 'https://www.gazprombank.ru/business/salary-project/#first-step',
PAYMENTS_ABROAD: 'https://www.gazprombank.ru/special/msb/ved-payments-1/',
};
const CROSS_SALE_PATHS = {
+17 -12
View File
@@ -3,7 +3,12 @@ import { LongRightIcon } from '@fractal-ui/library';
import { Modal } from '@fractal-ui/overlays';
import { Title, Text } from '@fractal-ui/styling';
import type { MegaBannerModel, SALE_GRADIENTS } from '@msb/shared';
import { MEDIA, TEXT_RATE_KEY, useBestRatesMainPage, useMediaQuery, type BaseModalProps } from '@msb/shared';
import {
MEDIA,
// TEXT_RATE_KEY, useBestRatesMainPage,
useMediaQuery,
type BaseModalProps,
} from '@msb/shared';
import * as S from './MegaBanner.styles';
interface MegaBannerProps extends MegaBannerModel, BaseModalProps {
@@ -17,14 +22,14 @@ const MegaBanner = ({
button,
image,
gradient = 'sale2',
rateText,
dealType,
// rateText,
// dealType,
onConfirm,
onClose,
}: MegaBannerProps) => {
const isMobile = useMediaQuery(MEDIA.mobile);
const { bestRates } = useBestRatesMainPage();
// const { bestRates } = useBestRatesMainPage();
if (!isOpen) {
return null;
@@ -38,13 +43,13 @@ const MegaBanner = ({
onClose?.();
};
const haveRate = dealType && rateText && bestRates && bestRates[dealType];
// const haveRate = dealType && rateText && bestRates && bestRates[dealType];
const finalText = haveRate
? rateText
.split(new RegExp(`(${TEXT_RATE_KEY})`))
.map(textPart => (textPart === TEXT_RATE_KEY ? <b>{bestRates[dealType]}%</b> : textPart))
: text;
// const finalText = haveRate
// ? rateText
// .split(new RegExp(`(${TEXT_RATE_KEY})`))
// .map(textPart => (textPart === TEXT_RATE_KEY ? <b>{bestRates[dealType]}%</b> : textPart))
// : text;
return (
<>
@@ -62,11 +67,11 @@ const MegaBanner = ({
{isMobile ? <Title.H1Bold color="text.primary">{title}</Title.H1Bold> : <Title.H2Bold color="text.primary">{title}</Title.H2Bold>}
{isMobile ? (
<Text.P2 color="text.primary" whiteSpace="pre-wrap">
{finalText}
{text}
</Text.P2>
) : (
<Text.P1 color="text.primary" whiteSpace="inherit">
{finalText}
{text}
</Text.P1>
)}
</S.Content>
@@ -11,9 +11,10 @@ const BannerContainer = styled.div<{ $background: string }>(({ $background }) =>
const Image = styled.img({
position: 'absolute',
right: 0,
right: '-12px',
bottom: 16,
height: 132,
scale: '1.5',
});
const Content = styled.div({
@@ -56,10 +56,10 @@ const PromoBanner: FC<PromoBannerProps> = ({
{bestRates[dealType]?.replace('.', ',')}%
</Title.H1>
)}
{title && <Title.H4 color="text.primary">{title}</Title.H4>}
<Text.P3 color="text.primary">{description}</Text.P3>
{title && <Title.H4 color="bg.primary">{title}</Title.H4>}
<Text.P3 color="bg.primary">{description}</Text.P3>
</S.Title>
<Button dataAction="read-more" size="M" variant="secondary" onClick={navigateTo}>
<Button dataAction="read-more" size="S" variant="white" onClick={navigateTo}>
{buttonText}
</Button>
</S.Content>
Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 21 KiB

@@ -1,12 +1,11 @@
[
{
"id": 1,
"title": "Валютный\nконтроль",
"saleGradient": "sale4",
"imagePath": "/product-carousel/assets/currency_transaction.webp",
"navigatePath": "/ulk_ved_eco/ru_RU/",
"isEcoPath": true,
"ymCode": "your_products_currency_control"
"title": "Счет\nонлайн",
"saleGradient": "sale2",
"imagePath": "/product-carousel/assets/account_online.webp",
"navigatePath": "/accounts/open-account/new",
"ymCode": "your_products_account_online"
},
{
"id": 2,
Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

@@ -1,14 +1,14 @@
{
"stories": [
{
"id": "0011",
"id": "0021",
"image": "/stories/assets/miniature_1.webp",
"name": "АУСН\nДоступно",
"ymCode": "stories_slide_ausn",
"gradient": "sale7",
"items": [
{
"id": "1011",
"id": "1021",
"gradient": "sale7",
"image": "/stories/assets/story_image_1.webp",
"showTime": 10000,
@@ -28,40 +28,14 @@
]
},
{
"id": "0012",
"image": "/stories/assets/miniature_2.webp",
"name": "Повышение НДС",
"ymCode": "stories_slide_nds",
"gradient": "sale2",
"items": [
{
"id": "1012",
"gradient": "sale2",
"image": "/stories/assets/story_image_2.webp",
"showTime": 10000,
"content": {
"title": "Изменение в налоговом законодательстве",
"description": "С 1 января 2026 года базовая ставка налога на добавленную стоимость (НДС) повышается с 20% до 22%",
"buttons": [
{
"link": "https://www.nalog.gov.ru/rn92/news/activities_fts/16586778/",
"ymCode": "stories_slide_nds_more",
"text": "Подробнее"
}
]
}
}
]
},
{
"id": "0013",
"id": "0022",
"image": "/stories/assets/miniature_3.webp",
"name": "Импорт платежей",
"ymCode": "stories_slide_import_payments",
"gradient": "sale6",
"items": [
{
"id": "1013",
"id": "1022",
"gradient": "sale6",
"image": "/stories/assets/story_image_3.webp",
"showTime": 10000,
@@ -80,14 +54,14 @@
]
},
{
"id": "0014",
"id": "0023",
"image": "/stories/assets/miniature_4.webp",
"name": "Проверка контрагентов",
"name": "Проверка контрагента",
"ymCode": "stories_slide_partner_check",
"gradient": "sale2",
"items": [
{
"id": "1014",
"id": "1023",
"gradient": "sale2",
"image": "/stories/assets/story_image_4.webp",
"showTime": 10000,
@@ -106,25 +80,26 @@
]
},
{
"id": "0015",
"image": "/stories/assets/miniature_5.webp",
"name": "Валютные переводы",
"ymCode": "stories_slide_currency_operations_china",
"gradient": "sale3",
"id": "0024",
"image": "/stories/assets/miniature_9.webp",
"name": "Валютный контроль",
"ymCode": "stories_slide_currency_control",
"gradient": "sale7",
"items": [
{
"id": "1015",
"gradient": "sale3",
"image": "/stories/assets/story_image_5.webp",
"id": "1024",
"gradient": "sale7",
"image": "/stories/assets/story_image_9.webp",
"showTime": 10000,
"content": {
"title": "Надежные переводы\nв Китай",
"description": "Переводите деньги партнерам\nпо выгодному курсу Банка России\nи комиссией от 0,2%+НДС",
"title": "Валютный контроль",
"description": "Комиссия от 0,11% от суммы операции. \nВ стоимость включено сопровождение персональным валютным контролёром",
"buttons": [
{
"link": "https://app.ab-payments.ru/?idp=gpb",
"text": одробнее",
"ymCode": "stories_slide_currency_operations_china_more"
"link": "/ulk_ved_eco/ru_RU/",
"text": ерейти в кабинет",
"ymCode": "sstories_slide_currency_control_more",
"linkType": "eco"
}
]
}
@@ -132,14 +107,40 @@
]
},
{
"id": "0016",
"id": "0025",
"image": "/stories/assets/miniature_5.webp",
"name": "Платежи\nв Китай 1%",
"ymCode": "stories_slide_payments_china",
"gradient": "sale3",
"items": [
{
"id": "1025",
"gradient": "sale3",
"image": "/stories/assets/story_image_5.webp",
"showTime": 10000,
"content": {
"title": "Платежи в Китай за 1 день",
"description": "Переводите деньги по выгодному курсу Банка России с тарифом 1% + НДС",
"buttons": [
{
"link": "https://app.ab-payments.ru/?idp=gpb",
"text": "Оставить заявку",
"ymCode": "stories_slide_payments_china_more"
}
]
}
}
]
},
{
"id": "0026",
"image": "/stories/assets/miniature_6.webp",
"name": "Бизнес-карта\nОнлайн",
"ymCode": "stories_slide_business_cards",
"gradient": "sale5",
"items": [
{
"id": "1016",
"id": "1026",
"gradient": "sale5",
"image": "/stories/assets/story_image_6.webp",
"showTime": 10000,
@@ -157,15 +158,16 @@
}
]
},
{
"id": "0017",
"id": "0027",
"image": "/stories/assets/miniature_7.webp",
"name": "Экспресс-гарантия",
"ymCode": "stories_slide_bank_guarantees",
"gradient": "sale4",
"items": [
{
"id": "1017",
"id": "1027",
"gradient": "sale4",
"image": "/stories/assets/story_image_7.webp",
"showTime": 10000,
@@ -185,14 +187,14 @@
]
},
{
"id": "0018",
"id": "0028",
"image": "/stories/assets/miniature_8.webp",
"name": "Эквайринг выгодно",
"ymCode": "stories_slide_acquiring",
"gradient": "sale6",
"items": [
{
"id": "1018",
"id": "1028",
"gradient": "sale6",
"image": "/stories/assets/story_image_8.webp",
"showTime": 10000,
@@ -53,15 +53,15 @@ const ProfileGroup = styled.div(({ theme }) => ({
}));
const IconLogo = styled.img({
height: '70px',
width: '54px',
height: '54px',
objectFit: 'cover',
display: 'none',
[`@media ${MEDIA.tablet}`]: { display: 'block' },
[`@media ${MEDIA.tablet}`]: { width: '70px', height: '64px' },
});
const GpbMsbLogo = styled.img({
display: 'none',
[`@media ${MEDIA.desktop}`]: { display: 'block', width: '240px', height: '80px' },
[`@media ${MEDIA.desktop}`]: { display: 'block' },
});
const LetterService = styled.a({
@@ -2,9 +2,8 @@ import type { ReactNode } from 'react';
import { type ReactElement } from 'react';
import { UserProfileIcon } from '@fractal-ui/library';
import { PATHS } from '@msb/shared';
// import gpbIcon from '@msb/shared/assets/gpb_flavor.webp';
import gpbIcon from '../../../assets/new-year-logo-small.webp';
import gpbMsbLogo from '../../../assets/new-year-logo.webp';
import gpbIcon from '@msb/shared/assets/gpb_flavor.webp';
import gpbMsbLogo from '../../../assets/logo_pic_out.svg';
import * as S from './HeaderMenu.styles';
import { ProfileDropdown } from '@/entities/Profile';
import { UserNotifications } from '@/entities/UserNotification';
@@ -1,9 +1,10 @@
import cryptoProImg from './cryptoProImg.webp';
import megaBannerHeader from './megaBannerHeader@2x.webp';
import payments from './payments.webp';
const Icons = { cryptoProImg } as const;
const Icons = { cryptoProImg, payments } as const;
type IconName = keyof typeof Icons;
export { Icons, megaBannerHeader };
export { Icons, megaBannerHeader, payments };
export type { IconName };
Binary file not shown.

After

Width:  |  Height:  |  Size: 216 KiB

@@ -3,19 +3,19 @@ import { Icons, megaBannerHeader } from '../assets';
import type { PromoBanner } from '@/shared/model';
const promoBanner: PromoBanner = {
id: 'main_page_promo_banner_crypto_pro_id',
codeName: 'main_page_promo_banner_crypto_pro',
title: 'КриптоПро CSP 5.0',
description: 'Обновитесь до новой версии 5.0\nдо 15 января 2026 года чтобы сохранить доступ к интернет-\nбанку',
image: Icons.cryptoProImg,
link: EXTERNAL_LINKS.CRYPTO_PRO,
background: 'linear-gradient(135.58deg, #FFFFFF 0.99%, #FFFFFF 47.24%, #A9DFFF 98.06%)',
ymCode: 'right_side_banner_cryptopro5_more',
id: 'main_page_promo_banner_payments_abroad',
codeName: 'main_page_promo_banner_payments_abroad',
title: 'Платежи за границу',
description: 'Доступно более 70 стран \nс выгодной ставкой',
image: Icons.payments,
link: EXTERNAL_LINKS.PAYMENTS_ABROAD,
background: 'linear-gradient(136.47deg, #013895 0%, #7D20D4 58.93%, #2690E2 97.56%)',
ymCode: 'right_side_banner_payments_abroad_more',
};
const megaBanner: MegaBannerModel = {
title: 'Депозиты для бизнеса',
text: 'Начните получать доход от ваших денежных средств уже сейчас. \nОткройте депозит на наших лучших условиях.',
text: 'Размещайте свободные средства по выгодной ставке и получайте дополнительный доход',
rateText: `Начните получать доход от ваших денежных средств уже сейчас. \nОткройте депозит на наших лучших условиях по ставке до ${TEXT_RATE_KEY}`,
button: { text: 'Открыть', url: PATHS_DEPOSITS.TREASURY_DEALS, docType: DOC_TYPES.DEPOSIT },
dealType: 'DEPOSIT',
@@ -23,8 +23,8 @@ const megaBanner: MegaBannerModel = {
};
const ebgBanner = {
title: 'Электронная банковская гарантия \nбез\u00A0визита\u00A0в\u00A0офис',
text: 'Оформите электронную банковскую гарантию онлайн от\u00A010\u00A0минут на сумму до 200 млн рублей. Без\u00A0залога\u00A0и\u00A0поручителей',
title: 'Вам предодобрен лимит на\nэлектронные банковские гарантии',
text: 'Получите сумму до 200 млн. рублей в рамках лимита с решением онлайн от 10 минут. Без обеспечения и поручителей.',
button: {
text: 'Оформить',
url: `${EXTERNAL_PATHS.EBG}?productCode=ebg&sourcePage=popup&sourceSystem=MSB`,
@@ -25,7 +25,7 @@ const BALANCE_BANNERS: BalanceBannerSlide[] = [
},
{
id: '222',
text: 'Доход\nза 1 ночь',
text: 'Доход за 1 ночь',
imagePath: overnightDayImagePath,
saleGradient: 'sale2',
navigatePath: PATHS_DEPOSITS.TREASURY_DEALS,
@@ -35,7 +35,7 @@ const BALANCE_BANNERS: BalanceBannerSlide[] = [
},
{
id: '444',
text: 'Неснижаемый\nостаток\nпо счетам',
text: 'Неснижаемый\nостаток по счетам',
imagePath: groupAccountsImagePath,
saleGradient: 'sale1',
navigatePath: PATHS_DEPOSITS.TREASURY_DEALS,
@@ -89,11 +89,11 @@ const BalanceBanner = () => {
return (
<S.BannerWrapper
$isIpad={isIpad}
$isTouchDevice={isTouchDevice}
onTouchEnd={handleTouchEnd}
onTouchMove={handleTouchMove}
onTouchStart={handleTouchStart}
$isTouchDevice={isTouchDevice}
$isIpad={isIpad}
>
<S.BannerList $selectedBannerIndex={selectedBannerIndex}>
{BALANCE_BANNERS.map(banner => {
@@ -112,8 +112,8 @@ const BalanceBanner = () => {
</Title.H2>
)}
<S.Description
$showBestRates={!!showBestRates}
$lineClamp={showBestRates ? '2' : '3'}
$showBestRates={!!showBestRates}
color="bg.primary"
lineHeight="16px"
whiteSpace="pre-wrap"
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

@@ -6,7 +6,7 @@ const ghostBanners: Record<FinanceChipValue, TabGhostBanner> = {
accounts: {
imagePath: accountsGhostImage,
title: 'Перейти к оформлению',
badgeText: 'Зарабатывай на остатках',
badgeText: 'Зарабатывайте на остатках',
navigate: {
link: PATHS_DEPOSITS.TREASURY_DEALS,
docType: DOC_TYPES.MNO,
@@ -16,7 +16,7 @@ const ghostBanners: Record<FinanceChipValue, TabGhostBanner> = {
deposits: {
imagePath: depositsGhostImage,
title: 'Перейти к оформлению',
badgeText: 'Депозит на выгодных условиях',
badgeText: 'Депозит под выгодный процент',
navigate: {
link: PATHS_DEPOSITS.TREASURY_DEALS,
docType: DOC_TYPES.DEPOSIT,
@@ -32,7 +32,7 @@ const TextBlock = ({
>
{tag}
<Title.H3Bold color={(mode === 'light' ? lightTheme : darkTheme).colors.text.primary}>{title}</Title.H3Bold>
<Text.P2 color={(mode === 'light' ? lightTheme : darkTheme).colors.text.secondary}>{description}</Text.P2>
<Text.P2 color={(mode === 'light' ? lightTheme : darkTheme).colors.text.primary}>{description}</Text.P2>
</Wrapper>
);
};