fix(icons): align table block icon and 12-unit icon stroke with the emcn family (#6708)

The table/table_v2 blocks and the table trigger used a local lucide-shaped
TableIcon (stroke 2.0, full-bleed 24 viewBox, 3x3 grid) while every other
table surface used emcn's Table. Consolidate onto the emcn icon and drop the
local copy.

Nested tool-call rows in Chat applied no color class, so a non-brand block
icon inherited body text instead of --text-icon.

redo/undo/zoom-in/zoom-out draw 0.85 stroke on a 12-unit viewBox, rendering
0.992px at a 14px box against the family's 0.904px. 0.775 restores parity.
This commit is contained in:
Waleed
2026-08-14 14:49:24 -07:00
committed by GitHub
parent 9664e7ec17
commit d5701d5b2b
18 changed files with 37 additions and 84 deletions
-20
View File
@@ -7538,26 +7538,6 @@ export function BedrockIcon(props: SVGProps<SVGSVGElement>) {
)
}
export function TableIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg
xmlns='http://www.w3.org/2000/svg'
viewBox='0 0 24 24'
fill='none'
stroke='currentColor'
strokeWidth={2}
strokeLinecap='round'
strokeLinejoin='round'
{...props}
>
<rect width='18' height='18' x='3' y='3' rx='2' />
<path d='M3 9h18' />
<path d='M3 15h18' />
<path d='M9 3v18' />
<path d='M15 3v18' />
</svg>
)
}
export function ReductoIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg
+2 -3
View File
@@ -3,7 +3,7 @@
// Maps block types to their icon component references
import type { ComponentType, SVGProps } from 'react'
import { Library, Rocket } from '@sim/emcn/icons'
import { Library, Rocket, Table } from '@sim/emcn/icons'
import {
A2AIcon,
AgentMailIcon,
@@ -225,7 +225,6 @@ import {
StagehandIcon,
StripeIcon,
SupabaseIcon,
TableIcon,
TailscaleIcon,
TavilyIcon,
TelegramIcon,
@@ -518,7 +517,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
stt: STTIcon,
stt_v2: STTIcon,
supabase: SupabaseIcon,
table: TableIcon,
table: Table,
tailscale: TailscaleIcon,
tavily: TavilyIcon,
telegram: TelegramIcon,
@@ -1,11 +1,5 @@
import {
AgentIcon,
AnthropicIcon,
GmailIcon,
LinearIcon,
SlackIcon,
TableIcon,
} from '@/components/icons'
import { Table as TableIcon } from '@sim/emcn/icons'
import { AgentIcon, AnthropicIcon, GmailIcon, LinearIcon, SlackIcon } from '@/components/icons'
import type { BlockDef } from '@/app/(landing)/components/hero/components/hero-visual/workflow-data'
/**
@@ -1,4 +1,5 @@
import { AgentIcon, CodeIcon, SlackIcon, StartIcon, TableIcon } from '@/components/icons'
import { Table as TableIcon } from '@sim/emcn/icons'
import { AgentIcon, CodeIcon, SlackIcon, StartIcon } from '@/components/icons'
import type { BlockDef } from '@/app/(landing)/components/hero/components/hero-visual/workflow-data'
import { BLOCK_WIDTH } from '@/app/(landing)/components/hero/components/hero-visual/workflow-data'
@@ -1,4 +1,5 @@
import { AgentIcon, ConditionalIcon, MailIcon, StartIcon, TableIcon } from '@/components/icons'
import { Table as TableIcon } from '@sim/emcn/icons'
import { AgentIcon, ConditionalIcon, MailIcon, StartIcon } from '@/components/icons'
import type { BlockDef } from '@/app/(landing)/components/hero/components/hero-visual/workflow-data'
/**
@@ -1,6 +1,7 @@
'use client'
import { AgentIcon, ConditionalIcon, ScheduleIcon, SlackIcon, TableIcon } from '@/components/icons'
import { Table as TableIcon } from '@sim/emcn/icons'
import { AgentIcon, ConditionalIcon, ScheduleIcon, SlackIcon } from '@/components/icons'
import { EnterprisePlatformLoop } from '@/app/(landing)/enterprise/components/enterprise-platform-loop'
import type { EnterpriseLoopContent } from '@/app/(landing)/enterprise/components/enterprise-platform-loop/stage-data'
@@ -1,6 +1,7 @@
'use client'
import { AgentIcon, ConditionalIcon, MailIcon, StartIcon, TableIcon } from '@/components/icons'
import { Table as TableIcon } from '@sim/emcn/icons'
import { AgentIcon, ConditionalIcon, MailIcon, StartIcon } from '@/components/icons'
import { EnterprisePlatformLoop } from '@/app/(landing)/enterprise/components/enterprise-platform-loop'
import type { EnterpriseLoopContent } from '@/app/(landing)/enterprise/components/enterprise-platform-loop/stage-data'
@@ -1,13 +1,7 @@
'use client'
import {
AgentIcon,
ConditionalIcon,
JiraIcon,
SlackIcon,
StartIcon,
TableIcon,
} from '@/components/icons'
import { Table as TableIcon } from '@sim/emcn/icons'
import { AgentIcon, ConditionalIcon, JiraIcon, SlackIcon, StartIcon } from '@/components/icons'
import { EditorLoop, type EditorLoopContent } from '@/app/(landing)/components/shared/editor-loop'
/**
@@ -238,7 +238,10 @@ export function ToolCallItem({
return (
<div className='flex items-center gap-[6px] pl-6'>
{BlockIcon && (
<BlockIcon className='size-[14px] flex-shrink-0' style={getBareIconStyle(BlockIcon)} />
<BlockIcon
className='size-[14px] flex-shrink-0 text-[var(--text-icon)]'
style={getBareIconStyle(BlockIcon)}
/>
)}
{isExecuting ? (
<ShimmerText className='text-[13px] [--shimmer-rest:var(--text-secondary)]'>
+2 -2
View File
@@ -1,5 +1,5 @@
import { Table } from '@sim/emcn/icons'
import { toError } from '@sim/utils/errors'
import { TableIcon } from '@/components/icons'
import { TABLE_LIMITS } from '@/lib/table/constants'
import { filterRulesToFilter, sortRulesToSort } from '@/lib/table/query-builder/converters'
import type { BlockConfig } from '@/blocks/types'
@@ -201,7 +201,7 @@ export const TableBlock: BlockConfig<TableQueryResponse> = {
docsLink: 'https://docs.sim.ai/integrations/table',
category: 'blocks',
bgColor: '#10B981',
icon: TableIcon,
icon: Table,
canvasPresentation: {
defaultTitle: 'Table',
/*
+2 -2
View File
@@ -1,5 +1,5 @@
import { Table } from '@sim/emcn/icons'
import { toError } from '@sim/utils/errors'
import { TableIcon } from '@/components/icons'
import { TABLE_LIMITS } from '@/lib/table/constants'
import { filterRulesToPredicate, sortRulesToSortSpec } from '@/lib/table/query-builder/converters'
import { normalizeTablePredicate } from '@/lib/table/query-builder/predicate'
@@ -221,7 +221,7 @@ export const TableV2Block: BlockConfig<TableQueryV2Response> = {
// and mark v1 `table` superseded.
preview: true,
bgColor: '#10B981',
icon: TableIcon,
icon: Table,
canvasPresentation: {
defaultTitle: 'Table',
/*
-20
View File
@@ -7538,26 +7538,6 @@ export function BedrockIcon(props: SVGProps<SVGSVGElement>) {
)
}
export function TableIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg
xmlns='http://www.w3.org/2000/svg'
viewBox='0 0 24 24'
fill='none'
stroke='currentColor'
strokeWidth={2}
strokeLinecap='round'
strokeLinejoin='round'
{...props}
>
<rect width='18' height='18' x='3' y='3' rx='2' />
<path d='M3 9h18' />
<path d='M3 15h18' />
<path d='M9 3v18' />
<path d='M15 3v18' />
</svg>
)
}
export function ReductoIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg
+2 -3
View File
@@ -3,7 +3,7 @@
// Maps block types to their icon component references for the integrations page
import type { ComponentType, SVGProps } from 'react'
import { Library, Rocket } from '@sim/emcn/icons'
import { Library, Rocket, Table } from '@sim/emcn/icons'
import {
A2AIcon,
AgentMailIcon,
@@ -223,7 +223,6 @@ import {
StagehandIcon,
StripeIcon,
SupabaseIcon,
TableIcon,
TailscaleIcon,
TavilyIcon,
TelegramIcon,
@@ -497,7 +496,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
sts: STSIcon,
stt_v2: STTIcon,
supabase: SupabaseIcon,
table: TableIcon,
table: Table,
tailscale: TailscaleIcon,
tavily: TavilyIcon,
telegram: TelegramIcon,
+2 -2
View File
@@ -1,4 +1,4 @@
import { TableIcon } from '@/components/icons'
import { Table } from '@sim/emcn/icons'
import { requestJson } from '@/lib/api/client/request'
import { listTablesContract } from '@/lib/api/contracts/tables'
import type { TableDefinition } from '@/lib/table'
@@ -39,7 +39,7 @@ export const tableNewRowTrigger: TriggerConfig = {
provider: 'table',
description: 'Triggers when rows are inserted or updated in a table',
version: '1.0.0',
icon: TableIcon,
icon: Table,
subBlocks: [
{
+2 -2
View File
@@ -18,14 +18,14 @@ export function Redo(props: SVGProps<SVGSVGElement>) {
<path
d='M9.5 4.5H4C2.62 4.5 1.5 5.62 1.5 7C1.5 8.38 2.62 9.5 4 9.5H7'
stroke='currentColor'
strokeWidth='0.85'
strokeWidth='0.775'
strokeLinecap='round'
strokeLinejoin='round'
/>
<path
d='M8 2.5L10 4.5L8 6.5'
stroke='currentColor'
strokeWidth='0.85'
strokeWidth='0.775'
strokeLinecap='round'
strokeLinejoin='round'
/>
+2 -2
View File
@@ -18,14 +18,14 @@ export function Undo(props: SVGProps<SVGSVGElement>) {
<path
d='M2.5 4.5H8C9.38 4.5 10.5 5.62 10.5 7C10.5 8.38 9.38 9.5 8 9.5H5'
stroke='currentColor'
strokeWidth='0.85'
strokeWidth='0.775'
strokeLinecap='round'
strokeLinejoin='round'
/>
<path
d='M4 2.5L2 4.5L4 6.5'
stroke='currentColor'
strokeWidth='0.85'
strokeWidth='0.775'
strokeLinecap='round'
strokeLinejoin='round'
/>
+4 -4
View File
@@ -20,28 +20,28 @@ export function ZoomIn(props: SVGProps<SVGSVGElement>) {
cy='5'
r='3.5'
stroke='currentColor'
strokeWidth='0.85'
strokeWidth='0.775'
strokeLinecap='round'
strokeLinejoin='round'
/>
<path
d='M5 3.5V6.5'
stroke='currentColor'
strokeWidth='0.85'
strokeWidth='0.775'
strokeLinecap='round'
strokeLinejoin='round'
/>
<path
d='M3.5 5H6.5'
stroke='currentColor'
strokeWidth='0.85'
strokeWidth='0.775'
strokeLinecap='round'
strokeLinejoin='round'
/>
<path
d='M7.5 7.5L10.5 10.5'
stroke='currentColor'
strokeWidth='0.85'
strokeWidth='0.775'
strokeLinecap='round'
strokeLinejoin='round'
/>
+3 -3
View File
@@ -20,21 +20,21 @@ export function ZoomOut(props: SVGProps<SVGSVGElement>) {
cy='5'
r='3.5'
stroke='currentColor'
strokeWidth='0.85'
strokeWidth='0.775'
strokeLinecap='round'
strokeLinejoin='round'
/>
<path
d='M3.5 5H6.5'
stroke='currentColor'
strokeWidth='0.85'
strokeWidth='0.775'
strokeLinecap='round'
strokeLinejoin='round'
/>
<path
d='M7.5 7.5L10.5 10.5'
stroke='currentColor'
strokeWidth='0.85'
strokeWidth='0.775'
strokeLinecap='round'
strokeLinejoin='round'
/>