From 51b5d32ee4c40629144b4f25d9ba59abd1c880e6 Mon Sep 17 00:00:00 2001 From: waleed Date: Mon, 19 Jan 2026 20:04:36 -0800 Subject: [PATCH 1/6] improvement(modal): fixed popover issue in custom tools modal, removed the ability to update if no changes made --- .../components/deploy-modal/deploy-modal.tsx | 5 +- .../components/code-editor/code-editor.tsx | 6 +- .../custom-tool-modal/custom-tool-modal.tsx | 110 ++++++++++++++---- 3 files changed, 91 insertions(+), 30 deletions(-) diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/deploy-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/deploy-modal.tsx index fdaaefb54f..09138be70e 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/deploy-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/deploy-modal.tsx @@ -591,12 +591,11 @@ export function DeployModal({ )} {activeTab === 'api' && ( -
+
+
-
-
From 25fb12dc63ccd1caa91a2c6112be0da212aaf20e Mon Sep 17 00:00:00 2001 From: waleed Date: Mon, 19 Jan 2026 20:05:42 -0800 Subject: [PATCH 2/6] improvement(modal): fixed popover issue in custom tools modal, removed the ability to update if no changes made --- .../components/custom-tool-modal/custom-tool-modal.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/custom-tool-modal/custom-tool-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/custom-tool-modal/custom-tool-modal.tsx index 6c38fb9cb3..95bef73945 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/custom-tool-modal/custom-tool-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/custom-tool-modal/custom-tool-modal.tsx @@ -667,7 +667,6 @@ try { } } - // Global keyboard handler for schema params dropdown (like EnvVarDropdown) useEffect(() => { if (!showSchemaParams || schemaParameters.length === 0) return @@ -765,8 +764,6 @@ try { return case ' ': case 'Tab': - // Close dropdown but let the key event continue (don't prevent default) - // This allows the space/tab character to be typed normally setShowSchemaParams(false) break } From 95728e3309134402645534e212dbda61ad62f063 Mon Sep 17 00:00:00 2001 From: waleed Date: Mon, 19 Jan 2026 22:52:14 -0800 Subject: [PATCH 3/6] popover fixes, color picker keyboard nav, code simplification --- .../custom-tool-modal/custom-tool-modal.tsx | 189 +++--------------- .../components/context-menu/context-menu.tsx | 19 +- .../workspace-header/workspace-header.tsx | 1 + .../emcn/components/popover/popover.tsx | 7 + 4 files changed, 48 insertions(+), 168 deletions(-) diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/custom-tool-modal/custom-tool-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/custom-tool-modal/custom-tool-modal.tsx index 95bef73945..9af52410f0 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/custom-tool-modal/custom-tool-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/custom-tool-modal/custom-tool-modal.tsx @@ -331,31 +331,37 @@ try { onOpenChange(false) } - const validateJsonSchema = (schema: string): boolean => { - if (!schema) return false + const validateSchema = (schema: string): { isValid: boolean; error: string | null } => { + if (!schema) return { isValid: false, error: null } try { const parsed = JSON.parse(schema) if (!parsed.type || parsed.type !== 'function') { - return false + return { isValid: false, error: 'Missing "type": "function"' } } - if (!parsed.function || !parsed.function.name) { - return false + return { isValid: false, error: 'Missing function.name field' } } - if (!parsed.function.parameters) { - return false + return { isValid: false, error: 'Missing function.parameters object' } } - - if (!parsed.function.parameters.type || parsed.function.parameters.properties === undefined) { - return false + if (!parsed.function.parameters.type) { + return { isValid: false, error: 'Missing parameters.type field' } + } + if (parsed.function.parameters.properties === undefined) { + return { isValid: false, error: 'Missing parameters.properties field' } + } + if ( + typeof parsed.function.parameters.properties !== 'object' || + parsed.function.parameters.properties === null + ) { + return { isValid: false, error: 'parameters.properties must be an object' } } - return true - } catch (_error) { - return false + return { isValid: true, error: null } + } catch { + return { isValid: false, error: 'Invalid JSON format' } } } @@ -377,7 +383,7 @@ try { } }, [jsonSchema]) - const isSchemaValid = useMemo(() => validateJsonSchema(jsonSchema), [jsonSchema]) + const isSchemaValid = useMemo(() => validateSchema(jsonSchema).isValid, [jsonSchema]) const hasChanges = useMemo(() => { if (!isEditing) return true @@ -392,43 +398,9 @@ try { return } - const parsed = JSON.parse(jsonSchema) - - if (!parsed.type || parsed.type !== 'function') { - setSchemaError('Schema must have a "type" field set to "function"') - setActiveSection('schema') - return - } - - if (!parsed.function || !parsed.function.name) { - setSchemaError('Schema must have a "function" object with a "name" field') - setActiveSection('schema') - return - } - - if (!parsed.function.parameters) { - setSchemaError('Missing function.parameters object') - setActiveSection('schema') - return - } - - if (!parsed.function.parameters.type) { - setSchemaError('Missing parameters.type field') - setActiveSection('schema') - return - } - - if (parsed.function.parameters.properties === undefined) { - setSchemaError('Missing parameters.properties field') - setActiveSection('schema') - return - } - - if ( - typeof parsed.function.parameters.properties !== 'object' || - parsed.function.parameters.properties === null - ) { - setSchemaError('parameters.properties must be an object') + const { isValid, error } = validateSchema(jsonSchema) + if (!isValid) { + setSchemaError(error) setActiveSection('schema') return } @@ -512,46 +484,8 @@ try { setJsonSchema(value) if (value.trim()) { - try { - const parsed = JSON.parse(value) - - if (!parsed.type || parsed.type !== 'function') { - setSchemaError('Missing "type": "function"') - return - } - - if (!parsed.function || !parsed.function.name) { - setSchemaError('Missing function.name field') - return - } - - if (!parsed.function.parameters) { - setSchemaError('Missing function.parameters object') - return - } - - if (!parsed.function.parameters.type) { - setSchemaError('Missing parameters.type field') - return - } - - if (parsed.function.parameters.properties === undefined) { - setSchemaError('Missing parameters.properties field') - return - } - - if ( - typeof parsed.function.parameters.properties !== 'object' || - parsed.function.parameters.properties === null - ) { - setSchemaError('parameters.properties must be an object') - return - } - - setSchemaError(null) - } catch { - setSchemaError('Invalid JSON format') - } + const { error } = validateSchema(value) + setSchemaError(error) } else { setSchemaError(null) } @@ -667,40 +601,6 @@ try { } } - useEffect(() => { - if (!showSchemaParams || schemaParameters.length === 0) return - - const handleKeyboardEvent = (e: KeyboardEvent) => { - switch (e.key) { - case 'ArrowDown': - e.preventDefault() - e.stopPropagation() - setSchemaParamSelectedIndex((prev) => Math.min(prev + 1, schemaParameters.length - 1)) - break - case 'ArrowUp': - e.preventDefault() - e.stopPropagation() - setSchemaParamSelectedIndex((prev) => Math.max(prev - 1, 0)) - break - case 'Enter': - e.preventDefault() - e.stopPropagation() - if (schemaParamSelectedIndex >= 0 && schemaParamSelectedIndex < schemaParameters.length) { - handleSchemaParamSelect(schemaParameters[schemaParamSelectedIndex].name) - } - break - case 'Escape': - e.preventDefault() - e.stopPropagation() - setShowSchemaParams(false) - break - } - } - - window.addEventListener('keydown', handleKeyboardEvent, true) - return () => window.removeEventListener('keydown', handleKeyboardEvent, true) - }, [showSchemaParams, schemaParamSelectedIndex, schemaParameters]) - const handleKeyDown = (e: React.KeyboardEvent) => { const isSchemaPromptVisible = activeSection === 'schema' && schemaGeneration.isPromptVisible const isCodePromptVisible = activeSection === 'code' && codeGeneration.isPromptVisible @@ -765,7 +665,7 @@ try { case ' ': case 'Tab': setShowSchemaParams(false) - break + return } } @@ -882,18 +782,7 @@ try { return ( <> - { - if (e.key === 'Escape' && (showEnvVars || showTags || showSchemaParams)) { - e.preventDefault() - e.stopPropagation() - setShowEnvVars(false) - setShowTags(false) - setShowSchemaParams(false) - } - }} - > + {isEditing ? 'Edit Agent Tool' : 'Create Agent Tool'} e.preventDefault()} onCloseAutoFocus={(e) => e.preventDefault()} - onKeyDown={(e) => { - if (e.key === 'ArrowDown') { - e.preventDefault() - setSchemaParamSelectedIndex((prev) => - Math.min(prev + 1, schemaParameters.length - 1) - ) - } else if (e.key === 'ArrowUp') { - e.preventDefault() - setSchemaParamSelectedIndex((prev) => Math.max(prev - 1, 0)) - } else if (e.key === 'Enter') { - e.preventDefault() - if ( - schemaParamSelectedIndex >= 0 && - schemaParamSelectedIndex < schemaParameters.length - ) { - handleSchemaParamSelect( - schemaParameters[schemaParamSelectedIndex].name - ) - } - } else if (e.key === 'Escape') { - e.preventDefault() - setShowSchemaParams(false) - } - }} > Available Parameters diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workflow-list/components/context-menu/context-menu.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workflow-list/components/context-menu/context-menu.tsx index b03138de55..fc42e749d0 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workflow-list/components/context-menu/context-menu.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workflow-list/components/context-menu/context-menu.tsx @@ -25,9 +25,11 @@ const GRID_COLUMNS = 6 function ColorGrid({ hexInput, setHexInput, + onColorChange, }: { hexInput: string setHexInput: (color: string) => void + onColorChange?: (color: string) => void }) { const { isInFolder } = usePopoverContext() const [focusedIndex, setFocusedIndex] = useState(-1) @@ -72,7 +74,8 @@ function ColorGrid({ case 'Enter': case ' ': e.preventDefault() - setHexInput(WORKFLOW_COLORS[index].color) + e.stopPropagation() + onColorChange?.(WORKFLOW_COLORS[index].color) return default: return @@ -83,7 +86,7 @@ function ColorGrid({ buttonRefs.current[newIndex]?.focus() } }, - [setHexInput] + [onColorChange] ) return ( @@ -100,13 +103,13 @@ function ColorGrid({ tabIndex={focusedIndex === index ? 0 : -1} onClick={(e) => { e.stopPropagation() - setHexInput(color) + onColorChange?.(color) }} onKeyDown={(e) => handleKeyDown(e, index)} onFocus={() => setFocusedIndex(index)} className={cn( - 'h-[20px] w-[20px] rounded-[4px] focus:outline-none focus:ring-2 focus:ring-white focus:ring-offset-1 focus:ring-offset-[#1b1b1b]', - hexInput.toLowerCase() === color.toLowerCase() && 'ring-1 ring-white' + 'h-[20px] w-[20px] rounded-[4px] outline-none ring-white ring-offset-0', + focusedIndex === index && 'ring-[1.5px]' )} style={{ backgroundColor: color }} /> @@ -450,7 +453,11 @@ export function ContextMenu({ >
{/* Preset colors with keyboard navigation */} - + {/* Hex input */}
diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workspace-header/workspace-header.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workspace-header/workspace-header.tsx index 5c7dbbdad3..2896e18d02 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workspace-header/workspace-header.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workspace-header/workspace-header.tsx @@ -459,6 +459,7 @@ export function WorkspaceHeader({ value={editingName} onChange={(e) => setEditingName(e.target.value)} onKeyDown={async (e) => { + e.stopPropagation() if (e.key === 'Enter') { e.preventDefault() setIsListRenaming(true) diff --git a/apps/sim/components/emcn/components/popover/popover.tsx b/apps/sim/components/emcn/components/popover/popover.tsx index 764c1f5ae0..8c455bae6e 100644 --- a/apps/sim/components/emcn/components/popover/popover.tsx +++ b/apps/sim/components/emcn/components/popover/popover.tsx @@ -460,6 +460,13 @@ const PopoverContent = React.forwardRef< const content = contentRef.current if (!content) return + const activeElement = document.activeElement + const isInputFocused = + activeElement instanceof HTMLInputElement || + activeElement instanceof HTMLTextAreaElement || + activeElement?.getAttribute('contenteditable') === 'true' + if (isInputFocused) return + const items = content.querySelectorAll( '[role="menuitem"]:not([aria-disabled="true"])' ) From fa748bb6af6885aa6cd6ecb63311adfa48b5cba1 Mon Sep 17 00:00:00 2001 From: waleed Date: Mon, 19 Jan 2026 23:09:52 -0800 Subject: [PATCH 4/6] color standardization --- .../base-tags-modal/base-tags-modal.tsx | 4 +- .../components/general/general.tsx | 2 +- .../custom-tool-modal/custom-tool-modal.tsx | 49 ++++++++++++++++++- .../access-control/access-control.tsx | 2 +- .../create-api-key-modal.tsx | 4 +- .../settings-modal/components/byok/byok.tsx | 4 +- .../components/copilot/copilot.tsx | 4 +- .../components/environment/environment.tsx | 2 +- .../components/general/general.tsx | 2 +- .../components/team-seats/team-seats.tsx | 2 +- 10 files changed, 61 insertions(+), 14 deletions(-) diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/base-tags-modal/base-tags-modal.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/base-tags-modal/base-tags-modal.tsx index 80dafafcf7..282a85622b 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/base-tags-modal/base-tags-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/base-tags-modal/base-tags-modal.tsx @@ -462,7 +462,7 @@ export function BaseTagsModal({ open, onOpenChange, knowledgeBaseId }: BaseTagsM Documents using "{selectedTag?.displayName}"
-

+

{selectedTagUsage?.documentCount || 0} document {selectedTagUsage?.documentCount !== 1 ? 's are' : ' is'} currently using this tag definition. @@ -470,7 +470,7 @@ export function BaseTagsModal({ open, onOpenChange, knowledgeBaseId }: BaseTagsM {selectedTagUsage?.documentCount === 0 ? (

-

+

This tag definition is not being used by any documents. You can safely delete it to free up the tag slot.

diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/general/general.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/general/general.tsx index 218e032f1e..28e66c2c43 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/general/general.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/general/general.tsx @@ -283,7 +283,7 @@ export function GeneralDeploy({ Promote to live -

+

Are you sure you want to promote{' '} {versionToPromoteInfo?.name || `v${versionToPromote}`} diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/custom-tool-modal/custom-tool-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/custom-tool-modal/custom-tool-modal.tsx index 9af52410f0..9045fe26fd 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/custom-tool-modal/custom-tool-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/custom-tool-modal/custom-tool-modal.tsx @@ -90,6 +90,7 @@ export function CustomToolModal({ const [initialJsonSchema, setInitialJsonSchema] = useState('') const [initialFunctionCode, setInitialFunctionCode] = useState('') const [showDeleteConfirm, setShowDeleteConfirm] = useState(false) + const [showDiscardAlert, setShowDiscardAlert] = useState(false) const [isSchemaPromptActive, setIsSchemaPromptActive] = useState(false) const [schemaPromptInput, setSchemaPromptInput] = useState('') const schemaPromptInputRef = useRef(null) @@ -174,6 +175,9 @@ Example 2: generationType: 'custom-tool-schema', }, currentValue: jsonSchema, + onStreamStart: () => { + setJsonSchema('') + }, onGeneratedContent: (content) => { setJsonSchema(content) setSchemaError(null) @@ -237,6 +241,9 @@ try { generationType: 'javascript-function-body', }, currentValue: functionCode, + onStreamStart: () => { + setFunctionCode('') + }, onGeneratedContent: (content) => { handleFunctionCodeChange(content) setCodeError(null) @@ -390,6 +397,26 @@ try { return jsonSchema !== initialJsonSchema || functionCode !== initialFunctionCode }, [isEditing, jsonSchema, initialJsonSchema, functionCode, initialFunctionCode]) + const hasUnsavedChanges = useMemo(() => { + if (isEditing) { + return jsonSchema !== initialJsonSchema || functionCode !== initialFunctionCode + } + return jsonSchema.trim().length > 0 || functionCode.trim().length > 0 + }, [isEditing, jsonSchema, initialJsonSchema, functionCode, initialFunctionCode]) + + const handleCloseAttempt = () => { + if (hasUnsavedChanges && !schemaGeneration.isStreaming && !codeGeneration.isStreaming) { + setShowDiscardAlert(true) + } else { + handleClose() + } + } + + const handleConfirmDiscard = () => { + setShowDiscardAlert(false) + handleClose() + } + const handleSave = async () => { try { if (!jsonSchema) { @@ -781,7 +808,7 @@ try { return ( <> - + {isEditing ? 'Edit Agent Tool' : 'Create Agent Tool'} @@ -1172,6 +1199,26 @@ try { + + + + Unsaved Changes + +

+ You have unsaved changes to this tool. Are you sure you want to discard your changes + and close the editor? +

+
+ + + + +
+ ) } diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/access-control/access-control.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/access-control/access-control.tsx index 067db3cc9d..9b3fd8a02f 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/access-control/access-control.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/access-control/access-control.tsx @@ -1072,7 +1072,7 @@ export function AccessControl() { Unsaved Changes -

+

You have unsaved changes. Do you want to save them before closing?

diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/api-keys/components/create-api-key-modal/create-api-key-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/api-keys/components/create-api-key-modal/create-api-key-modal.tsx index 14fec1b657..439280bf25 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/api-keys/components/create-api-key-modal/create-api-key-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/api-keys/components/create-api-key-modal/create-api-key-modal.tsx @@ -115,7 +115,7 @@ export function CreateApiKeyModal({ Create new API key -

+

{keyType === 'workspace' ? "This key will have access to all workflows in this workspace. Make sure to copy it after creation as you won't be able to see it again." : "This key will have access to your personal workflows. Make sure to copy it after creation as you won't be able to see it again."} @@ -218,7 +218,7 @@ export function CreateApiKeyModal({ Your API key has been created -

+

This is the only time you will see your API key.{' '} Copy it now and store it securely. diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/byok/byok.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/byok/byok.tsx index 449c3bb44a..b8304402b3 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/byok/byok.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/byok/byok.tsx @@ -222,7 +222,7 @@ export function BYOK() { )} -

+

This key will be used for all {PROVIDERS.find((p) => p.id === editingProvider)?.name}{' '} requests in this workspace. Your key is encrypted and stored securely.

@@ -308,7 +308,7 @@ export function BYOK() { Delete API Key -

+

Are you sure you want to delete the{' '} {PROVIDERS.find((p) => p.id === deleteConfirmProvider)?.name} diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/copilot/copilot.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/copilot/copilot.tsx index e2d85bca6c..5d160762b3 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/copilot/copilot.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/copilot/copilot.tsx @@ -214,7 +214,7 @@ export function Copilot() { Create new API key -

+

This key will allow access to Copilot features. Make sure to copy it after creation as you won't be able to see it again.

@@ -276,7 +276,7 @@ export function Copilot() { Your API key has been created -

+

This is the only time you will see your API key.{' '} Copy it now and store it securely. diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/environment/environment.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/environment/environment.tsx index 7f22ca3969..026d646cad 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/environment/environment.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/environment/environment.tsx @@ -824,7 +824,7 @@ export function EnvironmentVariables({ registerBeforeLeaveHandler }: Environment Unsaved Changes -

+

{hasConflicts || hasInvalidKeys ? `You have unsaved changes, but ${hasConflicts ? 'conflicts must be resolved' : 'invalid variable names must be fixed'} before saving. You can discard your changes to close the modal.` : 'You have unsaved changes. Do you want to save them before closing?'} diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/general/general.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/general/general.tsx index 6fbda0207c..7ab1d0737e 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/general/general.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/general/general.tsx @@ -603,7 +603,7 @@ export function General({ onOpenChange }: GeneralProps) { Reset Password -

+

A password reset link will be sent to{' '} {profile?.email}. Click the link in the email to create a new password. diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/team-management/components/team-seats/team-seats.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/team-management/components/team-seats/team-seats.tsx index 82418420ee..af4a52f9d4 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/team-management/components/team-seats/team-seats.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/team-management/components/team-seats/team-seats.tsx @@ -64,7 +64,7 @@ export function TeamSeats({ {title} -

{description}

+

{description}