@notmrabhi/flowforge 0.1.106 → 0.1.108

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GatewayBranchEdge-C023FhhW.js","sources":["../src/WorkflowCanvas/WorkflowCanvasContext.ts","../src/WorkflowCanvas/nodes/StartNode.tsx","../src/WorkflowCanvas/nodes/EndNode.tsx","../src/WorkflowCanvas/nodes/AddTriggerNode.tsx","../src/WorkflowCanvas/nodes/AddStepNode.tsx","../src/WorkflowCanvas/nodes/NodeBody.tsx","../src/WorkflowCanvas/nodes/TriggerNode.tsx","../src/WorkflowCanvas/nodes/EventNode.tsx","../src/WorkflowCanvas/nodes/BranchRailDecoration.tsx","../src/WorkflowCanvas/nodes/FilterNode.tsx","../src/WorkflowCanvas/nodes/ActionNode.tsx","../src/WorkflowCanvas/nodes/ApprovalNode.tsx","../src/WorkflowCanvas/nodes/DelayNode.tsx","../src/WorkflowCanvas/nodes/NotificationNode.tsx","../src/WorkflowCanvas/nodes/WebhookTriggerNode.tsx","../src/WorkflowCanvas/nodes/RestApiNode.tsx","../src/WorkflowCanvas/nodes/ConditionBranchNode.tsx","../src/WorkflowCanvas/nodes/SubWorkflowNode.tsx","../src/WorkflowCanvas/nodes/index.ts","../src/WorkflowCanvas/edges/EdgeWithPlusLabel.tsx","../src/WorkflowCanvas/edges/PlusEdge.tsx","../src/WorkflowCanvas/edges/PlainEdge.tsx","../src/WorkflowCanvas/edges/LabelPlusEdge.tsx","../src/WorkflowCanvas/edges/GatewayBranchEdge.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\r\nimport { defaultFlowForgeMessages } from './messages';\r\nimport { FlowForgeMessages, WorkflowTemplate } from './types';\r\nimport type { NodeTypeRegistry } from '../nodeRegistry';\r\n\r\nexport interface CanvasHandlers {\r\n onEditNode: (slotId: string) => void;\r\n onDeleteNode: (slotId: string) => void;\r\n onAddStep: (afterSlotId: string) => void;\r\n onClickAddTrigger: () => void;\r\n messages: FlowForgeMessages;\r\n nodeRegistry: NodeTypeRegistry | null;\r\n /** How much of a node's data to show on its card. Default: 'full'. */\r\n nodeBody?: 'full' | 'title-only';\r\n /** The currently active template (derived from the trigger slot). */\r\n activeTemplate?: WorkflowTemplate | null;\r\n}\r\n\r\nexport const WorkflowCanvasContext = createContext<CanvasHandlers>({\r\n onEditNode: () => {},\r\n onDeleteNode: () => {},\r\n onAddStep: () => {},\r\n onClickAddTrigger: () => {},\r\n messages: defaultFlowForgeMessages,\r\n nodeRegistry: null,\r\n nodeBody: 'full',\r\n activeTemplate: null,\r\n});\r\n\r\nexport const useCanvasHandlers = () => useContext(WorkflowCanvasContext);\r\n","import React from 'react';\r\nimport { Handle, Position } from 'reactflow';\r\n\r\nconst StartNode = () => (\r\n <div style={{ width: 350, display: 'flex', justifyContent: 'center' }}>\r\n <Handle type=\"source\" position={Position.Bottom} style={{ opacity: 0, left: '50%' }} />\r\n <div style={{ padding: '8px 28px', borderRadius: 999, background: '#f5f5f5', border: '1.5px solid #bdbdbd', fontSize: 13, fontWeight: 500, color: '#424242', userSelect: 'none' }}>\r\n Start\r\n </div>\r\n </div>\r\n);\r\n\r\nexport default StartNode;\r\n","import React from 'react';\r\nimport { Handle, Position } from 'reactflow';\r\n\r\nconst EndNode = () => (\r\n <div style={{ width: 350, display: 'flex', justifyContent: 'center' }}>\r\n <Handle type=\"target\" position={Position.Top} style={{ opacity: 0, left: '50%' }} />\r\n <div style={{ padding: '8px 28px', borderRadius: 999, background: '#f5f5f5', border: '1.5px solid #bdbdbd', fontSize: 13, fontWeight: 500, color: '#424242', userSelect: 'none' }}>\r\n End\r\n </div>\r\n </div>\r\n);\r\n\r\nexport default EndNode;\r\n","import React from 'react';\r\nimport { Handle, Position } from 'reactflow';\r\nimport { Tooltip } from '@mui/material';\r\nimport { GrTrigger } from 'react-icons/gr';\r\nimport { useCanvasHandlers } from '../WorkflowCanvasContext';\r\n\r\nconst AddTriggerNode = () => {\r\n const { onClickAddTrigger, messages } = useCanvasHandlers();\r\n return (\r\n <div style={{ width: 350, display: 'flex', justifyContent: 'center' }}>\r\n <Handle type=\"target\" position={Position.Top} style={{ opacity: 0, left: '50%' }} />\r\n <Tooltip title={messages.addTriggerTooltip} placement=\"top\" arrow>\r\n <div\r\n onClick={onClickAddTrigger}\r\n role=\"button\"\r\n tabIndex={0}\r\n onKeyDown={(e) => { if (e.key === 'Enter') onClickAddTrigger(); }}\r\n style={{ padding: '10px 24px', borderRadius: 8, border: '1.5px dashed #d0d0d0', background: '#fff', cursor: 'pointer', display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 8 }}\r\n >\r\n <GrTrigger size={16} />\r\n <span className=\"ff-text-black\" style={{ fontSize: 13 }} data-testid=\"add-trigger-btn-text\">\r\n {messages.addTriggerButton}\r\n </span>\r\n </div>\r\n </Tooltip>\r\n <Handle type=\"source\" position={Position.Bottom} style={{ opacity: 0, left: '50%' }} />\r\n </div>\r\n );\r\n};\r\n\r\nexport default AddTriggerNode;\r\n","import React from 'react';\r\nimport { Handle, Position, NodeProps } from 'reactflow';\r\nimport { useCanvasHandlers } from '../WorkflowCanvasContext';\r\n\r\nconst AddStepNode = ({ id }: NodeProps) => {\r\n const { onAddStep } = useCanvasHandlers();\r\n return (\r\n <div\r\n onClick={() => onAddStep(id)}\r\n role=\"button\"\r\n tabIndex={0}\r\n onKeyDown={(e) => { if (e.key === 'Enter') onAddStep(id); }}\r\n style={{ width: 28, height: 28, borderRadius: '50%', border: '1.5px solid #9e9e9e', background: '#fff', display: 'flex', alignItems: 'center', justifyContent: 'center', cursor: 'pointer', fontSize: 18, color: '#757575', lineHeight: 1, userSelect: 'none' }}\r\n >\r\n <Handle type=\"target\" position={Position.Top} style={{ opacity: 0 }} />\r\n +\r\n <Handle type=\"source\" position={Position.Bottom} style={{ opacity: 0 }} />\r\n </div>\r\n );\r\n};\r\n\r\nexport default AddStepNode;\r\n","import React, { CSSProperties, ReactNode } from 'react';\n\n/**\n * NodeBody — the ONE generic, data-driven node-card body.\n *\n * Every task type (assign/unassign, delete dormant, notify expiry, scheduler,\n * attribute mapping …) renders through this single component. There is no\n * per-task code, no task ids and no field-name special-casing: rows are derived\n * purely from data the node already carries —\n * • the descriptor's `formSchema` → field labels, which field is conditioned\n * • the node's saved values → what the user configured\n * • `_optionLabels` → id → friendly name (show \"Sales Team\", not a guid)\n * • `conditionConfig`/`_conditionConfig` → the When-clauses\n *\n * Rows render as plain-language sentences (Slack/Zapier style), with connective\n * words muted, field names in ink and the configured/outcome values in the\n * node's accent colour. A descriptor may ship an optional `nodeBody` override\n * (data, never code) — see {@link resolveNodeRows}.\n */\n\n// ─── Row model ────────────────────────────────────────────────────────────────\nexport interface NodeBodyCondition {\n field: string;\n op: string;\n value?: string;\n connector?: string;\n}\nexport type NodeBodyRow =\n | { kind: 'value'; label: string; value: string[] }\n | { kind: 'rule'; when?: NodeBodyCondition[]; outcomeLabel: string; outcome: string[]; fallback?: boolean };\n\n/** Optional override a descriptor can ship: static rows or a fn of node data. */\nexport type NodeBodySpec =\n | NodeBodyRow[]\n | ((data: Record<string, unknown>) => NodeBodyRow[]);\n\ninterface DescriptorLike {\n label?: string;\n formSchema?: unknown;\n nodeBody?: NodeBodySpec;\n}\n\n// ─── Generic, host-agnostic operator → word map ───────────────────────────────\nconst OPERATOR_LABELS: Record<string, string> = {\n equals: 'is',\n notEquals: 'is not',\n contains: 'contains',\n notContains: 'does not contain',\n startsWith: 'starts with',\n endsWith: 'ends with',\n isPresent: 'is present',\n isNotPresent: 'is not present',\n isEmpty: 'is empty',\n isNotEmpty: 'is not empty',\n greaterThan: 'greater than',\n lessThan: 'less than',\n greaterOrEquals: 'greater or equal',\n lessOrEquals: 'less or equal',\n};\n\nconst INTERNAL_KEYS = new Set([\n 'descriptorType', 'title', 'header', 'icon', 'infoText', 'label',\n 'conditionConfig', '_conditionConfig', '_optionLabels', '_formulaConfig',\n // Trigger plumbing — never render these as value rows.\n 'type', 'eventType', 'sources', 'source', 'previewWorkflow', 'executionStatus',\n]);\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\nconst getByPath = (obj: unknown, path: string): unknown =>\n path.split('.').reduce<unknown>((acc, k) => (acc == null ? undefined : (acc as Record<string, unknown>)[k]), obj);\n\nconst toList = (v: unknown): string[] => {\n const one = (x: unknown): string =>\n typeof x === 'object' && x\n ? String((x as Record<string, unknown>).label ?? (x as Record<string, unknown>).name ?? (x as Record<string, unknown>).value ?? '')\n : x == null ? '' : String(x);\n return Array.isArray(v) ? v.map(one).filter(Boolean) : (v != null && v !== '' ? [one(v)].filter(Boolean) : []);\n};\n\n// Prefer the friendly label captured at pick-time over the raw stored id.\nconst resolveAt = (data: Record<string, unknown>, path: string): string[] => {\n const labels = data._optionLabels as Record<string, unknown> | undefined;\n return toList(getByPath(labels as Record<string, unknown>, path) ?? getByPath(data, path));\n};\n\nfunction humanizeKey(key: string): string {\n // Drop a namespace prefix (deleteDisableDormant.noOfDays → noOfDays) then humanize.\n const leaf = key.includes('.') ? key.slice(key.lastIndexOf('.') + 1) : key;\n return leaf.replace(/[_-]+/g, ' ').replace(/([a-z])([A-Z])/g, '$1 $2').replace(/\\b\\w/g, (m) => m.toUpperCase());\n}\n\n// Layout/container field types carry no value of their own — never a value row.\nconst LAYOUT_TYPES = new Set(['callout', 'header', 'section', 'divider', 'button', 'group', 'tabs', 'info', 'tree-map']);\n\n// Flatten a (possibly nested) form schema down to value-bearing leaf fields.\nfunction flattenSchema(schema: unknown): Array<Record<string, unknown>> {\n const out: Array<Record<string, unknown>> = [];\n const walk = (arr: unknown) => {\n (Array.isArray(arr) ? arr : []).forEach((f) => {\n if (!f || typeof f !== 'object') return;\n const node = f as Record<string, unknown>;\n if (node.id || node.name) out.push(node);\n if (Array.isArray(node.fields)) walk(node.fields);\n if (Array.isArray(node.columns)) walk(node.columns);\n if (Array.isArray(node.tabs)) (node.tabs as Array<Record<string, unknown>>).forEach((t) => walk(t?.fields));\n });\n };\n walk(schema);\n return out;\n}\n\n// Resolve a single field's display value(s): friendly labels > option labels >\n// boolean → Yes (false dropped) > raw value, all read by the field's dotted id.\nfunction fieldValue(data: Record<string, unknown>, field: Record<string, unknown>): string[] {\n const id = String(field.id || field.name || '');\n const labels = data._optionLabels as Record<string, unknown> | undefined;\n const labelVal = labels ? getByPath(labels as Record<string, unknown>, id) : undefined;\n if (labelVal != null) return toList(labelVal);\n const raw = getByPath(data, id);\n if (typeof raw === 'boolean') return raw ? ['Yes'] : [];\n if (Array.isArray(field.options) && raw != null && raw !== '') {\n const map = new Map(\n (field.options as Array<Record<string, unknown>>)\n .filter((o) => o && typeof o === 'object')\n .map((o) => [String(o.value), String(o.label ?? o.value)]),\n );\n return toList(raw).map((v) => map.get(v) ?? v);\n }\n return toList(raw);\n}\n\n// Flatten possibly-grouped condition entries down to leaves.\nfunction flattenConditions(list: unknown): Array<Record<string, unknown>> {\n const out: Array<Record<string, unknown>> = [];\n const walk = (arr: unknown) => {\n (Array.isArray(arr) ? arr : []).forEach((n) => {\n if (n && (n as Record<string, unknown>).type === 'group') walk((n as Record<string, unknown>).entries);\n else if (n) out.push(n as Record<string, unknown>);\n });\n };\n walk(list);\n return out;\n}\n\n// ─── The generic derivation — turns node data into body rows ──────────────────\nexport function deriveRows(data: Record<string, unknown>, descriptor?: DescriptorLike): NodeBodyRow[] {\n const schema = flattenSchema(descriptor?.formSchema);\n const condCfg = (data.conditionConfig ?? data._conditionConfig) as Record<string, unknown> | undefined;\n const actionLabel = descriptor?.label || (data.title as string) || 'Set';\n // The header already shows the node title; only repeat it in the body as a\n // verb when it's a short, distinct phrase (e.g. \"Assign to\"). A long title\n // like \"Unassign Group's From User\" is dropped — the body then reads\n // \"When <conditions> → <value>\".\n const verb = actionLabel && actionLabel.length <= 18 ? actionLabel : '';\n const labelOf = (key: string) => {\n const f = schema.find((x) => x?.id === key || x?.name === key);\n return f?.label ? String(f.label) : humanizeKey(key);\n };\n\n const rows: NodeBodyRow[] = [];\n const conditioned = new Set(condCfg ? Object.keys(condCfg) : []);\n\n // 1. Conditioned values → When-rules. Keyed by the field path the condition\n // is attached to; the assigned value lives at that same path.\n if (condCfg && typeof condCfg === 'object') {\n Object.entries(condCfg).forEach(([path, entries]) => {\n const leaves = flattenConditions(entries);\n const outcome = resolveAt(data, path);\n // Skip empties (no conditions AND no value at the path).\n if (leaves.length === 0 && outcome.length === 0) return;\n rows.push({\n kind: 'rule',\n when: leaves.map((e) => ({\n field: (e.fieldLabel as string) || labelOf((e.field as string) || ''),\n op: OPERATOR_LABELS[e.operator as string] || (e.operator as string) || '',\n value: e.value == null ? undefined : toList(e.value).join(', ') || undefined,\n connector: (e.connector as string) || 'and',\n })),\n outcomeLabel: verb,\n outcome,\n });\n });\n }\n\n // 2. Value rows — driven by the SCHEMA's field ids (which may be dotted/nested\n // paths like `deleteDisableDormant.noOfDays`), so namespaced config renders.\n if (schema.length) {\n schema.forEach((f) => {\n const id = String(f.id || f.name || '');\n if (!id || INTERNAL_KEYS.has(id) || conditioned.has(id)) return;\n if (LAYOUT_TYPES.has(f.type as string)) return;\n const value = fieldValue(data, f);\n if (value.length) rows.push({ kind: 'value', label: labelOf(id), value });\n });\n } else {\n // No static schema (e.g. async) → walk the data, descending into nested\n // config objects (e.g. `deleteDisableDormant.*`) so namespaced values show.\n const walk = (obj: Record<string, unknown>, prefix: string) => {\n Object.keys(obj).forEach((key) => {\n const path = prefix ? `${prefix}.${key}` : key;\n if (INTERNAL_KEYS.has(key) || conditioned.has(path)) return;\n const raw = obj[key];\n if (raw && typeof raw === 'object' && !Array.isArray(raw)) {\n walk(raw as Record<string, unknown>, path);\n return;\n }\n if (typeof raw === 'boolean') {\n if (raw) rows.push({ kind: 'value', label: labelOf(path), value: ['Yes'] });\n return;\n }\n const value = resolveAt(data, path);\n if (value.length) rows.push({ kind: 'value', label: labelOf(path), value });\n });\n };\n walk(data, '');\n }\n\n return rows;\n}\n\n/** Use a descriptor's `nodeBody` override if present, else derive generically. */\nexport function resolveNodeRows(data: Record<string, unknown>, descriptor?: DescriptorLike): NodeBodyRow[] {\n const spec = descriptor?.nodeBody;\n if (typeof spec === 'function') return spec(data);\n if (Array.isArray(spec)) return spec;\n return deriveRows(data, descriptor);\n}\n\n// ─── Sentence rendering (plain-language style) ────────────────────────────────\nconst muted: CSSProperties = { color: '#64748b' };\nconst fieldText: CSSProperties = { color: '#0f172a', fontWeight: 600 };\n\n// Inline value that truncates instead of wrapping (long ids, role names…).\nfunction Val({ text, style }: { text: string; style: CSSProperties }) {\n return (\n <span\n title={text}\n style={{ ...style, display: 'inline-block', maxWidth: 230, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', verticalAlign: 'bottom' }}\n >\n {text}\n </span>\n );\n}\n\nfunction Conditions({ conditions }: { conditions: NodeBodyCondition[] }) {\n return (\n <>\n {conditions.map((c, j) => (\n <React.Fragment key={j}>\n {j > 0 && <span style={muted}> {c.connector ?? 'and'} </span>}\n <span style={fieldText}>{c.field}</span>\n <span style={muted}> {c.op} </span>\n {c.value != null && <span style={fieldText}>{c.value}</span>}\n </React.Fragment>\n ))}\n </>\n );\n}\n\nexport interface NodeBodyProps {\n data: Record<string, unknown>;\n descriptor?: DescriptorLike;\n /** Outcome/value emphasis colour. Defaults to a neutral blue. */\n accent?: string;\n /** Placeholder shown when there's nothing configured yet. */\n emptyText?: ReactNode;\n}\n\nexport function NodeBody({ data, descriptor, accent = '#2563eb', emptyText }: NodeBodyProps): JSX.Element {\n const rows = resolveNodeRows(data || {}, descriptor);\n if (!rows.length) {\n return <span style={{ color: '#94a3b8' }}>{emptyText ?? 'Click edit to configure'}</span>;\n }\n const outcomeText: CSSProperties = { color: accent, fontWeight: 600 };\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n {rows.map((row, i) => {\n if (row.kind === 'value') {\n return (\n <div key={i} style={{ lineHeight: 1.5 }}>\n <span style={muted}>{row.label} </span>\n <Val text={row.value.join(', ')} style={fieldText} />\n </div>\n );\n }\n if (row.fallback) {\n return (\n <div key={i} style={{ lineHeight: 1.5 }}>\n <span style={muted}>Otherwise → </span>\n <Val text={row.outcome.join(', ')} style={outcomeText} />\n </div>\n );\n }\n const hasOutcome = row.outcome.length > 0;\n const hasWhen = !!row.when && row.when.length > 0;\n // 1. short verb → \"Assign to <value> when <conditions>\"\n if (row.outcomeLabel) {\n return (\n <div key={i} style={{ lineHeight: 1.5 }}>\n <span style={muted}>{row.outcomeLabel} </span>\n {hasOutcome && <Val text={row.outcome.join(', ')} style={outcomeText} />}\n {hasWhen && (<><span style={muted}> when </span><Conditions conditions={row.when!} /></>)}\n </div>\n );\n }\n // 2. no verb but has a condition → \"When <conditions> → <value>\"\n if (hasWhen) {\n return (\n <div key={i} style={{ lineHeight: 1.5 }}>\n <span style={muted}>When </span>\n <Conditions conditions={row.when!} />\n {hasOutcome && (<><span style={muted}> → </span><Val text={row.outcome.join(', ')} style={outcomeText} /></>)}\n </div>\n );\n }\n // 3. bare value\n return (\n <div key={i} style={{ lineHeight: 1.5 }}>\n <Val text={row.outcome.join(', ')} style={outcomeText} />\n </div>\n );\n })}\n </div>\n );\n}\n\nexport default NodeBody;\n","import React from 'react';\nimport { Handle, Position, NodeProps } from 'reactflow';\nimport { Chip, Tooltip } from '@mui/material';\nimport { MdInput, MdOutlineModeEdit, MdInfoOutline } from 'react-icons/md';\nimport { FaCheckCircle, FaTimesCircle } from 'react-icons/fa';\nimport { useCanvasHandlers } from '../WorkflowCanvasContext';\nimport { NodeBody } from './NodeBody';\n\n// Trigger accent — orange, matching the approved trigger card design.\nconst TRIGGER_ACCENT = '#ea580c';\n\ninterface TriggerSource {\n value?: string;\n label?: string;\n}\n\ninterface TriggerExecutionStatus {\n status?: 'success' | 'failed' | string;\n}\n\ninterface TriggerNodeData {\n /** Trigger flavour. 'event' = event-based; 'scheduler' = cron/scheduler; absent = nothing chosen yet. */\n type?: 'event' | 'scheduler';\n /** Raw event-type code (e.g. 'PAM_TICKET_CREATED'). The human label\n * should be passed via `label` (curated) — `eventType` is only humanized\n * as a fallback. */\n eventType?: string;\n /** Selected event sources (for type === 'event'). Each rendered as a chip. */\n sources?: TriggerSource[];\n /** Legacy / simple shape — single label + optional source, used when no `type`/`sources` are supplied. */\n label?: string;\n source?: string;\n /** Hides edit icon when previewing a stored workflow. */\n previewWorkflow?: boolean;\n /** When present, replaces the edit icon with a status badge. */\n executionStatus?: TriggerExecutionStatus;\n /** Optional info text shown in the (i) tooltip; defaults to a generic explanation. */\n infoText?: string;\n}\n\n// Last-resort humaniser for a raw code string. The package is generic — it\n// must NOT carry IAM-/PAM-/IGA-specific mappings. The host is expected to\n// supply human labels via `template.label` (merged into nodeData.label) and\n// via each source's `label` field (returned from loadTriggerSources). This\n// helper only runs when the host gave us nothing readable to display.\nfunction humaniseCode(code?: string): string {\n if (!code) return '';\n return code\n .replace(/[_-]+/g, ' ')\n .toLowerCase()\n .replace(/\\b\\w/g, (m) => m.toUpperCase());\n}\n\n// Source label preference: host-provided `label` first, then humanise.\nfunction formatSource(s: TriggerSource | string): string {\n if (typeof s !== 'string' && s.label) return s.label;\n const value = typeof s === 'string' ? s : (s.value ?? '');\n return humaniseCode(value);\n}\n\nconst TriggerNode = ({ id, data }: NodeProps) => {\n const { onClickAddTrigger, onEditNode, messages, activeTemplate } = useCanvasHandlers();\n const {\n type, eventType, sources,\n label, source,\n previewWorkflow, executionStatus,\n infoText = 'This node decides the flow trigger type and configuration.',\n } = (data ?? {}) as TriggerNodeData;\n\n const handleEdit = (e?: React.SyntheticEvent) => {\n e?.stopPropagation();\n // A scheduler trigger opens its OWN config drawer (schedule: timezone /\n // frequency / timings). Event triggers re-open the trigger selector so the\n // user can change the event/sources.\n if (type === 'scheduler') onEditNode(id);\n else onClickAddTrigger();\n };\n\n // ── Shape flags ─────────────────────────────────────────────────────────────\n const hasEventSources = Array.isArray(sources) && sources.length > 0;\n const hasSimpleShape = !!(label || source);\n\n // ── Title text — always a generic role label, never the configured value.\n // The configured value (event name, sources) lives in the body below.\n const title =\n type === 'scheduler'\n ? (messages?.schedulerTriggerTitle ?? 'Scheduler Trigger')\n : (type === 'event' || hasEventSources || hasSimpleShape)\n ? (messages?.eventTriggerSourceTitle ?? 'Event Trigger Source')\n : (messages?.selectTriggerTitle ?? 'Select Trigger');\n\n const body: React.ReactNode = (() => {\n if (type === 'scheduler') {\n // Scheduler config (frequency / timings / timezone) renders through the\n // ONE generic, data-driven body — same renderer as action nodes.\n return (\n <NodeBody\n data={data as Record<string, unknown>}\n accent={TRIGGER_ACCENT}\n emptyText={messages?.schedulerToBeConfigured ?? 'Scheduler to be configured'}\n />\n );\n }\n\n if (type === 'event' || hasEventSources) {\n // Prefer the template's own `label` (human-curated) over a code-derived\n // title. Falls back to a humanised form of the raw code for back-compat\n // with shapes that only carry the eventType code.\n const eventDisplay = label || humaniseCode(eventType);\n return (\n <div>\n <div className=\"ff-d-flex ff-align-items-center\">\n <span style={{ fontWeight: 600 }}>{eventDisplay}</span>\n <span className=\"ff-ms-2 ff-text-muted\" style={{ fontSize: 12 }}>via</span>\n </div>\n <div className=\"ff-d-flex ff-flex-wrap ff-mt-2\" style={{ gap: 4 }}>\n {hasEventSources ? (\n sources!.map((s, i) => (\n <Chip\n key={i}\n label={formatSource(s)}\n variant=\"outlined\"\n size=\"small\"\n className=\"ff-text-dark\"\n />\n ))\n ) : (\n <span className=\"ff-text-muted\" style={{ fontSize: 12 }}>{messages?.noSourceSelected ?? 'No source selected'}</span>\n )}\n </div>\n </div>\n );\n }\n\n if (hasSimpleShape) {\n return (\n <div className=\"ff-d-flex ff-flex-wrap ff-align-items-center\" style={{ gap: 6 }}>\n {label && <span style={{ fontWeight: 600 }}>{label}</span>}\n {source && <Chip label={source} variant=\"outlined\" size=\"small\" />}\n </div>\n );\n }\n\n return (\n <span\n role=\"button\"\n tabIndex={0}\n onClick={handleEdit}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') handleEdit(e); }}\n style={{ cursor: 'pointer', color: '#1e88e5' }}\n >\n {messages?.selectTriggerCta ?? 'Click to select a trigger to start your workflow'}\n </span>\n );\n })();\n\n // ── Right-side cluster: execution status badge OR (edit + info) ─────────────\n const rightCluster = executionStatus ? (\n <>\n {executionStatus.status === 'success' && (\n <FaCheckCircle size={16} color=\"#1DBF60\" style={{ marginRight: 8 }} />\n )}\n {executionStatus.status === 'failed' && (\n <FaTimesCircle size={16} color=\"#f44336\" style={{ marginRight: 8 }} />\n )}\n </>\n ) : (\n <div className=\"ff-d-flex ff-align-items-center\">\n {!previewWorkflow && (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={handleEdit}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') handleEdit(e); }}\n className=\"ff-me-2\"\n style={{ cursor: 'pointer', color: '#212121' }}\n aria-label=\"Edit trigger\"\n >\n <MdOutlineModeEdit size={16} />\n </div>\n )}\n <Tooltip title={<div>{infoText}</div>} placement=\"right\" arrow>\n <span><MdInfoOutline color=\"gray\" size={16} /></span>\n </Tooltip>\n </div>\n );\n\n // Full-card host design for trigger node — same pattern as ActionNode.\n if (activeTemplate?.renderFullTriggerNode) {\n return (\n <div style={{ position: 'relative', display: 'inline-block' }}>\n <Handle type=\"target\" position={Position.Top} style={{ opacity: 0 }} />\n {activeTemplate.renderFullTriggerNode({\n data: data as Record<string, unknown>,\n onEdit: handleEdit,\n })}\n <Handle type=\"source\" position={Position.Bottom} style={{ opacity: 0 }} id=\"1\" />\n </div>\n );\n }\n\n return (\n <div style={{ width: 350 }}>\n <Handle type=\"target\" position={Position.Top} style={{ opacity: 0 }} />\n <div style={{ border: '1.5px solid #a5d6a7', borderRadius: 8, background: '#fff', overflow: 'hidden' }}>\n {/* Header row — original layout: icon in tinted square + small generic title */}\n <div className=\"ff-d-flex ff-justify-content-between ff-align-items-center\" style={{ padding: '12px 14px'}}>\n <div className=\"ff-d-flex ff-align-items-center ff-gap-2\">\n <div\n style={{\n width: 28, height: 28, borderRadius: 6,\n background: 'rgba(76,175,80,0.1)',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n flexShrink: 0,\n }}\n >\n <MdInput size={16} color=\"#388e3c\" />\n </div>\n <span style={{ fontSize: 14, fontWeight: 500, color: '#212121' }}>{title}</span>\n </div>\n <div className=\"ff-d-flex ff-align-items-center\">{rightCluster}</div>\n </div>\n\n {/* Body */}\n <div\n style={{\n background: '#f5f5f5',\n fontSize: 12,\n color: '#212121',\n padding: '14px 16px',\n margin: '0 10px 12px',\n borderRadius: 6,\n textAlign: 'left',\n }}\n >\n {body}\n </div>\n </div>\n <Handle type=\"source\" position={Position.Bottom} style={{ opacity: 0 }} id=\"1\" />\n </div>\n );\n};\n\nexport default TriggerNode;\n","import React from 'react';\nimport { Handle, Position, NodeProps } from 'reactflow';\nimport { Chip, Tooltip } from '@mui/material';\nimport { MdInput, MdInfoOutline } from 'react-icons/md';\nimport { FaCheckCircle, FaTimesCircle } from 'react-icons/fa';\n\n/**\n * EventNode — fixed, display-only \"system event\" marker (e.g. the\n * `User Created` step that's pre-seeded in the END_USER_CREATION template).\n *\n * Shares the green/event visual language with TriggerNode but has NO edit\n * affordance — this node represents an event the system raises, not something\n * the user configures. Click → no drawer opens.\n */\n\ninterface EventSource {\n value?: string;\n label?: string;\n}\n\ninterface EventExecutionStatus {\n status?: 'success' | 'failed' | string;\n}\n\ninterface EventNodeData {\n header?: string;\n title?: string;\n eventType?: string;\n sources?: EventSource[];\n /** Optional tooltip text on the (i) icon */\n infoText?: string;\n /** Optional execution badge (success / failed) */\n executionStatus?: EventExecutionStatus;\n}\n\nfunction humanize(code?: string): string {\n if (!code) return '';\n return code.replace(/[_-]+/g, ' ').replace(/\\b\\w/g, (m) => m.toUpperCase());\n}\n\nfunction formatSource(s: EventSource | string): string {\n if (typeof s !== 'string' && s.label) return s.label;\n const value = typeof s === 'string' ? s : s.value ?? '';\n return humanize(value);\n}\n\nconst EventNode = ({ data }: NodeProps) => {\n const {\n header = 'Event',\n title,\n eventType,\n sources,\n executionStatus,\n infoText = 'This event is raised by the system. It cannot be configured.',\n } = (data ?? {}) as EventNodeData;\n\n const displayTitle = title || humanize(eventType) || '—';\n\n return (\n <div style={{ width: 350 }}>\n <Handle type=\"target\" position={Position.Top} style={{ opacity: 0 }} />\n <div style={{ border: '1.5px solid #a5d6a7', borderRadius: 8, background: '#fff', overflow: 'hidden' }}>\n {/* Header row */}\n <div className=\"ff-d-flex ff-justify-content-between ff-align-items-center\" style={{ padding: '12px 14px' }}>\n <div className=\"ff-d-flex ff-align-items-center ff-gap-2\">\n <div\n style={{\n width: 28, height: 28, borderRadius: 6,\n background: 'rgba(76,175,80,0.1)',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n flexShrink: 0,\n }}\n >\n <MdInput size={16} color=\"#388e3c\" />\n </div>\n <span style={{ fontSize: 14, fontWeight: 500, color: '#212121' }}>{header}</span>\n </div>\n <div className=\"ff-d-flex ff-align-items-center\">\n {executionStatus?.status === 'success' && (\n <FaCheckCircle size={16} color=\"#1DBF60\" style={{ marginRight: 8 }} />\n )}\n {executionStatus?.status === 'failed' && (\n <FaTimesCircle size={16} color=\"#f44336\" style={{ marginRight: 8 }} />\n )}\n {!executionStatus && (\n <Tooltip title={<div>{infoText}</div>} placement=\"right\" arrow>\n <span><MdInfoOutline color=\"gray\" size={16} /></span>\n </Tooltip>\n )}\n </div>\n </div>\n\n {/* Body */}\n <div\n style={{\n background: '#f5f5f5',\n fontSize: 13,\n color: '#212121',\n padding: '14px 16px',\n margin: '0 10px 12px',\n borderRadius: 6,\n textAlign: 'left',\n }}\n >\n <div style={{ fontWeight: 600 }}>{displayTitle}</div>\n {Array.isArray(sources) && sources.length > 0 && (\n <>\n <div className=\"ff-text-muted\" style={{ fontSize: 12, marginTop: 4 }}>via</div>\n <div className=\"ff-d-flex ff-flex-wrap ff-mt-1\" style={{ gap: 4 }}>\n {sources.map((s, i) => (\n <Chip\n key={i}\n label={formatSource(s)}\n variant=\"outlined\"\n size=\"small\"\n className=\"ff-text-dark\"\n />\n ))}\n </div>\n </>\n )}\n </div>\n </div>\n <Handle type=\"source\" position={Position.Bottom} style={{ opacity: 0 }} id=\"1\" />\n </div>\n );\n};\n\nexport default EventNode;\n","import React from 'react';\n\nexport interface BranchRailEntry {\n /** Y position of this branch's bullet, relative to gateway card's bottom edge */\n y: number;\n label: string;\n /** First/primary branch — used for pill coloring */\n isPass: boolean;\n}\n\nexport interface BranchRailSpec {\n branches: BranchRailEntry[];\n /** Total rail height, from gateway card bottom to end of last branch */\n height: number;\n /** Horizontal offset from gateway center to branch step center (px) */\n indent: number;\n}\n\n/**\n * Vertical rail decoration that hangs off the bottom of a gateway (filter/approval)\n * card. Provides the Workato-style visual: a left vertical line with branch bullets\n * + labels at the Y position of each branch's first step.\n *\n * Positioned absolutely so it overflows the node's bounding box without affecting\n * ReactFlow's measured size.\n */\nconst BranchRailDecoration: React.FC<{ rail: BranchRailSpec; cardWidth: number }> = ({ rail, cardWidth }) => {\n // Rail X sits just inside the gateway card's left edge, descending from card bottom.\n // Branch step center is at (cardCenter + indent). Card center is at cardWidth/2.\n // The bullet anchors on the rail and a short connector reaches the step.\n const railX = cardWidth / 2; // center of gateway card; rail descends from here\n const stepCenterX = cardWidth / 2 + rail.indent;\n const stroke = 'var(--ff-edge-color, #b0bec5)';\n\n return (\n <svg\n width={cardWidth + rail.indent + 200}\n height={rail.height}\n style={{ position: 'absolute', left: 0, top: '100%', pointerEvents: 'none', overflow: 'visible' }}\n >\n {/* Vertical rail */}\n <line x1={railX} y1={0} x2={railX} y2={rail.height} stroke={stroke} strokeWidth={1.5} />\n\n {rail.branches.map((b, idx) => {\n const bulletY = b.y;\n return (\n <g key={idx} transform={`translate(0, ${bulletY})`}>\n {/* Diamond bullet on the rail */}\n <rect\n x={railX - 5} y={-5} width={10} height={10}\n fill=\"#fff\" stroke={stroke} strokeWidth={1.5}\n transform={`rotate(45, ${railX}, 0)`}\n />\n {/* Plain-text label to the right of the bullet (Workato-style) */}\n <text x={railX + 14} y={4} fontSize={12} fontWeight={500}\n fill=\"var(--ff-text, #212121)\" style={{ fontFamily: 'sans-serif' }}>\n {b.label}\n </text>\n </g>\n );\n })}\n </svg>\n );\n};\n\nexport default BranchRailDecoration;\n","import React from 'react';\nimport { Handle, Position, NodeProps } from 'reactflow';\nimport { FiFilter } from 'react-icons/fi';\nimport { MdInfoOutline, MdOutlineModeEdit, MdDeleteOutline } from 'react-icons/md';\nimport { Tooltip } from '@mui/material';\nimport { useCanvasHandlers } from '../WorkflowCanvasContext';\nimport BranchRailDecoration, { BranchRailSpec } from './BranchRailDecoration';\n\ninterface Condition {\n field: string;\n operator: string;\n value: string;\n logicalOperator?: string;\n}\n\nconst FilterNode = ({ id, data }: NodeProps) => {\n const { onEditNode, onDeleteNode, nodeRegistry } = useCanvasHandlers();\n const { conditions = [], infoText = 'Filter conditions applied to workflow data', _branchRail, descriptorType, branchStyle } = data as { conditions?: Condition[]; infoText?: string; _branchRail?: BranchRailSpec; descriptorType?: string; branchStyle?: string };\n const descriptor = descriptorType ? nodeRegistry?.forType(descriptorType) : undefined;\n const inlineGate = branchStyle === 'inline-gate';\n\n // Two source handles so the gateway has distinct exits the edges attach to:\n // 'pass' (bottom — continues the spine) and 'fail' (right — side branch to End).\n // For inline-gate the Fail edge leaves the RIGHT handle; otherwise both leave\n // the bottom (symmetric layout).\n const sourceHandles = (\n <>\n <Handle id=\"pass\" type=\"source\" position={Position.Bottom} style={{ opacity: 0 }} />\n <Handle id=\"fail\" type=\"source\" position={Position.Right} style={{ opacity: 0, top: '50%' }} />\n </>\n );\n\n // Host-owned card (IAM FilterNodeLabel) — FlowForge only anchors the handles.\n if (descriptor?.renderFullNode) {\n return (\n <div style={{ position: 'relative', display: 'inline-block' }}>\n <Handle type=\"target\" position={Position.Top} style={{ opacity: 0 }} />\n {descriptor.renderFullNode({\n id,\n data: data as Record<string, unknown>,\n onEdit: () => onEditNode(id),\n onDelete: () => onDeleteNode(id),\n })}\n {sourceHandles}\n {!inlineGate && _branchRail && <BranchRailDecoration rail={_branchRail} cardWidth={350} />}\n </div>\n );\n }\n\n return (\n <div style={{ width: 350, position: 'relative' }}>\n <Handle type=\"target\" position={Position.Top} style={{ opacity: 0 }} />\n <div style={{ border: '1.5px solid #ffe082', borderRadius: 8, background: '#fff' }}>\n <div className=\"ff-d-flex ff-justify-content-between ff-align-items-center\" style={{ padding: '10px 6px' }}>\n <div className=\"ff-d-flex ff-align-items-center\">\n <div className=\"ff-d-flex ff-align-items-center ff-justify-content-center ff-rounded\" style={{ width: 25, height: 25, background: 'rgba(255,160,0,0.1)' }}>\n <FiFilter className=\"ff-text-warning\" size={16} />\n </div>\n <span className=\"ff-ms-2 ff-fw-medium ff-text-dark\" style={{ fontSize: 14 }}>Filter</span>\n </div>\n <div className=\"node-actions ff-d-flex ff-align-items-center\">\n <div\n role=\"button\" tabIndex={0}\n onClick={(e) => { e.stopPropagation(); onEditNode(id); }}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.stopPropagation(); onEditNode(id); } }}\n >\n <MdOutlineModeEdit size={16} />\n </div>\n <div\n className=\"ff-ms-2\" role=\"button\" tabIndex={0}\n onClick={(e) => { e.stopPropagation(); onDeleteNode(id); }}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.stopPropagation(); onDeleteNode(id); } }}\n >\n <MdDeleteOutline color=\"red\" size={16} />\n </div>\n <Tooltip title={infoText} placement=\"right\" arrow>\n <div className=\"ff-ms-2\"><MdInfoOutline color=\"gray\" size={16} /></div>\n </Tooltip>\n </div>\n </div>\n <div style={{ margin: '0 6px 10px', padding: '10px 12px', borderRadius: 6, background: '#fafafa', fontSize: 12 }}>\n {conditions.length === 0 ? (\n <span className=\"ff-text-muted\">No conditions configured</span>\n ) : conditions.map((condition, index) => (\n <div key={index} className=\"ff-d-flex ff-align-items-center ff-mb-1\">\n <p className=\"ff-m-0 ff-fw-bold ff-me-1 ff-text-truncate\" style={{ maxWidth: 100 }} title={condition.field}>{condition.field}</p>\n <span className=\"ff-text-muted\">{condition.operator}</span>\n <p className=\"ff-text-dark ff-text-truncate ff-mx-1 ff-m-0\" title={condition.value}>{condition.value}</p>\n {index < conditions.length - 1 && (\n <p className=\"ff-bg-primary ff-text-white ff-fw-bold ff-ms-1 ff-px-1 ff-rounded-1 ff-m-0\">{condition.logicalOperator}</p>\n )}\n </div>\n ))}\n </div>\n </div>\n {sourceHandles}\n {!inlineGate && _branchRail && <BranchRailDecoration rail={_branchRail} cardWidth={350} />}\n </div>\n );\n};\n\nexport default FilterNode;\n","import { ReactNode } from 'react';\nimport { Handle, Position, NodeProps } from 'reactflow';\nimport { MdInfoOutline, MdOutlineModeEdit, MdDeleteOutline } from 'react-icons/md';\nimport { Tooltip } from '@mui/material';\nimport { useCanvasHandlers } from '../WorkflowCanvasContext';\nimport { NodeBody } from './NodeBody';\n\ninterface ActionNodeData {\n title?: string;\n descriptorType?: string;\n infoText?: string;\n}\n\nconst ActionNode = ({ id, data }: NodeProps) => {\n const { onEditNode, onDeleteNode, nodeRegistry, nodeBody = 'full', messages } = useCanvasHandlers();\n const { title = 'Task', descriptorType, infoText = '' } = data as ActionNodeData;\n const descriptor = descriptorType ? nodeRegistry?.forType(descriptorType) : undefined;\n const icon: ReactNode = descriptor?.icon as ReactNode;\n\n // Full-card host design: FlowForge imposes NOTHING visual — no width, no\n // border, no padding. It only anchors the react-flow handles. The host's\n // returned design owns the entire card (size, border, padding), so it renders\n // pixel-identical to the host's own canvas.\n if (descriptor?.renderFullNode) {\n return (\n <div style={{ position: 'relative', display: 'inline-block' }}>\n <Handle type=\"target\" position={Position.Top} style={{ opacity: 0 }} />\n {descriptor.renderFullNode({\n id,\n data: data as Record<string, unknown>,\n onEdit: () => onEditNode(id),\n onDelete: () => onDeleteNode(id),\n })}\n <Handle type=\"source\" position={Position.Bottom} style={{ opacity: 0 }} />\n </div>\n );\n }\n\n return (\n <div style={{ width: 350 }}>\n <Handle type=\"target\" position={Position.Top} style={{ opacity: 0 }} />\n <div style={{ border: '1.5px solid #b0bec5', borderRadius: 8, background: '#fff' }}>\n <div className=\"ff-d-flex ff-justify-content-between ff-align-items-center\" style={{ padding: '10px 8px' }}>\n <div className=\"ff-d-flex ff-align-items-center ff-gap-2\">\n {icon && <div style={{ display: 'flex', alignItems: 'center' }}>{icon as ReactNode}</div>}\n <span className=\"ff-text-dark\" style={{ fontSize: 14, fontWeight: 500 }}>{title}</span>\n </div>\n <div className=\"node-actions ff-d-flex ff-align-items-center\">\n <div\n role=\"button\" tabIndex={0}\n onClick={(e) => { e.stopPropagation(); onEditNode(id); }}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.stopPropagation(); onEditNode(id); } }}\n >\n <MdOutlineModeEdit size={16} />\n </div>\n <div\n className=\"ff-ms-2\" role=\"button\" tabIndex={0}\n onClick={(e) => { e.stopPropagation(); onDeleteNode(id); }}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.stopPropagation(); onDeleteNode(id); } }}\n >\n <MdDeleteOutline color=\"red\" size={16} />\n </div>\n {infoText && (\n <Tooltip title={infoText} placement=\"right\" arrow>\n <div className=\"ff-ms-2\"><MdInfoOutline color=\"gray\" size={16} /></div>\n </Tooltip>\n )}\n </div>\n </div>\n\n {nodeBody !== 'title-only' && (\n <div\n style={{\n margin: '0 8px 8px',\n padding: 8,\n borderRadius: 4,\n background: '#f8f9fa',\n fontSize: 12,\n textAlign: 'left',\n color: '#212529',\n lineHeight: 1.4,\n }}\n >\n {/* Full custom body override (back-compat) wins; otherwise the ONE\n generic, data-driven body renders every task type. */}\n {descriptor?.renderNode ? (\n descriptor.renderNode(data as Record<string, unknown>)\n ) : (\n <NodeBody\n data={data as Record<string, unknown>}\n descriptor={descriptor as never}\n accent=\"#2563eb\"\n emptyText={messages?.clickEditToConfigure ?? 'Click edit to configure'}\n />\n )}\n </div>\n )}\n </div>\n <Handle type=\"source\" position={Position.Bottom} style={{ opacity: 0 }} />\n </div>\n );\n};\n\nexport default ActionNode;\n","import React from 'react';\nimport { Handle, Position, NodeProps } from 'reactflow';\nimport {\n MdOutlineModeEdit,\n MdDeleteOutline,\n MdInfoOutline,\n MdCheckCircle,\n MdPeople,\n MdArrowForward,\n} from 'react-icons/md';\nimport { Tooltip } from '@mui/material';\nimport { useCanvasHandlers } from '../WorkflowCanvasContext';\nimport BranchRailDecoration, { BranchRailSpec } from './BranchRailDecoration';\n\n/**\n * ApprovalNode — renders an approval-policy slot.\n *\n * Visual layout matches IAM's ApprovalNodeLabel:\n * - Header: yellow check chip + \"Approval Policy\" + edit / delete / info\n * - Policy name (truncated, full name in tooltip)\n * - Up to MAX_VISIBLE_STAGES (2) stage rows, each on a gray bg-light card with:\n * ┌──┐ StageName 👥 Group: <name> / Role: <name> / N approvers\n * │N │ (executionMode chip below if set)\n * └──┘\n * - \"+ N More Stages\" link to overflow into the config drawer\n * - \"No stages configured\" dashed-amber empty state\n *\n * Stage execution mode label is supplied via the optional `executionModeLabel`\n * map on `nodeData` — consumer ships e.g. `{ sequential: 'Sequential', parallel: 'Parallel' }`.\n * Falls back to the raw mode string when absent. Keeps the package i18n-friendly.\n */\n\nconst MAX_VISIBLE_STAGES = 2;\n\ninterface Stage {\n stageName?: string;\n userIds?: string[];\n groupName?: string;\n roleName?: string;\n executionMode?: string;\n isSequential?: boolean;\n}\n\ninterface ApprovalPolicy {\n name?: string;\n policyName?: string;\n executionMode?: string;\n stages?: Stage[];\n}\n\ninterface ApprovalNodeData {\n approvalData?: { policy?: ApprovalPolicy };\n isPreview?: boolean;\n _branchRail?: BranchRailSpec;\n /** Optional execution-mode label map ({ sequential: 'Sequential', parallel: 'Parallel', ... }). */\n executionModeLabel?: Record<string, string>;\n}\n\nfunction resolveExecLabel(\n executionMode: string | undefined,\n isSequential: boolean | undefined,\n labelMap: Record<string, string> | undefined,\n): string | null {\n const raw = executionMode?.toLowerCase() || (isSequential ? 'sequential' : null);\n if (!raw) return null;\n return labelMap?.[raw] ?? raw.charAt(0).toUpperCase() + raw.slice(1);\n}\n\nfunction stageSummary(stage: Stage): { label: string; configured: boolean } {\n const approverCount = Array.isArray(stage.userIds) ? stage.userIds.length : 0;\n const groupName = stage.groupName?.trim() ?? '';\n const roleName = stage.roleName?.trim() ?? '';\n const configured = approverCount > 0 || !!groupName || !!roleName;\n if (groupName) return { label: `Group: ${groupName}`, configured: true };\n if (roleName) return { label: `Role: ${roleName}`, configured: true };\n if (approverCount > 0) {\n return {\n label: `${approverCount} approver${approverCount !== 1 ? 's' : ''}`,\n configured: true,\n };\n }\n return { label: 'Not configured', configured };\n}\n\nconst ApprovalNode = ({ id, data }: NodeProps) => {\n const { onEditNode, onDeleteNode } = useCanvasHandlers();\n const { approvalData, isPreview = false, _branchRail, executionModeLabel } =\n data as ApprovalNodeData;\n\n const policy = approvalData?.policy ?? {};\n const stages = policy.stages ?? [];\n const stageCount = stages.length;\n const visibleStages = stages.slice(0, MAX_VISIBLE_STAGES);\n const remainingStages = stageCount - MAX_VISIBLE_STAGES;\n const policyName = policy.name ?? policy.policyName ?? 'Untitled Policy';\n\n return (\n <div style={{ width: 350, position: 'relative' }}>\n <Handle type=\"target\" position={Position.Top} style={{ opacity: 0 }} />\n <div style={{ border: '1.5px solid #ffe082', borderRadius: 8, background: '#fff', overflow: 'hidden' }}>\n {/* ── Header row ────────────────────────────────────────────── */}\n <div\n className=\"ff-d-flex ff-justify-content-between ff-align-items-center\"\n style={{ padding: '10px 8px 8px' }}\n >\n <div className=\"ff-d-flex ff-align-items-center ff-gap-2\">\n <div\n className=\"ff-d-flex ff-align-items-center ff-justify-content-center ff-rounded\"\n style={{ width: 25, height: 25, background: 'rgba(251,192,45,0.2)' }}\n >\n <MdCheckCircle style={{ color: '#FBC02D' }} size={16} />\n </div>\n <span className=\"ff-fw-medium ff-text-dark\" style={{ fontSize: 14 }}>\n Approval Policy\n </span>\n </div>\n <div className=\"node-actions ff-d-flex ff-align-items-center\">\n {!isPreview && (\n <div\n role=\"button\"\n tabIndex={0}\n style={{ cursor: 'pointer' }}\n onClick={(e) => { e.stopPropagation(); onEditNode(id); }}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.stopPropagation(); onEditNode(id); } }}\n data-testid=\"approval-node-edit-btn\"\n >\n <MdOutlineModeEdit size={16} className=\"ff-text-secondary\" />\n </div>\n )}\n {!isPreview && (\n <div\n className=\"ff-ms-2\"\n role=\"button\"\n tabIndex={0}\n style={{ cursor: 'pointer' }}\n onClick={(e) => { e.stopPropagation(); onDeleteNode(id); }}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.stopPropagation(); onDeleteNode(id); } }}\n data-testid=\"approval-node-delete-btn\"\n >\n <MdDeleteOutline color=\"red\" size={16} />\n </div>\n )}\n <Tooltip\n title=\"This approval policy determines who must approve a request before the workflow continues.\"\n arrow\n placement=\"right\"\n >\n <span className=\"ff-ms-2 ff-d-inline-flex\">\n <MdInfoOutline color=\"gray\" size={16} />\n </span>\n </Tooltip>\n </div>\n </div>\n\n {/* ── Policy name ──────────────────────────────────────────── */}\n <div\n className=\"ff-text-truncate ff-text-dark ff-fw-bold\"\n style={{ margin: '0 10px 8px', fontSize: 13 }}\n title={policyName}\n >\n {policyName}\n </div>\n\n {/* ── Stage list ───────────────────────────────────────────── */}\n <div style={{ margin: '0 10px 10px', display: 'flex', flexDirection: 'column', gap: 8 }}>\n {stages.length === 0 ? (\n <div\n className=\"ff-text-center\"\n style={{\n fontSize: 12,\n color: '#9e9e9e',\n padding: '14px 0',\n borderRadius: 6,\n border: '1px dashed #FEE79A',\n background: '#FFFDE7',\n }}\n >\n No stages configured\n </div>\n ) : (\n <>\n {visibleStages.map((stage, index) => {\n const displayName = stage.stageName?.trim() || `Stage ${index + 1}`;\n const { label: summaryLabel, configured } = stageSummary(stage);\n const execLabel = resolveExecLabel(\n stage.executionMode,\n stage.isSequential,\n executionModeLabel,\n );\n\n return (\n <div\n key={index}\n style={{ background: '#f5f5f5', borderRadius: 6, padding: 8 }}\n >\n <div\n className=\"ff-d-flex ff-align-items-center\"\n style={{ gap: 8 }}\n >\n <div\n className=\"ff-d-flex ff-align-items-center ff-justify-content-center ff-flex-shrink-0\"\n style={{\n width: 28,\n height: 28,\n borderRadius: '50%',\n background: '#f5f5f5b6',\n border: '1px solid #E0E0E0',\n color: '#424242',\n fontSize: 12,\n fontWeight: 700,\n }}\n >\n {index + 1}\n </div>\n <div\n className=\"ff-text-dark ff-text-truncate\"\n style={{ fontSize: 12, fontWeight: 700, marginRight: 'auto' }}\n >\n {displayName}\n </div>\n <div\n className={`ff-d-flex ff-align-items-center ff-flex-shrink-0 ${configured ? 'ff-text-dark' : 'ff-text-muted'}`}\n style={{ gap: 4, fontSize: 12 }}\n >\n <MdPeople\n size={15}\n style={{ color: configured ? '#5D4037' : '#9E9E9E' }}\n />\n {summaryLabel}\n </div>\n </div>\n\n {execLabel && (\n <div\n className=\"ff-d-flex ff-align-items-center\"\n style={{\n gap: 4,\n fontSize: 11,\n color: '#1a73e8',\n marginTop: 4,\n paddingLeft: 36, // align under the stage name (28px circle + 8px gap)\n }}\n >\n <MdArrowForward size={11} />\n {execLabel}\n </div>\n )}\n </div>\n );\n })}\n\n {remainingStages > 0 && (\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n <div\n className=\"ff-text-primary\"\n style={{\n fontSize: 12,\n marginTop: 4,\n cursor: isPreview ? 'default' : 'pointer',\n color: '#1976d2',\n }}\n role={isPreview ? undefined : 'button'}\n tabIndex={isPreview ? undefined : 0}\n onClick={(e) => {\n if (isPreview) return;\n e.stopPropagation();\n onEditNode(id);\n }}\n onKeyDown={(e) => {\n if (isPreview) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.stopPropagation();\n onEditNode(id);\n }\n }}\n >\n + {remainingStages} More Stage{remainingStages > 1 ? 's' : ''}\n </div>\n )}\n </>\n )}\n </div>\n </div>\n <Handle type=\"source\" position={Position.Bottom} style={{ opacity: 0 }} />\n {_branchRail && <BranchRailDecoration rail={_branchRail} cardWidth={350} />}\n </div>\n );\n};\n\nexport default ApprovalNode;\n","import React from 'react';\r\nimport { Handle, Position, NodeProps } from 'reactflow';\r\nimport { MdOutlineModeEdit, MdDeleteOutline, MdSchedule } from 'react-icons/md';\r\nimport { useCanvasHandlers } from '../WorkflowCanvasContext';\r\n\r\ninterface DelayNodeData {\r\n duration?: number;\r\n unit?: 'minutes' | 'hours' | 'days';\r\n}\r\n\r\nconst DelayNode = ({ id, data }: NodeProps) => {\r\n const { onEditNode, onDeleteNode } = useCanvasHandlers();\r\n const { duration, unit } = data as DelayNodeData;\r\n const configured = duration !== undefined && duration !== null && unit;\r\n const displayText = configured ? `Wait ${duration} ${unit}` : 'Not configured';\r\n\r\n return (\r\n <div style={{ width: 350 }}>\r\n <Handle type=\"target\" position={Position.Top} style={{ opacity: 0 }} />\r\n <div style={{ border: '1.5px solid #b0bec5', borderRadius: 8, background: '#fff' }}>\r\n <div className=\"ff-d-flex ff-justify-content-between ff-align-items-center ff-mx-2 ff-mt-2 ff-mb-1\">\r\n <div className=\"ff-d-flex ff-align-items-center ff-gap-2\">\r\n <div className=\"ff-d-flex ff-align-items-center ff-justify-content-center ff-rounded\" style={{ width: 25, height: 25, background: 'rgba(33,150,243,0.1)' }}>\r\n <MdSchedule size={16} color=\"#1976d2\" />\r\n </div>\r\n <span className=\"ff-fw-medium ff-text-dark\" style={{ fontSize: 14 }}>Delay</span>\r\n </div>\r\n <div className=\"node-actions ff-d-flex ff-align-items-center\">\r\n <div\r\n role=\"button\" tabIndex={0}\r\n onClick={(e) => { e.stopPropagation(); onEditNode(id); }}\r\n onKeyDown={(e) => { if (e.key === 'Enter') { e.stopPropagation(); onEditNode(id); } }}\r\n >\r\n <MdOutlineModeEdit size={16} />\r\n </div>\r\n <div\r\n className=\"ff-ms-2\" role=\"button\" tabIndex={0}\r\n onClick={(e) => { e.stopPropagation(); onDeleteNode(id); }}\r\n onKeyDown={(e) => { if (e.key === 'Enter') { e.stopPropagation(); onDeleteNode(id); } }}\r\n >\r\n <MdDeleteOutline color=\"red\" size={16} />\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"ff-mx-2 ff-mb-2 ff-p-2 ff-rounded\" style={{ background: '#fafafa', fontSize: 12 }}>\r\n <span className={configured ? 'ff-text-dark ff-fw-medium' : 'ff-text-muted'}>{displayText}</span>\r\n </div>\r\n </div>\r\n <Handle type=\"source\" position={Position.Bottom} style={{ opacity: 0 }} />\r\n </div>\r\n );\r\n};\r\n\r\nexport default DelayNode;\r\n","import React from 'react';\nimport { Handle, Position, NodeProps } from 'reactflow';\nimport { MdOutlineModeEdit, MdDeleteOutline, MdNotifications, MdEmail, MdSms, MdWebhook } from 'react-icons/md';\nimport { useCanvasHandlers } from '../WorkflowCanvasContext';\nimport { NODE_WIDTH } from '../canvasTokens';\n\ninterface NotificationNodeData {\n channel?: string;\n emailTo?: string[];\n emailSubject?: string;\n slackChannel?: string;\n slackMessage?: string;\n teamsMessage?: string;\n smsTo?: string;\n inAppRecipient?: string;\n inAppTitle?: string;\n webhookUrl?: string;\n // legacy shape\n recipient?: string;\n subject?: string;\n}\n\ninterface ChannelMeta {\n label: string;\n bg: string;\n color: string;\n iconType: React.ElementType;\n}\n\nconst CHANNEL_META: Record<string, ChannelMeta> = {\n email: { label: 'Email', bg: '#e3f2fd', color: '#1565c0', iconType: MdEmail },\n slack: { label: 'Slack', bg: '#e8f5e9', color: '#2e7d32', iconType: MdNotifications },\n teams: { label: 'MS Teams', bg: '#ede7f6', color: '#4527a0', iconType: MdNotifications },\n sms: { label: 'SMS', bg: '#fce4ec', color: '#880e4f', iconType: MdSms },\n 'in-app': { label: 'In-App', bg: '#fff3e0', color: '#e65100', iconType: MdNotifications },\n webhook: { label: 'Webhook', bg: '#f3e5f5', color: '#6a1b9a', iconType: MdWebhook },\n};\n\nconst FALLBACK_META: ChannelMeta = {\n label: 'Notification',\n bg: 'rgba(156,39,176,0.1)',\n color: '#7b1fa2',\n iconType: MdNotifications,\n};\n\nfunction getRecipientPreview(data: NotificationNodeData): string | null {\n switch (data.channel) {\n case 'email': return data.emailTo?.join(', ') ?? data.recipient ?? null;\n case 'slack': return data.slackChannel ?? null;\n case 'teams': return data.teamsMessage ? 'Message configured' : null;\n case 'sms': return data.smsTo ?? null;\n case 'in-app': return data.inAppRecipient ?? null;\n case 'webhook': return data.webhookUrl ?? null;\n default: return data.recipient ?? null;\n }\n}\n\nfunction getSubjectPreview(data: NotificationNodeData): string | null {\n switch (data.channel) {\n case 'email': return data.emailSubject ?? data.subject ?? null;\n case 'slack': {\n const msg = data.slackMessage;\n return msg ? (msg.length > 60 ? `${msg.slice(0, 60)}…` : msg) : null;\n }\n case 'in-app': return data.inAppTitle ?? null;\n default: return data.subject ?? null;\n }\n}\n\nconst NotificationNode = ({ id, data }: NodeProps) => {\n const { onEditNode, onDeleteNode } = useCanvasHandlers();\n const d = data as NotificationNodeData;\n const meta = (d.channel && CHANNEL_META[d.channel]) ? CHANNEL_META[d.channel] : FALLBACK_META;\n const recipient = getRecipientPreview(d);\n const subjectLine = getSubjectPreview(d);\n const configured = !!(d.channel && recipient);\n const IconComponent = meta.iconType;\n\n return (\n <div style={{ width: NODE_WIDTH }}>\n <Handle type=\"target\" position={Position.Top} style={{ opacity: 0 }} />\n <div style={{ border: '1.5px solid #b0bec5', borderRadius: 8, background: '#fff' }}>\n <div className=\"ff-d-flex ff-justify-content-between ff-align-items-center\" style={{ padding: '10px 6px' }}>\n <div className=\"ff-d-flex ff-align-items-center ff-gap-2\">\n <div className=\"ff-d-flex ff-align-items-center ff-justify-content-center ff-rounded\" style={{ width: 25, height: 25, background: meta.bg }}>\n <IconComponent size={16} color={meta.color} />\n </div>\n <span className=\"ff-fw-medium ff-text-dark\" style={{ fontSize: 14 }}>\n {d.channel ? `${meta.label} Notification` : 'Notification'}\n </span>\n </div>\n <div className=\"node-actions ff-d-flex ff-align-items-center\">\n <div\n role=\"button\" tabIndex={0}\n onClick={(e) => { e.stopPropagation(); onEditNode(id); }}\n onKeyDown={(e: React.KeyboardEvent<HTMLDivElement>) => { if (e.key === 'Enter' || e.key === ' ') { e.stopPropagation(); onEditNode(id); } }}\n >\n <MdOutlineModeEdit size={16} />\n </div>\n <div\n className=\"ff-ms-2\" role=\"button\" tabIndex={0}\n onClick={(e) => { e.stopPropagation(); onDeleteNode(id); }}\n onKeyDown={(e: React.KeyboardEvent<HTMLDivElement>) => { if (e.key === 'Enter' || e.key === ' ') { e.stopPropagation(); onDeleteNode(id); } }}\n >\n <MdDeleteOutline color=\"red\" size={16} />\n </div>\n </div>\n </div>\n\n <div style={{ margin: '0 6px 10px', padding: '10px 12px', borderRadius: 6, background: '#fafafa', fontSize: 12 }}>\n {configured ? (\n <div className=\"ff-d-flex ff-flex-column ff-gap-1\">\n <div className=\"ff-d-flex ff-align-items-center ff-gap-2\">\n <span className=\"ff-px-2 ff-py-1 ff-rounded\" style={{ fontSize: 10, background: meta.bg, color: meta.color, fontWeight: 600, flexShrink: 0 }}>\n {meta.label}\n </span>\n <span className=\"ff-text-dark ff-text-truncate\" style={{ maxWidth: 220 }}>{recipient}</span>\n </div>\n {subjectLine && <span className=\"ff-text-muted ff-text-truncate\" style={{ maxWidth: 280 }}>{subjectLine}</span>}\n </div>\n ) : (\n <span className=\"ff-text-muted\">Not configured</span>\n )}\n </div>\n </div>\n <Handle type=\"source\" position={Position.Bottom} style={{ opacity: 0 }} />\n </div>\n );\n};\n\nexport default NotificationNode;\n","import React from 'react';\nimport { Handle, Position, NodeProps } from 'reactflow';\nimport { MdOutlineModeEdit, MdContentCopy, MdWebhook } from 'react-icons/md';\nimport { Tooltip } from '@mui/material';\nimport { useCanvasHandlers } from '../WorkflowCanvasContext';\nimport { NODE_WIDTH } from '../canvasTokens';\n\ninterface WebhookTriggerNodeData {\n label?: string;\n endpointUrl?: string;\n authMethod?: 'none' | 'api-key' | 'hmac';\n source?: string;\n}\n\nconst AUTH_LABELS: Record<string, string> = {\n 'api-key': 'API Key',\n hmac: 'HMAC',\n};\n\nconst WebhookTriggerNode = ({ data }: NodeProps) => {\n const { onClickAddTrigger } = useCanvasHandlers();\n const { label = 'Webhook Trigger', endpointUrl, authMethod, source } = data as WebhookTriggerNodeData;\n\n const handleEdit = (e: React.MouseEvent | React.KeyboardEvent) => {\n e.stopPropagation();\n onClickAddTrigger();\n };\n\n const handleCopy = (e: React.MouseEvent | React.KeyboardEvent) => {\n e.stopPropagation();\n if (endpointUrl) navigator.clipboard.writeText(endpointUrl).catch(() => undefined);\n };\n\n return (\n <div style={{ width: NODE_WIDTH }}>\n <Handle type=\"target\" position={Position.Top} style={{ opacity: 0 }} />\n <div style={{ border: '1.5px solid #90caf9', borderRadius: 8, background: '#fff', overflow: 'hidden' }}>\n <div className=\"ff-d-flex ff-justify-content-between ff-align-items-center\" style={{ padding: '10px 6px' }}>\n <div className=\"ff-d-flex ff-align-items-center ff-gap-2\">\n <div style={{ width: 28, height: 28, borderRadius: 6, background: 'rgba(33,150,243,0.1)', display: 'flex', alignItems: 'center', justifyContent: 'center', flexShrink: 0 }}>\n <MdWebhook size={16} color=\"#1565c0\" />\n </div>\n <span style={{ fontSize: 13, fontWeight: 600, color: '#212121' }}>Webhook Trigger</span>\n </div>\n <div\n role=\"button\"\n tabIndex={0}\n onClick={handleEdit}\n onKeyDown={(e: React.KeyboardEvent<HTMLDivElement>) => { if (e.key === 'Enter' || e.key === ' ') handleEdit(e); }}\n className=\"ff-d-flex ff-align-items-center\"\n style={{ paddingRight: 4, cursor: 'pointer' }}\n >\n <MdOutlineModeEdit size={16} color=\"#555\" />\n </div>\n </div>\n\n <div style={{ margin: '0 6px 10px', padding: '10px 12px', borderRadius: 6, background: '#e3f2fd', border: '1px solid #90caf9' }}>\n <div className=\"ff-d-flex ff-align-items-center ff-flex-wrap ff-gap-2 ff-mb-1\">\n <span style={{ fontSize: 12, color: '#1565c0', fontWeight: 600 }}>{label}</span>\n {source && (\n <span className=\"ff-px-2 ff-py-1 ff-rounded\" style={{ fontSize: 11, background: '#fff', border: '1px solid #90caf9', color: '#1565c0' }}>\n {source}\n </span>\n )}\n {authMethod && authMethod !== 'none' && AUTH_LABELS[authMethod] && (\n <span className=\"ff-px-2 ff-py-1 ff-rounded\" style={{ fontSize: 10, background: '#1565c0', color: '#fff', fontWeight: 600 }}>\n {AUTH_LABELS[authMethod]}\n </span>\n )}\n </div>\n {endpointUrl && (\n <div className=\"ff-d-flex ff-align-items-center ff-gap-1\" style={{ marginTop: 4 }}>\n <span style={{ fontSize: 10, color: '#1565c0', fontFamily: 'monospace', flex: 1, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n {endpointUrl}\n </span>\n <Tooltip title=\"Copy URL\" placement=\"top\" arrow>\n <div\n role=\"button\"\n tabIndex={0}\n onClick={handleCopy}\n onKeyDown={(e: React.KeyboardEvent<HTMLDivElement>) => { if (e.key === 'Enter' || e.key === ' ') handleCopy(e); }}\n style={{ cursor: 'pointer', flexShrink: 0 }}\n >\n <MdContentCopy size={12} color=\"#1565c0\" />\n </div>\n </Tooltip>\n </div>\n )}\n </div>\n </div>\n <Handle type=\"source\" position={Position.Bottom} style={{ opacity: 0 }} />\n </div>\n );\n};\n\nexport default WebhookTriggerNode;\n","import React, { ReactNode } from 'react';\nimport { Handle, Position, NodeProps } from 'reactflow';\nimport { MdOutlineModeEdit, MdDeleteOutline, MdHttp } from 'react-icons/md';\nimport { useCanvasHandlers } from '../WorkflowCanvasContext';\nimport { NODE_WIDTH, HTTP_METHOD_STYLE } from '../canvasTokens';\n\ninterface RestApiNodeData {\n method?: string;\n url?: string;\n descriptorType?: string;\n}\n\nconst RestApiNode = ({ id, data }: NodeProps) => {\n const { onEditNode, onDeleteNode, nodeRegistry } = useCanvasHandlers();\n const { method, url, descriptorType } = data as RestApiNodeData;\n const icon: ReactNode = descriptorType\n ? (nodeRegistry?.forType(descriptorType)?.icon as ReactNode)\n : <MdHttp size={16} color=\"#546e7a\" />;\n const configured = !!(method && url);\n const methodKey = method?.toUpperCase() ?? '';\n const methodStyle = HTTP_METHOD_STYLE[methodKey] ?? null;\n\n return (\n <div style={{ width: NODE_WIDTH }}>\n <Handle type=\"target\" position={Position.Top} style={{ opacity: 0 }} />\n <div style={{ border: '1.5px solid #b0bec5', borderRadius: 8, background: '#fff' }}>\n <div className=\"ff-d-flex ff-justify-content-between ff-align-items-center\" style={{ padding: '10px 6px' }}>\n <div className=\"ff-d-flex ff-align-items-center ff-gap-2\">\n <div style={{ width: 25, height: 25, display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n {icon as ReactNode}\n </div>\n <span className=\"ff-fw-medium ff-text-dark\" style={{ fontSize: 14 }}>REST API Call</span>\n </div>\n <div className=\"node-actions ff-d-flex ff-align-items-center\">\n <div\n role=\"button\" tabIndex={0}\n onClick={(e) => { e.stopPropagation(); onEditNode(id); }}\n onKeyDown={(e: React.KeyboardEvent<HTMLDivElement>) => { if (e.key === 'Enter' || e.key === ' ') { e.stopPropagation(); onEditNode(id); } }}\n >\n <MdOutlineModeEdit size={16} />\n </div>\n <div\n className=\"ff-ms-2\" role=\"button\" tabIndex={0}\n onClick={(e) => { e.stopPropagation(); onDeleteNode(id); }}\n onKeyDown={(e: React.KeyboardEvent<HTMLDivElement>) => { if (e.key === 'Enter' || e.key === ' ') { e.stopPropagation(); onDeleteNode(id); } }}\n >\n <MdDeleteOutline color=\"red\" size={16} />\n </div>\n </div>\n </div>\n\n <div style={{ margin: '0 6px 10px', padding: '10px 12px', borderRadius: 6, background: '#fafafa', fontSize: 12 }}>\n {configured ? (\n <div className=\"ff-d-flex ff-align-items-center ff-gap-2\">\n {methodStyle && (\n <span style={{ fontSize: 10, fontWeight: 700, padding: '2px 6px', borderRadius: 4, background: methodStyle.bg, color: methodStyle.color, flexShrink: 0 }}>\n {methodKey}\n </span>\n )}\n <span className=\"ff-text-dark ff-text-truncate\" style={{ fontFamily: 'monospace', fontSize: 11 }} title={url}>{url}</span>\n </div>\n ) : (\n <span className=\"ff-text-muted\">Not configured</span>\n )}\n </div>\n </div>\n <Handle type=\"source\" position={Position.Bottom} style={{ opacity: 0 }} />\n </div>\n );\n};\n\nexport default RestApiNode;\n","import React from 'react';\nimport { Handle, Position, NodeProps } from 'reactflow';\nimport { MdOutlineModeEdit, MdDeleteOutline, MdCallSplit } from 'react-icons/md';\nimport { useCanvasHandlers } from '../WorkflowCanvasContext';\nimport { NODE_WIDTH, BRANCH_PALETTE } from '../canvasTokens';\n\ninterface BranchCondition {\n field: string;\n operator: string;\n value?: string;\n logicalOperator?: string;\n}\n\ninterface BranchConfig {\n key: string;\n label: string;\n conditions?: BranchCondition[];\n}\n\ninterface ConditionBranchNodeData {\n title?: string;\n branchConfigs?: BranchConfig[];\n defaultBranch?: string;\n}\n\nconst OPERATOR_LABELS: Record<string, string> = {\n eq: '=', neq: '≠', gt: '>', gte: '≥', lt: '<', lte: '≤',\n contains: 'contains', startsWith: 'starts with', endsWith: 'ends with',\n isEmpty: 'is empty', isNotEmpty: 'is not empty',\n};\n\nconst ConditionBranchNode = ({ id, data }: NodeProps) => {\n const { onEditNode, onDeleteNode } = useCanvasHandlers();\n const { title = 'Condition Branch', branchConfigs = [], defaultBranch } = data as ConditionBranchNodeData;\n const configured = branchConfigs.length > 0;\n\n return (\n <div style={{ width: NODE_WIDTH }}>\n <Handle type=\"target\" position={Position.Top} style={{ opacity: 0 }} />\n <div style={{ border: '1.5px solid #b39ddb', borderRadius: 8, background: '#fff' }}>\n <div className=\"ff-d-flex ff-justify-content-between ff-align-items-center\" style={{ padding: '10px 6px' }}>\n <div className=\"ff-d-flex ff-align-items-center ff-gap-2\">\n <div style={{ width: 25, height: 25, borderRadius: 6, background: 'rgba(103,58,183,0.1)', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <MdCallSplit size={16} color=\"#512da8\" />\n </div>\n <span className=\"ff-fw-medium ff-text-dark\" style={{ fontSize: 14 }}>{title}</span>\n </div>\n <div className=\"node-actions ff-d-flex ff-align-items-center\">\n <div\n role=\"button\" tabIndex={0}\n onClick={(e) => { e.stopPropagation(); onEditNode(id); }}\n onKeyDown={(e: React.KeyboardEvent<HTMLDivElement>) => { if (e.key === 'Enter' || e.key === ' ') { e.stopPropagation(); onEditNode(id); } }}\n >\n <MdOutlineModeEdit size={16} />\n </div>\n <div\n className=\"ff-ms-2\" role=\"button\" tabIndex={0}\n onClick={(e) => { e.stopPropagation(); onDeleteNode(id); }}\n onKeyDown={(e: React.KeyboardEvent<HTMLDivElement>) => { if (e.key === 'Enter' || e.key === ' ') { e.stopPropagation(); onDeleteNode(id); } }}\n >\n <MdDeleteOutline color=\"red\" size={16} />\n </div>\n </div>\n </div>\n\n <div style={{ margin: '0 6px 10px', padding: '10px 12px', borderRadius: 6, background: '#fafafa', fontSize: 12 }}>\n {configured ? (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4 }}>\n {branchConfigs.map((branch, idx) => {\n const palette = BRANCH_PALETTE[idx % BRANCH_PALETTE.length];\n const firstCondition = branch.conditions?.[0];\n const extraCount = (branch.conditions?.length ?? 0) - 1;\n return (\n <div key={branch.key} style={{ display: 'flex', alignItems: 'center', gap: 6 }}>\n <span style={{ fontSize: 10, fontWeight: 600, padding: '2px 7px', borderRadius: 10, background: palette.bg, color: palette.color, flexShrink: 0 }}>\n {branch.label || branch.key}\n </span>\n {firstCondition ? (\n <span style={{ fontSize: 11, color: '#616161', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n {firstCondition.field} {OPERATOR_LABELS[firstCondition.operator] ?? firstCondition.operator}\n {firstCondition.value ? ` ${firstCondition.value}` : ''}\n {extraCount > 0 ? ` +${extraCount} more` : ''}\n </span>\n ) : (\n <span style={{ fontSize: 11, color: '#9e9e9e' }}>No conditions yet</span>\n )}\n </div>\n );\n })}\n {defaultBranch && (\n <div style={{ display: 'flex', alignItems: 'center', gap: 6, marginTop: 2 }}>\n <span style={{ fontSize: 10, fontWeight: 600, padding: '2px 7px', borderRadius: 10, background: '#f5f5f5', color: '#757575', flexShrink: 0 }}>\n Default\n </span>\n <span style={{ fontSize: 11, color: '#9e9e9e' }}>fallback path</span>\n </div>\n )}\n </div>\n ) : (\n <span className=\"ff-text-muted\">Not configured — click edit to add branches</span>\n )}\n </div>\n </div>\n <Handle type=\"source\" position={Position.Bottom} style={{ opacity: 0 }} />\n </div>\n );\n};\n\nexport default ConditionBranchNode;\n","import React, { ReactNode } from 'react';\nimport { Handle, Position, NodeProps } from 'reactflow';\nimport { MdOutlineModeEdit, MdDeleteOutline, MdAccountTree, MdOpenInNew } from 'react-icons/md';\nimport { useCanvasHandlers } from '../WorkflowCanvasContext';\nimport { NODE_WIDTH } from '../canvasTokens';\n\ninterface SubWorkflowNodeData {\n title?: string;\n workflowId?: string;\n workflowLabel?: string;\n descriptorType?: string;\n onPreview?: (workflowId: string) => void;\n}\n\nconst SubWorkflowNode = ({ id, data }: NodeProps) => {\n const { onEditNode, onDeleteNode, nodeRegistry } = useCanvasHandlers();\n const { title = 'Sub-Workflow', workflowId, workflowLabel, descriptorType, onPreview } = data as SubWorkflowNodeData;\n const icon: ReactNode = descriptorType\n ? (nodeRegistry?.forType(descriptorType)?.icon as ReactNode)\n : <MdAccountTree size={16} color=\"#00695c\" />;\n const configured = !!workflowId;\n\n const handlePreview = (e: React.MouseEvent | React.KeyboardEvent) => {\n e.stopPropagation();\n if (workflowId && onPreview) onPreview(workflowId);\n };\n\n return (\n <div style={{ width: NODE_WIDTH }}>\n <Handle type=\"target\" position={Position.Top} style={{ opacity: 0 }} />\n <div style={{ border: '1.5px solid #80cbc4', borderRadius: 8, background: '#fff' }}>\n <div className=\"ff-d-flex ff-justify-content-between ff-align-items-center\" style={{ padding: '10px 6px' }}>\n <div className=\"ff-d-flex ff-align-items-center ff-gap-2\">\n <div style={{ width: 25, height: 25, borderRadius: 6, background: 'rgba(0,137,123,0.1)', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n {icon as ReactNode}\n </div>\n <span className=\"ff-fw-medium ff-text-dark\" style={{ fontSize: 14 }}>{title}</span>\n </div>\n <div className=\"node-actions ff-d-flex ff-align-items-center\">\n <div\n role=\"button\" tabIndex={0}\n onClick={(e) => { e.stopPropagation(); onEditNode(id); }}\n onKeyDown={(e: React.KeyboardEvent<HTMLDivElement>) => { if (e.key === 'Enter' || e.key === ' ') { e.stopPropagation(); onEditNode(id); } }}\n >\n <MdOutlineModeEdit size={16} />\n </div>\n <div\n className=\"ff-ms-2\" role=\"button\" tabIndex={0}\n onClick={(e) => { e.stopPropagation(); onDeleteNode(id); }}\n onKeyDown={(e: React.KeyboardEvent<HTMLDivElement>) => { if (e.key === 'Enter' || e.key === ' ') { e.stopPropagation(); onDeleteNode(id); } }}\n >\n <MdDeleteOutline color=\"red\" size={16} />\n </div>\n </div>\n </div>\n\n <div style={{ margin: '0 6px 10px', padding: '10px 12px', borderRadius: 6, background: configured ? '#e0f2f1' : '#fafafa', fontSize: 12, border: configured ? '1px solid #b2dfdb' : 'none' }}>\n {configured ? (\n <div className=\"ff-d-flex ff-align-items-center ff-justify-content-between\">\n <div className=\"ff-d-flex ff-flex-column ff-gap-1\">\n <span style={{ fontSize: 12, fontWeight: 600, color: '#00695c' }}>\n {workflowLabel || workflowId}\n </span>\n <span style={{ fontSize: 10, color: '#80cbc4', fontFamily: 'monospace' }}>ID: {workflowId}</span>\n </div>\n {onPreview && (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={handlePreview}\n onKeyDown={(e: React.KeyboardEvent<HTMLDivElement>) => { if (e.key === 'Enter' || e.key === ' ') handlePreview(e); }}\n style={{ cursor: 'pointer', display: 'flex', alignItems: 'center', gap: 3, fontSize: 11, color: '#00897b' }}\n >\n <MdOpenInNew size={13} />\n Preview\n </div>\n )}\n </div>\n ) : (\n <span className=\"ff-text-muted\">Not configured — select a workflow</span>\n )}\n </div>\n </div>\n <Handle type=\"source\" position={Position.Bottom} style={{ opacity: 0 }} />\n </div>\n );\n};\n\nexport default SubWorkflowNode;\n","import { NodeTypes } from 'reactflow';\r\nimport StartNode from './StartNode';\r\nimport EndNode from './EndNode';\r\nimport AddTriggerNode from './AddTriggerNode';\r\nimport AddStepNode from './AddStepNode';\r\nimport TriggerNode from './TriggerNode';\r\nimport EventNode from './EventNode';\r\nimport FilterNode from './FilterNode';\r\nimport ActionNode from './ActionNode';\r\nimport ApprovalNode from './ApprovalNode';\r\nimport DelayNode from './DelayNode';\r\nimport NotificationNode from './NotificationNode';\r\nimport WebhookTriggerNode from './WebhookTriggerNode';\r\nimport RestApiNode from './RestApiNode';\r\nimport ConditionBranchNode from './ConditionBranchNode';\r\nimport SubWorkflowNode from './SubWorkflowNode';\r\n\r\nexport const builtInNodeTypes: NodeTypes = {\r\n startNode: StartNode,\r\n endNode: EndNode,\r\n addTriggerNode: AddTriggerNode,\r\n addStepNode: AddStepNode,\r\n triggerNode: TriggerNode,\r\n eventNode: EventNode,\r\n filterNode: FilterNode,\r\n actionNode: ActionNode,\r\n approvalNode: ApprovalNode,\r\n delayNode: DelayNode,\r\n notificationNode: NotificationNode,\r\n webhookTriggerNode: WebhookTriggerNode,\r\n restApiNode: RestApiNode,\r\n conditionBranchNode: ConditionBranchNode,\r\n subWorkflowNode: SubWorkflowNode,\r\n};\r\n\r\nexport { StartNode, EndNode, AddTriggerNode, AddStepNode, TriggerNode, EventNode, FilterNode, ActionNode, ApprovalNode, DelayNode, NotificationNode, WebhookTriggerNode, RestApiNode, ConditionBranchNode, SubWorkflowNode };\r\n","import React from 'react';\r\nimport { getStraightPath, BaseEdge, EdgeProps } from 'reactflow';\r\nimport './EdgeWithPlusLabel.scss';\r\n\r\nconst R = 11.5;\r\nconst STROKE = 2;\r\nconst PLUS_HALF = 6;\r\nconst PILL_WIDTH = 40;\r\nconst PILL_HEIGHT = 20;\r\nconst PILL_R = 4;\r\n\r\nexport interface EdgeWithPlusLabelData {\r\n label?: string;\r\n onAddStepClick?: (sourceNodeId: string, context: AddStepContext) => void;\r\n referenceNodeType?: string;\r\n stepVisibility?: unknown;\r\n}\r\n\r\nexport interface AddStepContext {\r\n edgeId: string;\r\n nodeId: string;\r\n sourceNodeId: string;\r\n targetNodeId: string;\r\n position: 'between';\r\n referenceNodeId: string;\r\n referenceNodeType?: string;\r\n stepVisibility?: unknown;\r\n // branch context — set when this edge is inside a filter branch\r\n filterId?: string;\r\n branch?: string;\r\n}\r\n\r\nconst EdgeWithPlusLabel = ({\r\n id: edgeId,\r\n sourceX,\r\n sourceY,\r\n targetX,\r\n targetY,\r\n sourcePosition,\r\n targetPosition,\r\n source,\r\n target,\r\n data,\r\n}: EdgeProps<EdgeWithPlusLabelData>) => {\r\n const [edgePath, labelX, labelY] = getStraightPath({\r\n sourceX,\r\n sourceY,\r\n targetX,\r\n targetY,\r\n });\r\n\r\n const edgeLabel = data?.label;\r\n const isPass = edgeLabel === 'Pass';\r\n const showLabel = isPass || edgeLabel === 'Fail';\r\n\r\n const oneThirdX = sourceX + (targetX - sourceX) / 3;\r\n const oneThirdY = sourceY + (targetY - sourceY) / 3;\r\n const twoThirdsX = sourceX + (2 * (targetX - sourceX)) / 3;\r\n const twoThirdsY = sourceY + (2 * (targetY - sourceY)) / 3;\r\n\r\n const handleAddStepClick = data?.onAddStepClick;\r\n\r\n const handleClick = (e: React.MouseEvent | React.KeyboardEvent) => {\r\n e.stopPropagation();\r\n if (typeof handleAddStepClick !== 'function') return;\r\n const context: AddStepContext = {\r\n edgeId,\r\n nodeId: source,\r\n sourceNodeId: source,\r\n targetNodeId: target,\r\n position: 'between',\r\n referenceNodeId: source,\r\n referenceNodeType: data?.referenceNodeType,\r\n stepVisibility: data?.stepVisibility,\r\n };\r\n handleAddStepClick(source, context);\r\n };\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent) => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n handleClick(e);\r\n }\r\n };\r\n\r\n const PlusContent = () => (\r\n <>\r\n <g className=\"plus-icon-container\">\r\n <circle r={R} className=\"edge-plus-circle\" />\r\n <line x1={0} y1={-PLUS_HALF} x2={0} y2={PLUS_HALF} strokeWidth={STROKE} strokeLinecap=\"round\" className=\"plus-line\" />\r\n <line x1={-PLUS_HALF} y1={0} x2={PLUS_HALF} y2={0} strokeWidth={STROKE} strokeLinecap=\"round\" className=\"plus-line\" />\r\n </g>\r\n <g className=\"edge-plus-tooltip\" transform=\"translate(18, 0)\">\r\n <rect x={0} y={-10} width={65} height={20} rx={4} className=\"tooltip-bg\" />\r\n <path d=\"M0 -4 L-4 0 L0 4 Z\" className=\"tooltip-bg\" />\r\n <text x={32} y={0} textAnchor=\"middle\" dominantBaseline=\"central\" fill=\"white\" style={{ fontSize: 10, fontWeight: 600, pointerEvents: 'none' }}>\r\n Add Step\r\n </text>\r\n </g>\r\n </>\r\n );\r\n\r\n const plusProps = handleAddStepClick ? {\r\n onClick: handleClick,\r\n onKeyDown: handleKeyDown,\r\n role: 'button' as const,\r\n tabIndex: 0,\r\n style: { cursor: 'pointer', pointerEvents: 'all' as const },\r\n } : {\r\n style: { cursor: 'default', pointerEvents: 'all' as const },\r\n };\r\n\r\n return (\r\n <g className=\"edge-with-plus-wrapper\">\r\n <BaseEdge id={edgeId} path={edgePath} />\r\n {showLabel ? (\r\n <>\r\n <g transform={`translate(${oneThirdX}, ${oneThirdY})`}>\r\n <rect x={-PILL_WIDTH / 2} y={-PILL_HEIGHT / 2} width={PILL_WIDTH} height={PILL_HEIGHT} rx={PILL_R} ry={PILL_R} fill={isPass ? '#ADE6C5' : '#FDBFBF'} />\r\n <text textAnchor=\"middle\" dominantBaseline=\"central\" fill={isPass ? '#1DBF60' : '#C50000'} style={{ fontSize: 12, fontWeight: 500 }}>\r\n {edgeLabel}\r\n </text>\r\n </g>\r\n <g className=\"nodrag nopan edge-plus-svg\" transform={`translate(${twoThirdsX}, ${twoThirdsY})`} data-testid=\"plus-node-icon\" {...plusProps}>\r\n <PlusContent />\r\n </g>\r\n </>\r\n ) : (\r\n <g className=\"nodrag nopan edge-plus-svg\" transform={`translate(${labelX}, ${labelY})`} data-testid=\"plus-node-icon\" {...plusProps}>\r\n <PlusContent />\r\n </g>\r\n )}\r\n </g>\r\n );\r\n};\r\n\r\nexport default EdgeWithPlusLabel;\r\n","import React from \"react\";\r\nimport { getStraightPath, BaseEdge, EdgeProps } from \"reactflow\";\r\nimport { AddStepContext } from \"./EdgeWithPlusLabel\";\r\nimport \"./EdgeWithPlusLabel.scss\";\r\n\r\nconst R = 11.5;\r\nconst STROKE = 2;\r\nconst PLUS_HALF = 6;\r\n\r\nexport interface PlusEdgeData {\r\n onAddStepClick?: (sourceNodeId: string, context: AddStepContext) => void;\r\n referenceNodeType?: string;\r\n stepVisibility?: unknown;\r\n filterId?: string;\r\n branch?: string;\r\n}\r\n\r\nconst PlusEdge = ({\r\n id,\r\n sourceX,\r\n sourceY,\r\n targetX,\r\n targetY,\r\n source,\r\n target,\r\n data,\r\n}: EdgeProps<PlusEdgeData>) => {\r\n const [edgePath, labelX, labelY] = getStraightPath({\r\n sourceX,\r\n sourceY,\r\n targetX,\r\n targetY,\r\n });\r\n\r\n const handleAddStepClick = data?.onAddStepClick;\r\n\r\n const handleClick = (e: React.MouseEvent | React.KeyboardEvent) => {\r\n e.stopPropagation();\r\n if (typeof handleAddStepClick !== \"function\") return;\r\n handleAddStepClick(source, {\r\n edgeId: id,\r\n nodeId: source,\r\n sourceNodeId: source,\r\n targetNodeId: target,\r\n position: \"between\",\r\n referenceNodeId: source,\r\n referenceNodeType: data?.referenceNodeType,\r\n stepVisibility: data?.stepVisibility,\r\n filterId: data?.filterId,\r\n branch: data?.branch,\r\n });\r\n };\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent) => {\r\n if (e.key === \"Enter\" || e.key === \" \") {\r\n e.preventDefault();\r\n handleClick(e);\r\n }\r\n };\r\n\r\n return (\r\n <g className=\"edge-with-plus-wrapper\">\r\n <BaseEdge id={id} path={edgePath} style={{ stroke: \"#b0bec5\" }} />\r\n <g\r\n className=\"nodrag nopan edge-plus-svg\"\r\n transform={`translate(${labelX}, ${labelY})`}\r\n style={{\r\n cursor: handleAddStepClick ? \"pointer\" : \"default\",\r\n pointerEvents: \"all\",\r\n outline: \"none\",\r\n }}\r\n onClick={handleAddStepClick ? handleClick : undefined}\r\n onKeyDown={handleAddStepClick ? handleKeyDown : undefined}\r\n role={handleAddStepClick ? \"button\" : undefined}\r\n tabIndex={handleAddStepClick ? 0 : undefined}\r\n data-testid=\"plus-node-icon\"\r\n >\r\n <circle r={R} className=\"edge-plus-circle\" />\r\n <line\r\n x1={0}\r\n y1={-PLUS_HALF}\r\n x2={0}\r\n y2={PLUS_HALF}\r\n strokeWidth={STROKE}\r\n strokeLinecap=\"round\"\r\n className=\"plus-line\"\r\n />\r\n <line\r\n x1={-PLUS_HALF}\r\n y1={0}\r\n x2={PLUS_HALF}\r\n y2={0}\r\n strokeWidth={STROKE}\r\n strokeLinecap=\"round\"\r\n className=\"plus-line\"\r\n />\r\n <g className=\"edge-plus-tooltip\" transform=\"translate(18, 0)\">\r\n <rect\r\n x={0}\r\n y={-10}\r\n width={65}\r\n height={20}\r\n rx={4}\r\n className=\"tooltip-bg\"\r\n />\r\n <path d=\"M0 -4 L-4 0 L0 4 Z\" className=\"tooltip-bg\" />\r\n <text\r\n x={32}\r\n y={0}\r\n textAnchor=\"middle\"\r\n dominantBaseline=\"central\"\r\n fill=\"white\"\r\n style={{ fontSize: 10, fontWeight: 600, pointerEvents: \"none\" }}\r\n >\r\n Add Step\r\n </text>\r\n </g>\r\n </g>\r\n </g>\r\n );\r\n};\r\n\r\nexport default PlusEdge;\r\n","import React from 'react';\r\nimport { getStraightPath, BaseEdge, EdgeProps } from 'reactflow';\r\n\r\nconst PlainEdge = ({ id, sourceX, sourceY, targetX, targetY }: EdgeProps) => {\r\n const [edgePath] = getStraightPath({ sourceX, sourceY, targetX, targetY });\r\n return <BaseEdge id={id} path={edgePath} style={{ stroke: '#b0bec5' }} />;\r\n};\r\n\r\nexport default PlainEdge;\r\n","import React from 'react';\r\nimport { getStraightPath, BaseEdge, EdgeProps } from 'reactflow';\r\nimport { AddStepContext } from './EdgeWithPlusLabel';\r\nimport './EdgeWithPlusLabel.scss';\r\n\r\nconst R = 11.5;\r\nconst STROKE = 2;\r\nconst PLUS_HALF = 6;\r\nconst LABEL_OFFSET_Y = -24;\r\nconst PILL_WIDTH = 40;\r\nconst PILL_HEIGHT = 20;\r\nconst PILL_R = 4;\r\n\r\nexport interface LabelPlusEdgeData {\r\n label?: string;\r\n onAddStepClick?: (sourceNodeId: string, context: AddStepContext) => void;\r\n referenceNodeType?: string;\r\n stepVisibility?: unknown;\r\n showPlus?: boolean;\r\n}\r\n\r\nconst LabelPlusEdge = ({\r\n id,\r\n sourceX,\r\n sourceY,\r\n targetX,\r\n targetY,\r\n source,\r\n target,\r\n data,\r\n}: EdgeProps<LabelPlusEdgeData>) => {\r\n const [edgePath, labelX, labelY] = getStraightPath({ sourceX, sourceY, targetX, targetY });\r\n\r\n const edgeLabel = data?.label;\r\n const isPass = edgeLabel === 'Pass';\r\n const showLabel = isPass || edgeLabel === 'Fail';\r\n const handleAddStepClick = data?.onAddStepClick;\r\n const showPlus = data?.showPlus !== false && !!handleAddStepClick;\r\n\r\n const handleClick = (e: React.MouseEvent | React.KeyboardEvent) => {\r\n e.stopPropagation();\r\n if (typeof handleAddStepClick !== 'function') return;\r\n handleAddStepClick(source, {\r\n edgeId: id,\r\n nodeId: source,\r\n sourceNodeId: source,\r\n targetNodeId: target,\r\n position: 'between',\r\n referenceNodeId: source,\r\n referenceNodeType: data?.referenceNodeType,\r\n stepVisibility: data?.stepVisibility,\r\n });\r\n };\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent) => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n handleClick(e);\r\n }\r\n };\r\n\r\n return (\r\n <g className=\"edge-with-plus-wrapper\">\r\n <BaseEdge id={id} path={edgePath} style={{ stroke: '#b0bec5' }} />\r\n <g\r\n className=\"nodrag nopan edge-plus-svg\"\r\n transform={`translate(${labelX}, ${labelY})`}\r\n style={{ cursor: handleAddStepClick ? 'pointer' : 'default', pointerEvents: 'all', outline: 'none' }}\r\n onClick={handleAddStepClick ? handleClick : undefined}\r\n onKeyDown={handleAddStepClick ? handleKeyDown : undefined}\r\n role={handleAddStepClick ? 'button' : undefined}\r\n tabIndex={handleAddStepClick ? 0 : undefined}\r\n >\r\n {showLabel && (\r\n <g transform={`translate(0, ${showPlus ? LABEL_OFFSET_Y : 0})`}>\r\n <rect\r\n x={-PILL_WIDTH / 2} y={-PILL_HEIGHT / 2}\r\n width={PILL_WIDTH} height={PILL_HEIGHT}\r\n rx={PILL_R} ry={PILL_R}\r\n fill={isPass ? '#ADE6C5' : '#FDBFBF'}\r\n />\r\n <text textAnchor=\"middle\" dominantBaseline=\"central\" fill={isPass ? '#1DBF60' : '#C50000'} style={{ fontSize: 12, fontWeight: 500 }}>\r\n {edgeLabel}\r\n </text>\r\n </g>\r\n )}\r\n\r\n {showPlus && (\r\n <g className=\"plus-icon-container\">\r\n <circle r={R} className=\"edge-plus-circle\" />\r\n <line x1={0} y1={-PLUS_HALF} x2={0} y2={PLUS_HALF} strokeWidth={STROKE} strokeLinecap=\"round\" className=\"plus-line\" />\r\n <line x1={-PLUS_HALF} y1={0} x2={PLUS_HALF} y2={0} strokeWidth={STROKE} strokeLinecap=\"round\" className=\"plus-line\" />\r\n </g>\r\n )}\r\n\r\n {showPlus && (\r\n <g className=\"edge-plus-tooltip\" transform=\"translate(22, 0)\">\r\n <rect x={0} y={-10} width={65} height={20} rx={4} className=\"tooltip-bg\" />\r\n <path d=\"M0 -4 L-4 0 L0 4 Z\" className=\"tooltip-bg\" />\r\n <text x={32} y={0} textAnchor=\"middle\" dominantBaseline=\"central\" fill=\"white\" style={{ fontSize: 10, fontWeight: 600, pointerEvents: 'none' }}>\r\n Add Step\r\n </text>\r\n </g>\r\n )}\r\n </g>\r\n </g>\r\n );\r\n};\r\n\r\nexport default LabelPlusEdge;\r\n","import React from 'react';\r\nimport { EdgeProps } from 'reactflow';\r\nimport { AddStepContext } from './EdgeWithPlusLabel';\r\n\r\ninterface GatewayBranchEdgeData {\r\n label?: string;\r\n branch?: string;\r\n isFirst?: boolean;\r\n filterId?: string;\r\n onAddStepClick?: (sourceNodeId: string, context: AddStepContext) => void;\r\n /** When true, route as a vertical rail (sourceX → down to targetY → right to target). Default: horizontal fan-out. */\r\n verticalRouting?: boolean;\r\n /** inline-gate side branch: route horizontally from the right handle, then down into the target. */\r\n sideRouting?: boolean;\r\n}\r\n\r\nconst GatewayBranchEdge = ({\r\n id,\r\n source,\r\n target,\r\n sourceX,\r\n sourceY,\r\n targetX,\r\n targetY,\r\n style = {},\r\n markerEnd,\r\n data,\r\n}: EdgeProps<GatewayBranchEdgeData>) => {\r\n const verticalRouting = data?.verticalRouting ?? false;\r\n const sideRouting = data?.sideRouting ?? false;\r\n // Workato-style vertical routing: the rail decoration draws the vertical line +\r\n // bullet. The edge L-routes (90° elbow) from the bullet Y (BULLET_OFFSET above the\r\n // target top) across to the step's centerX, then down into the step's top handle.\r\n // This applies to every branch, including empty ones (target = End).\r\n // BULLET_OFFSET must match BULLET_TO_STEP_GAP in WorkflowCanvas applyVerticalBranchLayout.\r\n const BULLET_OFFSET = 30;\r\n const path = sideRouting\r\n ? // From the right handle: straight across to the target X, then down into its top.\r\n `M ${sourceX},${sourceY} L ${targetX},${sourceY} L ${targetX},${targetY}`\r\n : verticalRouting\r\n ? (() => {\r\n const bulletY = targetY - BULLET_OFFSET;\r\n return `M ${sourceX},${bulletY} L ${targetX},${bulletY} L ${targetX},${targetY}`;\r\n })()\r\n : (() => {\r\n const elbowY = sourceY + 30;\r\n return `M ${sourceX},${sourceY} L ${sourceX},${elbowY} L ${targetX},${elbowY} L ${targetX},${targetY}`;\r\n })();\r\n const stroke = (style as React.CSSProperties & { stroke?: string }).stroke || '#d1d5db';\r\n const label = data?.label;\r\n const isPass = data?.isFirst ?? false;\r\n const onAddStepClick = data?.onAddStepClick;\r\n\r\n // Label + \"+\" sit on the horizontal segment.\r\n // - Vertical mode: horizontal segment is at bulletY (= targetY - BULLET_OFFSET)\r\n // - Horizontal mode: horizontal segment is at the elbow (sourceY+30)\r\n const segmentY = sideRouting ? sourceY : verticalRouting ? targetY - BULLET_OFFSET : sourceY + 30;\r\n const pillX = sideRouting ? sourceX + (targetX - sourceX) * 0.45 : sourceX + (targetX - sourceX) * (verticalRouting ? 0.25 : 0.35);\r\n const plusX = sourceX + (targetX - sourceX) * (verticalRouting ? 0.65 : 0.7);\r\n const labelY = segmentY;\r\n\r\n const handlePlusClick = (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n if (!onAddStepClick) return;\r\n onAddStepClick(source, {\r\n edgeId: id,\r\n nodeId: source,\r\n sourceNodeId: source,\r\n targetNodeId: target,\r\n position: 'between',\r\n referenceNodeId: source,\r\n filterId: data?.filterId,\r\n branch: data?.branch,\r\n });\r\n };\r\n\r\n const R = 11.5;\r\n const HALF = 6;\r\n\r\n return (\r\n <g>\r\n <path id={id} d={path} fill=\"none\" stroke={stroke} strokeWidth={1.5} markerEnd={markerEnd} />\r\n\r\n {/* Pass / Fail pill — hidden in vertical-routing mode (the rail decoration renders the label instead) */}\r\n {label && (!verticalRouting || sideRouting) && (\r\n <g transform={`translate(${pillX}, ${labelY})`}>\r\n {(() => {\r\n const pillW = Math.max(44, label.length * 7 + 20);\r\n return (\r\n <>\r\n <rect x={-pillW / 2} y={-11} width={pillW} height={22} rx={11}\r\n fill={isPass ? '#e8f5e9' : '#ffebee'}\r\n stroke={isPass ? '#81c784' : '#e57373'}\r\n strokeWidth={1}\r\n />\r\n <text x={0} y={4} textAnchor=\"middle\" fontSize={10} fontWeight={600}\r\n fill={isPass ? '#2e7d32' : '#c62828'}\r\n style={{ fontFamily: 'sans-serif', pointerEvents: 'none' }}\r\n >\r\n {label}\r\n </text>\r\n </>\r\n );\r\n })()}\r\n </g>\r\n )}\r\n\r\n {/* \"+\" button */}\r\n {onAddStepClick && (\r\n <g\r\n transform={`translate(${plusX}, ${labelY})`}\r\n onClick={handlePlusClick}\r\n style={{ cursor: 'pointer', pointerEvents: 'all' }}\r\n className=\"nodrag nopan edge-plus-svg\"\r\n >\r\n <circle r={R} className=\"edge-plus-circle\" />\r\n <line x1={0} y1={-HALF} x2={0} y2={HALF} strokeWidth={2} strokeLinecap=\"round\" className=\"plus-line\" />\r\n <line x1={-HALF} y1={0} x2={HALF} y2={0} strokeWidth={2} strokeLinecap=\"round\" className=\"plus-line\" />\r\n </g>\r\n )}\r\n </g>\r\n );\r\n};\r\n\r\nexport default GatewayBranchEdge;\r\n"],"names":["WorkflowCanvasContext","createContext","defaultFlowForgeMessages","useCanvasHandlers","useContext","StartNode","jsxs","jsx","Handle","Position","EndNode","AddTriggerNode","onClickAddTrigger","messages","Tooltip","e","GrTrigger","AddStepNode","id","onAddStep","OPERATOR_LABELS","INTERNAL_KEYS","getByPath","obj","path","acc","k","toList","v","one","x","resolveAt","data","labels","humanizeKey","key","m","LAYOUT_TYPES","flattenSchema","schema","out","walk","arr","f","node","t","fieldValue","field","labelVal","raw","map","o","flattenConditions","list","n","deriveRows","descriptor","condCfg","actionLabel","verb","labelOf","rows","conditioned","entries","leaves","outcome","value","prefix","resolveNodeRows","spec","muted","fieldText","Val","text","style","Conditions","conditions","Fragment","c","j","React","NodeBody","accent","emptyText","outcomeText","row","i","hasOutcome","hasWhen","TRIGGER_ACCENT","humaniseCode","code","formatSource","s","TriggerNode","onEditNode","activeTemplate","type","eventType","sources","label","source","previewWorkflow","executionStatus","infoText","handleEdit","hasEventSources","hasSimpleShape","title","body","eventDisplay","Chip","rightCluster","FaCheckCircle","FaTimesCircle","MdOutlineModeEdit","MdInfoOutline","MdInput","humanize","EventNode","header","displayTitle","BranchRailDecoration","rail","cardWidth","railX","stroke","b","idx","bulletY","FilterNode","onDeleteNode","nodeRegistry","_branchRail","descriptorType","branchStyle","inlineGate","sourceHandles","FiFilter","MdDeleteOutline","condition","index","ActionNode","nodeBody","icon","MAX_VISIBLE_STAGES","resolveExecLabel","executionMode","isSequential","labelMap","stageSummary","stage","approverCount","groupName","_a","roleName","_b","configured","ApprovalNode","approvalData","isPreview","executionModeLabel","policy","stages","stageCount","visibleStages","remainingStages","policyName","MdCheckCircle","displayName","summaryLabel","execLabel","MdPeople","MdArrowForward","DelayNode","duration","unit","displayText","MdSchedule","CHANNEL_META","MdEmail","MdNotifications","MdSms","MdWebhook","FALLBACK_META","getRecipientPreview","getSubjectPreview","msg","NotificationNode","d","meta","recipient","subjectLine","IconComponent","NODE_WIDTH","AUTH_LABELS","WebhookTriggerNode","endpointUrl","authMethod","handleCopy","MdContentCopy","RestApiNode","method","url","MdHttp","methodKey","methodStyle","HTTP_METHOD_STYLE","ConditionBranchNode","branchConfigs","defaultBranch","MdCallSplit","branch","palette","BRANCH_PALETTE","firstCondition","extraCount","SubWorkflowNode","workflowId","workflowLabel","onPreview","MdAccountTree","handlePreview","MdOpenInNew","builtInNodeTypes","R","STROKE","PLUS_HALF","PILL_WIDTH","PILL_HEIGHT","PILL_R","EdgeWithPlusLabel","edgeId","sourceX","sourceY","targetX","targetY","sourcePosition","targetPosition","target","edgePath","labelX","labelY","getStraightPath","edgeLabel","isPass","showLabel","oneThirdX","oneThirdY","twoThirdsX","twoThirdsY","handleAddStepClick","handleClick","context","handleKeyDown","PlusContent","plusProps","BaseEdge","PlusEdge","PlainEdge","LABEL_OFFSET_Y","LabelPlusEdge","showPlus","GatewayBranchEdge","markerEnd","verticalRouting","sideRouting","BULLET_OFFSET","elbowY","onAddStepClick","segmentY","pillX","plusX","handlePlusClick","HALF","pillW"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";const e=require("react/jsx-runtime"),p=require("reactflow"),T=require("@mui/material"),Ne=require("react-icons/gr"),O=require("react"),ke=require("./messages-Bg7b9RbI.js"),y=require("react-icons/md"),H=require("react-icons/fa"),we=require("react-icons/fi"),P=require("./canvasTokens-gKNYrPl4.js"),oe=O.createContext({onEditNode:()=>{},onDeleteNode:()=>{},onAddStep:()=>{},onClickAddTrigger:()=>{},messages:ke.defaultFlowForgeMessages,nodeRegistry:null,nodeBody:"full",activeTemplate:null}),k=()=>O.useContext(oe),le=()=>e.jsxs("div",{style:{width:350,display:"flex",justifyContent:"center"},children:[e.jsx(p.Handle,{type:"source",position:p.Position.Bottom,style:{opacity:0,left:"50%"}}),e.jsx("div",{style:{padding:"8px 28px",borderRadius:999,background:"#f5f5f5",border:"1.5px solid #bdbdbd",fontSize:13,fontWeight:500,color:"#424242",userSelect:"none"},children:"Start"})]}),re=()=>e.jsxs("div",{style:{width:350,display:"flex",justifyContent:"center"},children:[e.jsx(p.Handle,{type:"target",position:p.Position.Top,style:{opacity:0,left:"50%"}}),e.jsx("div",{style:{padding:"8px 28px",borderRadius:999,background:"#f5f5f5",border:"1.5px solid #bdbdbd",fontSize:13,fontWeight:500,color:"#424242",userSelect:"none"},children:"End"})]}),ce=()=>{const{onClickAddTrigger:t,messages:n}=k();return e.jsxs("div",{style:{width:350,display:"flex",justifyContent:"center"},children:[e.jsx(p.Handle,{type:"target",position:p.Position.Top,style:{opacity:0,left:"50%"}}),e.jsx(T.Tooltip,{title:n.addTriggerTooltip,placement:"top",arrow:!0,children:e.jsxs("div",{onClick:t,role:"button",tabIndex:0,onKeyDown:s=>{s.key==="Enter"&&t()},style:{padding:"10px 24px",borderRadius:8,border:"1.5px dashed #d0d0d0",background:"#fff",cursor:"pointer",display:"flex",alignItems:"center",justifyContent:"center",gap:8},children:[e.jsx(Ne.GrTrigger,{size:16}),e.jsx("span",{className:"ff-text-black",style:{fontSize:13},"data-testid":"add-trigger-btn-text",children:n.addTriggerButton})]})}),e.jsx(p.Handle,{type:"source",position:p.Position.Bottom,style:{opacity:0,left:"50%"}})]})},Te=({id:t})=>{const{onAddStep:n}=k();return e.jsxs("div",{onClick:()=>n(t),role:"button",tabIndex:0,onKeyDown:s=>{s.key==="Enter"&&n(t)},style:{width:28,height:28,borderRadius:"50%",border:"1.5px solid #9e9e9e",background:"#fff",display:"flex",alignItems:"center",justifyContent:"center",cursor:"pointer",fontSize:18,color:"#757575",lineHeight:1,userSelect:"none"},children:[e.jsx(p.Handle,{type:"target",position:p.Position.Top,style:{opacity:0}}),"+",e.jsx(p.Handle,{type:"source",position:p.Position.Bottom,style:{opacity:0}})]})},Se={equals:"is",notEquals:"is not",contains:"contains",notContains:"does not contain",startsWith:"starts with",endsWith:"ends with",isPresent:"is present",isNotPresent:"is not present",isEmpty:"is empty",isNotEmpty:"is not empty",greaterThan:"greater than",lessThan:"less than",greaterOrEquals:"greater or equal",lessOrEquals:"less or equal"},K=new Set(["descriptorType","title","header","icon","infoText","label","conditionConfig","_conditionConfig","_optionLabels","_formulaConfig","type","eventType","sources","source","previewWorkflow","executionStatus"]),$=(t,n)=>n.split(".").reduce((s,r)=>s==null?void 0:s[r],t),L=t=>{const n=s=>typeof s=="object"&&s?String(s.label??s.name??s.value??""):s==null?"":String(s);return Array.isArray(t)?t.map(n).filter(Boolean):t!=null&&t!==""?[n(t)].filter(Boolean):[]},q=(t,n)=>{const s=t._optionLabels;return L($(s,n)??$(t,n))};function Ee(t){return(t.includes(".")?t.slice(t.lastIndexOf(".")+1):t).replace(/[_-]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,s=>s.toUpperCase())}const Pe=new Set(["callout","header","section","divider","button","group","tabs","info","tree-map"]);function Ce(t){const n=[],s=r=>{(Array.isArray(r)?r:[]).forEach(i=>{if(!i||typeof i!="object")return;const o=i;(o.id||o.name)&&n.push(o),Array.isArray(o.fields)&&s(o.fields),Array.isArray(o.columns)&&s(o.columns),Array.isArray(o.tabs)&&o.tabs.forEach(d=>s(d==null?void 0:d.fields))})};return s(t),n}function ze(t,n){const s=String(n.id||n.name||""),r=t._optionLabels,i=r?$(r,s):void 0;if(i!=null)return L(i);const o=$(t,s);if(typeof o=="boolean")return o?["Yes"]:[];if(Array.isArray(n.options)&&o!=null&&o!==""){const d=new Map(n.options.filter(l=>l&&typeof l=="object").map(l=>[String(l.value),String(l.label??l.value)]));return L(o).map(l=>d.get(l)??l)}return L(o)}function Ae(t){const n=[],s=r=>{(Array.isArray(r)?r:[]).forEach(i=>{i&&i.type==="group"?s(i.entries):i&&n.push(i)})};return s(t),n}function de(t,n){const s=Ce(n==null?void 0:n.formSchema),r=t.conditionConfig??t._conditionConfig,i=(n==null?void 0:n.label)||t.title||"Set",o=i.length<=18?i:"",d=c=>{const x=s.find(u=>(u==null?void 0:u.id)===c||(u==null?void 0:u.name)===c);return x!=null&&x.label?String(x.label):Ee(c)},l=[],f=new Set(r?Object.keys(r):[]);if(r&&typeof r=="object"&&Object.entries(r).forEach(([c,x])=>{const u=Ae(x),g=q(t,c);u.length===0&&g.length===0||l.push({kind:"rule",when:u.map(h=>({field:h.fieldLabel||d(h.field||""),op:Se[h.operator]||h.operator||"",value:h.value==null?void 0:L(h.value).join(", ")||void 0,connector:h.connector||"and"})),outcomeLabel:o,outcome:g})}),s.length)s.forEach(c=>{const x=String(c.id||c.name||"");if(!x||K.has(x)||f.has(x)||Pe.has(c.type))return;const u=ze(t,c);u.length&&l.push({kind:"value",label:d(x),value:u})});else{const c=(x,u)=>{Object.keys(x).forEach(g=>{const h=u?`${u}.${g}`:g;if(K.has(g)||f.has(h))return;const a=x[g];if(a&&typeof a=="object"&&!Array.isArray(a)){c(a,h);return}if(typeof a=="boolean"){a&&l.push({kind:"value",label:d(h),value:["Yes"]});return}const j=q(t,h);j.length&&l.push({kind:"value",label:d(h),value:j})})};c(t,"")}return l}function ae(t,n){const s=n==null?void 0:n.nodeBody;return typeof s=="function"?s(t):Array.isArray(s)?s:de(t,n)}const E={color:"#64748b"},F={color:"#0f172a",fontWeight:600};function I({text:t,style:n}){return e.jsx("span",{title:t,style:{...n,display:"inline-block",maxWidth:230,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",verticalAlign:"bottom"},children:t})}function U({conditions:t}){return e.jsx(e.Fragment,{children:t.map((n,s)=>e.jsxs(O.Fragment,{children:[s>0&&e.jsxs("span",{style:E,children:[" ",n.connector??"and"," "]}),e.jsx("span",{style:F,children:n.field}),e.jsxs("span",{style:E,children:[" ",n.op," "]}),n.value!=null&&e.jsx("span",{style:F,children:n.value})]},s))})}function _({data:t,descriptor:n,accent:s="#2563eb",emptyText:r}){const i=ae(t||{},n);if(!i.length)return e.jsx("span",{style:{color:"#94a3b8"},children:r??"Click edit to configure"});const o={color:s,fontWeight:600};return e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:6},children:i.map((d,l)=>{if(d.kind==="value")return e.jsxs("div",{style:{lineHeight:1.5},children:[e.jsxs("span",{style:E,children:[d.label," "]}),e.jsx(I,{text:d.value.join(", "),style:F})]},l);if(d.fallback)return e.jsxs("div",{style:{lineHeight:1.5},children:[e.jsx("span",{style:E,children:"Otherwise → "}),e.jsx(I,{text:d.outcome.join(", "),style:o})]},l);const f=d.outcome.length>0,c=!!d.when&&d.when.length>0;return d.outcomeLabel?e.jsxs("div",{style:{lineHeight:1.5},children:[e.jsxs("span",{style:E,children:[d.outcomeLabel," "]}),f&&e.jsx(I,{text:d.outcome.join(", "),style:o}),c&&e.jsxs(e.Fragment,{children:[e.jsx("span",{style:E,children:" when "}),e.jsx(U,{conditions:d.when})]})]},l):c?e.jsxs("div",{style:{lineHeight:1.5},children:[e.jsx("span",{style:E,children:"When "}),e.jsx(U,{conditions:d.when}),f&&e.jsxs(e.Fragment,{children:[e.jsx("span",{style:E,children:" → "}),e.jsx(I,{text:d.outcome.join(", "),style:o})]})]},l):e.jsx("div",{style:{lineHeight:1.5},children:e.jsx(I,{text:d.outcome.join(", "),style:o})},l)})})}const Ie="#ea580c";function fe(t){return t?t.replace(/[_-]+/g," ").toLowerCase().replace(/\b\w/g,n=>n.toUpperCase()):""}function Le(t){if(typeof t!="string"&&t.label)return t.label;const n=typeof t=="string"?t:t.value??"";return fe(n)}const pe=({id:t,data:n})=>{const{onClickAddTrigger:s,onEditNode:r,messages:i,activeTemplate:o}=k(),{type:d,eventType:l,sources:f,label:c,source:x,previewWorkflow:u,executionStatus:g,infoText:h="This node decides the flow trigger type and configuration."}=n??{},a=m=>{m==null||m.stopPropagation(),d==="scheduler"?r(t):s()},j=Array.isArray(f)&&f.length>0,N=!!(c||x),w=d==="scheduler"?(i==null?void 0:i.schedulerTriggerTitle)??"Scheduler Trigger":d==="event"||j||N?(i==null?void 0:i.eventTriggerSourceTitle)??"Event Trigger Source":(i==null?void 0:i.selectTriggerTitle)??"Select Trigger",v=(()=>{if(d==="scheduler")return e.jsx(_,{data:n,accent:Ie,emptyText:(i==null?void 0:i.schedulerToBeConfigured)??"Scheduler to be configured"});if(d==="event"||j){const m=c||fe(l);return e.jsxs("div",{children:[e.jsxs("div",{className:"ff-d-flex ff-align-items-center",children:[e.jsx("span",{style:{fontWeight:600},children:m}),e.jsx("span",{className:"ff-ms-2 ff-text-muted",style:{fontSize:12},children:"via"})]}),e.jsx("div",{className:"ff-d-flex ff-flex-wrap ff-mt-2",style:{gap:4},children:j?f.map((C,A)=>e.jsx(T.Chip,{label:Le(C),variant:"outlined",size:"small",className:"ff-text-dark"},A)):e.jsx("span",{className:"ff-text-muted",style:{fontSize:12},children:(i==null?void 0:i.noSourceSelected)??"No source selected"})})]})}return N?e.jsxs("div",{className:"ff-d-flex ff-flex-wrap ff-align-items-center",style:{gap:6},children:[c&&e.jsx("span",{style:{fontWeight:600},children:c}),x&&e.jsx(T.Chip,{label:x,variant:"outlined",size:"small"})]}):e.jsx("span",{role:"button",tabIndex:0,onClick:a,onKeyDown:m=>{(m.key==="Enter"||m.key===" ")&&a(m)},style:{cursor:"pointer",color:"#1e88e5"},children:(i==null?void 0:i.selectTriggerCta)??"Click to select a trigger to start your workflow"})})(),S=g?e.jsxs(e.Fragment,{children:[g.status==="success"&&e.jsx(H.FaCheckCircle,{size:16,color:"#1DBF60",style:{marginRight:8}}),g.status==="failed"&&e.jsx(H.FaTimesCircle,{size:16,color:"#f44336",style:{marginRight:8}})]}):e.jsxs("div",{className:"ff-d-flex ff-align-items-center",children:[!u&&e.jsx("div",{role:"button",tabIndex:0,onClick:a,onKeyDown:m=>{(m.key==="Enter"||m.key===" ")&&a(m)},className:"ff-me-2",style:{cursor:"pointer",color:"#212121"},"aria-label":"Edit trigger",children:e.jsx(y.MdOutlineModeEdit,{size:16})}),e.jsx(T.Tooltip,{title:e.jsx("div",{children:h}),placement:"right",arrow:!0,children:e.jsx("span",{children:e.jsx(y.MdInfoOutline,{color:"gray",size:16})})})]});return o!=null&&o.renderFullTriggerNode?e.jsxs("div",{style:{position:"relative",display:"inline-block"},children:[e.jsx(p.Handle,{type:"target",position:p.Position.Top,style:{opacity:0}}),o.renderFullTriggerNode({data:n,onEdit:a}),e.jsx(p.Handle,{type:"source",position:p.Position.Bottom,style:{opacity:0},id:"1"})]}):e.jsxs("div",{style:{width:350},children:[e.jsx(p.Handle,{type:"target",position:p.Position.Top,style:{opacity:0}}),e.jsxs("div",{style:{border:"1.5px solid #a5d6a7",borderRadius:8,background:"#fff",overflow:"hidden"},children:[e.jsxs("div",{className:"ff-d-flex ff-justify-content-between ff-align-items-center",style:{padding:"12px 14px"},children:[e.jsxs("div",{className:"ff-d-flex ff-align-items-center ff-gap-2",children:[e.jsx("div",{style:{width:28,height:28,borderRadius:6,background:"rgba(76,175,80,0.1)",display:"flex",alignItems:"center",justifyContent:"center",flexShrink:0},children:e.jsx(y.MdInput,{size:16,color:"#388e3c"})}),e.jsx("span",{style:{fontSize:14,fontWeight:500,color:"#212121"},children:w})]}),e.jsx("div",{className:"ff-d-flex ff-align-items-center",children:S})]}),e.jsx("div",{style:{background:"#f5f5f5",fontSize:12,color:"#212121",padding:"14px 16px",margin:"0 10px 12px",borderRadius:6,textAlign:"left"},children:v})]}),e.jsx(p.Handle,{type:"source",position:p.Position.Bottom,style:{opacity:0},id:"1"})]})};function xe(t){return t?t.replace(/[_-]+/g," ").replace(/\b\w/g,n=>n.toUpperCase()):""}function De(t){if(typeof t!="string"&&t.label)return t.label;const n=typeof t=="string"?t:t.value??"";return xe(n)}const Re=({data:t})=>{const{header:n="Event",title:s,eventType:r,sources:i,executionStatus:o,infoText:d="This event is raised by the system. It cannot be configured."}=t??{},l=s||xe(r)||"—";return e.jsxs("div",{style:{width:350},children:[e.jsx(p.Handle,{type:"target",position:p.Position.Top,style:{opacity:0}}),e.jsxs("div",{style:{border:"1.5px solid #a5d6a7",borderRadius:8,background:"#fff",overflow:"hidden"},children:[e.jsxs("div",{className:"ff-d-flex ff-justify-content-between ff-align-items-center",style:{padding:"12px 14px"},children:[e.jsxs("div",{className:"ff-d-flex ff-align-items-center ff-gap-2",children:[e.jsx("div",{style:{width:28,height:28,borderRadius:6,background:"rgba(76,175,80,0.1)",display:"flex",alignItems:"center",justifyContent:"center",flexShrink:0},children:e.jsx(y.MdInput,{size:16,color:"#388e3c"})}),e.jsx("span",{style:{fontSize:14,fontWeight:500,color:"#212121"},children:n})]}),e.jsxs("div",{className:"ff-d-flex ff-align-items-center",children:[(o==null?void 0:o.status)==="success"&&e.jsx(H.FaCheckCircle,{size:16,color:"#1DBF60",style:{marginRight:8}}),(o==null?void 0:o.status)==="failed"&&e.jsx(H.FaTimesCircle,{size:16,color:"#f44336",style:{marginRight:8}}),!o&&e.jsx(T.Tooltip,{title:e.jsx("div",{children:d}),placement:"right",arrow:!0,children:e.jsx("span",{children:e.jsx(y.MdInfoOutline,{color:"gray",size:16})})})]})]}),e.jsxs("div",{style:{background:"#f5f5f5",fontSize:13,color:"#212121",padding:"14px 16px",margin:"0 10px 12px",borderRadius:6,textAlign:"left"},children:[e.jsx("div",{style:{fontWeight:600},children:l}),Array.isArray(i)&&i.length>0&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"ff-text-muted",style:{fontSize:12,marginTop:4},children:"via"}),e.jsx("div",{className:"ff-d-flex ff-flex-wrap ff-mt-1",style:{gap:4},children:i.map((f,c)=>e.jsx(T.Chip,{label:De(f),variant:"outlined",size:"small",className:"ff-text-dark"},c))})]})]})]}),e.jsx(p.Handle,{type:"source",position:p.Position.Bottom,style:{opacity:0},id:"1"})]})},B=({rail:t,cardWidth:n})=>{const s=n/2;n/2+t.indent;const r="var(--ff-edge-color, #b0bec5)";return e.jsxs("svg",{width:n+t.indent+200,height:t.height,style:{position:"absolute",left:0,top:"100%",pointerEvents:"none",overflow:"visible"},children:[e.jsx("line",{x1:s,y1:0,x2:s,y2:t.height,stroke:r,strokeWidth:1.5}),t.branches.map((i,o)=>{const d=i.y;return e.jsxs("g",{transform:`translate(0, ${d})`,children:[e.jsx("rect",{x:s-5,y:-5,width:10,height:10,fill:"#fff",stroke:r,strokeWidth:1.5,transform:`rotate(45, ${s}, 0)`}),e.jsx("text",{x:s+14,y:4,fontSize:12,fontWeight:500,fill:"var(--ff-text, #212121)",style:{fontFamily:"sans-serif"},children:i.label})]},o)})]})},he=({id:t,data:n})=>{const{onEditNode:s,onDeleteNode:r,nodeRegistry:i}=k(),{conditions:o=[],infoText:d="Filter conditions applied to workflow data",_branchRail:l,descriptorType:f,branchStyle:c}=n,x=f?i==null?void 0:i.forType(f):void 0,u=c==="inline-gate",g=e.jsxs(e.Fragment,{children:[e.jsx(p.Handle,{id:"pass",type:"source",position:p.Position.Bottom,style:{opacity:0}}),e.jsx(p.Handle,{id:"fail",type:"source",position:p.Position.Right,style:{opacity:0,top:"50%"}})]});return x!=null&&x.renderFullNode?e.jsxs("div",{style:{position:"relative",display:"inline-block"},children:[e.jsx(p.Handle,{type:"target",position:p.Position.Top,style:{opacity:0}}),x.renderFullNode({id:t,data:n,onEdit:()=>s(t),onDelete:()=>r(t)}),g,!u&&l&&e.jsx(B,{rail:l,cardWidth:350})]}):e.jsxs("div",{style:{width:350,position:"relative"},children:[e.jsx(p.Handle,{type:"target",position:p.Position.Top,style:{opacity:0}}),e.jsxs("div",{style:{border:"1.5px solid #ffe082",borderRadius:8,background:"#fff"},children:[e.jsxs("div",{className:"ff-d-flex ff-justify-content-between ff-align-items-center",style:{padding:"10px 6px"},children:[e.jsxs("div",{className:"ff-d-flex ff-align-items-center",children:[e.jsx("div",{className:"ff-d-flex ff-align-items-center ff-justify-content-center ff-rounded",style:{width:25,height:25,background:"rgba(255,160,0,0.1)"},children:e.jsx(we.FiFilter,{className:"ff-text-warning",size:16})}),e.jsx("span",{className:"ff-ms-2 ff-fw-medium ff-text-dark",style:{fontSize:14},children:"Filter"})]}),e.jsxs("div",{className:"node-actions ff-d-flex ff-align-items-center",children:[e.jsx("div",{role:"button",tabIndex:0,onClick:h=>{h.stopPropagation(),s(t)},onKeyDown:h=>{h.key==="Enter"&&(h.stopPropagation(),s(t))},children:e.jsx(y.MdOutlineModeEdit,{size:16})}),e.jsx("div",{className:"ff-ms-2",role:"button",tabIndex:0,onClick:h=>{h.stopPropagation(),r(t)},onKeyDown:h=>{h.key==="Enter"&&(h.stopPropagation(),r(t))},children:e.jsx(y.MdDeleteOutline,{color:"red",size:16})}),e.jsx(T.Tooltip,{title:d,placement:"right",arrow:!0,children:e.jsx("div",{className:"ff-ms-2",children:e.jsx(y.MdInfoOutline,{color:"gray",size:16})})})]})]}),e.jsx("div",{style:{margin:"0 6px 10px",padding:"10px 12px",borderRadius:6,background:"#fafafa",fontSize:12},children:o.length===0?e.jsx("span",{className:"ff-text-muted",children:"No conditions configured"}):o.map((h,a)=>e.jsxs("div",{className:"ff-d-flex ff-align-items-center ff-mb-1",children:[e.jsx("p",{className:"ff-m-0 ff-fw-bold ff-me-1 ff-text-truncate",style:{maxWidth:100},title:h.field,children:h.field}),e.jsx("span",{className:"ff-text-muted",children:h.operator}),e.jsx("p",{className:"ff-text-dark ff-text-truncate ff-mx-1 ff-m-0",title:h.value,children:h.value}),a<o.length-1&&e.jsx("p",{className:"ff-bg-primary ff-text-white ff-fw-bold ff-ms-1 ff-px-1 ff-rounded-1 ff-m-0",children:h.logicalOperator})]},a))})]}),g,!u&&l&&e.jsx(B,{rail:l,cardWidth:350})]})},ue=({id:t,data:n})=>{const{onEditNode:s,onDeleteNode:r,nodeRegistry:i,nodeBody:o="full",messages:d}=k(),{title:l="Task",descriptorType:f,infoText:c=""}=n,x=f?i==null?void 0:i.forType(f):void 0,u=x==null?void 0:x.icon;return x!=null&&x.renderFullNode?e.jsxs("div",{style:{position:"relative",display:"inline-block"},children:[e.jsx(p.Handle,{type:"target",position:p.Position.Top,style:{opacity:0}}),x.renderFullNode({id:t,data:n,onEdit:()=>s(t),onDelete:()=>r(t)}),e.jsx(p.Handle,{type:"source",position:p.Position.Bottom,style:{opacity:0}})]}):e.jsxs("div",{style:{width:350},children:[e.jsx(p.Handle,{type:"target",position:p.Position.Top,style:{opacity:0}}),e.jsxs("div",{style:{border:"1.5px solid #b0bec5",borderRadius:8,background:"#fff"},children:[e.jsxs("div",{className:"ff-d-flex ff-justify-content-between ff-align-items-center",style:{padding:"10px 8px"},children:[e.jsxs("div",{className:"ff-d-flex ff-align-items-center ff-gap-2",children:[u&&e.jsx("div",{style:{display:"flex",alignItems:"center"},children:u}),e.jsx("span",{className:"ff-text-dark",style:{fontSize:14,fontWeight:500},children:l})]}),e.jsxs("div",{className:"node-actions ff-d-flex ff-align-items-center",children:[e.jsx("div",{role:"button",tabIndex:0,onClick:g=>{g.stopPropagation(),s(t)},onKeyDown:g=>{g.key==="Enter"&&(g.stopPropagation(),s(t))},children:e.jsx(y.MdOutlineModeEdit,{size:16})}),e.jsx("div",{className:"ff-ms-2",role:"button",tabIndex:0,onClick:g=>{g.stopPropagation(),r(t)},onKeyDown:g=>{g.key==="Enter"&&(g.stopPropagation(),r(t))},children:e.jsx(y.MdDeleteOutline,{color:"red",size:16})}),c&&e.jsx(T.Tooltip,{title:c,placement:"right",arrow:!0,children:e.jsx("div",{className:"ff-ms-2",children:e.jsx(y.MdInfoOutline,{color:"gray",size:16})})})]})]}),o!=="title-only"&&e.jsx("div",{style:{margin:"0 8px 8px",padding:8,borderRadius:4,background:"#f8f9fa",fontSize:12,textAlign:"left",color:"#212529",lineHeight:1.4},children:x!=null&&x.renderNode?x.renderNode(n):e.jsx(_,{data:n,descriptor:x,accent:"#2563eb",emptyText:(d==null?void 0:d.clickEditToConfigure)??"Click edit to configure"})})]}),e.jsx(p.Handle,{type:"source",position:p.Position.Bottom,style:{opacity:0}})]})},G=2;function We(t,n,s){const r=(t==null?void 0:t.toLowerCase())||(n?"sequential":null);return r?(s==null?void 0:s[r])??r.charAt(0).toUpperCase()+r.slice(1):null}function Me(t){var o,d;const n=Array.isArray(t.userIds)?t.userIds.length:0,s=((o=t.groupName)==null?void 0:o.trim())??"",r=((d=t.roleName)==null?void 0:d.trim())??"",i=n>0||!!s||!!r;return s?{label:`Group: ${s}`,configured:!0}:r?{label:`Role: ${r}`,configured:!0}:n>0?{label:`${n} approver${n!==1?"s":""}`,configured:!0}:{label:"Not configured",configured:i}}const ge=({id:t,data:n})=>{const{onEditNode:s,onDeleteNode:r}=k(),{approvalData:i,isPreview:o=!1,_branchRail:d,executionModeLabel:l}=n,f=(i==null?void 0:i.policy)??{},c=f.stages??[],x=c.length,u=c.slice(0,G),g=x-G,h=f.name??f.policyName??"Untitled Policy";return e.jsxs("div",{style:{width:350,position:"relative"},children:[e.jsx(p.Handle,{type:"target",position:p.Position.Top,style:{opacity:0}}),e.jsxs("div",{style:{border:"1.5px solid #ffe082",borderRadius:8,background:"#fff",overflow:"hidden"},children:[e.jsxs("div",{className:"ff-d-flex ff-justify-content-between ff-align-items-center",style:{padding:"10px 8px 8px"},children:[e.jsxs("div",{className:"ff-d-flex ff-align-items-center ff-gap-2",children:[e.jsx("div",{className:"ff-d-flex ff-align-items-center ff-justify-content-center ff-rounded",style:{width:25,height:25,background:"rgba(251,192,45,0.2)"},children:e.jsx(y.MdCheckCircle,{style:{color:"#FBC02D"},size:16})}),e.jsx("span",{className:"ff-fw-medium ff-text-dark",style:{fontSize:14},children:"Approval Policy"})]}),e.jsxs("div",{className:"node-actions ff-d-flex ff-align-items-center",children:[!o&&e.jsx("div",{role:"button",tabIndex:0,style:{cursor:"pointer"},onClick:a=>{a.stopPropagation(),s(t)},onKeyDown:a=>{a.key==="Enter"&&(a.stopPropagation(),s(t))},"data-testid":"approval-node-edit-btn",children:e.jsx(y.MdOutlineModeEdit,{size:16,className:"ff-text-secondary"})}),!o&&e.jsx("div",{className:"ff-ms-2",role:"button",tabIndex:0,style:{cursor:"pointer"},onClick:a=>{a.stopPropagation(),r(t)},onKeyDown:a=>{a.key==="Enter"&&(a.stopPropagation(),r(t))},"data-testid":"approval-node-delete-btn",children:e.jsx(y.MdDeleteOutline,{color:"red",size:16})}),e.jsx(T.Tooltip,{title:"This approval policy determines who must approve a request before the workflow continues.",arrow:!0,placement:"right",children:e.jsx("span",{className:"ff-ms-2 ff-d-inline-flex",children:e.jsx(y.MdInfoOutline,{color:"gray",size:16})})})]})]}),e.jsx("div",{className:"ff-text-truncate ff-text-dark ff-fw-bold",style:{margin:"0 10px 8px",fontSize:13},title:h,children:h}),e.jsx("div",{style:{margin:"0 10px 10px",display:"flex",flexDirection:"column",gap:8},children:c.length===0?e.jsx("div",{className:"ff-text-center",style:{fontSize:12,color:"#9e9e9e",padding:"14px 0",borderRadius:6,border:"1px dashed #FEE79A",background:"#FFFDE7"},children:"No stages configured"}):e.jsxs(e.Fragment,{children:[u.map((a,j)=>{var m;const N=((m=a.stageName)==null?void 0:m.trim())||`Stage ${j+1}`,{label:w,configured:v}=Me(a),S=We(a.executionMode,a.isSequential,l);return e.jsxs("div",{style:{background:"#f5f5f5",borderRadius:6,padding:8},children:[e.jsxs("div",{className:"ff-d-flex ff-align-items-center",style:{gap:8},children:[e.jsx("div",{className:"ff-d-flex ff-align-items-center ff-justify-content-center ff-flex-shrink-0",style:{width:28,height:28,borderRadius:"50%",background:"#f5f5f5b6",border:"1px solid #E0E0E0",color:"#424242",fontSize:12,fontWeight:700},children:j+1}),e.jsx("div",{className:"ff-text-dark ff-text-truncate",style:{fontSize:12,fontWeight:700,marginRight:"auto"},children:N}),e.jsxs("div",{className:`ff-d-flex ff-align-items-center ff-flex-shrink-0 ${v?"ff-text-dark":"ff-text-muted"}`,style:{gap:4,fontSize:12},children:[e.jsx(y.MdPeople,{size:15,style:{color:v?"#5D4037":"#9E9E9E"}}),w]})]}),S&&e.jsxs("div",{className:"ff-d-flex ff-align-items-center",style:{gap:4,fontSize:11,color:"#1a73e8",marginTop:4,paddingLeft:36},children:[e.jsx(y.MdArrowForward,{size:11}),S]})]},j)}),g>0&&e.jsxs("div",{className:"ff-text-primary",style:{fontSize:12,marginTop:4,cursor:o?"default":"pointer",color:"#1976d2"},role:o?void 0:"button",tabIndex:o?void 0:0,onClick:a=>{o||(a.stopPropagation(),s(t))},onKeyDown:a=>{o||(a.key==="Enter"||a.key===" ")&&(a.stopPropagation(),s(t))},children:["+ ",g," More Stage",g>1?"s":""]})]})})]}),e.jsx(p.Handle,{type:"source",position:p.Position.Bottom,style:{opacity:0}}),d&&e.jsx(B,{rail:d,cardWidth:350})]})},ye=({id:t,data:n})=>{const{onEditNode:s,onDeleteNode:r}=k(),{duration:i,unit:o}=n,d=i!=null&&o,l=d?`Wait ${i} ${o}`:"Not configured";return e.jsxs("div",{style:{width:350},children:[e.jsx(p.Handle,{type:"target",position:p.Position.Top,style:{opacity:0}}),e.jsxs("div",{style:{border:"1.5px solid #b0bec5",borderRadius:8,background:"#fff"},children:[e.jsxs("div",{className:"ff-d-flex ff-justify-content-between ff-align-items-center ff-mx-2 ff-mt-2 ff-mb-1",children:[e.jsxs("div",{className:"ff-d-flex ff-align-items-center ff-gap-2",children:[e.jsx("div",{className:"ff-d-flex ff-align-items-center ff-justify-content-center ff-rounded",style:{width:25,height:25,background:"rgba(33,150,243,0.1)"},children:e.jsx(y.MdSchedule,{size:16,color:"#1976d2"})}),e.jsx("span",{className:"ff-fw-medium ff-text-dark",style:{fontSize:14},children:"Delay"})]}),e.jsxs("div",{className:"node-actions ff-d-flex ff-align-items-center",children:[e.jsx("div",{role:"button",tabIndex:0,onClick:f=>{f.stopPropagation(),s(t)},onKeyDown:f=>{f.key==="Enter"&&(f.stopPropagation(),s(t))},children:e.jsx(y.MdOutlineModeEdit,{size:16})}),e.jsx("div",{className:"ff-ms-2",role:"button",tabIndex:0,onClick:f=>{f.stopPropagation(),r(t)},onKeyDown:f=>{f.key==="Enter"&&(f.stopPropagation(),r(t))},children:e.jsx(y.MdDeleteOutline,{color:"red",size:16})})]})]}),e.jsx("div",{className:"ff-mx-2 ff-mb-2 ff-p-2 ff-rounded",style:{background:"#fafafa",fontSize:12},children:e.jsx("span",{className:d?"ff-text-dark ff-fw-medium":"ff-text-muted",children:l})})]}),e.jsx(p.Handle,{type:"source",position:p.Position.Bottom,style:{opacity:0}})]})},V={email:{label:"Email",bg:"#e3f2fd",color:"#1565c0",iconType:y.MdEmail},slack:{label:"Slack",bg:"#e8f5e9",color:"#2e7d32",iconType:y.MdNotifications},teams:{label:"MS Teams",bg:"#ede7f6",color:"#4527a0",iconType:y.MdNotifications},sms:{label:"SMS",bg:"#fce4ec",color:"#880e4f",iconType:y.MdSms},"in-app":{label:"In-App",bg:"#fff3e0",color:"#e65100",iconType:y.MdNotifications},webhook:{label:"Webhook",bg:"#f3e5f5",color:"#6a1b9a",iconType:y.MdWebhook}},He={label:"Notification",bg:"rgba(156,39,176,0.1)",color:"#7b1fa2",iconType:y.MdNotifications};function $e(t){var n;switch(t.channel){case"email":return((n=t.emailTo)==null?void 0:n.join(", "))??t.recipient??null;case"slack":return t.slackChannel??null;case"teams":return t.teamsMessage?"Message configured":null;case"sms":return t.smsTo??null;case"in-app":return t.inAppRecipient??null;case"webhook":return t.webhookUrl??null;default:return t.recipient??null}}function Fe(t){switch(t.channel){case"email":return t.emailSubject??t.subject??null;case"slack":{const n=t.slackMessage;return n?n.length>60?`${n.slice(0,60)}…`:n:null}case"in-app":return t.inAppTitle??null;default:return t.subject??null}}const me=({id:t,data:n})=>{const{onEditNode:s,onDeleteNode:r}=k(),i=n,o=i.channel&&V[i.channel]?V[i.channel]:He,d=$e(i),l=Fe(i),f=!!(i.channel&&d),c=o.iconType;return e.jsxs("div",{style:{width:P.NODE_WIDTH},children:[e.jsx(p.Handle,{type:"target",position:p.Position.Top,style:{opacity:0}}),e.jsxs("div",{style:{border:"1.5px solid #b0bec5",borderRadius:8,background:"#fff"},children:[e.jsxs("div",{className:"ff-d-flex ff-justify-content-between ff-align-items-center",style:{padding:"10px 6px"},children:[e.jsxs("div",{className:"ff-d-flex ff-align-items-center ff-gap-2",children:[e.jsx("div",{className:"ff-d-flex ff-align-items-center ff-justify-content-center ff-rounded",style:{width:25,height:25,background:o.bg},children:e.jsx(c,{size:16,color:o.color})}),e.jsx("span",{className:"ff-fw-medium ff-text-dark",style:{fontSize:14},children:i.channel?`${o.label} Notification`:"Notification"})]}),e.jsxs("div",{className:"node-actions ff-d-flex ff-align-items-center",children:[e.jsx("div",{role:"button",tabIndex:0,onClick:x=>{x.stopPropagation(),s(t)},onKeyDown:x=>{(x.key==="Enter"||x.key===" ")&&(x.stopPropagation(),s(t))},children:e.jsx(y.MdOutlineModeEdit,{size:16})}),e.jsx("div",{className:"ff-ms-2",role:"button",tabIndex:0,onClick:x=>{x.stopPropagation(),r(t)},onKeyDown:x=>{(x.key==="Enter"||x.key===" ")&&(x.stopPropagation(),r(t))},children:e.jsx(y.MdDeleteOutline,{color:"red",size:16})})]})]}),e.jsx("div",{style:{margin:"0 6px 10px",padding:"10px 12px",borderRadius:6,background:"#fafafa",fontSize:12},children:f?e.jsxs("div",{className:"ff-d-flex ff-flex-column ff-gap-1",children:[e.jsxs("div",{className:"ff-d-flex ff-align-items-center ff-gap-2",children:[e.jsx("span",{className:"ff-px-2 ff-py-1 ff-rounded",style:{fontSize:10,background:o.bg,color:o.color,fontWeight:600,flexShrink:0},children:o.label}),e.jsx("span",{className:"ff-text-dark ff-text-truncate",style:{maxWidth:220},children:d})]}),l&&e.jsx("span",{className:"ff-text-muted ff-text-truncate",style:{maxWidth:280},children:l})]}):e.jsx("span",{className:"ff-text-muted",children:"Not configured"})})]}),e.jsx(p.Handle,{type:"source",position:p.Position.Bottom,style:{opacity:0}})]})},Z={"api-key":"API Key",hmac:"HMAC"},je=({data:t})=>{const{onClickAddTrigger:n}=k(),{label:s="Webhook Trigger",endpointUrl:r,authMethod:i,source:o}=t,d=f=>{f.stopPropagation(),n()},l=f=>{f.stopPropagation(),r&&navigator.clipboard.writeText(r).catch(()=>{})};return e.jsxs("div",{style:{width:P.NODE_WIDTH},children:[e.jsx(p.Handle,{type:"target",position:p.Position.Top,style:{opacity:0}}),e.jsxs("div",{style:{border:"1.5px solid #90caf9",borderRadius:8,background:"#fff",overflow:"hidden"},children:[e.jsxs("div",{className:"ff-d-flex ff-justify-content-between ff-align-items-center",style:{padding:"10px 6px"},children:[e.jsxs("div",{className:"ff-d-flex ff-align-items-center ff-gap-2",children:[e.jsx("div",{style:{width:28,height:28,borderRadius:6,background:"rgba(33,150,243,0.1)",display:"flex",alignItems:"center",justifyContent:"center",flexShrink:0},children:e.jsx(y.MdWebhook,{size:16,color:"#1565c0"})}),e.jsx("span",{style:{fontSize:13,fontWeight:600,color:"#212121"},children:"Webhook Trigger"})]}),e.jsx("div",{role:"button",tabIndex:0,onClick:d,onKeyDown:f=>{(f.key==="Enter"||f.key===" ")&&d(f)},className:"ff-d-flex ff-align-items-center",style:{paddingRight:4,cursor:"pointer"},children:e.jsx(y.MdOutlineModeEdit,{size:16,color:"#555"})})]}),e.jsxs("div",{style:{margin:"0 6px 10px",padding:"10px 12px",borderRadius:6,background:"#e3f2fd",border:"1px solid #90caf9"},children:[e.jsxs("div",{className:"ff-d-flex ff-align-items-center ff-flex-wrap ff-gap-2 ff-mb-1",children:[e.jsx("span",{style:{fontSize:12,color:"#1565c0",fontWeight:600},children:s}),o&&e.jsx("span",{className:"ff-px-2 ff-py-1 ff-rounded",style:{fontSize:11,background:"#fff",border:"1px solid #90caf9",color:"#1565c0"},children:o}),i&&i!=="none"&&Z[i]&&e.jsx("span",{className:"ff-px-2 ff-py-1 ff-rounded",style:{fontSize:10,background:"#1565c0",color:"#fff",fontWeight:600},children:Z[i]})]}),r&&e.jsxs("div",{className:"ff-d-flex ff-align-items-center ff-gap-1",style:{marginTop:4},children:[e.jsx("span",{style:{fontSize:10,color:"#1565c0",fontFamily:"monospace",flex:1,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:r}),e.jsx(T.Tooltip,{title:"Copy URL",placement:"top",arrow:!0,children:e.jsx("div",{role:"button",tabIndex:0,onClick:l,onKeyDown:f=>{(f.key==="Enter"||f.key===" ")&&l(f)},style:{cursor:"pointer",flexShrink:0},children:e.jsx(y.MdContentCopy,{size:12,color:"#1565c0"})})})]})]})]}),e.jsx(p.Handle,{type:"source",position:p.Position.Bottom,style:{opacity:0}})]})},be=({id:t,data:n})=>{var g;const{onEditNode:s,onDeleteNode:r,nodeRegistry:i}=k(),{method:o,url:d,descriptorType:l}=n,f=l?(g=i==null?void 0:i.forType(l))==null?void 0:g.icon:e.jsx(y.MdHttp,{size:16,color:"#546e7a"}),c=!!(o&&d),x=(o==null?void 0:o.toUpperCase())??"",u=P.HTTP_METHOD_STYLE[x]??null;return e.jsxs("div",{style:{width:P.NODE_WIDTH},children:[e.jsx(p.Handle,{type:"target",position:p.Position.Top,style:{opacity:0}}),e.jsxs("div",{style:{border:"1.5px solid #b0bec5",borderRadius:8,background:"#fff"},children:[e.jsxs("div",{className:"ff-d-flex ff-justify-content-between ff-align-items-center",style:{padding:"10px 6px"},children:[e.jsxs("div",{className:"ff-d-flex ff-align-items-center ff-gap-2",children:[e.jsx("div",{style:{width:25,height:25,display:"flex",alignItems:"center",justifyContent:"center"},children:f}),e.jsx("span",{className:"ff-fw-medium ff-text-dark",style:{fontSize:14},children:"REST API Call"})]}),e.jsxs("div",{className:"node-actions ff-d-flex ff-align-items-center",children:[e.jsx("div",{role:"button",tabIndex:0,onClick:h=>{h.stopPropagation(),s(t)},onKeyDown:h=>{(h.key==="Enter"||h.key===" ")&&(h.stopPropagation(),s(t))},children:e.jsx(y.MdOutlineModeEdit,{size:16})}),e.jsx("div",{className:"ff-ms-2",role:"button",tabIndex:0,onClick:h=>{h.stopPropagation(),r(t)},onKeyDown:h=>{(h.key==="Enter"||h.key===" ")&&(h.stopPropagation(),r(t))},children:e.jsx(y.MdDeleteOutline,{color:"red",size:16})})]})]}),e.jsx("div",{style:{margin:"0 6px 10px",padding:"10px 12px",borderRadius:6,background:"#fafafa",fontSize:12},children:c?e.jsxs("div",{className:"ff-d-flex ff-align-items-center ff-gap-2",children:[u&&e.jsx("span",{style:{fontSize:10,fontWeight:700,padding:"2px 6px",borderRadius:4,background:u.bg,color:u.color,flexShrink:0},children:x}),e.jsx("span",{className:"ff-text-dark ff-text-truncate",style:{fontFamily:"monospace",fontSize:11},title:d,children:d})]}):e.jsx("span",{className:"ff-text-muted",children:"Not configured"})})]}),e.jsx(p.Handle,{type:"source",position:p.Position.Bottom,style:{opacity:0}})]})},Be={eq:"=",neq:"≠",gt:">",gte:"≥",lt:"<",lte:"≤",contains:"contains",startsWith:"starts with",endsWith:"ends with",isEmpty:"is empty",isNotEmpty:"is not empty"},Oe=({id:t,data:n})=>{const{onEditNode:s,onDeleteNode:r}=k(),{title:i="Condition Branch",branchConfigs:o=[],defaultBranch:d}=n,l=o.length>0;return e.jsxs("div",{style:{width:P.NODE_WIDTH},children:[e.jsx(p.Handle,{type:"target",position:p.Position.Top,style:{opacity:0}}),e.jsxs("div",{style:{border:"1.5px solid #b39ddb",borderRadius:8,background:"#fff"},children:[e.jsxs("div",{className:"ff-d-flex ff-justify-content-between ff-align-items-center",style:{padding:"10px 6px"},children:[e.jsxs("div",{className:"ff-d-flex ff-align-items-center ff-gap-2",children:[e.jsx("div",{style:{width:25,height:25,borderRadius:6,background:"rgba(103,58,183,0.1)",display:"flex",alignItems:"center",justifyContent:"center"},children:e.jsx(y.MdCallSplit,{size:16,color:"#512da8"})}),e.jsx("span",{className:"ff-fw-medium ff-text-dark",style:{fontSize:14},children:i})]}),e.jsxs("div",{className:"node-actions ff-d-flex ff-align-items-center",children:[e.jsx("div",{role:"button",tabIndex:0,onClick:f=>{f.stopPropagation(),s(t)},onKeyDown:f=>{(f.key==="Enter"||f.key===" ")&&(f.stopPropagation(),s(t))},children:e.jsx(y.MdOutlineModeEdit,{size:16})}),e.jsx("div",{className:"ff-ms-2",role:"button",tabIndex:0,onClick:f=>{f.stopPropagation(),r(t)},onKeyDown:f=>{(f.key==="Enter"||f.key===" ")&&(f.stopPropagation(),r(t))},children:e.jsx(y.MdDeleteOutline,{color:"red",size:16})})]})]}),e.jsx("div",{style:{margin:"0 6px 10px",padding:"10px 12px",borderRadius:6,background:"#fafafa",fontSize:12},children:l?e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:4},children:[o.map((f,c)=>{var h,a;const x=P.BRANCH_PALETTE[c%P.BRANCH_PALETTE.length],u=(h=f.conditions)==null?void 0:h[0],g=(((a=f.conditions)==null?void 0:a.length)??0)-1;return e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6},children:[e.jsx("span",{style:{fontSize:10,fontWeight:600,padding:"2px 7px",borderRadius:10,background:x.bg,color:x.color,flexShrink:0},children:f.label||f.key}),u?e.jsxs("span",{style:{fontSize:11,color:"#616161",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:[u.field," ",Be[u.operator]??u.operator,u.value?` ${u.value}`:"",g>0?` +${g} more`:""]}):e.jsx("span",{style:{fontSize:11,color:"#9e9e9e"},children:"No conditions yet"})]},f.key)}),d&&e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6,marginTop:2},children:[e.jsx("span",{style:{fontSize:10,fontWeight:600,padding:"2px 7px",borderRadius:10,background:"#f5f5f5",color:"#757575",flexShrink:0},children:"Default"}),e.jsx("span",{style:{fontSize:11,color:"#9e9e9e"},children:"fallback path"})]})]}):e.jsx("span",{className:"ff-text-muted",children:"Not configured — click edit to add branches"})})]}),e.jsx(p.Handle,{type:"source",position:p.Position.Bottom,style:{opacity:0}})]})},_e=({id:t,data:n})=>{var h;const{onEditNode:s,onDeleteNode:r,nodeRegistry:i}=k(),{title:o="Sub-Workflow",workflowId:d,workflowLabel:l,descriptorType:f,onPreview:c}=n,x=f?(h=i==null?void 0:i.forType(f))==null?void 0:h.icon:e.jsx(y.MdAccountTree,{size:16,color:"#00695c"}),u=!!d,g=a=>{a.stopPropagation(),d&&c&&c(d)};return e.jsxs("div",{style:{width:P.NODE_WIDTH},children:[e.jsx(p.Handle,{type:"target",position:p.Position.Top,style:{opacity:0}}),e.jsxs("div",{style:{border:"1.5px solid #80cbc4",borderRadius:8,background:"#fff"},children:[e.jsxs("div",{className:"ff-d-flex ff-justify-content-between ff-align-items-center",style:{padding:"10px 6px"},children:[e.jsxs("div",{className:"ff-d-flex ff-align-items-center ff-gap-2",children:[e.jsx("div",{style:{width:25,height:25,borderRadius:6,background:"rgba(0,137,123,0.1)",display:"flex",alignItems:"center",justifyContent:"center"},children:x}),e.jsx("span",{className:"ff-fw-medium ff-text-dark",style:{fontSize:14},children:o})]}),e.jsxs("div",{className:"node-actions ff-d-flex ff-align-items-center",children:[e.jsx("div",{role:"button",tabIndex:0,onClick:a=>{a.stopPropagation(),s(t)},onKeyDown:a=>{(a.key==="Enter"||a.key===" ")&&(a.stopPropagation(),s(t))},children:e.jsx(y.MdOutlineModeEdit,{size:16})}),e.jsx("div",{className:"ff-ms-2",role:"button",tabIndex:0,onClick:a=>{a.stopPropagation(),r(t)},onKeyDown:a=>{(a.key==="Enter"||a.key===" ")&&(a.stopPropagation(),r(t))},children:e.jsx(y.MdDeleteOutline,{color:"red",size:16})})]})]}),e.jsx("div",{style:{margin:"0 6px 10px",padding:"10px 12px",borderRadius:6,background:u?"#e0f2f1":"#fafafa",fontSize:12,border:u?"1px solid #b2dfdb":"none"},children:u?e.jsxs("div",{className:"ff-d-flex ff-align-items-center ff-justify-content-between",children:[e.jsxs("div",{className:"ff-d-flex ff-flex-column ff-gap-1",children:[e.jsx("span",{style:{fontSize:12,fontWeight:600,color:"#00695c"},children:l||d}),e.jsxs("span",{style:{fontSize:10,color:"#80cbc4",fontFamily:"monospace"},children:["ID: ",d]})]}),c&&e.jsxs("div",{role:"button",tabIndex:0,onClick:g,onKeyDown:a=>{(a.key==="Enter"||a.key===" ")&&g(a)},style:{cursor:"pointer",display:"flex",alignItems:"center",gap:3,fontSize:11,color:"#00897b"},children:[e.jsx(y.MdOpenInNew,{size:13}),"Preview"]})]}):e.jsx("span",{className:"ff-text-muted",children:"Not configured — select a workflow"})})]}),e.jsx(p.Handle,{type:"source",position:p.Position.Bottom,style:{opacity:0}})]})},Ke={startNode:le,endNode:re,addTriggerNode:ce,addStepNode:Te,triggerNode:pe,eventNode:Re,filterNode:he,actionNode:ue,approvalNode:ge,delayNode:ye,notificationNode:me,webhookTriggerNode:je,restApiNode:be,conditionBranchNode:Oe,subWorkflowNode:_e},qe=11.5,Y=2,R=6,J=40,Q=20,X=4,Ue=({id:t,sourceX:n,sourceY:s,targetX:r,targetY:i,sourcePosition:o,targetPosition:d,source:l,target:f,data:c})=>{const[x,u,g]=p.getStraightPath({sourceX:n,sourceY:s,targetX:r,targetY:i}),h=c==null?void 0:c.label,a=h==="Pass",j=a||h==="Fail",N=n+(r-n)/3,w=s+(i-s)/3,v=n+2*(r-n)/3,S=s+2*(i-s)/3,m=c==null?void 0:c.onAddStepClick,C=b=>{if(b.stopPropagation(),typeof m!="function")return;const ve={edgeId:t,nodeId:l,sourceNodeId:l,targetNodeId:f,position:"between",referenceNodeId:l,referenceNodeType:c==null?void 0:c.referenceNodeType,stepVisibility:c==null?void 0:c.stepVisibility};m(l,ve)},A=b=>{(b.key==="Enter"||b.key===" ")&&(b.preventDefault(),C(b))},D=()=>e.jsxs(e.Fragment,{children:[e.jsxs("g",{className:"plus-icon-container",children:[e.jsx("circle",{r:qe,className:"edge-plus-circle"}),e.jsx("line",{x1:0,y1:-R,x2:0,y2:R,strokeWidth:Y,strokeLinecap:"round",className:"plus-line"}),e.jsx("line",{x1:-R,y1:0,x2:R,y2:0,strokeWidth:Y,strokeLinecap:"round",className:"plus-line"})]}),e.jsxs("g",{className:"edge-plus-tooltip",transform:"translate(18, 0)",children:[e.jsx("rect",{x:0,y:-10,width:65,height:20,rx:4,className:"tooltip-bg"}),e.jsx("path",{d:"M0 -4 L-4 0 L0 4 Z",className:"tooltip-bg"}),e.jsx("text",{x:32,y:0,textAnchor:"middle",dominantBaseline:"central",fill:"white",style:{fontSize:10,fontWeight:600,pointerEvents:"none"},children:"Add Step"})]})]}),z=m?{onClick:C,onKeyDown:A,role:"button",tabIndex:0,style:{cursor:"pointer",pointerEvents:"all"}}:{style:{cursor:"default",pointerEvents:"all"}};return e.jsxs("g",{className:"edge-with-plus-wrapper",children:[e.jsx(p.BaseEdge,{id:t,path:x}),j?e.jsxs(e.Fragment,{children:[e.jsxs("g",{transform:`translate(${N}, ${w})`,children:[e.jsx("rect",{x:-J/2,y:-Q/2,width:J,height:Q,rx:X,ry:X,fill:a?"#ADE6C5":"#FDBFBF"}),e.jsx("text",{textAnchor:"middle",dominantBaseline:"central",fill:a?"#1DBF60":"#C50000",style:{fontSize:12,fontWeight:500},children:h})]}),e.jsx("g",{className:"nodrag nopan edge-plus-svg",transform:`translate(${v}, ${S})`,"data-testid":"plus-node-icon",...z,children:e.jsx(D,{})})]}):e.jsx("g",{className:"nodrag nopan edge-plus-svg",transform:`translate(${u}, ${g})`,"data-testid":"plus-node-icon",...z,children:e.jsx(D,{})})]})},Ge=11.5,ee=2,W=6,Ve=({id:t,sourceX:n,sourceY:s,targetX:r,targetY:i,source:o,target:d,data:l})=>{const[f,c,x]=p.getStraightPath({sourceX:n,sourceY:s,targetX:r,targetY:i}),u=l==null?void 0:l.onAddStepClick,g=a=>{a.stopPropagation(),typeof u=="function"&&u(o,{edgeId:t,nodeId:o,sourceNodeId:o,targetNodeId:d,position:"between",referenceNodeId:o,referenceNodeType:l==null?void 0:l.referenceNodeType,stepVisibility:l==null?void 0:l.stepVisibility,filterId:l==null?void 0:l.filterId,branch:l==null?void 0:l.branch})},h=a=>{(a.key==="Enter"||a.key===" ")&&(a.preventDefault(),g(a))};return e.jsxs("g",{className:"edge-with-plus-wrapper",children:[e.jsx(p.BaseEdge,{id:t,path:f,style:{stroke:"#b0bec5"}}),e.jsxs("g",{className:"nodrag nopan edge-plus-svg",transform:`translate(${c}, ${x})`,style:{cursor:u?"pointer":"default",pointerEvents:"all",outline:"none"},onClick:u?g:void 0,onKeyDown:u?h:void 0,role:u?"button":void 0,tabIndex:u?0:void 0,"data-testid":"plus-node-icon",children:[e.jsx("circle",{r:Ge,className:"edge-plus-circle"}),e.jsx("line",{x1:0,y1:-W,x2:0,y2:W,strokeWidth:ee,strokeLinecap:"round",className:"plus-line"}),e.jsx("line",{x1:-W,y1:0,x2:W,y2:0,strokeWidth:ee,strokeLinecap:"round",className:"plus-line"}),e.jsxs("g",{className:"edge-plus-tooltip",transform:"translate(18, 0)",children:[e.jsx("rect",{x:0,y:-10,width:65,height:20,rx:4,className:"tooltip-bg"}),e.jsx("path",{d:"M0 -4 L-4 0 L0 4 Z",className:"tooltip-bg"}),e.jsx("text",{x:32,y:0,textAnchor:"middle",dominantBaseline:"central",fill:"white",style:{fontSize:10,fontWeight:600,pointerEvents:"none"},children:"Add Step"})]})]})]})},Ze=({id:t,sourceX:n,sourceY:s,targetX:r,targetY:i})=>{const[o]=p.getStraightPath({sourceX:n,sourceY:s,targetX:r,targetY:i});return e.jsx(p.BaseEdge,{id:t,path:o,style:{stroke:"#b0bec5"}})},Ye=11.5,te=2,M=6,Je=-24,ne=40,se=20,ie=4,Qe=({id:t,sourceX:n,sourceY:s,targetX:r,targetY:i,source:o,target:d,data:l})=>{const[f,c,x]=p.getStraightPath({sourceX:n,sourceY:s,targetX:r,targetY:i}),u=l==null?void 0:l.label,g=u==="Pass",h=g||u==="Fail",a=l==null?void 0:l.onAddStepClick,j=(l==null?void 0:l.showPlus)!==!1&&!!a,N=v=>{v.stopPropagation(),typeof a=="function"&&a(o,{edgeId:t,nodeId:o,sourceNodeId:o,targetNodeId:d,position:"between",referenceNodeId:o,referenceNodeType:l==null?void 0:l.referenceNodeType,stepVisibility:l==null?void 0:l.stepVisibility})},w=v=>{(v.key==="Enter"||v.key===" ")&&(v.preventDefault(),N(v))};return e.jsxs("g",{className:"edge-with-plus-wrapper",children:[e.jsx(p.BaseEdge,{id:t,path:f,style:{stroke:"#b0bec5"}}),e.jsxs("g",{className:"nodrag nopan edge-plus-svg",transform:`translate(${c}, ${x})`,style:{cursor:a?"pointer":"default",pointerEvents:"all",outline:"none"},onClick:a?N:void 0,onKeyDown:a?w:void 0,role:a?"button":void 0,tabIndex:a?0:void 0,children:[h&&e.jsxs("g",{transform:`translate(0, ${j?Je:0})`,children:[e.jsx("rect",{x:-ne/2,y:-se/2,width:ne,height:se,rx:ie,ry:ie,fill:g?"#ADE6C5":"#FDBFBF"}),e.jsx("text",{textAnchor:"middle",dominantBaseline:"central",fill:g?"#1DBF60":"#C50000",style:{fontSize:12,fontWeight:500},children:u})]}),j&&e.jsxs("g",{className:"plus-icon-container",children:[e.jsx("circle",{r:Ye,className:"edge-plus-circle"}),e.jsx("line",{x1:0,y1:-M,x2:0,y2:M,strokeWidth:te,strokeLinecap:"round",className:"plus-line"}),e.jsx("line",{x1:-M,y1:0,x2:M,y2:0,strokeWidth:te,strokeLinecap:"round",className:"plus-line"})]}),j&&e.jsxs("g",{className:"edge-plus-tooltip",transform:"translate(22, 0)",children:[e.jsx("rect",{x:0,y:-10,width:65,height:20,rx:4,className:"tooltip-bg"}),e.jsx("path",{d:"M0 -4 L-4 0 L0 4 Z",className:"tooltip-bg"}),e.jsx("text",{x:32,y:0,textAnchor:"middle",dominantBaseline:"central",fill:"white",style:{fontSize:10,fontWeight:600,pointerEvents:"none"},children:"Add Step"})]})]})]})},Xe=({id:t,source:n,target:s,sourceX:r,sourceY:i,targetX:o,targetY:d,style:l={},markerEnd:f,data:c})=>{const x=(c==null?void 0:c.verticalRouting)??!1,u=(c==null?void 0:c.sideRouting)??!1,g=30,h=u?`M ${r},${i} L ${o},${i} L ${o},${d}`:x?(()=>{const b=d-g;return`M ${r},${b} L ${o},${b} L ${o},${d}`})():(()=>{const b=i+30;return`M ${r},${i} L ${r},${b} L ${o},${b} L ${o},${d}`})(),a=l.stroke||"#d1d5db",j=c==null?void 0:c.label,N=(c==null?void 0:c.isFirst)??!1,w=c==null?void 0:c.onAddStepClick,v=u?i:x?d-g:i+30,S=u?r+(o-r)*.45:r+(o-r)*(x?.25:.35),m=r+(o-r)*(x?.65:.7),C=v,A=b=>{b.stopPropagation(),w&&w(n,{edgeId:t,nodeId:n,sourceNodeId:n,targetNodeId:s,position:"between",referenceNodeId:n,filterId:c==null?void 0:c.filterId,branch:c==null?void 0:c.branch})},D=11.5,z=6;return e.jsxs("g",{children:[e.jsx("path",{id:t,d:h,fill:"none",stroke:a,strokeWidth:1.5,markerEnd:f}),j&&(!x||u)&&e.jsx("g",{transform:`translate(${S}, ${C})`,children:(()=>{const b=Math.max(44,j.length*7+20);return e.jsxs(e.Fragment,{children:[e.jsx("rect",{x:-b/2,y:-11,width:b,height:22,rx:11,fill:N?"#e8f5e9":"#ffebee",stroke:N?"#81c784":"#e57373",strokeWidth:1}),e.jsx("text",{x:0,y:4,textAnchor:"middle",fontSize:10,fontWeight:600,fill:N?"#2e7d32":"#c62828",style:{fontFamily:"sans-serif",pointerEvents:"none"},children:j})]})})()}),w&&e.jsxs("g",{transform:`translate(${m}, ${C})`,onClick:A,style:{cursor:"pointer",pointerEvents:"all"},className:"nodrag nopan edge-plus-svg",children:[e.jsx("circle",{r:D,className:"edge-plus-circle"}),e.jsx("line",{x1:0,y1:-z,x2:0,y2:z,strokeWidth:2,strokeLinecap:"round",className:"plus-line"}),e.jsx("line",{x1:-z,y1:0,x2:z,y2:0,strokeWidth:2,strokeLinecap:"round",className:"plus-line"})]})]})};exports.ActionNode=ue;exports.AddTriggerNode=ce;exports.ApprovalNode=ge;exports.DelayNode=ye;exports.EdgeWithPlusLabel=Ue;exports.EndNode=re;exports.FilterNode=he;exports.GatewayBranchEdge=Xe;exports.LabelPlusEdge=Qe;exports.NodeBody=_;exports.NotificationNode=me;exports.PlainEdge=Ze;exports.PlusEdge=Ve;exports.RestApiNode=be;exports.StartNode=le;exports.TriggerNode=pe;exports.WebhookTriggerNode=je;exports.WorkflowCanvasContext=oe;exports.builtInNodeTypes=Ke;exports.deriveRows=de;exports.resolveNodeRows=ae;
2
+ //# sourceMappingURL=GatewayBranchEdge-CdoZtIhn.js.map