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 0000000..ed03682 Binary files /dev/null and b/frontend/public/logos/agroto.png differ diff --git a/frontend/public/logos/bonitirovka.png b/frontend/public/logos/bonitirovka.png new file mode 100644 index 0000000..20c9202 Binary files /dev/null and b/frontend/public/logos/bonitirovka.png differ diff --git a/frontend/src/api/client.ts b/frontend/src/api/client.ts index 0e9c64f..722475c 100644 --- a/frontend/src/api/client.ts +++ b/frontend/src/api/client.ts @@ -15,6 +15,8 @@ export interface Product { title_en?: string | null; subtitle_en?: string | null; description_en?: string | null; + logo_url?: string | null; + brand_color?: string | null; } export interface ApproachItem { diff --git a/frontend/src/pages/Landing.tsx b/frontend/src/pages/Landing.tsx index f89b4d8..3bc9981 100644 --- a/frontend/src/pages/Landing.tsx +++ b/frontend/src/pages/Landing.tsx @@ -163,7 +163,18 @@ export function Landing() { ? (STATUS_LABELS_EN[p.status] || STATUS_LABELS_EN.planned) : statusBadge.text; return ( -
+
{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?:\/\//, '')}