From 3b1867f31417786b8d87c8a30533ec50f35fe138 Mon Sep 17 00:00:00 2001 From: Danny White <3104761+dnywh@users.noreply.github.com> Date: Wed, 30 Sep 2026 09:13:06 +1000 Subject: [PATCH] fix(studio): use neutral fallbacks for pending destination marks (#51003) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Problem Some Pipelines destinations should not display third-party brand marks until their use is confirmed. ## Solution Render neutral text monograms for destinations with pending brand marks. Keep approved destination marks unchanged and preserve the existing assets so they can be restored with a small configuration change. | After | | --- | | CleanShot 2026-09-29 at 11 44
37@2x | ## Review instructions 1. Open `/project//database/replication`. 2. Open the destination picker and confirm destinations with pending marks use neutral two-letter monograms. 3. Confirm the other destination marks are unchanged. ## Checklist - [x] I have read [CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md) ## Summary by CodeRabbit * **Style** * ClickHouse and Snowflake destinations now display “CH” and “SF” monograms instead of image marks. BigQuery and DuckLake continue to display their image marks, while destinations without configured branding continue to show their destination icons. These logo treatments make the configured destination branding visible in the replication destination interface. --- .../Database/Replication/DestinationLogo.tsx | 34 +++++++++++++------ 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/apps/studio/components/interfaces/Database/Replication/DestinationLogo.tsx b/apps/studio/components/interfaces/Database/Replication/DestinationLogo.tsx index c595dd9fcb9..54cf3019961 100644 --- a/apps/studio/components/interfaces/Database/Replication/DestinationLogo.tsx +++ b/apps/studio/components/interfaces/Database/Replication/DestinationLogo.tsx @@ -4,13 +4,13 @@ import { DestinationIcon } from './DestinationIcon' import type { DestinationType } from './DestinationPanel/DestinationPanel.types' import { BASE_PATH } from '@/lib/constants' -// Destinations with a brand mark. Anything absent falls back to the line icon in the same frame, -// so a new destination type never renders an empty square. -const BRAND_MARK_BY_TYPE: Partial> = { - BigQuery: `${BASE_PATH}/img/icons/bigquery-icon.svg`, - ClickHouse: `${BASE_PATH}/img/icons/clickhouse-icon.svg`, - DuckLake: `${BASE_PATH}/img/icons/ducklake-icon.svg`, - Snowflake: `${BASE_PATH}/img/icons/snowflake-icon.svg`, +type DestinationBrand = { type: 'mark'; src: string } | { type: 'monogram'; label: string } + +const BRAND_BY_TYPE: Partial> = { + BigQuery: { type: 'mark', src: `${BASE_PATH}/img/icons/bigquery-icon.svg` }, + ClickHouse: { type: 'monogram', label: 'CH' }, + DuckLake: { type: 'mark', src: `${BASE_PATH}/img/icons/ducklake-icon.svg` }, + Snowflake: { type: 'monogram', label: 'SF' }, } const SIZE_CLASS_NAME = { @@ -37,15 +37,27 @@ export const DestinationLogo = ({ hasErrors = false, }: DestinationLogoProps) => { const sizing = SIZE_CLASS_NAME[size] - const brandMark = BRAND_MARK_BY_TYPE[type] + const brand = BRAND_BY_TYPE[type] return ( - {brandMark === undefined ? ( + {brand === undefined && ( - ) : ( - + )} + {brand?.type === 'mark' && ( + + )} + {brand?.type === 'monogram' && ( + + {brand.label} + )} {hasErrors && (