From af8b8cb653ffa3727d2747b320668585ee41c6d7 Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Sat, 19 Sep 2026 17:38:18 -0700 Subject: [PATCH 1/2] fix(ui): align fallback model subblock styling --- .../model-fallback-list.test.tsx | 3 + .../model-fallback-list.tsx | 66 ++++++++++++------- 2 files changed, 44 insertions(+), 25 deletions(-) diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/model-fallback-list/model-fallback-list.test.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/model-fallback-list/model-fallback-list.test.tsx index 701db95d900..aa1cde7edc5 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/model-fallback-list/model-fallback-list.test.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/model-fallback-list/model-fallback-list.test.tsx @@ -30,6 +30,9 @@ vi.mock('next/navigation', () => ({ })) vi.mock('@sim/emcn', () => ({ + Button: ({ children, ...props }: React.ButtonHTMLAttributes) => ( + + ), Chip: ({ children, disabled, diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/model-fallback-list/model-fallback-list.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/model-fallback-list/model-fallback-list.tsx index 15b7bcefdd1..6004ff79b96 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/model-fallback-list/model-fallback-list.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/model-fallback-list/model-fallback-list.tsx @@ -1,7 +1,15 @@ 'use client' import { memo, useCallback, useEffect, useMemo, useRef } from 'react' -import { Chip, ChipCombobox, ChipDropdown, type ComboboxOption, Label, Tooltip } from '@sim/emcn' +import { + Button, + Chip, + ChipCombobox, + ChipDropdown, + type ComboboxOption, + Label, + Tooltip, +} from '@sim/emcn' import { ChevronDown, ChevronUp, Plus, Trash } from '@sim/emcn/icons' import { generateShortId } from '@sim/utils/id' import { useParams } from 'next/navigation' @@ -123,34 +131,39 @@ const FallbackRow = memo(function FallbackRow({ const apiKeyValue = isWholeEnvVarReference(row.apiKey) ? row.apiKey : '' return ( -
-
- {ordinalChoiceLabel(index)} -
+
+
+ {ordinalChoiceLabel(index)} +
{canMove && ( <> - onMove(row.id, -1)} disabled={readOnly || index === 0} aria-label='Move up' - /> + > + + Move up - onMove(row.id, 1)} disabled={readOnly || isLast} aria-label='Move down' - /> + > + + Move down @@ -158,19 +171,23 @@ const FallbackRow = memo(function FallbackRow({ )} - onRemove(row.id)} disabled={readOnly} aria-label='Remove fallback model' - /> + > + + Remove
-
+
{needsApiKey && ( -
- +
+ )} {tuningFields.map(({ knob, options }) => ( -
- +
+ +
{rows.map((row, index) => ( = MAX_FALLBACK_MODELS} > From faedae938afddf5639809174812bdc6c18c25dc5 Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Sat, 19 Sep 2026 17:51:21 -0700 Subject: [PATCH 2/2] fix(ui): keep editor pickers on shared combobox styling --- .../knowledge-base-selector.tsx | 4 ++-- .../mcp-server-modal/mcp-server-selector.tsx | 4 ++-- .../mcp-server-modal/mcp-tool-selector.tsx | 4 ++-- .../model-fallback-list.test.tsx | 17 +---------------- .../model-fallback-list/model-fallback-list.tsx | 16 ++++------------ .../workspace-folder-selector.test.tsx | 2 +- .../workspace-folder-selector.tsx | 4 ++-- apps/sim/components/mcp/mcp-selectors.test.tsx | 6 +++--- .../components/combobox/combobox.dom.test.tsx | 16 ++++++++++++++++ .../emcn/src/components/combobox/combobox.tsx | 15 ++++++++------- 10 files changed, 41 insertions(+), 47 deletions(-) diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/knowledge-base-selector/knowledge-base-selector.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/knowledge-base-selector/knowledge-base-selector.tsx index a9a25f64059..e7d794bf22b 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/knowledge-base-selector/knowledge-base-selector.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/knowledge-base-selector/knowledge-base-selector.tsx @@ -1,7 +1,7 @@ 'use client' import { useCallback, useMemo } from 'react' -import { ChipCombobox, ChipTag, type ComboboxOption } from '@sim/emcn' +import { ChipTag, Combobox, type ComboboxOption } from '@sim/emcn' import { X } from '@sim/emcn/icons' import { useQueries } from '@tanstack/react-query' import { useParams } from 'next/navigation' @@ -211,7 +211,7 @@ export function KnowledgeBaseSelector({
)} - ({ {children} ), - ChipCombobox: ({ + Combobox: ({ options, value, placeholder, @@ -63,21 +63,6 @@ vi.mock('@sim/emcn', () => ({ ))}
), - ChipDropdown: ({ - options, - value, - placeholder, - }: { - options: Array<{ value: string; label: string }> - value?: string - placeholder?: string - }) => ( -
- {options.map((option) => ( - {option.label} - ))} -
- ), Label: ({ children }: { children?: React.ReactNode }) => {children}, Tooltip: { Root: ({ children }: { children?: React.ReactNode }) => <>{children}, diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/model-fallback-list/model-fallback-list.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/model-fallback-list/model-fallback-list.tsx index 6004ff79b96..6ddf80cb533 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/model-fallback-list/model-fallback-list.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/model-fallback-list/model-fallback-list.tsx @@ -1,15 +1,7 @@ 'use client' import { memo, useCallback, useEffect, useMemo, useRef } from 'react' -import { - Button, - Chip, - ChipCombobox, - ChipDropdown, - type ComboboxOption, - Label, - Tooltip, -} from '@sim/emcn' +import { Button, Chip, Combobox, type ComboboxOption, Label, Tooltip } from '@sim/emcn' import { ChevronDown, ChevronUp, Plus, Trash } from '@sim/emcn/icons' import { generateShortId } from '@sim/utils/id' import { useParams } from 'next/navigation' @@ -188,7 +180,7 @@ const FallbackRow = memo(function FallbackRow({
- onChangeModel(row.id, model)} @@ -203,7 +195,7 @@ const FallbackRow = memo(function FallbackRow({ {needsApiKey && (
- onChangeApiKey(row.id, apiKey)} @@ -220,7 +212,7 @@ const FallbackRow = memo(function FallbackRow({ {tuningFields.map(({ knob, options }) => (
- onChangeTuning(row.id, knob, value)} diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/workspace-folder-selector/workspace-folder-selector.test.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/workspace-folder-selector/workspace-folder-selector.test.tsx index a4ce92a823d..54d0fc6d600 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/workspace-folder-selector/workspace-folder-selector.test.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/workspace-folder-selector/workspace-folder-selector.test.tsx @@ -20,7 +20,7 @@ vi.mock('next/navigation', () => ({ })) vi.mock('@sim/emcn', () => ({ - ChipCombobox: ({ + Combobox: ({ options, disabled, isLoading, diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/workspace-folder-selector/workspace-folder-selector.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/workspace-folder-selector/workspace-folder-selector.tsx index 45e74f7074e..bf16b037dca 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/workspace-folder-selector/workspace-folder-selector.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/workspace-folder-selector/workspace-folder-selector.tsx @@ -1,7 +1,7 @@ 'use client' import { useMemo } from 'react' -import { ChipCombobox } from '@sim/emcn' +import { Combobox } from '@sim/emcn' import { useParams } from 'next/navigation' import type { FolderResourceType } from '@/lib/api/contracts/folders' import { parseFolderPath } from '@/lib/folders/paths' @@ -58,7 +58,7 @@ export function WorkspaceFolderSelector({ }, [folders, isPlaceholderData, required, subBlock.multiSelect, subBlock.placeholder]) return ( - { diff --git a/apps/sim/components/mcp/mcp-selectors.test.tsx b/apps/sim/components/mcp/mcp-selectors.test.tsx index 62536e82b35..9918083fcbb 100644 --- a/apps/sim/components/mcp/mcp-selectors.test.tsx +++ b/apps/sim/components/mcp/mcp-selectors.test.tsx @@ -1,11 +1,11 @@ /** @vitest-environment node */ import type { ComponentProps } from 'react' -import type { ChipCombobox } from '@sim/emcn' +import type { Combobox } from '@sim/emcn' import { renderToStaticMarkup } from 'react-dom/server' import { beforeEach, describe, expect, it, vi } from 'vitest' const mocks = vi.hoisted(() => ({ - combobox: vi.fn<(props: ComponentProps) => null>(() => null), + combobox: vi.fn<(props: ComponentProps) => null>(() => null), setValue: vi.fn(), longInput: vi.fn(() => null), shortInput: vi.fn(() => null), @@ -38,7 +38,7 @@ vi.mock('@/stores/workflow-diff/store', () => ({ }, }), })) -vi.mock('@sim/emcn', () => ({ ChipCombobox: mocks.combobox, Label: () => null })) +vi.mock('@sim/emcn', () => ({ Combobox: mocks.combobox, Label: () => null })) vi.mock( '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/long-input/long-input', () => ({ LongInput: mocks.longInput }) diff --git a/packages/emcn/src/components/combobox/combobox.dom.test.tsx b/packages/emcn/src/components/combobox/combobox.dom.test.tsx index f410e4a96ca..a722d3229f5 100644 --- a/packages/emcn/src/components/combobox/combobox.dom.test.tsx +++ b/packages/emcn/src/components/combobox/combobox.dom.test.tsx @@ -76,6 +76,22 @@ afterEach(() => { }) describe('Combobox onOpenChange', () => { + it('preserves trigger styling when an editable input adds padding for a clear button', () => { + render( + + ) + + const control = trigger() + expect(control.classList.contains('min-w-0')).toBe(true) + expect(control.classList.contains('pr-[60px]')).toBe(true) + expect(control.classList.contains('pr-10')).toBe(false) + }) + it.each([false, true])( 'puts the field name and validation ARIA on the interactive control (editable=%s)', (editable) => { diff --git a/packages/emcn/src/components/combobox/combobox.tsx b/packages/emcn/src/components/combobox/combobox.tsx index 39858f47f67..e77eeda0007 100644 --- a/packages/emcn/src/components/combobox/combobox.tsx +++ b/packages/emcn/src/components/combobox/combobox.tsx @@ -790,13 +790,6 @@ const Combobox = memo(