Source icon
The logo or neutral glyph for an ad platform, tool or data source, looked up by its name.
import SourceIcon from "@/components/SourceIcon";SourceIcon takes the name of a platform or source as it appears in the data, such as "LinkedIn Ads" or "CRM", and draws its mark. A named product gets its own logo from src/assets/integrations. A category, such as "CRM" or "Web", gets a neutral Phosphor glyph, because the customer may run a tool we cannot name. Anything it does not recognise gets a plug.
Logos
These names, in any letter case, show a vendor logo. Several spellings point at the same file, so "Google Search", "Google Search Ads" and "Google Ads" all show the Google Ads logo.
<SourceIcon name="Google Ads" size={16} />
<SourceIcon name="LinkedIn Ads" size={16} />
<SourceIcon name="HubSpot" size={16} />| Logo | Names that show it |
|---|---|
| Google Ads | google ads, google search, google search ads |
linkedin, linkedin ads, linkedin + web, linkedin campaign manager | |
| Meta Ads | meta, meta ads |
| HubSpot | hubspot |
| Google Analytics | ga4, google analytics |
| Salesforce, Segment, Snowflake, Marketo, Outreach, Gong | Their names |
Glyphs
Categories get a Phosphor icon in --text-muted (#8E93AF). Every other name falls back to Plug.
<SourceIcon name="Web" size={16} /> {/* Globe */}
<SourceIcon name="CRM" size={16} /> {/* Database */}
<SourceIcon name="Warehouse" size={16} /> {/* Database */}
<SourceIcon name="Pipeline" size={16} /> {/* Funnel */}
<SourceIcon name="Target account list" size={16} /> {/* ListChecks */}
<SourceIcon name="Webflow" size={16} /> {/* Plug: no mapping */}| Glyph | Names |
|---|---|
Globe | web, website |
Database | crm, warehouse, crm · sdr queue |
Funnel | pipeline |
ListChecks | target account list |
Plug | Anything else |
Webflow, ZoomInfo, 6sense, NetSuite, Salesloft, PartnerStack, Splash, Apollo and lemlist have logo files in src/assets/integrations, but no name maps to them, so they show the plug. To show a logo, add the name to LOGO_FILE in SourceIcon.jsx, keyed in lower case, with the file name in lower case.
Next to its name
Most of the product prints the channel's name beside the icon. Leave named off there, so the name is not repeated on hover. The Home recommendation cards and the Recommendations page use 13px with 12px text.
<span className="inline-flex items-center gap-1.5 text-[12px] text-[var(--text-secondary)]">
<SourceIcon name="LinkedIn Ads" size={13} /> LinkedIn Ads
</span>On its own
When the icon stands alone, such as the channels a workflow reads from, pass named. The icon is then wrapped in a Tooltip that shows the name, and a logo gets the name as its alt.
<SourceIcon name="Google Ads" size={14} named />
<SourceIcon name="LinkedIn Ads" size={14} named />
<SourceIcon name="HubSpot" size={14} named />Sizes
size sets the width and height in pixels. The default is 14. The product uses 12 to 18.
<SourceIcon name="HubSpot" size={12} />
<SourceIcon name="HubSpot" size={13} />
<SourceIcon name="HubSpot" />
<SourceIcon name="HubSpot" size={16} />
<SourceIcon name="HubSpot" size={18} />| Size | Where |
|---|---|
| 12px | Data source lines on a campaign page |
| 13px | Channel on recommendation cards and rows, channel tabs, chat action destinations |
| 14px | Workflow lists, run review rows, change cards, the campaigns list |
| 15 to 16px | Campaign header, workflow detail sources |
| 18px | Agent detail, the platforms and tools an agent reads |
Props
| Prop | Type | Default | Notes |
|---|---|---|---|
name | string | The platform or source name. Matched in lower case with spaces trimmed at both ends. | |
size | number | 14 | Width and height in pixels. |
named | boolean | false | Adds a tooltip with the name. Use it when no text sits beside the icon. |
className | string | Added to the <img> or the glyph's <svg>. For spacing only. |
A logo is an <img> with object-contain, shrink-0 and loading="lazy". A glyph is the Phosphor icon with shrink-0 and text-[var(--text-muted)].
Accessibility
- Without
named, a logo hasalt=""and is skipped by screen readers. That is right only when the name is printed beside it. - With
named, the logo'saltis the name and the tooltip wrapper has the name asaria-label. The wrapper is not focusable, so the tooltip opens on hover only. - A glyph has no text alternative in either case. Where "CRM" or "Web" stands alone, print the word.
Do and don't
- Do use SourceIcon for every platform or tool mark. Do not import a logo file directly.
- Do pass the name you would show people, such as "LinkedIn Ads", and let SourceIcon find the file.
- Don't give a category a vendor logo. "CRM" stays a database glyph, because the customer may not use Salesforce or HubSpot.
- Don't recolour a logo with
className. The glyph colour can follow its context, the logos cannot.
For how logos are drawn and which ones Figma has, see Logos.
Where it is used
| File | What it marks |
|---|---|
src/pages/harness/HomePage.jsx | The channel on recommendation cards and rows (13px). |
src/pages/harness/HarnessChat.jsx | Where an action in the chat is sent (13px). |
src/pages/harness/CampaignsPage.jsx | The channel of each campaign (14px). |
src/pages/harness/CampaignDetail.jsx | The campaign header and its data sources (12 and 15px). |
src/pages/recommendations/index.jsx | The channel tabs, the recommendation's channel and each change card's system (13 and 14px). |
src/pages/workflows/index.jsx | The workflow's platform, and its channels with named (14px). |
src/pages/workflows/WorkflowDetail.jsx | What the workflow reads and writes to (16px). |
src/pages/workflows/Assessment.jsx | The sources in an assessment (14px). |
src/pages/workflows/agents-run/parts.jsx, RunViews.jsx | The system each change in a run goes to, with named (14px). |
src/pages/workflows/agents-run/WorkflowConfigPage.jsx | The sources in a workflow's set-up (14px). |
src/pages/agents/AgentDetail.jsx | The platforms and tools an agent reads (18px). |