From 1524ec4a489640da99f7a59676aaad6e1d5fc77a Mon Sep 17 00:00:00 2001 From: Theodore Li Date: Mon, 13 Apr 2026 13:49:45 -0700 Subject: [PATCH 1/5] Auto-focus input boxes for modals and copilot --- .../home/components/user-input/user-input.tsx | 5 +- .../rename-document-modal.tsx | 1 - .../create-api-key-modal.tsx | 1 - .../deploy-modal/components/a2a/a2a.tsx | 15 +++++- .../deploy-modal/components/mcp/mcp.tsx | 1 + .../w/[workflowId]/components/panel/panel.tsx | 11 ++++ .../emcn/components/modal/auto-focus.ts | 52 +++++++++++++++++++ .../emcn/components/modal/modal.tsx | 4 +- .../emcn/components/s-modal/s-modal.tsx | 4 +- 9 files changed, 88 insertions(+), 6 deletions(-) create mode 100644 apps/sim/components/emcn/components/modal/auto-focus.ts diff --git a/apps/sim/app/workspace/[workspaceId]/home/components/user-input/user-input.tsx b/apps/sim/app/workspace/[workspaceId]/home/components/user-input/user-input.tsx index 981dc9d0e58..17ea0764d3a 100644 --- a/apps/sim/app/workspace/[workspaceId]/home/components/user-input/user-input.tsx +++ b/apps/sim/app/workspace/[workspaceId]/home/components/user-input/user-input.tsx @@ -361,6 +361,7 @@ export function UserInput({ } catch { // Invalid JSON — ignore } + textareaRef.current?.focus() return } const resourceJson = e.dataTransfer.getData(SIM_RESOURCE_DRAG_TYPE) @@ -374,11 +375,13 @@ export function UserInput({ } catch { // Invalid JSON — ignore } + textareaRef.current?.focus() return } filesRef.current.handleDrop(e) + requestAnimationFrame(() => textareaRef.current?.focus()) }, - [handleResourceSelect] + [handleResourceSelect, textareaRef] ) const handleDragEnter = useCallback((e: React.DragEvent) => { diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/rename-document-modal/rename-document-modal.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/rename-document-modal/rename-document-modal.tsx index 33144a19d23..5cd47d45af4 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/rename-document-modal/rename-document-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/rename-document-modal/rename-document-modal.tsx @@ -94,7 +94,6 @@ export function RenameDocumentModal({ placeholder='Enter document name' className={cn(error && 'border-[var(--text-error)]')} disabled={isSubmitting} - autoFocus maxLength={255} autoComplete='off' autoCorrect='off' diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/api-keys/components/create-api-key-modal/create-api-key-modal.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/api-keys/components/create-api-key-modal/create-api-key-modal.tsx index 5b6e32aa1c3..269c883ebb0 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/components/api-keys/components/create-api-key-modal/create-api-key-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/settings/components/api-keys/components/create-api-key-modal/create-api-key-modal.tsx @@ -168,7 +168,6 @@ export function CreateApiKeyModal({ }} placeholder='e.g., Development, Production' className='h-9' - autoFocus name='api_key_label' autoComplete='off' autoCorrect='off' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/a2a/a2a.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/a2a/a2a.tsx index a5864aea640..9672e995f4c 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/a2a/a2a.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/a2a/a2a.tsx @@ -1,6 +1,6 @@ 'use client' -import { useCallback, useEffect, useMemo, useState } from 'react' +import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { createLogger } from '@sim/logger' import { Check, Clipboard } from 'lucide-react' import { useParams } from 'next/navigation' @@ -195,8 +195,20 @@ export function A2aDeploy({ } }, [startBlockId, startBlockInputFormat, missingFields, collaborativeSetSubblockValue]) + const nameInputRef = useRef(null) const [name, setName] = useState('') const [description, setDescription] = useState('') + + useEffect(() => { + const id = window.setTimeout(() => { + const el = nameInputRef.current + if (!el) return + el.focus() + const end = el.value.length + el.setSelectionRange(end, end) + }, 0) + return () => window.clearTimeout(id) + }, []) const [authScheme, setAuthScheme] = useState('apiKey') const [pushNotificationsEnabled, setPushNotificationsEnabled] = useState(false) const [skillTags, setSkillTags] = useState([]) @@ -720,6 +732,7 @@ console.log(data);` setName(e.target.value)} placeholder='Enter agent name' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/mcp/mcp.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/mcp/mcp.tsx index ff08b13ca7c..b67882fffce 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/mcp/mcp.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/mcp/mcp.tsx @@ -523,6 +523,7 @@ export function McpDeploy({ Description