From 3199b681a2a8c4fd383ef01680a30174b2768221 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 20 Aug 2026 00:15:21 +0300 Subject: [PATCH] =?UTF-8?q?feat(landing):=20=D0=BD=D0=B0=D1=81=D1=82=D0=BE?= =?UTF-8?q?=D1=8F=D1=89=D0=B8=D0=B5=20=D0=BB=D0=BE=D0=B3=D0=BE=D1=82=D0=B8?= =?UTF-8?q?=D0=BF=D1=8B=20=D0=BF=D1=80=D0=BE=D0=B4=D1=83=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=20=D0=B8=20=D0=BA=D0=B0=D1=80=D1=82=D0=BE=D1=87=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=B2=20=D0=B8=D1=85=20=D1=84=D0=B8=D1=80=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D1=85=20=D1=86=D0=B2=D0=B5=D1=82=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Две одинаковые серые плитки не давали понять, что это разные приложения, а у Бонитировки стояла служебная заглушка вместо логотипа. - logo_url и brand_color у продукта; логотипы взяты из самих приложений; - фон и рамка карточки — мягкий градиент фирменного цвета, ссылка тоже; - в шапке было «1 — ФЛАГМАНСКИЙ ПРОДУКТ», стало «2 — ПРОДУКТА В PRODUCTION». --- backend/src/routes/public.ts | 2 +- frontend/public/logos/agroto.png | Bin 0 -> 3734 bytes frontend/public/logos/bonitirovka.png | Bin 0 -> 828 bytes frontend/src/api/client.ts | 2 ++ frontend/src/pages/Landing.tsx | 32 ++++++++++++++++++++++---- 5 files changed, 30 insertions(+), 6 deletions(-) create mode 100644 frontend/public/logos/agroto.png create mode 100644 frontend/public/logos/bonitirovka.png diff --git a/backend/src/routes/public.ts b/backend/src/routes/public.ts index 4fb3fe3..e773706 100644 --- a/backend/src/routes/public.ts +++ b/backend/src/routes/public.ts @@ -15,7 +15,7 @@ publicRouter.get('/content', async (_req, res) => { query( `SELECT id, slug, title, subtitle, description, status, audience, icon_key, tags, sort_order, site_url, - title_en, subtitle_en, description_en + title_en, subtitle_en, description_en, logo_url, brand_color FROM products WHERE is_published = true ORDER BY sort_order ASC` diff --git a/frontend/public/logos/agroto.png b/frontend/public/logos/agroto.png new file mode 100644 index 0000000000000000000000000000000000000000..ed03682ade100004dbf1eed1dbc97f01111a1c58 GIT binary patch literal 3734 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 K3@i0<@&5soSF&^f literal 0 HcmV?d00001 diff --git a/frontend/public/logos/bonitirovka.png b/frontend/public/logos/bonitirovka.png new file mode 100644 index 0000000000000000000000000000000000000000..20c92021960f453695f1649ffe72620c976f8097 GIT binary patch literal 828 zcmeAS@N?(olHy`uVBq!ia0vp^2SAvE2}s`E_d9@rftlIU#WAGf*4sP!`Bw^Lj(@Bc z==fIfS;a$yZTEtcI&7trQvQ8m;WIb1wK;h1j`9P+4?NF)PMY+zC{k?Qm-B1qhkr7= zz3%O$J(sfUbL&_C-tG44?kPP12PO{&P6bW{MwJGZ2`m#Bgn$BIAx0Ij5KsUlgiTHF zg}0%b?{0bi{#yS1HSs3;@~h-uPyf37SHoVG3yJpo%;wu|`JFUxon1`#jeLf`3xnII z)i2*1uiFu*w;=xh?C$TjFW-b~uMA}rDSu#TE$!eRzE#j-i>zAu|8MhqBUUz-{waW~vc%Q~hU&?SR?^foQlB>@cqWtXln+Csn zxvH0G%Y?pNzJ?)N0~^GOz8OE5@i1_4H)p!jX?Bx?ORGPr{{6(rTXcB!_gtffd9}qa zUoyS8dEaEN_=QLLo7T-?u;gWW5ps;5*0p}$I&WNx9J}D z>^CQ0Ojy3~@jaitduP4q*2xmvyr%rIeZ9=z?loqDTfHBrJ(u{JqVfESy7+~PHm0w4 zj-LxK`|+XV&;nzJ_GahiGuH#PJ?CW^*G{|kcG=t7%6RT)XAUu52zGY)%35;e;tF6W ztN5Sex}f|v@1I}r{}+ZU>u&mn$(u4tI{bgS(l1Xd2^_Typ1_y{M{KMDFv9V~E?5~T zQQ%SoGm30A43mIH1CtiiNvP()k{^ +
{badgeText} @@ -172,9 +183,19 @@ export function Landing() { )}
-
- -
+ {p.logo_url ? ( + {String(pick(p, + ) : ( +
+ +
+ )}
{pick(p, 'title')}
{pick(p, 'subtitle') && ( @@ -193,7 +214,8 @@ export function Landing() { href={p.site_url} target="_blank" rel="noopener" - className="inline-flex items-center gap-1.5 mt-5 text-sm font-medium text-brand-900 border-b border-brand-900/30 hover:border-brand-900 transition-colors" + className="inline-flex items-center gap-1.5 mt-5 text-sm font-medium border-b transition-colors" + style={{ color: p.brand_color || undefined, borderColor: p.brand_color ? `${p.brand_color}55` : undefined }} > {p.site_url.replace(/^https?:\/\//, '')}