From 9624590b33fe395390e6916c3f9d7c1d3a26da6f Mon Sep 17 00:00:00 2001 From: Emir Karabeg Date: Tue, 18 Nov 2025 19:40:32 -0800 Subject: [PATCH 01/17] feat: aligned current unassigned hex to old globals --- .../components/icons/document-icons.tsx | 2 +- .../components/dashboard/workflow-details.tsx | 6 +++--- .../app/workspace/[workspaceId]/logs/logs.tsx | 4 ++-- .../templates/components/template-card.tsx | 16 ++++++++++++---- .../components/thinking-block.tsx | 2 +- .../inline-tool-call/inline-tool-call.tsx | 2 +- .../components/mention-menu/mention-menu.tsx | 8 ++++++-- .../connection-blocks/connection-blocks.tsx | 2 +- .../components/subflow-editor/subflow-editor.tsx | 2 +- .../panel/components/editor/editor.tsx | 2 +- .../toolbar/components/drag-preview.ts | 2 +- .../components/subflows/subflow-node.tsx | 2 +- .../components/terminal/terminal.tsx | 10 +++++++--- .../components/workflow-block/workflow-block.tsx | 10 +++++----- .../w/[workflowId]/utils/block-ring-utils.ts | 2 +- .../[workspaceId]/w/[workflowId]/workflow.tsx | 2 +- .../components/shared/usage-header.tsx | 16 +++++++++++----- .../team-seats-overview/team-seats-overview.tsx | 8 ++++---- .../components/team-usage/team-usage.tsx | 2 +- .../workflow-preview/workflow-preview.tsx | 2 +- 20 files changed, 62 insertions(+), 40 deletions(-) diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/components/icons/document-icons.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/components/icons/document-icons.tsx index dbbfe9840b2..161dff21928 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/components/icons/document-icons.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/components/icons/document-icons.tsx @@ -125,7 +125,7 @@ export const TxtIcon: React.FC = ({ className = 'w-6 h-6' }) => ( {hasDuration && ( @@ -467,12 +467,12 @@ export function WorkflowDetails({
{statusLabel} diff --git a/apps/sim/app/workspace/[workspaceId]/logs/logs.tsx b/apps/sim/app/workspace/[workspaceId]/logs/logs.tsx index b8ef9d1a80e..c35afcdc836 100644 --- a/apps/sim/app/workspace/[workspaceId]/logs/logs.tsx +++ b/apps/sim/app/workspace/[workspaceId]/logs/logs.tsx @@ -483,12 +483,12 @@ export default function Logs() {
{statusLabel} diff --git a/apps/sim/app/workspace/[workspaceId]/templates/components/template-card.tsx b/apps/sim/app/workspace/[workspaceId]/templates/components/template-card.tsx index 1e15ddcfa88..48f3fd3c04a 100644 --- a/apps/sim/app/workspace/[workspaceId]/templates/components/template-card.tsx +++ b/apps/sim/app/workspace/[workspaceId]/templates/components/template-card.tsx @@ -27,7 +27,12 @@ interface TemplateCardProps { export function TemplateCardSkeleton({ className }: { className?: string }) { return ( -
+
@@ -196,7 +201,10 @@ function TemplateCardInner({ return (
+{blockTypes.length - 3} @@ -277,7 +285,7 @@ function TemplateCardInner({ {author}
) : ( -
+
)} diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/copilot-message/components/thinking-block.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/copilot-message/components/thinking-block.tsx index 508cf399167..92bc338c8b5 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/copilot-message/components/thinking-block.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/copilot-message/components/thinking-block.tsx @@ -37,7 +37,7 @@ function ShimmerOverlayText({ label, value, active = false }: ShimmerOverlayText return ( {label} - {value} + {value} {active ? (
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/editor.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/editor.tsx index d04231859bb..2ddb9c4d43e 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/editor.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/editor.tsx @@ -363,7 +363,7 @@ export function Editor() { className='h-[1.25px]' style={{ backgroundImage: - 'repeating-linear-gradient(to right, #2C2C2C 0px, #2C2C2C 6px, transparent 6px, transparent 12px)', + 'repeating-linear-gradient(to right, var(--border) 0px, var(--border) 6px, transparent 6px, transparent 12px)', }} />
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/toolbar/components/drag-preview.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/toolbar/components/drag-preview.ts index e09e765b461..1ea9bf4e86a 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/toolbar/components/drag-preview.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/toolbar/components/drag-preview.ts @@ -18,7 +18,7 @@ export function createDragPreview(info: DragItemInfo): HTMLElement { const preview = document.createElement('div') preview.style.cssText = ` width: 250px; - background: #232323; + background: var(--surface-1); border-radius: 8px; padding: 8px 9px; display: flex; diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/subflows/subflow-node.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/subflows/subflow-node.tsx index 3df3d38a364..b2ab645ffe5 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/subflows/subflow-node.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/subflows/subflow-node.tsx @@ -25,7 +25,7 @@ const SubflowNodeStyles: React.FC = () => { /* Drag-over states */ .loop-node-drag-over, .parallel-node-drag-over { - box-shadow: 0 0 0 1.75px #33B4FF !important; + box-shadow: 0 0 0 1.75px var(--brand-secondary) !important; border-radius: 8px !important; } diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/terminal/terminal.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/terminal/terminal.tsx index 0a11ad7b1a1..81e4b38da97 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/terminal/terminal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/terminal/terminal.tsx @@ -827,7 +827,7 @@ export function Terminal() { >
Error {filters.statuses.has('error') && } @@ -1086,12 +1086,16 @@ export function Terminal() {
{statusInfo.label} diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/workflow-block.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/workflow-block.tsx index 1d7eb9963da..afabba5bdfb 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/workflow-block.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/workflow-block.tsx @@ -874,8 +874,8 @@ export const WorkflowBlock = memo(function WorkflowBlock({ variant='outline' className='cursor-pointer' style={{ - borderColor: !childIsDeployed ? '#EF4444' : '#FF6600', - color: !childIsDeployed ? '#EF4444' : '#FF6600', + borderColor: !childIsDeployed ? 'var(--text-error)' : 'var(--warning)', + color: !childIsDeployed ? 'var(--text-error)' : 'var(--warning)', }} onClick={(e) => { e.stopPropagation() @@ -903,8 +903,8 @@ export const WorkflowBlock = memo(function WorkflowBlock({ variant='outline' className='cursor-pointer' style={{ - borderColor: '#FF6600', - color: '#FF6600', + borderColor: 'var(--warning)', + color: 'var(--warning)', }} onClick={(e) => { e.stopPropagation() @@ -957,7 +957,7 @@ export const WorkflowBlock = memo(function WorkflowBlock({ { e.stopPropagation() reactivateWebhook(webhookId) diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/utils/block-ring-utils.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/utils/block-ring-utils.ts index 8b6cc5f1f44..1b532c694fb 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/utils/block-ring-utils.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/utils/block-ring-utils.ts @@ -49,7 +49,7 @@ export function getBlockRingStyles(options: BlockRingOptions): { !isFocused && !isDeletedBlock && diffStatus === 'new' && - 'ring-[#22C55E]', + 'ring-[var(--brand-tertiary)]', !isActive && !isPending && !isFocused && diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/workflow.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/workflow.tsx index 13fc26e11e9..ca2d8a1d656 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/workflow.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/workflow.tsx @@ -308,7 +308,7 @@ const WorkflowContent = React.memo(() => { */ const connectionLineStyle = useMemo(() => { return { - stroke: isErrorConnectionDrag ? '#EF4444' : '#434343', + stroke: isErrorConnectionDrag ? 'var(--text-error)' : 'var(--surface-12)', strokeWidth: 2, } }, [isErrorConnectionDrag]) diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/shared/usage-header.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/shared/usage-header.tsx index 062a978fbdb..371395d6c4d 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/shared/usage-header.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/shared/usage-header.tsx @@ -74,15 +74,17 @@ export function UsageHeader({
{isBlocked ? ( - Payment required + + Payment required + ) : ( <> - + ${current.toFixed(2)} - / + / {rightContent ?? ( - + ${limit} )} @@ -100,7 +102,11 @@ export function UsageHeader({ key={i} className='h-[6px] flex-1 rounded-[2px]' style={{ - backgroundColor: isFilled ? (isAlmostOut ? '#ef4444' : '#34B5FF') : '#414141', + backgroundColor: isFilled + ? isAlmostOut + ? 'var(--text-error)' + : '#34B5FF' + : '#414141', }} /> ) diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-seats-overview/team-seats-overview.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-seats-overview/team-seats-overview.tsx index 7240f9797ad..8756dc5b1bf 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-seats-overview/team-seats-overview.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-seats-overview/team-seats-overview.tsx @@ -109,11 +109,11 @@ export function TeamSeatsOverview({ )}
- + {usedSeats} used - / - + / + {totalSeats} total
@@ -128,7 +128,7 @@ export function TeamSeatsOverview({ key={i} className={cn( 'h-[6px] flex-1 rounded-full transition-colors', - isFilled ? 'bg-[#34B5FF]' : 'bg-[#2C2C2C]' + isFilled ? 'bg-[#34B5FF]' : 'bg-[var(--border)]' )} /> ) diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-usage/team-usage.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-usage/team-usage.tsx index 8db05bf9e20..e9abb0593f9 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-usage/team-usage.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-usage/team-usage.tsx @@ -126,7 +126,7 @@ export function TeamUsage({ hasAdminAccess }: TeamUsageProps) { organizationId={activeOrg.id} /> ) : ( - + ${currentCap.toFixed(0)} ) diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview.tsx index 32b605f440f..951fe15b693 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview.tsx @@ -329,7 +329,7 @@ export function WorkflowPreview({ return ( -
+
Date: Fri, 21 Nov 2025 18:00:05 -0800 Subject: [PATCH 02/17] feat: emcn modal, help-modal; improvement(ui): emcn textarea, emcn combobox, messages-input --- .../messages-input/messages-input.tsx | 11 +- .../components-new/help-modal/help-modal.tsx | 358 +++++++----------- .../emcn/components/combobox/combobox.tsx | 71 ++-- .../emcn/components/modal-new/modal.tsx | 329 ++++++++++++++++ .../emcn/components/textarea/textarea.tsx | 2 +- 5 files changed, 516 insertions(+), 255 deletions(-) create mode 100644 apps/sim/components/emcn/components/modal-new/modal.tsx diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/messages-input/messages-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/messages-input/messages-input.tsx index 33a4d64cb0b..4d130188071 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/messages-input/messages-input.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/messages-input/messages-input.tsx @@ -12,6 +12,7 @@ import { useAccessibleReferencePrefixes } from '@/app/workspace/[workspaceId]/w/ import type { SubBlockConfig } from '@/blocks/types' const MIN_TEXTAREA_HEIGHT_PX = 80 +const MAX_TEXTAREA_HEIGHT_PX = 320 /** * Interface for individual message in the messages array @@ -236,10 +237,12 @@ export function MessagesInput({ return } - // Auto-resize to fit content only when user hasn't manually resized. textarea.style.height = 'auto' const naturalHeight = textarea.scrollHeight || MIN_TEXTAREA_HEIGHT_PX - const nextHeight = Math.max(MIN_TEXTAREA_HEIGHT_PX, naturalHeight) + const nextHeight = Math.min( + MAX_TEXTAREA_HEIGHT_PX, + Math.max(MIN_TEXTAREA_HEIGHT_PX, naturalHeight) + ) textarea.style.height = `${nextHeight}px` if (overlay) { @@ -453,7 +456,7 @@ export function MessagesInput({ ref={(el) => { textareaRefs.current[fieldId] = el }} - className='allow-scroll box-border min-h-[80px] w-full resize-none whitespace-pre-wrap break-words border-none bg-transparent px-[8px] py-[8px] font-[inherit] font-medium text-sm text-transparent leading-[inherit] caret-[var(--text-primary)] outline-none placeholder:text-[var(--text-muted)] focus:outline-none focus-visible:outline-none disabled:cursor-not-allowed' + className='allow-scroll box-border min-h-[80px] w-full resize-none whitespace-pre-wrap break-words border-none bg-transparent px-[8px] pt-[8px] font-[inherit] font-medium text-sm text-transparent leading-[inherit] caret-[var(--text-primary)] outline-none placeholder:text-[var(--text-muted)] focus:outline-none focus-visible:outline-none disabled:cursor-not-allowed' rows={3} placeholder='Enter message content...' value={message.content} @@ -496,7 +499,7 @@ export function MessagesInput({ ref={(el) => { overlayRefs.current[fieldId] = el }} - className='pointer-events-none absolute top-0 left-0 box-border w-full overflow-auto whitespace-pre-wrap break-words border-none bg-transparent px-[8px] py-[8px] font-[inherit] font-medium text-[var(--text-primary)] text-sm leading-[inherit]' + className='scrollbar-none pointer-events-none absolute top-0 left-0 box-border w-full overflow-auto whitespace-pre-wrap break-words border-none bg-transparent px-[8px] pt-[8px] font-[inherit] font-medium text-[var(--text-primary)] text-sm leading-[inherit]' > {formatDisplayText(message.content, { accessiblePrefixes, diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/help-modal/help-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/help-modal/help-modal.tsx index e29dcc4022a..fc745796fa7 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/help-modal/help-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/help-modal/help-modal.tsx @@ -7,15 +7,14 @@ import { Loader2, X } from 'lucide-react' import Image from 'next/image' import { useForm } from 'react-hook-form' import { z } from 'zod' +import { Button, Combobox, Input, Textarea } from '@/components/emcn' import { - Button, - Combobox, - Input, Modal, + ModalBody, ModalContent, - ModalTitle, - Textarea, -} from '@/components/emcn' + ModalFooter, + ModalHeader, +} from '@/components/emcn/components/modal-new/modal' import { Label } from '@/components/ui/label' import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' @@ -60,13 +59,10 @@ interface HelpModalProps { export function HelpModal({ open, onOpenChange }: HelpModalProps) { const fileInputRef = useRef(null) const scrollContainerRef = useRef(null) - const dropZoneRef = useRef(null) const [isSubmitting, setIsSubmitting] = useState(false) const [submitStatus, setSubmitStatus] = useState<'success' | 'error' | null>(null) - const [errorMessage, setErrorMessage] = useState('') const [images, setImages] = useState([]) - const [imageError, setImageError] = useState(null) const [isProcessing, setIsProcessing] = useState(false) const [isDragging, setIsDragging] = useState(false) @@ -93,8 +89,6 @@ export function HelpModal({ open, onOpenChange }: HelpModalProps) { useEffect(() => { if (open) { setSubmitStatus(null) - setErrorMessage('') - setImageError(null) setImages([]) setIsDragging(false) setIsProcessing(false) @@ -262,8 +256,6 @@ export function HelpModal({ open, onOpenChange }: HelpModalProps) { */ const processFiles = useCallback( async (files: FileList | File[]) => { - setImageError(null) - if (!files || files.length === 0) return setIsProcessing(true) @@ -275,16 +267,12 @@ export function HelpModal({ open, onOpenChange }: HelpModalProps) { for (const file of Array.from(files)) { // Validate file size if (file.size > MAX_FILE_SIZE) { - setImageError(`File ${file.name} is too large. Maximum size is 20MB.`) hasError = true continue } // Validate file type if (!ACCEPTED_IMAGE_TYPES.includes(file.type)) { - setImageError( - `File ${file.name} has an unsupported format. Please use JPEG, PNG, WebP, or GIF.` - ) hasError = true continue } @@ -303,7 +291,6 @@ export function HelpModal({ open, onOpenChange }: HelpModalProps) { } } catch (error) { logger.error('Error processing images:', { error }) - setImageError('An error occurred while processing images. Please try again.') } finally { setIsProcessing(false) @@ -378,7 +365,6 @@ export function HelpModal({ open, onOpenChange }: HelpModalProps) { async (data: FormValues) => { setIsSubmitting(true) setSubmitStatus(null) - setErrorMessage('') try { // Prepare form data with images @@ -413,7 +399,6 @@ export function HelpModal({ open, onOpenChange }: HelpModalProps) { } catch (error) { logger.error('Error submitting help request:', { error }) setSubmitStatus('error') - setErrorMessage(error instanceof Error ? error.message : 'An unknown error occurred') } finally { setIsSubmitting(false) } @@ -430,213 +415,156 @@ export function HelpModal({ open, onOpenChange }: HelpModalProps) { return ( - - {/* Modal Header */} -
- - Help & Support - -
- - {/* Modal Body */} -
-
- {/* Scrollable Form Content */} -
-
-
- {/* Request Type Field */} -
- - setValue('type', value as FormValues['type'])} - placeholder='Select a request type' - editable={false} - filterOptions={false} - className={cn( - errors.type && 'border-[var(--text-error)] dark:border-[var(--text-error)]' - )} - /> - {errors.type && ( -

- {errors.type.message} -

+ + Help & Support + + + +
+
+
+ + setValue('type', value as FormValues['type'])} + placeholder='Select a request type' + editable={false} + filterOptions={false} + className={cn( + errors.type && 'border-[var(--text-error)] dark:border-[var(--text-error)]' )} -
+ /> +
- {/* Subject Field */} -
- - - {errors.subject && ( -

- {errors.subject.message} -

+
+ + + /> +
- {/* Message Field */} -
- -