@eventcatalog/visualiser 3.13.0-beta.2 → 3.14.0
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.
- package/dist/index.d.mts +213 -105
- package/dist/index.d.ts +213 -105
- package/dist/index.js +8231 -4487
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +8306 -4542
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +3220 -16
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/NodeGraph.tsx","../src/nodes/service/ServiceNode.tsx","../src/nodes/event/EventNode.tsx","../src/nodes/event/config.ts","../src/nodes/node-types.ts","../src/nodes/query/QueryNode.tsx","../src/nodes/command/CommandNode.tsx","../src/nodes/channel/ChannelNode.tsx","../src/utils/protocols.tsx","../src/nodes/data/DataNode.tsx","../src/nodes/data/config.ts","../src/nodes/view/ViewNode.tsx","../src/nodes/actor/ActorNode.tsx","../src/nodes/actor/config.ts","../src/nodes/external-system/ExternalSystem.tsx","../src/nodes/external-system/config.ts","../src/nodes/note/NoteNode.tsx","../src/nodes/Flow.tsx","../src/utils/url-builder.ts","../src/utils/badges.tsx","../src/nodes/Entity.tsx","../src/nodes/User.tsx","../src/nodes/Step.tsx","../src/nodes/Domain.tsx","../src/nodes/Custom.tsx","../src/nodes/ExternalSystem2.tsx","../src/nodes/DataProduct.tsx","../src/edges/AnimatedMessageEdge.tsx","../src/edges/MultilineEdgeLabel.tsx","../src/edges/FlowEdge.tsx","../src/components/VisualiserSearch.tsx","../src/components/StepWalkthrough.tsx","../src/components/StudioModal.tsx","../src/utils/export-node-graph.ts","../src/components/FocusModeModal.tsx","../src/components/FocusMode/FocusModeContent.tsx","../src/components/FocusMode/utils.ts","../src/components/FocusMode/FocusModeNodeActions.tsx","../src/components/FocusMode/FocusModePlaceholder.tsx","../src/components/MermaidView.tsx","../src/utils/export-mermaid.ts","../src/utils/clipboard.ts","../src/components/VisualizerDropdownContent.tsx","../src/components/NodeContextMenu.tsx","../src/nodes/index.ts","../src/edges/index.ts","../src/utils/utils/utils.ts"],"sourcesContent":["import { useEffect, useMemo, useState, useCallback, useRef } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n ReactFlow,\n Background,\n ConnectionLineType,\n Controls,\n Panel,\n MiniMap,\n ReactFlowProvider,\n useNodesState,\n useEdgesState,\n type Edge,\n type Node,\n type NodeChange,\n useReactFlow,\n getNodesBounds,\n getViewportForBounds,\n type NodeTypes,\n} from \"@xyflow/react\";\nimport \"@xyflow/react/dist/style.css\";\nimport {\n ExternalLink,\n HistoryIcon,\n CheckIcon,\n ClipboardIcon,\n MoreVertical,\n} from \"lucide-react\";\nimport * as DropdownMenu from \"@radix-ui/react-dropdown-menu\";\nimport { toPng } from \"html-to-image\";\n// Nodes and edges\n// Studio-2 nodes (named exports from directories)\nimport { Service as ServiceNode } from \"../nodes/service\";\nimport { Event as EventNode } from \"../nodes/event\";\nimport { Query as QueryNode } from \"../nodes/query\";\nimport { Command as CommandNode } from \"../nodes/command\";\nimport { Channel as ChannelNode } from \"../nodes/channel\";\nimport { Data as DataNode } from \"../nodes/data\";\nimport { View as ViewNode } from \"../nodes/view\";\nimport { Actor as ActorNode } from \"../nodes/actor\";\nimport { ExternalSystem as ExternalSystemNode } from \"../nodes/external-system\";\nimport { Note as NoteNode } from \"../nodes/note\";\n// Core nodes (default exports from flat files)\nimport FlowNode from \"../nodes/Flow\";\nimport EntityNode from \"../nodes/Entity\";\nimport UserNode from \"../nodes/User\";\nimport StepNode from \"../nodes/Step\";\nimport DomainNode from \"../nodes/Domain\";\nimport CustomNode from \"../nodes/Custom\";\nimport ExternalSystemNode2 from \"../nodes/ExternalSystem2\";\nimport DataProductNode from \"../nodes/DataProduct\";\n// Edges\nimport AnimatedMessageEdge from \"../edges/AnimatedMessageEdge\";\nimport MultilineEdgeLabel from \"../edges/MultilineEdgeLabel\";\nimport FlowEdge from \"../edges/FlowEdge\";\nimport VisualiserSearch, { type VisualiserSearchRef } from \"./VisualiserSearch\";\nimport StepWalkthrough from \"./StepWalkthrough\";\nimport StudioModal from \"./StudioModal\";\nimport FocusModeModal from \"./FocusModeModal\";\nimport MermaidView from \"./MermaidView\";\nimport VisualizerDropdownContent from \"./VisualizerDropdownContent\";\nimport NodeContextMenu from \"./NodeContextMenu\";\nimport { convertToMermaid } from \"../utils/export-mermaid\";\nimport { copyToClipboard } from \"../utils/clipboard\";\n\n// Minimum pixel change to detect layout modifications (avoids floating point comparison issues)\nconst POSITION_CHANGE_THRESHOLD = 1;\n\ninterface Props {\n nodes: any;\n edges: any;\n title?: string;\n subtitle?: string;\n includeBackground?: boolean;\n includeControls?: boolean;\n linkTo?: \"docs\" | \"visualiser\";\n includeKey?: boolean;\n linksToVisualiser?: boolean;\n links?: { label: string; url: string }[];\n mode?: \"full\" | \"simple\";\n showFlowWalkthrough?: boolean;\n showSearch?: boolean;\n zoomOnScroll?: boolean;\n designId?: string;\n isStudioModalOpen?: boolean;\n setIsStudioModalOpen?: (isOpen: boolean) => void;\n isChatEnabled?: boolean;\n maxTextSize?: number;\n isDevMode?: boolean;\n resourceKey?: string;\n\n // Callback API for framework integration\n /** Called when a node is clicked */\n onNodeClick?: (node: Node) => void;\n /** Called to build URLs for navigation (used in links dropdown) */\n onBuildUrl?: (path: string) => string;\n /** Called when navigation should occur */\n onNavigate?: (url: string) => void;\n /** Called to save layout positions (dev mode only) */\n onSaveLayout?: (\n resourceKey: string,\n positions: Record<string, { x: number; y: number }>,\n ) => Promise<boolean>;\n /** Called to reset layout positions (dev mode only) */\n onResetLayout?: (resourceKey: string) => Promise<boolean>;\n}\n\nconst NodeGraphBuilder = ({\n nodes: initialNodes,\n edges: initialEdges,\n title,\n includeBackground = true,\n linkTo: _linkTo = \"docs\",\n includeKey = true,\n linksToVisualiser = false,\n links = [],\n mode = \"full\",\n showFlowWalkthrough = true,\n showSearch = true,\n zoomOnScroll = false,\n isStudioModalOpen,\n setIsStudioModalOpen = () => {},\n isChatEnabled = false,\n maxTextSize,\n isDevMode = false,\n resourceKey,\n onNodeClick,\n onBuildUrl: _onBuildUrl,\n onNavigate,\n onSaveLayout,\n onResetLayout,\n}: Props) => {\n const nodeTypes = useMemo(() => {\n const wrapWithContextMenu = (Component: React.ComponentType<any>) => {\n const Wrapped = (props: any) => {\n const items = props.data?.contextMenu;\n if (!items?.length) return <Component {...props} />;\n return (\n <NodeContextMenu items={items}>\n <Component {...props} />\n </NodeContextMenu>\n );\n };\n Wrapped.displayName = `WithContextMenu(${Component.displayName || Component.name || \"Component\"})`;\n return Wrapped;\n };\n\n return {\n service: wrapWithContextMenu(ServiceNode),\n services: wrapWithContextMenu(ServiceNode),\n flow: wrapWithContextMenu(FlowNode),\n flows: wrapWithContextMenu(FlowNode),\n event: wrapWithContextMenu(EventNode),\n events: wrapWithContextMenu(EventNode),\n channel: wrapWithContextMenu(ChannelNode),\n channels: wrapWithContextMenu(ChannelNode),\n query: wrapWithContextMenu(QueryNode),\n queries: wrapWithContextMenu(QueryNode),\n command: wrapWithContextMenu(CommandNode),\n commands: wrapWithContextMenu(CommandNode),\n domain: wrapWithContextMenu(DomainNode),\n domains: wrapWithContextMenu(DomainNode),\n step: StepNode,\n user: UserNode,\n custom: CustomNode,\n externalSystem: wrapWithContextMenu(ExternalSystemNode),\n \"external-system\": wrapWithContextMenu(ExternalSystemNode2),\n entity: wrapWithContextMenu(EntityNode),\n entities: wrapWithContextMenu(EntityNode),\n data: wrapWithContextMenu(DataNode),\n view: wrapWithContextMenu(ViewNode),\n actor: ActorNode,\n \"data-product\": wrapWithContextMenu(DataProductNode),\n \"data-products\": wrapWithContextMenu(DataProductNode),\n note: (props: any) => <NoteNode {...props} readOnly={true} />,\n } as unknown as NodeTypes;\n }, []);\n const edgeTypes = useMemo(\n () => ({\n animated: AnimatedMessageEdge,\n multiline: MultilineEdgeLabel,\n \"flow-edge\": FlowEdge,\n }),\n [],\n );\n const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes);\n const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);\n const [animateMessages, setAnimateMessages] = useState(false);\n const [_activeStepIndex, _setActiveStepIndex] = useState<number | null>(null);\n const [_isFullscreen, _setIsFullscreen] = useState(false);\n const [mermaidCode, setMermaidCode] = useState(\"\");\n const [isShareModalOpen, setIsShareModalOpen] = useState(false);\n const [shareUrlCopySuccess, setShareUrlCopySuccess] = useState(false);\n const [isMermaidView, setIsMermaidView] = useState(false);\n const [showMinimap, setShowMinimap] = useState(false);\n const [hasLayoutChanges, setHasLayoutChanges] = useState(false);\n const [isSavingLayout, setIsSavingLayout] = useState(false);\n const initialPositionsRef = useRef<Record<string, { x: number; y: number }>>(\n {},\n );\n // const [isStudioModalOpen, setIsStudioModalOpen] = useState(false);\n const [focusModeOpen, setFocusModeOpen] = useState(false);\n const [focusedNodeId, setFocusedNodeId] = useState<string | null>(null);\n\n // Check if there are channels to determine if we need the visualizer functionality\n const hasChannels = useMemo(\n () => initialNodes.some((node: any) => node.type === \"channels\"),\n [initialNodes],\n );\n // TODO: Re-enable channel visibility feature\n // const { hideChannels, toggleChannelsVisibility } = useChannelVisibility({\n // nodes,\n // edges,\n // setNodes,\n // setEdges,\n // skipProcessing: !hasChannels,\n // });\n // Temporary implementation\n const hideChannels = false;\n const toggleChannelsVisibility = () => {};\n const { fitView, getNodes } = useReactFlow();\n const searchRef = useRef<VisualiserSearchRef>(null);\n const reactFlowWrapperRef = useRef<HTMLDivElement>(null);\n const scrollableContainerRef = useRef<HTMLElement | null>(null);\n\n // Store initial node positions for change detection (dev mode only)\n useEffect(() => {\n if (isDevMode && initialNodes.length > 0) {\n const positions: Record<string, { x: number; y: number }> = {};\n initialNodes.forEach((node: Node) => {\n positions[node.id] = { x: node.position.x, y: node.position.y };\n });\n initialPositionsRef.current = positions;\n }\n }, [isDevMode, initialNodes]);\n\n // Detect layout changes by comparing current positions to initial positions\n const checkForLayoutChanges = useCallback(() => {\n if (!isDevMode) return;\n const initial = initialPositionsRef.current;\n if (Object.keys(initial).length === 0) return;\n\n const hasChanges = nodes.some((node) => {\n const initialPos = initial[node.id];\n return (\n initialPos &&\n (Math.abs(node.position.x - initialPos.x) > POSITION_CHANGE_THRESHOLD ||\n Math.abs(node.position.y - initialPos.y) > POSITION_CHANGE_THRESHOLD)\n );\n });\n\n setHasLayoutChanges(hasChanges);\n }, [isDevMode, nodes]);\n\n // Wrap onNodesChange to detect layout changes after node drag\n const handleNodesChange = useCallback(\n (changes: NodeChange[]) => {\n onNodesChange(changes);\n // Check for position changes after drag ends\n const hasDragEnd = changes.some(\n (change) => change.type === \"position\" && !change.dragging,\n );\n if (hasDragEnd) {\n // Use setTimeout to ensure state is updated\n setTimeout(checkForLayoutChanges, 0);\n }\n },\n [onNodesChange, checkForLayoutChanges],\n );\n\n const resetNodesAndEdges = useCallback(() => {\n setNodes((nds) =>\n nds.map((node) => {\n node.style = { ...node.style, opacity: 1 };\n return { ...node, animated: animateMessages };\n }),\n );\n setEdges((eds) =>\n eds.map((edge) => {\n edge.style = { ...edge.style, opacity: 1 };\n edge.labelStyle = { ...edge.labelStyle, opacity: 1 };\n return {\n ...edge,\n data: { ...edge.data, opacity: 1, animated: animateMessages },\n animated: animateMessages,\n };\n }),\n );\n }, [setNodes, setEdges, animateMessages]);\n\n const handleNodeClick = useCallback(\n (_: any, node: Node) => {\n // If custom onNodeClick is provided, use it\n if (onNodeClick) {\n onNodeClick(node);\n return;\n }\n\n // Legacy behavior for linksToVisualiser (deprecated - use onNodeClick instead)\n if (linksToVisualiser && onNavigate) {\n // Consumer should handle navigation - but onNodeClick wasn't provided\n return;\n }\n\n // Disable focus mode for flow and entity visualizations\n const isFlow = edges.some((edge: Edge) => edge.type === \"flow-edge\");\n const isEntityVisualizer = nodes.some((n: Node) => n.type === \"entities\");\n if (isFlow || isEntityVisualizer) return;\n\n // Open focus mode modal\n setFocusedNodeId(node.id);\n setFocusModeOpen(true);\n },\n [onNodeClick, linksToVisualiser, onNavigate, edges, nodes],\n );\n\n const toggleAnimateMessages = () => {\n setAnimateMessages(!animateMessages);\n localStorage.setItem(\n \"EventCatalog:animateMessages\",\n JSON.stringify(!animateMessages),\n );\n };\n\n // Handle fit to view\n const handleFitView = useCallback(() => {\n fitView({ duration: 400, padding: 0.2 });\n }, [fitView]);\n\n // animate messages, between views\n // URL parameter takes priority over localStorage\n useEffect(() => {\n const urlParams = new URLSearchParams(window.location.search);\n const animateParam = urlParams.get(\"animate\");\n\n if (animateParam === \"true\") {\n setAnimateMessages(true);\n } else if (animateParam === \"false\") {\n setAnimateMessages(false);\n } else {\n // Fall back to localStorage if no URL parameter\n const storedAnimateMessages = localStorage.getItem(\n \"EventCatalog:animateMessages\",\n );\n if (storedAnimateMessages !== null) {\n setAnimateMessages(storedAnimateMessages === \"true\");\n }\n }\n }, []);\n\n useEffect(() => {\n setEdges((eds) =>\n eds.map((edge) => ({\n ...edge,\n animated: animateMessages,\n type:\n edge.type === \"flow-edge\" || edge.type === \"multiline\"\n ? edge.type\n : animateMessages\n ? \"animated\"\n : \"default\",\n data: { ...edge.data, animateMessages, animated: animateMessages },\n })),\n );\n }, [animateMessages]);\n\n useEffect(() => {\n setTimeout(() => {\n fitView({ duration: 800 });\n }, 150);\n }, []);\n\n // Generate mermaid code from nodes and edges\n useEffect(() => {\n try {\n const code = convertToMermaid(nodes, edges, {\n includeStyles: true,\n direction: \"LR\",\n });\n setMermaidCode(code);\n } catch (error) {\n console.error(\"Error generating mermaid code:\", error);\n setMermaidCode(\"\");\n }\n }, [nodes, edges]);\n\n // Handle scroll wheel events to forward to page when no modifier keys are pressed\n // Only when zoomOnScroll is disabled\n // This is a fix for when we embed node graphs into pages, and users are scrolling the documentation pages\n // We dont want REACT FLOW to swallow the scroll events, so we forward them to the parent page\n useEffect(() => {\n // Skip scroll handling if zoomOnScroll is enabled\n if (zoomOnScroll) return;\n\n // Cache the scrollable container on mount (expensive operation done once)\n const findScrollableContainer = (): HTMLElement | null => {\n // Try specific known selectors first (fast)\n const selectors = [\n \".docs-layout .overflow-y-auto\",\n \".overflow-y-auto\",\n '[style*=\"overflow-y:auto\"]',\n '[style*=\"overflow-y: auto\"]',\n ];\n\n for (const selector of selectors) {\n const element = document.querySelector(selector) as HTMLElement;\n if (element) return element;\n }\n\n return null;\n };\n\n // Find and cache the scrollable container once\n if (!scrollableContainerRef.current) {\n scrollableContainerRef.current = findScrollableContainer();\n }\n\n const handleWheel = (event: WheelEvent) => {\n // Only forward scroll if no modifier keys are pressed\n if (!event.ctrlKey && !event.shiftKey && !event.metaKey) {\n event.preventDefault();\n\n const scrollableContainer = scrollableContainerRef.current;\n\n if (scrollableContainer) {\n scrollableContainer.scrollBy({\n top: event.deltaY,\n left: event.deltaX,\n behavior: \"instant\",\n });\n } else {\n // Fallback to window scroll\n window.scrollBy({\n top: event.deltaY,\n left: event.deltaX,\n behavior: \"instant\",\n });\n }\n }\n };\n\n const wrapper = reactFlowWrapperRef.current;\n if (wrapper) {\n wrapper.addEventListener(\"wheel\", handleWheel, { passive: false });\n return () => {\n wrapper.removeEventListener(\"wheel\", handleWheel);\n };\n }\n }, [zoomOnScroll]);\n\n const handlePaneClick = useCallback(() => {\n searchRef.current?.hideSuggestions();\n resetNodesAndEdges();\n fitView({ duration: 800 });\n }, [resetNodesAndEdges, fitView]);\n\n const handleNodeSelect = useCallback(\n (node: Node) => {\n handleNodeClick(null, node);\n },\n [handleNodeClick],\n );\n\n const handleSearchClear = useCallback(() => {\n resetNodesAndEdges();\n fitView({ duration: 800 });\n }, [resetNodesAndEdges, fitView]);\n\n const downloadImage = useCallback((dataUrl: string, filename?: string) => {\n const a = document.createElement(\"a\");\n a.setAttribute(\"download\", `${filename || \"eventcatalog\"}.png`);\n a.setAttribute(\"href\", dataUrl);\n a.click();\n }, []);\n\n const openStudioModal = () => {\n setIsStudioModalOpen(true);\n };\n\n const openChat = useCallback(() => {\n window.dispatchEvent(new CustomEvent(\"eventcatalog:open-chat\"));\n }, []);\n\n // Layout persistence handlers (dev mode only)\n const handleSaveLayout = useCallback(async (): Promise<boolean> => {\n if (!resourceKey || !onSaveLayout) return false;\n\n const positions: Record<string, { x: number; y: number }> = {};\n nodes.forEach((node) => {\n positions[node.id] = {\n x: node.position.x,\n y: node.position.y,\n };\n });\n\n return await onSaveLayout(resourceKey, positions);\n }, [nodes, resourceKey, onSaveLayout]);\n\n const handleResetLayout = useCallback(async (): Promise<boolean> => {\n if (!resourceKey || !onResetLayout) return false;\n return await onResetLayout(resourceKey);\n }, [resourceKey, onResetLayout]);\n\n // Quick save handler for the change detection UI\n const handleQuickSaveLayout = useCallback(async () => {\n setIsSavingLayout(true);\n const success = await handleSaveLayout();\n setIsSavingLayout(false);\n if (success) {\n // Update initial positions to current positions after save\n const positions: Record<string, { x: number; y: number }> = {};\n nodes.forEach((node) => {\n positions[node.id] = { x: node.position.x, y: node.position.y };\n });\n initialPositionsRef.current = positions;\n setHasLayoutChanges(false);\n }\n }, [handleSaveLayout, nodes]);\n\n const handleCopyArchitectureCode = useCallback(async () => {\n await copyToClipboard(mermaidCode);\n }, [mermaidCode]);\n\n const handleCopyShareUrl = useCallback(async () => {\n const url = typeof window !== \"undefined\" ? window.location.href : \"\";\n await copyToClipboard(url);\n setShareUrlCopySuccess(true);\n setTimeout(() => setShareUrlCopySuccess(false), 2000);\n }, []);\n\n const toggleFullScreen = useCallback(() => {\n if (!document.fullscreenElement) {\n reactFlowWrapperRef.current?.requestFullscreen().catch((err) => {\n console.error(\n `Error attempting to enable full-screen mode: ${err.message} (${err.name})`,\n );\n });\n } else {\n document.exitFullscreen();\n }\n }, []);\n\n useEffect(() => {\n const handleFullscreenChange = () => {\n _setIsFullscreen(!!document.fullscreenElement);\n setTimeout(() => {\n fitView({ duration: 800 });\n }, 100);\n };\n\n document.addEventListener(\"fullscreenchange\", handleFullscreenChange);\n return () => {\n document.removeEventListener(\"fullscreenchange\", handleFullscreenChange);\n };\n }, [fitView]);\n\n const handleExportVisual = useCallback(() => {\n const imageWidth = 1024;\n const imageHeight = 768;\n const nodesBounds = getNodesBounds(getNodes());\n const width =\n imageWidth > nodesBounds.width ? imageWidth : nodesBounds.width;\n const height =\n imageHeight > nodesBounds.height ? imageHeight : nodesBounds.height;\n const viewport = getViewportForBounds(\n nodesBounds,\n width,\n height,\n 0.5,\n 2,\n 0,\n );\n\n // Hide controls during export\n const controls = document.querySelector(\n \".react-flow__controls\",\n ) as HTMLElement;\n if (controls) controls.style.display = \"none\";\n\n toPng(document.querySelector(\".react-flow__viewport\") as HTMLElement, {\n backgroundColor: \"#f1f1f1\",\n width,\n height,\n style: {\n width: width.toString(),\n height: height.toString(),\n transform: `translate(${viewport.x}px, ${viewport.y}px) scale(${viewport.zoom})`,\n },\n }).then((dataUrl: string) => {\n downloadImage(dataUrl, title);\n // Restore controls\n if (controls) controls.style.display = \"block\";\n });\n }, [getNodes, downloadImage, title]);\n\n const handleLegendClick = useCallback(\n (collectionType: string, groupId?: string) => {\n const updatedNodes = nodes.map((node: Node<any>) => {\n // Check if the groupId is set first\n if (groupId && node.data.group && node.data.group?.id === groupId) {\n return { ...node, style: { ...node.style, opacity: 1 } };\n } else {\n if (node.type === collectionType) {\n return { ...node, style: { ...node.style, opacity: 1 } };\n }\n }\n return { ...node, style: { ...node.style, opacity: 0.1 } };\n });\n\n const updatedEdges = edges.map((edge) => {\n return {\n ...edge,\n data: { ...edge.data, opacity: 0.1 },\n style: { ...edge.style, opacity: 0.1 },\n labelStyle: { ...edge.labelStyle, opacity: 0.1 },\n animated: animateMessages,\n };\n });\n\n setNodes(updatedNodes);\n setEdges(updatedEdges);\n\n fitView({\n padding: 0.2,\n duration: 800,\n nodes: updatedNodes.filter((node) => node.type === collectionType),\n });\n },\n [nodes, edges, setNodes, setEdges, fitView],\n );\n\n const getNodesByCollectionWithColors = useCallback((nodes: Node<any>[]) => {\n const colorClasses = {\n events: \"bg-orange-600\",\n services: \"bg-pink-600\",\n flows: \"bg-teal-600\",\n commands: \"bg-blue-600\",\n queries: \"bg-green-600\",\n channels: \"bg-gray-600\",\n externalSystem: \"bg-pink-600\",\n actor: \"bg-yellow-500\",\n step: \"bg-gray-700\",\n data: \"bg-blue-600\",\n \"data-products\": \"bg-indigo-600\",\n };\n\n let legendForDomains: {\n [key: string]: { count: number; colorClass: string; groupId: string };\n } = {};\n\n // Find any groups\n const domainGroups = [\n ...new Set(\n nodes\n .filter(\n (node) => node.data.group && node.data.group?.type === \"Domain\",\n )\n .map((node) => node.data.group?.id),\n ),\n ];\n\n domainGroups.forEach((groupId) => {\n const group = nodes.filter(\n (node) => node.data.group && node.data.group?.id === groupId,\n );\n legendForDomains[`${groupId} (Domain)`] = {\n count: group.length,\n colorClass: \"bg-yellow-600\",\n groupId,\n };\n });\n\n const legendForNodes = nodes.reduce(\n (\n acc: {\n [key: string]: {\n count: number;\n colorClass: string;\n groupId?: string;\n };\n },\n node,\n ) => {\n const collection = node.type;\n if (collection) {\n if (acc[collection]) {\n acc[collection].count += 1;\n } else {\n acc[collection] = {\n count: 1,\n colorClass:\n colorClasses[collection as keyof typeof colorClasses] ||\n \"bg-black\",\n };\n }\n }\n return acc;\n },\n {},\n );\n\n return { ...legendForDomains, ...legendForNodes };\n }, []);\n\n const legend = getNodesByCollectionWithColors(nodes);\n\n const handleStepChange = useCallback(\n (\n nodeId: string | null,\n highlightPaths?: string[],\n shouldZoomOut?: boolean,\n ) => {\n if (nodeId === null) {\n // Reset all nodes and edges\n resetNodesAndEdges();\n _setActiveStepIndex(null);\n\n // If shouldZoomOut is true, fit the entire view\n if (shouldZoomOut) {\n setTimeout(() => {\n fitView({ duration: 800, padding: 0.1 });\n }, 100);\n }\n return;\n }\n\n const activeNode = nodes.find((node: Node) => node.id === nodeId);\n if (!activeNode) return;\n\n // Create set of highlighted nodes and edges\n const highlightedNodeIds = new Set<string>();\n const highlightedEdgeIds = new Set<string>();\n\n // Add current node\n highlightedNodeIds.add(activeNode.id);\n\n // Add incoming edges and their source nodes\n edges.forEach((edge: Edge) => {\n if (edge.target === activeNode.id) {\n highlightedEdgeIds.add(edge.id);\n highlightedNodeIds.add(edge.source);\n }\n });\n\n // Add outgoing edges\n if (highlightPaths) {\n // Highlight all possible paths when at a fork\n highlightPaths.forEach((pathId) => {\n const [source, target] = pathId.split(\"-\");\n edges.forEach((edge: Edge) => {\n if (edge.source === source && edge.target === target) {\n highlightedEdgeIds.add(edge.id);\n highlightedNodeIds.add(edge.target);\n }\n });\n });\n } else {\n // Highlight all outgoing edges normally\n edges.forEach((edge: Edge) => {\n if (edge.source === activeNode.id) {\n highlightedEdgeIds.add(edge.id);\n highlightedNodeIds.add(edge.target);\n }\n });\n }\n\n // Update nodes\n const updatedNodes = nodes.map((node: Node) => {\n if (highlightedNodeIds.has(node.id)) {\n return { ...node, style: { ...node.style, opacity: 1 } };\n }\n return { ...node, style: { ...node.style, opacity: 0.2 } };\n });\n\n // Update edges\n const updatedEdges = edges.map((edge: Edge) => {\n if (highlightedEdgeIds.has(edge.id)) {\n return {\n ...edge,\n data: { ...edge.data, opacity: 1, animated: true },\n style: { ...edge.style, opacity: 1, strokeWidth: 3 },\n labelStyle: { ...edge.labelStyle, opacity: 1 },\n animated: true,\n };\n }\n return {\n ...edge,\n data: { ...edge.data, opacity: 0.2, animated: false },\n style: { ...edge.style, opacity: 0.2, strokeWidth: 2 },\n labelStyle: { ...edge.labelStyle, opacity: 0.2 },\n animated: false,\n };\n });\n\n setNodes(updatedNodes);\n setEdges(updatedEdges);\n\n // Fit view to active node\n fitView({\n padding: 0.4,\n duration: 800,\n nodes: [activeNode],\n });\n },\n [nodes, edges, setNodes, setEdges, resetNodesAndEdges, fitView],\n );\n\n // Check if this is a flow visualization by checking if edges use flow-edge type\n const isFlowVisualization = edges.some(\n (edge: Edge) => edge.type === \"flow-edge\",\n );\n\n return (\n <div\n ref={reactFlowWrapperRef}\n className=\"w-full h-full bg-gray-50 flex flex-col\"\n >\n {isMermaidView ? (\n <>\n {/* Menu Bar for Mermaid View */}\n <div className=\"w-full pr-6 flex space-x-2 justify-between items-center bg-[rgb(var(--ec-page-bg))] border-b border-[rgb(var(--ec-page-border))] p-4\">\n <div className=\"flex space-x-2 ml-4\">\n {/* Settings Dropdown Menu */}\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <button\n className=\"py-2.5 px-4 bg-[rgb(var(--ec-page-bg))] hover:bg-[rgb(var(--ec-accent-subtle)/0.4)] border border-[rgb(var(--ec-page-border))] rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-[rgb(var(--ec-accent))] flex items-center gap-3 transition-all duration-200 hover:border-[rgb(var(--ec-accent)/0.3)] group whitespace-nowrap\"\n aria-label=\"Open menu\"\n >\n {title && (\n <span className=\"text-base font-medium text-[rgb(var(--ec-page-text))] leading-tight\">\n {title}\n </span>\n )}\n <MoreVertical className=\"h-5 w-5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0 group-hover:text-[rgb(var(--ec-accent))] transition-colors duration-150\" />\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n className=\"min-w-56 bg-[rgb(var(--ec-page-bg))] border border-[rgb(var(--ec-page-border))] rounded-lg shadow-xl z-50 py-1.5 animate-in fade-in zoom-in-95 duration-200\"\n sideOffset={0}\n align=\"end\"\n alignOffset={-180}\n >\n <DropdownMenu.Arrow className=\"fill-[rgb(var(--ec-page-bg))] stroke-[rgb(var(--ec-page-border))] stroke-1\" />\n <VisualizerDropdownContent\n isMermaidView={isMermaidView}\n setIsMermaidView={setIsMermaidView}\n animateMessages={animateMessages}\n toggleAnimateMessages={toggleAnimateMessages}\n hideChannels={hideChannels}\n toggleChannelsVisibility={toggleChannelsVisibility}\n hasChannels={hasChannels}\n showMinimap={showMinimap}\n setShowMinimap={setShowMinimap}\n handleFitView={handleFitView}\n searchRef={searchRef}\n isChatEnabled={isChatEnabled}\n openChat={openChat}\n handleCopyArchitectureCode={handleCopyArchitectureCode}\n handleExportVisual={handleExportVisual}\n setIsShareModalOpen={setIsShareModalOpen}\n toggleFullScreen={toggleFullScreen}\n openStudioModal={openStudioModal}\n isDevMode={isDevMode}\n onSaveLayout={handleSaveLayout}\n onResetLayout={handleResetLayout}\n />\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n </div>\n {mode === \"full\" && showSearch && (\n <div className=\"flex justify-end items-center gap-2\">\n {!isMermaidView && (\n <div className=\"w-96\">\n <VisualiserSearch\n ref={searchRef}\n nodes={nodes}\n onNodeSelect={handleNodeSelect}\n onClear={handleSearchClear}\n />\n </div>\n )}\n </div>\n )}\n </div>\n {/* Mermaid View */}\n <div className=\"flex-1 overflow-hidden relative\">\n <MermaidView\n nodes={nodes}\n edges={edges}\n maxTextSize={maxTextSize}\n />\n </div>\n </>\n ) : (\n <ReactFlow\n nodeTypes={nodeTypes}\n edgeTypes={edgeTypes}\n minZoom={0.07}\n nodes={nodes}\n edges={edges}\n fitView\n onNodesChange={handleNodesChange}\n onEdgesChange={onEdgesChange}\n connectionLineType={ConnectionLineType.SmoothStep}\n nodeOrigin={[0.1, 0.1]}\n onNodeClick={handleNodeClick}\n onPaneClick={handlePaneClick}\n zoomOnScroll={zoomOnScroll}\n className=\"relative\"\n >\n <Panel position=\"top-center\" className=\"w-full pr-6 \">\n <div className=\"flex space-x-2 justify-between items-center\">\n <div className=\"flex space-x-2 ml-4\">\n {/* Settings Dropdown Menu */}\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <button\n className=\"py-2.5 px-4 bg-[rgb(var(--ec-page-bg))] hover:bg-[rgb(var(--ec-accent-subtle)/0.4)] border border-[rgb(var(--ec-page-border))] rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-[rgb(var(--ec-accent))] flex items-center gap-3 transition-all duration-200 hover:border-[rgb(var(--ec-accent)/0.3)] group whitespace-nowrap\"\n aria-label=\"Open menu\"\n >\n {title && (\n <span className=\"text-base font-medium text-[rgb(var(--ec-page-text))] leading-tight\">\n {title}\n </span>\n )}\n <MoreVertical className=\"h-5 w-5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0 group-hover:text-[rgb(var(--ec-accent))] transition-colors duration-150\" />\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n className=\"min-w-56 bg-[rgb(var(--ec-page-bg))] border border-[rgb(var(--ec-page-border))] rounded-lg shadow-xl z-50 py-1.5 animate-in fade-in zoom-in-95 duration-200\"\n sideOffset={0}\n align=\"end\"\n alignOffset={-180}\n >\n <DropdownMenu.Arrow className=\"fill-[rgb(var(--ec-page-bg))] stroke-[rgb(var(--ec-page-border))] stroke-1\" />\n <VisualizerDropdownContent\n isMermaidView={isMermaidView}\n setIsMermaidView={setIsMermaidView}\n animateMessages={animateMessages}\n toggleAnimateMessages={toggleAnimateMessages}\n hideChannels={hideChannels}\n toggleChannelsVisibility={toggleChannelsVisibility}\n hasChannels={hasChannels}\n showMinimap={showMinimap}\n setShowMinimap={setShowMinimap}\n handleFitView={handleFitView}\n searchRef={searchRef}\n isChatEnabled={isChatEnabled}\n openChat={openChat}\n handleCopyArchitectureCode={handleCopyArchitectureCode}\n handleExportVisual={handleExportVisual}\n setIsShareModalOpen={setIsShareModalOpen}\n toggleFullScreen={toggleFullScreen}\n openStudioModal={openStudioModal}\n isDevMode={isDevMode}\n onSaveLayout={handleSaveLayout}\n onResetLayout={handleResetLayout}\n />\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n </div>\n {mode === \"full\" && showSearch && (\n <div className=\"flex justify-end items-center gap-2\">\n {!isMermaidView && (\n <div className=\"w-96\">\n <VisualiserSearch\n ref={searchRef}\n nodes={nodes}\n onNodeSelect={handleNodeSelect}\n onClear={handleSearchClear}\n />\n </div>\n )}\n </div>\n )}\n </div>\n {links.length > 0 && (\n <div className=\"flex justify-end mt-3\">\n <div className=\"relative flex items-center -mt-1\">\n <span className=\"absolute left-2 pointer-events-none flex items-center h-full\">\n <HistoryIcon className=\"h-4 w-4 text-gray-600\" />\n </span>\n <select\n value={\n links.find((link) =>\n window.location.href.includes(link.url),\n )?.url || links[0].url\n }\n onChange={(e) => {\n if (onNavigate) {\n onNavigate(e.target.value);\n } else {\n window.location.href = e.target.value;\n }\n }}\n className=\"appearance-none pl-7 pr-6 py-0 text-[14px] bg-white rounded-md border border-gray-200 hover:bg-gray-100/50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-[rgb(var(--ec-accent))]\"\n style={{ minWidth: 120, height: \"26px\" }}\n >\n {links.map((link) => (\n <option key={link.url} value={link.url}>\n {link.label}\n </option>\n ))}\n </select>\n <span className=\"absolute right-2 pointer-events-none\">\n <svg\n className=\"w-4 h-4 text-gray-400\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </span>\n </div>\n </div>\n )}\n </Panel>\n\n {includeBackground && <Background color=\"#bbb\" gap={16} />}\n {includeBackground && <Controls />}\n {showMinimap && (\n <MiniMap\n nodeStrokeWidth={3}\n zoomable\n pannable\n style={{\n backgroundColor: \"rgb(var(--ec-page-bg))\",\n border: \"1px solid rgb(var(--ec-page-border))\",\n borderRadius: \"8px\",\n }}\n />\n )}\n {isFlowVisualization && showFlowWalkthrough && (\n <Panel position=\"bottom-left\">\n <StepWalkthrough\n nodes={nodes}\n edges={edges}\n isFlowVisualization={isFlowVisualization}\n onStepChange={handleStepChange}\n mode={mode}\n />\n </Panel>\n )}\n {/* Dev Mode: Layout change indicator */}\n {isDevMode && hasLayoutChanges && (\n <Panel\n position=\"bottom-left\"\n style={\n isFlowVisualization && showFlowWalkthrough\n ? { marginBottom: \"20px\", marginLeft: \"410px\" }\n : { marginLeft: \"60px\" }\n }\n >\n <div className=\"bg-[rgb(var(--ec-card-bg))] border border-[rgb(var(--ec-page-border))] rounded-lg shadow-md px-3 py-2 flex items-center gap-3\">\n <span className=\"text-xs text-[rgb(var(--ec-page-text-muted))]\">\n Layout changed\n </span>\n <button\n onClick={handleQuickSaveLayout}\n disabled={isSavingLayout}\n className=\"text-xs font-medium text-[rgb(var(--ec-accent-text))] bg-[rgb(var(--ec-accent-subtle))] hover:bg-[rgb(var(--ec-accent-subtle)/0.7)] px-2 py-1 rounded transition-colors disabled:opacity-50\"\n >\n {isSavingLayout ? \"Saving...\" : \"Save\"}\n </button>\n </div>\n </Panel>\n )}\n {includeKey && (\n <Panel\n position=\"bottom-right\"\n style={showMinimap ? { marginRight: \"230px\" } : undefined}\n >\n <div className=\" bg-white font-light px-4 text-[12px] shadow-md py-1 rounded-md\">\n <ul className=\"m-0 p-0 \">\n {Object.entries(legend).map(\n ([key, { count, colorClass, groupId }]) => (\n <li\n key={key}\n className=\"flex space-x-2 items-center text-[10px] cursor-pointer hover:text-[rgb(var(--ec-accent))] hover:underline\"\n onClick={() => handleLegendClick(key, groupId)}\n >\n <span className={`w-2 h-2 block ${colorClass}`} />\n <span className=\"block capitalize\">\n {key} ({count})\n </span>\n </li>\n ),\n )}\n </ul>\n </div>\n </Panel>\n )}\n </ReactFlow>\n )}\n <StudioModal\n isOpen={isStudioModalOpen || false}\n onClose={() => setIsStudioModalOpen(false)}\n />\n <FocusModeModal\n isOpen={focusModeOpen}\n onClose={() => setFocusModeOpen(false)}\n initialNodeId={focusedNodeId}\n nodes={nodes}\n edges={edges}\n nodeTypes={nodeTypes}\n edgeTypes={edgeTypes}\n />\n\n {/* Share Link Modal */}\n {isShareModalOpen && (\n <>\n <div\n className=\"fixed inset-0 bg-black/20 z-40\"\n onClick={() => setIsShareModalOpen(false)}\n style={{ animation: \"fadeIn 150ms ease-out\" }}\n />\n <div\n className=\"fixed top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 bg-[rgb(var(--ec-page-bg))] rounded-lg shadow-xl z-50 w-full max-w-md p-6 border border-[rgb(var(--ec-page-border))]\"\n style={{ animation: \"slideInCenter 250ms ease-out\" }}\n >\n <style>{`\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n @keyframes slideInCenter {\n from { opacity: 0; transform: translate(-50%, -48%); }\n to { opacity: 1; transform: translate(-50%, -50%); }\n }\n `}</style>\n\n <div className=\"flex justify-between items-start mb-4\">\n <h3 className=\"text-lg font-semibold text-[rgb(var(--ec-page-text))]\">\n Share Link\n </h3>\n <button\n onClick={() => setIsShareModalOpen(false)}\n className=\"text-[rgb(var(--ec-page-text-muted))] hover:text-[rgb(var(--ec-page-text))] transition-colors\"\n aria-label=\"Close modal\"\n >\n <ExternalLink className=\"w-5 h-5 rotate-180\" />\n </button>\n </div>\n\n <p className=\"text-sm text-[rgb(var(--ec-page-text-muted))] mb-4\">\n Share this link with your team to let them view this\n visualization.\n </p>\n\n <div className=\"flex gap-2\">\n <input\n type=\"text\"\n readOnly\n value={\n typeof window !== \"undefined\" ? window.location.href : \"\"\n }\n className=\"flex-1 px-3 py-2.5 bg-[rgb(var(--ec-input-bg))] border border-[rgb(var(--ec-input-border))] rounded-md text-[rgb(var(--ec-input-text))] text-sm focus:outline-none focus:ring-2 focus:ring-[rgb(var(--ec-accent))]\"\n />\n <button\n onClick={handleCopyShareUrl}\n className={`px-4 py-2.5 rounded-md font-medium transition-all duration-200 flex items-center gap-2 ${\n shareUrlCopySuccess\n ? \"bg-green-500 text-white\"\n : \"bg-[rgb(var(--ec-accent))] text-white hover:opacity-90\"\n }`}\n aria-label={shareUrlCopySuccess ? \"Copied!\" : \"Copy link\"}\n >\n {shareUrlCopySuccess ? (\n <CheckIcon className=\"w-4 h-4\" />\n ) : (\n <ClipboardIcon className=\"w-4 h-4\" />\n )}\n <span>{shareUrlCopySuccess ? \"Copied!\" : \"Copy\"}</span>\n </button>\n </div>\n </div>\n </>\n )}\n </div>\n );\n};\n\ninterface NodeGraphProps {\n id: string;\n title?: string;\n href?: string;\n hrefLabel?: string;\n nodes: Node[];\n edges: Edge[];\n linkTo?: \"docs\" | \"visualiser\";\n includeKey?: boolean;\n footerLabel?: string;\n linksToVisualiser?: boolean;\n links?: { label: string; url: string }[];\n mode?: \"full\" | \"simple\";\n portalId?: string;\n showFlowWalkthrough?: boolean;\n showSearch?: boolean;\n zoomOnScroll?: boolean;\n designId?: string;\n isChatEnabled?: boolean;\n maxTextSize?: number;\n isDevMode?: boolean;\n resourceKey?: string;\n\n // Callback API for framework integration\n onNodeClick?: (node: Node) => void;\n onBuildUrl?: (path: string) => string;\n onNavigate?: (url: string) => void;\n onSaveLayout?: (\n resourceKey: string,\n positions: Record<string, { x: number; y: number }>,\n ) => Promise<boolean>;\n onResetLayout?: (resourceKey: string) => Promise<boolean>;\n}\n\nconst NodeGraph = ({\n id,\n nodes,\n edges,\n title,\n href,\n linkTo = \"docs\",\n hrefLabel = \"Open in visualizer\",\n includeKey = true,\n footerLabel,\n linksToVisualiser = false,\n links = [],\n mode = \"full\",\n portalId,\n showFlowWalkthrough = true,\n showSearch = true,\n zoomOnScroll = false,\n designId,\n isChatEnabled = false,\n maxTextSize,\n isDevMode = false,\n resourceKey,\n onNodeClick,\n onBuildUrl,\n onNavigate,\n onSaveLayout,\n onResetLayout,\n}: NodeGraphProps) => {\n const [elem, setElem] = useState(null);\n const [showFooter, setShowFooter] = useState(true);\n const [isStudioModalOpen, setIsStudioModalOpen] = useState(false);\n\n const openStudioModal = useCallback(() => {\n setIsStudioModalOpen(true);\n }, []);\n\n const containerToRenderInto = portalId || `${id}-portal`;\n\n useEffect(() => {\n // @ts-ignore\n setElem(document.getElementById(containerToRenderInto));\n }, []);\n\n useEffect(() => {\n const urlParams = new URLSearchParams(window.location.search);\n const embed = urlParams.get(\"embed\");\n if (embed === \"true\") {\n setShowFooter(false);\n }\n }, []);\n\n if (!elem) return null;\n\n return (\n <div>\n {createPortal(\n <ReactFlowProvider>\n <NodeGraphBuilder\n edges={edges}\n nodes={nodes}\n title={title}\n linkTo={linkTo}\n includeKey={includeKey}\n linksToVisualiser={linksToVisualiser}\n links={links}\n mode={mode}\n showFlowWalkthrough={showFlowWalkthrough}\n showSearch={showSearch}\n zoomOnScroll={zoomOnScroll}\n designId={designId || id}\n isStudioModalOpen={isStudioModalOpen}\n setIsStudioModalOpen={setIsStudioModalOpen}\n isChatEnabled={isChatEnabled}\n maxTextSize={maxTextSize}\n isDevMode={isDevMode}\n resourceKey={resourceKey}\n onNodeClick={onNodeClick}\n onBuildUrl={onBuildUrl}\n onNavigate={onNavigate}\n onSaveLayout={onSaveLayout}\n onResetLayout={onResetLayout}\n />\n\n {showFooter && (\n <div className=\"flex justify-between\" id=\"visualiser-footer\">\n {footerLabel && (\n <div className=\"py-2 w-full text-left \">\n <span className=\" text-sm no-underline py-2 text-gray-500\">\n {footerLabel}\n </span>\n </div>\n )}\n\n {href && (\n <div className=\"py-2 w-full text-right flex justify-between\">\n {/* <span className=\"text-sm text-gray-500 italic\">Right click a node to access documentation</span> */}\n <button\n onClick={openStudioModal}\n className=\" text-sm underline text-gray-800 hover:text-primary flex items-center space-x-1\"\n >\n <span>Open in EventCatalog Studio</span>\n <ExternalLink className=\"w-3 h-3\" />\n </button>\n <a\n className=\" text-sm underline text-gray-800 hover:text-primary\"\n href={href}\n >\n {hrefLabel} →\n </a>\n </div>\n )}\n </div>\n )}\n </ReactFlowProvider>,\n elem,\n )}\n </div>\n );\n};\n\nexport default NodeGraph;\n","import { ServerIcon } from \"lucide-react\";\nimport { Node, Handle, Position } from \"@xyflow/react\";\nimport { EventCatalogResource, Service as ServiceType } from \"../../types\";\n\nfunction classNames(...classes: any) {\n return classes.filter(Boolean).join(\" \");\n}\n\ntype ServiceNodeData = EventCatalogResource & {\n service: ServiceType;\n};\n\nexport type ServiceNode = Node<ServiceNodeData, \"service\">;\n\nexport default function Service(props: ServiceNode) {\n const { data: _data, selected } = props;\n const {\n version,\n owners = [],\n sends = [],\n receives = [],\n name,\n summary,\n } = props.data.service;\n\n const mode = props.data.mode || \"simple\";\n\n const nodeLabel = \"Service\";\n\n return (\n <div\n className={classNames(\n \"rounded-md border flex justify-start bg-white text-black relative\",\n selected\n ? \"border-pink-600 ring-2 ring-pink-500 shadow-lg\"\n : \"border-pink-400\",\n )}\n style={{ minHeight: \"100px\", width: \"260px\" }}\n >\n <Handle\n type=\"target\"\n position={Position.Left}\n className=\"!left-[-1px] !w-2.5 !h-2.5 !bg-pink-500 !border !border-pink-600 !rounded-full !z-10\"\n />\n <Handle\n type=\"source\"\n position={Position.Right}\n className=\"!right-[-1px] !w-2.5 !h-2.5 !bg-pink-500 !border !border-pink-600 !rounded-full !z-10\"\n />\n <div\n className={`bg-gradient-to-b from-pink-500 to-pink-700 relative flex flex-col items-center w-5 justify-between rounded-l-sm text-pink-100 border-r-[1px] border-pink-500`}\n >\n <ServerIcon\n className={`w-4 h-4 opacity-90 text-white mt-1 ${mode === \"full\" ? \"mb-2\" : \"mb-1\"}`}\n />\n {mode === \"full\" && (\n <span\n className=\"text-center text-[8px] text-white font-bold uppercase mb-6\"\n style={{\n transform: \"rotate(-90deg)\",\n letterSpacing: \"0.15em\",\n whiteSpace: \"nowrap\",\n }}\n >\n {nodeLabel}\n </span>\n )}\n </div>\n <div className=\"p-1 flex-1\">\n <div\n className={classNames(\n mode === \"full\" ? `border-b border-gray-200` : \"\",\n )}\n >\n <span className=\"text-xs font-bold block pt-0.5 pb-0.5\">{name}</span>\n <div className=\"flex justify-between\">\n <span className=\"text-[10px] font-light block pt-0.5 pb-0.5\">\n v{version}\n </span>\n {mode === \"simple\" && (\n <span className=\"text-[10px] text-gray-500 font-light block pt-0.5 pb-0.5\">\n {nodeLabel}\n </span>\n )}\n </div>\n </div>\n {mode === \"full\" && (\n <div className=\"divide-y divide-gray-200\">\n <div className=\"leading-3 py-1\">\n <div\n className=\"text-[8px] font-light overflow-hidden\"\n style={{\n display: \"-webkit-box\",\n WebkitLineClamp: 2,\n WebkitBoxOrient: \"vertical\",\n }}\n title={summary}\n >\n {summary}\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 gap-x-4 py-1\">\n <span className=\"text-xs\" style={{ fontSize: \"0.2em\" }}>\n Receives messages: {receives.length}\n </span>\n <span className=\"text-xs\" style={{ fontSize: \"0.2em\" }}>\n Publishes messages: {sends.length}\n </span>\n <span className=\"text-xs\" style={{ fontSize: \"0.2em\" }}>\n Owners: {owners.length}\n </span>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { Zap } from \"lucide-react\";\nimport { Node, Handle, Position } from \"@xyflow/react\";\nimport { Message, EventCatalogResource } from \"../../types\";\n\nfunction classNames(...classes: any) {\n return classes.filter(Boolean).join(\" \");\n}\n\ntype MessageNodeData = EventCatalogResource & {\n message: Message;\n};\n\nexport type EventNode = Node<MessageNodeData, \"event\">;\n\nexport default function Event(props: EventNode) {\n const {\n version,\n owners = [],\n producers = [],\n consumers = [],\n name,\n summary,\n } = props?.data?.message;\n\n const mode = props?.data?.mode || \"simple\";\n\n const nodeLabel = \"Event\";\n\n return (\n <div\n className={classNames(\n \"rounded-md border flex justify-start bg-white text-black relative\",\n props?.selected\n ? \"border-orange-600 ring-2 ring-orange-500 shadow-lg\"\n : \"border-orange-400\",\n )}\n style={{ minHeight: \"100px\", width: \"260px\" }}\n >\n <Handle\n type=\"target\"\n position={Position.Left}\n className=\"!left-[-1px] !w-2.5 !h-2.5 !bg-orange-500 !border !border-orange-600 !rounded-full !z-10\"\n />\n <Handle\n type=\"source\"\n position={Position.Right}\n className=\"!right-[-1px] !w-2.5 !h-2.5 !bg-orange-500 !border !border-orange-600 !rounded-full !z-10\"\n />\n <div\n className={`bg-gradient-to-b from-orange-500 to-orange-700 relative flex flex-col items-center w-5 justify-between rounded-l-sm text-orange-100 border-r-[1px] border-orange-500`}\n >\n <Zap\n className={`w-4 h-4 opacity-90 text-white mt-1 ${mode === \"full\" ? \"mb-2\" : \"mb-1\"}`}\n />\n {mode === \"full\" && (\n <span\n className=\"text-center text-[8px] text-white font-bold uppercase mb-4\"\n style={{\n transform: \"rotate(-90deg)\",\n letterSpacing: \"0.15em\",\n whiteSpace: \"nowrap\",\n }}\n >\n {nodeLabel}\n </span>\n )}\n </div>\n <div className=\"p-1 flex-1\">\n <div\n className={classNames(\n mode === \"full\" ? `border-b border-gray-200` : \"\",\n )}\n >\n <span className=\"text-xs font-bold block pt-0.5 pb-0.5\">{name}</span>\n <div className=\"flex justify-between\">\n <span className=\"text-[10px] font-light block pt-0.5 pb-0.5\">\n v{version}\n </span>\n {mode === \"simple\" && (\n <span className=\"text-[10px] text-gray-500 font-light block pt-0.5 pb-0.5\">\n {nodeLabel}\n </span>\n )}\n </div>\n </div>\n {mode === \"full\" && (\n <div className=\"divide-y divide-gray-200\">\n <div className=\"leading-3 py-1\">\n <div\n className=\"text-[8px] font-light overflow-hidden\"\n style={{\n display: \"-webkit-box\",\n WebkitLineClamp: 2,\n WebkitBoxOrient: \"vertical\",\n }}\n title={summary}\n >\n {summary}\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 gap-x-4 py-1\">\n <span className=\"text-xs\" style={{ fontSize: \"0.2em\" }}>\n Producers: {producers.length}\n </span>\n <span className=\"text-xs\" style={{ fontSize: \"0.2em\" }}>\n Consumers: {consumers.length}\n </span>\n <span className=\"text-xs\" style={{ fontSize: \"0.2em\" }}>\n Owners: {owners.length}\n </span>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { Connection, MarkerType } from \"@xyflow/react\";\nimport { Zap } from \"lucide-react\";\nimport { NodeConfiguration } from \"../../types\";\nimport { SERVICE, CHANNEL, EVENT } from \"../node-types\";\n\nexport default {\n type: \"event\",\n icon: Zap,\n color: \"orange\",\n targetCanConnectTo: [...SERVICE, ...CHANNEL],\n sourceCanConnectTo: [...SERVICE, ...CHANNEL],\n validateConnection: (connection: Connection) => {\n return connection.source !== connection.target;\n },\n getEdgeOptions: (connection: Connection) => {\n if (\n EVENT.includes(connection.source) &&\n SERVICE.includes(connection.target)\n ) {\n return {\n label: \"Publishes\",\n markerEnd: { type: MarkerType.ArrowClosed, color: \"#000000\" },\n };\n }\n return {\n label: \"Subscribes\",\n markerEnd: { type: MarkerType.ArrowClosed, color: \"#000000\" },\n };\n },\n defaultData: {\n name: \"New Event\",\n version: \"0.0.1\",\n summary: \"New event. Click edit to change the details.\",\n mode: \"full\",\n },\n editor: {\n title: \"Event\",\n subtitle: \"Edit the details of the event\",\n schema: {\n type: \"object\",\n required: [\"name\", \"version\"],\n properties: {\n name: {\n type: \"string\",\n title: \"Name\",\n default: \"Random value\",\n description:\n \"The name of the event. Use a verb-noun format (e.g., OrderPlaced).\",\n },\n version: {\n type: \"string\",\n title: \"Version\",\n default: \"1.0.0\",\n description: \"The version number (e.g., 1.0.0)\",\n pattern: \"^\\\\d+\\\\.\\\\d+\\\\.\\\\d+(?:-[\\\\w.-]+)?(?:\\\\+[\\\\w.-]+)?$\",\n },\n summary: {\n type: \"string\",\n title: \"Summary\",\n default: \"\",\n description: \"A brief summary of the event\",\n },\n },\n },\n },\n} as NodeConfiguration;\n","export const SERVICE = [\"service\", \"services\"];\nexport const EVENT = [\"event\", \"events\"];\nexport const QUERY = [\"queries\", \"query\", \"querie\"];\nexport const COMMAND = [\"command\", \"commands\"];\nexport const CHANNEL = [\"channel\", \"channels\"];\nexport const ACTOR = [\"actor\", \"actors\"];\nexport const DATA = [\"data\"];\nexport const VIEW = [\"view\"];\n\nexport const MESSAGE = [...EVENT, ...COMMAND, ...QUERY];\n","import { Search } from \"lucide-react\";\nimport { Node, Handle, Position } from \"@xyflow/react\";\nimport { Message, EventCatalogResource } from \"../../types\";\n\nfunction classNames(...classes: any) {\n return classes.filter(Boolean).join(\" \");\n}\n\ntype QueryNodeData = EventCatalogResource & {\n message: Message;\n};\n\nexport type QueryNode = Node<QueryNodeData, \"query\">;\n\nexport default function Query(props: QueryNode) {\n const {\n version,\n owners = [],\n producers = [],\n consumers = [],\n name,\n summary,\n } = props.data.message;\n\n const mode = props.data.mode || \"simple\";\n\n const nodeLabel = \"Query\";\n\n return (\n <div\n className={classNames(\n \"rounded-md border flex justify-start bg-white text-black relative\",\n props.selected\n ? \"border-green-600 ring-2 ring-green-500 shadow-lg\"\n : \"border-green-400\",\n )}\n style={{ minHeight: \"100px\", width: \"260px\" }}\n >\n <Handle\n type=\"target\"\n position={Position.Left}\n className=\"!left-[-1px] !w-2.5 !h-2.5 !bg-green-500 !border !border-green-600 !rounded-full !z-10\"\n />\n <Handle\n type=\"source\"\n position={Position.Right}\n className=\"!right-[-1px] !w-2.5 !h-2.5 !bg-green-500 !border !border-green-600 !rounded-full !z-10\"\n />\n <div\n className={`bg-gradient-to-b from-green-500 to-green-700 relative flex flex-col items-center w-5 justify-between rounded-l-sm text-green-100 border-r-[1px] border-green-500`}\n >\n <Search\n className={`w-4 h-4 opacity-90 text-white mt-1 ${mode === \"full\" ? \"mb-2\" : \"mb-1\"}`}\n />\n {mode === \"full\" && (\n <span\n className=\"text-center text-[8px] text-white font-bold uppercase mb-4\"\n style={{\n transform: \"rotate(-90deg)\",\n letterSpacing: \"0.15em\",\n whiteSpace: \"nowrap\",\n }}\n >\n {nodeLabel}\n </span>\n )}\n </div>\n <div className=\"p-1 flex-1\">\n <div\n className={classNames(\n mode === \"full\" ? `border-b border-gray-200` : \"\",\n )}\n >\n <span className=\"text-xs font-bold block pt-0.5 pb-0.5\">{name}</span>\n <div className=\"flex justify-between\">\n <span className=\"text-[10px] font-light block pt-0.5 pb-0.5\">\n v{version}\n </span>\n {mode === \"simple\" && (\n <span className=\"text-[10px] text-gray-500 font-light block pt-0.5 pb-0.5\">\n {nodeLabel}\n </span>\n )}\n </div>\n </div>\n {mode === \"full\" && (\n <div className=\"divide-y divide-gray-200\">\n <div className=\"leading-3 py-1\">\n <div\n className=\"text-[8px] font-light overflow-hidden\"\n style={{\n display: \"-webkit-box\",\n WebkitLineClamp: 2,\n WebkitBoxOrient: \"vertical\",\n }}\n title={summary}\n >\n {summary}\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 gap-x-4 py-1\">\n <span className=\"text-xs\" style={{ fontSize: \"0.2em\" }}>\n Producers: {producers.length}\n </span>\n <span className=\"text-xs\" style={{ fontSize: \"0.2em\" }}>\n Consumers: {consumers.length}\n </span>\n <span className=\"text-xs\" style={{ fontSize: \"0.2em\" }}>\n Owners: {owners.length}\n </span>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { MessageSquare } from \"lucide-react\";\nimport { Node, Handle, Position } from \"@xyflow/react\";\nimport { Message, EventCatalogResource } from \"../../types\";\n\nfunction classNames(...classes: any) {\n return classes.filter(Boolean).join(\" \");\n}\n\ntype CommandNodeData = EventCatalogResource & {\n message: Message;\n};\n\nexport type CommandNode = Node<CommandNodeData, \"command\">;\n\nexport default function Command(props: CommandNode) {\n const {\n version,\n owners = [],\n producers = [],\n consumers = [],\n name,\n summary,\n } = props.data.message;\n\n const mode = props.data.mode || \"simple\";\n\n const nodeLabel = \"Command\";\n\n return (\n <div\n className={classNames(\n \"rounded-md border flex justify-start bg-white text-black relative\",\n props.selected\n ? \"border-blue-600 ring-2 ring-blue-500 shadow-lg\"\n : \"border-blue-400\",\n )}\n style={{ minHeight: \"100px\", width: \"260px\" }}\n >\n <Handle\n type=\"target\"\n position={Position.Left}\n className=\"!left-[-1px] !w-2.5 !h-2.5 !bg-blue-500 !border !border-blue-600 !rounded-full !z-10\"\n />\n <Handle\n type=\"source\"\n position={Position.Right}\n className=\"!right-[-1px] !w-2.5 !h-2.5 !bg-blue-500 !border !border-blue-600 !rounded-full !z-10\"\n />\n <div\n className={`bg-gradient-to-b from-blue-500 to-blue-700 relative flex flex-col items-center w-5 justify-between rounded-l-sm text-blue-100 border-r-[1px] border-blue-500`}\n >\n <MessageSquare\n className={`w-4 h-4 opacity-90 text-white mt-1 ${mode === \"full\" ? \"mb-2\" : \"mb-1\"}`}\n />\n {mode === \"full\" && (\n <span\n className=\"text-center text-[8px] text-white font-bold uppercase mb-6\"\n style={{\n transform: \"rotate(-90deg)\",\n letterSpacing: \"0.15em\",\n whiteSpace: \"nowrap\",\n }}\n >\n {nodeLabel}\n </span>\n )}\n </div>\n <div className=\"p-1 flex-1\">\n <div\n className={classNames(\n mode === \"full\" ? `border-b border-gray-200` : \"\",\n )}\n >\n <span className=\"text-xs font-bold block pt-0.5 pb-0.5\">{name}</span>\n <div className=\"flex justify-between\">\n <span className=\"text-[10px] font-light block pt-0.5 pb-0.5\">\n v{version}\n </span>\n {mode === \"simple\" && (\n <span className=\"text-[10px] text-gray-500 font-light block pt-0.5 pb-0.5\">\n {nodeLabel}\n </span>\n )}\n </div>\n </div>\n {mode === \"full\" && (\n <div className=\"divide-y divide-gray-200\">\n <div className=\"leading-3 py-1\">\n <div\n className=\"text-[8px] font-light overflow-hidden\"\n style={{\n display: \"-webkit-box\",\n WebkitLineClamp: 2,\n WebkitBoxOrient: \"vertical\",\n }}\n title={summary}\n >\n {summary}\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 gap-x-4 py-1\">\n <span className=\"text-xs\" style={{ fontSize: \"0.2em\" }}>\n Producers: {producers.length}\n </span>\n <span className=\"text-xs\" style={{ fontSize: \"0.2em\" }}>\n Consumers: {consumers.length}\n </span>\n <span className=\"text-xs\" style={{ fontSize: \"0.2em\" }}>\n Owners: {owners.length}\n </span>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { ArrowRightLeft, Link } from \"lucide-react\";\nimport { Node, Handle, Position } from \"@xyflow/react\";\nimport { getIconForProtocol } from \"../../utils/protocols\";\nimport { EventCatalogResource, Channel as ChannelType } from \"../../types\";\n\ntype ChannelNodeData = EventCatalogResource & {\n channel: ChannelType;\n};\n\nfunction classNames(...classes: any) {\n return classes.filter(Boolean).join(\" \");\n}\n\nexport type ChannelNode = Node<ChannelNodeData, \"channel\">;\n\nexport default function Channel(props: ChannelNode) {\n const { data } = props;\n\n const { version, name, summary, protocols = [], address } = data.channel;\n\n const mode = props.data.mode || \"simple\";\n\n const nodeLabel = \"Channel\";\n\n const Icon = getIconForProtocol(protocols?.[0]);\n\n return (\n <div\n className={classNames(\n \"rounded-md border flex justify-start bg-white text-black relative\",\n props.selected\n ? \"border-gray-600 ring-2 ring-gray-500 shadow-lg\"\n : \"border-gray-400\",\n )}\n style={{ minHeight: \"100px\", width: \"260px\" }}\n >\n <Handle\n type=\"target\"\n position={Position.Left}\n className=\"!left-[-1px] !w-2.5 !h-2.5 !bg-gray-500 !border !border-gray-600 !rounded-full !z-10\"\n />\n <Handle\n type=\"source\"\n position={Position.Right}\n className=\"!right-[-1px] !w-2.5 !h-2.5 !bg-gray-500 !border !border-gray-600 !rounded-full !z-10\"\n />\n <div\n className={`bg-gradient-to-b from-gray-500 to-gray-700 relative flex flex-col items-center w-5 justify-between rounded-l-sm text-gray-100 border-r-[1px] border-gray-500`}\n >\n <ArrowRightLeft\n className={`w-4 h-4 opacity-90 text-white mt-1 ${mode === \"full\" ? \"mb-2\" : \"mb-1\"}`}\n />\n {mode === \"full\" && (\n <span\n className=\"text-center text-[8px] text-white font-bold uppercase mb-6\"\n style={{\n transform: \"rotate(-90deg)\",\n letterSpacing: \"0.15em\",\n whiteSpace: \"nowrap\",\n }}\n >\n {nodeLabel}\n </span>\n )}\n </div>\n <div className=\"p-1 flex-1\">\n <div\n className={classNames(\n mode === \"full\" ? `border-b border-gray-200` : \"\",\n )}\n >\n <div className=\"flex justify-between items-center\">\n <span className=\"text-xs font-bold block pb-0.5\">{name}</span>\n {Icon && <Icon className=\"w-5 h-5 opacity-60 p-0.5\" />}\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-[10px] font-light block pt-0.5 pb-0.5\">\n v{version}\n </span>\n {mode === \"simple\" && (\n <span className=\"text-[10px] text-gray-500 font-light block pt-0.5 pb-0.5\">\n {nodeLabel}\n </span>\n )}\n </div>\n </div>\n {mode === \"full\" && (\n <div className=\"divide-y divide-gray-200\">\n <div className=\"leading-3 py-1\">\n <div\n className=\"text-[8px] font-light overflow-hidden\"\n style={{\n display: \"-webkit-box\",\n WebkitLineClamp: 2,\n WebkitBoxOrient: \"vertical\",\n }}\n title={summary}\n >\n {summary}\n </div>\n </div>\n\n {address && (\n <div\n className=\"leading-3 py-1 flex flex-col items-start space-y-0.5\"\n style={{ fontSize: \"0.2em\" }}\n >\n <div\n className=\"flex items-center space-x-0.5\"\n style={{ fontSize: \"0.8em\" }}\n >\n <Link className=\"w-2 h-2 opacity-60\" />\n <span\n className=\"block font-normal \"\n style={{ marginLeft: \"0.5em\" }}\n >\n {address}\n </span>\n </div>\n {protocols && protocols.length > 0 && (\n <div\n className=\"flex space-x-2 items-center \"\n style={{ fontSize: \"0.8em\" }}\n >\n {[...protocols].map((protocol, index) => {\n const ProtoColIcon = getIconForProtocol(protocol);\n return (\n <span\n key={index}\n className=\"font-normal flex items-center -ml-[1px] space-x-0.5\"\n >\n {ProtoColIcon && (\n <ProtoColIcon className=\"w-2 h-2 opacity-60 inline-block\" />\n )}\n <span style={{ marginLeft: \"0.5em\" }}>\n {protocol}\n </span>\n </span>\n );\n })}\n </div>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { Server, Radio, Wifi, Network, Globe } from \"lucide-react\";\n\n// Map protocol names to Lucide icons\nconst protocolIconMap: { [key: string]: any } = {\n http: Server,\n https: Server,\n ws: Radio,\n wss: Radio,\n websocket: Radio,\n mqtt: Wifi,\n amqp: Network,\n kafka: Network,\n rabbitmq: Network,\n redis: Network,\n grpc: Globe,\n graphql: Globe,\n};\n\nexport const getIconForProtocol = (protocol: string) => {\n if (!protocol) return Server;\n const normalizedProtocol = protocol.replace(\"-\", \"\").toLowerCase();\n return protocolIconMap[normalizedProtocol] || Server;\n};\n","import { Database } from \"lucide-react\";\nimport { Node, Handle, Position } from \"@xyflow/react\";\nimport { EventCatalogResource, Data as DataType } from \"../../types\";\n\nfunction classNames(...classes: any) {\n return classes.filter(Boolean).join(\" \");\n}\n\ntype DataNodeData = EventCatalogResource & {\n data: DataType;\n};\n\nexport type DataNode = Node<DataNodeData, \"data\">;\n\nexport default function Data(props: DataNode) {\n const {\n version,\n owners = [],\n schemas = [],\n name,\n summary,\n type = \"Database\",\n } = props.data.data;\n\n const mode = props.data.mode || \"simple\";\n\n const nodeLabel = \"Data\";\n\n return (\n <div\n className={classNames(\n \"rounded-md border flex justify-start bg-white text-black relative\",\n props.selected\n ? \"border-blue-600 ring-2 ring-blue-500 shadow-lg\"\n : \"border-blue-400\",\n )}\n style={{ minHeight: \"100px\", width: \"260px\" }}\n >\n <Handle\n type=\"target\"\n position={Position.Left}\n className=\"!left-[-1px] !w-2.5 !h-2.5 !bg-blue-500 !border !border-blue-600 !rounded-full !z-10\"\n />\n <Handle\n type=\"source\"\n position={Position.Right}\n className=\"!right-[-1px] !w-2.5 !h-2.5 !bg-blue-500 !border !border-blue-600 !rounded-full !z-10\"\n />\n <div\n className={`bg-gradient-to-b from-blue-500 to-blue-700 relative flex flex-col items-center w-5 justify-between rounded-l-sm text-blue-100 border-r-[1px] border-blue-500`}\n >\n <Database\n className={`w-4 h-4 opacity-90 text-white mt-1 ${mode === \"full\" ? \"mb-2\" : \"mb-1\"}`}\n />\n {mode === \"full\" && (\n <span\n className=\"text-center text-[8px] text-white font-bold uppercase mb-4\"\n style={{\n transform: \"rotate(-90deg)\",\n letterSpacing: \"0.15em\",\n whiteSpace: \"nowrap\",\n }}\n >\n {nodeLabel}\n </span>\n )}\n </div>\n <div className=\"p-1 flex-1\">\n <div\n className={classNames(\n mode === \"full\" ? `border-b border-gray-200` : \"\",\n )}\n >\n <span className=\"text-xs font-bold block pt-0.5 pb-0.5\">{name}</span>\n <div className=\"flex justify-between\">\n <span className=\"text-[10px] font-light block pt-0.5 pb-0.5\">\n v{version}\n </span>\n {mode === \"simple\" && (\n <span className=\"text-[10px] text-gray-500 font-light block pt-0.5 pb-0.5\">\n {nodeLabel}\n </span>\n )}\n </div>\n </div>\n {mode === \"full\" && (\n <div className=\"divide-y divide-gray-200\">\n <div className=\"leading-3 py-1\">\n <div\n className=\"text-[8px] font-light overflow-hidden\"\n style={{\n display: \"-webkit-box\",\n WebkitLineClamp: 2,\n WebkitBoxOrient: \"vertical\",\n }}\n title={summary}\n >\n {summary}\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 gap-x-4 py-1\">\n <span className=\"text-xs\" style={{ fontSize: \"0.2em\" }}>\n Type: {type}\n </span>\n <span className=\"text-xs\" style={{ fontSize: \"0.2em\" }}>\n Schemas: {schemas.length}\n </span>\n <span className=\"text-xs\" style={{ fontSize: \"0.2em\" }}>\n Owners: {owners.length}\n </span>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { Connection, MarkerType } from \"@xyflow/react\";\nimport { Database } from \"lucide-react\";\nimport { NodeConfiguration } from \"../../types\";\nimport { SERVICE, CHANNEL, ACTOR } from \"../node-types\";\n\nexport default {\n type: \"data\",\n icon: Database,\n color: \"blue\",\n targetCanConnectTo: [...SERVICE, ...CHANNEL, \"external-system\", ...ACTOR],\n sourceCanConnectTo: [...SERVICE, ...CHANNEL, \"external-system\", ...ACTOR],\n validateConnection: (connection: Connection) => {\n return connection.source !== connection.target;\n },\n getEdgeOptions: (connection: Connection) => {\n if (connection.source === \"data\" && connection.target === \"service\") {\n return {\n label: \"Provides data to\",\n markerEnd: { type: MarkerType.ArrowClosed, color: \"#000000\" },\n };\n }\n if (connection.source === \"service\" && connection.target === \"data\") {\n return {\n label: \"Stores data in\",\n markerEnd: { type: MarkerType.ArrowClosed, color: \"#000000\" },\n };\n }\n return {\n label: \"Connected to\",\n markerEnd: { type: MarkerType.ArrowClosed, color: \"#000000\" },\n };\n },\n defaultData: {\n name: \"New Database\",\n version: \"0.0.1\",\n summary: \"New data store. Click edit to change the details.\",\n type: \"Database\",\n mode: \"full\",\n },\n editor: {\n title: \"Data Store\",\n subtitle: \"Edit the details of the data store\",\n schema: {\n type: \"object\",\n required: [\"name\", \"version\"],\n properties: {\n name: {\n type: \"string\",\n title: \"Name\",\n default: \"UserDatabase\",\n description: \"The name of the data store\",\n },\n version: {\n type: \"string\",\n title: \"Version\",\n default: \"1.0.0\",\n description: \"The version number (e.g., 1.0.0)\",\n pattern: \"^\\\\d+\\\\.\\\\d+\\\\.\\\\d+(?:-[\\\\w.-]+)?(?:\\\\+[\\\\w.-]+)?$\",\n },\n summary: {\n type: \"string\",\n title: \"Summary\",\n default: \"\",\n description: \"A brief summary of the data store\",\n },\n type: {\n type: \"string\",\n title: \"Type\",\n default: \"Database\",\n description: \"The type of data store (Database, Cache, Queue, etc.)\",\n enum: [\n \"Database\",\n \"Cache\",\n \"Queue\",\n \"File System\",\n \"Data Lake\",\n \"Data Warehouse\",\n ],\n },\n },\n },\n },\n} as NodeConfiguration;\n","import { MonitorIcon } from \"lucide-react\";\nimport { Node, Handle, Position } from \"@xyflow/react\";\nimport { EventCatalogResource, View as ViewType } from \"../../types\";\n\nfunction classNames(...classes: any) {\n return classes.filter(Boolean).join(\" \");\n}\n\ntype ViewNodeData = EventCatalogResource & {\n view: ViewType;\n};\n\nexport type ViewNode = Node<ViewNodeData, \"view\">;\n\nexport default function View(props: ViewNode) {\n const { data: _data, selected } = props;\n const { name, summary, screenshot } = props.data.view;\n\n const mode = props.data.mode || \"simple\";\n\n const nodeLabel = \"View\";\n\n return (\n <div\n className={classNames(\n \"rounded-md border flex justify-start bg-white text-black min-h-[100px] relative\",\n selected\n ? \"border-blue-600 ring-2 ring-blue-500 shadow-lg\"\n : \"border-blue-400\",\n )}\n style={{ width: \"260px\" }}\n >\n <Handle\n type=\"target\"\n position={Position.Left}\n className=\"!left-[-1px] !w-2.5 !h-2.5 !bg-blue-500 !border !border-blue-600 !rounded-full !z-10\"\n />\n <Handle\n type=\"source\"\n position={Position.Right}\n className=\"!right-[-1px] !w-2.5 !h-2.5 !bg-blue-500 !border !border-blue-600 !rounded-full !z-10\"\n />\n <div\n className={`bg-gradient-to-b from-blue-500 to-blue-700 relative flex flex-col items-center w-5 justify-between rounded-l-sm text-blue-100 border-r-[1px] border-blue-500`}\n >\n <MonitorIcon\n className={`w-4 h-4 opacity-90 text-white mt-1 ${mode === \"full\" ? \"mb-2\" : \"mb-1\"}`}\n />\n {mode === \"full\" && (\n <span\n className=\"text-center text-[8px] text-white font-bold uppercase mb-4\"\n style={{\n transform: \"rotate(-90deg)\",\n letterSpacing: \"0.15em\",\n whiteSpace: \"nowrap\",\n }}\n >\n {nodeLabel}\n </span>\n )}\n </div>\n <div className=\"p-1 flex-1\">\n <div className=\"pb-1\">\n <span className=\"text-xs font-bold block pt-0.5 pb-0.5\">{name}</span>\n {mode === \"simple\" && (\n <span className=\"text-[10px] text-gray-500 font-light block pt-0.5 pb-0.5\">\n {nodeLabel}\n </span>\n )}\n </div>\n {summary && (\n <div className=\"pb-1\">\n <div\n className=\"text-[8px] font-light text-gray-600 block leading-tight overflow-hidden\"\n style={{\n display: \"-webkit-box\",\n WebkitLineClamp: 2,\n WebkitBoxOrient: \"vertical\",\n }}\n title={summary}\n >\n {summary}\n </div>\n </div>\n )}\n {screenshot && (\n <div className=\"py-1\">\n <img\n src={screenshot}\n alt={`${name} screenshot`}\n className=\"w-full max-w-40 h-20 object-cover rounded border border-gray-200\"\n />\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { User } from \"lucide-react\";\nimport { Node, Handle, Position } from \"@xyflow/react\";\nimport { EventCatalogResource } from \"../../types\";\n\nfunction classNames(...classes: any) {\n return classes.filter(Boolean).join(\" \");\n}\n\ntype ActorNodeData = EventCatalogResource & {\n name: string;\n summary: string;\n};\n\nexport type ActorNode = Node<ActorNodeData, \"actor\">;\n\nexport default function Actor(props: ActorNode) {\n const { name, summary } = props?.data;\n\n const mode = props?.data?.mode || \"simple\";\n\n const nodeLabel = \"Actor\";\n\n return (\n <div\n className={classNames(\n \"rounded-md border flex justify-start bg-white text-black min-h-[100px] relative\",\n props?.selected\n ? \"border-yellow-600 ring-2 ring-yellow-500 shadow-lg\"\n : \"border-yellow-400\",\n )}\n style={{ width: \"260px\" }}\n >\n <Handle\n type=\"target\"\n position={Position.Left}\n className=\"!left-[-1px] !w-2.5 !h-2.5 !bg-yellow-500 !border !border-yellow-600 !rounded-full !z-10\"\n />\n <Handle\n type=\"source\"\n position={Position.Right}\n className=\"!right-[-1px] !w-2.5 !h-2.5 !bg-yellow-500 !border !border-yellow-600 !rounded-full !z-10\"\n />\n <div\n className={`bg-gradient-to-b from-yellow-500 to-yellow-700 relative flex flex-col items-center w-5 justify-between rounded-l-sm text-yellow-100 border-r-[1px] border-yellow-500`}\n >\n <User\n className={`w-4 h-4 opacity-90 text-white mt-1 ${mode === \"full\" ? \"mb-2\" : \"mb-1\"}`}\n />\n {mode === \"full\" && (\n <span\n className=\"text-center text-[8px] text-white font-bold uppercase mb-4\"\n style={{\n transform: \"rotate(-90deg)\",\n letterSpacing: \"0.15em\",\n whiteSpace: \"nowrap\",\n }}\n >\n {nodeLabel}\n </span>\n )}\n </div>\n <div className=\"p-1 flex-1\">\n <div\n className={classNames(\n mode === \"full\" ? `border-b border-gray-200` : \"\",\n )}\n >\n <span className=\"text-xs font-bold block pt-0.5 pb-0.5\">{name}</span>\n {mode === \"simple\" && (\n <div className=\"flex justify-between\">\n <span className=\"text-[10px] text-gray-500 font-light block pt-0.5 pb-0.5\">\n {nodeLabel}\n </span>\n </div>\n )}\n </div>\n {mode === \"full\" && (\n <div className=\"divide-y divide-gray-200\">\n <div className=\"leading-3 py-1\">\n <div\n className=\"text-[8px] font-light overflow-hidden\"\n style={{\n display: \"-webkit-box\",\n WebkitLineClamp: 2,\n WebkitBoxOrient: \"vertical\",\n }}\n title={summary}\n >\n {summary}\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { Connection, MarkerType } from \"@xyflow/react\";\nimport { User } from \"lucide-react\";\nimport { NodeConfiguration } from \"../../types\";\nimport { SERVICE, MESSAGE, CHANNEL } from \"../node-types\";\n\nexport default {\n type: \"actor\",\n icon: User,\n color: \"yellow\",\n targetCanConnectTo: [\n ...SERVICE,\n ...MESSAGE,\n ...CHANNEL,\n \"external-system\",\n \"view\",\n ],\n sourceCanConnectTo: [\n ...SERVICE,\n ...MESSAGE,\n ...CHANNEL,\n \"external-system\",\n \"view\",\n ],\n validateConnection: (connection: Connection) => {\n return connection.source !== connection.target;\n },\n getEdgeOptions: (_connection: Connection) => {\n return {\n label: \"Interacts\",\n markerEnd: { type: MarkerType.ArrowClosed, color: \"#000000\" },\n };\n },\n defaultData: {\n name: \"New Actor\",\n summary:\n \"A person or user in the system. Click edit to change the details.\",\n mode: \"full\",\n },\n editor: {\n title: \"Actor\",\n subtitle: \"Edit the details of the actor\",\n schema: {\n type: \"object\",\n required: [\"name\"],\n properties: {\n name: {\n type: \"string\",\n title: \"Name\",\n default: \"New Actor\",\n description: \"The name of the actor (person/user)\",\n },\n summary: {\n type: \"string\",\n title: \"Description\",\n default: \"\",\n description: \"A brief description of the actor\",\n },\n },\n },\n },\n} as NodeConfiguration;\n","import { Globe } from \"lucide-react\";\nimport { Node, Handle, Position } from \"@xyflow/react\";\nimport {\n EventCatalogResource,\n ExternalSystem as ExternalSystemType,\n} from \"../../types\";\n\nfunction classNames(...classes: any) {\n return classes.filter(Boolean).join(\" \");\n}\n\ntype ExternalSystemNodeData = EventCatalogResource & {\n externalSystem: ExternalSystemType;\n};\n\nexport type ExternalSystemNode = Node<\n ExternalSystemNodeData,\n \"external-system\"\n>;\n\nexport default function ExternalSystem(props: ExternalSystemNode) {\n const { data, selected } = props;\n const { version, name, summary } = props.data.externalSystem;\n\n const mode = props.data.mode || \"simple\";\n\n const nodeLabel = \"External\";\n\n return (\n <div\n className={classNames(\n \"rounded-md min-h-[100px] border flex justify-start bg-white text-black relative\",\n selected\n ? \"border-pink-600 ring-2 ring-pink-500 shadow-lg\"\n : \"border-pink-400\",\n )}\n style={{ width: \"260px\" }}\n >\n <Handle\n type=\"target\"\n position={Position.Left}\n className=\"!left-[-1px] !w-2.5 !h-2.5 !bg-pink-500 !border !border-pink-600 !rounded-full !z-10\"\n />\n <Handle\n type=\"source\"\n position={Position.Right}\n className=\"!right-[-1px] !w-2.5 !h-2.5 !bg-pink-500 !border !border-pink-600 !rounded-full !z-10\"\n />\n <div\n className={`bg-gradient-to-b from-pink-500 to-pink-700 relative flex flex-col items-center w-5 justify-between rounded-l-sm text-pink-100 border-r-[1px] border-pink-500`}\n >\n <Globe\n className={`w-4 h-4 opacity-90 text-white mt-1 ${mode === \"full\" ? \"mb-2\" : \"mb-1\"}`}\n />\n {mode === \"full\" && (\n <span\n className=\"text-center text-[8px] text-white font-bold uppercase mb-4\"\n style={{\n transform: \"rotate(-90deg)\",\n letterSpacing: \"0.15em\",\n whiteSpace: \"nowrap\",\n }}\n >\n {nodeLabel}\n </span>\n )}\n </div>\n <div className=\"p-1 flex-1\">\n <div\n className={classNames(\n mode === \"full\" ? `border-b border-gray-200` : \"\",\n )}\n >\n <span className=\"text-xs font-bold block pt-0.5 pb-0.5\">{name}</span>\n <div className=\"flex justify-between\">\n <span className=\"text-[10px] font-light block pt-0.5 pb-0.5\">\n v{version}\n </span>\n {mode === \"simple\" && (\n <span className=\"text-[10px] text-gray-500 font-light block pt-0.5 pb-0.5\">\n {nodeLabel}\n </span>\n )}\n </div>\n </div>\n {mode === \"full\" && (\n <div className=\"divide-y divide-gray-200\">\n <div className=\"leading-3 py-1\">\n <div\n className=\"text-[8px] font-light overflow-hidden\"\n style={{\n display: \"-webkit-box\",\n WebkitLineClamp: 2,\n WebkitBoxOrient: \"vertical\",\n }}\n title={summary}\n >\n {summary}\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { Connection, MarkerType } from \"@xyflow/react\";\nimport { Globe } from \"lucide-react\";\nimport { NodeConfiguration } from \"../../types\";\nimport { SERVICE, CHANNEL, ACTOR, MESSAGE } from \"../node-types\";\n\nexport default {\n type: \"external-system\",\n icon: Globe,\n color: \"pink\",\n targetCanConnectTo: [...SERVICE, ...CHANNEL, ...MESSAGE, ...ACTOR],\n sourceCanConnectTo: [...SERVICE, ...CHANNEL, ...MESSAGE, ...ACTOR],\n validateConnection: (connection: Connection) => {\n return connection.source !== connection.target;\n },\n getEdgeOptions: (connection: Connection) => {\n return {\n label: \"Connects\",\n markerEnd: { type: MarkerType.ArrowClosed, color: \"#000000\" },\n };\n },\n defaultData: {\n mode: \"full\",\n externalSystem: {\n id: \"1\",\n name: \"New External System\",\n version: \"0.0.1\",\n summary: \"New external system. Click edit to change the details.\",\n },\n },\n editor: {\n title: \"External System\",\n subtitle: \"Edit the details of the external system\",\n schema: {\n type: \"object\",\n required: [\"externalSystem\", \"mode\"],\n properties: {\n externalSystem: {\n type: \"object\",\n required: [\"name\", \"version\"],\n properties: {\n name: {\n type: \"string\",\n title: \"Name\",\n default: \"Random value\",\n description: \"The name of the external system\",\n },\n version: {\n type: \"string\",\n title: \"Version\",\n default: \"1.0.0\",\n description: \"The version number (e.g., 1.0.0)\",\n pattern: \"^\\\\d+\\\\.\\\\d+\\\\.\\\\d+(?:-[\\\\w.-]+)?(?:\\\\+[\\\\w.-]+)?$\",\n },\n summary: {\n type: \"string\",\n title: \"Summary\",\n default: \"\",\n description: \"A brief summary of the external system\",\n },\n },\n },\n },\n },\n },\n} as NodeConfiguration;\n","import { Node, Handle, Position } from \"@xyflow/react\";\nimport React, { useState, useEffect, useRef } from \"react\";\n\nfunction classNames(...classes: any) {\n return classes.filter(Boolean).join(\" \");\n}\n\n// Define the data structure for our NoteNode\nexport type NoteNodeData = {\n id: string;\n text: string;\n color?: string;\n readOnly?: boolean;\n};\n\n// Define the NoteNode type for React Flow\nexport type NoteNode = Node<NoteNodeData, \"note\">;\n\ninterface NoteNodeProps extends NoteNode {\n onTextChange?: (id: string, text: string) => void;\n onColorChange?: (id: string, color: string) => void;\n showResizer?: boolean;\n readOnly?: boolean;\n}\n\nexport default function NoteNodeComponent({\n id,\n data,\n selected,\n onTextChange,\n onColorChange,\n readOnly = false,\n}: NoteNodeProps) {\n const [isEditing, setIsEditing] = useState(false);\n const [currentText, setCurrentText] = useState(\n data.text || \"Double-click to edit...\",\n );\n const textAreaRef = useRef<HTMLTextAreaElement>(null);\n\n // Define a list of selectable colors\n const availableColors = {\n yellow: {\n bg: \"bg-gradient-to-br from-yellow-200 to-yellow-300\",\n border: \"border-yellow-400\",\n text: \"text-yellow-900\",\n placeholder: \"placeholder-yellow-600\",\n selectedRing: \"ring-yellow-500\",\n },\n blue: {\n bg: \"bg-blue-200\",\n border: \"border-blue-400\",\n text: \"text-blue-900\",\n placeholder: \"placeholder-blue-600\",\n selectedRing: \"ring-blue-500\",\n },\n green: {\n bg: \"bg-green-200\",\n border: \"border-green-400\",\n text: \"text-green-900\",\n placeholder: \"placeholder-green-600\",\n selectedRing: \"ring-green-500\",\n },\n pink: {\n bg: \"bg-pink-200\",\n border: \"border-pink-400\",\n text: \"text-pink-900\",\n placeholder: \"placeholder-pink-600\",\n selectedRing: \"ring-pink-500\",\n },\n purple: {\n bg: \"bg-purple-200\",\n border: \"border-purple-400\",\n text: \"text-purple-900\",\n placeholder: \"placeholder-purple-600\",\n selectedRing: \"ring-purple-500\",\n },\n gray: {\n bg: \"bg-gray-200\",\n border: \"border-gray-400\",\n text: \"text-gray-900\",\n placeholder: \"placeholder-gray-600\",\n selectedRing: \"ring-gray-500\",\n },\n };\n\n type ColorName = keyof typeof availableColors;\n\n const currentColorName = (data.color as ColorName) || \"yellow\";\n const colorClasses =\n availableColors[currentColorName] || availableColors.yellow;\n\n // Simple markdown-like text formatting\n const formatText = (text: string) => {\n return (\n text\n // Headers\n .replace(\n /^### (.*$)/gim,\n '<h3 class=\"text-xs font-medium mb-1\">$1</h3>',\n )\n .replace(\n /^## (.*$)/gim,\n '<h2 class=\"text-xs font-semibold mb-1\">$1</h2>',\n )\n .replace(/^# (.*$)/gim, '<h1 class=\"text-sm font-bold mb-1\">$1</h1>')\n // Bold\n .replace(/\\*\\*(.*?)\\*\\*/gim, '<strong class=\"font-bold\">$1</strong>')\n // Italic\n .replace(/\\*(.*?)\\*/gim, '<em class=\"italic\">$1</em>')\n // Inline code\n .replace(\n /`(.*?)`/gim,\n '<code class=\"bg-gray-200 px-1 rounded text-[9px] font-mono\">$1</code>',\n )\n // Simple lists\n .replace(/^• (.*$)/gim, '<li class=\"text-[10px] ml-3\">• $1</li>')\n .replace(/^- (.*$)/gim, '<li class=\"text-[10px] ml-3\">• $1</li>')\n // Line breaks\n .replace(/\\n/g, \"<br>\")\n );\n };\n\n useEffect(() => {\n // Update internal state if data.text changes from props (e.g. undo/redo, initial load)\n setCurrentText(data.text || \"Double-click to edit...\");\n }, [data.text]);\n\n useEffect(() => {\n if (isEditing && textAreaRef.current) {\n textAreaRef.current.focus();\n // Select all text when starting to edit for quicker replacement\n textAreaRef.current.select();\n }\n }, [isEditing]);\n\n const handleDoubleClick = () => {\n if (!readOnly) {\n setIsEditing(true);\n }\n };\n\n const handleTextChange = (event: React.ChangeEvent<HTMLTextAreaElement>) => {\n setCurrentText(event.target.value);\n };\n\n const handleBlur = () => {\n setIsEditing(false);\n // Only update if the text has actually changed from what's in data\n // or if data.text was initially undefined/empty and now has content.\n if (currentText !== data.text && onTextChange) {\n onTextChange(id, currentText);\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault(); // Prevent newline on Enter\n handleBlur(); // Save and exit edit mode\n }\n // Allow Shift+Enter for newlines by default textarea behavior\n if (event.key === \"Escape\") {\n setIsEditing(false);\n // Revert to original text from data on Escape\n setCurrentText(data.text || \"Double-click to edit...\");\n }\n };\n\n const handleColorChange = (newColor: ColorName) => {\n if (onColorChange) {\n onColorChange(id, newColor);\n }\n };\n\n return (\n <div className=\"relative group\" style={{ width: \"100%\", height: \"100%\" }}>\n <Handle\n type=\"target\"\n position={Position.Left}\n className=\"!left-[-1px] !w-2 !h-2 !bg-gray-400 !border !border-gray-500 !rounded-full !z-10\"\n />\n <Handle\n type=\"source\"\n position={Position.Right}\n className=\"!right-[-1px] !w-2 !h-2 !bg-gray-400 !border !border-gray-500 !rounded-full !z-10\"\n />\n {selected && !isEditing && !readOnly && (\n <div className=\"absolute -top-10 left-1/2 transform -translate-x-1/2 flex space-x-1 p-1 bg-white rounded-md shadow-lg border border-gray-300 z-20\">\n {Object.keys(availableColors).map((colorKey) => (\n <button\n key={colorKey}\n onClick={() => handleColorChange(colorKey as ColorName)}\n className={classNames(\n \"w-6 h-6 rounded-full border-2\",\n availableColors[colorKey as ColorName].bg,\n availableColors[colorKey as ColorName].border,\n currentColorName === colorKey\n ? \"ring-2 ring-offset-1 \" +\n availableColors[colorKey as ColorName].selectedRing\n : \"\",\n )}\n title={colorKey.charAt(0).toUpperCase() + colorKey.slice(1)}\n />\n ))}\n </div>\n )}\n <div\n onDoubleClick={handleDoubleClick}\n className={classNames(\n \"w-full h-full rounded-lg border p-3 flex flex-col min-w-[150px] min-h-[150px] relative\",\n colorClasses.bg,\n colorClasses.border,\n colorClasses.text,\n \"prose prose-sm max-w-full\",\n selected\n ? `border-blue-600 ring-2 ${colorClasses.selectedRing} shadow-xl`\n : \"shadow-md hover:shadow-lg\",\n currentColorName === \"yellow\"\n ? \"shadow-yellow-300/50 shadow-lg transform rotate-0.5\"\n : \"\",\n )}\n style={{ position: \"relative\" }}\n >\n {isEditing ? (\n <textarea\n ref={textAreaRef}\n value={currentText}\n onChange={handleTextChange}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n className={classNames(\n \"w-full flex-1 bg-transparent border-none outline-none resize-none text-[10px] p-0 m-0\",\n colorClasses.text,\n colorClasses.placeholder,\n )}\n style={{ height: \"100%\", minHeight: 0 }}\n placeholder=\"Enter text...\"\n />\n ) : (\n <div\n className=\"whitespace-pre-wrap break-words w-full h-full overflow-y-auto custom-scrollbar text-[10px]\"\n dangerouslySetInnerHTML={{\n __html: formatText(currentText),\n }}\n />\n )}\n\n {/* PostIt folded corner effect */}\n {currentColorName === \"yellow\" && (\n <div className=\"absolute top-0 right-0 w-4 h-4\">\n <div className=\"absolute top-0 right-0 w-0 h-0 border-l-[16px] border-b-[16px] border-l-transparent border-b-yellow-400/30 rounded-br-lg\"></div>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { Handle } from \"@xyflow/react\";\nimport * as ContextMenu from \"@radix-ui/react-context-menu\";\nimport { buildUrl } from \"../utils/url-builder\";\nimport { getIcon } from \"../utils/badges\";\n\ninterface FlowData {\n id: string;\n version: string;\n name: string;\n summary?: string;\n owners?: string[];\n sidebar?: {\n badge?: string;\n };\n styles?: {\n backgroundColor?: string;\n borderColor?: string;\n icon?: string;\n node?: {\n color?: string;\n label?: string;\n };\n };\n}\n\ninterface Data {\n label: string;\n bgColor: string;\n color: string;\n mode: \"simple\" | \"full\";\n flow: {\n data: FlowData;\n };\n showTarget?: boolean;\n showSource?: boolean;\n}\n\nfunction classNames(...classes: any) {\n return classes.filter(Boolean).join(\" \");\n}\n\nexport default function FlowNode({\n data,\n sourcePosition,\n targetPosition,\n}: any) {\n const { mode, flow } = data as Data;\n\n const { id, version, owners = [], name, styles } = flow.data;\n const { node: { color = \"teal\", label } = {}, icon = \"QueueListIcon\" } =\n styles || {};\n\n const Icon = getIcon(icon);\n const nodeLabel = label || flow?.data?.sidebar?.badge || \"Flow\";\n const fontSize = nodeLabel.length > 10 ? \"7px\" : \"9px\";\n\n return (\n <ContextMenu.Root>\n <ContextMenu.Trigger>\n <div\n className={classNames(\n `rounded-md border flex justify-start bg-white text-black border-${color}-400`,\n )}\n style={{ width: \"260px\" }}\n >\n <div\n className={classNames(\n `bg-gradient-to-b from-${color}-500 to-${color}-700 relative flex flex-col items-center w-5 justify-between rounded-l-sm text-${color}-100`,\n `border-r-[1px] border-${color}-500`,\n )}\n >\n {Icon && <Icon className=\"w-4 h-4 opacity-90 text-white mt-1\" />}\n {mode === \"full\" && (\n <span\n className={`text-center text-[${fontSize}] text-white font-bold uppercase mb-4`}\n style={{\n transform: \"rotate(-90deg)\",\n letterSpacing: \"0.15em\",\n whiteSpace: \"nowrap\",\n }}\n >\n {nodeLabel}\n </span>\n )}\n </div>\n <div className=\"p-1 flex-1\">\n {targetPosition && (\n <Handle type=\"target\" position={targetPosition} />\n )}\n {sourcePosition && (\n <Handle type=\"source\" position={sourcePosition} />\n )}\n <div\n className={classNames(\n mode === \"full\" ? `border-b border-gray-200` : \"\",\n )}\n >\n <span className=\"text-xs font-bold block pt-0.5 pb-0.5\">\n {name}\n </span>\n <div className=\"flex justify-between\">\n <span className=\"text-[10px] font-light block pt-0.5 pb-0.5 \">\n v{version}\n </span>\n {mode === \"simple\" && (\n <span className=\"text-[10px] text-gray-500 font-light block pt-0.5 pb-0.5 \">\n {nodeLabel}\n </span>\n )}\n </div>\n </div>\n {mode === \"full\" && (\n <div className=\"divide-y divide-gray-200 \">\n <div className=\"leading-3 py-1\">\n <span className=\"text-[8px] font-light\">\n {flow.data.summary}\n </span>\n </div>\n\n <div className=\"grid grid-cols-2 gap-x-4 py-1\">\n <span className=\"text-xs\" style={{ fontSize: \"0.2em\" }}>\n Owners: {owners.length}\n </span>\n </div>\n </div>\n )}\n </div>\n </div>\n </ContextMenu.Trigger>\n <ContextMenu.Portal>\n <ContextMenu.Content className=\"min-w-[220px] bg-white rounded-md p-1 shadow-md border border-gray-200\">\n <ContextMenu.Item\n asChild\n className=\"text-sm px-2 py-1.5 outline-none cursor-pointer hover:bg-orange-100 rounded-sm flex items-center\"\n >\n <a href={buildUrl(`/docs/flows/${id}/${version}`)}>\n Read documentation\n </a>\n </ContextMenu.Item>\n <ContextMenu.Item\n asChild\n className=\"text-sm px-2 py-1.5 outline-none cursor-pointer hover:bg-orange-100 rounded-sm flex items-center\"\n >\n <a href={buildUrl(`/visualiser/flows/${id}/${version}`)}>\n View in visualiser\n </a>\n </ContextMenu.Item>\n <ContextMenu.Separator className=\"h-[1px] bg-gray-200 m-1\" />\n <ContextMenu.Item asChild>\n <a\n href={buildUrl(`/docs/flows/${id}/${version}/changelog`)}\n className=\"text-sm px-2 py-1.5 outline-none cursor-pointer hover:bg-orange-100 rounded-sm flex items-center\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Read changelog\n </a>\n </ContextMenu.Item>\n </ContextMenu.Content>\n </ContextMenu.Portal>\n </ContextMenu.Root>\n );\n}\n","/**\n * Simple URL builder utility\n * In the visualizer, this is a fallback - consumers should use callbacks instead\n */\n\nexport function buildUrl(path: string): string {\n // For visualizer, just return the path as-is\n // The consuming application should handle URL building via callbacks\n return path;\n}\n","import * as HeroIcons from \"@heroicons/react/24/outline\";\nimport { getIconForProtocol } from \"./protocols\";\n\nexport function getIcon(iconName: string): React.ComponentType<any> | null {\n // Try protocol icons first\n const protocolIcon = getIconForProtocol(iconName);\n if (protocolIcon) return protocolIcon;\n\n // Fall back to HeroIcons\n const heroIcon = HeroIcons[iconName as keyof typeof HeroIcons];\n return heroIcon || null;\n}\n","import { Handle, Position } from \"@xyflow/react\";\nimport { getIcon } from \"../utils/badges\";\nimport * as ContextMenu from \"@radix-ui/react-context-menu\";\nimport { buildUrl } from \"../utils/url-builder\";\nimport { useState } from \"react\";\n\ninterface EntityData {\n id: string;\n name: string;\n version: string;\n properties?: any[];\n aggregateRoot?: boolean;\n sidebar?: any;\n styles?: {\n backgroundColor?: string;\n borderColor?: string;\n icon?: string;\n node?: {\n color?: string;\n label?: string;\n };\n };\n}\n\ninterface Data {\n title: string;\n label: string;\n bgColor: string;\n color: string;\n mode: \"simple\" | \"full\";\n entity: {\n data: EntityData;\n };\n showTarget?: boolean;\n showSource?: boolean;\n externalToDomain?: boolean;\n domainName?: string;\n domainId?: string;\n group?: {\n type: string;\n value: string;\n };\n}\n\nfunction classNames(...classes: any) {\n return classes.filter(Boolean).join(\" \");\n}\n\nexport default function EntityNode({\n data,\n sourcePosition,\n targetPosition,\n}: any) {\n const { mode, entity, externalToDomain, domainName } = data as Data;\n const {\n name,\n version,\n properties = [],\n aggregateRoot,\n styles,\n sidebar: _sidebar,\n } = entity.data;\n\n const {\n node: { color: _color = \"blue\", label: _label } = {},\n icon = \"CubeIcon\",\n } = styles || {};\n\n const Icon = getIcon(icon);\n\n const [hoveredProperty, setHoveredProperty] = useState<string | null>(null);\n\n return (\n <ContextMenu.Root>\n <ContextMenu.Trigger>\n <div\n className={classNames(\n \"bg-white border border-blue-300 rounded-lg shadow-sm min-w-[200px]\",\n externalToDomain ? \"border-yellow-400\" : \"\",\n )}\n >\n {/* Table Header */}\n <div\n className={classNames(\n \"bg-blue-100 px-4 py-2 rounded-t-lg border-b border-gray-300\",\n externalToDomain ? \"bg-yellow-400\" : \"\",\n )}\n >\n <div className=\"flex items-center gap-2\">\n {Icon && <Icon className=\"w-4 h-4 text-gray-600\" />}\n <span className=\"font-semibold text-gray-800 text-sm\">\n {name}\n </span>\n {aggregateRoot && (\n <span className=\"text-xs bg-yellow-100 text-yellow-800 px-1.5 py-0.5 rounded\">\n AR\n </span>\n )}\n </div>\n {/* {externalToDomain && domainName && ( */}\n <div className=\"text-xs text-yellow-800 font-medium mt-1\">\n from {domainName} domain\n </div>\n {/* )} */}\n {mode === \"full\" && (\n <div className=\"text-xs text-gray-600 mt-1\">v{version}</div>\n )}\n </div>\n\n {/* Properties Table */}\n {properties.length > 0 ? (\n <div className=\"divide-y divide-gray-200 relative\">\n {properties.map((property: any, index: number) => {\n const propertyKey = `${property.name}-${index}`;\n const isHovered = hoveredProperty === propertyKey;\n return (\n <div\n key={propertyKey}\n className=\"relative flex items-center justify-between px-4 py-2 hover:bg-gray-50\"\n onMouseEnter={() =>\n property.description && setHoveredProperty(propertyKey)\n }\n onMouseLeave={() => setHoveredProperty(null)}\n >\n {/* Target handle */}\n <Handle\n type=\"target\"\n position={Position.Left}\n id={`${property.name}-target`}\n className=\"!w-3 !h-3 !bg-white !border-2 !border-gray-400 !rounded-full !left-[-0px]\"\n style={{ left: \"-6px\" }}\n />\n\n {/* Source handle */}\n <Handle\n type=\"source\"\n position={Position.Right}\n id={`${property.name}-source`}\n className=\"!w-3 !h-3 !bg-white !border-2 !border-gray-400 !rounded-full !right-[-0px]\"\n style={{ right: \"-6px\" }}\n />\n\n {/* Property content */}\n <div className=\"flex-1 flex items-center justify-between\">\n <div className=\"flex items-center gap-1\">\n <span className=\"text-sm font-medium text-gray-900\">\n {property.name}\n </span>\n {property.required && (\n <span className=\"text-red-500 text-xs\">*</span>\n )}\n </div>\n <span className=\"text-sm text-gray-600 font-mono\">\n {property.type}\n </span>\n </div>\n\n {/* Reference indicator */}\n {property.references && (\n <div className=\"absolute right-2 top-1/2 transform -translate-y-1/2\">\n <div\n className=\"w-2 h-2 bg-blue-500 rounded-full\"\n title={`References ${property.references}`}\n ></div>\n </div>\n )}\n\n {/* Property Tooltip */}\n {isHovered && property.description && (\n <div className=\"absolute left-full ml-2 top-1/2 transform -translate-y-1/2 z-[9999] w-[200px] bg-gray-900 text-white text-xs rounded-lg py-2 px-3 pointer-events-none shadow-xl max-w-xl opacity-100\">\n <div className=\"text-gray-200 whitespace-normal break-words\">\n {property.description}\n </div>\n <div className=\"absolute right-full top-1/2 transform -translate-y-1/2 border-4 border-transparent border-r-gray-900\"></div>\n </div>\n )}\n </div>\n );\n })}\n </div>\n ) : (\n <div className=\"px-4 py-3 text-sm text-gray-500 text-center\">\n No properties defined\n </div>\n )}\n\n {/* Main node handles (if no properties) */}\n {properties.length === 0 && (\n <>\n {targetPosition && (\n <Handle type=\"target\" position={targetPosition} />\n )}\n {sourcePosition && (\n <Handle type=\"source\" position={sourcePosition} />\n )}\n </>\n )}\n </div>\n </ContextMenu.Trigger>\n <ContextMenu.Portal>\n <ContextMenu.Content\n className=\"min-w-[220px] bg-white rounded-md p-1 shadow-md border border-gray-200\"\n onClick={(e) => e.stopPropagation()}\n >\n <ContextMenu.Item\n asChild\n className=\"text-sm px-2 py-1.5 outline-none cursor-pointer hover:bg-orange-100 rounded-sm flex items-center\"\n >\n <a href={buildUrl(`/docs/entities/${entity.data.id}/${version}`)}>\n Read documentation\n </a>\n </ContextMenu.Item>\n </ContextMenu.Content>\n </ContextMenu.Portal>\n </ContextMenu.Root>\n );\n}\n","import { UserIcon } from \"@heroicons/react/20/solid\";\nimport { Handle } from \"@xyflow/react\";\n\ninterface Data {\n title: string;\n label: string;\n bgColor: string;\n color: string;\n mode: \"simple\" | \"full\";\n step: {\n id: string;\n title: string;\n summary: string;\n name: string;\n actor: { name: string };\n };\n showTarget?: boolean;\n showSource?: boolean;\n}\n\nfunction classNames(...classes: any) {\n return classes.filter(Boolean).join(\" \");\n}\n\nexport default function UserNode({\n data,\n sourcePosition,\n targetPosition,\n}: any) {\n const {\n mode,\n step,\n showTarget: _showTarget = true,\n showSource: _showSource = true,\n } = data as Data;\n\n const { summary, actor: { name } = {} } = step;\n\n return (\n <div\n className={classNames(\n `rounded-md border flex justify-start bg-white text-black border-yellow-400`,\n mode === \"full\" ? \"min-h-[5em]\" : \"min-h-[2em]\",\n )}\n style={{ width: \"260px\" }}\n >\n <div\n className={classNames(\n \"bg-gradient-to-b from-yellow-400 to-yellow-600 relative flex flex-col items-center w-5 justify-between rounded-l-sm text-orange-100-500\",\n `border-r-[1px] border-yellow-500`,\n )}\n >\n <UserIcon className=\"w-4 h-4 opacity-90 text-white mt-1\" />\n {mode === \"full\" && (\n <span\n className=\"text-center text-[9px] text-white font-bold uppercase mb-4\"\n style={{\n transform: \"rotate(-90deg)\",\n letterSpacing: \"0.15em\",\n whiteSpace: \"nowrap\",\n }}\n >\n ACTOR\n </span>\n )}\n </div>\n <div className=\"p-1 flex-1\">\n {targetPosition && <Handle type=\"target\" position={targetPosition} />}\n {sourcePosition && <Handle type=\"source\" position={sourcePosition} />}\n\n {(!summary || mode !== \"full\") && (\n <div className=\"h-full \">\n <span className=\"text-sm font-bold block pb-0.5 w-full\">\n {name}\n </span>\n {mode === \"simple\" && (\n <div className=\"w-full text-right\">\n <span className=\" w-full text-[10px] text-gray-500 font-light block pt-0.5 pb-0.5 \">\n Event\n </span>\n </div>\n )}\n </div>\n )}\n\n {summary && mode === \"full\" && (\n <div>\n <div\n className={classNames(\n mode === \"full\" ? `border-b border-gray-200` : \"\",\n )}\n >\n <span className=\"text-xs font-bold block pb-0.5\">{name}</span>\n </div>\n {mode === \"full\" && (\n <div className=\"divide-y divide-gray-200 \">\n <div className=\"leading-3 py-1\">\n <span className=\"text-[8px] font-light\">{summary}</span>\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { Handle } from \"@xyflow/react\";\n\ninterface Data {\n title: string;\n label: string;\n bgColor: string;\n color: string;\n mode: \"simple\" | \"full\";\n step: { id: string; title: string; summary: string };\n showTarget?: boolean;\n showSource?: boolean;\n}\n\nfunction classNames(...classes: any) {\n return classes.filter(Boolean).join(\" \");\n}\n\nexport default function StepNode({\n data,\n sourcePosition,\n targetPosition,\n}: any) {\n const { mode, step } = data as Data;\n\n const { title, summary } = step;\n\n return (\n <div\n className={classNames(\n \"rounded-md border flex justify-start bg-white text-black border-blue-400 min-h-[3em]\",\n )}\n style={{ width: \"260px\" }}\n >\n <div\n className={classNames(\n \"bg-gradient-to-b from-gray-700 to-gray-700 relative flex flex-col items-center w-5 justify-end rounded-l-sm text-orange-100-500\",\n `border-r-[1px] border-gray-500`,\n )}\n >\n {mode === \"full\" && (\n <span\n className=\"text-center text-[9px] text-white font-bold uppercase mb-4\"\n style={{\n transform: \"rotate(-90deg)\",\n letterSpacing: \"0.15em\",\n whiteSpace: \"nowrap\",\n }}\n >\n Step\n </span>\n )}\n </div>\n <div className=\"p-1 flex-1\">\n {targetPosition && <Handle type=\"target\" position={targetPosition} />}\n {sourcePosition && <Handle type=\"source\" position={sourcePosition} />}\n\n {!summary && (\n <div className=\"h-full flex items-center\">\n <span className=\"text-sm font-bold block pb-0.5\">{title}</span>\n </div>\n )}\n\n {summary && (\n <div>\n <div\n className={classNames(\n mode === \"full\" ? `border-b border-gray-200` : \"\",\n )}\n >\n <span className=\"text-xs font-bold block pb-0.5\">{title}</span>\n </div>\n {mode === \"full\" && (\n <div className=\"divide-y divide-gray-200 \">\n <div className=\"leading-3 py-1\">\n <span className=\"text-[8px] font-light\">{summary}</span>\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n );\n}\n","import {\n Handle,\n useReactFlow,\n useOnSelectionChange,\n Position,\n} from \"@xyflow/react\";\nimport * as ContextMenu from \"@radix-ui/react-context-menu\";\nimport { buildUrl } from \"../utils/url-builder\";\nimport { getIcon } from \"../utils/badges\";\nimport { useState } from \"react\";\n\ninterface DomainData {\n id: string;\n version: string;\n name: string;\n services?: string[];\n styles?: {\n backgroundColor?: string;\n borderColor?: string;\n icon?: string;\n };\n}\n\ninterface Data {\n mode: \"simple\" | \"full\";\n domain: {\n data: DomainData;\n };\n}\n\nexport default function DomainNode({ data, id: nodeId }: any) {\n const { mode, domain } = data as Data;\n const reactFlow = useReactFlow();\n const [highlightedServices, setHighlightedServices] = useState<Set<string>>(\n new Set(),\n );\n\n const { id, version, name, services = [], styles } = domain.data;\n const { icon = \"RectangleGroupIcon\" } = styles || {};\n\n const Icon = getIcon(icon);\n const ServerIcon = getIcon(\"ServerIcon\");\n\n // Listen for selection changes to highlight connected services\n useOnSelectionChange({\n onChange: ({ nodes: selectedNodes }) => {\n if (selectedNodes.length === 0) {\n setHighlightedServices(new Set());\n return;\n }\n\n const selectedNode = selectedNodes[0];\n if (!selectedNode) {\n setHighlightedServices(new Set());\n return;\n }\n\n // Get all edges\n const edges = reactFlow.getEdges();\n const connectedServiceIds = new Set<string>();\n\n // Find services connected to the selected node\n edges.forEach((edge) => {\n if (\n edge.source === selectedNode.id ||\n edge.target === selectedNode.id\n ) {\n // Check if this edge connects to our domain\n if (edge.source === nodeId && edge.sourceHandle) {\n // Extract service ID from sourceHandle (format: \"serviceId-source\")\n const serviceId = edge.sourceHandle.replace(\"-source\", \"\");\n connectedServiceIds.add(serviceId);\n }\n if (edge.target === nodeId && edge.targetHandle) {\n // Extract service ID from targetHandle (format: \"serviceId-target\")\n const serviceId = edge.targetHandle.replace(\"-target\", \"\");\n connectedServiceIds.add(serviceId);\n }\n }\n });\n\n setHighlightedServices(connectedServiceIds);\n },\n });\n\n return (\n <ContextMenu.Root>\n <ContextMenu.Trigger>\n <div className=\"w-full rounded-lg border-2 border-yellow-400 bg-white shadow-lg\">\n <div className=\"bg-yellow-100 px-3 py-2 flex items-center space-x-2\">\n {Icon && <Icon className=\"w-4 h-4 text-yellow-700\" />}\n <div>\n <span className=\"text-sm font-bold text-yellow-900\">{name}</span>\n <span className=\"text-xs text-yellow-700 ml-2\">v{version}</span>\n </div>\n </div>\n {mode === \"full\" && services.length > 0 && (\n <div>\n {services.map((service: any, index: number) => {\n const isHighlighted = highlightedServices.has(service.data.id);\n\n return (\n <ContextMenu.Root key={`${service.data.id}-${index}`}>\n <ContextMenu.Trigger asChild>\n <div\n className={`relative flex items-center justify-between px-3 py-2 cursor-pointer ${index !== services.length - 1 ? \"border-b border-gray-300\" : \"\"} ${isHighlighted ? \"bg-pink-100 border-pink-300\" : \"\"}`}\n >\n <Handle\n type=\"target\"\n position={Position.Left}\n id={`${service.data.id}-target`}\n className=\"!left-[-1px] !w-2 !h-2 !bg-gray-400 !border !border-gray-500 !rounded-full !z-10\"\n style={{ left: \"-1px\" }}\n />\n <Handle\n type=\"source\"\n position={Position.Right}\n id={`${service.data.id}-source`}\n className=\"!right-[-1px] !w-2 !h-2 !bg-gray-400 !border !border-gray-500 !rounded-full !z-10\"\n style={{ right: \"-1px\" }}\n />\n <div className=\"flex items-center space-x-3\">\n <div className=\"flex items-center justify-center w-5 h-5 bg-pink-500 rounded\">\n {ServerIcon && (\n <ServerIcon className=\"w-3 h-3 text-white\" />\n )}\n </div>\n <span className=\"text-sm font-medium text-gray-900\">\n {service.data.name || service.data.id}\n </span>\n </div>\n <div className=\"flex items-center space-x-4 text-sm text-gray-600\">\n <span className=\"text-xs\">\n v{service.data.version}\n </span>\n </div>\n </div>\n </ContextMenu.Trigger>\n <ContextMenu.Portal>\n <ContextMenu.Content className=\"min-w-[220px] bg-white rounded-md p-1 shadow-md border border-gray-200\">\n <ContextMenu.Item\n className=\"text-sm px-2 py-1.5 outline-none cursor-pointer hover:bg-orange-100 rounded-sm flex items-center\"\n onClick={() =>\n (window.location.href = buildUrl(\n `/docs/services/${service.data.id}/${service.data.version}`,\n ))\n }\n >\n View Service Documentation\n </ContextMenu.Item>\n <ContextMenu.Item\n className=\"text-sm px-2 py-1.5 outline-none cursor-pointer hover:bg-orange-100 rounded-sm flex items-center\"\n onClick={() =>\n (window.location.href = buildUrl(\n `/visualiser/services/${service.data.id}/${service.data.version}`,\n ))\n }\n >\n View Service Visualizer\n </ContextMenu.Item>\n </ContextMenu.Content>\n </ContextMenu.Portal>\n </ContextMenu.Root>\n );\n })}\n </div>\n )}\n </div>\n </ContextMenu.Trigger>\n <ContextMenu.Portal>\n <ContextMenu.Content className=\"min-w-[220px] bg-white rounded-md p-1 shadow-md border border-gray-200\">\n <ContextMenu.Item\n className=\"text-sm px-2 py-1.5 outline-none cursor-pointer hover:bg-orange-100 rounded-sm flex items-center\"\n onClick={() =>\n (window.location.href = buildUrl(\n `/docs/domains/${id}/${version}`,\n ))\n }\n >\n View Domain Documentation\n </ContextMenu.Item>\n <ContextMenu.Item\n className=\"text-sm px-2 py-1.5 outline-none cursor-pointer hover:bg-orange-100 rounded-sm flex items-center\"\n onClick={() =>\n (window.location.href = buildUrl(\n `/visualiser/domains/${id}/${version}`,\n ))\n }\n >\n View Domain Visualizer\n </ContextMenu.Item>\n </ContextMenu.Content>\n </ContextMenu.Portal>\n </ContextMenu.Root>\n );\n}\n","import { Handle } from \"@xyflow/react\";\nimport * as Icons from \"@heroicons/react/24/solid\";\nimport type { ComponentType } from \"react\";\nimport * as ContextMenu from \"@radix-ui/react-context-menu\";\nimport * as Tooltip from \"@radix-ui/react-tooltip\";\n\ntype MenuItem = {\n label: string;\n url?: string;\n};\n\ninterface Data {\n title: string;\n label: string;\n bgColor: string;\n color: string;\n mode: \"simple\" | \"full\";\n step: {\n id: string;\n title: string;\n summary: string;\n name: string;\n actor: { name: string };\n };\n showTarget?: boolean;\n showSource?: boolean;\n custom: {\n icon?: string;\n type?: string;\n title?: string;\n summary?: string;\n url?: string;\n color?: string;\n properties?: Record<string, string>;\n menu?: MenuItem[];\n height?: number;\n };\n}\n\nfunction classNames(...classes: any) {\n return classes.filter(Boolean).join(\" \");\n}\n\nexport default function UserNode({\n data,\n sourcePosition,\n targetPosition,\n}: any) {\n const { mode, step, custom: customProps } = data as Data;\n\n const {\n color = \"blue\",\n title = \"Custom\",\n icon = \"UserIcon\",\n type = \"custom\",\n summary = \"\",\n url: _url = \"\",\n properties = {},\n menu = [],\n height = 5,\n } = customProps;\n\n const IconComponent: ComponentType<{ className?: string }> | undefined =\n Icons[icon as keyof typeof Icons];\n\n const { actor: { name: _name } = {} } = step;\n\n const isLongType = type && type.length > 10;\n const displayType = isLongType ? `${type.substring(0, 10)}...` : type;\n\n return (\n <ContextMenu.Root>\n <ContextMenu.Trigger>\n <div\n className={classNames(\n `rounded-md border flex justify-start bg-white text-black border-${color}-400`,\n )}\n style={{\n minHeight: mode === \"full\" ? `${height}em` : \"2em\",\n width: \"260px\",\n }}\n >\n <div\n className={classNames(\n `bg-gradient-to-b from-${color}-400 to-${color}-600 relative flex flex-col items-center w-5 justify-between rounded-l-sm text-orange-100-500`,\n `border-r-[1px] border-${color}`,\n )}\n >\n <IconComponent className=\"w-4 h-4 opacity-90 text-white mt-1\" />\n {mode === \"full\" && (\n <Tooltip.Provider>\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <span\n className=\"text-center text-[9px] text-white font-bold uppercase mb-4\"\n style={{\n transform: \"rotate(-90deg)\",\n letterSpacing: \"0.15em\",\n whiteSpace: \"nowrap\",\n }}\n >\n {displayType}\n </span>\n </Tooltip.Trigger>\n {isLongType && (\n <Tooltip.Portal>\n <Tooltip.Content\n className=\"bg-slate-800 text-white rounded px-2 py-1 text-xs shadow-md z-50\"\n side=\"right\"\n sideOffset={5}\n >\n {type}\n <Tooltip.Arrow className=\"fill-slate-800\" />\n </Tooltip.Content>\n </Tooltip.Portal>\n )}\n </Tooltip.Root>\n </Tooltip.Provider>\n )}\n </div>\n <div className=\"p-1 flex-1\">\n {targetPosition && (\n <Handle type=\"target\" position={targetPosition} />\n )}\n {sourcePosition && (\n <Handle type=\"source\" position={sourcePosition} />\n )}\n\n {(!summary || mode !== \"full\") && (\n <div className=\"h-full \">\n <span className=\"text-sm font-bold block pb-0.5 w-full\">\n {title}\n </span>\n </div>\n )}\n\n {summary && mode === \"full\" && (\n <div>\n <div\n className={classNames(\n mode === \"full\" ? `border-b border-gray-200` : \"\",\n )}\n >\n <span className=\"text-xs font-bold block pb-0.5\">\n {title}\n </span>\n </div>\n {mode === \"full\" && (\n <div className=\"divide-y divide-gray-200 \">\n <div className=\"leading-3 py-1\">\n <span className=\"text-[8px] font-light\">{summary}</span>\n </div>\n {properties && (\n <div className=\"grid grid-cols-2 gap-x-4 py-1\">\n {Object.entries(properties).map(([key, value]) => (\n <span\n key={key}\n className=\"text-xs\"\n style={{ fontSize: \"0.2em\" }}\n >\n {key}:{\" \"}\n {typeof value === \"string\" &&\n value.startsWith(\"http\") ? (\n <a\n href={value}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-blue-500 underline\"\n >\n {value}\n </a>\n ) : (\n value\n )}\n </span>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n </ContextMenu.Trigger>\n {menu?.length > 0 && (\n <ContextMenu.Portal>\n <ContextMenu.Content className=\"min-w-[220px] bg-white rounded-md p-1 shadow-md border border-gray-200\">\n {menu?.map((item) => {\n return (\n <ContextMenu.Item\n asChild\n className=\"text-sm px-2 py-1.5 outline-none cursor-pointer hover:bg-orange-100 rounded-sm flex items-center\"\n >\n <a href={item.url}>{item.label}</a>\n </ContextMenu.Item>\n );\n })}\n </ContextMenu.Content>\n </ContextMenu.Portal>\n )}\n </ContextMenu.Root>\n );\n}\n","import { Handle, Position } from \"@xyflow/react\";\nimport ExternalSystemComponent from \"./external-system/ExternalSystem\";\n\nexport default function ExternalSystemNode(props: any) {\n return (\n <div className=\"relative\">\n <Handle\n type=\"target\"\n position={Position.Left}\n style={{ width: 10, height: 10, background: \"pink\", zIndex: 10 }}\n className=\"bg-gray-500\"\n />\n <Handle\n type=\"source\"\n position={Position.Right}\n style={{ width: 10, height: 10, background: \"pink\", zIndex: 10 }}\n className=\"bg-gray-500\"\n />\n <ExternalSystemComponent {...props} />\n </div>\n );\n}\n","import { Handle } from \"@xyflow/react\";\nimport * as ContextMenu from \"@radix-ui/react-context-menu\";\nimport { buildUrl } from \"../utils/url-builder\";\nimport { Position } from \"@xyflow/react\";\nimport { Package } from \"lucide-react\";\n\nfunction classNames(...classes: any) {\n return classes.filter(Boolean).join(\" \");\n}\n\ninterface DataProductNodeProps {\n data: {\n mode: \"simple\" | \"full\";\n dataProduct: {\n id: string;\n version: string;\n name: string;\n summary?: string;\n inputs?: any[];\n outputs?: any[];\n owners?: any[];\n };\n };\n selected?: boolean;\n}\n\nexport default function DataProductNode(props: DataProductNodeProps) {\n const {\n id,\n version,\n name,\n summary,\n inputs = [],\n outputs = [],\n owners = [],\n } = props.data.dataProduct;\n const mode = props.data.mode || \"simple\";\n const nodeLabel = \"Data Product\";\n const rotatedLabel = \"Product\";\n\n return (\n <ContextMenu.Root>\n <ContextMenu.Trigger>\n <div className=\"relative\">\n <Handle\n type=\"target\"\n position={Position.Left}\n style={{ width: 10, height: 10, background: \"#6366f1\", zIndex: 10 }}\n className=\"bg-indigo-500\"\n />\n <Handle\n type=\"source\"\n position={Position.Right}\n style={{ width: 10, height: 10, background: \"#6366f1\", zIndex: 10 }}\n className=\"bg-indigo-500\"\n />\n <div\n className={classNames(\n \"rounded-md border flex justify-start bg-white text-black\",\n props.selected\n ? \"border-indigo-600 ring-2 ring-indigo-500 shadow-lg\"\n : \"border-indigo-400\",\n )}\n style={{ width: \"260px\" }}\n >\n <div\n className={`bg-gradient-to-b from-indigo-500 to-indigo-700 relative flex flex-col items-center w-5 justify-between rounded-l-sm text-indigo-100 border-r-[1px] border-indigo-500`}\n >\n <Package\n className={`w-4 h-4 opacity-90 text-white mt-1 ${mode === \"full\" ? \"mb-2\" : \"mb-1\"}`}\n />\n {mode === \"full\" && (\n <span\n className=\"text-center text-[8px] text-white font-bold uppercase mb-6\"\n style={{\n transform: \"rotate(-90deg)\",\n letterSpacing: \"0.15em\",\n whiteSpace: \"nowrap\",\n }}\n >\n {rotatedLabel}\n </span>\n )}\n </div>\n <div className=\"p-1 flex-1\">\n <div\n className={classNames(\n mode === \"full\" ? `border-b border-gray-200` : \"\",\n )}\n >\n <span className=\"text-xs font-bold block pt-0.5 pb-0.5\">\n {name}\n </span>\n <div className=\"flex justify-between\">\n <span className=\"text-[10px] font-light block pt-0.5 pb-0.5\">\n v{version}\n </span>\n {mode === \"simple\" && (\n <span className=\"text-[10px] text-gray-500 font-light block pt-0.5 pb-0.5\">\n {nodeLabel}\n </span>\n )}\n </div>\n </div>\n {mode === \"full\" && (\n <div className=\"divide-y divide-gray-200\">\n <div className=\"leading-3 py-1\">\n <div\n className=\"text-[8px] font-light overflow-hidden\"\n style={{\n display: \"-webkit-box\",\n WebkitLineClamp: 2,\n WebkitBoxOrient: \"vertical\",\n }}\n title={summary}\n >\n {summary}\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 gap-x-4 py-1\">\n <span className=\"text-xs\" style={{ fontSize: \"0.2em\" }}>\n Inputs: {inputs.length}\n </span>\n <span className=\"text-xs\" style={{ fontSize: \"0.2em\" }}>\n Outputs: {outputs.length}\n </span>\n <span className=\"text-xs\" style={{ fontSize: \"0.2em\" }}>\n Owners: {owners.length}\n </span>\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n </ContextMenu.Trigger>\n <ContextMenu.Portal>\n <ContextMenu.Content className=\"min-w-[220px] bg-white rounded-md p-1 shadow-md border border-gray-200\">\n <ContextMenu.Item\n asChild\n className=\"text-sm px-2 py-1.5 outline-none cursor-pointer hover:bg-indigo-100 rounded-sm flex items-center\"\n >\n <a href={buildUrl(`/docs/data-products/${id}/${version}`)}>\n Read documentation\n </a>\n </ContextMenu.Item>\n <ContextMenu.Separator className=\"h-[1px] bg-gray-200 m-1\" />\n <ContextMenu.Item asChild>\n <a\n href={buildUrl(`/visualiser/data-products/${id}/${version}`)}\n className=\"text-sm px-2 py-1.5 outline-none cursor-pointer hover:bg-indigo-100 rounded-sm flex items-center\"\n >\n View in Visualiser\n </a>\n </ContextMenu.Item>\n </ContextMenu.Content>\n </ContextMenu.Portal>\n </ContextMenu.Root>\n );\n}\n","import { useMemo } from \"react\";\nimport { BaseEdge, getBezierPath } from \"@xyflow/react\";\n\nconst AnimatedMessageEdge = ({\n id,\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n data,\n label = \"\",\n markerEnd,\n markerStart,\n}: any) => {\n const [edgePath, labelX, labelY] = getBezierPath({\n sourceX,\n sourceY,\n sourcePosition,\n targetX,\n targetY,\n targetPosition,\n });\n\n const messageColor = useMemo(\n () => (collection: string) => {\n switch (collection) {\n case \"events\":\n return \"orange\";\n case \"commands\":\n return \"blue\";\n case \"queries\":\n return \"green\";\n default:\n return \"gray\";\n }\n },\n [],\n );\n\n const collection = data?.message?.collection;\n const opacity = data?.opacity ?? 1;\n const customColor =\n data?.customColor || messageColor(collection ?? \"default\");\n const warning = data?.warning;\n\n // For each customColor (string or array of strings), we need to create the animated nodes\n const customColors = Array.isArray(customColor) ? customColor : [customColor];\n\n const randomDelay = useMemo(() => Math.random() * 1, []);\n\n const animatedNodes = customColors.map((color, index) => {\n // Stagger the animations so multiple colored nodes are visible\n const delay = randomDelay + index * 0.3;\n return (\n <g\n className={`z-30 ${opacity === 1 ? \"opacity-100\" : \"opacity-10\"}`}\n key={`${id}-${color}-${index}`}\n >\n <circle\n key={`${id}-${color}-${index}`}\n cx=\"0\"\n cy=\"0\"\n r=\"7\"\n fill={color}\n >\n <animateMotion\n dur=\"2s\"\n repeatCount=\"indefinite\"\n path={edgePath}\n rotate=\"auto\"\n begin={`${delay}s`}\n >\n <mpath href={`#${id}`} />\n </animateMotion>\n </circle>\n </g>\n );\n });\n\n // Label can be spit using \\n to create multiple lines\n const lines = String(label ?? \"\").split(\"\\n\");\n\n return (\n // @ts-ignore\n <>\n <BaseEdge\n id={id}\n path={edgePath}\n markerEnd={markerEnd}\n markerStart={markerStart}\n style={\n warning ? { stroke: \"red\", strokeWidth: 1 } : { stroke: \"#d1d5db\" }\n }\n />\n {/* Circle Icon */}\n {animatedNodes}\n {/* <g className={`z-30 ${opacity === 1 ? 'opacity-100' : 'opacity-10'}`}>\n </g> */}\n <g>\n {/* Background rect for label */}\n {label && (\n <rect\n x={labelX - 30}\n y={labelY - lines.length * 6}\n width={60}\n height={lines.length * 14}\n fill=\"white\"\n fillOpacity={0.3}\n rx={4}\n ry={4}\n />\n )}\n {/* Text element */}\n <text\n x={labelX}\n y={labelY}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fontSize=\"10px\"\n pointerEvents=\"none\"\n >\n {lines.map((line, i) => (\n <tspan\n key={i}\n x={labelX}\n dy={i === 0 ? 0 : \"1.2em\"}\n style={{ fontStyle: i === 0 ? \"normal\" : \"italic\" }}\n >\n {line}\n </tspan>\n ))}\n </text>\n </g>\n </>\n );\n};\n\nexport default AnimatedMessageEdge;\n","import { type EdgeProps, getBezierPath } from \"@xyflow/react\";\n\nexport default function MultilineEdgeLabel(props: EdgeProps) {\n const {\n id,\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n label,\n markerStart, // <-- forward these\n markerEnd,\n style,\n selected,\n } = props;\n\n const [edgePath, labelX, labelY] = getBezierPath({\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n });\n\n const lines = String(label ?? \"\").split(\"\\n\");\n\n return (\n <>\n <path\n id={id}\n d={edgePath}\n className={`react-flow__edge-path${selected ? \" selected\" : \"\"}`}\n markerStart={markerStart}\n markerEnd={markerEnd}\n style={style as any}\n />\n\n {/* Optional: bigger hitbox for hover/selection */}\n\n <text\n x={labelX}\n y={labelY}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fontSize=\"10px\"\n pointerEvents=\"none\"\n >\n {lines.map((line, i) => (\n <tspan\n key={i}\n x={labelX}\n dy={i === 0 ? 0 : \"1.2em\"}\n style={{ fontStyle: i === 0 ? \"normal\" : \"italic\" }}\n >\n {line}\n </tspan>\n ))}\n </text>\n </>\n );\n}\n","import { useMemo } from \"react\";\nimport {\n BaseEdge,\n EdgeLabelRenderer,\n getBezierPath,\n type EdgeProps as XYFlowEdgeProps,\n} from \"@xyflow/react\";\n\ninterface EdgeData {\n message?: {\n collection?: string;\n };\n opacity?: number;\n animated?: boolean;\n}\n\ninterface CustomEdgeProps extends Omit<XYFlowEdgeProps, \"data\"> {\n data?: EdgeData;\n}\n\nexport default function CustomEdge({\n id,\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n style = {},\n markerEnd,\n label,\n labelStyle,\n data,\n}: CustomEdgeProps) {\n const [edgePath, labelX, labelY] = getBezierPath({\n sourceX,\n sourceY,\n sourcePosition,\n targetX,\n targetY,\n targetPosition,\n });\n\n const randomDelay = useMemo(() => Math.random() * 1, []);\n const collection = data?.message?.collection;\n const opacity = data?.opacity ?? 1;\n\n const messageColor = useMemo(\n () => (collection: string) => {\n switch (collection) {\n case \"events\":\n return \"orange\";\n case \"commands\":\n return \"blue\";\n case \"queries\":\n return \"green\";\n default:\n return \"gray\";\n }\n },\n [],\n );\n\n return (\n <>\n <BaseEdge\n path={edgePath}\n markerEnd={markerEnd}\n style={{\n strokeWidth: 2,\n stroke: \"#fff\",\n ...style,\n }}\n />\n {data?.animated && (\n <g className={`z-30 ${opacity === 1 ? \"opacity-100\" : \"opacity-10\"}`}>\n <circle\n cx=\"0\"\n cy=\"0\"\n r=\"7\"\n fill={messageColor(collection || \"default\")}\n >\n <animateMotion\n dur=\"2s\"\n repeatCount=\"indefinite\"\n path={edgePath}\n rotate=\"auto\"\n begin={`${randomDelay}s`}\n >\n <mpath href={`#${id}`} />\n </animateMotion>\n </circle>\n </g>\n )}\n {label && (\n <EdgeLabelRenderer>\n <div\n style={{\n position: \"absolute\",\n transform: `translate(-50%, -50%) translate(${labelX}px,${labelY}px)`,\n zIndex: 1000,\n ...(labelStyle as any),\n }}\n className=\"nodrag nopan max-w-[120px] text-xs bg-white px-2 py-1 rounded border border-gray-200 text-gray-600 font-medium shadow-sm text-center\"\n >\n {label}\n </div>\n </EdgeLabelRenderer>\n )}\n </>\n );\n}\n","import {\n useState,\n useCallback,\n useRef,\n useEffect,\n forwardRef,\n useImperativeHandle,\n} from \"react\";\nimport type { Node } from \"@xyflow/react\";\n\n// Define interfaces for different node data structures\ninterface MessageData {\n name: string;\n version?: string;\n}\n\ninterface ServiceData {\n name: string;\n version?: string;\n}\n\ninterface DomainData {\n name: string;\n version?: string;\n}\n\ninterface EntityData {\n name: string;\n version?: string;\n}\n\ninterface NodeDataContent extends Record<string, unknown> {\n message?: {\n data: MessageData;\n };\n service?: {\n data: ServiceData;\n };\n domain?: {\n data: DomainData;\n };\n entity?: {\n data: EntityData;\n };\n name?: string;\n version?: string;\n}\n\n// Extend the Node type with our custom data structure\ntype CustomNode = Node<NodeDataContent>;\n\ninterface VisualiserSearchProps {\n nodes: CustomNode[];\n onNodeSelect: (node: CustomNode) => void;\n onClear: () => void;\n onPaneClick?: () => void;\n}\n\nexport interface VisualiserSearchRef {\n hideSuggestions: () => void;\n}\n\nconst VisualiserSearch = forwardRef<VisualiserSearchRef, VisualiserSearchProps>(\n ({ nodes, onNodeSelect, onClear, onPaneClick: _onPaneClick }, ref) => {\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [filteredSuggestions, setFilteredSuggestions] = useState<\n CustomNode[]\n >([]);\n const [showSuggestions, setShowSuggestions] = useState(false);\n const [selectedSuggestionIndex, setSelectedSuggestionIndex] = useState(-1);\n const searchInputRef = useRef<HTMLInputElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const hideSuggestions = useCallback(() => {\n setShowSuggestions(false);\n setSelectedSuggestionIndex(-1);\n }, []);\n\n useImperativeHandle(\n ref,\n () => ({\n hideSuggestions,\n }),\n [hideSuggestions],\n );\n\n const getNodeDisplayName = useCallback((node: CustomNode) => {\n const name =\n node.data?.message?.data?.name ||\n node.data?.service?.data?.name ||\n node.data?.domain?.data?.name ||\n node.data?.entity?.data?.name ||\n node.data?.name ||\n node.id;\n const version =\n node.data?.message?.data?.version ||\n node.data?.service?.data?.version ||\n node.data?.domain?.data?.version ||\n node.data?.entity?.data?.version ||\n node.data?.version;\n return version ? `${name} (v${version})` : name;\n }, []);\n\n const getNodeTypeColorClass = useCallback((nodeType: string) => {\n const colorClasses: { [key: string]: string } = {\n events: \"bg-orange-600 text-white\",\n services: \"bg-pink-600 text-white\",\n flows: \"bg-teal-600 text-white\",\n commands: \"bg-blue-600 text-white\",\n queries: \"bg-green-600 text-white\",\n channels: \"bg-gray-600 text-white\",\n domains: \"bg-yellow-500 text-white\",\n externalSystem: \"bg-pink-600 text-white\",\n actor: \"bg-yellow-500 text-white\",\n step: \"bg-gray-700 text-white\",\n user: \"bg-yellow-500 text-white\",\n custom: \"bg-gray-500 text-white\",\n };\n return colorClasses[nodeType] || \"bg-gray-100 text-gray-700\";\n }, []);\n\n const handleSearchChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const query = event.target.value;\n setSearchQuery(query);\n\n if (query.length > 0) {\n const filtered = nodes.filter((node) => {\n const nodeName = getNodeDisplayName(node);\n return nodeName.toLowerCase().includes(query.toLowerCase());\n });\n setFilteredSuggestions(filtered);\n setShowSuggestions(true);\n setSelectedSuggestionIndex(-1);\n } else {\n setFilteredSuggestions(nodes);\n setShowSuggestions(true);\n setSelectedSuggestionIndex(-1);\n }\n },\n [nodes, getNodeDisplayName],\n );\n\n const handleSearchFocus = useCallback(() => {\n if (searchQuery.length === 0) {\n setFilteredSuggestions(nodes);\n }\n setShowSuggestions(true);\n setSelectedSuggestionIndex(-1);\n }, [nodes, searchQuery]);\n\n const handleSuggestionClick = useCallback(\n (node: CustomNode) => {\n setSearchQuery(getNodeDisplayName(node));\n setShowSuggestions(false);\n onNodeSelect(node);\n },\n [onNodeSelect, getNodeDisplayName],\n );\n\n const handleSearchKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (!showSuggestions || filteredSuggestions.length === 0) return;\n\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n setSelectedSuggestionIndex((prev) =>\n prev < filteredSuggestions.length - 1 ? prev + 1 : 0,\n );\n break;\n case \"ArrowUp\":\n event.preventDefault();\n setSelectedSuggestionIndex((prev) =>\n prev > 0 ? prev - 1 : filteredSuggestions.length - 1,\n );\n break;\n case \"Enter\":\n event.preventDefault();\n if (selectedSuggestionIndex >= 0) {\n handleSuggestionClick(\n filteredSuggestions[selectedSuggestionIndex],\n );\n }\n break;\n case \"Escape\":\n setShowSuggestions(false);\n setSelectedSuggestionIndex(-1);\n break;\n }\n },\n [\n showSuggestions,\n filteredSuggestions,\n selectedSuggestionIndex,\n handleSuggestionClick,\n ],\n );\n\n const clearSearch = useCallback(() => {\n setSearchQuery(\"\");\n setShowSuggestions(false);\n setFilteredSuggestions([]);\n setSelectedSuggestionIndex(-1);\n onClear();\n if (searchInputRef.current) {\n searchInputRef.current.focus();\n }\n }, [onClear]);\n\n // Close suggestions when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target as any)\n ) {\n setShowSuggestions(false);\n setSelectedSuggestionIndex(-1);\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, []);\n\n return (\n <div ref={containerRef} className=\"w-full max-w-md mx-auto relative\">\n <div className=\"relative\">\n <input\n ref={searchInputRef}\n type=\"text\"\n placeholder=\"Search nodes...\"\n value={searchQuery}\n onChange={handleSearchChange}\n onKeyDown={handleSearchKeyDown}\n onFocus={handleSearchFocus}\n className=\"w-full px-4 py-2 pr-10 bg-white border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-[rgb(var(--ec-accent))] focus:border-transparent\"\n />\n {searchQuery && (\n <button\n onClick={clearSearch}\n className=\"absolute right-2 top-1/2 transform -translate-y-1/2 text-gray-400 hover:text-gray-600\"\n aria-label=\"Clear search\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n )}\n </div>\n {showSuggestions && filteredSuggestions.length > 0 && (\n <div className=\"absolute top-full left-0 right-0 mt-1 bg-white border border-gray-300 rounded-md shadow-lg z-50 max-h-60 overflow-y-auto\">\n {filteredSuggestions.map((node, index) => {\n const nodeName = getNodeDisplayName(node);\n const nodeType = node.type || \"unknown\";\n return (\n <div\n key={node.id}\n onClick={() => handleSuggestionClick(node)}\n className={`px-4 py-2 cursor-pointer flex items-center justify-between hover:bg-gray-100 ${\n index === selectedSuggestionIndex\n ? \"bg-[rgb(var(--ec-accent-subtle))]\"\n : \"\"\n }`}\n >\n <span className=\"text-sm font-medium text-gray-900\">\n {nodeName}\n </span>\n <span\n className={`text-xs capitalize px-2 py-1 rounded ${getNodeTypeColorClass(nodeType)}`}\n >\n {nodeType}\n </span>\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n },\n);\n\nVisualiserSearch.displayName = \"VisualiserSearch\";\n\nexport default VisualiserSearch;\n","import React, { useState, useEffect, useCallback } from \"react\";\nimport { ChevronLeftIcon, ChevronRightIcon } from \"@heroicons/react/24/outline\";\nimport type { Edge } from \"@xyflow/react\";\n\ninterface NodeData {\n step?: {\n title?: string;\n summary?: string;\n };\n service?: {\n data?: {\n name?: string;\n summary?: string;\n };\n };\n message?: {\n data?: {\n name?: string;\n summary?: string;\n };\n };\n flow?: {\n data?: {\n name?: string;\n };\n };\n custom?: {\n title?: string;\n label?: string;\n summary?: string;\n };\n actor?: {\n label?: string;\n };\n externalSystem?: {\n label?: string;\n };\n}\n\ninterface CustomNode {\n id: string;\n data: NodeData;\n}\n\ninterface StepWalkthroughProps {\n nodes: CustomNode[];\n edges: Edge[];\n isFlowVisualization: boolean;\n onStepChange: (\n nodeId: string | null,\n highlightPaths?: string[],\n shouldZoomOut?: boolean,\n ) => void;\n mode?: \"full\" | \"simple\";\n}\n\ninterface PathOption {\n targetId: string;\n label?: string;\n targetNode: CustomNode;\n}\n\nexport default function StepWalkthrough({\n nodes,\n edges,\n isFlowVisualization,\n onStepChange,\n mode = \"full\",\n}: StepWalkthroughProps) {\n const [currentNodeId, setCurrentNodeId] = useState<string | null>(null);\n const [pathHistory, setPathHistory] = useState<string[]>([]);\n const [currentStepIndex, setCurrentStepIndex] = useState<number>(-1); // -1 means not started\n const [availablePaths, setAvailablePaths] = useState<PathOption[]>([]);\n const [selectedPathIndex, setSelectedPathIndex] = useState<number>(0);\n const [startNodeId, setStartNodeId] = useState<string | null>(null);\n\n useEffect(() => {\n if (isFlowVisualization && nodes.length > 0) {\n // Find the starting node (node with no incoming edges)\n const incomingEdgeMap = new Map<string, number>();\n nodes.forEach((node: CustomNode) => incomingEdgeMap.set(node.id, 0));\n\n edges.forEach((edge: Edge) => {\n if (incomingEdgeMap.has(edge.target)) {\n incomingEdgeMap.set(\n edge.target,\n (incomingEdgeMap.get(edge.target) || 0) + 1,\n );\n }\n });\n\n const startNodes = nodes.filter(\n (node: CustomNode) => incomingEdgeMap.get(node.id) === 0,\n );\n if (startNodes.length > 0 && !startNodeId) {\n const firstStartNode = startNodes[0];\n setStartNodeId(firstStartNode.id);\n }\n }\n }, [nodes, edges, isFlowVisualization, startNodeId]);\n\n useEffect(() => {\n if (currentNodeId) {\n // Find available paths from current node\n const outgoingEdges = edges.filter(\n (edge: Edge) => edge.source === currentNodeId,\n );\n const paths: PathOption[] = outgoingEdges.map((edge: Edge) => {\n const targetNode = nodes.find((n: CustomNode) => n.id === edge.target);\n return {\n targetId: edge.target,\n label: edge.label as string | undefined,\n targetNode: targetNode!,\n };\n });\n setAvailablePaths(paths);\n setSelectedPathIndex(0);\n } else {\n setAvailablePaths([]);\n }\n }, [currentNodeId, nodes, edges]);\n\n const handleNextStep = useCallback(() => {\n if (currentStepIndex === -1) {\n // Start the walkthrough\n if (startNodeId) {\n setPathHistory([startNodeId]);\n setCurrentNodeId(startNodeId);\n setCurrentStepIndex(0);\n onStepChange(startNodeId);\n }\n } else if (availablePaths.length > 0) {\n // Move to the selected path\n const selectedPath = availablePaths[selectedPathIndex];\n const newHistory = [...pathHistory, selectedPath.targetId];\n setPathHistory(newHistory);\n setCurrentNodeId(selectedPath.targetId);\n setCurrentStepIndex((prev) => prev + 1);\n\n // Highlight the selected path\n const allPaths = availablePaths.map(\n (p) => `${currentNodeId}-${p.targetId}`,\n );\n onStepChange(selectedPath.targetId, allPaths);\n }\n }, [\n currentStepIndex,\n startNodeId,\n availablePaths,\n selectedPathIndex,\n currentNodeId,\n onStepChange,\n ]);\n\n const handlePreviousStep = useCallback(() => {\n if (currentStepIndex > 0) {\n // Go back to previous step\n const newIndex = currentStepIndex - 1;\n const prevNodeId = pathHistory[newIndex];\n setCurrentNodeId(prevNodeId);\n setCurrentStepIndex(newIndex);\n onStepChange(prevNodeId);\n } else if (currentStepIndex === 0) {\n // Go back to the start (no selection)\n setCurrentNodeId(null);\n setCurrentStepIndex(-1);\n onStepChange(null);\n }\n }, [currentStepIndex, pathHistory, onStepChange]);\n\n const handlePathSelection = useCallback((index: number) => {\n setSelectedPathIndex(index);\n }, []);\n\n const handleFinish = useCallback(() => {\n setCurrentNodeId(null);\n setCurrentStepIndex(-1);\n setPathHistory([]);\n onStepChange(null, [], true); // Pass true to indicate full reset with zoom out\n }, [onStepChange]);\n\n if (!isFlowVisualization || nodes.length === 0 || mode !== \"full\") {\n return null;\n }\n\n const getCurrentStepInfo = () => {\n if (currentStepIndex === -1) {\n return {\n title: \"Walk through business flow\",\n description: \"Step through the flow to understand the business process\",\n };\n }\n\n const currentNode = nodes.find((n: CustomNode) => n.id === currentNodeId);\n if (!currentNode) return { title: \"Unknown step\", description: \"\" };\n\n let stepNumber = currentStepIndex + 1;\n let title = `Step ${stepNumber}`;\n let description = \"\";\n\n // Get node information based on type - check step data first, then type-specific data\n if (currentNode.data.step?.title) {\n title += `: ${currentNode.data.step.title}`;\n } else if (currentNode.data.service?.data?.name) {\n title += `: ${currentNode.data.service.data.name}`;\n } else if (currentNode.data.message?.data?.name) {\n title += `: ${currentNode.data.message.data.name}`;\n } else if (currentNode.data.flow?.data?.name) {\n title += `: ${currentNode.data.flow.data.name}`;\n } else if (currentNode.data.custom?.title) {\n title += `: ${currentNode.data.custom.title}`;\n } else if (currentNode.data.custom?.label) {\n title += `: ${currentNode.data.custom.label}`;\n } else if (currentNode.data.actor?.label) {\n title += `: ${currentNode.data.actor.label}`;\n } else if (currentNode.data.externalSystem?.label) {\n title += `: ${currentNode.data.externalSystem.label}`;\n }\n\n // Get description - check step data first, then type-specific data\n if (currentNode.data.step?.summary) {\n description = currentNode.data.step.summary;\n } else if (currentNode.data.service?.data?.summary) {\n description = currentNode.data.service.data.summary;\n } else if (currentNode.data.message?.data?.summary) {\n description = currentNode.data.message.data.summary;\n } else if (currentNode.data.custom?.summary) {\n description = currentNode.data.custom.summary;\n }\n\n return { title, description };\n };\n\n const { title, description } = getCurrentStepInfo();\n\n return (\n <div className=\"ml-12 bg-white rounded-lg shadow-sm px-4 py-2 z-30 border border-gray-200 w-[350px]\">\n <div className=\"mb-2\">\n <h3 className=\"text-sm font-semibold text-gray-900\">{title}</h3>\n {description && (\n <p className=\"text-xs text-gray-600 mt-1\">{description}</p>\n )}\n </div>\n\n {/* Show path options when there are multiple paths */}\n {currentNodeId && availablePaths.length > 1 && (\n <div className=\"mb-3\">\n <label className=\"block text-xs font-medium text-gray-700 mb-2\">\n Choose next path:\n </label>\n <select\n value={selectedPathIndex}\n onChange={(e: React.ChangeEvent<HTMLSelectElement>) =>\n handlePathSelection(parseInt(e.target.value))\n }\n className=\"w-full px-3 py-2 text-xs border border-gray-300 rounded-md bg-white focus:outline-none focus:ring-2 focus:ring-[rgb(var(--ec-accent))] focus:border-[rgb(var(--ec-accent))]\"\n >\n {availablePaths.map((path, index) => {\n // @ts-ignore\n const nodeLabel =\n path.targetNode.data.step?.title ||\n (path.targetNode.data as any).service?.data?.name ||\n (path.targetNode.data as any).message?.data?.name ||\n (path.targetNode.data as any).flow?.data?.name ||\n (path.targetNode.data as any).custom?.title ||\n (path.targetNode.data as any).custom?.label ||\n (path.targetNode.data as any).actor?.label ||\n (path.targetNode.data as any).externalSystem?.label ||\n \"Unknown\";\n\n return (\n <option key={path.targetId} value={index}>\n {path.label ? `${path.label}: ${nodeLabel}` : nodeLabel}\n </option>\n );\n })}\n </select>\n </div>\n )}\n\n <div className=\"flex items-center justify-between\">\n {currentStepIndex === -1 ? (\n // Initial state - show only Start button on the right\n <>\n <div className=\"flex-1\"></div>\n <button\n onClick={handleNextStep}\n className=\"flex items-center justify-center px-6 py-2 text-xs font-medium bg-[rgb(var(--ec-accent))] text-white rounded-md hover:bg-[rgb(var(--ec-accent-hover))] focus:outline-none focus:ring-2 focus:ring-[rgb(var(--ec-accent))] focus:ring-offset-2 transition-colors\"\n >\n Start\n </button>\n </>\n ) : (\n // In walkthrough - show Previous on left, Next on right (only if paths available)\n <>\n <button\n onClick={handlePreviousStep}\n className=\"flex items-center justify-center px-4 py-2 text-xs font-medium bg-[rgb(var(--ec-accent))] text-white rounded-md hover:bg-[rgb(var(--ec-accent-hover))] focus:outline-none focus:ring-2 focus:ring-[rgb(var(--ec-accent))] focus:ring-offset-2 transition-colors\"\n >\n <ChevronLeftIcon className=\"w-4 h-4 mr-1\" />\n Previous\n </button>\n\n {availablePaths.length > 0 ? (\n <button\n onClick={handleNextStep}\n className=\"flex items-center justify-center px-4 py-2 text-xs font-medium bg-[rgb(var(--ec-accent))] text-white rounded-md hover:bg-[rgb(var(--ec-accent-hover))] focus:outline-none focus:ring-2 focus:ring-[rgb(var(--ec-accent))] focus:ring-offset-2 transition-colors\"\n >\n Next\n <ChevronRightIcon className=\"w-4 h-4 ml-1\" />\n </button>\n ) : (\n <button\n onClick={handleFinish}\n className=\"flex items-center justify-center px-4 py-2 text-xs font-medium bg-green-600 text-white rounded-md hover:bg-green-700 focus:outline-none focus:ring-2 focus:ring-green-500 focus:ring-offset-2 transition-colors\"\n >\n Finish\n </button>\n )}\n </>\n )}\n </div>\n </div>\n );\n}\n","import React, { useState, useCallback } from \"react\";\nimport * as Dialog from \"@radix-ui/react-dialog\";\nimport { CheckIcon, ClipboardIcon, ExternalLinkIcon } from \"lucide-react\";\nimport { useReactFlow } from \"@xyflow/react\";\nimport { exportNodeGraphForStudio } from \"../utils/export-node-graph\";\n\ninterface StudioModalProps {\n isOpen: boolean;\n onClose: () => void;\n}\n\nconst StudioModal: React.FC<StudioModalProps> = ({ isOpen, onClose }) => {\n const [copySuccess, setCopySuccess] = useState(false);\n\n const { toObject } = useReactFlow();\n\n const handleCopyToClipboard = useCallback(async () => {\n const visualizerData = toObject();\n const studioData = exportNodeGraphForStudio(visualizerData);\n\n try {\n await navigator.clipboard.writeText(JSON.stringify(studioData, null, 2));\n setCopySuccess(true);\n setTimeout(() => setCopySuccess(false), 2000);\n } catch (error) {\n console.error(\"Failed to copy to clipboard:\", error);\n // Fallback for older browsers\n const textarea = document.createElement(\"textarea\");\n textarea.value = JSON.stringify(studioData, null, 2);\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand(\"copy\");\n document.body.removeChild(textarea);\n setCopySuccess(true);\n setTimeout(() => setCopySuccess(false), 2000);\n }\n }, []);\n\n const handleOpenStudio = () => {\n window.open(\n \"https://app.eventcatalog.studio/playground?import=true&utm_source=eventcatalog&utm_medium=referral&utm_campaign=playground-import\",\n \"_blank\",\n );\n onClose();\n };\n\n return (\n <Dialog.Root open={isOpen} onOpenChange={onClose}>\n <Dialog.Portal>\n <Dialog.Overlay className=\"fixed inset-0 bg-black/50 data-[state=open]:animate-overlayShow z-50\" />\n <Dialog.Content className=\"fixed top-1/2 left-1/2 w-[90vw] max-w-md -translate-x-1/2 -translate-y-1/2 rounded-lg bg-white p-6 shadow-xl focus:outline-none data-[state=open]:animate-contentShow z-[100]\">\n <Dialog.Title className=\"text-lg font-semibold text-gray-900 mb-3\">\n Open in EventCatalog Studio\n </Dialog.Title>\n\n <Dialog.Description className=\"text-sm text-gray-600 mb-6\">\n Import your diagram into{\" \"}\n <a\n href=\"https://eventcatalog.studio\"\n className=\"text-[rgb(var(--ec-accent))] hover:text-[rgb(var(--ec-accent-hover))] underline\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n EventCatalog Studio\n </a>{\" \"}\n to create designs from your visualization of your architecture.\n </Dialog.Description>\n\n <div className=\"space-y-4\">\n <div className=\"bg-gray-50 rounded-lg p-4 border border-gray-200\">\n <h4 className=\"text-sm font-bold text-gray-900 mb-2\">\n Step 1: Copy diagram\n </h4>\n <p className=\"text-xs text-gray-600 mb-3\">\n Copy your diagram data to your clipboard.\n </p>\n <button\n onClick={handleCopyToClipboard}\n className={`w-full flex items-center justify-center space-x-2 px-4 py-2 text-sm font-medium rounded-md border transition-colors ${\n copySuccess\n ? \"bg-green-50 border-green-200 text-green-700\"\n : \"bg-white border-gray-300 text-gray-700 hover:bg-gray-50\"\n }`}\n >\n {copySuccess ? (\n <>\n <CheckIcon className=\"w-4 h-4\" />\n <span>Copied!</span>\n </>\n ) : (\n <>\n <ClipboardIcon className=\"w-4 h-4\" />\n <span>Copy diagram to clipboard</span>\n </>\n )}\n </button>\n </div>\n\n <div className=\"bg-[rgb(var(--ec-accent-subtle))] rounded-lg p-4 border border-[rgb(var(--ec-accent)/0.3)]\">\n <h4 className=\"text-sm font-bold text-gray-900 mb-2\">\n Step 2: Open EventCatalog Studio\n </h4>\n <p className=\"text-xs text-gray-600 mb-3\">\n Go to EventCatalog Studio and import your design using the\n \"Import from EventCatalog\" button.\n </p>\n\n <button\n onClick={handleOpenStudio}\n className=\"w-full flex items-center justify-center space-x-2 px-4 py-2 bg-[rgb(var(--ec-accent))] text-white text-sm font-medium rounded-md hover:bg-[rgb(var(--ec-accent-hover))] transition-colors\"\n >\n <ExternalLinkIcon className=\"w-4 h-4\" />\n <span>Open EventCatalog Studio</span>\n </button>\n <p className=\"text-[12px] text-gray-500 italic mt-4 mb-0\">\n Don't worry, none of your data is stored by EventCatalog Studio,\n everything is local to your browser.\n </p>\n </div>\n </div>\n\n <div className=\"mt-6 flex justify-end\">\n <Dialog.Close asChild>\n <button\n type=\"button\"\n className=\"px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-[rgb(var(--ec-accent))] focus:ring-offset-2 transition-colors\"\n onClick={onClose}\n >\n Close\n </button>\n </Dialog.Close>\n </div>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n );\n};\n\nexport default StudioModal;\n","import type { Node, ReactFlowJsonObject, Edge } from \"@xyflow/react\";\n\n// Define the structure of resource data that can be found in nodes\ninterface ResourceData {\n id?: string;\n name?: string;\n summary?: string;\n version?: string;\n}\n\n// Define the possible node data structure\ninterface NodeDataWithResources {\n [key: string]: any;\n channel?: ResourceData;\n custom?: ResourceData;\n data?: ResourceData;\n domain?: ResourceData;\n entity?: ResourceData;\n message?: ResourceData;\n flow?: ResourceData;\n service?: ResourceData;\n step?: ResourceData;\n user?: ResourceData;\n}\n\nexport const exportNodeGraphForStudio = (\n data: ReactFlowJsonObject,\n): ReactFlowJsonObject => {\n const dataTypes: (keyof NodeDataWithResources)[] = [\n \"channel\",\n \"custom\",\n \"data\",\n \"domain\",\n \"entity\",\n \"message\",\n \"flow\",\n \"service\",\n \"step\",\n \"user\",\n ];\n\n // try and remove unwanted data for studio\n const nodes = data.nodes.map((node: Node) => {\n let nodeData = node.data as NodeDataWithResources;\n const dataProperties = Object.keys(\n nodeData,\n ) as (keyof NodeDataWithResources)[];\n\n // If we find a match.....\n const hasCustomDataType = dataProperties.find((property) =>\n dataTypes.includes(property),\n );\n\n if (hasCustomDataType && nodeData[hasCustomDataType]) {\n const resourceData = nodeData[hasCustomDataType] as ResourceData;\n nodeData = {\n ...nodeData,\n [hasCustomDataType]: {\n id: resourceData?.id,\n name: resourceData?.name,\n summary: resourceData?.summary,\n version: resourceData?.version,\n },\n };\n }\n\n return {\n ...node,\n data: {\n ...nodeData,\n // We dont need these for studio\n source: undefined,\n target: undefined,\n // Studio wants all nodes in full mode\n mode: \"full\",\n },\n };\n });\n\n const edges = data.edges.map((edge: Edge) => {\n return {\n ...edge,\n data: undefined,\n type: \"animatedMessage\",\n };\n });\n\n return {\n ...data,\n nodes,\n edges,\n };\n};\n","import React, { useState, useCallback, useEffect } from \"react\";\nimport * as Dialog from \"@radix-ui/react-dialog\";\nimport { XIcon, FocusIcon } from \"lucide-react\";\nimport {\n ReactFlowProvider,\n type Node,\n type Edge,\n type NodeTypes,\n type EdgeTypes,\n} from \"@xyflow/react\";\nimport FocusModeContent from \"./FocusMode/FocusModeContent\";\nimport { getNodeDisplayInfo } from \"./FocusMode/utils\";\n\ninterface FocusModeModalProps {\n isOpen: boolean;\n onClose: () => void;\n initialNodeId: string | null;\n nodes: Node[];\n edges: Edge[];\n nodeTypes: NodeTypes;\n edgeTypes: EdgeTypes;\n}\n\nconst FocusModeModal: React.FC<FocusModeModalProps> = ({\n isOpen,\n onClose,\n initialNodeId,\n nodes,\n edges,\n nodeTypes,\n edgeTypes,\n}) => {\n const [centerNodeId, setCenterNodeId] = useState<string | null>(\n initialNodeId,\n );\n\n // Reset center node when modal opens with new initial node\n useEffect(() => {\n if (isOpen && initialNodeId) {\n setCenterNodeId(initialNodeId);\n }\n }, [isOpen, initialNodeId]);\n\n const handleSwitchCenter = useCallback(\n (newCenterNodeId: string, _direction: \"left\" | \"right\") => {\n setCenterNodeId(newCenterNodeId);\n },\n [],\n );\n\n // Get center node info for title\n const centerNode = centerNodeId\n ? nodes.find((n) => n.id === centerNodeId)\n : null;\n const centerNodeInfo = centerNode ? getNodeDisplayInfo(centerNode) : null;\n\n if (!centerNodeId) {\n return null;\n }\n\n return (\n <Dialog.Root open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <Dialog.Portal\n container={typeof document !== \"undefined\" ? document.body : undefined}\n >\n <div\n className=\"fixed inset-0 z-[99999]\"\n style={{ isolation: \"isolate\" }}\n >\n <Dialog.Overlay className=\"fixed inset-0 bg-black/70 data-[state=open]:animate-overlayShow\" />\n <Dialog.Content className=\"fixed inset-4 md:inset-8 lg:inset-12 rounded-lg bg-[rgb(var(--ec-card-bg,var(--ec-page-bg)))] shadow-xl focus:outline-none flex flex-col overflow-hidden\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-[rgb(var(--ec-page-border))] flex-shrink-0\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex items-center justify-center w-10 h-10 rounded-lg bg-[rgb(var(--ec-accent-subtle))]\">\n <FocusIcon className=\"w-5 h-5 text-[rgb(var(--ec-accent))]\" />\n </div>\n <div>\n <Dialog.Title className=\"text-lg font-semibold text-[rgb(var(--ec-page-text))]\">\n Focus Mode\n </Dialog.Title>\n <Dialog.Description className=\"text-sm text-[rgb(var(--ec-page-text-muted))]\">\n {centerNodeInfo\n ? `Exploring: ${centerNodeInfo.name} - Click on connected nodes to navigate`\n : \"Explore node connections\"}\n </Dialog.Description>\n </div>\n </div>\n <Dialog.Close asChild>\n <button\n className=\"flex items-center justify-center w-10 h-10 rounded-lg text-[rgb(var(--ec-icon-color))] hover:text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-content-hover,var(--ec-page-border)/0.5))] transition-colors\"\n aria-label=\"Close\"\n >\n <XIcon className=\"w-5 h-5\" />\n </button>\n </Dialog.Close>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-hidden\">\n <ReactFlowProvider>\n <FocusModeContent\n centerNodeId={centerNodeId}\n nodes={nodes}\n edges={edges}\n nodeTypes={nodeTypes}\n edgeTypes={edgeTypes}\n onSwitchCenter={handleSwitchCenter}\n />\n </ReactFlowProvider>\n </div>\n </Dialog.Content>\n </div>\n </Dialog.Portal>\n </Dialog.Root>\n );\n};\n\nexport default FocusModeModal;\n","import React, {\n useMemo,\n useCallback,\n useEffect,\n useState,\n useRef,\n} from \"react\";\nimport {\n ReactFlow,\n Background,\n Controls,\n useReactFlow,\n useNodesState,\n useEdgesState,\n type Node,\n type Edge,\n type NodeTypes,\n type EdgeTypes,\n} from \"@xyflow/react\";\nimport { getConnectedNodes, getNodeDisplayInfo } from \"./utils\";\nimport FocusModeNodeActions from \"./FocusModeNodeActions\";\nimport FocusModePlaceholder from \"./FocusModePlaceholder\";\n\ninterface FocusModeContentProps {\n centerNodeId: string;\n nodes: Node[];\n edges: Edge[];\n nodeTypes: NodeTypes;\n edgeTypes: EdgeTypes;\n onSwitchCenter: (\n newCenterNodeId: string,\n direction: \"left\" | \"right\",\n ) => void;\n}\n\nconst HORIZONTAL_SPACING = 450;\nconst VERTICAL_SPACING = 200;\nconst SLIDE_DURATION = 300;\n\nconst FocusModeContent: React.FC<FocusModeContentProps> = ({\n centerNodeId,\n nodes: allNodes,\n edges: allEdges,\n nodeTypes,\n edgeTypes,\n onSwitchCenter,\n}) => {\n const { fitView } = useReactFlow();\n const [isAnimating, setIsAnimating] = useState(false);\n const [needsFitView, setNeedsFitView] = useState(false);\n const [hoveredEdgeId, setHoveredEdgeId] = useState<string | null>(null);\n const [isReady, setIsReady] = useState(false);\n const reactFlowInitialized = useRef(false);\n const animationTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n // Cleanup timeout on unmount\n useEffect(() => {\n return () => {\n if (animationTimeoutRef.current) {\n clearTimeout(animationTimeoutRef.current);\n }\n };\n }, []);\n\n // Calculate focused nodes and edges with positions\n const calculateFocusedGraph = useCallback(\n (centerId: string) => {\n const centerNode = allNodes.find((n) => n.id === centerId);\n if (!centerNode) {\n return { nodes: [], edges: [] };\n }\n\n const { leftNodes, rightNodes } = getConnectedNodes(\n centerId,\n allNodes,\n allEdges,\n );\n const centerNodeInfo = getNodeDisplayInfo(centerNode);\n const positionedNodes: Node[] = [];\n\n // Center node at origin\n positionedNodes.push({\n ...centerNode,\n position: { x: 0, y: 0 },\n style: { ...centerNode.style, opacity: 1 },\n data: { ...centerNode.data, isFocusCenter: true },\n });\n\n // Left nodes (incoming)\n leftNodes.forEach((node, index) => {\n const yOffset = (index - (leftNodes.length - 1) / 2) * VERTICAL_SPACING;\n positionedNodes.push({\n ...node,\n position: { x: -HORIZONTAL_SPACING, y: yOffset },\n style: { ...node.style, opacity: 1 },\n });\n });\n\n // Right nodes (outgoing)\n rightNodes.forEach((node, index) => {\n const yOffset =\n (index - (rightNodes.length - 1) / 2) * VERTICAL_SPACING;\n positionedNodes.push({\n ...node,\n position: { x: HORIZONTAL_SPACING, y: yOffset },\n style: { ...node.style, opacity: 1 },\n });\n });\n\n // Add placeholder nodes if no connections exist\n if (leftNodes.length === 0) {\n positionedNodes.push({\n id: \"__placeholder-left__\",\n type: \"placeholder\",\n position: { x: -HORIZONTAL_SPACING, y: 0 },\n data: {\n label: `No inputs found for \"${centerNodeInfo.name}\" in this diagram`,\n side: \"left\",\n },\n draggable: false,\n selectable: false,\n } as Node);\n }\n\n if (rightNodes.length === 0) {\n positionedNodes.push({\n id: \"__placeholder-right__\",\n type: \"placeholder\",\n position: { x: HORIZONTAL_SPACING, y: 0 },\n data: {\n label: `No outputs found for \"${centerNodeInfo.name}\" in this diagram`,\n side: \"right\",\n },\n draggable: false,\n selectable: false,\n } as Node);\n }\n\n // Filter edges - only show edges connected to center node\n const focusedNodeIds = new Set(positionedNodes.map((n) => n.id));\n const filteredEdges = allEdges\n .filter((edge) => {\n // Only include edges where center node is either source or target\n const connectsToCenter =\n edge.source === centerId || edge.target === centerId;\n // And the other end is in our focused nodes\n const otherEndInFocus =\n focusedNodeIds.has(edge.source) && focusedNodeIds.has(edge.target);\n return connectsToCenter && otherEndInFocus;\n })\n .map((edge) => ({\n ...edge,\n style: { ...edge.style, opacity: 1 },\n labelStyle: { ...edge.labelStyle, opacity: 1 },\n data: { ...edge.data, opacity: 1, animated: false },\n animated: false,\n }));\n\n return { nodes: positionedNodes, edges: filteredEdges };\n },\n [allNodes, allEdges],\n );\n\n // Initial graph\n const initialGraph = useMemo(\n () => calculateFocusedGraph(centerNodeId),\n [centerNodeId, calculateFocusedGraph],\n );\n\n const [displayNodes, setDisplayNodes] = useNodesState(initialGraph.nodes);\n const [displayEdges, setDisplayEdges] = useEdgesState(initialGraph.edges);\n\n // Update when centerNodeId changes externally\n useEffect(() => {\n const { nodes, edges } = calculateFocusedGraph(centerNodeId);\n setDisplayNodes(nodes);\n setDisplayEdges(edges);\n setNeedsFitView(true);\n }, [centerNodeId, calculateFocusedGraph, setDisplayNodes, setDisplayEdges]);\n\n // FitView when needed - triggered after nodes are updated\n useEffect(() => {\n if (needsFitView && reactFlowInitialized.current) {\n // Small delay to ensure nodes are rendered, then fit view\n const timer = setTimeout(() => {\n fitView({ padding: 0.2, duration: 300 });\n setNeedsFitView(false);\n }, 50);\n return () => clearTimeout(timer);\n }\n }, [needsFitView, displayNodes, fitView]);\n\n // Handle ReactFlow initialization\n const handleInit = useCallback(() => {\n reactFlowInitialized.current = true;\n // Dialog opens instantly (no animation), so fitView immediately\n requestAnimationFrame(() => {\n fitView({ padding: 0.2, duration: 0 });\n setIsReady(true);\n });\n }, [fitView]);\n\n // Handle switching to a new center node with animation\n const handleSwitchNode = useCallback(\n (nodeId: string, direction: \"left\" | \"right\") => {\n if (nodeId === centerNodeId || isAnimating) return;\n\n setIsAnimating(true);\n\n // Animate: clicked node slides to center, current center hides\n setDisplayNodes((currentNodes) =>\n currentNodes.map((node) => {\n if (node.id === nodeId) {\n // Clicked node slides to center\n return {\n ...node,\n position: { x: 0, y: 0 },\n style: {\n ...node.style,\n transition: `all ${SLIDE_DURATION}ms ease-out`,\n },\n };\n }\n if (node.id === centerNodeId) {\n // Current center node hides\n return {\n ...node,\n style: {\n ...node.style,\n opacity: 0,\n transition: `opacity ${SLIDE_DURATION}ms ease-out`,\n },\n };\n }\n return node;\n }),\n );\n\n // After slide completes, switch to new center\n animationTimeoutRef.current = setTimeout(() => {\n onSwitchCenter(nodeId, direction);\n setIsAnimating(false);\n }, SLIDE_DURATION);\n },\n [centerNodeId, isAnimating, setDisplayNodes, onSwitchCenter],\n );\n\n // Handle node click with animation\n const handleNodeClick = useCallback(\n (_: React.MouseEvent, clickedNode: Node) => {\n if (clickedNode.id === centerNodeId || isAnimating) return;\n const direction = (clickedNode.position?.x ?? 0) < 0 ? \"left\" : \"right\";\n handleSwitchNode(clickedNode.id, direction);\n },\n [centerNodeId, isAnimating, handleSwitchNode],\n );\n\n // Handle edge hover for animation\n const handleEdgeMouseEnter = useCallback(\n (_: React.MouseEvent, edge: Edge) => {\n setHoveredEdgeId(edge.id);\n },\n [],\n );\n\n const handleEdgeMouseLeave = useCallback(() => {\n setHoveredEdgeId(null);\n }, []);\n\n // Apply hover animation to edges - use ReactFlow's built-in animated property\n const edgesWithHover = useMemo(() => {\n return displayEdges.map((edge) => {\n if (edge.id === hoveredEdgeId) {\n return {\n ...edge,\n animated: true,\n };\n }\n return edge;\n });\n }, [displayEdges, hoveredEdgeId]);\n\n // Merge nodeTypes with placeholder\n const mergedNodeTypes = useMemo(\n () => ({\n ...nodeTypes,\n placeholder: FocusModePlaceholder,\n }),\n [nodeTypes],\n );\n\n if (displayNodes.length === 0) {\n return (\n <div className=\"flex items-center justify-center h-full text-[rgb(var(--ec-page-text-muted))]\">\n Node not found\n </div>\n );\n }\n\n return (\n <div\n className=\"h-full w-full focus-mode-container\"\n style={{ opacity: isReady ? 1 : 0 }}\n >\n <ReactFlow\n nodes={displayNodes}\n edges={edgesWithHover}\n nodeTypes={mergedNodeTypes}\n edgeTypes={edgeTypes}\n onNodeClick={handleNodeClick}\n onEdgeMouseEnter={handleEdgeMouseEnter}\n onEdgeMouseLeave={handleEdgeMouseLeave}\n onInit={handleInit}\n proOptions={{ hideAttribution: true }}\n nodesDraggable={true}\n nodesConnectable={false}\n elementsSelectable={true}\n panOnDrag={true}\n zoomOnScroll={true}\n minZoom={0.3}\n maxZoom={2}\n >\n <Background color=\"rgb(var(--ec-page-border))\" gap={20} />\n <Controls showInteractive={false} />\n {displayNodes.map((node, index) => (\n <FocusModeNodeActions\n key={`actions-${node.id}-${index}`}\n node={node}\n isCenter={node.id === centerNodeId}\n onSwitch={handleSwitchNode}\n />\n ))}\n </ReactFlow>\n </div>\n );\n};\n\nexport default FocusModeContent;\n","import type { Node, Edge } from \"@xyflow/react\";\n\nexport interface NodeDisplayInfo {\n id: string;\n name: string;\n type: string;\n version?: string;\n description?: string;\n}\n\nexport interface ConnectedNodes {\n leftNodes: Node[];\n rightNodes: Node[];\n}\n\nexport const NODE_COLOR_CLASSES: Record<string, string> = {\n events: \"bg-orange-600\",\n services: \"bg-pink-600\",\n flows: \"bg-teal-600\",\n commands: \"bg-blue-600\",\n queries: \"bg-green-600\",\n channels: \"bg-gray-600\",\n externalSystem: \"bg-pink-600\",\n actor: \"bg-yellow-500\",\n step: \"bg-gray-700\",\n data: \"bg-blue-600\",\n \"data-products\": \"bg-indigo-600\",\n domains: \"bg-yellow-600\",\n entities: \"bg-purple-600\",\n};\n\nexport const NODE_TYPE_LABELS: Record<string, string> = {\n events: \"Event\",\n services: \"Service\",\n flows: \"Flow\",\n commands: \"Command\",\n queries: \"Query\",\n channels: \"Channel\",\n externalSystem: \"External System\",\n actor: \"Actor\",\n step: \"Step\",\n data: \"Data\",\n \"data-products\": \"Data Product\",\n domains: \"Domain\",\n entities: \"Entity\",\n};\n\n/**\n * Get connected nodes for a given center node\n * Left nodes: incoming edges (they send TO this node)\n * Right nodes: outgoing edges (this node sends TO them)\n */\nexport function getConnectedNodes(\n centerNodeId: string,\n nodes: Node[],\n edges: Edge[],\n): ConnectedNodes {\n const leftIds = new Set<string>();\n const rightIds = new Set<string>();\n\n edges.forEach((edge) => {\n if (edge.target === centerNodeId) {\n leftIds.add(edge.source);\n }\n if (edge.source === centerNodeId) {\n rightIds.add(edge.target);\n }\n });\n\n return {\n leftNodes: nodes.filter((n) => leftIds.has(n.id)),\n rightNodes: nodes.filter((n) => rightIds.has(n.id)),\n };\n}\n\n// Entity keys that follow the standard data structure pattern\nconst ENTITY_KEYS = [\n \"service\",\n \"message\",\n \"flow\",\n \"channel\",\n \"domain\",\n \"entity\",\n \"dataProduct\",\n] as const;\n\n/**\n * Extract display information from a ReactFlow node\n */\nexport function getNodeDisplayInfo(node: Node): NodeDisplayInfo {\n const nodeType = node.type || \"unknown\";\n const data = node.data as any;\n\n // Find the entity in data using standard keys\n const entityKey = ENTITY_KEYS.find((key) => data[key]);\n const entity = entityKey ? data[entityKey] : null;\n\n const name =\n entity?.data?.name || entity?.id || data.label || data.name || node.id;\n const version =\n entity?.data?.version || entity?.version || data.version || \"\";\n const description =\n entity?.data?.summary ||\n entity?.data?.description ||\n data.summary ||\n data.description ||\n \"\";\n\n return {\n id: node.id,\n name,\n type: nodeType,\n version,\n description: description\n ? truncateDescription(description, 100)\n : undefined,\n };\n}\n\n/**\n * Truncate description to a max length\n */\nfunction truncateDescription(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n return text.slice(0, maxLength).trim() + \"...\";\n}\n\n/**\n * Get the color class for a node type\n */\nexport function getNodeColorClass(nodeType: string): string {\n return NODE_COLOR_CLASSES[nodeType] || \"bg-gray-500\";\n}\n\n/**\n * Get the display label for a node type\n */\nexport function getNodeTypeLabel(nodeType: string): string {\n return NODE_TYPE_LABELS[nodeType] || nodeType;\n}\n\n// Mapping from entity key to doc path\nconst DOC_PATH_MAP: Record<string, string> = {\n service: \"services\",\n flow: \"flows\",\n channel: \"channels\",\n domain: \"domains\",\n entity: \"entities\",\n dataProduct: \"data-products\",\n};\n\n/**\n * Get the documentation URL for a node\n */\nexport function getNodeDocUrl(node: Node): string | null {\n const nodeType = node.type || \"unknown\";\n const data = node.data as any;\n\n // Handle message type separately due to type mapping\n if (data.message) {\n const id = data.message.data?.id || data.message.id || \"\";\n const version = data.message.data?.version || data.message.version || \"\";\n const collectionType =\n nodeType === \"events\"\n ? \"events\"\n : nodeType === \"commands\"\n ? \"commands\"\n : \"queries\";\n return id && version ? `/docs/${collectionType}/${id}/${version}` : null;\n }\n\n // Handle data/container nodes with nested data.data structure\n if (data.data && nodeType === \"data\") {\n const id = data.data.id || \"\";\n const version = data.data.version || \"\";\n return id && version ? `/docs/containers/${id}/${version}` : null;\n }\n\n // Handle standard entity types\n for (const [key, path] of Object.entries(DOC_PATH_MAP)) {\n if (data[key]) {\n const id = data[key].data?.id || data[key].id || \"\";\n const version = data[key].data?.version || data[key].version || \"\";\n return id && version ? `/docs/${path}/${id}/${version}` : null;\n }\n }\n\n return null;\n}\n","import React from \"react\";\nimport { NodeToolbar, Position, useViewport, type Node } from \"@xyflow/react\";\nimport { ArrowRightLeft, FileText } from \"lucide-react\";\nimport { getNodeDocUrl } from \"./utils\";\nimport { buildUrl } from \"../../utils/url-builder\";\n\ninterface FocusModeNodeActionsProps {\n node: Node;\n isCenter: boolean;\n onSwitch: (nodeId: string, direction: \"left\" | \"right\") => void;\n}\n\nconst FocusModeNodeActions: React.FC<FocusModeNodeActionsProps> = ({\n node,\n isCenter,\n onSwitch,\n}) => {\n const { zoom } = useViewport();\n\n // Don't show actions for placeholder nodes\n if (node.type === \"placeholder\") return null;\n\n const docUrl = getNodeDocUrl(node);\n const direction = (node.position?.x ?? 0) < 0 ? \"left\" : \"right\";\n\n // Scale sizes based on zoom (inverse relationship - smaller when zoomed out)\n const baseButtonSize = 32;\n const baseIconSize = 16;\n const scaleFactor = Math.max(0.6, Math.min(1, zoom));\n const buttonSize = Math.round(baseButtonSize * scaleFactor);\n const iconSize = Math.round(baseIconSize * scaleFactor);\n\n const handleSwitch = (e: React.MouseEvent) => {\n e.stopPropagation();\n onSwitch(node.id, direction);\n };\n\n const handleDocClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (docUrl) {\n window.location.href = buildUrl(docUrl);\n }\n };\n\n // Center node only shows docs icon (if available)\n if (isCenter) {\n if (!docUrl) return null;\n return (\n <NodeToolbar\n nodeId={node.id}\n position={Position.Bottom}\n isVisible={true}\n offset={-16}\n >\n <div\n className=\"flex items-center gap-1 bg-[rgb(var(--ec-card-bg,var(--ec-page-bg)))] border border-[rgb(var(--ec-page-border))] rounded-lg shadow-md\"\n style={{ padding: Math.round(4 * scaleFactor) }}\n >\n <button\n onClick={handleDocClick}\n className=\"flex items-center justify-center rounded-md text-[rgb(var(--ec-icon-color))] hover:text-[rgb(var(--ec-accent))] hover:bg-[rgb(var(--ec-accent-subtle))] transition-colors\"\n style={{ width: buttonSize, height: buttonSize }}\n title=\"View documentation\"\n >\n <FileText style={{ width: iconSize, height: iconSize }} />\n </button>\n </div>\n </NodeToolbar>\n );\n }\n\n return (\n <NodeToolbar\n nodeId={node.id}\n position={Position.Bottom}\n isVisible={true}\n offset={-16}\n >\n <div\n className=\"flex items-center gap-1 bg-[rgb(var(--ec-card-bg,var(--ec-page-bg)))] border border-[rgb(var(--ec-page-border))] rounded-lg shadow-md\"\n style={{ padding: Math.round(4 * scaleFactor) }}\n >\n {docUrl && (\n <button\n onClick={handleDocClick}\n className=\"flex items-center justify-center rounded-md text-[rgb(var(--ec-icon-color))] hover:text-[rgb(var(--ec-accent))] hover:bg-[rgb(var(--ec-accent-subtle))] transition-colors\"\n style={{ width: buttonSize, height: buttonSize }}\n title=\"View documentation\"\n >\n <FileText style={{ width: iconSize, height: iconSize }} />\n </button>\n )}\n <button\n onClick={handleSwitch}\n className=\"flex items-center justify-center rounded-md text-[rgb(var(--ec-icon-color))] hover:text-[rgb(var(--ec-accent))] hover:bg-[rgb(var(--ec-accent-subtle))] transition-colors\"\n style={{ width: buttonSize, height: buttonSize }}\n title=\"Focus on this node\"\n >\n <ArrowRightLeft style={{ width: iconSize, height: iconSize }} />\n </button>\n </div>\n </NodeToolbar>\n );\n};\n\nexport default FocusModeNodeActions;\n","import React from \"react\";\nimport { Handle, Position } from \"@xyflow/react\";\n\ninterface FocusModePlaceholderProps {\n data: {\n label: string;\n side: \"left\" | \"right\";\n };\n}\n\nconst FocusModePlaceholder: React.FC<FocusModePlaceholderProps> = ({\n data,\n}) => {\n const { label, side } = data;\n\n return (\n <div\n className=\"px-4 py-4 rounded-lg border-2 border-dashed border-[rgb(var(--ec-page-border))] bg-[rgb(var(--ec-page-bg)/0.5)] max-w-[280px] flex items-center justify-center\"\n style={{ opacity: 0.6, minHeight: \"130px\" }}\n >\n {side === \"right\" && (\n <Handle\n type=\"target\"\n position={Position.Left}\n style={{ visibility: \"hidden\" }}\n />\n )}\n <div className=\"text-center text-sm text-[rgb(var(--ec-page-text-muted))] italic\">\n {label}\n </div>\n {side === \"left\" && (\n <Handle\n type=\"source\"\n position={Position.Right}\n style={{ visibility: \"hidden\" }}\n />\n )}\n </div>\n );\n};\n\nexport default FocusModePlaceholder;\n","import { useState, useEffect, useRef, useCallback } from \"react\";\nimport { CheckIcon, ClipboardIcon } from \"lucide-react\";\nimport type { Node, Edge } from \"@xyflow/react\";\nimport { convertToMermaid } from \"../utils/export-mermaid\";\nimport { copyToClipboard } from \"../utils/clipboard\";\n\ninterface MermaidViewProps {\n nodes: Node[];\n edges: Edge[];\n maxTextSize?: number;\n}\n\nconst MermaidView = ({\n nodes,\n edges,\n maxTextSize = 100000,\n}: MermaidViewProps) => {\n const [copySuccess, setCopySuccess] = useState(false);\n const [mermaidCode, setMermaidCode] = useState(\"\");\n const [previewSvg, setPreviewSvg] = useState<string | null>(null);\n const [previewError, setPreviewError] = useState<string | null>(null);\n const [isRendering, setIsRendering] = useState(true);\n const containerRef = useRef<HTMLDivElement>(null);\n const svgContainerRef = useRef<HTMLDivElement>(null);\n const panZoomInstanceRef = useRef<any>(null);\n\n // Generate mermaid code\n useEffect(() => {\n const code = convertToMermaid(nodes, edges, {\n includeStyles: true,\n direction: \"LR\",\n });\n setMermaidCode(code);\n }, [nodes, edges]);\n\n // Render mermaid preview\n useEffect(() => {\n if (!mermaidCode) return;\n\n let cancelled = false;\n setIsRendering(true);\n setPreviewError(null);\n\n const renderMermaid = async () => {\n try {\n const { default: mermaid } = await import(\"mermaid\");\n\n // Detect current theme\n const isDarkMode =\n document.documentElement.getAttribute(\"data-theme\") === \"dark\";\n const currentTheme = isDarkMode ? \"dark\" : \"default\";\n\n mermaid.initialize({\n maxTextSize: maxTextSize,\n startOnLoad: false,\n theme: currentTheme,\n flowchart: {\n curve: \"basis\",\n padding: 20,\n },\n securityLevel: \"loose\",\n });\n\n const id = \"mermaid-view-\" + Math.random().toString(36).substring(2, 9);\n const { svg } = await mermaid.render(id, mermaidCode);\n\n if (!cancelled) {\n setPreviewSvg(svg);\n setPreviewError(null);\n }\n } catch (error) {\n if (!cancelled) {\n console.error(\"Mermaid render error:\", error);\n setPreviewError(\n error instanceof Error ? error.message : \"Failed to render diagram\",\n );\n setPreviewSvg(null);\n }\n } finally {\n if (!cancelled) {\n setIsRendering(false);\n }\n }\n };\n\n renderMermaid();\n\n return () => {\n cancelled = true;\n };\n }, [mermaidCode]);\n\n // Initialize pan/zoom after SVG is rendered\n useEffect(() => {\n if (!previewSvg || !svgContainerRef.current) return;\n\n const initZoom = async () => {\n const svgElement = svgContainerRef.current?.querySelector(\"svg\");\n if (!svgElement) return;\n\n try {\n const { default: svgPanZoom } = await import(\"svg-pan-zoom\");\n\n // Set SVG to fill container\n svgElement.style.width = \"100%\";\n svgElement.style.height = \"100%\";\n svgElement.removeAttribute(\"height\");\n svgElement.removeAttribute(\"width\");\n\n const instance = svgPanZoom(svgElement, {\n zoomEnabled: true,\n controlIconsEnabled: false,\n fit: true,\n center: true,\n minZoom: 0.1,\n maxZoom: 10,\n zoomScaleSensitivity: 0.15,\n dblClickZoomEnabled: true,\n mouseWheelZoomEnabled: true,\n panEnabled: true,\n });\n\n panZoomInstanceRef.current = instance;\n } catch (e) {\n console.warn(\"Failed to initialize zoom:\", e);\n }\n };\n\n initZoom();\n\n return () => {\n if (panZoomInstanceRef.current) {\n try {\n panZoomInstanceRef.current.destroy();\n } catch (e) {\n // Ignore\n }\n panZoomInstanceRef.current = null;\n }\n };\n }, [previewSvg]);\n\n const handleCopyToClipboard = useCallback(async () => {\n await copyToClipboard(mermaidCode);\n setCopySuccess(true);\n setTimeout(() => setCopySuccess(false), 2000);\n }, [mermaidCode]);\n\n return (\n <div\n ref={containerRef}\n className=\"absolute inset-0 bg-[rgb(var(--ec-page-bg))]\"\n style={{ animation: \"fadeIn 200ms ease-out\" }}\n >\n <style>{`\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n `}</style>\n\n {/* Copy button - top right */}\n <div className=\"absolute top-[10px] right-4 z-20\">\n <div className=\"relative group\">\n <button\n onClick={handleCopyToClipboard}\n className={`p-2.5 rounded-md shadow-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-[rgb(var(--ec-accent))] transition-all duration-150 ${\n copySuccess\n ? \"bg-green-500 text-white scale-110\"\n : \"bg-[rgb(var(--ec-card-bg))] hover:bg-[rgb(var(--ec-page-border))/0.5] text-[rgb(var(--ec-icon-color))] hover:scale-105\"\n }`}\n aria-label={copySuccess ? \"Copied!\" : \"Copy Mermaid code\"}\n >\n {copySuccess ? (\n <CheckIcon className=\"h-5 w-5\" />\n ) : (\n <ClipboardIcon className=\"h-5 w-5\" />\n )}\n </button>\n <div className=\"absolute top-full right-0 mt-2 px-2 py-1 bg-[rgb(var(--ec-page-text))] text-[rgb(var(--ec-page-bg))] text-xs rounded shadow-lg opacity-0 group-hover:opacity-100 transition-opacity whitespace-nowrap pointer-events-none z-50\">\n {copySuccess ? \"Copied!\" : \"Copy Mermaid code\"}\n </div>\n </div>\n </div>\n\n {/* Mermaid diagram container */}\n <div className=\"absolute inset-0 overflow-hidden\">\n {isRendering && (\n <div className=\"w-full h-full flex items-center justify-center\">\n <div className=\"relative\">\n <div className=\"flex items-center gap-4 opacity-40\">\n <div className=\"w-24 h-10 bg-[rgb(var(--ec-page-border))] rounded animate-pulse\" />\n <div className=\"w-12 h-0.5 bg-[rgb(var(--ec-page-border))] animate-pulse\" />\n <div\n className=\"w-20 h-10 bg-[rgb(var(--ec-page-border))] rounded-full animate-pulse\"\n style={{ animationDelay: \"75ms\" }}\n />\n <div\n className=\"w-12 h-0.5 bg-[rgb(var(--ec-page-border))] animate-pulse\"\n style={{ animationDelay: \"150ms\" }}\n />\n <div\n className=\"w-24 h-10 bg-[rgb(var(--ec-page-border))] rounded animate-pulse\"\n style={{ animationDelay: \"225ms\" }}\n />\n </div>\n <p className=\"text-center text-sm text-[rgb(var(--ec-page-text-muted))] mt-4\">\n Rendering diagram...\n </p>\n </div>\n </div>\n )}\n\n {previewError && !isRendering && (\n <div className=\"w-full h-full flex flex-col items-center justify-center p-4\">\n <div className=\"text-red-500 text-sm mb-2\">\n Failed to render diagram\n </div>\n <div className=\"text-[rgb(var(--ec-page-text-muted))] text-xs font-mono bg-[rgb(var(--ec-code-bg))] p-2 rounded max-w-lg overflow-auto\">\n {previewError}\n </div>\n <div className=\"mt-4 text-sm text-[rgb(var(--ec-page-text-muted))]\">\n <p>You can still copy the Mermaid code and paste it into</p>\n <a\n href=\"https://mermaid.live\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-[rgb(var(--ec-accent))] hover:underline\"\n >\n mermaid.live\n </a>\n </div>\n </div>\n )}\n\n {previewSvg && !isRendering && !previewError && (\n <div\n ref={svgContainerRef}\n className=\"w-full h-full cursor-grab active:cursor-grabbing [&_svg]:w-full [&_svg]:h-full\"\n dangerouslySetInnerHTML={{ __html: previewSvg }}\n />\n )}\n </div>\n\n {/* Footer hint */}\n <div className=\"absolute bottom-4 left-4 z-20\">\n <div className=\"flex items-center gap-2 bg-[rgb(var(--ec-card-bg))]/90 backdrop-blur-sm px-3 py-1.5 rounded-md shadow-sm border border-[rgb(var(--ec-page-border))]\">\n <svg\n className=\"w-3.5 h-3.5 text-[rgb(var(--ec-icon-color))]\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 15l-2 5L9 9l11 4-5 2zm0 0l5 5M7.188 2.239l.777 2.897M5.136 7.965l-2.898-.777M13.95 4.05l-2.122 2.122m-5.657 5.656l-2.12 2.122\"\n />\n </svg>\n <span className=\"text-xs text-[rgb(var(--ec-page-text-muted))]\">\n Scroll to zoom · Drag to pan\n </span>\n </div>\n </div>\n </div>\n );\n};\n\nexport default MermaidView;\n","import type { Node, Edge } from \"@xyflow/react\";\n\n/**\n * Mermaid Export Utility\n * Converts React Flow nodes and edges to Mermaid flowchart syntax\n */\n\nexport interface MermaidExportOptions {\n /** Include class definitions for styling */\n includeStyles?: boolean;\n /** Direction of the flowchart: LR (left-right), TB (top-bottom), etc. */\n direction?: \"LR\" | \"TB\" | \"RL\" | \"BT\";\n}\n\n/**\n * Mapping of node types to their Mermaid shape syntax\n * Format: [prefix, suffix]\n */\nconst NODE_SHAPE_MAP: Record<string, [string, string]> = {\n services: [\"[[\", \"]]\"], // stadium shape\n service: [\"[[\", \"]]\"],\n events: [\">\", \"]\"], // flag/asymmetric shape (message-like)\n event: [\">\", \"]\"],\n commands: [\">\", \"]\"], // flag/asymmetric shape (message-like)\n command: [\">\", \"]\"],\n queries: [\"{{\", \"}}\"], // hexagon\n query: [\"{{\", \"}}\"],\n channels: [\"[(\", \")]\"], // cylinder\n channel: [\"[(\", \")]\"],\n domains: [\"[\", \"]\"], // rectangle\n domain: [\"[\", \"]\"],\n flows: [\"([\", \"])\"], // stadium (rounded)\n flow: [\"([\", \"])\"],\n step: [\"[\", \"]\"], // rectangle\n user: [\"((\", \"))\"], // circle\n actor: [\"((\", \"))\"], // circle\n externalSystem: [\"[[\", \"]]\"], // stadium\n \"external-system\": [\"[[\", \"]]\"],\n data: [\"[(\", \")]\"], // cylinder (database)\n \"data-product\": [\"[[\", \"]]\"], // stadium\n \"data-products\": [\"[[\", \"]]\"],\n entities: [\"[\", \"]\"], // rectangle\n entity: [\"[\", \"]\"],\n custom: [\"[\", \"]\"], // rectangle\n view: [\"[\", \"]\"], // rectangle\n note: [\"[\", \"]\"], // rectangle\n};\n\n/**\n * Mermaid class definitions for styling different node types\n */\nconst NODE_STYLE_CLASSES: Record<string, string> = {\n services: \"fill:#ec4899,stroke:#be185d,color:#fff\",\n service: \"fill:#ec4899,stroke:#be185d,color:#fff\",\n events: \"fill:#f97316,stroke:#c2410c,color:#fff\",\n event: \"fill:#f97316,stroke:#c2410c,color:#fff\",\n commands: \"fill:#3b82f6,stroke:#1d4ed8,color:#fff\",\n command: \"fill:#3b82f6,stroke:#1d4ed8,color:#fff\",\n queries: \"fill:#22c55e,stroke:#15803d,color:#fff\",\n query: \"fill:#22c55e,stroke:#15803d,color:#fff\",\n channels: \"fill:#6b7280,stroke:#374151,color:#fff\",\n channel: \"fill:#6b7280,stroke:#374151,color:#fff\",\n domains: \"fill:#eab308,stroke:#a16207,color:#000\",\n domain: \"fill:#eab308,stroke:#a16207,color:#000\",\n flows: \"fill:#14b8a6,stroke:#0f766e,color:#fff\",\n flow: \"fill:#14b8a6,stroke:#0f766e,color:#fff\",\n step: \"fill:#374151,stroke:#1f2937,color:#fff\",\n user: \"fill:#8b5cf6,stroke:#6d28d9,color:#fff\",\n actor: \"fill:#eab308,stroke:#a16207,color:#000\",\n externalSystem: \"fill:#ec4899,stroke:#be185d,color:#fff\",\n \"external-system\": \"fill:#ec4899,stroke:#be185d,color:#fff\",\n data: \"fill:#3b82f6,stroke:#1d4ed8,color:#fff\",\n \"data-product\": \"fill:#6366f1,stroke:#4338ca,color:#fff\",\n \"data-products\": \"fill:#6366f1,stroke:#4338ca,color:#fff\",\n entities: \"fill:#6b7280,stroke:#374151,color:#fff\",\n entity: \"fill:#6b7280,stroke:#374151,color:#fff\",\n custom: \"fill:#9ca3af,stroke:#6b7280,color:#000\",\n view: \"fill:#9ca3af,stroke:#6b7280,color:#000\",\n note: \"fill:#fef3c7,stroke:#d97706,color:#000\",\n};\n\n/**\n * Sanitize a string to be a valid Mermaid node ID\n * Mermaid IDs should be alphanumeric with underscores\n */\nexport function sanitizeMermaidId(id: string): string {\n // Replace any non-alphanumeric characters (except underscores) with underscores\n // Also handle dots and hyphens which are common in version strings\n return id.replace(/[^a-zA-Z0-9_]/g, \"_\");\n}\n\n/**\n * Escape special characters in Mermaid labels\n */\nfunction escapeMermaidLabel(label: string): string {\n // Escape quotes and other special characters\n return label.replace(/\"/g, \"#quot;\").replace(/\\n/g, \"<br/>\");\n}\n\n/**\n * Get the Mermaid shape syntax for a node type\n */\nexport function getMermaidNodeShape(type: string): [string, string] {\n return NODE_SHAPE_MAP[type] || [\"[\", \"]\"];\n}\n\n/**\n * Helper to format label with version\n */\nfunction formatLabelWithVersion(name: string, version?: string): string {\n if (version) {\n return `${name} (${version})`;\n }\n return name;\n}\n\n/**\n * Extract the display label from a node based on its type and data\n * Includes version information when available\n */\nexport function getNodeLabel(node: Node): string {\n const { type, data } = node;\n\n if (!data) return node.id;\n\n // Handle different node types and their data structures\n if (type === \"services\" || type === \"service\") {\n const service = (data as any).service;\n const name = service?.name || service?.id || node.id;\n const version = service?.data?.version || service?.version;\n return formatLabelWithVersion(name, version);\n }\n\n if (\n type === \"events\" ||\n type === \"event\" ||\n type === \"commands\" ||\n type === \"command\" ||\n type === \"queries\" ||\n type === \"query\"\n ) {\n const message = (data as any).message;\n const name = message?.name || message?.id || node.id;\n const version = message?.data?.version || message?.version;\n return formatLabelWithVersion(name, version);\n }\n\n if (type === \"channels\" || type === \"channel\") {\n const channel = (data as any).channel;\n const name = channel?.name || channel?.id || node.id;\n const version = channel?.data?.version || channel?.version;\n return formatLabelWithVersion(name, version);\n }\n\n if (type === \"domains\" || type === \"domain\") {\n const domain = (data as any).domain;\n // Domain data can be nested in .data\n const domainData = domain?.data || domain;\n const name = domainData?.name || domainData?.id || node.id;\n const version = domainData?.version || domain?.version;\n return formatLabelWithVersion(name, version);\n }\n\n if (type === \"flows\" || type === \"flow\") {\n const flow = (data as any).flow;\n const name = flow?.name || flow?.id || node.id;\n const version = flow?.data?.version || flow?.version;\n return formatLabelWithVersion(name, version);\n }\n\n if (type === \"step\") {\n const step = (data as any).step;\n return step?.title || step?.name || step?.id || node.id;\n }\n\n if (type === \"user\" || type === \"actor\") {\n return (\n (data as any).name || (data as any).label || (data as any).id || node.id\n );\n }\n\n if (type === \"externalSystem\" || type === \"external-system\") {\n const system = (data as any).externalSystem || data;\n return system?.name || system?.id || node.id;\n }\n\n if (type === \"data\") {\n const dataNode = (data as any).data;\n return dataNode?.name || dataNode?.id || node.id;\n }\n\n if (type === \"data-product\" || type === \"data-products\") {\n const dataProduct = (data as any).dataProduct;\n const name = dataProduct?.name || dataProduct?.id || node.id;\n const version = dataProduct?.data?.version || dataProduct?.version;\n return formatLabelWithVersion(name, version);\n }\n\n if (type === \"entities\" || type === \"entity\") {\n const entity = (data as any).entity;\n return entity?.name || entity?.id || node.id;\n }\n\n if (type === \"note\") {\n return (data as any).text || (data as any).label || \"Note\";\n }\n\n // Fallback: try common data patterns\n return (\n (data as any).name ||\n (data as any).label ||\n (data as any).title ||\n (data as any).id ||\n node.id\n );\n}\n\n/**\n * Extract label from an edge\n */\nfunction getEdgeLabel(edge: Edge): string | undefined {\n if (edge.label && typeof edge.label === \"string\") {\n return edge.label;\n }\n if (edge.data?.label && typeof edge.data.label === \"string\") {\n return edge.data.label;\n }\n return undefined;\n}\n\n/**\n * Convert React Flow nodes and edges to Mermaid flowchart syntax\n */\nexport function convertToMermaid(\n nodes: Node[],\n edges: Edge[],\n options: MermaidExportOptions = {},\n): string {\n const { includeStyles = true, direction = \"LR\" } = options;\n\n const lines: string[] = [];\n\n // Add flowchart header\n lines.push(`flowchart ${direction}`);\n\n // Collect used node types for class definitions\n const usedTypes = new Set<string>();\n\n // Add class definitions if styles are enabled\n if (includeStyles) {\n lines.push(\"\");\n lines.push(\" %% Style definitions\");\n\n // First pass: collect all used node types\n nodes.forEach((node) => {\n if (node.type && NODE_STYLE_CLASSES[node.type]) {\n usedTypes.add(node.type);\n }\n });\n\n // Add class definitions for used types\n usedTypes.forEach((type) => {\n const style = NODE_STYLE_CLASSES[type];\n if (style) {\n lines.push(` classDef ${sanitizeMermaidId(type)} ${style}`);\n }\n });\n }\n\n // Add node definitions\n lines.push(\"\");\n lines.push(\" %% Nodes\");\n\n nodes.forEach((node) => {\n const sanitizedId = sanitizeMermaidId(node.id);\n const label = escapeMermaidLabel(getNodeLabel(node));\n const [prefix, suffix] = getMermaidNodeShape(node.type || \"custom\");\n\n let nodeLine = ` ${sanitizedId}${prefix}\"${label}\"${suffix}`;\n\n // Add class reference if styles are enabled\n if (includeStyles && node.type && usedTypes.has(node.type)) {\n nodeLine += `:::${sanitizeMermaidId(node.type)}`;\n }\n\n lines.push(nodeLine);\n });\n\n // Add edge definitions\n lines.push(\"\");\n lines.push(\" %% Edges\");\n\n edges.forEach((edge) => {\n const sourceId = sanitizeMermaidId(edge.source);\n const targetId = sanitizeMermaidId(edge.target);\n const label = getEdgeLabel(edge);\n\n let edgeLine: string;\n if (label) {\n // Clean up multi-line labels\n const cleanLabel = label.replace(/\\n/g, \" \").trim();\n edgeLine = ` ${sourceId} -->|\"${escapeMermaidLabel(cleanLabel)}\"| ${targetId}`;\n } else {\n edgeLine = ` ${sourceId} --> ${targetId}`;\n }\n\n lines.push(edgeLine);\n });\n\n return lines.join(\"\\n\");\n}\n","/**\n * Utility to copy text to clipboard\n */\nexport async function copyToClipboard(text: string): Promise<boolean> {\n try {\n if (navigator?.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n return true;\n }\n // Fallback for older browsers\n const textArea = document.createElement(\"textarea\");\n textArea.value = text;\n textArea.style.position = \"fixed\";\n textArea.style.left = \"-999999px\";\n document.body.appendChild(textArea);\n textArea.select();\n const success = document.execCommand(\"copy\");\n document.body.removeChild(textArea);\n return success;\n } catch (error) {\n console.error(\"Failed to copy to clipboard:\", error);\n return false;\n }\n}\n","import React, { type RefObject, useState } from \"react\";\nimport * as DropdownMenu from \"@radix-ui/react-dropdown-menu\";\nimport {\n Code,\n Share2,\n Search,\n Grid3x3,\n Maximize2,\n Map,\n Sparkles,\n Zap,\n EyeOff,\n ExternalLink,\n Save,\n RotateCcw,\n Loader2,\n} from \"lucide-react\";\nimport {\n DocumentArrowDownIcon,\n PresentationChartLineIcon,\n} from \"@heroicons/react/24/outline\";\nimport type { VisualiserSearchRef } from \"./VisualiserSearch\";\n\ninterface VisualizerDropdownContentProps {\n isMermaidView: boolean;\n setIsMermaidView: (value: boolean) => void;\n animateMessages: boolean;\n toggleAnimateMessages: () => void;\n hideChannels: boolean;\n toggleChannelsVisibility: () => void;\n hasChannels: boolean;\n showMinimap: boolean;\n setShowMinimap: (value: boolean) => void;\n handleFitView: () => void;\n searchRef: RefObject<VisualiserSearchRef | null>;\n isChatEnabled: boolean;\n openChat: () => void;\n handleCopyArchitectureCode: () => void;\n handleExportVisual: () => void;\n setIsShareModalOpen: (value: boolean) => void;\n toggleFullScreen: () => void;\n openStudioModal: () => void;\n isDevMode?: boolean;\n onSaveLayout?: () => Promise<boolean>;\n onResetLayout?: () => Promise<boolean>;\n}\n\nconst VisualizerDropdownContent: React.FC<VisualizerDropdownContentProps> = ({\n isMermaidView,\n setIsMermaidView,\n animateMessages,\n toggleAnimateMessages,\n hideChannels,\n toggleChannelsVisibility,\n hasChannels,\n showMinimap,\n setShowMinimap,\n handleFitView,\n searchRef,\n isChatEnabled,\n openChat,\n handleCopyArchitectureCode,\n handleExportVisual,\n setIsShareModalOpen,\n toggleFullScreen,\n openStudioModal,\n isDevMode = false,\n onSaveLayout,\n onResetLayout,\n}) => {\n const [layoutStatus, setLayoutStatus] = useState<\n \"idle\" | \"saving\" | \"resetting\"\n >(\"idle\");\n\n const handleSaveLayout = async () => {\n if (!onSaveLayout) return;\n setLayoutStatus(\"saving\");\n await onSaveLayout();\n setLayoutStatus(\"idle\");\n };\n\n const handleResetLayout = async () => {\n if (!onResetLayout) return;\n if (\n !window.confirm(\n \"Reset layout to auto-positioning? This will delete your saved layout.\",\n )\n ) {\n return;\n }\n setLayoutStatus(\"resetting\");\n const success = await onResetLayout();\n if (success) {\n window.location.reload();\n } else {\n setLayoutStatus(\"idle\");\n }\n };\n\n return (\n <>\n {/* Canvas Settings Submenu */}\n <DropdownMenu.Sub>\n <DropdownMenu.SubTrigger className=\"flex items-center px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer transition-colors gap-2 outline-none\">\n <Grid3x3 className=\"w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0\" />\n <span className=\"flex-1 font-normal\">Canvas</span>\n <svg\n className=\"w-3 h-3 text-[rgb(var(--ec-page-text-muted))]\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </DropdownMenu.SubTrigger>\n <DropdownMenu.Portal>\n <DropdownMenu.SubContent\n className=\"min-w-[200px] bg-[rgb(var(--ec-card-bg))] rounded-lg shadow-xl border border-[rgb(var(--ec-page-border))] py-1.5 z-[60]\"\n sideOffset={8}\n alignOffset={-8}\n >\n <DropdownMenu.CheckboxItem\n checked={isMermaidView}\n onCheckedChange={setIsMermaidView}\n className=\"flex items-center px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer transition-colors gap-2\"\n >\n <Code className=\"w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0\" />\n <span className=\"flex-1 font-normal\">Render as mermaid</span>\n <div\n className={`w-7 h-4 rounded-full transition-all duration-200 flex-shrink-0 relative ${isMermaidView ? \"bg-[rgb(var(--ec-accent))]\" : \"bg-[rgb(var(--ec-page-border))]\"}`}\n >\n <div\n className={`absolute top-0.5 w-3 h-3 rounded-full bg-white shadow-sm transition-all duration-200 ${isMermaidView ? \"left-3.5\" : \"left-0.5\"}`}\n />\n </div>\n </DropdownMenu.CheckboxItem>\n\n <DropdownMenu.Separator className=\"my-1 h-px bg-[rgb(var(--ec-page-border))]\" />\n\n <DropdownMenu.CheckboxItem\n checked={animateMessages}\n onCheckedChange={toggleAnimateMessages}\n className=\"flex items-center px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer transition-colors gap-2\"\n >\n <Zap className=\"w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0\" />\n <span className=\"flex-1 font-normal\">Simulate Messages</span>\n <div\n className={`w-7 h-4 rounded-full transition-all duration-200 flex-shrink-0 relative ${animateMessages ? \"bg-[rgb(var(--ec-accent))]\" : \"bg-[rgb(var(--ec-page-border))]\"}`}\n >\n <div\n className={`absolute top-0.5 w-3 h-3 rounded-full bg-white shadow-sm transition-all duration-200 ${animateMessages ? \"left-3.5\" : \"left-0.5\"}`}\n />\n </div>\n </DropdownMenu.CheckboxItem>\n\n {hasChannels && (\n <DropdownMenu.CheckboxItem\n checked={hideChannels}\n onCheckedChange={toggleChannelsVisibility}\n className=\"flex items-center px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer transition-colors gap-2\"\n >\n <EyeOff className=\"w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0\" />\n <span className=\"flex-1 font-normal\">Hide channels</span>\n <div\n className={`w-7 h-4 rounded-full transition-all duration-200 flex-shrink-0 relative ${hideChannels ? \"bg-[rgb(var(--ec-accent))]\" : \"bg-[rgb(var(--ec-page-border))]\"}`}\n >\n <div\n className={`absolute top-0.5 w-3 h-3 rounded-full bg-white shadow-sm transition-all duration-200 ${hideChannels ? \"left-3.5\" : \"left-0.5\"}`}\n />\n </div>\n </DropdownMenu.CheckboxItem>\n )}\n\n <DropdownMenu.CheckboxItem\n checked={showMinimap}\n onCheckedChange={setShowMinimap}\n className=\"flex items-center px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer transition-colors gap-2\"\n >\n <Map className=\"w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0\" />\n <span className=\"flex-1 font-normal\">Show minimap</span>\n <div\n className={`w-7 h-4 rounded-full transition-all duration-200 flex-shrink-0 relative ${showMinimap ? \"bg-[rgb(var(--ec-accent))]\" : \"bg-[rgb(var(--ec-page-border))]\"}`}\n >\n <div\n className={`absolute top-0.5 w-3 h-3 rounded-full bg-white shadow-sm transition-all duration-200 ${showMinimap ? \"left-3.5\" : \"left-0.5\"}`}\n />\n </div>\n </DropdownMenu.CheckboxItem>\n\n <DropdownMenu.Separator className=\"my-1 h-px bg-[rgb(var(--ec-page-border))]\" />\n\n <DropdownMenu.Item\n onClick={handleFitView}\n className=\"px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer flex items-center gap-2 transition-colors\"\n >\n <Maximize2 className=\"w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0\" />\n <span className=\"flex-1 font-normal\">Fit to view</span>\n </DropdownMenu.Item>\n\n <DropdownMenu.Item\n onClick={() => {\n searchRef.current?.hideSuggestions();\n setTimeout(() => {\n const searchInput = document.querySelector(\n 'input[placeholder=\"Search nodes...\"]',\n ) as HTMLInputElement;\n searchInput?.focus();\n }, 50);\n }}\n className=\"px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer flex items-center gap-2 transition-colors\"\n >\n <Search className=\"w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0\" />\n <span className=\"flex-1 font-normal\">Find on canvas</span>\n </DropdownMenu.Item>\n </DropdownMenu.SubContent>\n </DropdownMenu.Portal>\n </DropdownMenu.Sub>\n\n {/* Dev Mode: Layout Submenu */}\n {isDevMode && onSaveLayout && (\n <DropdownMenu.Sub>\n <DropdownMenu.SubTrigger className=\"flex items-center px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer transition-colors gap-2 outline-none\">\n <Save className=\"w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0\" />\n <span className=\"flex-1 font-normal\">Layout</span>\n <span className=\"text-[10px] text-amber-600 font-medium\">DEV</span>\n <svg\n className=\"w-3 h-3 text-[rgb(var(--ec-page-text-muted))]\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </DropdownMenu.SubTrigger>\n <DropdownMenu.Portal>\n <DropdownMenu.SubContent\n className=\"min-w-[180px] bg-[rgb(var(--ec-card-bg))] rounded-lg shadow-xl border border-[rgb(var(--ec-page-border))] py-1.5 z-[60]\"\n sideOffset={8}\n alignOffset={-8}\n >\n <DropdownMenu.Item\n onClick={handleSaveLayout}\n disabled={layoutStatus !== \"idle\"}\n className=\"px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer flex items-center gap-2 transition-colors disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n {layoutStatus === \"saving\" ? (\n <Loader2 className=\"w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0 animate-spin\" />\n ) : (\n <Save className=\"w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0\" />\n )}\n <span className=\"flex-1 font-normal\">\n {layoutStatus === \"saving\" ? \"Saving...\" : \"Save Layout\"}\n </span>\n </DropdownMenu.Item>\n <DropdownMenu.Item\n onClick={handleResetLayout}\n disabled={layoutStatus !== \"idle\"}\n className=\"px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer flex items-center gap-2 transition-colors disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n {layoutStatus === \"resetting\" ? (\n <Loader2 className=\"w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0 animate-spin\" />\n ) : (\n <RotateCcw className=\"w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0\" />\n )}\n <span className=\"flex-1 font-normal\">\n {layoutStatus === \"resetting\"\n ? \"Resetting...\"\n : \"Reset Layout\"}\n </span>\n </DropdownMenu.Item>\n </DropdownMenu.SubContent>\n </DropdownMenu.Portal>\n </DropdownMenu.Sub>\n )}\n\n {/* Ask AI */}\n {isChatEnabled && (\n <>\n <DropdownMenu.Separator className=\"my-1 h-px bg-[rgb(var(--ec-page-border))]\" />\n <DropdownMenu.Item\n onClick={openChat}\n className=\"px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer flex items-center gap-2 transition-colors\"\n >\n <Sparkles className=\"w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0\" />\n <span className=\"flex-1 font-normal\">Ask a question</span>\n </DropdownMenu.Item>\n </>\n )}\n\n {/* Export Items */}\n <DropdownMenu.Separator className=\"my-1 h-px bg-[rgb(var(--ec-page-border))]\" />\n <DropdownMenu.Item\n onClick={handleCopyArchitectureCode}\n className=\"px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer flex items-center gap-2 transition-colors\"\n >\n <Code className=\"w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0\" />\n <span className=\"flex-1 font-normal\">Copy as mermaid</span>\n </DropdownMenu.Item>\n\n <DropdownMenu.Item\n onClick={handleExportVisual}\n className=\"px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer flex items-center gap-2 transition-colors\"\n >\n <DocumentArrowDownIcon className=\"w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0\" />\n <span className=\"flex-1 font-normal\">Export image</span>\n </DropdownMenu.Item>\n\n {/* Share Link */}\n <DropdownMenu.Item\n onClick={() => setIsShareModalOpen(true)}\n className=\"px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer flex items-center gap-2 transition-colors\"\n >\n <Share2 className=\"w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0\" />\n <span className=\"flex-1 font-normal\">Share Link</span>\n </DropdownMenu.Item>\n\n {/* Start Presentation */}\n <DropdownMenu.Separator className=\"my-1 h-px bg-[rgb(var(--ec-page-border))]\" />\n <DropdownMenu.Item\n onClick={toggleFullScreen}\n className=\"px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer flex items-center gap-2 transition-colors\"\n >\n <PresentationChartLineIcon className=\"w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0\" />\n <span className=\"flex-1 font-normal\">Start Presentation</span>\n </DropdownMenu.Item>\n\n {/* Open in EventCatalog Studio */}\n <DropdownMenu.Separator className=\"my-1 h-px bg-[rgb(var(--ec-page-border))]\" />\n <DropdownMenu.Item\n onClick={openStudioModal}\n className=\"px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer flex items-center gap-2 transition-colors\"\n >\n <ExternalLink className=\"w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0\" />\n <span className=\"flex-1 font-normal\">Open in EventCatalog Studio</span>\n </DropdownMenu.Item>\n </>\n );\n};\n\nexport default VisualizerDropdownContent;\n","import * as ContextMenu from \"@radix-ui/react-context-menu\";\nimport type { ContextMenuItem } from \"../types\";\n\ninterface NodeContextMenuProps {\n items: ContextMenuItem[];\n children: React.ReactNode;\n}\n\nexport default function NodeContextMenu({\n items,\n children,\n}: NodeContextMenuProps) {\n if (!items || items.length === 0) return <>{children}</>;\n\n return (\n <ContextMenu.Root>\n <ContextMenu.Trigger>{children}</ContextMenu.Trigger>\n <ContextMenu.Portal>\n <ContextMenu.Content\n className=\"min-w-[220px] bg-white rounded-md p-1 shadow-md border border-gray-200 z-50\"\n onClick={(e) => e.stopPropagation()}\n >\n {items.map((item, index) => (\n <div key={index}>\n {item.separator && index > 0 && (\n <ContextMenu.Separator className=\"h-[1px] bg-gray-200 m-1\" />\n )}\n <ContextMenu.Item\n asChild\n className=\"text-sm px-2 py-1.5 outline-none cursor-pointer hover:bg-orange-100 rounded-sm flex items-center\"\n >\n <a\n href={item.href}\n {...(item.download ? { download: item.download } : {})}\n {...(item.external\n ? { target: \"_blank\", rel: \"noopener noreferrer\" }\n : {})}\n >\n {item.label}\n </a>\n </ContextMenu.Item>\n </div>\n ))}\n </ContextMenu.Content>\n </ContextMenu.Portal>\n </ContextMenu.Root>\n );\n}\n","/**\n * Node components for EventCatalog Visualizer\n */\n\n// Studio-2 nodes (organized in directories) - import for nodeComponents\nimport { Event, eventConfig } from \"./event\";\nimport { Command } from \"./command\";\nimport { Query } from \"./query\";\nimport { Service } from \"./service\";\nimport { Channel } from \"./channel\";\nimport { Note } from \"./note\";\nimport { Data, dataNodeConfig } from \"./data\";\nimport { View } from \"./view\";\nimport { Actor, actorConfig } from \"./actor\";\nimport { ExternalSystem, externalSystemConfig } from \"./external-system\";\n\n// Re-export studio-2 nodes\nexport { Event, eventConfig };\nexport type { EventNode } from \"./event\";\n\nexport { Command };\nexport type { CommandNode } from \"./command\";\n\nexport { Query };\nexport type { QueryNode } from \"./query\";\n\nexport { Service };\nexport type { ServiceNode } from \"./service\";\n\nexport { Channel };\nexport type { ChannelNode } from \"./channel\";\n\nexport { Note };\nexport type { NoteNode } from \"./note\";\n\nexport { Data, dataNodeConfig };\nexport type { DataNode } from \"./data\";\n\nexport { View };\nexport type { ViewNode } from \"./view\";\n\nexport { Actor, actorConfig };\nexport type { ActorNode } from \"./actor\";\n\nexport { ExternalSystem, externalSystemConfig };\nexport type { ExternalSystemNode } from \"./external-system\";\n\n// Core nodes (single files) - import then re-export for nodeComponents\nimport CustomNode from \"./Custom\";\nimport DomainNode from \"./Domain\";\nimport EntityNode from \"./Entity\";\nimport FlowNode from \"./Flow\";\nimport StepNode from \"./Step\";\nimport UserNode from \"./User\";\nimport DataProductNode from \"./DataProduct\";\nimport ExternalSystem2Node from \"./ExternalSystem2\";\n\nexport {\n CustomNode,\n DomainNode,\n EntityNode,\n FlowNode,\n StepNode,\n UserNode,\n DataProductNode,\n ExternalSystem2Node,\n};\n\n// Node type constants\nexport {\n SERVICE,\n EVENT,\n QUERY,\n COMMAND,\n CHANNEL,\n ACTOR,\n MESSAGE,\n DATA,\n VIEW,\n} from \"./node-types\";\n\n// Re-export for convenience (studio-2 nodes only)\nexport const nodeComponents = {\n event: Event,\n command: Command,\n query: Query,\n service: Service,\n channel: Channel,\n note: Note,\n externalSystem: ExternalSystem,\n data: Data,\n view: View,\n actor: Actor,\n // Core nodes are available via individual imports\n custom: CustomNode,\n domain: DomainNode,\n entity: EntityNode,\n flow: FlowNode,\n step: StepNode,\n user: UserNode,\n dataProduct: DataProductNode,\n externalSystem2: ExternalSystem2Node,\n};\n\nexport const nodeConfigs = {\n event: eventConfig,\n data: dataNodeConfig,\n actor: actorConfig,\n externalSystem: externalSystemConfig,\n};\n","/**\n * Edge components for EventCatalog Visualizer\n */\n\n// Import for edgeTypes object\nimport AnimatedMessageEdge from \"./AnimatedMessageEdge\";\nimport FlowEdge from \"./FlowEdge\";\nimport MultilineEdgeLabel from \"./MultilineEdgeLabel\";\n\n// Re-export\nexport { AnimatedMessageEdge, FlowEdge, MultilineEdgeLabel };\n\n// Re-export for convenience\nexport const edgeTypes = {\n animated: AnimatedMessageEdge,\n \"flow-edge\": FlowEdge,\n multiline: MultilineEdgeLabel,\n};\n","// Can't use the CollectionEntry type from astro:content because a client component is using this util\n\nimport { MarkerType, Position, type Edge, type Node } from \"@xyflow/react\";\nimport dagre from \"dagre\";\n// import { getItemsFromCollectionByIdAndSemverOrLatest } from \"@utils/collections/util\"; // Not used in visualizer\ninterface BaseCollectionData {\n id: string;\n version: string;\n}\n\ninterface CollectionItem {\n collection: string;\n data: BaseCollectionData;\n}\n\ninterface MessageCollectionItem extends CollectionItem {\n collection: \"commands\" | \"events\" | \"queries\";\n}\n\nexport const generateIdForNode = (node: CollectionItem) => {\n return `${node.data.id}-${node.data.version}`;\n};\nexport const generateIdForNodes = (nodes: any) => {\n return nodes\n .map((node: any) => `${node.data.id}-${node.data.version}`)\n .join(\"-\");\n};\nexport const generatedIdForEdge = (\n source: CollectionItem,\n target: CollectionItem,\n) => {\n return `${source.data.id}-${source.data.version}-${target.data.id}-${target.data.version}`;\n};\n\nexport const getColorFromString = (id: string) => {\n // Takes the given id (string) and returns a custom hex color based on the id\n // Create a hash from the string\n let hash = 0;\n for (let i = 0; i < id.length; i++) {\n hash = id.charCodeAt(i) + ((hash << 5) - hash);\n }\n\n // Convert the hash into a hex color\n let color = \"#\";\n for (let i = 0; i < 3; i++) {\n const value = (hash >> (i * 8)) & 0xff;\n color += value.toString(16).padStart(2, \"0\");\n }\n\n return color;\n};\n\nexport const getEdgeLabelForServiceAsTarget = (data: MessageCollectionItem) => {\n const type = data.collection;\n switch (type) {\n case \"commands\":\n return \"invokes\";\n case \"events\":\n return \"publishes \\nevent\";\n case \"queries\":\n return \"requests\";\n default:\n return \"sends to\";\n }\n};\nexport const getEdgeLabelForMessageAsSource = (\n data: MessageCollectionItem,\n throughChannel = false,\n) => {\n const type = data.collection;\n switch (type) {\n case \"commands\":\n return \"accepts\";\n case \"events\":\n return throughChannel ? \"subscribed to\" : \"subscribed by\";\n case \"queries\":\n return \"accepts\";\n default:\n return \"sends to\";\n }\n};\n\nexport const calculatedNodes = (flow: dagre.graphlib.Graph, nodes: Node[]) => {\n return nodes.map((node: any) => {\n const { x, y } = flow.node(node.id);\n return { ...node, position: { x, y } };\n });\n};\n\n// Creates a new dagre graph\nexport const createDagreGraph = ({\n ranksep = 180,\n nodesep = 50,\n ...rest\n}: any) => {\n const graph = new dagre.graphlib.Graph({ compound: true });\n graph.setGraph({ rankdir: \"LR\", ranksep, nodesep, ...rest });\n graph.setDefaultEdgeLabel(() => ({}));\n return graph;\n};\n\nexport const createEdge = (edgeOptions: Edge): Edge => {\n return {\n label: \"subscribed by\",\n animated: false,\n // markerStart: {\n // type: MarkerType.Arrow,\n // width: 40,\n // height: 40,\n // },\n markerEnd: {\n type: MarkerType.ArrowClosed,\n width: 40,\n height: 40,\n },\n style: {\n strokeWidth: 1,\n },\n ...edgeOptions,\n };\n};\n\nexport const createNode = (values: Node): Node => {\n return {\n sourcePosition: Position.Right,\n targetPosition: Position.Left,\n ...values,\n };\n};\n\ntype DagreGraph = any;\n\nexport const getNodesAndEdgesFromDagre = ({\n nodes,\n edges,\n defaultFlow,\n}: {\n nodes: Node[];\n edges: Edge[];\n defaultFlow?: DagreGraph;\n}) => {\n const flow = defaultFlow || createDagreGraph({ ranksep: 300, nodesep: 50 });\n\n nodes.forEach((node: any) => {\n flow.setNode(node.id, { width: 150, height: 100 });\n });\n\n edges.forEach((edge: any) => {\n flow.setEdge(edge.source, edge.target);\n });\n\n // Render the diagram in memory getting hte X and Y\n dagre.layout(flow);\n\n return {\n nodes: calculatedNodes(flow, nodes),\n edges,\n };\n};\n"],"mappings":"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","names":["useEffect","useMemo","useState","useCallback","useRef","ReactFlow","Background","Controls","ReactFlowProvider","useNodesState","useEdgesState","useReactFlow","ExternalLink","CheckIcon","ClipboardIcon","DropdownMenu","Handle","Position","jsx","jsxs","classNames","Zap","Zap","Handle","Position","jsx","jsxs","classNames","Handle","Position","jsx","jsxs","classNames","Handle","Position","jsx","jsxs","classNames","Handle","Position","Handle","Position","jsx","jsxs","classNames","MarkerType","Database","config_default","Database","MarkerType","Handle","Position","jsx","jsxs","classNames","Handle","Position","jsx","jsxs","classNames","MarkerType","User","config_default","User","MarkerType","Globe","Handle","Position","jsx","jsxs","classNames","MarkerType","Globe","config_default","Globe","MarkerType","Handle","Position","jsx","jsxs","classNames","Handle","jsx","jsxs","classNames","Handle","Handle","Position","ContextMenu","useState","jsx","jsxs","classNames","Handle","Position","Handle","jsx","jsxs","classNames","Handle","jsx","jsxs","classNames","Handle","Position","ContextMenu","useState","jsx","jsxs","ServerIcon","Handle","Position","Handle","ContextMenu","jsx","jsxs","classNames","UserNode","Handle","Position","jsx","jsxs","Handle","Position","Handle","ContextMenu","Position","jsx","jsxs","classNames","Handle","Fragment","jsx","jsxs","collection","getBezierPath","Fragment","jsx","jsxs","useMemo","BaseEdge","getBezierPath","Fragment","jsx","jsxs","collection","useState","useRef","useEffect","jsx","jsxs","useState","useEffect","useCallback","Fragment","jsx","jsxs","title","description","useState","useCallback","useReactFlow","Fragment","jsx","jsxs","useState","useReactFlow","useCallback","useState","useCallback","useEffect","Dialog","useMemo","useCallback","useEffect","useState","useRef","useReactFlow","Position","ArrowRightLeft","jsx","jsxs","Position","ArrowRightLeft","Handle","Position","jsx","jsxs","jsx","jsxs","edgeTypes","useReactFlow","useState","useRef","useEffect","useCallback","useMemo","jsx","jsxs","edgeTypes","useState","useEffect","useCallback","useState","useEffect","useRef","useCallback","CheckIcon","ClipboardIcon","jsx","jsxs","useState","useRef","useEffect","useCallback","CheckIcon","ClipboardIcon","useState","Search","Map","Zap","Fragment","jsx","jsxs","ContextMenu","Fragment","jsx","jsxs","Fragment","jsx","jsxs","useMemo","UserNode","edgeTypes","useNodesState","useEdgesState","useState","useRef","useReactFlow","useEffect","useCallback","nodes","ReactFlow","Background","Controls","ExternalLink","CheckIcon","ClipboardIcon","ReactFlowProvider","UserNode","config_default","MarkerType","Position"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/NodeGraph.tsx","../src/nodes/service/ServiceNode.tsx","../src/nodes/OwnerIndicator.tsx","../src/nodes/shared-styles.ts","../src/nodes/NotesIndicator.tsx","../src/nodes/event/EventNode.tsx","../src/nodes/event/config.ts","../src/nodes/node-types.ts","../src/nodes/query/QueryNode.tsx","../src/nodes/command/CommandNode.tsx","../src/nodes/channel/ChannelNode.tsx","../src/utils/protocols.tsx","../src/nodes/data/DataNode.tsx","../src/nodes/data/config.ts","../src/nodes/view/ViewNode.tsx","../src/nodes/actor/ActorNode.tsx","../src/nodes/actor/config.ts","../src/nodes/external-system/ExternalSystem.tsx","../src/nodes/external-system/config.ts","../src/nodes/note/NoteNode.tsx","../src/nodes/Flow.tsx","../src/utils/url-builder.ts","../src/utils/badges.tsx","../src/nodes/Entity.tsx","../src/nodes/User.tsx","../src/nodes/Step.tsx","../src/nodes/Domain.tsx","../src/nodes/GroupNode.tsx","../src/nodes/Custom.tsx","../src/nodes/ExternalSystem2.tsx","../src/nodes/DataProduct.tsx","../src/edges/AnimatedMessageEdge.tsx","../src/edges/MultilineEdgeLabel.tsx","../src/edges/FlowEdge.tsx","../src/components/VisualiserSearch.tsx","../src/components/StepWalkthrough.tsx","../src/components/StudioModal.tsx","../src/utils/export-node-graph.ts","../src/components/FocusModeModal.tsx","../src/components/FocusMode/FocusModeContent.tsx","../src/components/FocusMode/utils.ts","../src/components/FocusMode/FocusModeNodeActions.tsx","../src/components/FocusMode/FocusModePlaceholder.tsx","../src/components/MermaidView.tsx","../src/utils/export-mermaid.ts","../src/utils/clipboard.ts","../src/components/VisualizerDropdownContent.tsx","../src/components/NodeContextMenu.tsx","../src/utils/layout.ts","../src/components/NotesToolbarButton.tsx","../src/nodes/index.ts","../src/edges/index.ts","../src/utils/utils/utils.ts"],"sourcesContent":["import { useEffect, useMemo, useState, useCallback, useRef, memo } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n ReactFlow,\n Background,\n ConnectionLineType,\n Controls,\n Panel,\n MiniMap,\n ReactFlowProvider,\n useNodesState,\n useEdgesState,\n type Edge,\n type Node,\n type NodeChange,\n useReactFlow,\n getNodesBounds,\n getViewportForBounds,\n type NodeTypes,\n} from \"@xyflow/react\";\nimport \"@xyflow/react/dist/style.css\";\nimport {\n ExternalLink,\n HistoryIcon,\n CheckIcon,\n ClipboardIcon,\n MoreVertical,\n} from \"lucide-react\";\nimport * as DropdownMenu from \"@radix-ui/react-dropdown-menu\";\nimport { toPng } from \"html-to-image\";\n// Nodes and edges\n// Studio-2 nodes (named exports from directories)\nimport { Service as ServiceNode } from \"../nodes/service\";\nimport { Event as EventNode } from \"../nodes/event\";\nimport { Query as QueryNode } from \"../nodes/query\";\nimport { Command as CommandNode } from \"../nodes/command\";\nimport { Channel as ChannelNode } from \"../nodes/channel\";\nimport { Data as DataNode } from \"../nodes/data\";\nimport { View as ViewNode } from \"../nodes/view\";\nimport { Actor as ActorNode } from \"../nodes/actor\";\nimport { ExternalSystem as ExternalSystemNode } from \"../nodes/external-system\";\nimport { Note as NoteNode } from \"../nodes/note\";\n// Core nodes (default exports from flat files)\nimport FlowNode from \"../nodes/Flow\";\nimport EntityNode from \"../nodes/Entity\";\nimport UserNode from \"../nodes/User\";\nimport StepNode from \"../nodes/Step\";\nimport DomainNode from \"../nodes/Domain\";\nimport GroupNode from \"../nodes/GroupNode\";\nimport CustomNode from \"../nodes/Custom\";\nimport ExternalSystemNode2 from \"../nodes/ExternalSystem2\";\nimport DataProductNode from \"../nodes/DataProduct\";\n// Edges\nimport AnimatedMessageEdge from \"../edges/AnimatedMessageEdge\";\nimport MultilineEdgeLabel from \"../edges/MultilineEdgeLabel\";\nimport FlowEdge from \"../edges/FlowEdge\";\nimport VisualiserSearch, { type VisualiserSearchRef } from \"./VisualiserSearch\";\nimport StepWalkthrough from \"./StepWalkthrough\";\nimport StudioModal from \"./StudioModal\";\nimport FocusModeModal from \"./FocusModeModal\";\nimport MermaidView from \"./MermaidView\";\nimport VisualizerDropdownContent from \"./VisualizerDropdownContent\";\nimport NodeContextMenu from \"./NodeContextMenu\";\nimport { convertToMermaid } from \"../utils/export-mermaid\";\nimport { copyToClipboard } from \"../utils/clipboard\";\nimport { layoutGraph } from \"../utils/layout\";\nimport { AllNotesModal, getNotesFromNode } from \"./NotesToolbarButton\";\nimport type { DslGraph } from \"../types\";\n\n// Minimum pixel change to detect layout modifications (avoids floating point comparison issues)\nconst POSITION_CHANGE_THRESHOLD = 1;\n\n// Static props for ReactFlow - defined outside component to avoid new references on every render\nconst NODE_ORIGIN: [number, number] = [0.1, 0.1];\nconst MINIMAP_STYLE = {\n backgroundColor: \"rgb(var(--ec-page-bg))\",\n border: \"1px solid rgb(var(--ec-page-border))\",\n borderRadius: \"8px\",\n} as const;\nconst LAYOUT_CHANGE_PANEL_STYLE_WITH_WALKTHROUGH = {\n marginBottom: \"20px\",\n marginLeft: \"410px\",\n} as const;\nconst LAYOUT_CHANGE_PANEL_STYLE_DEFAULT = { marginLeft: \"60px\" } as const;\nconst LEGEND_PANEL_STYLE_WITH_MINIMAP = { marginRight: \"230px\" } as const;\n\ntype LegendEntry = { count: number; colorClass: string; groupId?: string };\n\nconst LegendPanel = memo(function LegendPanel({\n legend,\n showMinimap,\n onLegendClick,\n}: {\n legend: Record<string, LegendEntry>;\n showMinimap: boolean;\n onLegendClick: (key: string, groupId?: string) => void;\n}) {\n return (\n <Panel\n position=\"bottom-right\"\n style={showMinimap ? LEGEND_PANEL_STYLE_WITH_MINIMAP : undefined}\n >\n <div className=\"bg-[rgb(var(--ec-card-bg))] border border-[rgb(var(--ec-page-border))] font-light px-4 text-[12px] shadow-md py-1 rounded-md\">\n <ul className=\"m-0 p-0 \">\n {Object.entries(legend).map(\n ([key, { count, colorClass, groupId }]) => (\n <li\n key={key}\n className=\"flex space-x-2 items-center text-[10px] cursor-pointer text-[rgb(var(--ec-page-text))] hover:text-[rgb(var(--ec-accent))] hover:underline\"\n onClick={() => onLegendClick(key, groupId)}\n >\n <span className={`w-2 h-2 block ${colorClass}`} />\n <span className=\"block capitalize\">\n {key} ({count})\n </span>\n </li>\n ),\n )}\n </ul>\n </div>\n </Panel>\n );\n});\n\ninterface Props {\n nodes: any;\n edges: any;\n title?: string;\n subtitle?: string;\n includeBackground?: boolean;\n includeControls?: boolean;\n linkTo?: \"docs\" | \"visualiser\";\n includeKey?: boolean;\n linksToVisualiser?: boolean;\n links?: { label: string; url: string }[];\n mode?: \"full\" | \"simple\";\n showFlowWalkthrough?: boolean;\n showSearch?: boolean;\n zoomOnScroll?: boolean;\n designId?: string;\n isStudioModalOpen?: boolean;\n setIsStudioModalOpen?: (isOpen: boolean) => void;\n isChatEnabled?: boolean;\n maxTextSize?: number;\n isDevMode?: boolean;\n resourceKey?: string;\n /** Controls whether message flow animation is enabled. When set, overrides URL params and localStorage. */\n animated?: boolean;\n\n // Callback API for framework integration\n /** Called when a node is clicked */\n onNodeClick?: (node: Node) => void;\n /** Called to build URLs for navigation (used in links dropdown) */\n onBuildUrl?: (path: string) => string;\n /** Called when navigation should occur */\n onNavigate?: (url: string) => void;\n /** Called to save layout positions (dev mode only) */\n onSaveLayout?: (\n resourceKey: string,\n positions: Record<string, { x: number; y: number }>,\n ) => Promise<boolean>;\n /** Called to reset layout positions (dev mode only) */\n onResetLayout?: (resourceKey: string) => Promise<boolean>;\n}\n\nconst NodeGraphBuilder = ({\n nodes: initialNodes,\n edges: initialEdges,\n title,\n includeBackground = true,\n linkTo: _linkTo = \"docs\",\n includeKey = true,\n linksToVisualiser = false,\n links = [],\n mode = \"full\",\n showFlowWalkthrough = true,\n showSearch = true,\n zoomOnScroll = false,\n isStudioModalOpen,\n setIsStudioModalOpen = () => {},\n isChatEnabled = false,\n maxTextSize,\n isDevMode = false,\n resourceKey,\n animated,\n onNodeClick,\n onBuildUrl: _onBuildUrl,\n onNavigate,\n onSaveLayout,\n onResetLayout,\n}: Props) => {\n const nodeTypes = useMemo(() => {\n const wrapWithContextMenu = (Component: React.ComponentType<any>) => {\n const Wrapped = memo((props: any) => {\n const items = props.data?.contextMenu;\n if (!items?.length) return <Component {...props} />;\n return (\n <NodeContextMenu items={items}>\n <Component {...props} />\n </NodeContextMenu>\n );\n });\n Wrapped.displayName = `WithContextMenu(${Component.displayName || Component.name || \"Component\"})`;\n return Wrapped;\n };\n\n return {\n service: wrapWithContextMenu(ServiceNode),\n services: wrapWithContextMenu(ServiceNode),\n flow: wrapWithContextMenu(FlowNode),\n flows: wrapWithContextMenu(FlowNode),\n event: wrapWithContextMenu(EventNode),\n events: wrapWithContextMenu(EventNode),\n channel: wrapWithContextMenu(ChannelNode),\n channels: wrapWithContextMenu(ChannelNode),\n query: wrapWithContextMenu(QueryNode),\n queries: wrapWithContextMenu(QueryNode),\n command: wrapWithContextMenu(CommandNode),\n commands: wrapWithContextMenu(CommandNode),\n domain: wrapWithContextMenu(DomainNode),\n domains: wrapWithContextMenu(DomainNode),\n step: StepNode,\n user: UserNode,\n custom: CustomNode,\n externalSystem: wrapWithContextMenu(ExternalSystemNode),\n \"external-system\": wrapWithContextMenu(ExternalSystemNode2),\n entity: wrapWithContextMenu(EntityNode),\n entities: wrapWithContextMenu(EntityNode),\n data: wrapWithContextMenu(DataNode),\n view: wrapWithContextMenu(ViewNode),\n actor: ActorNode,\n container: wrapWithContextMenu(DataNode),\n \"data-product\": wrapWithContextMenu(DataProductNode),\n \"data-products\": wrapWithContextMenu(DataProductNode),\n group: GroupNode,\n note: memo((props: any) => <NoteNode {...props} readOnly={true} />),\n } as unknown as NodeTypes;\n }, []);\n const edgeTypes = useMemo(\n () =>\n ({\n animated: AnimatedMessageEdge,\n multiline: MultilineEdgeLabel,\n \"flow-edge\": FlowEdge,\n }) as Record<string, any>,\n [],\n );\n const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes);\n const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);\n const { fitView, getNodes } = useReactFlow();\n\n // Sync when parent passes new nodes/edges (e.g. playground re-parse)\n useEffect(() => {\n setNodes(initialNodes);\n setEdges(initialEdges);\n // fitView after React Flow processes the new nodes\n requestAnimationFrame(() => {\n fitView({ duration: 300, padding: 0.2 });\n });\n }, [initialNodes, initialEdges, setNodes, setEdges, fitView]);\n\n const [animateMessages, setAnimateMessages] = useState(true);\n const [_activeStepIndex, _setActiveStepIndex] = useState<number | null>(null);\n const [_isFullscreen, _setIsFullscreen] = useState(false);\n const [isShareModalOpen, setIsShareModalOpen] = useState(false);\n const [shareUrlCopySuccess, setShareUrlCopySuccess] = useState(false);\n const [isMermaidView, setIsMermaidView] = useState(false);\n const [showMinimap, setShowMinimap] = useState(false);\n const [hasLayoutChanges, setHasLayoutChanges] = useState(false);\n const [isSavingLayout, setIsSavingLayout] = useState(false);\n const initialPositionsRef = useRef<Record<string, { x: number; y: number }>>(\n {},\n );\n // const [isStudioModalOpen, setIsStudioModalOpen] = useState(false);\n const [focusModeOpen, setFocusModeOpen] = useState(false);\n const [focusedNodeId, setFocusedNodeId] = useState<string | null>(null);\n const [isNotesModalOpen, setIsNotesModalOpen] = useState(false);\n const openNotesModal = useCallback(() => setIsNotesModalOpen(true), []);\n\n // Track user interaction (drag/pan/zoom) to pause expensive SVG animations.\n // Uses a ref + direct DOM manipulation to avoid React re-renders.\n const interactionCountRef = useRef(0);\n\n const startInteraction = useCallback(() => {\n interactionCountRef.current += 1;\n if (interactionCountRef.current === 1) {\n reactFlowWrapperRef.current?.classList.add(\"ec-interaction-active\");\n }\n }, []);\n\n const endInteraction = useCallback(() => {\n interactionCountRef.current = Math.max(0, interactionCountRef.current - 1);\n if (interactionCountRef.current === 0) {\n reactFlowWrapperRef.current?.classList.remove(\"ec-interaction-active\");\n }\n }, []);\n\n // Highlight source/target nodes when hovering an edge.\n // Uses direct DOM manipulation (like startInteraction) to avoid re-renders.\n const hoveredEdgeNodesRef = useRef<Element[]>([]);\n\n const handleEdgeMouseEnter = useCallback(\n (_: React.MouseEvent, edge: Edge) => {\n const wrapper = reactFlowWrapperRef.current;\n if (!wrapper) return;\n const nodes = wrapper.querySelectorAll(\n `[data-id=\"${edge.source}\"], [data-id=\"${edge.target}\"]`,\n );\n nodes.forEach((el) => el.classList.add(\"ec-edge-hover-node\"));\n hoveredEdgeNodesRef.current = Array.from(nodes);\n },\n [],\n );\n\n const handleEdgeMouseLeave = useCallback(() => {\n hoveredEdgeNodesRef.current.forEach((el) =>\n el.classList.remove(\"ec-edge-hover-node\"),\n );\n hoveredEdgeNodesRef.current = [];\n }, []);\n\n // Highlight all connected edges + their other-end nodes when hovering a node.\n // Looks up connected edges from the edges array, then queries DOM by edge ID.\n // Uses direct DOM manipulation to avoid re-renders.\n const hoveredNodeEdgesRef = useRef<Element[]>([]);\n const hoveredNodePeersRef = useRef<Element[]>([]);\n\n const handleNodeMouseEnter = useCallback(\n (_: React.MouseEvent, node: Node) => {\n const wrapper = reactFlowWrapperRef.current;\n if (!wrapper) return;\n\n const peerIds = new Set<string>();\n const edgeEls: Element[] = [];\n\n for (const edge of edgesRef.current) {\n if (edge.source !== node.id && edge.target !== node.id) continue;\n const el = wrapper.querySelector(\n `.react-flow__edge[data-id=\"${edge.id}\"]`,\n );\n if (el) {\n el.classList.add(\"ec-node-hover-edge\");\n edgeEls.push(el);\n }\n if (edge.source !== node.id) peerIds.add(edge.source);\n if (edge.target !== node.id) peerIds.add(edge.target);\n }\n hoveredNodeEdgesRef.current = edgeEls;\n\n // Highlight the hovered node + all peer nodes\n peerIds.add(node.id);\n const selector = Array.from(peerIds)\n .map((id) => `[data-id=\"${id}\"]`)\n .join(\", \");\n if (selector) {\n const peerEls = wrapper.querySelectorAll(selector);\n peerEls.forEach((el) => el.classList.add(\"ec-edge-hover-node\"));\n hoveredNodePeersRef.current = Array.from(peerEls);\n }\n },\n [],\n );\n\n const handleNodeMouseLeave = useCallback(() => {\n hoveredNodeEdgesRef.current.forEach((el) =>\n el.classList.remove(\"ec-node-hover-edge\"),\n );\n hoveredNodeEdgesRef.current = [];\n hoveredNodePeersRef.current.forEach((el) =>\n el.classList.remove(\"ec-edge-hover-node\"),\n );\n hoveredNodePeersRef.current = [];\n }, []);\n\n // Check if there are channels to determine if we need the visualizer functionality\n const hasChannels = useMemo(\n () => initialNodes.some((node: any) => node.type === \"channels\"),\n [initialNodes],\n );\n // TODO: Re-enable channel visibility feature\n // const { hideChannels, toggleChannelsVisibility } = useChannelVisibility({\n // nodes,\n // edges,\n // setNodes,\n // setEdges,\n // skipProcessing: !hasChannels,\n // });\n // Temporary implementation\n const hideChannels = false;\n const toggleChannelsVisibility = () => {};\n const searchRef = useRef<VisualiserSearchRef>(null);\n const reactFlowWrapperRef = useRef<HTMLDivElement>(null);\n const scrollableContainerRef = useRef<HTMLElement | null>(null);\n\n // Stable refs for nodes/edges - avoids recreating callbacks on every drag/state change\n const nodesRef = useRef(nodes);\n nodesRef.current = nodes;\n const edgesRef = useRef(edges);\n edgesRef.current = edges;\n\n // Store initial node positions for change detection (dev mode only)\n useEffect(() => {\n if (isDevMode && initialNodes.length > 0) {\n const positions: Record<string, { x: number; y: number }> = {};\n initialNodes.forEach((node: Node) => {\n positions[node.id] = { x: node.position.x, y: node.position.y };\n });\n initialPositionsRef.current = positions;\n }\n }, [isDevMode, initialNodes]);\n\n // Detect layout changes by comparing current positions to initial positions\n const checkForLayoutChanges = useCallback(() => {\n if (!isDevMode) return;\n const initial = initialPositionsRef.current;\n if (Object.keys(initial).length === 0) return;\n\n const hasChanges = nodesRef.current.some((node) => {\n const initialPos = initial[node.id];\n return (\n initialPos &&\n (Math.abs(node.position.x - initialPos.x) > POSITION_CHANGE_THRESHOLD ||\n Math.abs(node.position.y - initialPos.y) > POSITION_CHANGE_THRESHOLD)\n );\n });\n\n setHasLayoutChanges(hasChanges);\n }, [isDevMode]);\n\n // Wrap onNodesChange to detect layout changes after node drag\n const handleNodesChange = useCallback(\n (changes: NodeChange[]) => {\n onNodesChange(changes);\n // Check for position changes after drag ends\n const hasDragEnd = changes.some(\n (change) => change.type === \"position\" && !change.dragging,\n );\n if (hasDragEnd) {\n // Use setTimeout to ensure state is updated\n setTimeout(checkForLayoutChanges, 0);\n }\n },\n [onNodesChange, checkForLayoutChanges],\n );\n\n const resetNodesAndEdges = useCallback(() => {\n setNodes((nds) =>\n nds.map((node) => {\n node.style = { ...node.style, opacity: 1 };\n return { ...node, animated: animateMessages };\n }),\n );\n setEdges((eds) =>\n eds.map((edge) => {\n edge.style = { ...edge.style, opacity: 1 };\n edge.labelStyle = { ...edge.labelStyle, opacity: 1 };\n return {\n ...edge,\n data: { ...edge.data, opacity: 1, animated: animateMessages },\n animated: animateMessages,\n };\n }),\n );\n }, [setNodes, setEdges, animateMessages]);\n\n const handleNodeClick = useCallback(\n (_: any, node: Node) => {\n // If custom onNodeClick is provided, use it\n if (onNodeClick) {\n onNodeClick(node);\n return;\n }\n\n // Legacy behavior for linksToVisualiser (deprecated - use onNodeClick instead)\n if (linksToVisualiser && onNavigate) {\n // Consumer should handle navigation - but onNodeClick wasn't provided\n return;\n }\n\n // Disable focus mode for flow and entity visualizations\n const isFlow = edgesRef.current.some(\n (edge: Edge) => edge.type === \"flow-edge\",\n );\n const isEntityVisualizer = nodesRef.current.some(\n (n: Node) => n.type === \"entities\",\n );\n if (isFlow || isEntityVisualizer) return;\n\n // Disable focus mode for domain nodes\n if (node.type === \"domain\" || node.type === \"domains\") return;\n\n // Open focus mode modal\n setFocusedNodeId(node.id);\n setFocusModeOpen(true);\n },\n [onNodeClick, linksToVisualiser, onNavigate],\n );\n\n const toggleAnimateMessages = useCallback(() => {\n setAnimateMessages((prev) => {\n const next = !prev;\n localStorage.setItem(\n \"EventCatalog:animateMessages\",\n JSON.stringify(next),\n );\n return next;\n });\n }, []);\n\n // Handle fit to view\n const handleFitView = useCallback(() => {\n fitView({ duration: 400, padding: 0.2 });\n }, [fitView]);\n\n // animate messages, between views\n // Priority: animated prop > URL parameter > localStorage\n useEffect(() => {\n if (animated !== undefined) {\n setAnimateMessages(animated);\n return;\n }\n\n const urlParams = new URLSearchParams(window.location.search);\n const animateParam = urlParams.get(\"animate\");\n\n if (animateParam === \"true\") {\n setAnimateMessages(true);\n } else if (animateParam === \"false\") {\n setAnimateMessages(false);\n } else {\n // Fall back to localStorage if no URL parameter\n const storedAnimateMessages = localStorage.getItem(\n \"EventCatalog:animateMessages\",\n );\n if (storedAnimateMessages !== null) {\n setAnimateMessages(storedAnimateMessages === \"true\");\n }\n }\n }, [animated]);\n\n useEffect(() => {\n setEdges((eds) =>\n eds.map((edge) => ({\n ...edge,\n animated: animateMessages,\n type:\n edge.type === \"flow-edge\" || edge.type === \"multiline\"\n ? edge.type\n : animateMessages\n ? \"animated\"\n : \"smoothstep\",\n data: { ...edge.data, animateMessages, animated: animateMessages },\n })),\n );\n }, [animateMessages]);\n\n useEffect(() => {\n setTimeout(() => {\n fitView({ duration: 800 });\n }, 150);\n }, []);\n\n // Generate mermaid code lazily (only when needed for copy)\n const generateMermaidCode = useCallback(() => {\n try {\n return convertToMermaid(nodesRef.current, edgesRef.current, {\n includeStyles: true,\n direction: \"LR\",\n });\n } catch (error) {\n console.error(\"Error generating mermaid code:\", error);\n return \"\";\n }\n }, []);\n\n // Handle scroll wheel events to forward to page when no modifier keys are pressed\n // Only when zoomOnScroll is disabled\n // This is a fix for when we embed node graphs into pages, and users are scrolling the documentation pages\n // We dont want REACT FLOW to swallow the scroll events, so we forward them to the parent page\n useEffect(() => {\n // Skip scroll handling if zoomOnScroll is enabled\n if (zoomOnScroll) return;\n\n // Cache the scrollable container on mount (expensive operation done once)\n const findScrollableContainer = (): HTMLElement | null => {\n // Try specific known selectors first (fast)\n const selectors = [\n \".docs-layout .overflow-y-auto\",\n \".overflow-y-auto\",\n '[style*=\"overflow-y:auto\"]',\n '[style*=\"overflow-y: auto\"]',\n ];\n\n for (const selector of selectors) {\n const element = document.querySelector(selector) as HTMLElement;\n if (element) return element;\n }\n\n return null;\n };\n\n // Find and cache the scrollable container once\n if (!scrollableContainerRef.current) {\n scrollableContainerRef.current = findScrollableContainer();\n }\n\n const handleWheel = (event: WheelEvent) => {\n // Only forward scroll if no modifier keys are pressed\n if (!event.ctrlKey && !event.shiftKey && !event.metaKey) {\n event.preventDefault();\n\n const scrollableContainer = scrollableContainerRef.current;\n\n if (scrollableContainer) {\n scrollableContainer.scrollBy({\n top: event.deltaY,\n left: event.deltaX,\n behavior: \"instant\",\n });\n } else {\n // Fallback to window scroll\n window.scrollBy({\n top: event.deltaY,\n left: event.deltaX,\n behavior: \"instant\",\n });\n }\n }\n };\n\n const wrapper = reactFlowWrapperRef.current;\n if (wrapper) {\n wrapper.addEventListener(\"wheel\", handleWheel, { passive: false });\n return () => {\n wrapper.removeEventListener(\"wheel\", handleWheel);\n };\n }\n }, [zoomOnScroll]);\n\n const handlePaneClick = useCallback(() => {\n searchRef.current?.hideSuggestions();\n resetNodesAndEdges();\n fitView({ duration: 800 });\n }, [resetNodesAndEdges, fitView]);\n\n const handleNodeSelect = useCallback(\n (node: Node) => {\n handleNodeClick(null, node);\n },\n [handleNodeClick],\n );\n\n const handleSearchClear = useCallback(() => {\n resetNodesAndEdges();\n fitView({ duration: 800 });\n }, [resetNodesAndEdges, fitView]);\n\n const downloadImage = useCallback((dataUrl: string, filename?: string) => {\n const a = document.createElement(\"a\");\n a.setAttribute(\"download\", `${filename || \"eventcatalog\"}.png`);\n a.setAttribute(\"href\", dataUrl);\n a.click();\n }, []);\n\n const openStudioModal = useCallback(() => {\n setIsStudioModalOpen(true);\n }, [setIsStudioModalOpen]);\n\n const openChat = useCallback(() => {\n window.dispatchEvent(new CustomEvent(\"eventcatalog:open-chat\"));\n }, []);\n\n // Layout persistence handlers (dev mode only)\n const handleSaveLayout = useCallback(async (): Promise<boolean> => {\n if (!resourceKey || !onSaveLayout) return false;\n\n const positions: Record<string, { x: number; y: number }> = {};\n nodesRef.current.forEach((node) => {\n positions[node.id] = {\n x: node.position.x,\n y: node.position.y,\n };\n });\n\n return await onSaveLayout(resourceKey, positions);\n }, [resourceKey, onSaveLayout]);\n\n const handleResetLayout = useCallback(async (): Promise<boolean> => {\n if (!resourceKey || !onResetLayout) return false;\n return await onResetLayout(resourceKey);\n }, [resourceKey, onResetLayout]);\n\n // Quick save handler for the change detection UI\n const handleQuickSaveLayout = useCallback(async () => {\n setIsSavingLayout(true);\n const success = await handleSaveLayout();\n setIsSavingLayout(false);\n if (success) {\n // Update initial positions to current positions after save\n const positions: Record<string, { x: number; y: number }> = {};\n nodesRef.current.forEach((node) => {\n positions[node.id] = { x: node.position.x, y: node.position.y };\n });\n initialPositionsRef.current = positions;\n setHasLayoutChanges(false);\n }\n }, [handleSaveLayout]);\n\n const handleCopyArchitectureCode = useCallback(async () => {\n const code = generateMermaidCode();\n await copyToClipboard(code);\n }, [generateMermaidCode]);\n\n const handleCopyShareUrl = useCallback(async () => {\n const url = typeof window !== \"undefined\" ? window.location.href : \"\";\n await copyToClipboard(url);\n setShareUrlCopySuccess(true);\n setTimeout(() => setShareUrlCopySuccess(false), 2000);\n }, []);\n\n const toggleFullScreen = useCallback(() => {\n if (!document.fullscreenElement) {\n reactFlowWrapperRef.current?.requestFullscreen().catch((err) => {\n console.error(\n `Error attempting to enable full-screen mode: ${err.message} (${err.name})`,\n );\n });\n } else {\n document.exitFullscreen();\n }\n }, []);\n\n useEffect(() => {\n const handleFullscreenChange = () => {\n _setIsFullscreen(!!document.fullscreenElement);\n setTimeout(() => {\n fitView({ duration: 800 });\n }, 100);\n };\n\n document.addEventListener(\"fullscreenchange\", handleFullscreenChange);\n return () => {\n document.removeEventListener(\"fullscreenchange\", handleFullscreenChange);\n };\n }, [fitView]);\n\n const handleExportVisual = useCallback(() => {\n const imageWidth = 1024;\n const imageHeight = 768;\n const nodesBounds = getNodesBounds(getNodes());\n const width =\n imageWidth > nodesBounds.width ? imageWidth : nodesBounds.width;\n const height =\n imageHeight > nodesBounds.height ? imageHeight : nodesBounds.height;\n const viewport = getViewportForBounds(\n nodesBounds,\n width,\n height,\n 0.5,\n 2,\n 0,\n );\n\n // Hide controls during export\n const controls = document.querySelector(\n \".react-flow__controls\",\n ) as HTMLElement;\n if (controls) controls.style.display = \"none\";\n\n toPng(document.querySelector(\".react-flow__viewport\") as HTMLElement, {\n backgroundColor: \"#f1f1f1\",\n width,\n height,\n style: {\n width: width.toString(),\n height: height.toString(),\n transform: `translate(${viewport.x}px, ${viewport.y}px) scale(${viewport.zoom})`,\n },\n }).then((dataUrl: string) => {\n downloadImage(dataUrl, title);\n // Restore controls\n if (controls) controls.style.display = \"block\";\n });\n }, [getNodes, downloadImage, title]);\n\n const handleLegendClick = useCallback(\n (collectionType: string, groupId?: string) => {\n const updatedNodes = nodes.map((node: Node<any>) => {\n // Check if the groupId is set first\n if (groupId && node.data.group && node.data.group?.id === groupId) {\n return { ...node, style: { ...node.style, opacity: 1 } };\n } else {\n if (node.type === collectionType) {\n return { ...node, style: { ...node.style, opacity: 1 } };\n }\n }\n return { ...node, style: { ...node.style, opacity: 0.1 } };\n });\n\n const updatedEdges = edges.map((edge) => {\n return {\n ...edge,\n data: { ...edge.data, opacity: 0.1 },\n style: { ...edge.style, opacity: 0.1 },\n labelStyle: { ...edge.labelStyle, opacity: 0.1 },\n animated: animateMessages,\n };\n });\n\n setNodes(updatedNodes);\n setEdges(updatedEdges);\n\n fitView({\n padding: 0.2,\n duration: 800,\n nodes: updatedNodes.filter((node) => node.type === collectionType),\n });\n },\n [nodes, edges, setNodes, setEdges, fitView],\n );\n\n const getNodesByCollectionWithColors = useCallback((nodes: Node<any>[]) => {\n const colorClasses = {\n events: \"bg-orange-600\",\n services: \"bg-pink-600\",\n flows: \"bg-teal-600\",\n commands: \"bg-blue-600\",\n queries: \"bg-green-600\",\n channels: \"bg-gray-600\",\n externalSystem: \"bg-pink-600\",\n actor: \"bg-yellow-500\",\n step: \"bg-gray-700\",\n data: \"bg-blue-600\",\n \"data-products\": \"bg-indigo-600\",\n };\n\n let legendForDomains: {\n [key: string]: { count: number; colorClass: string; groupId: string };\n } = {};\n\n // Find any groups\n const domainGroups = [\n ...new Set(\n nodes\n .filter(\n (node) => node.data.group && node.data.group?.type === \"Domain\",\n )\n .map((node) => node.data.group?.id),\n ),\n ];\n\n domainGroups.forEach((groupId) => {\n const group = nodes.filter(\n (node) => node.data.group && node.data.group?.id === groupId,\n );\n legendForDomains[`${groupId} (Domain)`] = {\n count: group.length,\n colorClass: \"bg-yellow-600\",\n groupId,\n };\n });\n\n const legendForNodes = nodes.reduce(\n (\n acc: {\n [key: string]: {\n count: number;\n colorClass: string;\n groupId?: string;\n };\n },\n node,\n ) => {\n const collection = node.type;\n if (collection) {\n if (acc[collection]) {\n acc[collection].count += 1;\n } else {\n acc[collection] = {\n count: 1,\n colorClass:\n colorClasses[collection as keyof typeof colorClasses] ||\n \"bg-black\",\n };\n }\n }\n return acc;\n },\n {},\n );\n\n return { ...legendForDomains, ...legendForNodes };\n }, []);\n\n // Legend only depends on node types and groups, not positions.\n // Use a ref to avoid recomputing the key string on every drag tick.\n const legendKeyRef = useRef(\"\");\n const computedLegendKey = nodes\n .map((n: Node<any>) => `${n.id}:${n.type}:${n.data.group?.id || \"\"}`)\n .join(\",\");\n if (computedLegendKey !== legendKeyRef.current) {\n legendKeyRef.current = computedLegendKey;\n }\n const legendKey = legendKeyRef.current;\n\n const legend = useMemo(\n () => getNodesByCollectionWithColors(nodes),\n [getNodesByCollectionWithColors, legendKey],\n );\n\n // Stable key derived from node IDs — only changes when nodes are added/removed,\n // not when positions change during drag. Used by search, legend, and notes.\n const nodeIdsKeyRef = useRef(\"\");\n const computedNodeIdsKey = nodes.map((n) => n.id).join(\",\");\n if (computedNodeIdsKey !== nodeIdsKeyRef.current) {\n nodeIdsKeyRef.current = computedNodeIdsKey;\n }\n const nodeIdsKey = nodeIdsKeyRef.current;\n\n const searchNodes = useMemo(() => nodes, [nodeIdsKey]);\n\n // Collect notes across all nodes for the dropdown menu item.\n // Notes don't change during drag — use nodeIdsKey for stability.\n const allNoteGroups = useMemo(() => {\n const groups: {\n nodeId: string;\n name: string;\n notes: any[];\n nodeType: string;\n }[] = [];\n for (const node of nodes) {\n const result = getNotesFromNode(node);\n if (result) {\n groups.push({\n nodeId: node.id,\n name: result.name,\n notes: result.notes,\n nodeType: result.nodeType,\n });\n }\n }\n return groups;\n }, [nodeIdsKey]);\n\n const totalNotesCount = useMemo(\n () => allNoteGroups.reduce((sum, g) => sum + g.notes.length, 0),\n [allNoteGroups],\n );\n\n const handleStepChange = useCallback(\n (\n nodeId: string | null,\n highlightPaths?: string[],\n shouldZoomOut?: boolean,\n ) => {\n if (nodeId === null) {\n // Reset all nodes and edges\n resetNodesAndEdges();\n _setActiveStepIndex(null);\n\n // If shouldZoomOut is true, fit the entire view\n if (shouldZoomOut) {\n setTimeout(() => {\n fitView({ duration: 800, padding: 0.1 });\n }, 100);\n }\n return;\n }\n\n const activeNode = nodes.find((node: Node) => node.id === nodeId);\n if (!activeNode) return;\n\n // Create set of highlighted nodes and edges\n const highlightedNodeIds = new Set<string>();\n const highlightedEdgeIds = new Set<string>();\n\n // Add current node\n highlightedNodeIds.add(activeNode.id);\n\n // Add incoming edges and their source nodes\n edges.forEach((edge: Edge) => {\n if (edge.target === activeNode.id) {\n highlightedEdgeIds.add(edge.id);\n highlightedNodeIds.add(edge.source);\n }\n });\n\n // Add outgoing edges\n if (highlightPaths) {\n // Highlight all possible paths when at a fork\n highlightPaths.forEach((pathId) => {\n const [source, target] = pathId.split(\"-\");\n edges.forEach((edge: Edge) => {\n if (edge.source === source && edge.target === target) {\n highlightedEdgeIds.add(edge.id);\n highlightedNodeIds.add(edge.target);\n }\n });\n });\n } else {\n // Highlight all outgoing edges normally\n edges.forEach((edge: Edge) => {\n if (edge.source === activeNode.id) {\n highlightedEdgeIds.add(edge.id);\n highlightedNodeIds.add(edge.target);\n }\n });\n }\n\n // Update nodes\n const updatedNodes = nodes.map((node: Node) => {\n if (highlightedNodeIds.has(node.id)) {\n return { ...node, style: { ...node.style, opacity: 1 } };\n }\n return { ...node, style: { ...node.style, opacity: 0.2 } };\n });\n\n // Update edges\n const updatedEdges = edges.map((edge: Edge) => {\n if (highlightedEdgeIds.has(edge.id)) {\n return {\n ...edge,\n data: { ...edge.data, opacity: 1, animated: true },\n style: { ...edge.style, opacity: 1, strokeWidth: 3 },\n labelStyle: { ...edge.labelStyle, opacity: 1 },\n animated: true,\n };\n }\n return {\n ...edge,\n data: { ...edge.data, opacity: 0.2, animated: false },\n style: { ...edge.style, opacity: 0.2, strokeWidth: 2 },\n labelStyle: { ...edge.labelStyle, opacity: 0.2 },\n animated: false,\n };\n });\n\n setNodes(updatedNodes);\n setEdges(updatedEdges);\n\n // Fit view to active node\n fitView({\n padding: 0.4,\n duration: 800,\n nodes: [activeNode],\n });\n },\n [nodes, edges, setNodes, setEdges, resetNodesAndEdges, fitView],\n );\n\n // Check if this is a flow visualization by checking if edges use flow-edge type\n const isFlowVisualization = useMemo(\n () => edges.some((edge: Edge) => edge.type === \"flow-edge\"),\n [edges],\n );\n\n return (\n <div\n ref={reactFlowWrapperRef}\n className=\"w-full h-full bg-[rgb(var(--ec-page-bg))] flex flex-col eventcatalog-visualizer\"\n >\n {isMermaidView ? (\n <>\n {/* Menu Bar for Mermaid View */}\n <div className=\"w-full pr-6 flex space-x-2 justify-between items-center bg-[rgb(var(--ec-page-bg))] border-b border-[rgb(var(--ec-page-border))] p-4\">\n <div className=\"flex space-x-2 ml-4\">\n {/* Settings Dropdown Menu */}\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <button\n className=\"py-2.5 px-4 bg-[rgb(var(--ec-page-bg))] hover:bg-[rgb(var(--ec-accent-subtle)/0.4)] border border-[rgb(var(--ec-page-border))] rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-[rgb(var(--ec-accent))] flex items-center gap-3 transition-all duration-200 hover:border-[rgb(var(--ec-accent)/0.3)] group whitespace-nowrap\"\n aria-label=\"Open menu\"\n >\n {title && (\n <span className=\"text-base font-medium text-[rgb(var(--ec-page-text))] leading-tight\">\n {title}\n </span>\n )}\n <MoreVertical className=\"h-5 w-5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0 group-hover:text-[rgb(var(--ec-accent))] transition-colors duration-150\" />\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n className=\"min-w-56 bg-[rgb(var(--ec-page-bg))] border border-[rgb(var(--ec-page-border))] rounded-lg shadow-xl z-50 py-1.5 animate-in fade-in zoom-in-95 duration-200\"\n sideOffset={0}\n align=\"end\"\n alignOffset={-180}\n >\n <DropdownMenu.Arrow className=\"fill-[rgb(var(--ec-page-bg))] stroke-[rgb(var(--ec-page-border))] stroke-1\" />\n <VisualizerDropdownContent\n isMermaidView={isMermaidView}\n setIsMermaidView={setIsMermaidView}\n animateMessages={animateMessages}\n toggleAnimateMessages={toggleAnimateMessages}\n hideChannels={hideChannels}\n toggleChannelsVisibility={toggleChannelsVisibility}\n hasChannels={hasChannels}\n showMinimap={showMinimap}\n setShowMinimap={setShowMinimap}\n handleFitView={handleFitView}\n searchRef={searchRef}\n isChatEnabled={isChatEnabled}\n openChat={openChat}\n handleCopyArchitectureCode={handleCopyArchitectureCode}\n handleExportVisual={handleExportVisual}\n setIsShareModalOpen={setIsShareModalOpen}\n toggleFullScreen={toggleFullScreen}\n openStudioModal={openStudioModal}\n isDevMode={isDevMode}\n onSaveLayout={handleSaveLayout}\n onResetLayout={handleResetLayout}\n />\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n </div>\n {mode === \"full\" && showSearch && (\n <div className=\"flex justify-end items-center gap-2\">\n {!isMermaidView && (\n <div className=\"w-96\">\n <VisualiserSearch\n ref={searchRef}\n nodes={searchNodes}\n onNodeSelect={handleNodeSelect}\n onClear={handleSearchClear}\n />\n </div>\n )}\n </div>\n )}\n </div>\n {/* Mermaid View */}\n <div className=\"flex-1 overflow-hidden relative\">\n <MermaidView\n nodes={nodes}\n edges={edges}\n maxTextSize={maxTextSize}\n />\n </div>\n </>\n ) : (\n <ReactFlow\n nodeTypes={nodeTypes}\n edgeTypes={edgeTypes}\n minZoom={0.07}\n nodes={nodes}\n edges={edges}\n fitView\n onNodesChange={handleNodesChange}\n onEdgesChange={onEdgesChange}\n onEdgeMouseEnter={handleEdgeMouseEnter}\n onEdgeMouseLeave={handleEdgeMouseLeave}\n connectionLineType={ConnectionLineType.SmoothStep}\n nodeOrigin={NODE_ORIGIN}\n onNodeClick={handleNodeClick}\n onNodeMouseEnter={handleNodeMouseEnter}\n onNodeMouseLeave={handleNodeMouseLeave}\n onPaneClick={handlePaneClick}\n onMoveStart={startInteraction}\n onMoveEnd={endInteraction}\n onNodeDragStart={startInteraction}\n onNodeDragStop={endInteraction}\n zoomOnScroll={zoomOnScroll}\n className=\"relative\"\n >\n <Panel\n position=\"top-center\"\n className=\"w-full pr-6 pointer-events-none\"\n >\n <div className=\"flex space-x-2 justify-between items-center pointer-events-auto\">\n <div className=\"flex space-x-2 ml-4\">\n {/* Settings Dropdown Menu */}\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <button\n className=\"py-2.5 px-4 bg-[rgb(var(--ec-page-bg))] hover:bg-[rgb(var(--ec-accent-subtle)/0.4)] border border-[rgb(var(--ec-page-border))] rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-[rgb(var(--ec-accent))] flex items-center gap-3 transition-all duration-200 hover:border-[rgb(var(--ec-accent)/0.3)] group whitespace-nowrap\"\n aria-label=\"Open menu\"\n >\n {title && (\n <span className=\"text-base font-medium text-[rgb(var(--ec-page-text))] leading-tight\">\n {title}\n </span>\n )}\n <MoreVertical className=\"h-5 w-5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0 group-hover:text-[rgb(var(--ec-accent))] transition-colors duration-150\" />\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n className=\"min-w-56 bg-[rgb(var(--ec-page-bg))] border border-[rgb(var(--ec-page-border))] rounded-lg shadow-xl z-50 py-1.5 animate-in fade-in zoom-in-95 duration-200\"\n sideOffset={0}\n align=\"end\"\n alignOffset={-180}\n >\n <DropdownMenu.Arrow className=\"fill-[rgb(var(--ec-page-bg))] stroke-[rgb(var(--ec-page-border))] stroke-1\" />\n <VisualizerDropdownContent\n isMermaidView={isMermaidView}\n setIsMermaidView={setIsMermaidView}\n animateMessages={animateMessages}\n toggleAnimateMessages={toggleAnimateMessages}\n hideChannels={hideChannels}\n toggleChannelsVisibility={toggleChannelsVisibility}\n hasChannels={hasChannels}\n showMinimap={showMinimap}\n setShowMinimap={setShowMinimap}\n handleFitView={handleFitView}\n searchRef={searchRef}\n isChatEnabled={isChatEnabled}\n openChat={openChat}\n handleCopyArchitectureCode={handleCopyArchitectureCode}\n handleExportVisual={handleExportVisual}\n setIsShareModalOpen={setIsShareModalOpen}\n toggleFullScreen={toggleFullScreen}\n openStudioModal={openStudioModal}\n isDevMode={isDevMode}\n onSaveLayout={handleSaveLayout}\n onResetLayout={handleResetLayout}\n notesCount={totalNotesCount}\n onOpenNotes={openNotesModal}\n />\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n </div>\n {mode === \"full\" && showSearch && (\n <div className=\"flex justify-end items-center gap-2\">\n {!isMermaidView && (\n <div className=\"w-96\">\n <VisualiserSearch\n ref={searchRef}\n nodes={searchNodes}\n onNodeSelect={handleNodeSelect}\n onClear={handleSearchClear}\n />\n </div>\n )}\n </div>\n )}\n </div>\n {links.length > 0 && (\n <div className=\"flex justify-end mt-3\">\n <div className=\"relative flex items-center -mt-1\">\n <span className=\"absolute left-2 pointer-events-none flex items-center h-full\">\n <HistoryIcon className=\"h-4 w-4 text-[rgb(var(--ec-page-text-muted))]\" />\n </span>\n <select\n value={\n links.find((link) =>\n window.location.href.includes(link.url),\n )?.url || links[0].url\n }\n onChange={(e) => {\n if (onNavigate) {\n onNavigate(e.target.value);\n } else {\n window.location.href = e.target.value;\n }\n }}\n className=\"appearance-none pl-7 pr-6 py-0 text-[14px] bg-[rgb(var(--ec-card-bg))] text-[rgb(var(--ec-page-text))] rounded-md border border-[rgb(var(--ec-page-border))] hover:bg-[rgb(var(--ec-page-border)/0.5)] focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-[rgb(var(--ec-accent))]\"\n style={{ minWidth: 120, height: \"26px\" }}\n >\n {links.map((link) => (\n <option key={link.url} value={link.url}>\n {link.label}\n </option>\n ))}\n </select>\n <span className=\"absolute right-2 pointer-events-none\">\n <svg\n className=\"w-4 h-4 text-[rgb(var(--ec-page-text-muted))]\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </span>\n </div>\n </div>\n )}\n </Panel>\n\n {includeBackground && (\n <Background color=\"var(--ec-bg-dots)\" gap={16} />\n )}\n {includeBackground && <Controls />}\n {showMinimap && (\n <MiniMap\n nodeStrokeWidth={3}\n zoomable\n pannable\n style={MINIMAP_STYLE}\n />\n )}\n {isFlowVisualization && showFlowWalkthrough && (\n <Panel position=\"bottom-left\">\n <StepWalkthrough\n nodes={nodes}\n edges={edges}\n isFlowVisualization={isFlowVisualization}\n onStepChange={handleStepChange}\n mode={mode}\n />\n </Panel>\n )}\n {/* Dev Mode: Layout change indicator */}\n {isDevMode && hasLayoutChanges && (\n <Panel\n position=\"bottom-left\"\n style={\n isFlowVisualization && showFlowWalkthrough\n ? LAYOUT_CHANGE_PANEL_STYLE_WITH_WALKTHROUGH\n : LAYOUT_CHANGE_PANEL_STYLE_DEFAULT\n }\n >\n <div className=\"bg-[rgb(var(--ec-card-bg))] border border-[rgb(var(--ec-page-border))] rounded-lg shadow-md px-3 py-2 flex items-center gap-3\">\n <span className=\"text-xs text-[rgb(var(--ec-page-text-muted))]\">\n Layout changed\n </span>\n <button\n onClick={handleQuickSaveLayout}\n disabled={isSavingLayout}\n className=\"text-xs font-medium text-[rgb(var(--ec-accent-text))] bg-[rgb(var(--ec-accent-subtle))] hover:bg-[rgb(var(--ec-accent-subtle)/0.7)] px-2 py-1 rounded transition-colors disabled:opacity-50\"\n >\n {isSavingLayout ? \"Saving...\" : \"Save\"}\n </button>\n </div>\n </Panel>\n )}\n {includeKey && (\n <LegendPanel\n legend={legend}\n showMinimap={showMinimap}\n onLegendClick={handleLegendClick}\n />\n )}\n </ReactFlow>\n )}\n <StudioModal\n isOpen={isStudioModalOpen || false}\n onClose={() => setIsStudioModalOpen(false)}\n />\n <FocusModeModal\n isOpen={focusModeOpen}\n onClose={() => setFocusModeOpen(false)}\n initialNodeId={focusedNodeId}\n nodes={nodes}\n edges={edges}\n nodeTypes={nodeTypes}\n edgeTypes={edgeTypes}\n />\n <AllNotesModal\n noteGroups={allNoteGroups}\n isOpen={isNotesModalOpen}\n onClose={() => setIsNotesModalOpen(false)}\n nodes={nodes}\n />\n\n {/* Share Link Modal */}\n {isShareModalOpen && (\n <>\n <div\n className=\"fixed inset-0 bg-black/20 z-40\"\n onClick={() => setIsShareModalOpen(false)}\n style={{ animation: \"fadeIn 150ms ease-out\" }}\n />\n <div\n className=\"fixed top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 bg-[rgb(var(--ec-page-bg))] rounded-lg shadow-xl z-50 w-full max-w-md p-6 border border-[rgb(var(--ec-page-border))]\"\n style={{ animation: \"slideInCenter 250ms ease-out\" }}\n >\n <style>{`\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n @keyframes slideInCenter {\n from { opacity: 0; transform: translate(-50%, -48%); }\n to { opacity: 1; transform: translate(-50%, -50%); }\n }\n `}</style>\n\n <div className=\"flex justify-between items-start mb-4\">\n <h3 className=\"text-lg font-semibold text-[rgb(var(--ec-page-text))]\">\n Share Link\n </h3>\n <button\n onClick={() => setIsShareModalOpen(false)}\n className=\"text-[rgb(var(--ec-page-text-muted))] hover:text-[rgb(var(--ec-page-text))] transition-colors\"\n aria-label=\"Close modal\"\n >\n <ExternalLink className=\"w-5 h-5 rotate-180\" />\n </button>\n </div>\n\n <p className=\"text-sm text-[rgb(var(--ec-page-text-muted))] mb-4\">\n Share this link with your team to let them view this\n visualization.\n </p>\n\n <div className=\"flex gap-2\">\n <input\n type=\"text\"\n readOnly\n value={\n typeof window !== \"undefined\" ? window.location.href : \"\"\n }\n className=\"flex-1 px-3 py-2.5 bg-[rgb(var(--ec-input-bg))] border border-[rgb(var(--ec-input-border))] rounded-md text-[rgb(var(--ec-input-text))] text-sm focus:outline-none focus:ring-2 focus:ring-[rgb(var(--ec-accent))]\"\n />\n <button\n onClick={handleCopyShareUrl}\n className={`px-4 py-2.5 rounded-md font-medium transition-all duration-200 flex items-center gap-2 ${\n shareUrlCopySuccess\n ? \"bg-green-500 text-white\"\n : \"bg-[rgb(var(--ec-accent))] text-white hover:opacity-90\"\n }`}\n aria-label={shareUrlCopySuccess ? \"Copied!\" : \"Copy link\"}\n >\n {shareUrlCopySuccess ? (\n <CheckIcon className=\"w-4 h-4\" />\n ) : (\n <ClipboardIcon className=\"w-4 h-4\" />\n )}\n <span>{shareUrlCopySuccess ? \"Copied!\" : \"Copy\"}</span>\n </button>\n </div>\n </div>\n </>\n )}\n </div>\n );\n};\n\ninterface NodeGraphProps {\n id: string;\n title?: string;\n href?: string;\n hrefLabel?: string;\n nodes?: Node[];\n edges?: Edge[];\n graph?: DslGraph;\n linkTo?: \"docs\" | \"visualiser\";\n includeKey?: boolean;\n footerLabel?: string;\n linksToVisualiser?: boolean;\n links?: { label: string; url: string }[];\n mode?: \"full\" | \"simple\";\n portalId?: string;\n showFlowWalkthrough?: boolean;\n showSearch?: boolean;\n zoomOnScroll?: boolean;\n designId?: string;\n isChatEnabled?: boolean;\n maxTextSize?: number;\n isDevMode?: boolean;\n resourceKey?: string;\n /** Controls whether message flow animation is enabled. When set, overrides URL params and localStorage. */\n animated?: boolean;\n\n // Callback API for framework integration\n onNodeClick?: (node: Node) => void;\n onBuildUrl?: (path: string) => string;\n onNavigate?: (url: string) => void;\n onSaveLayout?: (\n resourceKey: string,\n positions: Record<string, { x: number; y: number }>,\n ) => Promise<boolean>;\n onResetLayout?: (resourceKey: string) => Promise<boolean>;\n}\n\nconst NodeGraph = ({\n id,\n nodes: nodesProp,\n edges: edgesProp,\n graph,\n title: titleProp,\n href,\n linkTo = \"docs\",\n hrefLabel = \"Open in visualizer\",\n includeKey: includeKeyProp,\n footerLabel,\n linksToVisualiser = false,\n links = [],\n mode = \"full\",\n portalId,\n showFlowWalkthrough = true,\n showSearch: showSearchProp,\n zoomOnScroll = false,\n designId,\n isChatEnabled = false,\n maxTextSize,\n isDevMode = false,\n resourceKey,\n animated: animatedProp,\n onNodeClick,\n onBuildUrl,\n onNavigate,\n onSaveLayout,\n onResetLayout,\n}: NodeGraphProps) => {\n // When a DslGraph is provided, run layout internally using dagre.\n const graphLayout = useMemo(() => {\n if (!graph) return null;\n return layoutGraph(\n graph.nodes,\n graph.edges,\n { rankdir: \"LR\", nodesep: 60, ranksep: 120 },\n graph.options?.style,\n );\n }, [graph]);\n const nodes = graphLayout?.nodes ?? nodesProp ?? [];\n const edges = graphLayout?.edges ?? edgesProp ?? [];\n\n // Derive props from graph.options when graph is provided\n const title = titleProp ?? graph?.title;\n const includeKey =\n includeKeyProp !== undefined\n ? includeKeyProp\n : graph?.options?.legend !== false;\n const showSearch =\n showSearchProp !== undefined\n ? showSearchProp\n : graph?.options?.search !== false;\n const animated = animatedProp ?? graph?.options?.animated;\n const [elem, setElem] = useState(null);\n const [showFooter, setShowFooter] = useState(true);\n const [isStudioModalOpen, setIsStudioModalOpen] = useState(false);\n\n const openStudioModal = useCallback(() => {\n setIsStudioModalOpen(true);\n }, []);\n\n const containerToRenderInto = portalId || `${id}-portal`;\n\n useEffect(() => {\n // @ts-ignore\n setElem(document.getElementById(containerToRenderInto));\n }, []);\n\n useEffect(() => {\n const urlParams = new URLSearchParams(window.location.search);\n const embed = urlParams.get(\"embed\");\n if (embed === \"true\") {\n setShowFooter(false);\n }\n }, []);\n\n if (!elem) return null;\n\n return (\n <div>\n {createPortal(\n <ReactFlowProvider>\n <NodeGraphBuilder\n edges={edges}\n nodes={nodes}\n title={title}\n linkTo={linkTo}\n includeKey={includeKey}\n linksToVisualiser={linksToVisualiser}\n links={links}\n mode={mode}\n showFlowWalkthrough={showFlowWalkthrough}\n showSearch={showSearch}\n zoomOnScroll={zoomOnScroll}\n designId={designId || id}\n isStudioModalOpen={isStudioModalOpen}\n setIsStudioModalOpen={setIsStudioModalOpen}\n isChatEnabled={isChatEnabled}\n maxTextSize={maxTextSize}\n isDevMode={isDevMode}\n resourceKey={resourceKey}\n animated={animated}\n onNodeClick={onNodeClick}\n onBuildUrl={onBuildUrl}\n onNavigate={onNavigate}\n onSaveLayout={onSaveLayout}\n onResetLayout={onResetLayout}\n />\n\n {showFooter && (\n <div className=\"flex justify-between\" id=\"visualiser-footer\">\n {footerLabel && (\n <div className=\"py-2 w-full text-left \">\n <span className=\" text-sm no-underline py-2 text-[rgb(var(--ec-page-text-muted))]\">\n {footerLabel}\n </span>\n </div>\n )}\n\n {href && (\n <div className=\"py-2 w-full text-right flex justify-between\">\n {/* <span className=\"text-sm text-gray-500 italic\">Right click a node to access documentation</span> */}\n <button\n onClick={openStudioModal}\n className=\" text-sm underline text-[rgb(var(--ec-page-text))] hover:text-[rgb(var(--ec-accent))] flex items-center space-x-1\"\n >\n <span>Open in EventCatalog Studio</span>\n <ExternalLink className=\"w-3 h-3\" />\n </button>\n <a\n className=\" text-sm underline text-[rgb(var(--ec-page-text))] hover:text-[rgb(var(--ec-accent))]\"\n href={href}\n >\n {hrefLabel} →\n </a>\n </div>\n )}\n </div>\n )}\n </ReactFlowProvider>,\n elem,\n )}\n </div>\n );\n};\n\nexport default NodeGraph;\n","import { memo, useMemo } from \"react\";\nimport { ServerIcon } from \"lucide-react\";\nimport {\n OwnerIndicator,\n normalizeOwners,\n HIDDEN_HANDLE_STYLE,\n} from \"../OwnerIndicator\";\nimport { Node, Handle, Position, useHandleConnections } from \"@xyflow/react\";\nimport { EventCatalogResource, Service as ServiceType } from \"../../types\";\nimport { NotesIndicator } from \"../NotesIndicator\";\nimport {\n LINE_CLAMP_STYLE,\n WATERMARK_STYLE,\n FOLDED_CORNER_SHADOW_STYLE,\n useDarkMode,\n} from \"../shared-styles\";\n\nconst MiniEnvelope = memo(function MiniEnvelope({\n side,\n delay,\n}: {\n side: \"left\" | \"right\";\n delay: number;\n}) {\n return (\n <svg\n width=\"14\"\n height=\"10\"\n viewBox=\"0 0 14 10\"\n style={{\n animation: `${side === \"left\" ? \"ec-svc-msg-in\" : \"ec-svc-msg-out\"} 2.5s ease-in-out ${delay}s infinite`,\n opacity: 0,\n }}\n >\n <rect\n x=\"0.5\"\n y=\"0.5\"\n width=\"13\"\n height=\"9\"\n rx=\"1.5\"\n fill=\"#9ca3af\"\n opacity={0.85}\n />\n <path\n d=\"M0.5,0.5 L7,5 L13.5,0.5\"\n fill=\"none\"\n stroke=\"white\"\n strokeWidth=\"1\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n});\n\nconst ServiceMessageFlow = memo(function ServiceMessageFlow({\n side,\n}: {\n side: \"left\" | \"right\";\n}) {\n return (\n <div\n style={{\n position: \"absolute\",\n top: \"50%\",\n [side]: -4,\n transform: \"translateY(-50%)\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 2,\n zIndex: 15,\n pointerEvents: \"none\",\n }}\n >\n <MiniEnvelope side={side} delay={0} />\n <MiniEnvelope side={side} delay={0.8} />\n <MiniEnvelope side={side} delay={1.6} />\n </div>\n );\n});\n\nconst GlowHandle = memo(function GlowHandle({\n side,\n}: {\n side: \"left\" | \"right\";\n}) {\n return (\n <div\n style={{\n position: \"absolute\",\n top: \"50%\",\n [side]: -6,\n transform: \"translateY(-50%)\",\n width: 12,\n height: 12,\n borderRadius: \"50%\",\n background: \"linear-gradient(135deg, #ec4899, #be185d)\",\n border: \"2px solid rgb(var(--ec-page-bg))\",\n zIndex: 20,\n animation: \"ec-service-handle-pulse 2s ease-in-out infinite\",\n pointerEvents: \"none\",\n }}\n />\n );\n});\n\nfunction classNames(...classes: any) {\n return classes.filter(Boolean).join(\" \");\n}\n\ntype ServiceNodeData = EventCatalogResource & {\n service: ServiceType;\n};\n\nexport type ServiceNode = Node<ServiceNodeData, \"service\">;\n\nfunction PostItService(props: ServiceNode) {\n const { version, name, summary, deprecated, draft, notes } =\n props.data.service;\n const mode = props.data.mode || \"simple\";\n\n return (\n <div\n className={classNames(\n \"relative min-w-44 max-w-56 min-h-[120px]\",\n props?.selected ? \"ring-2 ring-pink-400/60 ring-offset-1\" : \"\",\n )}\n >\n <Handle\n type=\"target\"\n position={Position.Left}\n style={HIDDEN_HANDLE_STYLE}\n />\n <Handle\n type=\"source\"\n position={Position.Right}\n style={HIDDEN_HANDLE_STYLE}\n />\n {notes && notes.length > 0 && (\n <NotesIndicator notes={notes} resourceName={name} />\n )}\n {/* Inner wrapper with rotation */}\n <div\n className=\"absolute inset-0\"\n style={{\n background: draft\n ? \"repeating-linear-gradient(135deg, #fbcfe8 0%, #f9a8d4 40%, #ec4899 100%)\"\n : \"linear-gradient(135deg, #fbcfe8 0%, #f9a8d4 40%, #ec4899 100%)\",\n boxShadow:\n \"1px 1px 3px rgba(0,0,0,0.15), 3px 4px 8px rgba(0,0,0,0.08)\",\n transform: \"rotate(1deg)\",\n border: deprecated\n ? \"2px dashed rgba(239, 68, 68, 0.5)\"\n : draft\n ? \"2px dashed rgba(236, 72, 153, 0.5)\"\n : \"none\",\n }}\n >\n {/* Folded corner */}\n <div style={FOLDED_CORNER_SHADOW_STYLE} />\n <div\n style={{\n position: \"absolute\",\n top: 0,\n right: 0,\n width: 0,\n height: 0,\n borderStyle: \"solid\",\n borderWidth: \"18px 0 0 18px\",\n borderColor: \"#db2777 transparent transparent transparent\",\n opacity: 0.3,\n }}\n />\n </div>\n\n {/* Content sits on top, unrotated */}\n <div className=\"relative px-3.5 py-3\">\n {/* Type label row */}\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center gap-1\">\n <ServerIcon\n className=\"w-3 h-3 text-pink-900/50\"\n strokeWidth={2.5}\n />\n <span className=\"text-[8px] font-bold text-pink-900/50 uppercase tracking-widest\">\n Service\n </span>\n </div>\n {draft && (\n <span className=\"text-[8px] font-extrabold text-amber-900 bg-amber-100 border border-dashed border-amber-400 px-1.5 py-0.5 rounded uppercase\">\n Draft\n </span>\n )}\n {deprecated && (\n <span className=\"text-[7px] font-bold text-white bg-red-500 border border-red-600 px-1.5 py-0.5 rounded uppercase\">\n Deprecated\n </span>\n )}\n </div>\n\n {/* Name */}\n <div\n className={classNames(\n \"text-[13px] font-bold leading-snug\",\n deprecated ? \"text-pink-950/40 line-through\" : \"text-pink-950\",\n )}\n >\n {name}\n </div>\n\n {/* Version */}\n {version && (\n <div className=\"text-[9px] text-pink-900/40 font-semibold mt-0.5\">\n v{version}\n </div>\n )}\n\n {/* Summary */}\n {mode === \"full\" && summary && (\n <div\n className=\"mt-2 pt-1.5 border-t border-pink-900/10 text-[9px] text-pink-950/60 leading-relaxed overflow-hidden\"\n style={LINE_CLAMP_STYLE}\n title={summary}\n >\n {summary}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction DefaultService(props: ServiceNode) {\n const { version, name, summary, deprecated, draft, notes } =\n props.data.service;\n const mode = props.data.mode || \"simple\";\n const owners = useMemo(\n () => normalizeOwners(props.data.service.owners),\n [props.data.service.owners],\n );\n const targetConnections = useHandleConnections({ type: \"target\" });\n const sourceConnections = useHandleConnections({ type: \"source\" });\n const isDark = useDarkMode();\n const deprecatedStripe = isDark\n ? \"rgba(239,68,68,0.25)\"\n : \"rgba(239,68,68,0.1)\";\n\n return (\n <div\n className={classNames(\n \"relative min-w-48 max-w-60 rounded-xl border-2 overflow-visible\",\n props?.selected ? \"ring-2 ring-pink-400/60 ring-offset-2\" : \"\",\n deprecated\n ? \"border-dashed border-red-500\"\n : draft\n ? `border-dashed ${isDark ? \"border-pink-400\" : \"border-pink-400/60\"}`\n : \"border-pink-500\",\n )}\n style={{\n background: deprecated\n ? `repeating-linear-gradient(135deg, transparent, transparent 6px, ${deprecatedStripe} 6px, ${deprecatedStripe} 7px), var(--ec-service-node-bg, rgb(var(--ec-card-bg)))`\n : draft\n ? `repeating-linear-gradient(135deg, transparent, transparent 4px, ${isDark ? \"rgba(236,72,153,0.25)\" : \"rgba(236,72,153,0.15)\"} 4px, ${isDark ? \"rgba(236,72,153,0.25)\" : \"rgba(236,72,153,0.15)\"} 4.5px), repeating-linear-gradient(45deg, transparent, transparent 4px, ${isDark ? \"rgba(236,72,153,0.25)\" : \"rgba(236,72,153,0.15)\"} 4px, ${isDark ? \"rgba(236,72,153,0.25)\" : \"rgba(236,72,153,0.15)\"} 4.5px), var(--ec-service-node-bg, rgb(var(--ec-card-bg)))`\n : \"var(--ec-service-node-bg, rgb(var(--ec-card-bg)))\",\n boxShadow: \"0 2px 12px rgba(236, 72, 153, 0.15)\",\n }}\n >\n <Handle\n type=\"target\"\n position={Position.Left}\n style={HIDDEN_HANDLE_STYLE}\n />\n <Handle\n type=\"source\"\n position={Position.Right}\n style={HIDDEN_HANDLE_STYLE}\n />\n {notes && notes.length > 0 && (\n <NotesIndicator notes={notes} resourceName={name} />\n )}\n {targetConnections.length > 0 && <GlowHandle side=\"left\" />}\n {sourceConnections.length > 0 && <GlowHandle side=\"right\" />}\n\n {/* Badge positioned outside top-left corner */}\n <div className=\"absolute -top-2.5 left-2.5 flex items-center gap-1.5 z-10\">\n <span\n className={classNames(\n \"inline-flex items-center gap-1 text-[7px] font-bold uppercase tracking-widest text-white px-1.5 py-0.5 rounded shadow-sm\",\n deprecated ? \"bg-red-500\" : \"bg-pink-500\",\n )}\n >\n <ServerIcon className=\"w-2.5 h-2.5\" strokeWidth={2.5} />\n Service{draft && \" (Draft)\"}\n {deprecated && \" (Deprecated)\"}\n </span>\n </div>\n\n <div className=\"px-3 pt-3.5 pb-2.5\">\n {/* Name + version */}\n <div className=\"flex items-baseline gap-1\">\n <span className=\"text-[13px] font-semibold leading-snug text-[rgb(var(--ec-page-text))]\">\n {name}\n </span>\n {version && (\n <span className=\"text-[10px] font-normal text-[rgb(var(--ec-page-text-muted))] shrink-0\">\n (v{version})\n </span>\n )}\n </div>\n\n {/* Summary */}\n {mode === \"full\" && summary && (\n <div\n className=\"mt-1.5 text-[9px] text-[rgb(var(--ec-page-text-muted))] leading-relaxed overflow-hidden\"\n style={LINE_CLAMP_STYLE}\n title={summary}\n >\n {summary}\n </div>\n )}\n\n {/* Owners */}\n <OwnerIndicator\n owners={owners}\n accentColor=\"bg-pink-400\"\n borderColor=\"rgba(236,72,153,0.08)\"\n iconClass=\"text-pink-300\"\n />\n </div>\n </div>\n );\n}\n\nexport default memo(function Service(props: ServiceNode) {\n const nodeStyle = props?.data?.style;\n\n if (nodeStyle === \"post-it\") {\n return <PostItService {...props} />;\n }\n\n return <DefaultService {...props} />;\n});\n","import { memo } from \"react\";\nimport { UserIcon, UsersIcon } from \"lucide-react\";\nimport { OWNER_ICON_SIZE_STYLE } from \"./shared-styles\";\n\n/** Shared style for hidden React Flow handles (avoids inline object allocation). */\nexport const HIDDEN_HANDLE_STYLE = { opacity: 0 } as const;\n\n/**\n * Normalise owners which may arrive as string[] or {id:string}[] from Astro.\n */\nexport function normalizeOwners(raw: any[] | undefined): string[] {\n if (!raw || raw.length === 0) return [];\n return raw\n .filter(Boolean)\n .map((o: any) => (typeof o === \"string\" ? o : (o?.id ?? \"\")));\n}\n\n/**\n * Compact owner indicator for the bottom of a node card.\n * Shows a small icon + primary owner name + overflow pill.\n *\n * @param accentColor - Tailwind color class for the pill, e.g. \"bg-pink-400\"\n * @param borderColor - CSS color string for the top border\n * @param iconClass - Tailwind text color for the icon, e.g. \"text-pink-300\"\n */\nexport const OwnerIndicator = memo(function OwnerIndicator({\n owners,\n accentColor = \"bg-pink-400\",\n borderColor = \"rgba(236,72,153,0.08)\",\n iconClass = \"text-pink-300\",\n}: {\n owners: string[];\n accentColor?: string;\n borderColor?: string;\n iconClass?: string;\n}) {\n if (owners.length === 0) return null;\n\n const primary = owners[0];\n const remaining = owners.length - 1;\n const isLikelyTeam = primary.includes(\" \") || primary.includes(\"-\");\n\n return (\n <div\n className=\"flex items-center gap-1 mt-1.5 pt-1.5\"\n style={{ borderTop: `1px solid ${borderColor}` }}\n title={owners.join(\", \")}\n >\n {/* Icon */}\n {isLikelyTeam ? (\n <UsersIcon\n className={`${iconClass} shrink-0`}\n style={OWNER_ICON_SIZE_STYLE}\n strokeWidth={2.5}\n />\n ) : (\n <UserIcon\n className={`${iconClass} shrink-0`}\n style={OWNER_ICON_SIZE_STYLE}\n strokeWidth={2.5}\n />\n )}\n\n {/* Primary owner name */}\n <span className=\"text-[8px] text-[rgb(var(--ec-page-text-muted))] truncate leading-none\">\n {primary}\n </span>\n\n {/* Overflow count */}\n {remaining > 0 && (\n <span\n className={`shrink-0 inline-flex items-center justify-center text-[7px] font-bold text-white ${accentColor} rounded-full px-1 py-[1px] leading-none`}\n title={owners.slice(1).join(\", \")}\n >\n +{remaining}\n </span>\n )}\n </div>\n );\n});\n","import { type CSSProperties, useSyncExternalStore } from \"react\";\n\n// ─── Dark mode detection ────────────────────────────────────────────────────\n\nfunction subscribeTheme(callback: () => void) {\n const observer = new MutationObserver(callback);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [\"data-theme\"],\n });\n return () => observer.disconnect();\n}\n\nfunction getIsDark() {\n return (\n typeof document !== \"undefined\" &&\n document.documentElement.getAttribute(\"data-theme\") === \"dark\"\n );\n}\n\nexport function useDarkMode(): boolean {\n return useSyncExternalStore(subscribeTheme, getIsDark, () => false);\n}\n\n/**\n * Shared style constants for node components.\n * Extracting inline style objects to module-level constants ensures React.memo\n * receives stable references and can skip re-renders effectively.\n */\n\n// ─── Common layout ──────────────────────────────────────────────────────────\n\nexport const NODE_WIDTH_STYLE = { width: \"260px\" } as const;\n\nexport const ROTATED_LABEL_STYLE = {\n transform: \"rotate(-90deg)\",\n letterSpacing: \"0.15em\",\n whiteSpace: \"nowrap\",\n} as const satisfies CSSProperties;\n\nexport const TINY_FONT_STYLE = { fontSize: \"0.2em\" } as const;\n\n// ─── WebKit line clamp (summary truncation) ─────────────────────────────────\n\nexport const LINE_CLAMP_STYLE = {\n display: \"-webkit-box\",\n WebkitLineClamp: 2,\n WebkitBoxOrient: \"vertical\",\n} as const satisfies CSSProperties;\n\n// ─── Watermark icon ─────────────────────────────────────────────────────────\n\nexport const WATERMARK_STYLE = {\n opacity: 0.2,\n transform: \"rotate(12deg)\",\n} as const;\n\n// ─── Post-it folded corner (identical across all post-it nodes) ─────────────\n\nexport const FOLDED_CORNER_SHADOW_STYLE = {\n position: \"absolute\",\n top: 0,\n right: 0,\n width: 0,\n height: 0,\n borderStyle: \"solid\",\n borderWidth: \"0 18px 18px 0\",\n borderColor: \"transparent #1e293b12 transparent transparent\",\n} as const satisfies CSSProperties;\n\n// ─── Post-it common shadow ─────────────────────────────────────────────────\n\nexport const POST_IT_BOX_SHADOW =\n \"1px 1px 3px rgba(0,0,0,0.15), 3px 4px 8px rgba(0,0,0,0.08)\";\n\n// ─── Handle positioning ─────────────────────────────────────────────────────\n\nexport const HANDLE_LEFT_STYLE = { left: \"-1px\" } as const;\nexport const HANDLE_RIGHT_STYLE = { right: \"-1px\" } as const;\nexport const HANDLE_LEFT_OFFSET_STYLE = { left: \"-6px\" } as const;\nexport const HANDLE_RIGHT_OFFSET_STYLE = { right: \"-6px\" } as const;\n\n// ─── Note/Full size style ───────────────────────────────────────────────────\n\nexport const FULL_SIZE_STYLE = { width: \"100%\", height: \"100%\" } as const;\n\n// ─── Owner indicator icon size ──────────────────────────────────────────────\n\nexport const OWNER_ICON_SIZE_STYLE = { width: 10, height: 10 } as const;\n\n// ─── ExternalSystem2 handle ─────────────────────────────────────────────────\n\nexport const EXTERNAL_SYSTEM_HANDLE_STYLE = {\n width: 10,\n height: 10,\n background: \"pink\",\n zIndex: 10,\n} as const;\n\n// ─── Edge styles ────────────────────────────────────────────────────────────\n\nexport const EDGE_WARNING_STYLE = {\n stroke: \"red\",\n strokeWidth: 2.625,\n strokeDasharray: \"5 5\",\n} as const;\n\nexport const EDGE_DEFAULT_STYLE = {\n stroke: \"var(--ec-edge-stroke, #d1d5db)\",\n strokeWidth: 2.625,\n strokeDasharray: \"5 5\",\n} as const;\n\nexport const EDGE_FLOW_BASE_STYLE = {\n strokeWidth: 3,\n stroke: \"rgb(var(--ec-page-text-muted))\",\n strokeDasharray: \"5 5\",\n} as const;\n\n// ─── Default empty values (stable references for default props) ─────────────\n\nexport const EMPTY_ARRAY: any[] = [];\nexport const EMPTY_OBJECT: Readonly<Record<string, never>> = {} as const;\n\n// ─── Channel message queue ──────────────────────────────────────────────────\n\nexport const QUEUE_BORDER_STYLE = {\n borderTop: \"1px dashed rgb(var(--ec-page-border))\",\n} as const;\n","import { MessageCircle, AlertTriangle, XIcon } from \"lucide-react\";\nimport { useState, useCallback, memo } from \"react\";\nimport * as Dialog from \"@radix-ui/react-dialog\";\nimport type { Note } from \"../types\";\nimport { useDarkMode } from \"./shared-styles\";\n\n/* ------------------------------------------------------------------ */\n/* Constants */\n/* ------------------------------------------------------------------ */\n\nconst AMBER = {\n 50: \"#fffbeb\",\n 100: \"#fef3c7\",\n 200: \"#fde68a\",\n 400: \"#fbbf24\",\n 500: \"#f59e0b\",\n 600: \"#d97706\",\n 700: \"#b45309\",\n 800: \"#92400e\",\n 900: \"#78350f\",\n} as const;\n\nconst PRIORITY: Record<\n string,\n { bg: string; fg: string; border: string; label: string; accent: string }\n> = {\n high: {\n bg: \"#fef2f2\",\n fg: \"#b91c1c\",\n border: \"#fecaca\",\n label: \"High\",\n accent: \"#ef4444\",\n },\n critical: {\n bg: \"#fef2f2\",\n fg: \"#991b1b\",\n border: \"#fecaca\",\n label: \"Critical\",\n accent: \"#dc2626\",\n },\n low: {\n bg: \"#f0fdf4\",\n fg: \"#15803d\",\n border: \"#bbf7d0\",\n label: \"Low\",\n accent: \"#22c55e\",\n },\n};\n\n/* ------------------------------------------------------------------ */\n/* Deterministic avatar color from name */\n/* ------------------------------------------------------------------ */\n\nconst AVATAR_PALETTES = [\n [\"#7c3aed\", \"#a78bfa\"], // violet\n [\"#2563eb\", \"#60a5fa\"], // blue\n [\"#0891b2\", \"#22d3ee\"], // cyan\n [\"#059669\", \"#34d399\"], // emerald\n [\"#d97706\", \"#fbbf24\"], // amber\n [\"#dc2626\", \"#f87171\"], // red\n [\"#db2777\", \"#f472b6\"], // pink\n [\"#4f46e5\", \"#818cf8\"], // indigo\n];\n\nfunction hashStr(s: string): number {\n let h = 0;\n for (let i = 0; i < s.length; i++) {\n h = (h * 31 + s.charCodeAt(i)) | 0;\n }\n return Math.abs(h);\n}\n\n/* ------------------------------------------------------------------ */\n/* Shared atoms */\n/* ------------------------------------------------------------------ */\n\nfunction Avatar({ name, size = 18 }: { name: string; size?: number }) {\n const initials = name\n .split(/\\s+/)\n .map((w) => w[0])\n .join(\"\")\n .toUpperCase()\n .slice(0, 2);\n\n const [c1, c2] = AVATAR_PALETTES[hashStr(name) % AVATAR_PALETTES.length];\n\n return (\n <div\n style={{\n width: size,\n height: size,\n borderRadius: \"50%\",\n background: `linear-gradient(135deg, ${c1}, ${c2})`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n <span\n style={{\n fontSize: Math.round(size * 0.42),\n fontWeight: 700,\n color: \"white\",\n lineHeight: 1,\n letterSpacing: \"-0.02em\",\n }}\n >\n {initials}\n </span>\n </div>\n );\n}\n\nfunction PriorityPill({\n priority,\n size = \"sm\",\n}: {\n priority: string;\n size?: \"sm\" | \"md\";\n}) {\n const p = PRIORITY[priority.toLowerCase()];\n if (!p) return null;\n const isUrgent = priority === \"high\" || priority === \"critical\";\n const md = size === \"md\";\n\n return (\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: md ? 4 : 2,\n fontSize: md ? 11 : 8,\n fontWeight: 700,\n color: p.fg,\n background: p.bg,\n border: `1px solid ${p.border}`,\n borderRadius: 99,\n padding: md ? \"2px 8px\" : \"1px 5px\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.04em\",\n lineHeight: 1.4,\n whiteSpace: \"nowrap\",\n }}\n >\n {isUrgent && (\n <AlertTriangle\n style={{ width: md ? 10 : 7, height: md ? 10 : 7 }}\n strokeWidth={2.5}\n />\n )}\n {p.label}\n </span>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Popover (hover preview) */\n/* ------------------------------------------------------------------ */\n\nfunction PopoverCard({ note, last }: { note: Note; last: boolean }) {\n return (\n <div\n style={{\n padding: \"7px 10px\",\n borderBottom: last ? \"none\" : \"1px solid rgb(var(--ec-page-border))\",\n display: \"flex\",\n gap: 6,\n alignItems: \"flex-start\",\n }}\n >\n {note.author && <Avatar name={note.author} size={16} />}\n <div style={{ flex: 1, minWidth: 0 }}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n marginBottom: 2,\n }}\n >\n {note.author && (\n <span\n style={{\n fontSize: 9,\n fontWeight: 700,\n color: \"rgb(var(--ec-page-text))\",\n lineHeight: 1,\n }}\n >\n {note.author}\n </span>\n )}\n {note.priority && <PriorityPill priority={note.priority} />}\n </div>\n <p\n style={{\n fontSize: 9,\n lineHeight: 1.45,\n color: \"rgb(var(--ec-page-text-muted))\",\n margin: 0,\n display: \"-webkit-box\",\n WebkitLineClamp: 2,\n WebkitBoxOrient: \"vertical\",\n overflow: \"hidden\",\n }}\n >\n {note.content}\n </p>\n </div>\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Modal note card (thread-style) */\n/* ------------------------------------------------------------------ */\n\nfunction NoteCard({ note, isDark }: { note: Note; isDark: boolean }) {\n const prioStyle = note.priority\n ? PRIORITY[note.priority.toLowerCase()]\n : null;\n\n return (\n <div\n style={{\n background: isDark\n ? `radial-gradient(circle, rgba(255,255,255,0.15) 1px, transparent 1px), rgba(255,255,255,0.04)`\n : `radial-gradient(circle, rgba(212,201,168,0.4) 1px, transparent 1px), #fef9ed`,\n backgroundSize: \"12px 12px\",\n border: `1px solid ${isDark ? \"rgba(255,255,255,0.08)\" : \"#e5dcc3\"}`,\n borderBottom: `2px dashed ${isDark ? \"rgba(255,255,255,0.1)\" : \"#d4c9a8\"}`,\n borderRadius: \"8px 8px 0 0\",\n padding: \"14px 16px 14px\",\n position: \"relative\",\n }}\n >\n {/* Author */}\n {note.author && (\n <span\n style={{\n display: \"block\",\n fontSize: 11,\n fontWeight: 650,\n color: isDark ? \"#e2e8f0\" : \"#1e293b\",\n marginBottom: 8,\n }}\n >\n {note.author}\n </span>\n )}\n\n {/* Content — styled like a handwritten note */}\n <p\n style={{\n fontSize: 13,\n lineHeight: 1.7,\n color: isDark ? \"#cbd5e1\" : \"#1e293b\",\n margin: 0,\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-word\",\n fontStyle: \"italic\",\n }}\n >\n “{note.content}”\n </p>\n </div>\n );\n}\n\n/** Group notes by priority: critical/high first, then low, then no priority */\nfunction groupNotes(\n notes: Note[],\n): { label: string; notes: Note[]; color: string }[] {\n const urgent: Note[] = [];\n const low: Note[] = [];\n const normal: Note[] = [];\n\n for (const n of notes) {\n const p = n.priority?.toLowerCase();\n if (p === \"critical\" || p === \"high\") urgent.push(n);\n else if (p === \"low\") low.push(n);\n else normal.push(n);\n }\n\n const groups: { label: string; notes: Note[]; color: string }[] = [];\n if (urgent.length > 0)\n groups.push({ label: \"High Priority\", notes: urgent, color: \"#ef4444\" });\n if (normal.length > 0)\n groups.push({ label: \"Notes\", notes: normal, color: \"#f59e0b\" });\n if (low.length > 0)\n groups.push({ label: \"Low Priority\", notes: low, color: \"#22c55e\" });\n return groups;\n}\n\n/* ------------------------------------------------------------------ */\n/* Full-screen modal */\n/* ------------------------------------------------------------------ */\n\nexport function NotesModal({\n notes,\n isOpen,\n onClose,\n resourceName,\n resourceVersion,\n resourceType,\n accentColor,\n icon,\n}: {\n notes: Note[];\n isOpen: boolean;\n onClose: () => void;\n resourceName?: string;\n resourceVersion?: string;\n resourceType?: string;\n accentColor?: string;\n icon?: React.ReactNode;\n}) {\n const isDark = useDarkMode();\n const count = notes.length;\n const urgent = notes.filter(\n (n) =>\n n.priority &&\n (n.priority.toLowerCase() === \"high\" ||\n n.priority.toLowerCase() === \"critical\"),\n );\n\n return (\n <Dialog.Root open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <Dialog.Portal\n container={typeof document !== \"undefined\" ? document.body : undefined}\n >\n <div\n className=\"fixed inset-0 z-[99999]\"\n style={{ isolation: \"isolate\" }}\n >\n <Dialog.Overlay\n style={{\n position: \"fixed\",\n inset: 0,\n background: isDark\n ? \"rgba(0, 0, 0, 0.7)\"\n : \"rgba(15, 23, 42, 0.55)\",\n backdropFilter: \"blur(8px)\",\n }}\n />\n\n <Dialog.Content\n style={{\n position: \"fixed\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n width: \"92vw\",\n maxWidth: 500,\n maxHeight: \"80vh\",\n background: isDark ? \"#1e2330\" : \"#ffffff\",\n borderRadius: 16,\n border: `1px solid ${isDark ? \"rgba(255,255,255,0.08)\" : \"rgba(0,0,0,0.08)\"}`,\n boxShadow: isDark\n ? \"0 24px 48px rgba(0,0,0,0.5)\"\n : \"0 24px 48px rgba(0,0,0,0.15)\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n outline: \"none\",\n }}\n >\n {/* -------- Header -------- */}\n <div\n style={{\n padding: \"20px 22px 16px\",\n borderBottom: `1px solid ${isDark ? \"rgba(255,255,255,0.06)\" : \"rgba(0,0,0,0.06)\"}`,\n display: \"flex\",\n alignItems: \"center\",\n gap: 14,\n }}\n >\n {/* Resource icon */}\n <div\n style={{\n width: 36,\n height: 36,\n borderRadius: 10,\n background:\n accentColor ||\n `linear-gradient(135deg, ${AMBER[400]}, ${AMBER[500]})`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n {icon || (\n <MessageCircle\n style={{ width: 18, height: 18, color: \"white\" }}\n strokeWidth={2.5}\n />\n )}\n </div>\n\n {/* Title block */}\n <div style={{ flex: 1, minWidth: 0 }}>\n <Dialog.Title\n style={{\n fontSize: 15,\n fontWeight: 700,\n color: isDark ? \"#f1f5f9\" : \"#0f172a\",\n margin: 0,\n lineHeight: 1.3,\n letterSpacing: \"-0.01em\",\n display: \"flex\",\n alignItems: \"baseline\",\n gap: 6,\n }}\n >\n {resourceName || \"Notes\"}\n {resourceVersion && (\n <span\n style={{\n fontSize: 11,\n fontWeight: 500,\n color: isDark ? \"#64748b\" : \"#94a3b8\",\n }}\n >\n v{resourceVersion}\n </span>\n )}\n </Dialog.Title>\n <Dialog.Description\n style={{\n fontSize: 12,\n color: isDark ? \"#94a3b8\" : \"#64748b\",\n margin: 0,\n marginTop: 3,\n lineHeight: 1.3,\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n }}\n >\n {resourceType && (\n <span\n style={{\n fontSize: 10,\n fontWeight: 700,\n textTransform: \"uppercase\",\n letterSpacing: \"0.05em\",\n }}\n >\n {resourceType}\n </span>\n )}\n {resourceType && (\n <span style={{ opacity: 0.4 }}>·</span>\n )}\n {count} note{count !== 1 ? \"s\" : \"\"}\n {urgent.length > 0 &&\n ` \\u00b7 ${urgent.length} high priority`}\n </Dialog.Description>\n </div>\n\n {/* Close */}\n <Dialog.Close asChild>\n <button\n aria-label=\"Close\"\n style={{\n width: 32,\n height: 32,\n borderRadius: 8,\n border: \"none\",\n background: isDark\n ? \"rgba(255,255,255,0.06)\"\n : \"rgba(0,0,0,0.04)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n color: isDark ? \"#94a3b8\" : \"#94a3b8\",\n flexShrink: 0,\n }}\n >\n <XIcon style={{ width: 16, height: 16 }} />\n </button>\n </Dialog.Close>\n </div>\n\n {/* -------- Grouped notes -------- */}\n <div\n style={{\n flex: 1,\n overflowY: \"auto\",\n padding: \"16px 22px 24px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 18,\n }}\n >\n {groupNotes(notes).map((group) => (\n <div key={group.label}>\n {/* Group header */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n marginBottom: 10,\n }}\n >\n <div\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: group.color,\n flexShrink: 0,\n }}\n />\n <span\n style={{\n fontSize: 11,\n fontWeight: 700,\n color: isDark ? \"#94a3b8\" : \"#64748b\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.06em\",\n }}\n >\n {group.label}\n </span>\n <span\n style={{\n fontSize: 10,\n fontWeight: 600,\n color: isDark ? \"#475569\" : \"#94a3b8\",\n }}\n >\n ({group.notes.length})\n </span>\n <div\n style={{\n flex: 1,\n height: 1,\n background: isDark\n ? \"rgba(255,255,255,0.06)\"\n : \"rgba(0,0,0,0.06)\",\n }}\n />\n </div>\n {/* Notes in group */}\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n }}\n >\n {group.notes.map((note, i) => (\n <NoteCard key={i} note={note} isDark={isDark} />\n ))}\n </div>\n </div>\n ))}\n </div>\n </Dialog.Content>\n </div>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Main indicator */\n/* ------------------------------------------------------------------ */\n\nexport const NotesIndicator = memo(function NotesIndicator({\n notes,\n resourceName,\n}: {\n notes: Note[];\n resourceName?: string;\n}) {\n const [isHovered, setIsHovered] = useState(false);\n const [isModalOpen, setIsModalOpen] = useState(false);\n\n const handleClick = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n setIsHovered(false);\n setIsModalOpen(true);\n }, []);\n\n if (!notes || notes.length === 0) return null;\n\n const count = notes.length;\n const hasUrgent = notes.some(\n (n) =>\n n.priority &&\n (n.priority.toLowerCase() === \"high\" ||\n n.priority.toLowerCase() === \"critical\"),\n );\n\n return (\n <>\n <div\n className=\"absolute -top-2.5 -right-2.5 z-30 nopan nodrag\"\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n onPointerDown={(e) => e.stopPropagation()}\n >\n {/* Count badge */}\n <div\n className=\"flex items-center justify-center cursor-pointer\"\n onClick={handleClick}\n style={{\n width: 22,\n height: 22,\n borderRadius: \"50%\",\n background: hasUrgent\n ? \"linear-gradient(135deg, #ef4444, #dc2626)\"\n : `linear-gradient(135deg, ${AMBER[400]}, ${AMBER[500]})`,\n boxShadow: `0 0 0 2.5px rgb(var(--ec-card-bg)), 0 2px 6px rgba(0,0,0,0.15)`,\n transition: \"transform 0.15s ease\",\n transform: isHovered ? \"scale(1.15)\" : \"scale(1)\",\n }}\n >\n <span\n style={{\n fontSize: 11,\n fontWeight: 800,\n color: \"white\",\n lineHeight: 1,\n }}\n >\n {count}\n </span>\n </div>\n\n {/* Hover popover */}\n {isHovered && !isModalOpen && (\n <div\n className=\"absolute top-full right-0 mt-2 pointer-events-none\"\n style={{ minWidth: 200, maxWidth: 250, zIndex: 50 }}\n >\n <div\n style={{\n background: \"rgb(var(--ec-card-bg))\",\n borderRadius: 10,\n border: `1px solid ${AMBER[200]}`,\n boxShadow:\n \"0 4px 20px rgba(0,0,0,0.1), 0 1px 3px rgba(0,0,0,0.06)\",\n overflow: \"hidden\",\n }}\n >\n {/* Header */}\n <div\n style={{\n padding: \"6px 10px\",\n background: AMBER[50],\n borderBottom: `1px solid ${AMBER[200]}`,\n display: \"flex\",\n alignItems: \"center\",\n gap: 5,\n }}\n >\n <MessageCircle\n style={{ width: 10, height: 10, color: AMBER[600] }}\n strokeWidth={2.5}\n />\n <span\n style={{\n fontSize: 9,\n fontWeight: 700,\n color: AMBER[800],\n flex: 1,\n letterSpacing: \"0.01em\",\n }}\n >\n {count} note{count !== 1 ? \"s\" : \"\"}\n </span>\n <span\n style={{\n fontSize: 8,\n color: AMBER[600],\n fontWeight: 500,\n opacity: 0.8,\n }}\n >\n click to open\n </span>\n </div>\n\n {/* List */}\n <div style={{ maxHeight: 150, overflowY: \"auto\" }}>\n {notes.slice(0, 3).map((note, i) => (\n <PopoverCard\n key={i}\n note={note}\n last={i === Math.min(count, 3) - 1 && count <= 3}\n />\n ))}\n </div>\n\n {count > 3 && (\n <div\n style={{\n padding: \"5px 10px\",\n borderTop: \"1px solid rgb(var(--ec-page-border))\",\n textAlign: \"center\",\n }}\n >\n <span\n style={{\n fontSize: 8,\n fontWeight: 600,\n color: \"#94a3b8\",\n }}\n >\n +{count - 3} more\n </span>\n </div>\n )}\n </div>\n\n {/* Arrow pointing up */}\n <div\n style={{\n position: \"absolute\",\n top: -5,\n right: 10,\n width: 10,\n height: 10,\n background: \"rgb(var(--ec-card-bg))\",\n border: `1px solid ${AMBER[200]}`,\n borderRight: \"none\",\n borderBottom: \"none\",\n transform: \"rotate(45deg)\",\n zIndex: 1,\n }}\n />\n </div>\n )}\n </div>\n\n <NotesModal\n notes={notes}\n isOpen={isModalOpen}\n onClose={() => setIsModalOpen(false)}\n resourceName={resourceName}\n />\n </>\n );\n});\n","import { memo, useMemo, useState, useCallback } from \"react\";\nimport { Zap, MessageCircle } from \"lucide-react\";\nimport {\n OwnerIndicator,\n normalizeOwners,\n HIDDEN_HANDLE_STYLE,\n} from \"../OwnerIndicator\";\nimport { Node, Handle, Position, useHandleConnections } from \"@xyflow/react\";\nimport { Message, EventCatalogResource } from \"../../types\";\nimport { NotesIndicator, NotesModal } from \"../NotesIndicator\";\nimport {\n LINE_CLAMP_STYLE,\n FOLDED_CORNER_SHADOW_STYLE,\n useDarkMode,\n} from \"../shared-styles\";\n\nconst GlowHandle = memo(function GlowHandle({\n side,\n}: {\n side: \"left\" | \"right\";\n}) {\n return (\n <div\n style={{\n position: \"absolute\",\n top: \"50%\",\n [side]: -6,\n transform: \"translateY(-50%)\",\n width: 12,\n height: 12,\n borderRadius: \"50%\",\n background: \"linear-gradient(135deg, #fb923c, #ea580c)\",\n border: \"2px solid rgb(var(--ec-page-bg))\",\n zIndex: 20,\n animation: \"ec-handle-pulse 2s ease-in-out infinite\",\n pointerEvents: \"none\",\n }}\n />\n );\n});\n\nfunction classNames(...classes: any) {\n return classes.filter(Boolean).join(\" \");\n}\n\ntype MessageNodeData = EventCatalogResource & {\n message: Message;\n};\n\nexport type EventNode = Node<MessageNodeData, \"event\">;\n\nfunction BottomRightNotes({\n notes,\n resourceName,\n resourceVersion,\n isDark,\n}: {\n notes: any[];\n resourceName: string;\n resourceVersion?: string;\n isDark: boolean;\n}) {\n const [isModalOpen, setIsModalOpen] = useState(false);\n const handleClick = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n setIsModalOpen(true);\n }, []);\n\n const count = notes.length;\n const hasUrgent = notes.some(\n (n: any) =>\n n.priority &&\n (n.priority.toLowerCase() === \"high\" ||\n n.priority.toLowerCase() === \"critical\"),\n );\n\n return (\n <div\n className=\"nopan nodrag shrink-0 ml-auto\"\n onPointerDown={(e) => e.stopPropagation()}\n onClick={(e) => e.stopPropagation()}\n >\n <div\n className=\"cursor-pointer\"\n onClick={handleClick}\n style={{\n position: \"relative\",\n width: 26,\n height: 26,\n transition: \"transform 0.15s ease\",\n filter: hasUrgent\n ? \"drop-shadow(0 1px 4px rgba(239,68,68,0.4))\"\n : \"drop-shadow(0 1px 4px rgba(251,191,36,0.4))\",\n }}\n onMouseEnter={(e) => (e.currentTarget.style.transform = \"scale(1.1)\")}\n onMouseLeave={(e) => (e.currentTarget.style.transform = \"scale(1)\")}\n >\n <svg width=\"26\" height=\"26\" viewBox=\"0 0 26 26\" fill=\"none\">\n <path\n d=\"M3 4C3 2.34 4.34 1 6 1h14c1.66 0 3 1.34 3 3v12c0 1.66-1.34 3-3 3H9l-4.3 4.3c-.6.6-1.7.2-1.7-.7V4z\"\n fill={hasUrgent ? \"#ef4444\" : \"#f59e0b\"}\n />\n </svg>\n <span\n style={{\n position: \"absolute\",\n top: \"38%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n fontSize: 10,\n fontWeight: 800,\n color: \"white\",\n lineHeight: 1,\n }}\n >\n {count}\n </span>\n </div>\n\n <NotesModal\n notes={notes}\n isOpen={isModalOpen}\n onClose={() => setIsModalOpen(false)}\n resourceName={resourceName}\n resourceVersion={resourceVersion}\n resourceType=\"Event\"\n accentColor=\"linear-gradient(135deg, #fb923c, #ea580c)\"\n icon={\n <Zap\n style={{ width: 18, height: 18, color: \"white\" }}\n strokeWidth={2.5}\n />\n }\n />\n </div>\n );\n}\n\nfunction PostItEvent(props: EventNode) {\n const { version, name, summary, deprecated, draft, notes } =\n props?.data?.message;\n const mode = props?.data?.mode || \"simple\";\n\n return (\n <div\n className={classNames(\n \"relative min-w-44 max-w-56 min-h-[120px]\",\n props?.selected ? \"ring-2 ring-orange-400/60 ring-offset-1\" : \"\",\n )}\n >\n <Handle\n type=\"target\"\n position={Position.Left}\n style={HIDDEN_HANDLE_STYLE}\n />\n <Handle\n type=\"source\"\n position={Position.Right}\n style={HIDDEN_HANDLE_STYLE}\n />\n {notes && notes.length > 0 && (\n <NotesIndicator notes={notes} resourceName={name} />\n )}\n {/* Inner wrapper with rotation — keeps handles aligned to the unrotated bounding box */}\n <div\n className=\"absolute inset-0\"\n style={{\n background:\n \"linear-gradient(135deg, #fed7aa 0%, #fdba74 40%, #fb923c 100%)\",\n boxShadow:\n \"1px 1px 3px rgba(0,0,0,0.15), 3px 4px 8px rgba(0,0,0,0.08)\",\n transform: \"rotate(-1deg)\",\n border: deprecated\n ? \"2px dashed rgba(239, 68, 68, 0.5)\"\n : draft\n ? \"2px dashed rgba(251, 146, 60, 0.5)\"\n : \"none\",\n }}\n >\n {/* Folded corner */}\n <div style={FOLDED_CORNER_SHADOW_STYLE} />\n <div\n style={{\n position: \"absolute\",\n top: 0,\n right: 0,\n width: 0,\n height: 0,\n borderStyle: \"solid\",\n borderWidth: \"18px 0 0 18px\",\n borderColor: \"#f97316 transparent transparent transparent\",\n opacity: 0.3,\n }}\n />\n </div>\n\n {/* Content sits on top, unrotated, so text stays crisp */}\n <div className=\"relative px-3.5 py-3\">\n {/* Type label row */}\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center gap-1\">\n <Zap className=\"w-3 h-3 text-orange-900/50\" strokeWidth={2.5} />\n <span className=\"text-[8px] font-bold text-orange-900/50 uppercase tracking-widest\">\n Event\n </span>\n </div>\n {draft && (\n <span className=\"text-[8px] font-extrabold text-amber-900 bg-amber-100 border border-dashed border-amber-400 px-1.5 py-0.5 rounded uppercase\">\n Draft\n </span>\n )}\n {deprecated && (\n <span className=\"text-[7px] font-bold text-white bg-red-500 border border-red-600 px-1.5 py-0.5 rounded uppercase\">\n Deprecated\n </span>\n )}\n </div>\n\n {/* Name */}\n <div\n className={classNames(\n \"text-[13px] font-bold leading-snug\",\n deprecated ? \"text-orange-950/40 line-through\" : \"text-orange-950\",\n )}\n >\n {name}\n </div>\n\n {/* Version */}\n {version && (\n <div className=\"text-[9px] text-orange-900/40 font-semibold mt-0.5\">\n v{version}\n </div>\n )}\n\n {/* Summary */}\n {mode === \"full\" && summary && (\n <div\n className=\"mt-2 pt-1.5 border-t border-orange-900/10 text-[9px] text-orange-950/60 leading-relaxed overflow-hidden\"\n style={LINE_CLAMP_STYLE}\n title={summary}\n >\n {summary}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction DefaultEvent(props: EventNode) {\n const { version, name, summary, deprecated, draft, schema, notes } =\n props?.data?.message;\n const mode = props?.data?.mode || \"simple\";\n const owners = useMemo(\n () => normalizeOwners(props?.data?.message?.owners),\n [props?.data?.message?.owners],\n );\n const targetConnections = useHandleConnections({ type: \"target\" });\n const sourceConnections = useHandleConnections({ type: \"source\" });\n const isDark = useDarkMode();\n const deprecatedStripe = isDark\n ? \"rgba(239,68,68,0.25)\"\n : \"rgba(239,68,68,0.1)\";\n\n return (\n <div\n className={classNames(\n \"relative min-w-48 max-w-60 rounded-xl border-2 overflow-visible\",\n props?.selected ? \"ring-2 ring-orange-400/60 ring-offset-2\" : \"\",\n deprecated\n ? \"border-dashed border-red-500\"\n : draft\n ? `border-dashed ${isDark ? \"border-orange-400\" : \"border-orange-400/60\"}`\n : \"border-orange-500\",\n )}\n style={{\n background: deprecated\n ? `repeating-linear-gradient(135deg, transparent, transparent 6px, ${deprecatedStripe} 6px, ${deprecatedStripe} 7px), var(--ec-event-node-bg, rgb(var(--ec-card-bg)))`\n : draft\n ? `repeating-linear-gradient(135deg, transparent, transparent 4px, ${isDark ? \"rgba(251,146,60,0.25)\" : \"rgba(251,146,60,0.15)\"} 4px, ${isDark ? \"rgba(251,146,60,0.25)\" : \"rgba(251,146,60,0.15)\"} 4.5px), repeating-linear-gradient(45deg, transparent, transparent 4px, ${isDark ? \"rgba(251,146,60,0.25)\" : \"rgba(251,146,60,0.15)\"} 4px, ${isDark ? \"rgba(251,146,60,0.25)\" : \"rgba(251,146,60,0.15)\"} 4.5px), var(--ec-event-node-bg, rgb(var(--ec-card-bg)))`\n : \"var(--ec-event-node-bg, rgb(var(--ec-card-bg)))\",\n boxShadow: \"0 2px 12px rgba(251, 146, 60, 0.15)\",\n }}\n >\n <Handle\n type=\"target\"\n position={Position.Left}\n style={HIDDEN_HANDLE_STYLE}\n />\n <Handle\n type=\"source\"\n position={Position.Right}\n style={HIDDEN_HANDLE_STYLE}\n />\n {targetConnections.length > 0 && <GlowHandle side=\"left\" />}\n {sourceConnections.length > 0 && <GlowHandle side=\"right\" />}\n\n {/* Type badge top-left */}\n <div className=\"absolute -top-2.5 left-2.5 z-10\">\n <span\n className={classNames(\n \"inline-flex items-center gap-1 text-[7px] font-bold uppercase tracking-widest text-white px-1.5 py-0.5 rounded shadow-sm\",\n deprecated ? \"bg-red-500\" : \"bg-orange-500\",\n )}\n >\n <Zap className=\"w-2.5 h-2.5\" strokeWidth={2.5} />\n Event{draft && \" (Draft)\"}\n {deprecated && \" (Deprecated)\"}\n </span>\n </div>\n {/* Schema badge top-right */}\n {schema && (\n <span\n className=\"z-10 text-[7px] font-semibold text-[rgb(var(--ec-page-text))] bg-[rgb(var(--ec-card-bg))] border border-orange-500 rounded-full px-1.5 py-0.5 uppercase tracking-wide\"\n style={{ position: \"absolute\", top: -8, right: 10 }}\n >\n {schema.includes(\".\") ? schema.split(\".\").pop() : schema}\n </span>\n )}\n\n <div className=\"px-3 pt-3.5 pb-2.5\">\n {/* Name + version */}\n <div className=\"flex items-baseline gap-1\">\n <span className=\"text-[13px] font-semibold leading-snug text-[rgb(var(--ec-page-text))]\">\n {name}\n </span>\n {version && (\n <span\n className=\"text-[10px] font-normal shrink-0\"\n style={{ color: isDark ? \"#dce3eb\" : \"#6b7280\" }}\n >\n (v{version})\n </span>\n )}\n </div>\n\n {/* Summary */}\n {mode === \"full\" && summary && (\n <div\n className=\"mt-1.5 text-[9px] leading-relaxed overflow-hidden\"\n style={{\n ...LINE_CLAMP_STYLE,\n color: isDark ? \"#f0f4f8\" : \"#374151\",\n }}\n title={summary}\n >\n {summary}\n </div>\n )}\n\n {/* Owners + Notes row */}\n <div className=\"flex items-end justify-between\">\n <OwnerIndicator\n owners={owners}\n accentColor=\"bg-orange-400\"\n borderColor=\"rgba(251,146,60,0.08)\"\n iconClass=\"text-orange-300\"\n />\n {notes && notes.length > 0 && (\n <BottomRightNotes\n notes={notes}\n resourceName={name}\n resourceVersion={version}\n isDark={isDark}\n />\n )}\n </div>\n </div>\n </div>\n );\n}\n\nexport default memo(function Event(props: EventNode) {\n const nodeStyle = props?.data?.style;\n\n if (nodeStyle === \"post-it\") {\n return <PostItEvent {...props} />;\n }\n\n return <DefaultEvent {...props} />;\n});\n","import { Connection, MarkerType } from \"@xyflow/react\";\nimport { Zap } from \"lucide-react\";\nimport { NodeConfiguration } from \"../../types\";\nimport { SERVICE, CHANNEL, EVENT } from \"../node-types\";\n\nexport default {\n type: \"event\",\n icon: Zap,\n color: \"orange\",\n targetCanConnectTo: [...SERVICE, ...CHANNEL],\n sourceCanConnectTo: [...SERVICE, ...CHANNEL],\n validateConnection: (connection: Connection) => {\n return connection.source !== connection.target;\n },\n getEdgeOptions: (connection: Connection) => {\n if (\n EVENT.includes(connection.source) &&\n SERVICE.includes(connection.target)\n ) {\n return {\n label: \"Publishes\",\n markerEnd: { type: MarkerType.ArrowClosed, color: \"#000000\" },\n };\n }\n return {\n label: \"Subscribes\",\n markerEnd: { type: MarkerType.ArrowClosed, color: \"#000000\" },\n };\n },\n defaultData: {\n name: \"New Event\",\n version: \"0.0.1\",\n summary: \"New event. Click edit to change the details.\",\n mode: \"full\",\n },\n editor: {\n title: \"Event\",\n subtitle: \"Edit the details of the event\",\n schema: {\n type: \"object\",\n required: [\"name\", \"version\"],\n properties: {\n name: {\n type: \"string\",\n title: \"Name\",\n default: \"Random value\",\n description:\n \"The name of the event. Use a verb-noun format (e.g., OrderPlaced).\",\n },\n version: {\n type: \"string\",\n title: \"Version\",\n default: \"1.0.0\",\n description: \"The version number (e.g., 1.0.0)\",\n pattern: \"^\\\\d+\\\\.\\\\d+\\\\.\\\\d+(?:-[\\\\w.-]+)?(?:\\\\+[\\\\w.-]+)?$\",\n },\n summary: {\n type: \"string\",\n title: \"Summary\",\n default: \"\",\n description: \"A brief summary of the event\",\n },\n },\n },\n },\n} as NodeConfiguration;\n","export const SERVICE = [\"service\", \"services\"];\nexport const EVENT = [\"event\", \"events\"];\nexport const QUERY = [\"queries\", \"query\", \"querie\"];\nexport const COMMAND = [\"command\", \"commands\"];\nexport const CHANNEL = [\"channel\", \"channels\"];\nexport const ACTOR = [\"actor\", \"actors\"];\nexport const DATA = [\"data\"];\nexport const VIEW = [\"view\"];\n\nexport const MESSAGE = [...EVENT, ...COMMAND, ...QUERY];\n","import { memo, useMemo } from \"react\";\nimport { Search } from \"lucide-react\";\nimport {\n OwnerIndicator,\n normalizeOwners,\n HIDDEN_HANDLE_STYLE,\n} from \"../OwnerIndicator\";\nimport { Node, Handle, Position, useHandleConnections } from \"@xyflow/react\";\nimport { Message, EventCatalogResource } from \"../../types\";\nimport { NotesIndicator } from \"../NotesIndicator\";\nimport {\n LINE_CLAMP_STYLE,\n FOLDED_CORNER_SHADOW_STYLE,\n useDarkMode,\n} from \"../shared-styles\";\n\nconst GlowHandle = memo(function GlowHandle({\n side,\n}: {\n side: \"left\" | \"right\";\n}) {\n return (\n <div\n style={{\n position: \"absolute\",\n top: \"50%\",\n [side]: -6,\n transform: \"translateY(-50%)\",\n width: 12,\n height: 12,\n borderRadius: \"50%\",\n background: \"linear-gradient(135deg, #22c55e, #15803d)\",\n border: \"2px solid rgb(var(--ec-page-bg))\",\n zIndex: 20,\n animation: \"ec-query-handle-pulse 2s ease-in-out infinite\",\n pointerEvents: \"none\",\n }}\n />\n );\n});\n\nfunction classNames(...classes: any) {\n return classes.filter(Boolean).join(\" \");\n}\n\ntype QueryNodeData = EventCatalogResource & {\n message: Message;\n};\n\nexport type QueryNode = Node<QueryNodeData, \"query\">;\n\nfunction PostItQuery(props: QueryNode) {\n const { version, name, summary, deprecated, draft, notes } =\n props.data.message;\n const mode = props.data.mode || \"simple\";\n\n return (\n <div\n className={classNames(\n \"relative min-w-44 max-w-56 min-h-[120px]\",\n props?.selected ? \"ring-2 ring-green-400/60 ring-offset-1\" : \"\",\n )}\n >\n <Handle\n type=\"target\"\n position={Position.Left}\n style={HIDDEN_HANDLE_STYLE}\n />\n <Handle\n type=\"source\"\n position={Position.Right}\n style={HIDDEN_HANDLE_STYLE}\n />\n {notes && notes.length > 0 && (\n <NotesIndicator notes={notes} resourceName={name} />\n )}\n <div\n className=\"absolute inset-0\"\n style={{\n background:\n \"linear-gradient(135deg, #bbf7d0 0%, #86efac 40%, #22c55e 100%)\",\n boxShadow:\n \"1px 1px 3px rgba(0,0,0,0.15), 3px 4px 8px rgba(0,0,0,0.08)\",\n transform: \"rotate(-1deg)\",\n border: deprecated\n ? \"2px dashed rgba(239, 68, 68, 0.5)\"\n : draft\n ? \"2px dashed rgba(34, 197, 94, 0.5)\"\n : \"none\",\n }}\n >\n {/* Folded corner */}\n <div style={FOLDED_CORNER_SHADOW_STYLE} />\n <div\n style={{\n position: \"absolute\",\n top: 0,\n right: 0,\n width: 0,\n height: 0,\n borderStyle: \"solid\",\n borderWidth: \"18px 0 0 18px\",\n borderColor: \"#16a34a transparent transparent transparent\",\n opacity: 0.3,\n }}\n />\n </div>\n\n <div className=\"relative px-3.5 py-3\">\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center gap-1\">\n <Search className=\"w-3 h-3 text-green-900/50\" strokeWidth={2.5} />\n <span className=\"text-[8px] font-bold text-green-900/50 uppercase tracking-widest\">\n Query\n </span>\n </div>\n {draft && (\n <span className=\"text-[8px] font-extrabold text-amber-900 bg-amber-100 border border-dashed border-amber-400 px-1.5 py-0.5 rounded uppercase\">\n Draft\n </span>\n )}\n {deprecated && (\n <span className=\"text-[7px] font-bold text-white bg-red-500 border border-red-600 px-1.5 py-0.5 rounded uppercase\">\n Deprecated\n </span>\n )}\n </div>\n\n <div\n className={classNames(\n \"text-[13px] font-bold leading-snug\",\n deprecated ? \"text-green-950/40 line-through\" : \"text-green-950\",\n )}\n >\n {name}\n </div>\n\n {version && (\n <div className=\"text-[9px] text-green-900/40 font-semibold mt-0.5\">\n v{version}\n </div>\n )}\n\n {mode === \"full\" && summary && (\n <div\n className=\"mt-2 pt-1.5 border-t border-green-900/10 text-[9px] text-green-950/60 leading-relaxed overflow-hidden\"\n style={LINE_CLAMP_STYLE}\n title={summary}\n >\n {summary}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction DefaultQuery(props: QueryNode) {\n const { version, name, summary, deprecated, draft, schema, notes } =\n props.data.message;\n const mode = props.data.mode || \"simple\";\n const owners = useMemo(\n () => normalizeOwners(props.data.message?.owners),\n [props.data.message?.owners],\n );\n const targetConnections = useHandleConnections({ type: \"target\" });\n const sourceConnections = useHandleConnections({ type: \"source\" });\n const isDark = useDarkMode();\n const deprecatedStripe = isDark\n ? \"rgba(239,68,68,0.25)\"\n : \"rgba(239,68,68,0.1)\";\n\n return (\n <div\n className={classNames(\n \"relative min-w-48 max-w-60 rounded-xl border-2 overflow-visible\",\n props?.selected ? \"ring-2 ring-green-400/60 ring-offset-2\" : \"\",\n deprecated\n ? \"border-dashed border-red-500\"\n : draft\n ? `border-dashed ${isDark ? \"border-green-400\" : \"border-green-400/60\"}`\n : \"border-green-500\",\n )}\n style={{\n background: deprecated\n ? `repeating-linear-gradient(135deg, transparent, transparent 6px, ${deprecatedStripe} 6px, ${deprecatedStripe} 7px), var(--ec-query-node-bg, rgb(var(--ec-card-bg)))`\n : draft\n ? `repeating-linear-gradient(135deg, transparent, transparent 4px, ${isDark ? \"rgba(34,197,94,0.25)\" : \"rgba(34,197,94,0.15)\"} 4px, ${isDark ? \"rgba(34,197,94,0.25)\" : \"rgba(34,197,94,0.15)\"} 4.5px), repeating-linear-gradient(45deg, transparent, transparent 4px, ${isDark ? \"rgba(34,197,94,0.25)\" : \"rgba(34,197,94,0.15)\"} 4px, ${isDark ? \"rgba(34,197,94,0.25)\" : \"rgba(34,197,94,0.15)\"} 4.5px), var(--ec-query-node-bg, rgb(var(--ec-card-bg)))`\n : \"var(--ec-query-node-bg, rgb(var(--ec-card-bg)))\",\n boxShadow: \"0 2px 12px rgba(34, 197, 94, 0.15)\",\n }}\n >\n <Handle\n type=\"target\"\n position={Position.Left}\n style={HIDDEN_HANDLE_STYLE}\n />\n <Handle\n type=\"source\"\n position={Position.Right}\n style={HIDDEN_HANDLE_STYLE}\n />\n {notes && notes.length > 0 && (\n <NotesIndicator notes={notes} resourceName={name} />\n )}\n {targetConnections.length > 0 && <GlowHandle side=\"left\" />}\n {sourceConnections.length > 0 && <GlowHandle side=\"right\" />}\n\n {/* Type badge top-left */}\n <div className=\"absolute -top-2.5 left-2.5 z-10\">\n <span\n className={classNames(\n \"inline-flex items-center gap-1 text-[7px] font-bold uppercase tracking-widest text-white px-1.5 py-0.5 rounded shadow-sm\",\n deprecated ? \"bg-red-500\" : \"bg-green-500\",\n )}\n >\n <Search className=\"w-2.5 h-2.5\" strokeWidth={2.5} />\n Query{draft && \" (Draft)\"}\n {deprecated && \" (Deprecated)\"}\n </span>\n </div>\n {/* Schema badge top-right */}\n {schema && (\n <span\n className=\"z-10 text-[7px] font-semibold text-[rgb(var(--ec-page-text))] bg-[rgb(var(--ec-card-bg))] border border-green-500 rounded-full px-1.5 py-0.5 uppercase tracking-wide\"\n style={{ position: \"absolute\", top: -8, right: 10 }}\n >\n {schema.includes(\".\") ? schema.split(\".\").pop() : schema}\n </span>\n )}\n\n <div className=\"px-3 pt-3.5 pb-2.5\">\n {/* Name + version */}\n <div className=\"flex items-baseline gap-1\">\n <span className=\"text-[13px] font-semibold leading-snug text-[rgb(var(--ec-page-text))]\">\n {name}\n </span>\n {version && (\n <span className=\"text-[10px] font-normal text-[rgb(var(--ec-page-text-muted))] shrink-0\">\n (v{version})\n </span>\n )}\n </div>\n\n {/* Summary */}\n {mode === \"full\" && summary && (\n <div\n className=\"mt-1.5 text-[9px] text-[rgb(var(--ec-page-text-muted))] leading-relaxed overflow-hidden\"\n style={LINE_CLAMP_STYLE}\n title={summary}\n >\n {summary}\n </div>\n )}\n\n {/* Owners */}\n <OwnerIndicator\n owners={owners}\n accentColor=\"bg-green-400\"\n borderColor=\"rgba(34,197,94,0.08)\"\n iconClass=\"text-green-300\"\n />\n </div>\n </div>\n );\n}\n\nexport default memo(function Query(props: QueryNode) {\n const nodeStyle = props?.data?.style;\n\n if (nodeStyle === \"post-it\") {\n return <PostItQuery {...props} />;\n }\n\n return <DefaultQuery {...props} />;\n});\n","import { memo, useMemo } from \"react\";\nimport { MessageSquare } from \"lucide-react\";\nimport {\n OwnerIndicator,\n normalizeOwners,\n HIDDEN_HANDLE_STYLE,\n} from \"../OwnerIndicator\";\nimport { Node, Handle, Position, useHandleConnections } from \"@xyflow/react\";\nimport { Message, EventCatalogResource } from \"../../types\";\nimport { NotesIndicator } from \"../NotesIndicator\";\nimport {\n LINE_CLAMP_STYLE,\n FOLDED_CORNER_SHADOW_STYLE,\n useDarkMode,\n} from \"../shared-styles\";\n\nconst GlowHandle = memo(function GlowHandle({\n side,\n}: {\n side: \"left\" | \"right\";\n}) {\n return (\n <div\n style={{\n position: \"absolute\",\n top: \"50%\",\n [side]: -6,\n transform: \"translateY(-50%)\",\n width: 12,\n height: 12,\n borderRadius: \"50%\",\n background: \"linear-gradient(135deg, #3b82f6, #1d4ed8)\",\n border: \"2px solid rgb(var(--ec-page-bg))\",\n zIndex: 20,\n animation: \"ec-command-handle-pulse 2s ease-in-out infinite\",\n pointerEvents: \"none\",\n }}\n />\n );\n});\n\nfunction classNames(...classes: any) {\n return classes.filter(Boolean).join(\" \");\n}\n\ntype CommandNodeData = EventCatalogResource & {\n message: Message;\n};\n\nexport type CommandNode = Node<CommandNodeData, \"command\">;\n\nfunction PostItCommand(props: CommandNode) {\n const { version, name, summary, deprecated, draft, notes } =\n props.data.message;\n const mode = props.data.mode || \"simple\";\n\n return (\n <div\n className={classNames(\n \"relative min-w-44 max-w-56 min-h-[120px]\",\n props?.selected ? \"ring-2 ring-blue-400/60 ring-offset-1\" : \"\",\n )}\n >\n <Handle\n type=\"target\"\n position={Position.Left}\n style={HIDDEN_HANDLE_STYLE}\n />\n <Handle\n type=\"source\"\n position={Position.Right}\n style={HIDDEN_HANDLE_STYLE}\n />\n {notes && notes.length > 0 && (\n <NotesIndicator notes={notes} resourceName={name} />\n )}\n <div\n className=\"absolute inset-0\"\n style={{\n background:\n \"linear-gradient(135deg, #bfdbfe 0%, #93c5fd 40%, #3b82f6 100%)\",\n boxShadow:\n \"1px 1px 3px rgba(0,0,0,0.15), 3px 4px 8px rgba(0,0,0,0.08)\",\n transform: \"rotate(-1deg)\",\n border: deprecated\n ? \"2px dashed rgba(239, 68, 68, 0.5)\"\n : draft\n ? \"2px dashed rgba(59, 130, 246, 0.5)\"\n : \"none\",\n }}\n >\n {/* Folded corner */}\n <div style={FOLDED_CORNER_SHADOW_STYLE} />\n <div\n style={{\n position: \"absolute\",\n top: 0,\n right: 0,\n width: 0,\n height: 0,\n borderStyle: \"solid\",\n borderWidth: \"18px 0 0 18px\",\n borderColor: \"#1d4ed8 transparent transparent transparent\",\n opacity: 0.3,\n }}\n />\n </div>\n\n <div className=\"relative px-3.5 py-3\">\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center gap-1\">\n <MessageSquare\n className=\"w-3 h-3 text-blue-900/50\"\n strokeWidth={2.5}\n />\n <span className=\"text-[8px] font-bold text-blue-900/50 uppercase tracking-widest\">\n Command\n </span>\n </div>\n {draft && (\n <span className=\"text-[8px] font-extrabold text-amber-900 bg-amber-100 border border-dashed border-amber-400 px-1.5 py-0.5 rounded uppercase\">\n Draft\n </span>\n )}\n {deprecated && (\n <span className=\"text-[7px] font-bold text-white bg-red-500 border border-red-600 px-1.5 py-0.5 rounded uppercase\">\n Deprecated\n </span>\n )}\n </div>\n\n <div\n className={classNames(\n \"text-[13px] font-bold leading-snug\",\n deprecated ? \"text-blue-950/40 line-through\" : \"text-blue-950\",\n )}\n >\n {name}\n </div>\n\n {version && (\n <div className=\"text-[9px] text-blue-900/40 font-semibold mt-0.5\">\n v{version}\n </div>\n )}\n\n {mode === \"full\" && summary && (\n <div\n className=\"mt-2 pt-1.5 border-t border-blue-900/10 text-[9px] text-blue-950/60 leading-relaxed overflow-hidden\"\n style={LINE_CLAMP_STYLE}\n title={summary}\n >\n {summary}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction DefaultCommand(props: CommandNode) {\n const { version, name, summary, deprecated, draft, schema, notes } =\n props.data.message;\n const mode = props.data.mode || \"simple\";\n const owners = useMemo(\n () => normalizeOwners(props.data.message?.owners),\n [props.data.message?.owners],\n );\n const targetConnections = useHandleConnections({ type: \"target\" });\n const sourceConnections = useHandleConnections({ type: \"source\" });\n const isDark = useDarkMode();\n const deprecatedStripe = isDark\n ? \"rgba(239,68,68,0.25)\"\n : \"rgba(239,68,68,0.1)\";\n\n return (\n <div\n className={classNames(\n \"relative min-w-48 max-w-60 rounded-xl border-2 overflow-visible\",\n props?.selected ? \"ring-2 ring-blue-400/60 ring-offset-2\" : \"\",\n deprecated\n ? \"border-dashed border-red-500\"\n : draft\n ? `border-dashed ${isDark ? \"border-blue-400\" : \"border-blue-400/60\"}`\n : \"border-blue-500\",\n )}\n style={{\n background: deprecated\n ? `repeating-linear-gradient(135deg, transparent, transparent 6px, ${deprecatedStripe} 6px, ${deprecatedStripe} 7px), var(--ec-command-node-bg, rgb(var(--ec-card-bg)))`\n : draft\n ? `repeating-linear-gradient(135deg, transparent, transparent 4px, ${isDark ? \"rgba(59,130,246,0.25)\" : \"rgba(59,130,246,0.15)\"} 4px, ${isDark ? \"rgba(59,130,246,0.25)\" : \"rgba(59,130,246,0.15)\"} 4.5px), repeating-linear-gradient(45deg, transparent, transparent 4px, ${isDark ? \"rgba(59,130,246,0.25)\" : \"rgba(59,130,246,0.15)\"} 4px, ${isDark ? \"rgba(59,130,246,0.25)\" : \"rgba(59,130,246,0.15)\"} 4.5px), var(--ec-command-node-bg, rgb(var(--ec-card-bg)))`\n : \"var(--ec-command-node-bg, rgb(var(--ec-card-bg)))\",\n boxShadow: \"0 2px 12px rgba(59, 130, 246, 0.15)\",\n }}\n >\n <Handle\n type=\"target\"\n position={Position.Left}\n style={HIDDEN_HANDLE_STYLE}\n />\n <Handle\n type=\"source\"\n position={Position.Right}\n style={HIDDEN_HANDLE_STYLE}\n />\n {notes && notes.length > 0 && (\n <NotesIndicator notes={notes} resourceName={name} />\n )}\n {targetConnections.length > 0 && <GlowHandle side=\"left\" />}\n {sourceConnections.length > 0 && <GlowHandle side=\"right\" />}\n\n {/* Type badge top-left */}\n <div className=\"absolute -top-2.5 left-2.5 z-10\">\n <span\n className={classNames(\n \"inline-flex items-center gap-1 text-[7px] font-bold uppercase tracking-widest text-white px-1.5 py-0.5 rounded shadow-sm\",\n deprecated ? \"bg-red-500\" : \"bg-blue-500\",\n )}\n >\n <MessageSquare className=\"w-2.5 h-2.5\" strokeWidth={2.5} />\n Command{draft && \" (Draft)\"}\n {deprecated && \" (Deprecated)\"}\n </span>\n </div>\n {/* Schema badge top-right */}\n {schema && (\n <span\n className=\"z-10 text-[7px] font-semibold text-[rgb(var(--ec-page-text))] bg-[rgb(var(--ec-card-bg))] border border-blue-500 rounded-full px-1.5 py-0.5 uppercase tracking-wide\"\n style={{ position: \"absolute\", top: -8, right: 10 }}\n >\n {schema.includes(\".\") ? schema.split(\".\").pop() : schema}\n </span>\n )}\n\n <div className=\"px-3 pt-3.5 pb-2.5\">\n {/* Name + version */}\n <div className=\"flex items-baseline gap-1\">\n <span className=\"text-[13px] font-semibold leading-snug text-[rgb(var(--ec-page-text))]\">\n {name}\n </span>\n {version && (\n <span className=\"text-[10px] font-normal text-[rgb(var(--ec-page-text-muted))] shrink-0\">\n (v{version})\n </span>\n )}\n </div>\n\n {/* Summary */}\n {mode === \"full\" && summary && (\n <div\n className=\"mt-1.5 text-[9px] text-[rgb(var(--ec-page-text-muted))] leading-relaxed overflow-hidden\"\n style={LINE_CLAMP_STYLE}\n title={summary}\n >\n {summary}\n </div>\n )}\n\n {/* Owners */}\n <OwnerIndicator\n owners={owners}\n accentColor=\"bg-blue-400\"\n borderColor=\"rgba(59,130,246,0.08)\"\n iconClass=\"text-blue-300\"\n />\n </div>\n </div>\n );\n}\n\nexport default memo(function Command(props: CommandNode) {\n const nodeStyle = props?.data?.style;\n\n if (nodeStyle === \"post-it\") {\n return <PostItCommand {...props} />;\n }\n\n return <DefaultCommand {...props} />;\n});\n","import { ArrowRightLeft, Link } from \"lucide-react\";\nimport {\n OwnerIndicator,\n normalizeOwners,\n HIDDEN_HANDLE_STYLE,\n} from \"../OwnerIndicator\";\nimport { Node, Handle, Position, useHandleConnections } from \"@xyflow/react\";\nimport { getIconForProtocol } from \"../../utils/protocols\";\nimport { EventCatalogResource, Channel as ChannelType } from \"../../types\";\nimport { NotesIndicator } from \"../NotesIndicator\";\nimport {\n LINE_CLAMP_STYLE,\n FOLDED_CORNER_SHADOW_STYLE,\n EMPTY_ARRAY,\n useDarkMode,\n} from \"../shared-styles\";\n\nimport { memo, useMemo } from \"react\";\n\nfunction GlowHandle({ side }: { side: \"left\" | \"right\" }) {\n return (\n <div\n style={{\n position: \"absolute\",\n top: \"50%\",\n [side]: -6,\n transform: \"translateY(-50%)\",\n width: 12,\n height: 12,\n borderRadius: \"50%\",\n background: \"linear-gradient(135deg, #6b7280, #374151)\",\n border: \"2px solid rgb(var(--ec-page-bg))\",\n zIndex: 20,\n animation: \"ec-channel-handle-pulse 2s ease-in-out infinite\",\n pointerEvents: \"none\",\n }}\n />\n );\n}\n\ntype ChannelNodeData = EventCatalogResource & {\n channel: ChannelType;\n};\n\nfunction classNames(...classes: any) {\n return classes.filter(Boolean).join(\" \");\n}\n\nexport type ChannelNode = Node<ChannelNodeData, \"channel\">;\n\nfunction PostItChannel(props: ChannelNode) {\n const { data } = props;\n const {\n version,\n name,\n summary,\n deprecated,\n draft,\n protocols = EMPTY_ARRAY,\n notes,\n } = data.channel;\n const mode = props.data.mode || \"simple\";\n const iconEntry = getIconForProtocol(protocols?.[0]);\n\n return (\n <div\n className={classNames(\n \"relative min-w-44 max-w-56 min-h-[120px]\",\n props?.selected ? \"ring-2 ring-gray-400/60 ring-offset-1\" : \"\",\n )}\n >\n <Handle\n type=\"target\"\n position={Position.Left}\n style={HIDDEN_HANDLE_STYLE}\n />\n <Handle\n type=\"source\"\n position={Position.Right}\n style={HIDDEN_HANDLE_STYLE}\n />\n {notes && notes.length > 0 && (\n <NotesIndicator notes={notes} resourceName={name} />\n )}\n <div\n className=\"absolute inset-0\"\n style={{\n background:\n \"linear-gradient(135deg, #e5e7eb 0%, #d1d5db 40%, #6b7280 100%)\",\n boxShadow:\n \"1px 1px 3px rgba(0,0,0,0.15), 3px 4px 8px rgba(0,0,0,0.08)\",\n transform: \"rotate(-1deg)\",\n border: deprecated\n ? \"2px dashed rgba(239, 68, 68, 0.5)\"\n : draft\n ? \"2px dashed rgba(107, 114, 128, 0.5)\"\n : \"none\",\n }}\n >\n {/* Folded corner */}\n <div style={FOLDED_CORNER_SHADOW_STYLE} />\n <div\n style={{\n position: \"absolute\",\n top: 0,\n right: 0,\n width: 0,\n height: 0,\n borderStyle: \"solid\",\n borderWidth: \"18px 0 0 18px\",\n borderColor: \"#374151 transparent transparent transparent\",\n opacity: 0.3,\n }}\n />\n </div>\n\n <div className=\"relative px-3.5 py-3\">\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center gap-1\">\n <ArrowRightLeft\n className=\"w-3 h-3 text-gray-900/50\"\n strokeWidth={2.5}\n />\n <span className=\"text-[8px] font-bold text-gray-900/50 uppercase tracking-widest\">\n Channel\n </span>\n </div>\n <div className=\"flex items-center gap-1\">\n {draft && (\n <span className=\"text-[8px] font-extrabold text-amber-900 bg-amber-100 border border-dashed border-amber-400 px-1.5 py-0.5 rounded uppercase\">\n Draft\n </span>\n )}\n {deprecated && (\n <span className=\"text-[7px] font-bold text-white bg-red-500 border border-red-600 px-1.5 py-0.5 rounded uppercase\">\n Deprecated\n </span>\n )}\n {protocols?.[0] && (\n <span className=\"flex items-center gap-0.5 text-[7px] font-semibold text-gray-900/50 bg-gray-900/10 px-1 py-px rounded uppercase\">\n {protocols[0]}\n </span>\n )}\n </div>\n </div>\n\n <div\n className={classNames(\n \"text-[13px] font-bold leading-snug\",\n deprecated ? \"text-gray-950/40 line-through\" : \"text-gray-950\",\n )}\n >\n {name}\n </div>\n\n {version && (\n <div className=\"text-[9px] text-gray-900/40 font-semibold mt-0.5\">\n v{version}\n </div>\n )}\n\n {mode === \"full\" && summary && (\n <div\n className=\"mt-2 pt-1.5 border-t border-gray-900/10 text-[9px] text-gray-950/60 leading-relaxed overflow-hidden\"\n style={LINE_CLAMP_STYLE}\n title={summary}\n >\n {summary}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction DefaultChannel(props: ChannelNode) {\n const { data } = props;\n const {\n version,\n name,\n summary,\n deprecated,\n draft,\n protocols = EMPTY_ARRAY,\n address,\n notes,\n } = data.channel;\n const mode = props.data.mode || \"simple\";\n const owners = useMemo(\n () => normalizeOwners(data.channel?.owners),\n [data.channel?.owners],\n );\n const sourceConnections = useHandleConnections({ type: \"source\" });\n const targetConnections = useHandleConnections({ type: \"target\" });\n const isDark = useDarkMode();\n const deprecatedStripe = isDark\n ? \"rgba(239,68,68,0.25)\"\n : \"rgba(239,68,68,0.1)\";\n\n return (\n <div\n className={classNames(\n \"relative min-w-48 max-w-60 rounded-xl border-2 overflow-visible\",\n props?.selected ? \"ring-2 ring-gray-400/60 ring-offset-2\" : \"\",\n deprecated\n ? \"border-dashed border-red-500\"\n : draft\n ? `border-dashed ${isDark ? \"border-gray-400\" : \"border-gray-400/60\"}`\n : isDark\n ? \"border-gray-400\"\n : \"border-gray-500\",\n )}\n style={{\n background: deprecated\n ? `repeating-linear-gradient(135deg, transparent, transparent 6px, ${deprecatedStripe} 6px, ${deprecatedStripe} 7px), var(--ec-channel-node-bg, rgb(var(--ec-card-bg)))`\n : draft\n ? `repeating-linear-gradient(135deg, transparent, transparent 4px, ${isDark ? \"rgba(107,114,128,0.25)\" : \"rgba(107,114,128,0.15)\"} 4px, ${isDark ? \"rgba(107,114,128,0.25)\" : \"rgba(107,114,128,0.15)\"} 4.5px), repeating-linear-gradient(45deg, transparent, transparent 4px, ${isDark ? \"rgba(107,114,128,0.25)\" : \"rgba(107,114,128,0.15)\"} 4px, ${isDark ? \"rgba(107,114,128,0.25)\" : \"rgba(107,114,128,0.15)\"} 4.5px), var(--ec-channel-node-bg, rgb(var(--ec-card-bg)))`\n : \"var(--ec-channel-node-bg, rgb(var(--ec-card-bg)))\",\n boxShadow: \"0 2px 12px rgba(107, 114, 128, 0.15)\",\n }}\n >\n <Handle\n type=\"target\"\n position={Position.Left}\n style={HIDDEN_HANDLE_STYLE}\n />\n <Handle\n type=\"source\"\n position={Position.Right}\n style={HIDDEN_HANDLE_STYLE}\n />\n {notes && notes.length > 0 && (\n <NotesIndicator notes={notes} resourceName={name} />\n )}\n {targetConnections.length > 0 && <GlowHandle side=\"left\" />}\n {sourceConnections.length > 0 && <GlowHandle side=\"right\" />}\n\n {/* Type badge top-left */}\n <div className=\"absolute -top-2.5 left-2.5 z-10\">\n <span\n className={classNames(\n \"inline-flex items-center gap-1 text-[7px] font-bold uppercase tracking-widest text-white px-1.5 py-0.5 rounded shadow-sm\",\n deprecated ? \"bg-red-500\" : \"bg-gray-500\",\n )}\n >\n <ArrowRightLeft className=\"w-2.5 h-2.5\" strokeWidth={2.5} />\n Channel{draft && \" (Draft)\"}\n {deprecated && \" (Deprecated)\"}\n </span>\n </div>\n {/* Protocol badge top-right */}\n {protocols?.[0] && (\n <span\n className=\"z-10 text-[7px] font-semibold text-[rgb(var(--ec-page-text))] bg-[rgb(var(--ec-card-bg))] border border-[rgb(var(--ec-page-border))] rounded-full px-1.5 py-0.5 uppercase tracking-wide\"\n style={{ position: \"absolute\", top: -8, right: 10 }}\n >\n {protocols[0]}\n </span>\n )}\n\n <div className=\"px-3 pt-3.5 pb-2.5\">\n {/* Name + version */}\n <div className=\"flex items-baseline gap-1\">\n <span className=\"text-[13px] font-semibold leading-snug text-[rgb(var(--ec-page-text))]\">\n {name}\n </span>\n {version && (\n <span className=\"text-[10px] font-normal text-[rgb(var(--ec-page-text-muted))] shrink-0\">\n (v{version})\n </span>\n )}\n </div>\n\n {/* Summary */}\n {mode === \"full\" && summary && (\n <div\n className=\"mt-1.5 text-[9px] text-[rgb(var(--ec-page-text-muted))] leading-relaxed overflow-hidden\"\n style={LINE_CLAMP_STYLE}\n title={summary}\n >\n {summary}\n </div>\n )}\n\n {/* Address */}\n {mode === \"full\" && address && (\n <div className=\"flex items-center gap-1 mt-1.5\">\n <Link className=\"w-2.5 h-2.5 text-[rgb(var(--ec-page-text-muted))]\" />\n <span className=\"text-[8px] text-[rgb(var(--ec-page-text-muted))] font-mono\">\n {address}\n </span>\n </div>\n )}\n\n {/* Owners */}\n <OwnerIndicator\n owners={owners}\n accentColor=\"bg-gray-400\"\n borderColor=\"rgba(107,114,128,0.08)\"\n iconClass=\"text-gray-300\"\n />\n </div>\n </div>\n );\n}\n\nexport default memo(function Channel(props: ChannelNode) {\n const nodeStyle = props?.data?.style;\n\n if (nodeStyle === \"post-it\") {\n return <PostItChannel {...props} />;\n }\n\n return <DefaultChannel {...props} />;\n});\n","import { Server, Radio, Wifi, Network, Globe, Cloud } from \"lucide-react\";\n\n// AWS Architecture Icons (from official AWS icon set)\n// Source: https://github.com/boyney123/awsicons (MIT)\nfunction AwsEventBridge({ className }: { className?: string }) {\n return (\n <svg viewBox=\"0 0 40 40\" className={className}>\n <defs>\n <linearGradient x1=\"0%\" y1=\"100%\" x2=\"100%\" y2=\"0%\" id=\"eb-g\">\n <stop stopColor=\"#B0084D\" offset=\"0%\" />\n <stop stopColor=\"#FF4F8B\" offset=\"100%\" />\n </linearGradient>\n </defs>\n <rect width=\"40\" height=\"40\" rx=\"4\" fill=\"url(#eb-g)\" />\n <path\n fill=\"#FFF\"\n d=\"M11.056 28.594a2.09 2.09 0 01-2.08-2.096 2.09 2.09 0 012.08-2.095c1.146 0 2.08.94 2.08 2.095a2.09 2.09 0 01-2.08 2.096zm1.857.363a3.093 3.093 0 001.223-2.459c0-1.711-1.382-3.103-3.08-3.103-.42 0-.817.086-1.181.24l-1.799-3.139 2.362-4.122-.865-.504-2.506 4.375a.504.504 0 000 .503l1.966 3.43a3.09 3.09 0 00-1.056 2.32c0 1.712 1.38 3.104 3.079 3.104.342 0 .665-.07.973-.174l1.531 2.844a.5.5 0 00.44.263h5.5v-1.008h-5.203l-1.385-2.57zM29.944 16.56a2.09 2.09 0 01-2.08-2.096 2.09 2.09 0 012.08-2.096 2.09 2.09 0 012.078 2.096 2.09 2.09 0 01-2.079 2.096zm2.023.224a3.095 3.095 0 001.055-2.32c0-1.711-1.38-3.104-3.079-3.104-.34 0-.662.07-.97.173L27.442 8.62A.497.497 0 0027 8.351h-5.5V9.36h5.2l1.39 2.644a3.1 3.1 0 00-1.226 2.462c0 1.71 1.381 3.103 3.08 3.103.42 0 .818-.086 1.18-.24l1.799 3.14-2.362 4.12.866.504 2.505-4.373a.504.504 0 000-.504l-1.965-3.43zm-4.573 16.207a2.09 2.09 0 01-2.08-2.095 2.09 2.09 0 012.08-2.095 2.09 2.09 0 012.079 2.095 2.09 2.09 0 01-2.08 2.095zm-9.19-8.491l-2.293-4.002 2.292-4h4.584l2.294 4-2.294 4.002h-4.584zm-4.568-12.303a2.09 2.09 0 01-2.08-2.095 2.09 2.09 0 012.08-2.095c1.146 0 2.08.94 2.08 2.095a2.09 2.09 0 01-2.08 2.095zm13.758 15.596c-.625 0-1.206.191-1.692.515l-2.07-3.267 2.46-4.29a.504.504 0 000-.504l-2.582-4.505a.498.498 0 00-.433-.252h-4.752l-2.279-3.481a3.088 3.088 0 00.67-1.907c0-1.711-1.382-3.103-3.08-3.103-1.699 0-3.08 1.392-3.08 3.103 0 1.712 1.381 3.103 3.08 3.103a3.04 3.04 0 001.668-.502l2.09 3.194-2.492 4.35a.504.504 0 000 .503l2.58 4.506a.497.497 0 00.433.252h4.828l2.218 3.505A3.092 3.092 0 0027.395 34c1.698 0 3.079-1.393 3.079-3.103 0-1.712-1.381-3.103-3.08-3.103z\"\n />\n </svg>\n );\n}\n\nfunction AwsSqs({ className }: { className?: string }) {\n return (\n <svg viewBox=\"0 0 40 40\" className={className}>\n <defs>\n <linearGradient x1=\"0%\" y1=\"100%\" x2=\"100%\" y2=\"0%\" id=\"sqs-g\">\n <stop stopColor=\"#B0084D\" offset=\"0%\" />\n <stop stopColor=\"#FF4F8B\" offset=\"100%\" />\n </linearGradient>\n </defs>\n <rect width=\"40\" height=\"40\" rx=\"4\" fill=\"url(#sqs-g)\" />\n <path\n fill=\"#FFF\"\n d=\"M14.342 22.35l1.505-1.444a.501.501 0 00.013-.708l-1.505-1.555-.72.695.676.7h-2.32v.999h2.274l-.617.592.694.72zm12.016.003l1.55-1.453a.5.5 0 00.011-.717l-1.55-1.546-.708.707.694.694H24.01v.999H26.3l-.627.588.686.728zm-8.77 1.008a6.458 6.458 0 012.417-.467c.842 0 1.665.163 2.416.467-.669-1.771-.669-3.971 0-5.742-1.502.607-3.331.607-4.833 0 .669 1.77.669 3.97 0 5.742zm-1.944 1.98a.494.494 0 010-.707c1.94-1.936 1.94-6.352 0-8.289a.494.494 0 010-.706.502.502 0 01.709 0c.921.92 2.252 1.447 3.652 1.447 1.4 0 2.731-.528 3.653-1.447a.502.502 0 01.854.354c0 .128-.05.255-.146.352-1.942 1.937-1.942 6.353 0 8.29a.501.501 0 01-.708.706c-.922-.92-2.253-1.447-3.653-1.447s-2.731.527-3.652 1.447a.502.502 0 01-.709 0zm16.898-5.905a1.562 1.562 0 00-1.106-.456 1.558 1.558 0 00-1.105 2.662c.61.608 1.601.608 2.211 0a1.56 1.56 0 000-2.206zm.708 2.913a2.56 2.56 0 01-1.814.749 2.56 2.56 0 01-1.813-4.369c1-.997 2.628-.997 3.627 0 1 .999 1 2.622 0 3.62zM9.67 19.447a1.562 1.562 0 00-1.106-.456 1.56 1.56 0 00-1.105 2.662 1.56 1.56 0 102.21-2.206zm.708 2.912a2.56 2.56 0 01-1.814.749A2.559 2.559 0 016.75 18.74c1-.997 2.627-.997 3.627 0 1 .999 1 2.622 0 3.62zm17.057 6.551A10.514 10.514 0 0119.957 32a10.51 10.51 0 01-7.475-3.09c-1.316-1.312-2.074-2.44-2.537-3.774l-.947.327c.51 1.466 1.365 2.747 2.776 4.154A11.506 11.506 0 0019.957 33c3.093 0 6-1.201 8.185-3.383 1.14-1.139 2.279-2.43 2.87-4.156l-.948-.323c-.525 1.532-1.575 2.719-2.63 3.772zM9.945 15.86l-.947-.328c.512-1.467 1.368-2.749 2.778-4.156 4.51-4.5 11.85-4.502 16.362 0 1.08 1.077 2.266 2.414 2.874 4.156l-.948.328c-.54-1.55-1.635-2.78-2.634-3.777a10.508 10.508 0 00-7.473-3.087 10.508 10.508 0 00-7.472 3.087c-1.298 1.295-2.081 2.46-2.54 3.777z\"\n />\n </svg>\n );\n}\n\nfunction AwsSns({ className }: { className?: string }) {\n return (\n <svg viewBox=\"0 0 40 40\" className={className}>\n <defs>\n <linearGradient x1=\"0%\" y1=\"100%\" x2=\"100%\" y2=\"0%\" id=\"sns-g\">\n <stop stopColor=\"#B0084D\" offset=\"0%\" />\n <stop stopColor=\"#FF4F8B\" offset=\"100%\" />\n </linearGradient>\n </defs>\n <rect width=\"40\" height=\"40\" rx=\"4\" fill=\"url(#sns-g)\" />\n <path\n fill=\"#FFF\"\n d=\"M7.01 20.078a1.1 1.1 0 011.105-1.093 1.1 1.1 0 011.104 1.093 1.1 1.1 0 01-1.104 1.093 1.1 1.1 0 01-1.105-1.093zM20.776 33C14.813 33 9.645 28.375 8.47 22.136a2.1 2.1 0 001.69-1.558h2.949v-1h-2.95a2.104 2.104 0 00-1.653-1.554C9.72 12.252 14.838 8 20.776 8c2.933 0 5.354.643 7.194 1.911l.575-.821C26.534 7.703 23.92 7 20.776 7c-6.51 0-12.104 4.726-13.308 11.096C6.62 18.368 6 19.149 6 20.078c0 .916.602 1.688 1.431 1.971C8.591 28.894 14.24 34 20.776 34c3.285 0 6.788-1.667 8.786-3.094l-.59-.811C26.947 31.541 23.627 33 20.777 33zM14.79 18.242c1.111.274 2.523.321 3.343.321.833 0 2.271-.047 3.402-.32l-2.401 5.014a.507.507 0 00-.048.215v2.324l-1.957.915v-3.239a.514.514 0 00-.044-.206l-2.295-5.024zm3.343-1.757c2.314 0 3.554.311 3.951.52-.417.234-1.745.558-3.95.558-2.184 0-3.483-.327-3.873-.558.37-.206 1.582-.52 3.872-.52zm-1.78 11.438a.511.511 0 00.486.03l2.968-1.388a.5.5 0 00.288-.452v-2.529l2.909-6.074a.806.806 0 00.189-.51c0-1.252-2.751-1.515-5.06-1.515-2.266 0-4.969.263-4.969 1.515 0 .19.067.355.18.502l2.775 6.077V27.5c0 .172.088.331.235.423zM30.877 27a1.1 1.1 0 011.104 1.093 1.1 1.1 0 01-1.104 1.093 1.1 1.1 0 01-1.104-1.093A1.1 1.1 0 0130.876 27zm0-16.03a1.1 1.1 0 011.104 1.093 1.1 1.1 0 01-1.104 1.093 1.1 1.1 0 01-1.104-1.093 1.1 1.1 0 011.104-1.093zm1.01 8.015a1.1 1.1 0 011.104 1.093 1.1 1.1 0 01-1.104 1.093 1.1 1.1 0 01-1.104-1.093 1.1 1.1 0 011.104-1.093zm-4.607 1.593h2.561a2.108 2.108 0 002.046 1.593A2.106 2.106 0 0034 20.078a2.106 2.106 0 00-2.114-2.093c-.992 0-1.818.681-2.046 1.593H27.28v-7.015h1.551a2.108 2.108 0 002.046 1.593 2.106 2.106 0 002.114-2.093 2.106 2.106 0 00-2.114-2.093c-.991 0-1.818.681-2.046 1.593h-2.056a.502.502 0 00-.505.5v7.515h-3.061v1h3.061v7.515c0 .277.226.5.505.5h2.056a2.108 2.108 0 002.046 1.593 2.106 2.106 0 002.114-2.093A2.106 2.106 0 0030.876 26c-.991 0-1.818.681-2.046 1.593H27.28v-7.015z\"\n />\n </svg>\n );\n}\n\n// Icon type: \"svg\" = full self-contained SVG, \"lucide\" = Lucide component (needs wrapper)\ntype IconEntry = { component: any; type: \"svg\" | \"lucide\" };\n\n// Map protocol names to icons\nconst protocolIconMap: { [key: string]: IconEntry } = {\n // Web protocols\n http: { component: Server, type: \"lucide\" },\n https: { component: Server, type: \"lucide\" },\n ws: { component: Radio, type: \"lucide\" },\n wss: { component: Radio, type: \"lucide\" },\n websocket: { component: Radio, type: \"lucide\" },\n\n // Messaging protocols\n mqtt: { component: Wifi, type: \"lucide\" },\n amqp: { component: Network, type: \"lucide\" },\n grpc: { component: Globe, type: \"lucide\" },\n graphql: { component: Globe, type: \"lucide\" },\n\n // Message brokers\n kafka: { component: Network, type: \"lucide\" },\n rabbitmq: { component: Network, type: \"lucide\" },\n redis: { component: Network, type: \"lucide\" },\n nats: { component: Network, type: \"lucide\" },\n pulsar: { component: Network, type: \"lucide\" },\n solace: { component: Network, type: \"lucide\" },\n activemq: { component: Network, type: \"lucide\" },\n\n // AWS\n sqs: { component: AwsSqs, type: \"svg\" },\n sns: { component: AwsSns, type: \"svg\" },\n eventbridge: { component: AwsEventBridge, type: \"svg\" },\n kinesis: { component: Network, type: \"lucide\" },\n msk: { component: Network, type: \"lucide\" },\n\n // Google Cloud\n pubsub: { component: Cloud, type: \"lucide\" },\n googlepubsub: { component: Cloud, type: \"lucide\" },\n cloudtasks: { component: Cloud, type: \"lucide\" },\n\n // Azure\n servicebus: { component: Cloud, type: \"lucide\" },\n azureservicebus: { component: Cloud, type: \"lucide\" },\n eventhubs: { component: Cloud, type: \"lucide\" },\n azureeventhubs: { component: Cloud, type: \"lucide\" },\n eventgrid: { component: Cloud, type: \"lucide\" },\n azureeventgrid: { component: Cloud, type: \"lucide\" },\n};\n\nexport const getIconForProtocol = (protocol?: string): IconEntry | null => {\n if (!protocol) return null;\n const normalizedProtocol = protocol.replace(/[-_\\s]/g, \"\").toLowerCase();\n return protocolIconMap[normalizedProtocol] || null;\n};\n","import { memo, useMemo } from \"react\";\nimport { Database } from \"lucide-react\";\nimport {\n OwnerIndicator,\n normalizeOwners,\n HIDDEN_HANDLE_STYLE,\n} from \"../OwnerIndicator\";\nimport { Node, Handle, Position, useHandleConnections } from \"@xyflow/react\";\nimport { EventCatalogResource, Data as DataType } from \"../../types\";\nimport { NotesIndicator } from \"../NotesIndicator\";\nimport {\n LINE_CLAMP_STYLE,\n FOLDED_CORNER_SHADOW_STYLE,\n EMPTY_ARRAY,\n useDarkMode,\n} from \"../shared-styles\";\n\nfunction GlowHandle({ side }: { side: \"left\" | \"right\" }) {\n return (\n <div\n style={{\n position: \"absolute\",\n top: \"50%\",\n [side]: -6,\n transform: \"translateY(-50%)\",\n width: 12,\n height: 12,\n borderRadius: \"50%\",\n background: \"linear-gradient(135deg, #3b82f6, #2563eb)\",\n border: \"2px solid rgb(var(--ec-page-bg))\",\n zIndex: 20,\n animation: \"ec-data-handle-pulse 2s ease-in-out infinite\",\n pointerEvents: \"none\",\n }}\n />\n );\n}\n\nfunction classNames(...classes: any) {\n return classes.filter(Boolean).join(\" \");\n}\n\ntype DataNodeData = EventCatalogResource & {\n data: DataType;\n};\n\nexport type DataNode = Node<DataNodeData, \"data\">;\n\nfunction PostItData(props: DataNode) {\n const {\n version,\n owners = EMPTY_ARRAY,\n schemas = EMPTY_ARRAY,\n name,\n summary,\n type = \"Database\",\n deprecated,\n draft,\n notes,\n } = props.data.data;\n const mode = props.data.mode || \"simple\";\n\n return (\n <div\n className={classNames(\n \"relative min-w-44 max-w-56 min-h-[120px]\",\n props?.selected ? \"ring-2 ring-blue-400/60 ring-offset-1\" : \"\",\n )}\n >\n <Handle\n type=\"target\"\n position={Position.Left}\n style={HIDDEN_HANDLE_STYLE}\n />\n <Handle\n type=\"source\"\n position={Position.Right}\n style={HIDDEN_HANDLE_STYLE}\n />\n {notes && notes.length > 0 && (\n <NotesIndicator notes={notes} resourceName={name} />\n )}\n {/* Inner wrapper with rotation */}\n <div\n className=\"absolute inset-0\"\n style={{\n background:\n \"linear-gradient(135deg, #bfdbfe 0%, #93c5fd 40%, #3b82f6 100%)\",\n boxShadow:\n \"1px 1px 3px rgba(0,0,0,0.15), 3px 4px 8px rgba(0,0,0,0.08)\",\n transform: \"rotate(-1deg)\",\n border: deprecated\n ? \"2px dashed rgba(239, 68, 68, 0.5)\"\n : draft\n ? \"2px dashed rgba(59, 130, 246, 0.5)\"\n : \"none\",\n }}\n >\n {/* Folded corner */}\n <div style={FOLDED_CORNER_SHADOW_STYLE} />\n <div\n style={{\n position: \"absolute\",\n top: 0,\n right: 0,\n width: 0,\n height: 0,\n borderStyle: \"solid\",\n borderWidth: \"18px 0 0 18px\",\n borderColor: \"#2563eb transparent transparent transparent\",\n opacity: 0.3,\n }}\n />\n </div>\n\n {/* Content sits on top, unrotated */}\n <div className=\"relative px-3.5 py-3\">\n {/* Type label row */}\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center gap-1\">\n <Database className=\"w-3 h-3 text-blue-900/50\" strokeWidth={2.5} />\n <span className=\"text-[8px] font-bold text-blue-900/50 uppercase tracking-widest\">\n Data\n </span>\n </div>\n {draft && (\n <span className=\"text-[8px] font-extrabold text-amber-900 bg-amber-100 border border-dashed border-amber-400 px-1.5 py-0.5 rounded uppercase\">\n Draft\n </span>\n )}\n {deprecated && (\n <span className=\"text-[7px] font-bold text-white bg-red-500 border border-red-600 px-1.5 py-0.5 rounded uppercase\">\n Deprecated\n </span>\n )}\n </div>\n\n {/* Name */}\n <div\n className={classNames(\n \"text-[13px] font-bold leading-snug\",\n deprecated ? \"text-blue-950/40 line-through\" : \"text-blue-950\",\n )}\n >\n {name}\n </div>\n\n {/* Version */}\n {version && (\n <div className=\"text-[9px] text-blue-900/40 font-semibold mt-0.5\">\n v{version}\n </div>\n )}\n\n {/* Summary */}\n {mode === \"full\" && summary && (\n <div\n className=\"mt-2 pt-1.5 border-t border-blue-900/10 text-[9px] text-blue-950/60 leading-relaxed overflow-hidden\"\n style={LINE_CLAMP_STYLE}\n title={summary}\n >\n {summary}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction DefaultData(props: DataNode) {\n const {\n version,\n owners = EMPTY_ARRAY,\n schemas = EMPTY_ARRAY,\n name,\n summary,\n type = \"Database\",\n deprecated,\n draft,\n notes,\n } = props.data.data;\n\n const mode = props.data.mode || \"simple\";\n const ownersNormalized = useMemo(() => normalizeOwners(owners), [owners]);\n const targetConnections = useHandleConnections({ type: \"target\" });\n const sourceConnections = useHandleConnections({ type: \"source\" });\n const isDark = useDarkMode();\n const deprecatedStripe = isDark\n ? \"rgba(239,68,68,0.25)\"\n : \"rgba(239,68,68,0.1)\";\n\n return (\n <div\n className={classNames(\n \"relative min-w-48 max-w-60 rounded-xl border-2 overflow-visible\",\n props?.selected ? \"ring-2 ring-blue-400/60 ring-offset-2\" : \"\",\n deprecated\n ? \"border-dashed border-red-500\"\n : draft\n ? `border-dashed ${isDark ? \"border-blue-400\" : \"border-blue-400/60\"}`\n : \"border-blue-500\",\n )}\n style={{\n background: deprecated\n ? `repeating-linear-gradient(135deg, transparent, transparent 6px, ${deprecatedStripe} 6px, ${deprecatedStripe} 7px), var(--ec-data-node-bg, rgb(var(--ec-card-bg)))`\n : draft\n ? `repeating-linear-gradient(135deg, transparent, transparent 4px, ${isDark ? \"rgba(59,130,246,0.25)\" : \"rgba(59,130,246,0.15)\"} 4px, ${isDark ? \"rgba(59,130,246,0.25)\" : \"rgba(59,130,246,0.15)\"} 4.5px), repeating-linear-gradient(45deg, transparent, transparent 4px, ${isDark ? \"rgba(59,130,246,0.25)\" : \"rgba(59,130,246,0.15)\"} 4px, ${isDark ? \"rgba(59,130,246,0.25)\" : \"rgba(59,130,246,0.15)\"} 4.5px), var(--ec-data-node-bg, rgb(var(--ec-card-bg)))`\n : \"var(--ec-data-node-bg, rgb(var(--ec-card-bg)))\",\n boxShadow: \"0 2px 12px rgba(59, 130, 246, 0.15)\",\n }}\n >\n <Handle\n type=\"target\"\n position={Position.Left}\n style={HIDDEN_HANDLE_STYLE}\n />\n <Handle\n type=\"source\"\n position={Position.Right}\n style={HIDDEN_HANDLE_STYLE}\n />\n {notes && notes.length > 0 && (\n <NotesIndicator notes={notes} resourceName={name} />\n )}\n {targetConnections.length > 0 && <GlowHandle side=\"left\" />}\n {sourceConnections.length > 0 && <GlowHandle side=\"right\" />}\n\n {/* Type badge top-left */}\n <div className=\"absolute -top-2.5 left-2.5 z-10\">\n <span\n className={classNames(\n \"inline-flex items-center gap-1 text-[7px] font-bold uppercase tracking-widest text-white px-1.5 py-0.5 rounded shadow-sm\",\n deprecated ? \"bg-red-500\" : \"bg-blue-500\",\n )}\n >\n <Database className=\"w-2.5 h-2.5\" strokeWidth={2.5} />\n Data{draft && \" (Draft)\"}\n {deprecated && \" (Deprecated)\"}\n </span>\n </div>\n {/* Container type badge top-right */}\n {type && (\n <span\n className=\"z-10 text-[7px] font-semibold text-[rgb(var(--ec-page-text))] bg-[rgb(var(--ec-card-bg))] border border-blue-500 rounded-full px-1.5 py-0.5 uppercase tracking-wide\"\n style={{ position: \"absolute\", top: -8, right: 10 }}\n >\n {type}\n </span>\n )}\n\n <div className=\"px-3 pt-3.5 pb-2.5\">\n {/* Name + version */}\n <div className=\"flex items-baseline gap-1\">\n <span className=\"text-[13px] font-semibold leading-snug text-[rgb(var(--ec-page-text))]\">\n {name}\n </span>\n {version && (\n <span className=\"text-[10px] font-normal text-[rgb(var(--ec-page-text-muted))] shrink-0\">\n (v{version})\n </span>\n )}\n </div>\n\n {/* Summary */}\n {mode === \"full\" && summary && (\n <div\n className=\"mt-1.5 text-[9px] text-[rgb(var(--ec-page-text-muted))] leading-relaxed overflow-hidden\"\n style={LINE_CLAMP_STYLE}\n title={summary}\n >\n {summary}\n </div>\n )}\n\n {/* Owners */}\n <OwnerIndicator\n owners={ownersNormalized}\n accentColor=\"bg-blue-400\"\n borderColor=\"rgba(59,130,246,0.08)\"\n iconClass=\"text-blue-300\"\n />\n </div>\n </div>\n );\n}\n\nexport default memo(function Data(props: DataNode) {\n const nodeStyle = props?.data?.style;\n\n if (nodeStyle === \"post-it\") {\n return <PostItData {...props} />;\n }\n\n return <DefaultData {...props} />;\n});\n","import { Connection, MarkerType } from \"@xyflow/react\";\nimport { Database } from \"lucide-react\";\nimport { NodeConfiguration } from \"../../types\";\nimport { SERVICE, CHANNEL, ACTOR } from \"../node-types\";\n\nexport default {\n type: \"data\",\n icon: Database,\n color: \"blue\",\n targetCanConnectTo: [...SERVICE, ...CHANNEL, \"external-system\", ...ACTOR],\n sourceCanConnectTo: [...SERVICE, ...CHANNEL, \"external-system\", ...ACTOR],\n validateConnection: (connection: Connection) => {\n return connection.source !== connection.target;\n },\n getEdgeOptions: (connection: Connection) => {\n if (connection.source === \"data\" && connection.target === \"service\") {\n return {\n label: \"Provides data to\",\n markerEnd: { type: MarkerType.ArrowClosed, color: \"#000000\" },\n };\n }\n if (connection.source === \"service\" && connection.target === \"data\") {\n return {\n label: \"Stores data in\",\n markerEnd: { type: MarkerType.ArrowClosed, color: \"#000000\" },\n };\n }\n return {\n label: \"Connected to\",\n markerEnd: { type: MarkerType.ArrowClosed, color: \"#000000\" },\n };\n },\n defaultData: {\n name: \"New Database\",\n version: \"0.0.1\",\n summary: \"New data store. Click edit to change the details.\",\n type: \"Database\",\n mode: \"full\",\n },\n editor: {\n title: \"Data Store\",\n subtitle: \"Edit the details of the data store\",\n schema: {\n type: \"object\",\n required: [\"name\", \"version\"],\n properties: {\n name: {\n type: \"string\",\n title: \"Name\",\n default: \"UserDatabase\",\n description: \"The name of the data store\",\n },\n version: {\n type: \"string\",\n title: \"Version\",\n default: \"1.0.0\",\n description: \"The version number (e.g., 1.0.0)\",\n pattern: \"^\\\\d+\\\\.\\\\d+\\\\.\\\\d+(?:-[\\\\w.-]+)?(?:\\\\+[\\\\w.-]+)?$\",\n },\n summary: {\n type: \"string\",\n title: \"Summary\",\n default: \"\",\n description: \"A brief summary of the data store\",\n },\n type: {\n type: \"string\",\n title: \"Type\",\n default: \"Database\",\n description: \"The type of data store (Database, Cache, Queue, etc.)\",\n enum: [\n \"Database\",\n \"Cache\",\n \"Queue\",\n \"File System\",\n \"Data Lake\",\n \"Data Warehouse\",\n ],\n },\n },\n },\n },\n} as NodeConfiguration;\n","import { memo } from \"react\";\nimport { MonitorIcon } from \"lucide-react\";\nimport { Node, Handle, Position } from \"@xyflow/react\";\nimport { EventCatalogResource, View as ViewType } from \"../../types\";\nimport {\n NODE_WIDTH_STYLE,\n ROTATED_LABEL_STYLE,\n LINE_CLAMP_STYLE,\n} from \"../shared-styles\";\n\nfunction classNames(...classes: any) {\n return classes.filter(Boolean).join(\" \");\n}\n\ntype ViewNodeData = EventCatalogResource & {\n view: ViewType;\n};\n\nexport type ViewNode = Node<ViewNodeData, \"view\">;\n\nexport default memo(function View(props: ViewNode) {\n const { data: _data, selected } = props;\n const { name, summary, screenshot } = props.data.view;\n\n const mode = props.data.mode || \"simple\";\n\n const nodeLabel = \"View\";\n\n return (\n <div\n className={classNames(\n \"rounded-md border flex justify-start bg-[rgb(var(--ec-card-bg))] text-[rgb(var(--ec-page-text))] min-h-[100px] relative\",\n selected\n ? \"border-blue-600 ring-2 ring-blue-500 shadow-lg\"\n : \"border-blue-400\",\n )}\n style={NODE_WIDTH_STYLE}\n >\n <Handle\n type=\"target\"\n position={Position.Left}\n className=\"!left-[-1px] !w-2.5 !h-2.5 !bg-blue-500 !border !border-blue-600 !rounded-full !z-10\"\n />\n <Handle\n type=\"source\"\n position={Position.Right}\n className=\"!right-[-1px] !w-2.5 !h-2.5 !bg-blue-500 !border !border-blue-600 !rounded-full !z-10\"\n />\n <div\n className={`bg-gradient-to-b from-blue-500 to-blue-700 relative flex flex-col items-center w-5 justify-between rounded-l-sm text-blue-100 border-r-[1px] border-blue-500`}\n >\n <MonitorIcon\n className={`w-4 h-4 opacity-90 text-white mt-1 ${mode === \"full\" ? \"mb-2\" : \"mb-1\"}`}\n />\n {mode === \"full\" && (\n <span\n className=\"text-center text-[8px] text-white font-bold uppercase mb-4\"\n style={ROTATED_LABEL_STYLE}\n >\n {nodeLabel}\n </span>\n )}\n </div>\n <div className=\"p-1 flex-1\">\n <div className=\"pb-1\">\n <span className=\"text-xs font-bold block pt-0.5 pb-0.5\">{name}</span>\n {mode === \"simple\" && (\n <span className=\"text-[10px] text-[rgb(var(--ec-page-text-muted))] font-light block pt-0.5 pb-0.5\">\n {nodeLabel}\n </span>\n )}\n </div>\n {summary && (\n <div className=\"pb-1\">\n <div\n className=\"text-[8px] font-light text-[rgb(var(--ec-page-text-muted))] block leading-tight overflow-hidden\"\n style={LINE_CLAMP_STYLE}\n title={summary}\n >\n {summary}\n </div>\n </div>\n )}\n {screenshot && (\n <div className=\"py-1\">\n <img\n src={screenshot}\n alt={`${name} screenshot`}\n className=\"w-full max-w-40 h-20 object-cover rounded border border-[rgb(var(--ec-page-border))]\"\n />\n </div>\n )}\n </div>\n </div>\n );\n});\n","import { memo } from \"react\";\nimport { User } from \"lucide-react\";\nimport { Node, Handle, Position, useHandleConnections } from \"@xyflow/react\";\nimport { EventCatalogResource, Note } from \"../../types\";\nimport { NotesIndicator } from \"../NotesIndicator\";\nimport { HIDDEN_HANDLE_STYLE } from \"../OwnerIndicator\";\nimport {\n LINE_CLAMP_STYLE,\n FOLDED_CORNER_SHADOW_STYLE,\n useDarkMode,\n} from \"../shared-styles\";\n\nfunction GlowHandle({ side }: { side: \"left\" | \"right\" }) {\n return (\n <div\n style={{\n position: \"absolute\",\n top: \"50%\",\n [side]: -6,\n transform: \"translateY(-50%)\",\n width: 12,\n height: 12,\n borderRadius: \"50%\",\n background: \"linear-gradient(135deg, #eab308, #a16207)\",\n border: \"2px solid rgb(var(--ec-page-bg))\",\n zIndex: 20,\n animation: \"ec-actor-handle-pulse 2s ease-in-out infinite\",\n pointerEvents: \"none\",\n }}\n />\n );\n}\n\nfunction classNames(...classes: any) {\n return classes.filter(Boolean).join(\" \");\n}\n\ntype ActorNodeData = EventCatalogResource & {\n name: string;\n summary: string;\n deprecated?: boolean;\n draft?: boolean;\n notes?: Note[];\n};\n\nexport type ActorNode = Node<ActorNodeData, \"actor\">;\n\nfunction PostItActor(props: ActorNode) {\n const { name, summary, deprecated, draft, notes } = props?.data;\n const mode = props?.data?.mode || \"simple\";\n\n return (\n <div\n className={classNames(\n \"relative min-w-44 max-w-56 min-h-[120px]\",\n props?.selected ? \"ring-2 ring-yellow-400/60 ring-offset-1\" : \"\",\n )}\n >\n <Handle\n type=\"target\"\n position={Position.Left}\n style={HIDDEN_HANDLE_STYLE}\n />\n <Handle\n type=\"source\"\n position={Position.Right}\n style={HIDDEN_HANDLE_STYLE}\n />\n {notes && notes.length > 0 && (\n <NotesIndicator notes={notes} resourceName={name} />\n )}\n <div\n className=\"absolute inset-0\"\n style={{\n background:\n \"linear-gradient(135deg, #fef9c3 0%, #fde047 40%, #eab308 100%)\",\n boxShadow:\n \"1px 1px 3px rgba(0,0,0,0.15), 3px 4px 8px rgba(0,0,0,0.08)\",\n transform: \"rotate(1deg)\",\n border: deprecated\n ? \"2px dashed rgba(239, 68, 68, 0.5)\"\n : draft\n ? \"2px dashed rgba(234, 179, 8, 0.5)\"\n : \"none\",\n }}\n >\n <div style={FOLDED_CORNER_SHADOW_STYLE} />\n <div\n style={{\n position: \"absolute\",\n top: 0,\n right: 0,\n width: 0,\n height: 0,\n borderStyle: \"solid\",\n borderWidth: \"18px 0 0 18px\",\n borderColor: \"#a16207 transparent transparent transparent\",\n opacity: 0.3,\n }}\n />\n </div>\n\n <div className=\"relative px-3.5 py-3\">\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center gap-1\">\n <User className=\"w-3 h-3 text-yellow-900/50\" strokeWidth={2.5} />\n <span className=\"text-[8px] font-bold text-yellow-900/50 uppercase tracking-widest\">\n Actor\n </span>\n </div>\n {draft && (\n <span className=\"text-[8px] font-extrabold text-amber-900 bg-amber-100 border border-dashed border-amber-400 px-1.5 py-0.5 rounded uppercase\">\n Draft\n </span>\n )}\n {deprecated && (\n <span className=\"text-[7px] font-bold text-white bg-red-500 border border-red-600 px-1.5 py-0.5 rounded uppercase\">\n Deprecated\n </span>\n )}\n </div>\n\n <div\n className={classNames(\n \"text-[13px] font-bold leading-snug\",\n deprecated ? \"text-yellow-950/40 line-through\" : \"text-yellow-950\",\n )}\n >\n {name}\n </div>\n\n {mode === \"full\" && summary && (\n <div\n className=\"mt-2 pt-1.5 border-t border-yellow-900/10 text-[9px] text-yellow-950/60 leading-relaxed overflow-hidden\"\n style={LINE_CLAMP_STYLE}\n title={summary}\n >\n {summary}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction DefaultActor(props: ActorNode) {\n const { name, summary, deprecated, draft, notes } = props?.data;\n const mode = props?.data?.mode || \"simple\";\n const targetConnections = useHandleConnections({ type: \"target\" });\n const sourceConnections = useHandleConnections({ type: \"source\" });\n const isDark = useDarkMode();\n const deprecatedStripe = isDark\n ? \"rgba(239,68,68,0.25)\"\n : \"rgba(239,68,68,0.1)\";\n\n return (\n <div\n className={classNames(\n \"relative min-w-48 max-w-60 rounded-xl border-2 overflow-visible\",\n props?.selected ? \"ring-2 ring-yellow-400/60 ring-offset-2\" : \"\",\n deprecated\n ? \"border-dashed border-red-500\"\n : draft\n ? `border-dashed ${isDark ? \"border-yellow-400\" : \"border-yellow-400/60\"}`\n : \"border-yellow-500\",\n )}\n style={{\n background: deprecated\n ? `repeating-linear-gradient(135deg, transparent, transparent 6px, ${deprecatedStripe} 6px, ${deprecatedStripe} 7px), var(--ec-actor-node-bg, rgb(var(--ec-card-bg)))`\n : draft\n ? `repeating-linear-gradient(135deg, transparent, transparent 4px, ${isDark ? \"rgba(234,179,8,0.25)\" : \"rgba(234,179,8,0.15)\"} 4px, ${isDark ? \"rgba(234,179,8,0.25)\" : \"rgba(234,179,8,0.15)\"} 4.5px), repeating-linear-gradient(45deg, transparent, transparent 4px, ${isDark ? \"rgba(234,179,8,0.25)\" : \"rgba(234,179,8,0.15)\"} 4px, ${isDark ? \"rgba(234,179,8,0.25)\" : \"rgba(234,179,8,0.15)\"} 4.5px), var(--ec-actor-node-bg, rgb(var(--ec-card-bg)))`\n : \"var(--ec-actor-node-bg, rgb(var(--ec-card-bg)))\",\n boxShadow: \"0 2px 12px rgba(234, 179, 8, 0.15)\",\n }}\n >\n <Handle\n type=\"target\"\n position={Position.Left}\n style={HIDDEN_HANDLE_STYLE}\n />\n <Handle\n type=\"source\"\n position={Position.Right}\n style={HIDDEN_HANDLE_STYLE}\n />\n {notes && notes.length > 0 && (\n <NotesIndicator notes={notes} resourceName={name} />\n )}\n {targetConnections.length > 0 && <GlowHandle side=\"left\" />}\n {sourceConnections.length > 0 && <GlowHandle side=\"right\" />}\n\n {/* Badge positioned outside top-left corner */}\n <div className=\"absolute -top-2.5 left-2.5 flex items-center gap-1.5 z-10\">\n <span\n className={classNames(\n \"inline-flex items-center gap-1 text-[7px] font-bold uppercase tracking-widest text-white px-1.5 py-0.5 rounded shadow-sm\",\n deprecated ? \"bg-red-500\" : \"bg-yellow-500\",\n )}\n >\n <User className=\"w-2.5 h-2.5\" strokeWidth={2.5} />\n Actor{draft && \" (Draft)\"}\n {deprecated && \" (Deprecated)\"}\n </span>\n </div>\n\n <div className=\"px-3 pt-3.5 pb-2.5\">\n {/* Name */}\n <span className=\"text-[13px] font-semibold leading-snug text-[rgb(var(--ec-page-text))]\">\n {name}\n </span>\n\n {/* Summary */}\n {mode === \"full\" && summary && (\n <div\n className=\"mt-1.5 text-[9px] text-[rgb(var(--ec-page-text-muted))] leading-relaxed overflow-hidden\"\n style={LINE_CLAMP_STYLE}\n title={summary}\n >\n {summary}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nexport default memo(function Actor(props: ActorNode) {\n const nodeStyle = props?.data?.style;\n\n if (nodeStyle === \"post-it\") {\n return <PostItActor {...props} />;\n }\n\n return <DefaultActor {...props} />;\n});\n","import { Connection, MarkerType } from \"@xyflow/react\";\nimport { User } from \"lucide-react\";\nimport { NodeConfiguration } from \"../../types\";\nimport { SERVICE, MESSAGE, CHANNEL } from \"../node-types\";\n\nexport default {\n type: \"actor\",\n icon: User,\n color: \"yellow\",\n targetCanConnectTo: [\n ...SERVICE,\n ...MESSAGE,\n ...CHANNEL,\n \"external-system\",\n \"view\",\n ],\n sourceCanConnectTo: [\n ...SERVICE,\n ...MESSAGE,\n ...CHANNEL,\n \"external-system\",\n \"view\",\n ],\n validateConnection: (connection: Connection) => {\n return connection.source !== connection.target;\n },\n getEdgeOptions: (_connection: Connection) => {\n return {\n label: \"Interacts\",\n markerEnd: { type: MarkerType.ArrowClosed, color: \"#000000\" },\n };\n },\n defaultData: {\n name: \"New Actor\",\n summary:\n \"A person or user in the system. Click edit to change the details.\",\n mode: \"full\",\n },\n editor: {\n title: \"Actor\",\n subtitle: \"Edit the details of the actor\",\n schema: {\n type: \"object\",\n required: [\"name\"],\n properties: {\n name: {\n type: \"string\",\n title: \"Name\",\n default: \"New Actor\",\n description: \"The name of the actor (person/user)\",\n },\n summary: {\n type: \"string\",\n title: \"Description\",\n default: \"\",\n description: \"A brief description of the actor\",\n },\n },\n },\n },\n} as NodeConfiguration;\n","import { memo } from \"react\";\nimport { Globe } from \"lucide-react\";\nimport { Node, Handle, Position, useHandleConnections } from \"@xyflow/react\";\nimport {\n EventCatalogResource,\n ExternalSystem as ExternalSystemType,\n} from \"../../types\";\nimport { NotesIndicator } from \"../NotesIndicator\";\nimport { HIDDEN_HANDLE_STYLE } from \"../OwnerIndicator\";\nimport {\n LINE_CLAMP_STYLE,\n FOLDED_CORNER_SHADOW_STYLE,\n useDarkMode,\n} from \"../shared-styles\";\n\nfunction GlowHandle({ side }: { side: \"left\" | \"right\" }) {\n return (\n <div\n style={{\n position: \"absolute\",\n top: \"50%\",\n [side]: -6,\n transform: \"translateY(-50%)\",\n width: 12,\n height: 12,\n borderRadius: \"50%\",\n background: \"linear-gradient(135deg, #a855f7, #7e22ce)\",\n border: \"2px solid rgb(var(--ec-page-bg))\",\n zIndex: 20,\n animation: \"ec-external-handle-pulse 2s ease-in-out infinite\",\n pointerEvents: \"none\",\n }}\n />\n );\n}\n\nfunction classNames(...classes: any) {\n return classes.filter(Boolean).join(\" \");\n}\n\ntype ExternalSystemNodeData = EventCatalogResource & {\n externalSystem: ExternalSystemType & {\n deprecated?: boolean;\n draft?: boolean;\n };\n};\n\nexport type ExternalSystemNode = Node<\n ExternalSystemNodeData,\n \"external-system\"\n>;\n\nfunction PostItExternalSystem(props: ExternalSystemNode) {\n const { version, name, summary, deprecated, draft, notes } =\n props.data.externalSystem;\n const mode = props.data.mode || \"simple\";\n\n return (\n <div\n className={classNames(\n \"relative min-w-44 max-w-56 min-h-[120px]\",\n props?.selected ? \"ring-2 ring-purple-400/60 ring-offset-1\" : \"\",\n )}\n >\n <Handle\n type=\"target\"\n position={Position.Left}\n style={HIDDEN_HANDLE_STYLE}\n />\n <Handle\n type=\"source\"\n position={Position.Right}\n style={HIDDEN_HANDLE_STYLE}\n />\n {notes && notes.length > 0 && (\n <NotesIndicator notes={notes} resourceName={name} />\n )}\n <div\n className=\"absolute inset-0\"\n style={{\n background:\n \"linear-gradient(135deg, #e9d5ff 0%, #c084fc 40%, #a855f7 100%)\",\n boxShadow:\n \"1px 1px 3px rgba(0,0,0,0.15), 3px 4px 8px rgba(0,0,0,0.08)\",\n transform: \"rotate(-1deg)\",\n border: deprecated\n ? \"2px dashed rgba(239, 68, 68, 0.5)\"\n : draft\n ? \"2px dashed rgba(168, 85, 247, 0.5)\"\n : \"none\",\n }}\n >\n <div style={FOLDED_CORNER_SHADOW_STYLE} />\n <div\n style={{\n position: \"absolute\",\n top: 0,\n right: 0,\n width: 0,\n height: 0,\n borderStyle: \"solid\",\n borderWidth: \"18px 0 0 18px\",\n borderColor: \"#7e22ce transparent transparent transparent\",\n opacity: 0.3,\n }}\n />\n </div>\n\n <div className=\"relative px-3.5 py-3\">\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center gap-1\">\n <Globe className=\"w-3 h-3 text-purple-900/50\" strokeWidth={2.5} />\n <span className=\"text-[8px] font-bold text-purple-900/50 uppercase tracking-widest\">\n External\n </span>\n </div>\n {draft && (\n <span className=\"text-[8px] font-extrabold text-amber-900 bg-amber-100 border border-dashed border-amber-400 px-1.5 py-0.5 rounded uppercase\">\n Draft\n </span>\n )}\n {deprecated && (\n <span className=\"text-[7px] font-bold text-white bg-red-500 border border-red-600 px-1.5 py-0.5 rounded uppercase\">\n Deprecated\n </span>\n )}\n </div>\n\n <div\n className={classNames(\n \"text-[13px] font-bold leading-snug\",\n deprecated ? \"text-purple-950/40 line-through\" : \"text-purple-950\",\n )}\n >\n {name}\n </div>\n\n {version && (\n <div className=\"text-[9px] text-purple-900/40 font-semibold mt-0.5\">\n v{version}\n </div>\n )}\n\n {mode === \"full\" && summary && (\n <div\n className=\"mt-2 pt-1.5 border-t border-purple-900/10 text-[9px] text-purple-950/60 leading-relaxed overflow-hidden\"\n style={LINE_CLAMP_STYLE}\n title={summary}\n >\n {summary}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction DefaultExternalSystem(props: ExternalSystemNode) {\n const { version, name, summary, deprecated, draft, notes } =\n props.data.externalSystem;\n const mode = props.data.mode || \"simple\";\n const targetConnections = useHandleConnections({ type: \"target\" });\n const sourceConnections = useHandleConnections({ type: \"source\" });\n const isDark = useDarkMode();\n const deprecatedStripe = isDark\n ? \"rgba(239,68,68,0.25)\"\n : \"rgba(239,68,68,0.1)\";\n\n return (\n <div\n className={classNames(\n \"relative min-w-48 max-w-60 rounded-xl border-2 overflow-visible\",\n props?.selected ? \"ring-2 ring-purple-400/60 ring-offset-2\" : \"\",\n deprecated\n ? \"border-dashed border-red-500\"\n : draft\n ? `border-dashed ${isDark ? \"border-purple-400\" : \"border-purple-400/60\"}`\n : \"border-purple-500\",\n )}\n style={{\n background: deprecated\n ? `repeating-linear-gradient(135deg, transparent, transparent 6px, ${deprecatedStripe} 6px, ${deprecatedStripe} 7px), var(--ec-external-node-bg, rgb(var(--ec-card-bg)))`\n : draft\n ? `repeating-linear-gradient(135deg, transparent, transparent 4px, ${isDark ? \"rgba(168,85,247,0.25)\" : \"rgba(168,85,247,0.15)\"} 4px, ${isDark ? \"rgba(168,85,247,0.25)\" : \"rgba(168,85,247,0.15)\"} 4.5px), repeating-linear-gradient(45deg, transparent, transparent 4px, ${isDark ? \"rgba(168,85,247,0.25)\" : \"rgba(168,85,247,0.15)\"} 4px, ${isDark ? \"rgba(168,85,247,0.25)\" : \"rgba(168,85,247,0.15)\"} 4.5px), var(--ec-external-node-bg, rgb(var(--ec-card-bg)))`\n : \"var(--ec-external-node-bg, rgb(var(--ec-card-bg)))\",\n boxShadow: \"0 2px 12px rgba(168, 85, 247, 0.15)\",\n }}\n >\n <Handle\n type=\"target\"\n position={Position.Left}\n style={HIDDEN_HANDLE_STYLE}\n />\n <Handle\n type=\"source\"\n position={Position.Right}\n style={HIDDEN_HANDLE_STYLE}\n />\n {notes && notes.length > 0 && (\n <NotesIndicator notes={notes} resourceName={name} />\n )}\n {targetConnections.length > 0 && <GlowHandle side=\"left\" />}\n {sourceConnections.length > 0 && <GlowHandle side=\"right\" />}\n\n {/* Badge positioned outside top-left corner */}\n <div className=\"absolute -top-2.5 left-2.5 flex items-center gap-1.5 z-10\">\n <span\n className={classNames(\n \"inline-flex items-center gap-1 text-[7px] font-bold uppercase tracking-widest text-white px-1.5 py-0.5 rounded shadow-sm\",\n deprecated ? \"bg-red-500\" : \"bg-purple-500\",\n )}\n >\n <Globe className=\"w-2.5 h-2.5\" strokeWidth={2.5} />\n External System{draft && \" (Draft)\"}\n {deprecated && \" (Deprecated)\"}\n </span>\n </div>\n\n <div className=\"px-3 pt-3.5 pb-2.5\">\n {/* Name + version */}\n <div className=\"flex items-baseline gap-1\">\n <span className=\"text-[13px] font-semibold leading-snug text-[rgb(var(--ec-page-text))]\">\n {name}\n </span>\n {version && (\n <span className=\"text-[10px] font-normal text-[rgb(var(--ec-page-text-muted))] shrink-0\">\n (v{version})\n </span>\n )}\n </div>\n\n {/* Summary */}\n {mode === \"full\" && summary && (\n <div\n className=\"mt-1.5 text-[9px] text-[rgb(var(--ec-page-text-muted))] leading-relaxed overflow-hidden\"\n style={LINE_CLAMP_STYLE}\n title={summary}\n >\n {summary}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nexport default memo(function ExternalSystem(props: ExternalSystemNode) {\n const nodeStyle = props?.data?.style;\n\n if (nodeStyle === \"post-it\") {\n return <PostItExternalSystem {...props} />;\n }\n\n return <DefaultExternalSystem {...props} />;\n});\n","import { Connection, MarkerType } from \"@xyflow/react\";\nimport { Globe } from \"lucide-react\";\nimport { NodeConfiguration } from \"../../types\";\nimport { SERVICE, CHANNEL, ACTOR, MESSAGE } from \"../node-types\";\n\nexport default {\n type: \"external-system\",\n icon: Globe,\n color: \"pink\",\n targetCanConnectTo: [...SERVICE, ...CHANNEL, ...MESSAGE, ...ACTOR],\n sourceCanConnectTo: [...SERVICE, ...CHANNEL, ...MESSAGE, ...ACTOR],\n validateConnection: (connection: Connection) => {\n return connection.source !== connection.target;\n },\n getEdgeOptions: (connection: Connection) => {\n return {\n label: \"Connects\",\n markerEnd: { type: MarkerType.ArrowClosed, color: \"#000000\" },\n };\n },\n defaultData: {\n mode: \"full\",\n externalSystem: {\n id: \"1\",\n name: \"New External System\",\n version: \"0.0.1\",\n summary: \"New external system. Click edit to change the details.\",\n },\n },\n editor: {\n title: \"External System\",\n subtitle: \"Edit the details of the external system\",\n schema: {\n type: \"object\",\n required: [\"externalSystem\", \"mode\"],\n properties: {\n externalSystem: {\n type: \"object\",\n required: [\"name\", \"version\"],\n properties: {\n name: {\n type: \"string\",\n title: \"Name\",\n default: \"Random value\",\n description: \"The name of the external system\",\n },\n version: {\n type: \"string\",\n title: \"Version\",\n default: \"1.0.0\",\n description: \"The version number (e.g., 1.0.0)\",\n pattern: \"^\\\\d+\\\\.\\\\d+\\\\.\\\\d+(?:-[\\\\w.-]+)?(?:\\\\+[\\\\w.-]+)?$\",\n },\n summary: {\n type: \"string\",\n title: \"Summary\",\n default: \"\",\n description: \"A brief summary of the external system\",\n },\n },\n },\n },\n },\n },\n} as NodeConfiguration;\n","import { Node, Handle, Position } from \"@xyflow/react\";\nimport React, { memo, useState, useEffect, useRef, useCallback } from \"react\";\nimport { FULL_SIZE_STYLE } from \"../shared-styles\";\n\nfunction classNames(...classes: any) {\n return classes.filter(Boolean).join(\" \");\n}\n\n// Define the data structure for our NoteNode\nexport type NoteNodeData = {\n id: string;\n text: string;\n color?: string;\n readOnly?: boolean;\n};\n\n// Define the NoteNode type for React Flow\nexport type NoteNode = Node<NoteNodeData, \"note\">;\n\nexport interface NoteNodeProps extends NoteNode {\n onTextChange?: (id: string, text: string) => void;\n onColorChange?: (id: string, color: string) => void;\n showResizer?: boolean;\n readOnly?: boolean;\n}\n\nconst AVAILABLE_COLORS = {\n yellow: {\n bg: \"bg-gradient-to-br from-yellow-200 to-yellow-300\",\n border: \"border-yellow-400\",\n text: \"text-yellow-900\",\n placeholder: \"placeholder-yellow-600\",\n selectedRing: \"ring-yellow-500\",\n },\n blue: {\n bg: \"bg-blue-200\",\n border: \"border-blue-400\",\n text: \"text-blue-900\",\n placeholder: \"placeholder-blue-600\",\n selectedRing: \"ring-blue-500\",\n },\n green: {\n bg: \"bg-green-200\",\n border: \"border-green-400\",\n text: \"text-green-900\",\n placeholder: \"placeholder-green-600\",\n selectedRing: \"ring-green-500\",\n },\n pink: {\n bg: \"bg-pink-200\",\n border: \"border-pink-400\",\n text: \"text-pink-900\",\n placeholder: \"placeholder-pink-600\",\n selectedRing: \"ring-pink-500\",\n },\n purple: {\n bg: \"bg-purple-200\",\n border: \"border-purple-400\",\n text: \"text-purple-900\",\n placeholder: \"placeholder-purple-600\",\n selectedRing: \"ring-purple-500\",\n },\n gray: {\n bg: \"bg-gray-200\",\n border: \"border-gray-400\",\n text: \"text-gray-900\",\n placeholder: \"placeholder-gray-600\",\n selectedRing: \"ring-gray-500\",\n },\n} as const;\n\ntype ColorName = keyof typeof AVAILABLE_COLORS;\n\nconst POSITION_RELATIVE_STYLE = { position: \"relative\" } as const;\nconst TEXTAREA_STYLE = { height: \"100%\", minHeight: 0 } as const;\n\nexport default memo(function NoteNodeComponent({\n id,\n data,\n selected,\n onTextChange,\n onColorChange,\n readOnly = false,\n}: NoteNodeProps) {\n const [isEditing, setIsEditing] = useState(false);\n const [currentText, setCurrentText] = useState(\n data.text || \"Double-click to edit...\",\n );\n const textAreaRef = useRef<HTMLTextAreaElement>(null);\n\n const currentColorName = (data.color as ColorName) || \"yellow\";\n const colorClasses =\n AVAILABLE_COLORS[currentColorName] || AVAILABLE_COLORS.yellow;\n\n // Simple markdown-like text formatting\n const formatText = (text: string) => {\n return (\n text\n // Headers\n .replace(\n /^### (.*$)/gim,\n '<h3 class=\"text-xs font-medium mb-1\">$1</h3>',\n )\n .replace(\n /^## (.*$)/gim,\n '<h2 class=\"text-xs font-semibold mb-1\">$1</h2>',\n )\n .replace(/^# (.*$)/gim, '<h1 class=\"text-sm font-bold mb-1\">$1</h1>')\n // Bold\n .replace(/\\*\\*(.*?)\\*\\*/gim, '<strong class=\"font-bold\">$1</strong>')\n // Italic\n .replace(/\\*(.*?)\\*/gim, '<em class=\"italic\">$1</em>')\n // Inline code\n .replace(\n /`(.*?)`/gim,\n '<code class=\"bg-gray-200 px-1 rounded text-[9px] font-mono\">$1</code>',\n )\n // Simple lists\n .replace(/^• (.*$)/gim, '<li class=\"text-[10px] ml-3\">• $1</li>')\n .replace(/^- (.*$)/gim, '<li class=\"text-[10px] ml-3\">• $1</li>')\n // Line breaks\n .replace(/\\n/g, \"<br>\")\n );\n };\n\n useEffect(() => {\n // Update internal state if data.text changes from props (e.g. undo/redo, initial load)\n setCurrentText(data.text || \"Double-click to edit...\");\n }, [data.text]);\n\n useEffect(() => {\n if (isEditing && textAreaRef.current) {\n textAreaRef.current.focus();\n // Select all text when starting to edit for quicker replacement\n textAreaRef.current.select();\n }\n }, [isEditing]);\n\n const handleDoubleClick = useCallback(() => {\n if (!readOnly) {\n setIsEditing(true);\n }\n }, [readOnly]);\n\n const handleTextChange = useCallback(\n (event: React.ChangeEvent<HTMLTextAreaElement>) => {\n setCurrentText(event.target.value);\n },\n [],\n );\n\n const handleBlur = useCallback(() => {\n setIsEditing(false);\n // Only update if the text has actually changed from what's in data\n // or if data.text was initially undefined/empty and now has content.\n if (currentText !== data.text && onTextChange) {\n onTextChange(id, currentText);\n }\n }, [currentText, data.text, id, onTextChange]);\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault(); // Prevent newline on Enter\n handleBlur(); // Save and exit edit mode\n }\n // Allow Shift+Enter for newlines by default textarea behavior\n if (event.key === \"Escape\") {\n setIsEditing(false);\n // Revert to original text from data on Escape\n setCurrentText(data.text || \"Double-click to edit...\");\n }\n },\n [handleBlur, data.text],\n );\n\n const handleColorChange = useCallback(\n (newColor: ColorName) => {\n if (onColorChange) {\n onColorChange(id, newColor);\n }\n },\n [id, onColorChange],\n );\n\n return (\n <div className=\"relative group\" style={FULL_SIZE_STYLE}>\n <Handle\n type=\"target\"\n position={Position.Left}\n className=\"!left-[-1px] !w-2 !h-2 !bg-gray-400 !border !border-gray-500 !rounded-full !z-10\"\n />\n <Handle\n type=\"source\"\n position={Position.Right}\n className=\"!right-[-1px] !w-2 !h-2 !bg-gray-400 !border !border-gray-500 !rounded-full !z-10\"\n />\n {selected && !isEditing && !readOnly && (\n <div className=\"absolute -top-10 left-1/2 transform -translate-x-1/2 flex space-x-1 p-1 bg-[rgb(var(--ec-card-bg))] rounded-md shadow-lg border border-[rgb(var(--ec-page-border))] z-20\">\n {Object.keys(AVAILABLE_COLORS).map((colorKey) => (\n <button\n key={colorKey}\n onClick={() => handleColorChange(colorKey as ColorName)}\n className={classNames(\n \"w-6 h-6 rounded-full border-2\",\n AVAILABLE_COLORS[colorKey as ColorName].bg,\n AVAILABLE_COLORS[colorKey as ColorName].border,\n currentColorName === colorKey\n ? \"ring-2 ring-offset-1 \" +\n AVAILABLE_COLORS[colorKey as ColorName].selectedRing\n : \"\",\n )}\n title={colorKey.charAt(0).toUpperCase() + colorKey.slice(1)}\n />\n ))}\n </div>\n )}\n <div\n onDoubleClick={handleDoubleClick}\n className={classNames(\n \"w-full h-full rounded-lg border p-3 flex flex-col min-w-[150px] min-h-[150px] relative\",\n colorClasses.bg,\n colorClasses.border,\n colorClasses.text,\n \"prose prose-sm max-w-full\",\n selected\n ? `border-blue-600 ring-2 ${colorClasses.selectedRing} shadow-xl`\n : \"shadow-md hover:shadow-lg\",\n currentColorName === \"yellow\"\n ? \"shadow-yellow-300/50 shadow-lg transform rotate-0.5\"\n : \"\",\n )}\n style={POSITION_RELATIVE_STYLE}\n >\n {isEditing ? (\n <textarea\n ref={textAreaRef}\n value={currentText}\n onChange={handleTextChange}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n className={classNames(\n \"w-full flex-1 bg-transparent border-none outline-none resize-none text-[10px] p-0 m-0\",\n colorClasses.text,\n colorClasses.placeholder,\n )}\n style={TEXTAREA_STYLE}\n placeholder=\"Enter text...\"\n />\n ) : (\n <div\n className=\"whitespace-pre-wrap break-words w-full h-full overflow-y-auto custom-scrollbar text-[10px]\"\n dangerouslySetInnerHTML={{\n __html: formatText(currentText),\n }}\n />\n )}\n\n {/* PostIt folded corner effect */}\n {currentColorName === \"yellow\" && (\n <div className=\"absolute top-0 right-0 w-4 h-4\">\n <div className=\"absolute top-0 right-0 w-0 h-0 border-l-[16px] border-b-[16px] border-l-transparent border-b-yellow-400/30 rounded-br-lg\"></div>\n </div>\n )}\n </div>\n </div>\n );\n});\n","import { memo, useMemo } from \"react\";\nimport { Handle } from \"@xyflow/react\";\nimport * as ContextMenu from \"@radix-ui/react-context-menu\";\nimport { buildUrl } from \"../utils/url-builder\";\nimport { getIcon } from \"../utils/badges\";\nimport {\n NODE_WIDTH_STYLE,\n ROTATED_LABEL_STYLE,\n TINY_FONT_STYLE,\n EMPTY_ARRAY,\n} from \"./shared-styles\";\n\ninterface FlowData {\n id: string;\n version: string;\n name: string;\n summary?: string;\n owners?: string[];\n sidebar?: {\n badge?: string;\n };\n styles?: {\n backgroundColor?: string;\n borderColor?: string;\n icon?: string;\n node?: {\n color?: string;\n label?: string;\n };\n };\n}\n\ninterface Data {\n label: string;\n bgColor: string;\n color: string;\n mode: \"simple\" | \"full\";\n flow: {\n data: FlowData;\n };\n showTarget?: boolean;\n showSource?: boolean;\n}\n\nfunction classNames(...classes: any) {\n return classes.filter(Boolean).join(\" \");\n}\n\nexport default memo(function FlowNode({\n data,\n sourcePosition,\n targetPosition,\n}: any) {\n const { mode, flow } = data as Data;\n\n const { id, version, owners = EMPTY_ARRAY, name, styles } = flow.data;\n const { node: { color = \"teal\", label } = {}, icon = \"QueueListIcon\" } =\n styles || {};\n\n const Icon = useMemo(() => getIcon(icon), [icon]);\n const nodeLabel = label || flow?.data?.sidebar?.badge || \"Flow\";\n const fontSize = nodeLabel.length > 10 ? \"7px\" : \"9px\";\n\n return (\n <ContextMenu.Root>\n <ContextMenu.Trigger>\n <div\n className={classNames(\n `rounded-md border flex justify-start bg-[rgb(var(--ec-card-bg))] text-[rgb(var(--ec-page-text))] border-${color}-400`,\n )}\n style={NODE_WIDTH_STYLE}\n >\n <div\n className={classNames(\n `bg-gradient-to-b from-${color}-500 to-${color}-700 relative flex flex-col items-center w-5 justify-between rounded-l-sm text-${color}-100`,\n `border-r-[1px] border-${color}-500`,\n )}\n >\n {Icon && <Icon className=\"w-4 h-4 opacity-90 text-white mt-1\" />}\n {mode === \"full\" && (\n <span\n className={`text-center text-[${fontSize}] text-white font-bold uppercase mb-4`}\n style={ROTATED_LABEL_STYLE}\n >\n {nodeLabel}\n </span>\n )}\n </div>\n <div className=\"p-1 flex-1\">\n {targetPosition && (\n <Handle type=\"target\" position={targetPosition} />\n )}\n {sourcePosition && (\n <Handle type=\"source\" position={sourcePosition} />\n )}\n <div\n className={classNames(\n mode === \"full\"\n ? `border-b border-[rgb(var(--ec-page-border))]`\n : \"\",\n )}\n >\n <span className=\"text-xs font-bold block pt-0.5 pb-0.5\">\n {name}\n </span>\n <div className=\"flex justify-between\">\n <span className=\"text-[10px] font-light block pt-0.5 pb-0.5 \">\n v{version}\n </span>\n {mode === \"simple\" && (\n <span className=\"text-[10px] text-[rgb(var(--ec-page-text-muted))] font-light block pt-0.5 pb-0.5 \">\n {nodeLabel}\n </span>\n )}\n </div>\n </div>\n {mode === \"full\" && (\n <div className=\"divide-y divide-[rgb(var(--ec-page-border))] \">\n <div className=\"leading-3 py-1\">\n <span className=\"text-[8px] font-light\">\n {flow.data.summary}\n </span>\n </div>\n\n <div className=\"grid grid-cols-2 gap-x-4 py-1\">\n <span className=\"text-xs\" style={TINY_FONT_STYLE}>\n Owners: {owners.length}\n </span>\n </div>\n </div>\n )}\n </div>\n </div>\n </ContextMenu.Trigger>\n <ContextMenu.Portal>\n <ContextMenu.Content className=\"min-w-[220px] bg-[rgb(var(--ec-card-bg))] rounded-md p-1 shadow-md border border-[rgb(var(--ec-page-border))]\">\n <ContextMenu.Item\n asChild\n className=\"text-sm px-2 py-1.5 outline-none cursor-pointer hover:bg-orange-100 rounded-sm flex items-center\"\n >\n <a href={buildUrl(`/docs/flows/${id}/${version}`)}>\n Read documentation\n </a>\n </ContextMenu.Item>\n <ContextMenu.Item\n asChild\n className=\"text-sm px-2 py-1.5 outline-none cursor-pointer hover:bg-orange-100 rounded-sm flex items-center\"\n >\n <a href={buildUrl(`/visualiser/flows/${id}/${version}`)}>\n View in visualiser\n </a>\n </ContextMenu.Item>\n <ContextMenu.Separator className=\"h-[1px] bg-[rgb(var(--ec-page-border))] m-1\" />\n <ContextMenu.Item asChild>\n <a\n href={buildUrl(`/docs/flows/${id}/${version}/changelog`)}\n className=\"text-sm px-2 py-1.5 outline-none cursor-pointer hover:bg-orange-100 rounded-sm flex items-center\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Read changelog\n </a>\n </ContextMenu.Item>\n </ContextMenu.Content>\n </ContextMenu.Portal>\n </ContextMenu.Root>\n );\n});\n","/**\n * Simple URL builder utility\n * In the visualizer, this is a fallback - consumers should use callbacks instead\n */\n\nexport function buildUrl(path: string): string {\n // For visualizer, just return the path as-is\n // The consuming application should handle URL building via callbacks\n return path;\n}\n","import * as HeroIcons from \"@heroicons/react/24/outline\";\nimport { getIconForProtocol } from \"./protocols\";\n\nexport function getIcon(iconName: string): React.ComponentType<any> | null {\n // Try protocol icons first\n const entry = getIconForProtocol(iconName);\n if (entry) return entry.component;\n\n // Fall back to HeroIcons\n const heroIcon = HeroIcons[iconName as keyof typeof HeroIcons];\n return heroIcon || null;\n}\n","import { Handle, Position } from \"@xyflow/react\";\nimport { getIcon } from \"../utils/badges\";\nimport * as ContextMenu from \"@radix-ui/react-context-menu\";\nimport { buildUrl } from \"../utils/url-builder\";\nimport { memo, useState, useMemo } from \"react\";\nimport {\n HANDLE_LEFT_OFFSET_STYLE,\n HANDLE_RIGHT_OFFSET_STYLE,\n EMPTY_ARRAY,\n} from \"./shared-styles\";\n\ninterface EntityData {\n id: string;\n name: string;\n version: string;\n properties?: any[];\n aggregateRoot?: boolean;\n sidebar?: any;\n styles?: {\n backgroundColor?: string;\n borderColor?: string;\n icon?: string;\n node?: {\n color?: string;\n label?: string;\n };\n };\n}\n\ninterface Data {\n title: string;\n label: string;\n bgColor: string;\n color: string;\n mode: \"simple\" | \"full\";\n entity: {\n data: EntityData;\n };\n showTarget?: boolean;\n showSource?: boolean;\n externalToDomain?: boolean;\n domainName?: string;\n domainId?: string;\n group?: {\n type: string;\n value: string;\n };\n}\n\nfunction classNames(...classes: any) {\n return classes.filter(Boolean).join(\" \");\n}\n\nexport default memo(function EntityNode({\n data,\n sourcePosition,\n targetPosition,\n}: any) {\n const { mode, entity, externalToDomain, domainName } = data as Data;\n const {\n name,\n version,\n properties = EMPTY_ARRAY,\n aggregateRoot,\n styles,\n sidebar: _sidebar,\n } = entity.data;\n\n const {\n node: { color: _color = \"blue\", label: _label } = {},\n icon = \"CubeIcon\",\n } = styles || {};\n\n const Icon = useMemo(() => getIcon(icon), [icon]);\n\n const [hoveredProperty, setHoveredProperty] = useState<string | null>(null);\n\n return (\n <ContextMenu.Root>\n <ContextMenu.Trigger>\n <div\n className={classNames(\n \"bg-[rgb(var(--ec-card-bg))] border rounded-lg shadow-sm min-w-[200px]\",\n externalToDomain ? \"border-amber-500/60\" : \"border-blue-400/50\",\n )}\n >\n {/* Table Header */}\n <div\n className={classNames(\n \"px-4 py-2 rounded-t-lg border-b border-[rgb(var(--ec-page-border))]\",\n externalToDomain ? \"bg-amber-500/20\" : \"bg-blue-500/15\",\n )}\n >\n <div className=\"flex items-center gap-2\">\n {Icon && (\n <Icon className=\"w-4 h-4 text-[rgb(var(--ec-page-text-muted))]\" />\n )}\n <span className=\"font-semibold text-[rgb(var(--ec-page-text))] text-sm\">\n {name}\n </span>\n {aggregateRoot && (\n <span className=\"text-xs bg-amber-500/20 text-amber-600 dark:text-amber-400 px-1.5 py-0.5 rounded font-medium\">\n AR\n </span>\n )}\n </div>\n {domainName && (\n <div className=\"text-xs text-[rgb(var(--ec-page-text-muted))] font-medium mt-1\">\n from {domainName} domain\n </div>\n )}\n {mode === \"full\" && (\n <div className=\"text-xs text-[rgb(var(--ec-page-text-muted))] mt-1\">\n v{version}\n </div>\n )}\n </div>\n\n {/* Properties Table */}\n {properties.length > 0 ? (\n <div className=\"divide-y divide-[rgb(var(--ec-page-border))] relative\">\n {properties.map((property: any, index: number) => {\n const propertyKey = `${property.name}-${index}`;\n const isHovered = hoveredProperty === propertyKey;\n return (\n <div\n key={propertyKey}\n className=\"relative flex items-center justify-between px-4 py-2 hover:bg-[rgb(var(--ec-page-border)/0.2)]\"\n onMouseEnter={() =>\n property.description && setHoveredProperty(propertyKey)\n }\n onMouseLeave={() => setHoveredProperty(null)}\n >\n {/* Target handle */}\n <Handle\n type=\"target\"\n position={Position.Left}\n id={`${property.name}-target`}\n className=\"!w-3 !h-3 !bg-[rgb(var(--ec-card-bg))] !border-2 !border-[rgb(var(--ec-page-border))] !rounded-full !left-[-0px]\"\n style={HANDLE_LEFT_OFFSET_STYLE}\n />\n\n {/* Source handle */}\n <Handle\n type=\"source\"\n position={Position.Right}\n id={`${property.name}-source`}\n className=\"!w-3 !h-3 !bg-[rgb(var(--ec-card-bg))] !border-2 !border-[rgb(var(--ec-page-border))] !rounded-full !right-[-0px]\"\n style={HANDLE_RIGHT_OFFSET_STYLE}\n />\n\n {/* Property content */}\n <div className=\"flex-1 flex items-center justify-between\">\n <div className=\"flex items-center gap-1\">\n <span className=\"text-sm font-medium text-[rgb(var(--ec-page-text))]\">\n {property.name}\n </span>\n {property.required && (\n <span className=\"text-red-500 text-xs\">*</span>\n )}\n </div>\n <span className=\"text-sm text-[rgb(var(--ec-page-text-muted))] font-mono\">\n {property.type}\n </span>\n </div>\n\n {/* Reference indicator */}\n {property.references && (\n <div className=\"absolute right-2 top-1/2 transform -translate-y-1/2\">\n <div\n className=\"w-2 h-2 bg-blue-500 rounded-full\"\n title={`References ${property.references}`}\n ></div>\n </div>\n )}\n\n {/* Property Tooltip */}\n {isHovered && property.description && (\n <div className=\"absolute left-full ml-2 top-1/2 transform -translate-y-1/2 z-[9999] w-[200px] bg-gray-900 text-white text-xs rounded-lg py-2 px-3 pointer-events-none shadow-xl max-w-xl opacity-100\">\n <div className=\"text-gray-200 whitespace-normal break-words\">\n {property.description}\n </div>\n <div className=\"absolute right-full top-1/2 transform -translate-y-1/2 border-4 border-transparent border-r-gray-900\"></div>\n </div>\n )}\n </div>\n );\n })}\n </div>\n ) : (\n <div className=\"px-4 py-3 text-sm text-[rgb(var(--ec-page-text-muted))] text-center\">\n No properties defined\n </div>\n )}\n\n {/* Main node handles (if no properties) */}\n {properties.length === 0 && (\n <>\n {targetPosition && (\n <Handle type=\"target\" position={targetPosition} />\n )}\n {sourcePosition && (\n <Handle type=\"source\" position={sourcePosition} />\n )}\n </>\n )}\n </div>\n </ContextMenu.Trigger>\n <ContextMenu.Portal>\n <ContextMenu.Content\n className=\"min-w-[220px] bg-[rgb(var(--ec-card-bg))] rounded-md p-1 shadow-md border border-[rgb(var(--ec-page-border))]\"\n onClick={(e) => e.stopPropagation()}\n >\n <ContextMenu.Item\n asChild\n className=\"text-sm text-[rgb(var(--ec-page-text))] px-2 py-1.5 outline-none cursor-pointer hover:bg-[rgb(var(--ec-accent-subtle))] rounded-sm flex items-center\"\n >\n <a href={buildUrl(`/docs/entities/${entity.data.id}/${version}`)}>\n Read documentation\n </a>\n </ContextMenu.Item>\n </ContextMenu.Content>\n </ContextMenu.Portal>\n </ContextMenu.Root>\n );\n});\n","import { memo } from \"react\";\nimport { UserIcon } from \"@heroicons/react/20/solid\";\nimport { Handle } from \"@xyflow/react\";\nimport { NODE_WIDTH_STYLE, ROTATED_LABEL_STYLE } from \"./shared-styles\";\n\ninterface Data {\n title: string;\n label: string;\n bgColor: string;\n color: string;\n mode: \"simple\" | \"full\";\n step: {\n id: string;\n title: string;\n summary: string;\n name: string;\n actor: { name: string };\n };\n showTarget?: boolean;\n showSource?: boolean;\n}\n\nfunction classNames(...classes: any) {\n return classes.filter(Boolean).join(\" \");\n}\n\nexport default memo(function UserNode({\n data,\n sourcePosition,\n targetPosition,\n}: any) {\n const {\n mode,\n step,\n showTarget: _showTarget = true,\n showSource: _showSource = true,\n } = data as Data;\n\n const { summary, actor: { name } = {} } = step;\n\n return (\n <div\n className={classNames(\n `rounded-md border flex justify-start bg-[rgb(var(--ec-card-bg))] text-[rgb(var(--ec-page-text))] border-yellow-400`,\n mode === \"full\" ? \"min-h-[5em]\" : \"min-h-[2em]\",\n )}\n style={NODE_WIDTH_STYLE}\n >\n <div\n className={classNames(\n \"bg-gradient-to-b from-yellow-400 to-yellow-600 relative flex flex-col items-center w-5 justify-between rounded-l-sm text-orange-100-500\",\n `border-r-[1px] border-yellow-500`,\n )}\n >\n <UserIcon className=\"w-4 h-4 opacity-90 text-white mt-1\" />\n {mode === \"full\" && (\n <span\n className=\"text-center text-[9px] text-white font-bold uppercase mb-4\"\n style={ROTATED_LABEL_STYLE}\n >\n ACTOR\n </span>\n )}\n </div>\n <div className=\"p-1 flex-1\">\n {targetPosition && <Handle type=\"target\" position={targetPosition} />}\n {sourcePosition && <Handle type=\"source\" position={sourcePosition} />}\n\n {(!summary || mode !== \"full\") && (\n <div className=\"h-full \">\n <span className=\"text-sm font-bold block pb-0.5 w-full\">\n {name}\n </span>\n {mode === \"simple\" && (\n <div className=\"w-full text-right\">\n <span className=\" w-full text-[10px] text-[rgb(var(--ec-page-text-muted))] font-light block pt-0.5 pb-0.5 \">\n Event\n </span>\n </div>\n )}\n </div>\n )}\n\n {summary && mode === \"full\" && (\n <div>\n <div\n className={classNames(\n mode === \"full\"\n ? `border-b border-[rgb(var(--ec-page-border))]`\n : \"\",\n )}\n >\n <span className=\"text-xs font-bold block pb-0.5\">{name}</span>\n </div>\n {mode === \"full\" && (\n <div className=\"divide-y divide-[rgb(var(--ec-page-border))] \">\n <div className=\"leading-3 py-1\">\n <span className=\"text-[8px] font-light\">{summary}</span>\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n );\n});\n","import { memo } from \"react\";\nimport { Handle, Position } from \"@xyflow/react\";\nimport { HIDDEN_HANDLE_STYLE } from \"./OwnerIndicator\";\nimport { NODE_WIDTH_STYLE, ROTATED_LABEL_STYLE } from \"./shared-styles\";\n\ninterface Data {\n title: string;\n label: string;\n bgColor: string;\n color: string;\n mode: \"simple\" | \"full\";\n step: { id: string; title: string; summary: string };\n showTarget?: boolean;\n showSource?: boolean;\n}\n\nfunction classNames(...classes: any) {\n return classes.filter(Boolean).join(\" \");\n}\n\nexport default memo(function StepNode({\n data,\n sourcePosition,\n targetPosition,\n}: any) {\n const { mode, step } = data as Data;\n\n const { title, summary } = step;\n\n return (\n <div\n className={classNames(\n \"rounded-md border flex justify-start bg-[rgb(var(--ec-card-bg))] text-[rgb(var(--ec-page-text))] border-blue-400 min-h-[3em]\",\n )}\n style={NODE_WIDTH_STYLE}\n >\n <div\n className={classNames(\n \"bg-gradient-to-b from-gray-700 to-gray-700 relative flex flex-col items-center w-5 justify-end rounded-l-sm text-orange-100-500\",\n `border-r-[1px] border-gray-500`,\n )}\n >\n {mode === \"full\" && (\n <span\n className=\"text-center text-[9px] text-white font-bold uppercase mb-4\"\n style={ROTATED_LABEL_STYLE}\n >\n Step\n </span>\n )}\n </div>\n <div className=\"p-1 flex-1\">\n <Handle\n type=\"target\"\n position={targetPosition || Position.Left}\n style={HIDDEN_HANDLE_STYLE}\n />\n <Handle\n type=\"source\"\n position={sourcePosition || Position.Right}\n style={HIDDEN_HANDLE_STYLE}\n />\n\n {!summary && (\n <div className=\"h-full flex items-center\">\n <span className=\"text-sm font-bold block pb-0.5\">{title}</span>\n </div>\n )}\n\n {summary && (\n <div>\n <div\n className={classNames(\n mode === \"full\"\n ? `border-b border-[rgb(var(--ec-page-border))]`\n : \"\",\n )}\n >\n <span className=\"text-xs font-bold block pb-0.5\">{title}</span>\n </div>\n {mode === \"full\" && (\n <div className=\"divide-y divide-[rgb(var(--ec-page-border))] \">\n <div className=\"leading-3 py-1\">\n <span className=\"text-[8px] font-light\">{summary}</span>\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n );\n});\n","import {\n Handle,\n useReactFlow,\n useOnSelectionChange,\n Position,\n} from \"@xyflow/react\";\nimport * as ContextMenu from \"@radix-ui/react-context-menu\";\nimport { buildUrl } from \"../utils/url-builder\";\nimport { getIcon } from \"../utils/badges\";\nimport { memo, useState, useCallback, useMemo } from \"react\";\nimport { HANDLE_LEFT_STYLE, HANDLE_RIGHT_STYLE } from \"./shared-styles\";\n\ninterface DomainData {\n id: string;\n version: string;\n name: string;\n services?: string[];\n styles?: {\n backgroundColor?: string;\n borderColor?: string;\n icon?: string;\n };\n}\n\ninterface Data {\n mode: \"simple\" | \"full\";\n domain: {\n data: DomainData;\n };\n}\n\nexport default memo(function DomainNode({ data, id: nodeId }: any) {\n const { mode, domain } = data as Data;\n const reactFlow = useReactFlow();\n const [highlightedServices, setHighlightedServices] = useState<Set<string>>(\n new Set(),\n );\n\n const { id, version, name, services = [], styles } = domain.data;\n const { icon = \"RectangleGroupIcon\" } = styles || {};\n\n const Icon = useMemo(() => getIcon(icon), [icon]);\n const ServerIcon = useMemo(() => getIcon(\"ServerIcon\"), []);\n\n // Listen for selection changes to highlight connected services\n const handleSelectionChange = useCallback(\n ({ nodes: selectedNodes }: { nodes: any[] }) => {\n if (selectedNodes.length === 0) {\n setHighlightedServices(new Set());\n return;\n }\n\n const selectedNode = selectedNodes[0];\n if (!selectedNode) {\n setHighlightedServices(new Set());\n return;\n }\n\n // Get all edges\n const edges = reactFlow.getEdges();\n const connectedServiceIds = new Set<string>();\n\n // Find services connected to the selected node\n edges.forEach((edge) => {\n if (\n edge.source === selectedNode.id ||\n edge.target === selectedNode.id\n ) {\n // Check if this edge connects to our domain\n if (edge.source === nodeId && edge.sourceHandle) {\n // Extract service ID from sourceHandle (format: \"serviceId-source\")\n const serviceId = edge.sourceHandle.replace(\"-source\", \"\");\n connectedServiceIds.add(serviceId);\n }\n if (edge.target === nodeId && edge.targetHandle) {\n // Extract service ID from targetHandle (format: \"serviceId-target\")\n const serviceId = edge.targetHandle.replace(\"-target\", \"\");\n connectedServiceIds.add(serviceId);\n }\n }\n });\n\n setHighlightedServices(connectedServiceIds);\n },\n [nodeId, reactFlow],\n );\n\n useOnSelectionChange({\n onChange: handleSelectionChange,\n });\n\n return (\n <ContextMenu.Root>\n <ContextMenu.Trigger>\n <div className=\"w-full rounded-lg border-2 border-yellow-400 bg-[rgb(var(--ec-card-bg))] shadow-lg\">\n <div className=\"bg-[rgb(var(--ec-domain-header-bg,253_224_71)/0.2)] px-3 py-2 flex items-center space-x-2\">\n {Icon && <Icon className=\"w-4 h-4 text-yellow-500\" />}\n <div>\n <span className=\"text-sm font-bold text-[rgb(var(--ec-page-text))]\">\n {name}\n </span>\n <span className=\"text-xs text-yellow-500 ml-2\">v{version}</span>\n </div>\n </div>\n {mode === \"full\" && services.length > 0 && (\n <div>\n {services.map((service: any, index: number) => {\n const isHighlighted = highlightedServices.has(service.data.id);\n\n return (\n <ContextMenu.Root key={`${service.data.id}-${index}`}>\n <ContextMenu.Trigger asChild>\n <div\n className={`relative flex items-center justify-between px-3 py-2 cursor-pointer ${index !== services.length - 1 ? \"border-b border-[rgb(var(--ec-page-border))]\" : \"\"} ${isHighlighted ? \"bg-pink-100 border-pink-300\" : \"\"}`}\n >\n <Handle\n type=\"target\"\n position={Position.Left}\n id={`${service.data.id}-target`}\n className=\"!left-[-1px] !w-2 !h-2 !bg-gray-400 !border !border-gray-500 !rounded-full !z-10\"\n style={HANDLE_LEFT_STYLE}\n />\n <Handle\n type=\"source\"\n position={Position.Right}\n id={`${service.data.id}-source`}\n className=\"!right-[-1px] !w-2 !h-2 !bg-gray-400 !border !border-gray-500 !rounded-full !z-10\"\n style={HANDLE_RIGHT_STYLE}\n />\n <div className=\"flex items-center space-x-3\">\n <div className=\"flex items-center justify-center w-5 h-5 bg-pink-500 rounded\">\n {ServerIcon && (\n <ServerIcon className=\"w-3 h-3 text-white\" />\n )}\n </div>\n <span className=\"text-sm font-medium text-[rgb(var(--ec-page-text))]\">\n {service.data.name || service.data.id}\n </span>\n </div>\n <div className=\"flex items-center space-x-4 text-sm text-[rgb(var(--ec-page-text-muted))]\">\n <span className=\"text-xs\">\n v{service.data.version}\n </span>\n </div>\n </div>\n </ContextMenu.Trigger>\n <ContextMenu.Portal>\n <ContextMenu.Content className=\"min-w-[220px] bg-[rgb(var(--ec-card-bg))] rounded-md p-1 shadow-md border border-[rgb(var(--ec-page-border))]\">\n <ContextMenu.Item\n className=\"text-sm text-[rgb(var(--ec-page-text))] px-2 py-1.5 outline-none cursor-pointer hover:bg-[rgb(var(--ec-page-border)/0.5)] rounded-sm flex items-center\"\n onClick={() =>\n (window.location.href = buildUrl(\n `/docs/services/${service.data.id}/${service.data.version}`,\n ))\n }\n >\n View Service Documentation\n </ContextMenu.Item>\n <ContextMenu.Item\n className=\"text-sm text-[rgb(var(--ec-page-text))] px-2 py-1.5 outline-none cursor-pointer hover:bg-[rgb(var(--ec-page-border)/0.5)] rounded-sm flex items-center\"\n onClick={() =>\n (window.location.href = buildUrl(\n `/visualiser/services/${service.data.id}/${service.data.version}`,\n ))\n }\n >\n View Service Visualizer\n </ContextMenu.Item>\n </ContextMenu.Content>\n </ContextMenu.Portal>\n </ContextMenu.Root>\n );\n })}\n </div>\n )}\n </div>\n </ContextMenu.Trigger>\n <ContextMenu.Portal>\n <ContextMenu.Content className=\"min-w-[220px] bg-[rgb(var(--ec-card-bg))] rounded-md p-1 shadow-md border border-[rgb(var(--ec-page-border))]\">\n <ContextMenu.Item\n className=\"text-sm text-[rgb(var(--ec-page-text))] px-2 py-1.5 outline-none cursor-pointer hover:bg-[rgb(var(--ec-page-border)/0.5)] rounded-sm flex items-center\"\n onClick={() =>\n (window.location.href = buildUrl(\n `/docs/domains/${id}/${version}`,\n ))\n }\n >\n View Domain Documentation\n </ContextMenu.Item>\n <ContextMenu.Item\n className=\"text-sm text-[rgb(var(--ec-page-text))] px-2 py-1.5 outline-none cursor-pointer hover:bg-[rgb(var(--ec-page-border)/0.5)] rounded-sm flex items-center\"\n onClick={() =>\n (window.location.href = buildUrl(\n `/visualiser/domains/${id}/${version}`,\n ))\n }\n >\n View Domain Visualizer\n </ContextMenu.Item>\n </ContextMenu.Content>\n </ContextMenu.Portal>\n </ContextMenu.Root>\n );\n});\n","import { memo } from \"react\";\nimport type { NodeProps } from \"@xyflow/react\";\nimport { BoxesIcon } from \"lucide-react\";\n\nexport type GroupNodeData = {\n mode: string;\n domain: {\n name: string;\n version: string;\n summary: string;\n };\n};\n\nconst GROUP_CONTAINER_STYLE = {\n width: \"100%\",\n height: \"100%\",\n borderRadius: 12,\n border: \"2px solid var(--ec-group-border, #c4b5fd)\",\n backgroundColor: \"var(--ec-group-bg, rgba(250, 248, 255, 0.35))\",\n position: \"relative\" as const,\n overflow: \"visible\" as const,\n} as const;\n\nconst GROUP_HEADER_STYLE = {\n position: \"absolute\" as const,\n top: 0,\n left: 0,\n right: 0,\n height: 44,\n borderTopLeftRadius: 10,\n borderTopRightRadius: 10,\n background: \"var(--ec-group-header-bg, rgba(237, 233, 254, 0.7))\",\n borderBottom: \"1px solid var(--ec-group-border, #c4b5fd)\",\n overflow: \"visible\" as const,\n} as const;\n\nconst GROUP_WATERMARK_STYLE = {\n position: \"absolute\" as const,\n top: 6,\n right: 10,\n opacity: 0.12,\n transform: \"rotate(12deg)\",\n pointerEvents: \"none\" as const,\n} as const;\n\nconst GROUP_ICON_CIRCLE_STYLE = {\n position: \"absolute\" as const,\n top: -14,\n left: 12,\n width: 32,\n height: 32,\n borderRadius: \"50%\",\n background: \"#7c3aed\",\n border: \"2px solid #a78bfa\",\n display: \"flex\",\n alignItems: \"center\" as const,\n justifyContent: \"center\" as const,\n boxShadow: \"0 1px 3px rgba(0,0,0,0.1)\",\n zIndex: 10,\n} as const;\n\nconst GROUP_BANNER_CONTENT_STYLE = {\n display: \"flex\",\n alignItems: \"center\" as const,\n justifyContent: \"center\" as const,\n height: \"100%\",\n padding: \"0 40px\",\n} as const;\n\nconst GROUP_BANNER_INNER_STYLE = {\n display: \"flex\",\n alignItems: \"center\" as const,\n gap: 8,\n} as const;\n\nconst GROUP_DOMAIN_NAME_STYLE = {\n fontSize: 15,\n fontWeight: 800,\n color: \"var(--ec-group-text, #5b21b6)\",\n letterSpacing: \"0.06em\",\n textTransform: \"uppercase\" as const,\n whiteSpace: \"nowrap\" as const,\n} as const;\n\nconst GROUP_VERSION_STYLE = {\n fontSize: 9,\n fontWeight: 500,\n color: \"#a78bfa\",\n} as const;\n\nconst GROUP_ICON_COLOR_STYLE = { color: \"#7c3aed\" } as const;\nconst GROUP_ICON_WHITE_STYLE = { color: \"white\" } as const;\n\nexport default memo(function GroupNode({ data }: NodeProps) {\n const { domain } = data as unknown as GroupNodeData;\n\n return (\n <div style={GROUP_CONTAINER_STYLE}>\n {/* Header banner */}\n <div style={GROUP_HEADER_STYLE}>\n {/* Watermark icon in banner */}\n <div style={GROUP_WATERMARK_STYLE}>\n <BoxesIcon size={28} strokeWidth={2} style={GROUP_ICON_COLOR_STYLE} />\n </div>\n\n {/* Icon circle overlapping top of banner */}\n <div style={GROUP_ICON_CIRCLE_STYLE}>\n <BoxesIcon\n size={16}\n strokeWidth={2.5}\n style={GROUP_ICON_WHITE_STYLE}\n />\n </div>\n\n {/* Banner text content */}\n <div style={GROUP_BANNER_CONTENT_STYLE}>\n <div style={GROUP_BANNER_INNER_STYLE}>\n <span style={GROUP_DOMAIN_NAME_STYLE}>\n {domain?.name || \"Domain\"}\n </span>\n {domain?.version && (\n <span style={GROUP_VERSION_STYLE}>v{domain.version}</span>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n});\n","import { Handle } from \"@xyflow/react\";\nimport * as Icons from \"@heroicons/react/24/solid\";\nimport { memo, useMemo, type ComponentType } from \"react\";\nimport * as ContextMenu from \"@radix-ui/react-context-menu\";\nimport * as Tooltip from \"@radix-ui/react-tooltip\";\nimport {\n NODE_WIDTH_STYLE,\n ROTATED_LABEL_STYLE,\n TINY_FONT_STYLE,\n EMPTY_OBJECT,\n EMPTY_ARRAY,\n} from \"./shared-styles\";\n\ntype MenuItem = {\n label: string;\n url?: string;\n};\n\ninterface Data {\n title: string;\n label: string;\n bgColor: string;\n color: string;\n mode: \"simple\" | \"full\";\n step: {\n id: string;\n title: string;\n summary: string;\n name: string;\n actor: { name: string };\n };\n showTarget?: boolean;\n showSource?: boolean;\n custom: {\n icon?: string;\n type?: string;\n title?: string;\n summary?: string;\n url?: string;\n color?: string;\n properties?: Record<string, string>;\n menu?: MenuItem[];\n height?: number;\n };\n}\n\nfunction classNames(...classes: any) {\n return classes.filter(Boolean).join(\" \");\n}\n\nexport default memo(function UserNode({\n data,\n sourcePosition,\n targetPosition,\n}: any) {\n const { mode, step, custom: customProps } = data as Data;\n\n const {\n color = \"blue\",\n title = \"Custom\",\n icon = \"UserIcon\",\n type = \"custom\",\n summary = \"\",\n url: _url = \"\",\n properties = EMPTY_OBJECT,\n menu = EMPTY_ARRAY,\n height = 5,\n } = customProps;\n\n const IconComponent = useMemo<\n ComponentType<{ className?: string }> | undefined\n >(() => Icons[icon as keyof typeof Icons], [icon]);\n\n const { actor: { name: _name } = {} } = step;\n\n const isLongType = type && type.length > 10;\n const displayType = isLongType ? `${type.substring(0, 10)}...` : type;\n\n return (\n <ContextMenu.Root>\n <ContextMenu.Trigger>\n <div\n className={classNames(\n `rounded-md border flex justify-start bg-[rgb(var(--ec-card-bg))] text-[rgb(var(--ec-page-text))] border-${color}-400`,\n )}\n style={{\n minHeight: mode === \"full\" ? `${height}em` : \"2em\",\n ...NODE_WIDTH_STYLE,\n }}\n >\n <div\n className={classNames(\n `bg-gradient-to-b from-${color}-400 to-${color}-600 relative flex flex-col items-center w-5 justify-between rounded-l-sm text-orange-100-500`,\n `border-r-[1px] border-${color}`,\n )}\n >\n {IconComponent && (\n <IconComponent className=\"w-4 h-4 opacity-90 text-white mt-1\" />\n )}\n {mode === \"full\" && (\n <Tooltip.Provider>\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <span\n className=\"text-center text-[9px] text-white font-bold uppercase mb-4\"\n style={ROTATED_LABEL_STYLE}\n >\n {displayType}\n </span>\n </Tooltip.Trigger>\n {isLongType && (\n <Tooltip.Portal>\n <Tooltip.Content\n className=\"bg-slate-800 text-white rounded px-2 py-1 text-xs shadow-md z-50\"\n side=\"right\"\n sideOffset={5}\n >\n {type}\n <Tooltip.Arrow className=\"fill-slate-800\" />\n </Tooltip.Content>\n </Tooltip.Portal>\n )}\n </Tooltip.Root>\n </Tooltip.Provider>\n )}\n </div>\n <div className=\"p-1 flex-1\">\n {targetPosition && (\n <Handle type=\"target\" position={targetPosition} />\n )}\n {sourcePosition && (\n <Handle type=\"source\" position={sourcePosition} />\n )}\n\n {(!summary || mode !== \"full\") && (\n <div className=\"h-full \">\n <span className=\"text-sm font-bold block pb-0.5 w-full\">\n {title}\n </span>\n </div>\n )}\n\n {summary && mode === \"full\" && (\n <div>\n <div\n className={classNames(\n mode === \"full\"\n ? `border-b border-[rgb(var(--ec-page-border))]`\n : \"\",\n )}\n >\n <span className=\"text-xs font-bold block pb-0.5\">\n {title}\n </span>\n </div>\n {mode === \"full\" && (\n <div className=\"divide-y divide-[rgb(var(--ec-page-border))] \">\n <div className=\"leading-3 py-1\">\n <span className=\"text-[8px] font-light\">{summary}</span>\n </div>\n {properties && (\n <div className=\"grid grid-cols-2 gap-x-4 py-1\">\n {Object.entries(properties).map(([key, value]) => (\n <span\n key={key}\n className=\"text-xs\"\n style={TINY_FONT_STYLE}\n >\n {key}:{\" \"}\n {typeof value === \"string\" &&\n value.startsWith(\"http\") ? (\n <a\n href={value}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-blue-500 underline\"\n >\n {value}\n </a>\n ) : (\n value\n )}\n </span>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n </ContextMenu.Trigger>\n {menu?.length > 0 && (\n <ContextMenu.Portal>\n <ContextMenu.Content className=\"min-w-[220px] bg-[rgb(var(--ec-card-bg))] rounded-md p-1 shadow-md border border-[rgb(var(--ec-page-border))]\">\n {menu?.map((item) => {\n return (\n <ContextMenu.Item\n asChild\n className=\"text-sm px-2 py-1.5 outline-none cursor-pointer hover:bg-orange-100 rounded-sm flex items-center\"\n >\n <a href={item.url}>{item.label}</a>\n </ContextMenu.Item>\n );\n })}\n </ContextMenu.Content>\n </ContextMenu.Portal>\n )}\n </ContextMenu.Root>\n );\n});\n","import { memo } from \"react\";\nimport { Handle, Position } from \"@xyflow/react\";\nimport ExternalSystemComponent from \"./external-system/ExternalSystem\";\nimport { EXTERNAL_SYSTEM_HANDLE_STYLE } from \"./shared-styles\";\n\nexport default memo(function ExternalSystemNode(props: any) {\n return (\n <div className=\"relative\">\n <Handle\n type=\"target\"\n position={Position.Left}\n style={EXTERNAL_SYSTEM_HANDLE_STYLE}\n className=\"bg-gray-500\"\n />\n <Handle\n type=\"source\"\n position={Position.Right}\n style={EXTERNAL_SYSTEM_HANDLE_STYLE}\n className=\"bg-gray-500\"\n />\n <ExternalSystemComponent {...props} />\n </div>\n );\n});\n","import { memo } from \"react\";\nimport { Package } from \"lucide-react\";\nimport { Node, Handle, Position, useHandleConnections } from \"@xyflow/react\";\nimport { EventCatalogResource } from \"../types\";\nimport { NotesIndicator } from \"./NotesIndicator\";\nimport { HIDDEN_HANDLE_STYLE } from \"./OwnerIndicator\";\nimport {\n LINE_CLAMP_STYLE,\n FOLDED_CORNER_SHADOW_STYLE,\n useDarkMode,\n} from \"./shared-styles\";\n\nfunction GlowHandle({ side }: { side: \"left\" | \"right\" }) {\n return (\n <div\n style={{\n position: \"absolute\",\n top: \"50%\",\n [side]: -6,\n transform: \"translateY(-50%)\",\n width: 12,\n height: 12,\n borderRadius: \"50%\",\n background: \"linear-gradient(135deg, #6366f1, #4338ca)\",\n border: \"2px solid rgb(var(--ec-page-bg))\",\n zIndex: 20,\n animation: \"ec-dp-handle-pulse 2s ease-in-out infinite\",\n pointerEvents: \"none\",\n }}\n />\n );\n}\n\nfunction classNames(...classes: any) {\n return classes.filter(Boolean).join(\" \");\n}\n\ntype DataProductNodeData = EventCatalogResource & {\n dataProduct: {\n id: string;\n version: string;\n name: string;\n summary?: string;\n inputs?: any[];\n outputs?: any[];\n owners?: any[];\n deprecated?: boolean;\n draft?: boolean;\n notes?: import(\"../types\").Note[];\n };\n};\n\nexport type DataProductNode = Node<DataProductNodeData, \"data-product\">;\n\nfunction PostItDataProduct(props: DataProductNode) {\n const { version, name, summary, deprecated, draft, notes } =\n props.data.dataProduct;\n const mode = props.data.mode || \"simple\";\n\n return (\n <div\n className={classNames(\n \"relative min-w-44 max-w-56 min-h-[120px]\",\n props?.selected ? \"ring-2 ring-indigo-400/60 ring-offset-1\" : \"\",\n )}\n >\n <Handle\n type=\"target\"\n position={Position.Left}\n style={HIDDEN_HANDLE_STYLE}\n />\n <Handle\n type=\"source\"\n position={Position.Right}\n style={HIDDEN_HANDLE_STYLE}\n />\n {notes && notes.length > 0 && (\n <NotesIndicator notes={notes} resourceName={name} />\n )}\n {/* Inner wrapper with rotation */}\n <div\n className=\"absolute inset-0\"\n style={{\n background:\n \"linear-gradient(135deg, #c7d2fe 0%, #a5b4fc 40%, #6366f1 100%)\",\n boxShadow:\n \"1px 1px 3px rgba(0,0,0,0.15), 3px 4px 8px rgba(0,0,0,0.08)\",\n transform: \"rotate(1deg)\",\n border: deprecated\n ? \"2px dashed rgba(239, 68, 68, 0.5)\"\n : draft\n ? \"2px dashed rgba(99, 102, 241, 0.5)\"\n : \"none\",\n }}\n >\n {/* Folded corner */}\n <div style={FOLDED_CORNER_SHADOW_STYLE} />\n <div\n style={{\n position: \"absolute\",\n top: 0,\n right: 0,\n width: 0,\n height: 0,\n borderStyle: \"solid\",\n borderWidth: \"18px 0 0 18px\",\n borderColor: \"#4338ca transparent transparent transparent\",\n opacity: 0.3,\n }}\n />\n </div>\n\n {/* Content sits on top, unrotated */}\n <div className=\"relative px-3.5 py-3\">\n {/* Type label row */}\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center gap-1\">\n <Package className=\"w-3 h-3 text-indigo-900/50\" strokeWidth={2.5} />\n <span className=\"text-[8px] font-bold text-indigo-900/50 uppercase tracking-widest\">\n Data Product\n </span>\n </div>\n {draft && (\n <span className=\"text-[8px] font-extrabold text-amber-900 bg-amber-100 border border-dashed border-amber-400 px-1.5 py-0.5 rounded uppercase\">\n Draft\n </span>\n )}\n {deprecated && (\n <span className=\"text-[7px] font-bold text-white bg-red-500 border border-red-600 px-1.5 py-0.5 rounded uppercase\">\n Deprecated\n </span>\n )}\n </div>\n\n {/* Name */}\n <div\n className={classNames(\n \"text-[13px] font-bold leading-snug\",\n deprecated ? \"text-indigo-950/40 line-through\" : \"text-indigo-950\",\n )}\n >\n {name}\n </div>\n\n {/* Version */}\n {version && (\n <div className=\"text-[9px] text-indigo-900/40 font-semibold mt-0.5\">\n v{version}\n </div>\n )}\n\n {/* Summary */}\n {mode === \"full\" && summary && (\n <div\n className=\"mt-2 pt-1.5 border-t border-indigo-900/10 text-[9px] text-indigo-950/60 leading-relaxed overflow-hidden\"\n style={LINE_CLAMP_STYLE}\n title={summary}\n >\n {summary}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction DefaultDataProduct(props: DataProductNode) {\n const { version, name, summary, deprecated, draft, notes } =\n props.data.dataProduct;\n const mode = props.data.mode || \"simple\";\n const targetConnections = useHandleConnections({ type: \"target\" });\n const sourceConnections = useHandleConnections({ type: \"source\" });\n const isDark = useDarkMode();\n const deprecatedStripe = isDark\n ? \"rgba(239,68,68,0.25)\"\n : \"rgba(239,68,68,0.1)\";\n\n return (\n <div\n className={classNames(\n \"relative min-w-48 max-w-60 rounded-xl border-2 overflow-visible\",\n props?.selected ? \"ring-2 ring-indigo-400/60 ring-offset-2\" : \"\",\n deprecated\n ? \"border-dashed border-red-500\"\n : draft\n ? `border-dashed ${isDark ? \"border-indigo-400\" : \"border-indigo-400/60\"}`\n : \"border-indigo-500\",\n )}\n style={{\n background: deprecated\n ? `repeating-linear-gradient(135deg, transparent, transparent 6px, ${deprecatedStripe} 6px, ${deprecatedStripe} 7px), var(--ec-dp-node-bg, rgb(var(--ec-card-bg)))`\n : draft\n ? `repeating-linear-gradient(135deg, transparent, transparent 4px, ${isDark ? \"rgba(99,102,241,0.25)\" : \"rgba(99,102,241,0.15)\"} 4px, ${isDark ? \"rgba(99,102,241,0.25)\" : \"rgba(99,102,241,0.15)\"} 4.5px), repeating-linear-gradient(45deg, transparent, transparent 4px, ${isDark ? \"rgba(99,102,241,0.25)\" : \"rgba(99,102,241,0.15)\"} 4px, ${isDark ? \"rgba(99,102,241,0.25)\" : \"rgba(99,102,241,0.15)\"} 4.5px), var(--ec-dp-node-bg, rgb(var(--ec-card-bg)))`\n : \"var(--ec-dp-node-bg, rgb(var(--ec-card-bg)))\",\n boxShadow: \"0 2px 12px rgba(99, 102, 241, 0.15)\",\n }}\n >\n <Handle\n type=\"target\"\n position={Position.Left}\n style={HIDDEN_HANDLE_STYLE}\n />\n <Handle\n type=\"source\"\n position={Position.Right}\n style={HIDDEN_HANDLE_STYLE}\n />\n {notes && notes.length > 0 && (\n <NotesIndicator notes={notes} resourceName={name} />\n )}\n {targetConnections.length > 0 && <GlowHandle side=\"left\" />}\n {sourceConnections.length > 0 && <GlowHandle side=\"right\" />}\n\n {/* Badge positioned outside top-left corner */}\n <div className=\"absolute -top-2.5 left-2.5 flex items-center gap-1.5 z-10\">\n <span\n className={classNames(\n \"inline-flex items-center gap-1 text-[7px] font-bold uppercase tracking-widest text-white px-1.5 py-0.5 rounded shadow-sm\",\n deprecated ? \"bg-red-500\" : \"bg-indigo-500\",\n )}\n >\n <Package className=\"w-2.5 h-2.5\" strokeWidth={2.5} />\n Data Product{draft && \" (Draft)\"}\n {deprecated && \" (Deprecated)\"}\n </span>\n </div>\n\n <div className=\"px-3 pt-3.5 pb-2.5\">\n {/* Name + version */}\n <div className=\"flex items-baseline gap-1\">\n <span className=\"text-[13px] font-semibold leading-snug text-[rgb(var(--ec-page-text))]\">\n {name}\n </span>\n {version && (\n <span className=\"text-[10px] font-normal text-[rgb(var(--ec-page-text-muted))] shrink-0\">\n (v{version})\n </span>\n )}\n </div>\n\n {/* Summary */}\n {mode === \"full\" && summary && (\n <div\n className=\"mt-1.5 text-[9px] text-[rgb(var(--ec-page-text-muted))] leading-relaxed overflow-hidden\"\n style={LINE_CLAMP_STYLE}\n title={summary}\n >\n {summary}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nexport default memo(function DataProductNode(props: DataProductNode) {\n const nodeStyle = props?.data?.style;\n\n if (nodeStyle === \"post-it\") {\n return <PostItDataProduct {...props} />;\n }\n\n return <DefaultDataProduct {...props} />;\n});\n","import { memo, useMemo } from \"react\";\nimport { BaseEdge, getSmoothStepPath } from \"@xyflow/react\";\nimport { EDGE_WARNING_STYLE, EDGE_DEFAULT_STYLE } from \"../nodes/shared-styles\";\n\n/** Map collection type → envelope fill color (module-level, zero allocation). */\nfunction messageColor(collection: string): string {\n switch (collection) {\n case \"events\":\n return \"orange\";\n case \"commands\":\n return \"blue\";\n case \"queries\":\n return \"green\";\n default:\n return \"gray\";\n }\n}\n\nconst TSPAN_NORMAL_STYLE = { fontStyle: \"normal\" } as const;\nconst TSPAN_ITALIC_STYLE = { fontStyle: \"italic\" } as const;\n\nconst AnimatedMessageEdge = memo(\n ({\n id,\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n data,\n label = \"\",\n markerEnd,\n markerStart,\n }: any) => {\n const [edgePath, labelX, labelY] = getSmoothStepPath({\n sourceX,\n sourceY,\n sourcePosition,\n targetX,\n targetY,\n targetPosition,\n });\n\n const collection = data?.message?.collection;\n const opacity = data?.opacity ?? 1;\n const customColor =\n data?.customColor || messageColor(collection ?? \"default\");\n const warning = data?.warning;\n\n const customColors = Array.isArray(customColor)\n ? customColor\n : [customColor];\n\n const randomDelay = useMemo(() => Math.random() * 1, []);\n\n const opacityClass = opacity === 1 ? \"z-30 opacity-100\" : \"z-30 opacity-10\";\n\n const animatedNodes = useMemo(\n () =>\n customColors.map((color: string, index: number) => {\n const delay = randomDelay + index * 0.3;\n return (\n <g\n className={`ec-animated-msg ${opacityClass}`}\n key={`${id}-${color}-${index}`}\n >\n <g>\n <rect\n x=\"-7\"\n y=\"-5\"\n width=\"14\"\n height=\"10\"\n rx=\"1.5\"\n ry=\"1.5\"\n fill={color}\n />\n <path\n d=\"M-7,-5 L0,1 L7,-5\"\n fill=\"none\"\n stroke=\"rgb(var(--ec-card-bg))\"\n strokeWidth=\"1.2\"\n strokeLinejoin=\"round\"\n />\n <animateMotion\n dur=\"2s\"\n repeatCount=\"indefinite\"\n path={edgePath}\n rotate=\"auto\"\n begin={`${delay}s`}\n >\n <mpath href={`#${id}`} />\n </animateMotion>\n </g>\n </g>\n );\n }),\n // edgePath changes when endpoints move — that's the only time we need to rebuild SVG\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [edgePath, id, customColors.join(\",\"), opacity, randomDelay],\n );\n\n const lines = useMemo(() => String(label ?? \"\").split(\"\\n\"), [label]);\n const longestLine = useMemo(\n () =>\n lines.reduce(\n (a: string, b: string) => (a.length > b.length ? a : b),\n \"\",\n ),\n [lines],\n );\n const labelWidth = Math.max(longestLine.length * 6.5 + 16, 50);\n\n return (\n <>\n <BaseEdge\n id={id}\n path={edgePath}\n markerEnd={markerEnd}\n markerStart={markerStart}\n style={warning ? EDGE_WARNING_STYLE : EDGE_DEFAULT_STYLE}\n />\n {animatedNodes}\n <g>\n {label && (\n <rect\n x={labelX - labelWidth / 2}\n y={labelY - lines.length * 7 - 2}\n width={labelWidth}\n height={lines.length * 14 + 4}\n fill=\"rgb(var(--ec-card-bg))\"\n fillOpacity={0.95}\n stroke=\"rgb(var(--ec-page-border))\"\n strokeWidth={0.75}\n rx={5}\n ry={5}\n />\n )}\n <text\n x={labelX}\n y={labelY}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fontSize=\"11px\"\n fontWeight={500}\n fill=\"rgb(var(--ec-page-text))\"\n pointerEvents=\"none\"\n >\n {lines.map((line: string, i: number) => (\n <tspan\n key={i}\n x={labelX}\n dy={i === 0 ? 0 : \"1.2em\"}\n style={i === 0 ? TSPAN_NORMAL_STYLE : TSPAN_ITALIC_STYLE}\n >\n {line}\n </tspan>\n ))}\n </text>\n </g>\n </>\n );\n },\n);\n\nexport default AnimatedMessageEdge;\n","import { memo, useMemo } from \"react\";\nimport { type EdgeProps, getSmoothStepPath } from \"@xyflow/react\";\n\nconst TSPAN_NORMAL_STYLE = { fontStyle: \"normal\" } as const;\nconst TSPAN_ITALIC_STYLE = { fontStyle: \"italic\" } as const;\n\nexport default memo(function MultilineEdgeLabel(props: EdgeProps) {\n const {\n id,\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n label,\n markerStart, // <-- forward these\n markerEnd,\n style,\n selected,\n } = props;\n\n const [edgePath, labelX, labelY] = getSmoothStepPath({\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n });\n\n const lines = useMemo(() => String(label ?? \"\").split(\"\\n\"), [label]);\n\n return (\n <>\n <path\n id={id}\n d={edgePath}\n className={`react-flow__edge-path${selected ? \" selected\" : \"\"}`}\n markerStart={markerStart}\n markerEnd={markerEnd}\n style={style as any}\n />\n\n {/* Optional: bigger hitbox for hover/selection */}\n\n <text\n x={labelX}\n y={labelY}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fontSize=\"10px\"\n fill=\"rgb(var(--ec-page-text))\"\n pointerEvents=\"none\"\n >\n {lines.map((line, i) => (\n <tspan\n key={i}\n x={labelX}\n dy={i === 0 ? 0 : \"1.2em\"}\n style={i === 0 ? TSPAN_NORMAL_STYLE : TSPAN_ITALIC_STYLE}\n >\n {line}\n </tspan>\n ))}\n </text>\n </>\n );\n});\n","import { memo, useMemo } from \"react\";\nimport {\n BaseEdge,\n EdgeLabelRenderer,\n getSmoothStepPath,\n type EdgeProps as XYFlowEdgeProps,\n} from \"@xyflow/react\";\nimport { EDGE_FLOW_BASE_STYLE } from \"../nodes/shared-styles\";\n\ninterface EdgeData {\n message?: {\n collection?: string;\n };\n opacity?: number;\n animated?: boolean;\n}\n\nexport interface CustomEdgeProps extends Omit<XYFlowEdgeProps, \"data\"> {\n data?: EdgeData;\n}\n\n/** Map collection type → circle fill color (module-level, zero allocation). */\nfunction messageColor(collection: string): string {\n switch (collection) {\n case \"events\":\n return \"orange\";\n case \"commands\":\n return \"blue\";\n case \"queries\":\n return \"green\";\n default:\n return \"gray\";\n }\n}\n\nconst EMPTY_STYLE = {} as const;\n\nexport default memo(function CustomEdge({\n id,\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n style = EMPTY_STYLE,\n markerEnd,\n label,\n labelStyle,\n data,\n}: CustomEdgeProps) {\n const [edgePath, labelX, labelY] = getSmoothStepPath({\n sourceX,\n sourceY,\n sourcePosition,\n targetX,\n targetY,\n targetPosition,\n });\n\n const randomDelay = useMemo(() => Math.random() * 1, []);\n const collection = data?.message?.collection;\n const opacity = data?.opacity ?? 1;\n\n const mergedStyle = useMemo(\n () => ({ ...EDGE_FLOW_BASE_STYLE, ...style }),\n [style],\n );\n\n const labelPositionStyle = useMemo(\n () => ({\n position: \"absolute\" as const,\n transform: `translate(-50%, -50%) translate(${labelX}px,${labelY}px)`,\n zIndex: 1000,\n ...(labelStyle as any),\n }),\n [labelX, labelY, labelStyle],\n );\n\n return (\n <>\n <BaseEdge path={edgePath} markerEnd={markerEnd} style={mergedStyle} />\n {data?.animated && (\n <g\n className={`ec-animated-msg z-30 ${opacity === 1 ? \"opacity-100\" : \"opacity-10\"}`}\n >\n <circle\n cx=\"0\"\n cy=\"0\"\n r=\"7\"\n fill={messageColor(collection || \"default\")}\n >\n <animateMotion\n dur=\"2s\"\n repeatCount=\"indefinite\"\n path={edgePath}\n rotate=\"auto\"\n begin={`${randomDelay}s`}\n >\n <mpath href={`#${id}`} />\n </animateMotion>\n </circle>\n </g>\n )}\n {label && (\n <EdgeLabelRenderer>\n <div\n style={labelPositionStyle}\n className=\"nodrag nopan max-w-[120px] text-xs bg-[rgb(var(--ec-card-bg))] px-2 py-1 rounded border border-[rgb(var(--ec-page-border))] text-[rgb(var(--ec-page-text-muted))] font-medium shadow-sm text-center\"\n >\n {label}\n </div>\n </EdgeLabelRenderer>\n )}\n </>\n );\n});\n","import {\n useState,\n useCallback,\n useRef,\n useEffect,\n forwardRef,\n useImperativeHandle,\n memo,\n} from \"react\";\nimport type { Node } from \"@xyflow/react\";\n\n// Define interfaces for different node data structures\ninterface MessageData {\n name: string;\n version?: string;\n}\n\ninterface ServiceData {\n name: string;\n version?: string;\n}\n\ninterface DomainData {\n name: string;\n version?: string;\n}\n\ninterface EntityData {\n name: string;\n version?: string;\n}\n\ninterface NodeDataContent extends Record<string, unknown> {\n message?: {\n data: MessageData;\n };\n service?: {\n data: ServiceData;\n };\n domain?: {\n data: DomainData;\n };\n entity?: {\n data: EntityData;\n };\n name?: string;\n version?: string;\n}\n\n// Extend the Node type with our custom data structure\ntype CustomNode = Node<NodeDataContent>;\n\ninterface VisualiserSearchProps {\n nodes: CustomNode[];\n onNodeSelect: (node: CustomNode) => void;\n onClear: () => void;\n onPaneClick?: () => void;\n}\n\nexport interface VisualiserSearchRef {\n hideSuggestions: () => void;\n}\n\nconst VisualiserSearch = memo(\n forwardRef<VisualiserSearchRef, VisualiserSearchProps>(\n ({ nodes, onNodeSelect, onClear, onPaneClick: _onPaneClick }, ref) => {\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [filteredSuggestions, setFilteredSuggestions] = useState<\n CustomNode[]\n >([]);\n const [showSuggestions, setShowSuggestions] = useState(false);\n const [selectedSuggestionIndex, setSelectedSuggestionIndex] =\n useState(-1);\n const searchInputRef = useRef<HTMLInputElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const hideSuggestions = useCallback(() => {\n setShowSuggestions(false);\n setSelectedSuggestionIndex(-1);\n }, []);\n\n useImperativeHandle(\n ref,\n () => ({\n hideSuggestions,\n }),\n [hideSuggestions],\n );\n\n const getNodeDisplayName = useCallback((node: CustomNode) => {\n const name =\n node.data?.message?.data?.name ||\n node.data?.service?.data?.name ||\n node.data?.domain?.data?.name ||\n node.data?.entity?.data?.name ||\n node.data?.name ||\n node.id;\n const version =\n node.data?.message?.data?.version ||\n node.data?.service?.data?.version ||\n node.data?.domain?.data?.version ||\n node.data?.entity?.data?.version ||\n node.data?.version;\n return version ? `${name} (v${version})` : name;\n }, []);\n\n const getNodeTypeColorClass = useCallback((nodeType: string) => {\n const colorClasses: { [key: string]: string } = {\n events: \"bg-orange-600 text-white\",\n services: \"bg-pink-600 text-white\",\n flows: \"bg-teal-600 text-white\",\n commands: \"bg-blue-600 text-white\",\n queries: \"bg-green-600 text-white\",\n channels: \"bg-gray-600 text-white\",\n domains: \"bg-yellow-500 text-white\",\n externalSystem: \"bg-pink-600 text-white\",\n actor: \"bg-yellow-500 text-white\",\n step: \"bg-gray-700 text-white\",\n user: \"bg-yellow-500 text-white\",\n custom: \"bg-gray-500 text-white\",\n };\n return colorClasses[nodeType] || \"bg-gray-100 text-gray-700\";\n }, []);\n\n const handleSearchChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const query = event.target.value;\n setSearchQuery(query);\n\n if (query.length > 0) {\n const filtered = nodes.filter((node) => {\n const nodeName = getNodeDisplayName(node);\n return nodeName.toLowerCase().includes(query.toLowerCase());\n });\n setFilteredSuggestions(filtered);\n setShowSuggestions(true);\n setSelectedSuggestionIndex(-1);\n } else {\n setFilteredSuggestions(nodes);\n setShowSuggestions(true);\n setSelectedSuggestionIndex(-1);\n }\n },\n [nodes, getNodeDisplayName],\n );\n\n const handleSearchFocus = useCallback(() => {\n if (searchQuery.length === 0) {\n setFilteredSuggestions(nodes);\n }\n setShowSuggestions(true);\n setSelectedSuggestionIndex(-1);\n }, [nodes, searchQuery]);\n\n const handleSuggestionClick = useCallback(\n (node: CustomNode) => {\n setSearchQuery(getNodeDisplayName(node));\n setShowSuggestions(false);\n onNodeSelect(node);\n },\n [onNodeSelect, getNodeDisplayName],\n );\n\n const handleSearchKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (!showSuggestions || filteredSuggestions.length === 0) return;\n\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n setSelectedSuggestionIndex((prev) =>\n prev < filteredSuggestions.length - 1 ? prev + 1 : 0,\n );\n break;\n case \"ArrowUp\":\n event.preventDefault();\n setSelectedSuggestionIndex((prev) =>\n prev > 0 ? prev - 1 : filteredSuggestions.length - 1,\n );\n break;\n case \"Enter\":\n event.preventDefault();\n if (selectedSuggestionIndex >= 0) {\n handleSuggestionClick(\n filteredSuggestions[selectedSuggestionIndex],\n );\n }\n break;\n case \"Escape\":\n setShowSuggestions(false);\n setSelectedSuggestionIndex(-1);\n break;\n }\n },\n [\n showSuggestions,\n filteredSuggestions,\n selectedSuggestionIndex,\n handleSuggestionClick,\n ],\n );\n\n const clearSearch = useCallback(() => {\n setSearchQuery(\"\");\n setShowSuggestions(false);\n setFilteredSuggestions([]);\n setSelectedSuggestionIndex(-1);\n onClear();\n if (searchInputRef.current) {\n searchInputRef.current.focus();\n }\n }, [onClear]);\n\n // Close suggestions when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target as any)\n ) {\n setShowSuggestions(false);\n setSelectedSuggestionIndex(-1);\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, []);\n\n return (\n <div ref={containerRef} className=\"w-full max-w-md mx-auto relative\">\n <div className=\"relative\">\n <input\n ref={searchInputRef}\n type=\"text\"\n placeholder=\"Search nodes...\"\n value={searchQuery}\n onChange={handleSearchChange}\n onKeyDown={handleSearchKeyDown}\n onFocus={handleSearchFocus}\n className=\"w-full px-4 py-2 pr-10 bg-[rgb(var(--ec-input-bg))] border border-[rgb(var(--ec-input-border))] text-[rgb(var(--ec-input-text))] placeholder:text-[rgb(var(--ec-page-text-muted))] rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-[rgb(var(--ec-accent))] focus:border-transparent\"\n />\n {searchQuery && (\n <button\n onClick={clearSearch}\n className=\"absolute right-2 top-1/2 transform -translate-y-1/2 text-[rgb(var(--ec-page-text-muted))] hover:text-[rgb(var(--ec-page-text))]\"\n aria-label=\"Clear search\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n )}\n </div>\n {showSuggestions && filteredSuggestions.length > 0 && (\n <div className=\"absolute top-full left-0 right-0 mt-1 bg-[rgb(var(--ec-card-bg))] border border-[rgb(var(--ec-page-border))] rounded-md shadow-lg z-50 max-h-60 overflow-y-auto\">\n {filteredSuggestions.map((node, index) => {\n const nodeName = getNodeDisplayName(node);\n const nodeType = node.type || \"unknown\";\n return (\n <div\n key={node.id}\n onClick={() => handleSuggestionClick(node)}\n className={`px-4 py-2 cursor-pointer flex items-center justify-between hover:bg-[rgb(var(--ec-page-border)/0.5)] ${\n index === selectedSuggestionIndex\n ? \"bg-[rgb(var(--ec-accent-subtle))]\"\n : \"\"\n }`}\n >\n <span className=\"text-sm font-medium text-[rgb(var(--ec-page-text))]\">\n {nodeName}\n </span>\n <span\n className={`text-xs capitalize px-2 py-1 rounded ${getNodeTypeColorClass(nodeType)}`}\n >\n {nodeType}\n </span>\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n },\n ),\n);\n\nVisualiserSearch.displayName = \"VisualiserSearch\";\n\nexport default VisualiserSearch;\n","import React, {\n useState,\n useEffect,\n useCallback,\n useMemo,\n useRef,\n memo,\n} from \"react\";\nimport { ChevronLeftIcon, ChevronRightIcon } from \"@heroicons/react/24/outline\";\nimport type { Edge } from \"@xyflow/react\";\n\ninterface NodeData {\n label?: string;\n summary?: string;\n step?: {\n title?: string;\n summary?: string;\n };\n service?: {\n name?: string;\n summary?: string;\n data?: {\n name?: string;\n summary?: string;\n };\n };\n message?: {\n name?: string;\n summary?: string;\n data?: {\n name?: string;\n summary?: string;\n };\n };\n flow?: {\n data?: {\n name?: string;\n };\n };\n custom?: {\n title?: string;\n label?: string;\n summary?: string;\n };\n actor?: {\n label?: string;\n };\n externalSystem?: {\n label?: string;\n };\n}\n\ninterface CustomNode {\n id: string;\n data: NodeData;\n}\n\ninterface StepWalkthroughProps {\n nodes: CustomNode[];\n edges: Edge[];\n isFlowVisualization: boolean;\n onStepChange: (\n nodeId: string | null,\n highlightPaths?: string[],\n shouldZoomOut?: boolean,\n ) => void;\n mode?: \"full\" | \"simple\";\n}\n\ninterface PathOption {\n targetId: string;\n label?: string;\n targetNode: CustomNode;\n}\n\nexport default memo(function StepWalkthrough({\n nodes,\n edges,\n isFlowVisualization,\n onStepChange,\n mode = \"full\",\n}: StepWalkthroughProps) {\n const [currentNodeId, setCurrentNodeId] = useState<string | null>(null);\n const [pathHistory, setPathHistory] = useState<string[]>([]);\n const [currentStepIndex, setCurrentStepIndex] = useState<number>(-1); // -1 means not started\n const [availablePaths, setAvailablePaths] = useState<PathOption[]>([]);\n const [selectedPathIndex, setSelectedPathIndex] = useState<number>(0);\n const [startNodeId, setStartNodeId] = useState<string | null>(null);\n\n // Stable structural keys — only change when nodes/edges are added/removed,\n // not when positions change during drag.\n const nodeIdsKeyRef = useRef(\"\");\n const computedNodeIdsKey = nodes.map((n) => n.id).join(\",\");\n if (computedNodeIdsKey !== nodeIdsKeyRef.current) {\n nodeIdsKeyRef.current = computedNodeIdsKey;\n }\n const nodeIdsKey = nodeIdsKeyRef.current;\n\n const edgeKeyRef = useRef(\"\");\n const computedEdgeKey = edges.map((e) => `${e.source}-${e.target}`).join(\",\");\n if (computedEdgeKey !== edgeKeyRef.current) {\n edgeKeyRef.current = computedEdgeKey;\n }\n const edgeKey = edgeKeyRef.current;\n\n useEffect(() => {\n if (isFlowVisualization && nodes.length > 0) {\n // Find the starting node (node with no incoming edges)\n const incomingEdgeMap = new Map<string, number>();\n nodes.forEach((node: CustomNode) => incomingEdgeMap.set(node.id, 0));\n\n edges.forEach((edge: Edge) => {\n if (incomingEdgeMap.has(edge.target)) {\n incomingEdgeMap.set(\n edge.target,\n (incomingEdgeMap.get(edge.target) || 0) + 1,\n );\n }\n });\n\n const startNodes = nodes.filter(\n (node: CustomNode) => incomingEdgeMap.get(node.id) === 0,\n );\n if (startNodes.length > 0 && !startNodeId) {\n const firstStartNode = startNodes[0];\n setStartNodeId(firstStartNode.id);\n }\n }\n }, [nodeIdsKey, edgeKey, isFlowVisualization, startNodeId]);\n\n useEffect(() => {\n if (currentNodeId) {\n // Find available paths from current node\n const outgoingEdges = edges.filter(\n (edge: Edge) => edge.source === currentNodeId,\n );\n const paths: PathOption[] = outgoingEdges.map((edge: Edge) => {\n const targetNode = nodes.find((n: CustomNode) => n.id === edge.target);\n return {\n targetId: edge.target,\n label: edge.label as string | undefined,\n targetNode: targetNode!,\n };\n });\n setAvailablePaths(paths);\n setSelectedPathIndex(0);\n } else {\n setAvailablePaths([]);\n }\n }, [currentNodeId, nodeIdsKey, edgeKey]);\n\n const handleNextStep = useCallback(() => {\n if (currentStepIndex === -1) {\n // Start the walkthrough\n if (startNodeId) {\n setPathHistory([startNodeId]);\n setCurrentNodeId(startNodeId);\n setCurrentStepIndex(0);\n onStepChange(startNodeId);\n }\n } else if (availablePaths.length > 0) {\n // Move to the selected path\n const selectedPath = availablePaths[selectedPathIndex];\n const newHistory = [...pathHistory, selectedPath.targetId];\n setPathHistory(newHistory);\n setCurrentNodeId(selectedPath.targetId);\n setCurrentStepIndex((prev) => prev + 1);\n\n // Highlight the selected path\n const allPaths = availablePaths.map(\n (p) => `${currentNodeId}-${p.targetId}`,\n );\n onStepChange(selectedPath.targetId, allPaths);\n }\n }, [\n currentStepIndex,\n startNodeId,\n availablePaths,\n selectedPathIndex,\n currentNodeId,\n onStepChange,\n ]);\n\n const handlePreviousStep = useCallback(() => {\n if (currentStepIndex > 0) {\n // Go back to previous step\n const newIndex = currentStepIndex - 1;\n const prevNodeId = pathHistory[newIndex];\n setCurrentNodeId(prevNodeId);\n setCurrentStepIndex(newIndex);\n onStepChange(prevNodeId);\n } else if (currentStepIndex === 0) {\n // Go back to the start (no selection)\n setCurrentNodeId(null);\n setCurrentStepIndex(-1);\n onStepChange(null);\n }\n }, [currentStepIndex, pathHistory, onStepChange]);\n\n const handlePathSelection = useCallback((index: number) => {\n setSelectedPathIndex(index);\n }, []);\n\n const handleFinish = useCallback(() => {\n setCurrentNodeId(null);\n setCurrentStepIndex(-1);\n setPathHistory([]);\n onStepChange(null, [], true); // Pass true to indicate full reset with zoom out\n }, [onStepChange]);\n\n if (!isFlowVisualization || nodes.length === 0 || mode !== \"full\") {\n return null;\n }\n\n const { title, description } = useMemo(() => {\n if (currentStepIndex === -1) {\n return {\n title: \"Walk through business flow\",\n description: \"Step through the flow to understand the business process\",\n };\n }\n\n const currentNode = nodes.find((n: CustomNode) => n.id === currentNodeId);\n if (!currentNode) return { title: \"Unknown step\", description: \"\" };\n\n let stepNumber = currentStepIndex + 1;\n let title = `Step ${stepNumber}`;\n let description = \"\";\n\n // Get node information based on type - check step data first, then type-specific data\n if (currentNode.data.step?.title) {\n title += `: ${currentNode.data.step.title}`;\n } else if (currentNode.data.service?.name) {\n title += `: ${currentNode.data.service.name}`;\n } else if (currentNode.data.message?.name) {\n title += `: ${currentNode.data.message.name}`;\n } else if (currentNode.data.flow?.data?.name) {\n title += `: ${currentNode.data.flow.data.name}`;\n } else if (currentNode.data.custom?.title) {\n title += `: ${currentNode.data.custom.title}`;\n } else if (currentNode.data.custom?.label) {\n title += `: ${currentNode.data.custom.label}`;\n } else if (currentNode.data.externalSystem?.label) {\n title += `: ${currentNode.data.externalSystem.label}`;\n } else if (currentNode.data.label) {\n // Actor nodes have label directly on data\n title += `: ${currentNode.data.label}`;\n }\n\n // Get description - check step data first, then type-specific data\n if (currentNode.data.step?.summary) {\n description = currentNode.data.step.summary;\n } else if (currentNode.data.service?.summary) {\n description = currentNode.data.service.summary;\n } else if (currentNode.data.message?.summary) {\n description = currentNode.data.message.summary;\n } else if (currentNode.data.custom?.summary) {\n description = currentNode.data.custom.summary;\n } else if (currentNode.data.summary) {\n // Actor and other nodes may have summary directly on data\n description = currentNode.data.summary;\n }\n\n return { title, description };\n }, [currentStepIndex, currentNodeId, nodeIdsKey]);\n\n return (\n <div className=\"ml-12 bg-[rgb(var(--ec-card-bg))] rounded-lg shadow-sm px-4 py-2 z-30 border border-[rgb(var(--ec-page-border))] w-[350px]\">\n <div className=\"mb-2\">\n <h3 className=\"text-sm font-semibold text-[rgb(var(--ec-page-text))]\">\n {title}\n </h3>\n {description && (\n <p className=\"text-xs text-[rgb(var(--ec-page-text-muted))] mt-1\">\n {description}\n </p>\n )}\n </div>\n\n {/* Show path options when there are multiple paths */}\n {currentNodeId && availablePaths.length > 1 && (\n <div className=\"mb-3\">\n <label className=\"block text-xs font-medium text-[rgb(var(--ec-page-text-muted))] mb-2\">\n Choose next path:\n </label>\n <select\n value={selectedPathIndex}\n onChange={(e: React.ChangeEvent<HTMLSelectElement>) =>\n handlePathSelection(parseInt(e.target.value))\n }\n className=\"w-full px-3 py-2 text-xs border border-[rgb(var(--ec-input-border))] rounded-md bg-[rgb(var(--ec-input-bg))] text-[rgb(var(--ec-input-text))] focus:outline-none focus:ring-2 focus:ring-[rgb(var(--ec-accent))] focus:border-[rgb(var(--ec-accent))]\"\n >\n {availablePaths.map((path, index) => {\n // @ts-ignore\n const nodeLabel =\n path.targetNode.data.step?.title ||\n (path.targetNode.data as any).service?.name ||\n (path.targetNode.data as any).message?.name ||\n (path.targetNode.data as any).flow?.data?.name ||\n (path.targetNode.data as any).custom?.title ||\n (path.targetNode.data as any).custom?.label ||\n (path.targetNode.data as any).externalSystem?.label ||\n (path.targetNode.data as any).label ||\n \"Unknown\";\n\n return (\n <option key={path.targetId} value={index}>\n {path.label ? `${path.label}: ${nodeLabel}` : nodeLabel}\n </option>\n );\n })}\n </select>\n </div>\n )}\n\n <div className=\"flex items-center justify-between\">\n {currentStepIndex === -1 ? (\n // Initial state - show only Start button on the right\n <>\n <div className=\"flex-1\"></div>\n <button\n onClick={handleNextStep}\n className=\"flex items-center justify-center px-6 py-2 text-xs font-medium bg-[rgb(var(--ec-accent))] text-white rounded-md hover:bg-[rgb(var(--ec-accent-hover))] focus:outline-none focus:ring-2 focus:ring-[rgb(var(--ec-accent))] focus:ring-offset-2 transition-colors\"\n >\n Start\n </button>\n </>\n ) : (\n // In walkthrough - show Previous on left, Next on right (only if paths available)\n <>\n <button\n onClick={handlePreviousStep}\n className=\"flex items-center justify-center px-4 py-2 text-xs font-medium bg-[rgb(var(--ec-accent))] text-white rounded-md hover:bg-[rgb(var(--ec-accent-hover))] focus:outline-none focus:ring-2 focus:ring-[rgb(var(--ec-accent))] focus:ring-offset-2 transition-colors\"\n >\n <ChevronLeftIcon className=\"w-4 h-4 mr-1\" />\n Previous\n </button>\n\n {availablePaths.length > 0 ? (\n <button\n onClick={handleNextStep}\n className=\"flex items-center justify-center px-4 py-2 text-xs font-medium bg-[rgb(var(--ec-accent))] text-white rounded-md hover:bg-[rgb(var(--ec-accent-hover))] focus:outline-none focus:ring-2 focus:ring-[rgb(var(--ec-accent))] focus:ring-offset-2 transition-colors\"\n >\n Next\n <ChevronRightIcon className=\"w-4 h-4 ml-1\" />\n </button>\n ) : (\n <button\n onClick={handleFinish}\n className=\"flex items-center justify-center px-4 py-2 text-xs font-medium bg-green-600 text-white rounded-md hover:bg-green-700 focus:outline-none focus:ring-2 focus:ring-green-500 focus:ring-offset-2 transition-colors\"\n >\n Finish\n </button>\n )}\n </>\n )}\n </div>\n </div>\n );\n});\n","import React, { useState, useCallback } from \"react\";\nimport * as Dialog from \"@radix-ui/react-dialog\";\nimport { CheckIcon, ClipboardIcon, ExternalLinkIcon } from \"lucide-react\";\nimport { useReactFlow } from \"@xyflow/react\";\nimport { exportNodeGraphForStudio } from \"../utils/export-node-graph\";\n\ninterface StudioModalProps {\n isOpen: boolean;\n onClose: () => void;\n}\n\nconst StudioModal: React.FC<StudioModalProps> = ({ isOpen, onClose }) => {\n const [copySuccess, setCopySuccess] = useState(false);\n\n const { toObject } = useReactFlow();\n\n const handleCopyToClipboard = useCallback(async () => {\n const visualizerData = toObject();\n const studioData = exportNodeGraphForStudio(visualizerData);\n\n try {\n await navigator.clipboard.writeText(JSON.stringify(studioData, null, 2));\n setCopySuccess(true);\n setTimeout(() => setCopySuccess(false), 2000);\n } catch (error) {\n console.error(\"Failed to copy to clipboard:\", error);\n // Fallback for older browsers\n const textarea = document.createElement(\"textarea\");\n textarea.value = JSON.stringify(studioData, null, 2);\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand(\"copy\");\n document.body.removeChild(textarea);\n setCopySuccess(true);\n setTimeout(() => setCopySuccess(false), 2000);\n }\n }, []);\n\n const handleOpenStudio = () => {\n window.open(\n \"https://app.eventcatalog.studio/playground?import=true&utm_source=eventcatalog&utm_medium=referral&utm_campaign=playground-import\",\n \"_blank\",\n );\n onClose();\n };\n\n return (\n <Dialog.Root open={isOpen} onOpenChange={onClose}>\n <Dialog.Portal>\n <Dialog.Overlay className=\"fixed inset-0 bg-black/50 data-[state=open]:animate-overlayShow z-50\" />\n <Dialog.Content className=\"fixed top-1/2 left-1/2 w-[90vw] max-w-md -translate-x-1/2 -translate-y-1/2 rounded-lg bg-white p-6 shadow-xl focus:outline-none data-[state=open]:animate-contentShow z-[100]\">\n <Dialog.Title className=\"text-lg font-semibold text-gray-900 mb-3\">\n Open in EventCatalog Studio\n </Dialog.Title>\n\n <Dialog.Description className=\"text-sm text-gray-600 mb-6\">\n Import your diagram into{\" \"}\n <a\n href=\"https://eventcatalog.studio\"\n className=\"text-[rgb(var(--ec-accent))] hover:text-[rgb(var(--ec-accent-hover))] underline\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n EventCatalog Studio\n </a>{\" \"}\n to create designs from your visualization of your architecture.\n </Dialog.Description>\n\n <div className=\"space-y-4\">\n <div className=\"bg-gray-50 rounded-lg p-4 border border-gray-200\">\n <h4 className=\"text-sm font-bold text-gray-900 mb-2\">\n Step 1: Copy diagram\n </h4>\n <p className=\"text-xs text-gray-600 mb-3\">\n Copy your diagram data to your clipboard.\n </p>\n <button\n onClick={handleCopyToClipboard}\n className={`w-full flex items-center justify-center space-x-2 px-4 py-2 text-sm font-medium rounded-md border transition-colors ${\n copySuccess\n ? \"bg-green-50 border-green-200 text-green-700\"\n : \"bg-white border-gray-300 text-gray-700 hover:bg-gray-50\"\n }`}\n >\n {copySuccess ? (\n <>\n <CheckIcon className=\"w-4 h-4\" />\n <span>Copied!</span>\n </>\n ) : (\n <>\n <ClipboardIcon className=\"w-4 h-4\" />\n <span>Copy diagram to clipboard</span>\n </>\n )}\n </button>\n </div>\n\n <div className=\"bg-[rgb(var(--ec-accent-subtle))] rounded-lg p-4 border border-[rgb(var(--ec-accent)/0.3)]\">\n <h4 className=\"text-sm font-bold text-gray-900 mb-2\">\n Step 2: Open EventCatalog Studio\n </h4>\n <p className=\"text-xs text-gray-600 mb-3\">\n Go to EventCatalog Studio and import your design using the\n \"Import from EventCatalog\" button.\n </p>\n\n <button\n onClick={handleOpenStudio}\n className=\"w-full flex items-center justify-center space-x-2 px-4 py-2 bg-[rgb(var(--ec-accent))] text-white text-sm font-medium rounded-md hover:bg-[rgb(var(--ec-accent-hover))] transition-colors\"\n >\n <ExternalLinkIcon className=\"w-4 h-4\" />\n <span>Open EventCatalog Studio</span>\n </button>\n <p className=\"text-[12px] text-gray-500 italic mt-4 mb-0\">\n Don't worry, none of your data is stored by EventCatalog Studio,\n everything is local to your browser.\n </p>\n </div>\n </div>\n\n <div className=\"mt-6 flex justify-end\">\n <Dialog.Close asChild>\n <button\n type=\"button\"\n className=\"px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-[rgb(var(--ec-accent))] focus:ring-offset-2 transition-colors\"\n onClick={onClose}\n >\n Close\n </button>\n </Dialog.Close>\n </div>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n );\n};\n\nexport default StudioModal;\n","import type { Node, ReactFlowJsonObject, Edge } from \"@xyflow/react\";\n\n// Define the structure of resource data that can be found in nodes\ninterface ResourceData {\n id?: string;\n name?: string;\n summary?: string;\n version?: string;\n}\n\n// Define the possible node data structure\ninterface NodeDataWithResources {\n [key: string]: any;\n channel?: ResourceData;\n custom?: ResourceData;\n data?: ResourceData;\n domain?: ResourceData;\n entity?: ResourceData;\n message?: ResourceData;\n flow?: ResourceData;\n service?: ResourceData;\n step?: ResourceData;\n user?: ResourceData;\n}\n\nexport const exportNodeGraphForStudio = (\n data: ReactFlowJsonObject,\n): ReactFlowJsonObject => {\n const dataTypes: (keyof NodeDataWithResources)[] = [\n \"channel\",\n \"custom\",\n \"data\",\n \"domain\",\n \"entity\",\n \"message\",\n \"flow\",\n \"service\",\n \"step\",\n \"user\",\n ];\n\n // try and remove unwanted data for studio\n const nodes = data.nodes.map((node: Node) => {\n let nodeData = node.data as NodeDataWithResources;\n const dataProperties = Object.keys(\n nodeData,\n ) as (keyof NodeDataWithResources)[];\n\n // If we find a match.....\n const hasCustomDataType = dataProperties.find((property) =>\n dataTypes.includes(property),\n );\n\n if (hasCustomDataType && nodeData[hasCustomDataType]) {\n const resourceData = nodeData[hasCustomDataType] as ResourceData;\n nodeData = {\n ...nodeData,\n [hasCustomDataType]: {\n id: resourceData?.id,\n name: resourceData?.name,\n summary: resourceData?.summary,\n version: resourceData?.version,\n },\n };\n }\n\n return {\n ...node,\n data: {\n ...nodeData,\n // We dont need these for studio\n source: undefined,\n target: undefined,\n // Studio wants all nodes in full mode\n mode: \"full\",\n },\n };\n });\n\n const edges = data.edges.map((edge: Edge) => {\n return {\n ...edge,\n data: undefined,\n type: \"animatedMessage\",\n };\n });\n\n return {\n ...data,\n nodes,\n edges,\n };\n};\n","import React, { useState, useCallback, useEffect } from \"react\";\nimport * as Dialog from \"@radix-ui/react-dialog\";\nimport { XIcon, FocusIcon } from \"lucide-react\";\nimport {\n ReactFlowProvider,\n type Node,\n type Edge,\n type NodeTypes,\n type EdgeTypes,\n} from \"@xyflow/react\";\nimport FocusModeContent from \"./FocusMode/FocusModeContent\";\nimport { getNodeDisplayInfo } from \"./FocusMode/utils\";\nimport { useDarkMode } from \"../nodes/shared-styles\";\n\ninterface FocusModeModalProps {\n isOpen: boolean;\n onClose: () => void;\n initialNodeId: string | null;\n nodes: Node[];\n edges: Edge[];\n nodeTypes: NodeTypes;\n edgeTypes: EdgeTypes;\n}\n\nconst FocusModeModal: React.FC<FocusModeModalProps> = ({\n isOpen,\n onClose,\n initialNodeId,\n nodes,\n edges,\n nodeTypes,\n edgeTypes,\n}) => {\n const [centerNodeId, setCenterNodeId] = useState<string | null>(\n initialNodeId,\n );\n const isDark = useDarkMode();\n\n // Reset center node when modal opens with new initial node\n useEffect(() => {\n if (isOpen && initialNodeId) {\n setCenterNodeId(initialNodeId);\n }\n }, [isOpen, initialNodeId]);\n\n const handleSwitchCenter = useCallback(\n (newCenterNodeId: string, _direction: \"left\" | \"right\") => {\n setCenterNodeId(newCenterNodeId);\n },\n [],\n );\n\n // Get center node info for title\n const centerNode = centerNodeId\n ? nodes.find((n) => n.id === centerNodeId)\n : null;\n const centerNodeInfo = centerNode ? getNodeDisplayInfo(centerNode) : null;\n\n if (!centerNodeId) {\n return null;\n }\n\n return (\n <Dialog.Root open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <Dialog.Portal\n container={typeof document !== \"undefined\" ? document.body : undefined}\n >\n <div\n className=\"fixed inset-0 z-[99999] eventcatalog-visualizer\"\n style={{ isolation: \"isolate\" }}\n >\n <Dialog.Overlay\n style={{\n position: \"fixed\",\n inset: 0,\n background: isDark\n ? \"rgba(0, 0, 0, 0.75)\"\n : \"rgba(15, 23, 42, 0.55)\",\n backdropFilter: \"blur(2px)\",\n }}\n />\n <Dialog.Content\n style={{\n position: \"fixed\",\n inset: \"1rem\",\n borderRadius: 12,\n background: isDark ? \"#0f172a\" : \"#ffffff\",\n border: `1px solid ${\n isDark ? \"rgba(255,255,255,0.08)\" : \"rgba(0,0,0,0.08)\"\n }`,\n boxShadow: isDark\n ? \"0 24px 48px rgba(0,0,0,0.5)\"\n : \"0 24px 48px rgba(0,0,0,0.15)\",\n outline: \"none\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n }}\n >\n {/* Header */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"1rem 1.5rem\",\n borderBottom: `1px solid ${\n isDark ? \"rgba(255,255,255,0.08)\" : \"rgba(0,0,0,0.08)\"\n }`,\n flexShrink: 0,\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 12 }}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 40,\n height: 40,\n borderRadius: 10,\n background: isDark\n ? \"rgba(59, 130, 246, 0.18)\"\n : \"rgba(59, 130, 246, 0.12)\",\n }}\n >\n <FocusIcon\n style={{\n width: 20,\n height: 20,\n color: isDark ? \"#93c5fd\" : \"#2563eb\",\n }}\n />\n </div>\n <div>\n <Dialog.Title\n style={{\n fontSize: 18,\n fontWeight: 600,\n color: isDark ? \"#f8fafc\" : \"#0f172a\",\n }}\n >\n Focus Mode\n </Dialog.Title>\n <Dialog.Description\n style={{\n marginTop: 2,\n fontSize: 14,\n color: isDark ? \"#94a3b8\" : \"#475569\",\n }}\n >\n {centerNodeInfo\n ? `Exploring: ${centerNodeInfo.name} - Click on connected nodes to navigate`\n : \"Explore node connections\"}\n </Dialog.Description>\n </div>\n </div>\n <Dialog.Close asChild>\n <button\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 40,\n height: 40,\n borderRadius: 10,\n border: \"none\",\n cursor: \"pointer\",\n background: \"transparent\",\n color: isDark ? \"#94a3b8\" : \"#64748b\",\n }}\n aria-label=\"Close\"\n >\n <XIcon style={{ width: 20, height: 20 }} />\n </button>\n </Dialog.Close>\n </div>\n\n {/* Content */}\n <div style={{ flex: 1, overflow: \"hidden\" }}>\n <ReactFlowProvider>\n <FocusModeContent\n centerNodeId={centerNodeId}\n nodes={nodes}\n edges={edges}\n nodeTypes={nodeTypes}\n edgeTypes={edgeTypes}\n onSwitchCenter={handleSwitchCenter}\n />\n </ReactFlowProvider>\n </div>\n </Dialog.Content>\n </div>\n </Dialog.Portal>\n </Dialog.Root>\n );\n};\n\nexport default FocusModeModal;\n","import React, {\n useMemo,\n useCallback,\n useEffect,\n useState,\n useRef,\n} from \"react\";\nimport {\n ReactFlow,\n Background,\n Controls,\n useReactFlow,\n useNodesState,\n useEdgesState,\n type Node,\n type Edge,\n type NodeTypes,\n type EdgeTypes,\n} from \"@xyflow/react\";\nimport { getConnectedNodes, getNodeDisplayInfo } from \"./utils\";\nimport FocusModeNodeActions from \"./FocusModeNodeActions\";\nimport FocusModePlaceholder from \"./FocusModePlaceholder\";\n\ninterface FocusModeContentProps {\n centerNodeId: string;\n nodes: Node[];\n edges: Edge[];\n nodeTypes: NodeTypes;\n edgeTypes: EdgeTypes;\n onSwitchCenter: (\n newCenterNodeId: string,\n direction: \"left\" | \"right\",\n ) => void;\n}\n\nconst HORIZONTAL_SPACING = 450;\nconst VERTICAL_SPACING = 200;\nconst SLIDE_DURATION = 300;\n\nconst FocusModeContent: React.FC<FocusModeContentProps> = ({\n centerNodeId,\n nodes: allNodes,\n edges: allEdges,\n nodeTypes,\n edgeTypes,\n onSwitchCenter,\n}) => {\n const { fitView } = useReactFlow();\n const [isAnimating, setIsAnimating] = useState(false);\n const [needsFitView, setNeedsFitView] = useState(false);\n const [hoveredEdgeId, setHoveredEdgeId] = useState<string | null>(null);\n const [isReady, setIsReady] = useState(false);\n const reactFlowInitialized = useRef(false);\n const animationTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n // Cleanup timeout on unmount\n useEffect(() => {\n return () => {\n if (animationTimeoutRef.current) {\n clearTimeout(animationTimeoutRef.current);\n }\n };\n }, []);\n\n // Calculate focused nodes and edges with positions\n const calculateFocusedGraph = useCallback(\n (centerId: string) => {\n const centerNode = allNodes.find((n) => n.id === centerId);\n if (!centerNode) {\n return { nodes: [], edges: [] };\n }\n\n const { leftNodes, rightNodes } = getConnectedNodes(\n centerId,\n allNodes,\n allEdges,\n );\n const centerNodeInfo = getNodeDisplayInfo(centerNode);\n const positionedNodes: Node[] = [];\n\n // Center node at origin (strip parentId/extent so it renders independently)\n positionedNodes.push({\n ...centerNode,\n parentId: undefined,\n extent: undefined,\n position: { x: 0, y: 0 },\n style: { ...centerNode.style, opacity: 1 },\n data: { ...centerNode.data, isFocusCenter: true },\n });\n\n // Left nodes (incoming) - strip parentId/extent so they render independently\n leftNodes.forEach((node, index) => {\n const yOffset = (index - (leftNodes.length - 1) / 2) * VERTICAL_SPACING;\n positionedNodes.push({\n ...node,\n parentId: undefined,\n extent: undefined,\n position: { x: -HORIZONTAL_SPACING, y: yOffset },\n style: { ...node.style, opacity: 1 },\n });\n });\n\n // Right nodes (outgoing) - strip parentId/extent so they render independently\n rightNodes.forEach((node, index) => {\n const yOffset =\n (index - (rightNodes.length - 1) / 2) * VERTICAL_SPACING;\n positionedNodes.push({\n ...node,\n parentId: undefined,\n extent: undefined,\n position: { x: HORIZONTAL_SPACING, y: yOffset },\n style: { ...node.style, opacity: 1 },\n });\n });\n\n // Add placeholder nodes if no connections exist\n if (leftNodes.length === 0) {\n positionedNodes.push({\n id: \"__placeholder-left__\",\n type: \"placeholder\",\n position: { x: -HORIZONTAL_SPACING, y: 0 },\n data: {\n label: `No inputs found for \"${centerNodeInfo.name}\" in this diagram`,\n side: \"left\",\n },\n draggable: false,\n selectable: false,\n } as Node);\n }\n\n if (rightNodes.length === 0) {\n positionedNodes.push({\n id: \"__placeholder-right__\",\n type: \"placeholder\",\n position: { x: HORIZONTAL_SPACING, y: 0 },\n data: {\n label: `No outputs found for \"${centerNodeInfo.name}\" in this diagram`,\n side: \"right\",\n },\n draggable: false,\n selectable: false,\n } as Node);\n }\n\n // Filter edges - only show edges connected to center node\n const focusedNodeIds = new Set(positionedNodes.map((n) => n.id));\n const filteredEdges = allEdges\n .filter((edge) => {\n // Only include edges where center node is either source or target\n const connectsToCenter =\n edge.source === centerId || edge.target === centerId;\n // And the other end is in our focused nodes\n const otherEndInFocus =\n focusedNodeIds.has(edge.source) && focusedNodeIds.has(edge.target);\n return connectsToCenter && otherEndInFocus;\n })\n .map((edge) => ({\n ...edge,\n style: { ...edge.style, opacity: 1 },\n labelStyle: { ...edge.labelStyle, opacity: 1 },\n data: { ...edge.data, opacity: 1, animated: false },\n animated: false,\n }));\n\n return { nodes: positionedNodes, edges: filteredEdges };\n },\n [allNodes, allEdges],\n );\n\n // Initial graph\n const initialGraph = useMemo(\n () => calculateFocusedGraph(centerNodeId),\n [centerNodeId, calculateFocusedGraph],\n );\n\n const [displayNodes, setDisplayNodes] = useNodesState(initialGraph.nodes);\n const [displayEdges, setDisplayEdges] = useEdgesState(initialGraph.edges);\n\n // Update when centerNodeId changes externally\n useEffect(() => {\n const { nodes, edges } = calculateFocusedGraph(centerNodeId);\n setDisplayNodes(nodes);\n setDisplayEdges(edges);\n setNeedsFitView(true);\n }, [centerNodeId, calculateFocusedGraph, setDisplayNodes, setDisplayEdges]);\n\n // FitView when needed - triggered after nodes are updated\n useEffect(() => {\n if (needsFitView && reactFlowInitialized.current) {\n // Small delay to ensure nodes are rendered, then fit view\n const timer = setTimeout(() => {\n fitView({ padding: 0.2, duration: 300 });\n setNeedsFitView(false);\n }, 50);\n return () => clearTimeout(timer);\n }\n }, [needsFitView, displayNodes, fitView]);\n\n // Handle ReactFlow initialization\n const handleInit = useCallback(() => {\n reactFlowInitialized.current = true;\n // Dialog opens instantly (no animation), so fitView immediately\n requestAnimationFrame(() => {\n fitView({ padding: 0.2, duration: 0 });\n setIsReady(true);\n });\n }, [fitView]);\n\n // Handle switching to a new center node with animation\n const handleSwitchNode = useCallback(\n (nodeId: string, direction: \"left\" | \"right\") => {\n if (nodeId === centerNodeId || isAnimating) return;\n\n setIsAnimating(true);\n\n // Animate: clicked node slides to center, current center hides\n setDisplayNodes((currentNodes) =>\n currentNodes.map((node) => {\n if (node.id === nodeId) {\n // Clicked node slides to center\n return {\n ...node,\n position: { x: 0, y: 0 },\n style: {\n ...node.style,\n transition: `all ${SLIDE_DURATION}ms ease-out`,\n },\n };\n }\n if (node.id === centerNodeId) {\n // Current center node hides\n return {\n ...node,\n style: {\n ...node.style,\n opacity: 0,\n transition: `opacity ${SLIDE_DURATION}ms ease-out`,\n },\n };\n }\n return node;\n }),\n );\n\n // After slide completes, switch to new center\n animationTimeoutRef.current = setTimeout(() => {\n onSwitchCenter(nodeId, direction);\n setIsAnimating(false);\n }, SLIDE_DURATION);\n },\n [centerNodeId, isAnimating, setDisplayNodes, onSwitchCenter],\n );\n\n // Handle node click with animation\n const handleNodeClick = useCallback(\n (_: React.MouseEvent, clickedNode: Node) => {\n if (clickedNode.id === centerNodeId || isAnimating) return;\n const direction = (clickedNode.position?.x ?? 0) < 0 ? \"left\" : \"right\";\n handleSwitchNode(clickedNode.id, direction);\n },\n [centerNodeId, isAnimating, handleSwitchNode],\n );\n\n // Handle edge hover for animation\n const handleEdgeMouseEnter = useCallback(\n (_: React.MouseEvent, edge: Edge) => {\n setHoveredEdgeId(edge.id);\n },\n [],\n );\n\n const handleEdgeMouseLeave = useCallback(() => {\n setHoveredEdgeId(null);\n }, []);\n\n // Apply hover animation to edges - use ReactFlow's built-in animated property\n const edgesWithHover = useMemo(() => {\n return displayEdges.map((edge) => {\n if (edge.id === hoveredEdgeId) {\n return {\n ...edge,\n animated: true,\n };\n }\n return edge;\n });\n }, [displayEdges, hoveredEdgeId]);\n\n // Merge nodeTypes with placeholder\n const mergedNodeTypes = useMemo(\n () => ({\n ...nodeTypes,\n placeholder: FocusModePlaceholder,\n }),\n [nodeTypes],\n );\n\n if (displayNodes.length === 0) {\n return (\n <div className=\"flex items-center justify-center h-full text-[rgb(var(--ec-page-text-muted))]\">\n Node not found\n </div>\n );\n }\n\n return (\n <div\n className=\"h-full w-full focus-mode-container\"\n style={{ opacity: isReady ? 1 : 0 }}\n >\n <ReactFlow\n nodes={displayNodes}\n edges={edgesWithHover}\n nodeTypes={mergedNodeTypes}\n edgeTypes={edgeTypes}\n onNodeClick={handleNodeClick}\n onEdgeMouseEnter={handleEdgeMouseEnter}\n onEdgeMouseLeave={handleEdgeMouseLeave}\n onInit={handleInit}\n proOptions={{ hideAttribution: true }}\n nodesDraggable={true}\n nodesConnectable={false}\n elementsSelectable={true}\n panOnDrag={true}\n zoomOnScroll={true}\n minZoom={0.3}\n maxZoom={2}\n >\n <Background color=\"rgb(var(--ec-page-border))\" gap={20} />\n <Controls showInteractive={false} />\n {displayNodes.map((node, index) => (\n <FocusModeNodeActions\n key={`actions-${node.id}-${index}`}\n node={node}\n isCenter={node.id === centerNodeId}\n onSwitch={handleSwitchNode}\n />\n ))}\n </ReactFlow>\n </div>\n );\n};\n\nexport default FocusModeContent;\n","import type { Node, Edge } from \"@xyflow/react\";\n\nexport interface NodeDisplayInfo {\n id: string;\n name: string;\n type: string;\n version?: string;\n description?: string;\n}\n\nexport interface ConnectedNodes {\n leftNodes: Node[];\n rightNodes: Node[];\n}\n\nexport const NODE_COLOR_CLASSES: Record<string, string> = {\n events: \"bg-orange-600\",\n services: \"bg-pink-600\",\n flows: \"bg-teal-600\",\n commands: \"bg-blue-600\",\n queries: \"bg-green-600\",\n channels: \"bg-gray-600\",\n externalSystem: \"bg-pink-600\",\n actor: \"bg-yellow-500\",\n step: \"bg-gray-700\",\n data: \"bg-blue-600\",\n \"data-products\": \"bg-indigo-600\",\n domains: \"bg-yellow-600\",\n entities: \"bg-purple-600\",\n};\n\nexport const NODE_TYPE_LABELS: Record<string, string> = {\n events: \"Event\",\n services: \"Service\",\n flows: \"Flow\",\n commands: \"Command\",\n queries: \"Query\",\n channels: \"Channel\",\n externalSystem: \"External System\",\n actor: \"Actor\",\n step: \"Step\",\n data: \"Data\",\n \"data-products\": \"Data Product\",\n domains: \"Domain\",\n entities: \"Entity\",\n};\n\n/**\n * Get connected nodes for a given center node\n * Left nodes: incoming edges (they send TO this node)\n * Right nodes: outgoing edges (this node sends TO them)\n */\nexport function getConnectedNodes(\n centerNodeId: string,\n nodes: Node[],\n edges: Edge[],\n): ConnectedNodes {\n const leftIds = new Set<string>();\n const rightIds = new Set<string>();\n\n edges.forEach((edge) => {\n if (edge.target === centerNodeId) {\n leftIds.add(edge.source);\n }\n if (edge.source === centerNodeId) {\n rightIds.add(edge.target);\n }\n });\n\n return {\n leftNodes: nodes.filter((n) => leftIds.has(n.id)),\n rightNodes: nodes.filter((n) => rightIds.has(n.id)),\n };\n}\n\n// Entity keys that follow the standard data structure pattern\nconst ENTITY_KEYS = [\n \"service\",\n \"message\",\n \"flow\",\n \"channel\",\n \"domain\",\n \"entity\",\n \"dataProduct\",\n] as const;\n\n/**\n * Extract display information from a ReactFlow node\n */\nexport function getNodeDisplayInfo(node: Node): NodeDisplayInfo {\n const nodeType = node.type || \"unknown\";\n const data = node.data as any;\n\n // Find the entity in data using standard keys\n const entityKey = ENTITY_KEYS.find((key) => data[key]);\n const entity = entityKey ? data[entityKey] : null;\n\n const name =\n entity?.data?.name || entity?.id || data.label || data.name || node.id;\n const version =\n entity?.data?.version || entity?.version || data.version || \"\";\n const description =\n entity?.data?.summary ||\n entity?.data?.description ||\n data.summary ||\n data.description ||\n \"\";\n\n return {\n id: node.id,\n name,\n type: nodeType,\n version,\n description: description\n ? truncateDescription(description, 100)\n : undefined,\n };\n}\n\n/**\n * Truncate description to a max length\n */\nfunction truncateDescription(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n return text.slice(0, maxLength).trim() + \"...\";\n}\n\n/**\n * Get the color class for a node type\n */\nexport function getNodeColorClass(nodeType: string): string {\n return NODE_COLOR_CLASSES[nodeType] || \"bg-gray-500\";\n}\n\n/**\n * Get the display label for a node type\n */\nexport function getNodeTypeLabel(nodeType: string): string {\n return NODE_TYPE_LABELS[nodeType] || nodeType;\n}\n\n// Mapping from entity key to doc path\nconst DOC_PATH_MAP: Record<string, string> = {\n service: \"services\",\n flow: \"flows\",\n channel: \"channels\",\n domain: \"domains\",\n entity: \"entities\",\n dataProduct: \"data-products\",\n};\n\n/**\n * Get the documentation URL for a node\n */\nexport function getNodeDocUrl(node: Node): string | null {\n const nodeType = node.type || \"unknown\";\n const data = node.data as any;\n\n // Handle message type separately due to type mapping\n if (data.message) {\n const id = data.message.data?.id || data.message.id || \"\";\n const version = data.message.data?.version || data.message.version || \"\";\n const collectionType =\n nodeType === \"events\"\n ? \"events\"\n : nodeType === \"commands\"\n ? \"commands\"\n : \"queries\";\n return id && version ? `/docs/${collectionType}/${id}/${version}` : null;\n }\n\n // Handle data/container nodes with nested data.data structure\n if (data.data && nodeType === \"data\") {\n const id = data.data.id || \"\";\n const version = data.data.version || \"\";\n return id && version ? `/docs/containers/${id}/${version}` : null;\n }\n\n // Handle standard entity types\n for (const [key, path] of Object.entries(DOC_PATH_MAP)) {\n if (data[key]) {\n const id = data[key].data?.id || data[key].id || \"\";\n const version = data[key].data?.version || data[key].version || \"\";\n return id && version ? `/docs/${path}/${id}/${version}` : null;\n }\n }\n\n return null;\n}\n","import React from \"react\";\nimport { NodeToolbar, Position, useViewport, type Node } from \"@xyflow/react\";\nimport { ArrowRightLeft, FileText } from \"lucide-react\";\nimport { getNodeDocUrl } from \"./utils\";\nimport { buildUrl } from \"../../utils/url-builder\";\n\ninterface FocusModeNodeActionsProps {\n node: Node;\n isCenter: boolean;\n onSwitch: (nodeId: string, direction: \"left\" | \"right\") => void;\n}\n\nconst FocusModeNodeActions: React.FC<FocusModeNodeActionsProps> = ({\n node,\n isCenter,\n onSwitch,\n}) => {\n const { zoom } = useViewport();\n\n // Don't show actions for placeholder nodes\n if (node.type === \"placeholder\") return null;\n\n const docUrl = getNodeDocUrl(node);\n const direction = (node.position?.x ?? 0) < 0 ? \"left\" : \"right\";\n\n // Scale sizes based on zoom (inverse relationship - smaller when zoomed out)\n const baseButtonSize = 32;\n const baseIconSize = 16;\n const scaleFactor = Math.max(0.6, Math.min(1, zoom));\n const buttonSize = Math.round(baseButtonSize * scaleFactor);\n const iconSize = Math.round(baseIconSize * scaleFactor);\n\n const handleSwitch = (e: React.MouseEvent) => {\n e.stopPropagation();\n onSwitch(node.id, direction);\n };\n\n const handleDocClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (docUrl) {\n window.location.href = buildUrl(docUrl);\n }\n };\n\n // Center node only shows docs icon (if available)\n if (isCenter) {\n if (!docUrl) return null;\n return (\n <NodeToolbar\n nodeId={node.id}\n position={Position.Bottom}\n isVisible={true}\n offset={-16}\n >\n <div\n className=\"flex items-center gap-1 bg-[rgb(var(--ec-card-bg,var(--ec-page-bg)))] border border-[rgb(var(--ec-page-border))] rounded-lg shadow-md\"\n style={{ padding: Math.round(4 * scaleFactor) }}\n >\n <button\n onClick={handleDocClick}\n className=\"flex items-center justify-center rounded-md text-[rgb(var(--ec-icon-color))] hover:text-[rgb(var(--ec-accent))] hover:bg-[rgb(var(--ec-accent-subtle))] transition-colors\"\n style={{ width: buttonSize, height: buttonSize }}\n title=\"View documentation\"\n >\n <FileText style={{ width: iconSize, height: iconSize }} />\n </button>\n </div>\n </NodeToolbar>\n );\n }\n\n return (\n <NodeToolbar\n nodeId={node.id}\n position={Position.Bottom}\n isVisible={true}\n offset={-16}\n >\n <div\n className=\"flex items-center gap-1 bg-[rgb(var(--ec-card-bg,var(--ec-page-bg)))] border border-[rgb(var(--ec-page-border))] rounded-lg shadow-md\"\n style={{ padding: Math.round(4 * scaleFactor) }}\n >\n {docUrl && (\n <button\n onClick={handleDocClick}\n className=\"flex items-center justify-center rounded-md text-[rgb(var(--ec-icon-color))] hover:text-[rgb(var(--ec-accent))] hover:bg-[rgb(var(--ec-accent-subtle))] transition-colors\"\n style={{ width: buttonSize, height: buttonSize }}\n title=\"View documentation\"\n >\n <FileText style={{ width: iconSize, height: iconSize }} />\n </button>\n )}\n <button\n onClick={handleSwitch}\n className=\"flex items-center justify-center rounded-md text-[rgb(var(--ec-icon-color))] hover:text-[rgb(var(--ec-accent))] hover:bg-[rgb(var(--ec-accent-subtle))] transition-colors\"\n style={{ width: buttonSize, height: buttonSize }}\n title=\"Focus on this node\"\n >\n <ArrowRightLeft style={{ width: iconSize, height: iconSize }} />\n </button>\n </div>\n </NodeToolbar>\n );\n};\n\nexport default FocusModeNodeActions;\n","import React from \"react\";\nimport { Handle, Position } from \"@xyflow/react\";\n\ninterface FocusModePlaceholderProps {\n data: {\n label: string;\n side: \"left\" | \"right\";\n };\n}\n\nconst FocusModePlaceholder: React.FC<FocusModePlaceholderProps> = ({\n data,\n}) => {\n const { label, side } = data;\n\n return (\n <div\n className=\"px-4 py-4 rounded-lg border-2 border-dashed border-[rgb(var(--ec-page-border))] bg-[rgb(var(--ec-page-bg)/0.5)] max-w-[280px] flex items-center justify-center\"\n style={{ opacity: 0.6, minHeight: \"130px\" }}\n >\n {side === \"right\" && (\n <Handle\n type=\"target\"\n position={Position.Left}\n style={{ visibility: \"hidden\" }}\n />\n )}\n <div className=\"text-center text-sm text-[rgb(var(--ec-page-text-muted))] italic\">\n {label}\n </div>\n {side === \"left\" && (\n <Handle\n type=\"source\"\n position={Position.Right}\n style={{ visibility: \"hidden\" }}\n />\n )}\n </div>\n );\n};\n\nexport default FocusModePlaceholder;\n","import { useState, useEffect, useRef, useCallback } from \"react\";\nimport { CheckIcon, ClipboardIcon } from \"lucide-react\";\nimport type { Node, Edge } from \"@xyflow/react\";\nimport { convertToMermaid } from \"../utils/export-mermaid\";\nimport { copyToClipboard } from \"../utils/clipboard\";\n\ninterface MermaidViewProps {\n nodes: Node[];\n edges: Edge[];\n maxTextSize?: number;\n}\n\nconst MermaidView = ({\n nodes,\n edges,\n maxTextSize = 100000,\n}: MermaidViewProps) => {\n const [copySuccess, setCopySuccess] = useState(false);\n const [mermaidCode, setMermaidCode] = useState(\"\");\n const [previewSvg, setPreviewSvg] = useState<string | null>(null);\n const [previewError, setPreviewError] = useState<string | null>(null);\n const [isRendering, setIsRendering] = useState(true);\n const containerRef = useRef<HTMLDivElement>(null);\n const svgContainerRef = useRef<HTMLDivElement>(null);\n const panZoomInstanceRef = useRef<any>(null);\n\n // Generate mermaid code\n useEffect(() => {\n const code = convertToMermaid(nodes, edges, {\n includeStyles: true,\n direction: \"LR\",\n });\n setMermaidCode(code);\n }, [nodes, edges]);\n\n // Render mermaid preview\n useEffect(() => {\n if (!mermaidCode) return;\n\n let cancelled = false;\n setIsRendering(true);\n setPreviewError(null);\n\n const renderMermaid = async () => {\n try {\n const { default: mermaid } = await import(\"mermaid\");\n\n // Detect current theme\n const isDarkMode =\n document.documentElement.getAttribute(\"data-theme\") === \"dark\";\n const currentTheme = isDarkMode ? \"dark\" : \"default\";\n\n mermaid.initialize({\n maxTextSize: maxTextSize,\n startOnLoad: false,\n theme: currentTheme,\n flowchart: {\n curve: \"basis\",\n padding: 20,\n },\n securityLevel: \"loose\",\n });\n\n const id = \"mermaid-view-\" + Math.random().toString(36).substring(2, 9);\n const { svg } = await mermaid.render(id, mermaidCode);\n\n if (!cancelled) {\n setPreviewSvg(svg);\n setPreviewError(null);\n }\n } catch (error) {\n if (!cancelled) {\n console.error(\"Mermaid render error:\", error);\n setPreviewError(\n error instanceof Error ? error.message : \"Failed to render diagram\",\n );\n setPreviewSvg(null);\n }\n } finally {\n if (!cancelled) {\n setIsRendering(false);\n }\n }\n };\n\n renderMermaid();\n\n return () => {\n cancelled = true;\n };\n }, [mermaidCode]);\n\n // Initialize pan/zoom after SVG is rendered\n useEffect(() => {\n if (!previewSvg || !svgContainerRef.current) return;\n\n const initZoom = async () => {\n const svgElement = svgContainerRef.current?.querySelector(\"svg\");\n if (!svgElement) return;\n\n try {\n const { default: svgPanZoom } = await import(\"svg-pan-zoom\");\n\n // Set SVG to fill container\n svgElement.style.width = \"100%\";\n svgElement.style.height = \"100%\";\n svgElement.removeAttribute(\"height\");\n svgElement.removeAttribute(\"width\");\n\n const instance = svgPanZoom(svgElement, {\n zoomEnabled: true,\n controlIconsEnabled: false,\n fit: true,\n center: true,\n minZoom: 0.1,\n maxZoom: 10,\n zoomScaleSensitivity: 0.15,\n dblClickZoomEnabled: true,\n mouseWheelZoomEnabled: true,\n panEnabled: true,\n });\n\n panZoomInstanceRef.current = instance;\n } catch (e) {\n console.warn(\"Failed to initialize zoom:\", e);\n }\n };\n\n initZoom();\n\n return () => {\n if (panZoomInstanceRef.current) {\n try {\n panZoomInstanceRef.current.destroy();\n } catch (e) {\n // Ignore\n }\n panZoomInstanceRef.current = null;\n }\n };\n }, [previewSvg]);\n\n const handleCopyToClipboard = useCallback(async () => {\n await copyToClipboard(mermaidCode);\n setCopySuccess(true);\n setTimeout(() => setCopySuccess(false), 2000);\n }, [mermaidCode]);\n\n return (\n <div\n ref={containerRef}\n className=\"absolute inset-0 bg-[rgb(var(--ec-page-bg))]\"\n style={{ animation: \"fadeIn 200ms ease-out\" }}\n >\n <style>{`\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n `}</style>\n\n {/* Copy button - top right */}\n <div className=\"absolute top-[10px] right-4 z-20\">\n <div className=\"relative group\">\n <button\n onClick={handleCopyToClipboard}\n className={`p-2.5 rounded-md shadow-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-[rgb(var(--ec-accent))] transition-all duration-150 ${\n copySuccess\n ? \"bg-green-500 text-white scale-110\"\n : \"bg-[rgb(var(--ec-card-bg))] hover:bg-[rgb(var(--ec-page-border))/0.5] text-[rgb(var(--ec-icon-color))] hover:scale-105\"\n }`}\n aria-label={copySuccess ? \"Copied!\" : \"Copy Mermaid code\"}\n >\n {copySuccess ? (\n <CheckIcon className=\"h-5 w-5\" />\n ) : (\n <ClipboardIcon className=\"h-5 w-5\" />\n )}\n </button>\n <div className=\"absolute top-full right-0 mt-2 px-2 py-1 bg-[rgb(var(--ec-page-text))] text-[rgb(var(--ec-page-bg))] text-xs rounded shadow-lg opacity-0 group-hover:opacity-100 transition-opacity whitespace-nowrap pointer-events-none z-50\">\n {copySuccess ? \"Copied!\" : \"Copy Mermaid code\"}\n </div>\n </div>\n </div>\n\n {/* Mermaid diagram container */}\n <div className=\"absolute inset-0 overflow-hidden\">\n {isRendering && (\n <div className=\"w-full h-full flex items-center justify-center\">\n <div className=\"relative\">\n <div className=\"flex items-center gap-4 opacity-40\">\n <div className=\"w-24 h-10 bg-[rgb(var(--ec-page-border))] rounded animate-pulse\" />\n <div className=\"w-12 h-0.5 bg-[rgb(var(--ec-page-border))] animate-pulse\" />\n <div\n className=\"w-20 h-10 bg-[rgb(var(--ec-page-border))] rounded-full animate-pulse\"\n style={{ animationDelay: \"75ms\" }}\n />\n <div\n className=\"w-12 h-0.5 bg-[rgb(var(--ec-page-border))] animate-pulse\"\n style={{ animationDelay: \"150ms\" }}\n />\n <div\n className=\"w-24 h-10 bg-[rgb(var(--ec-page-border))] rounded animate-pulse\"\n style={{ animationDelay: \"225ms\" }}\n />\n </div>\n <p className=\"text-center text-sm text-[rgb(var(--ec-page-text-muted))] mt-4\">\n Rendering diagram...\n </p>\n </div>\n </div>\n )}\n\n {previewError && !isRendering && (\n <div className=\"w-full h-full flex flex-col items-center justify-center p-4\">\n <div className=\"text-red-500 text-sm mb-2\">\n Failed to render diagram\n </div>\n <div className=\"text-[rgb(var(--ec-page-text-muted))] text-xs font-mono bg-[rgb(var(--ec-code-bg))] p-2 rounded max-w-lg overflow-auto\">\n {previewError}\n </div>\n <div className=\"mt-4 text-sm text-[rgb(var(--ec-page-text-muted))]\">\n <p>You can still copy the Mermaid code and paste it into</p>\n <a\n href=\"https://mermaid.live\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-[rgb(var(--ec-accent))] hover:underline\"\n >\n mermaid.live\n </a>\n </div>\n </div>\n )}\n\n {previewSvg && !isRendering && !previewError && (\n <div\n ref={svgContainerRef}\n className=\"w-full h-full cursor-grab active:cursor-grabbing [&_svg]:w-full [&_svg]:h-full\"\n dangerouslySetInnerHTML={{ __html: previewSvg }}\n />\n )}\n </div>\n\n {/* Footer hint */}\n <div className=\"absolute bottom-4 left-4 z-20\">\n <div className=\"flex items-center gap-2 bg-[rgb(var(--ec-card-bg))]/90 backdrop-blur-sm px-3 py-1.5 rounded-md shadow-sm border border-[rgb(var(--ec-page-border))]\">\n <svg\n className=\"w-3.5 h-3.5 text-[rgb(var(--ec-icon-color))]\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 15l-2 5L9 9l11 4-5 2zm0 0l5 5M7.188 2.239l.777 2.897M5.136 7.965l-2.898-.777M13.95 4.05l-2.122 2.122m-5.657 5.656l-2.12 2.122\"\n />\n </svg>\n <span className=\"text-xs text-[rgb(var(--ec-page-text-muted))]\">\n Scroll to zoom · Drag to pan\n </span>\n </div>\n </div>\n </div>\n );\n};\n\nexport default MermaidView;\n","import type { Node, Edge } from \"@xyflow/react\";\n\n/**\n * Mermaid Export Utility\n * Converts React Flow nodes and edges to Mermaid flowchart syntax\n */\n\nexport interface MermaidExportOptions {\n /** Include class definitions for styling */\n includeStyles?: boolean;\n /** Direction of the flowchart: LR (left-right), TB (top-bottom), etc. */\n direction?: \"LR\" | \"TB\" | \"RL\" | \"BT\";\n}\n\n/**\n * Mapping of node types to their Mermaid shape syntax\n * Format: [prefix, suffix]\n */\nconst NODE_SHAPE_MAP: Record<string, [string, string]> = {\n services: [\"[[\", \"]]\"], // stadium shape\n service: [\"[[\", \"]]\"],\n events: [\">\", \"]\"], // flag/asymmetric shape (message-like)\n event: [\">\", \"]\"],\n commands: [\">\", \"]\"], // flag/asymmetric shape (message-like)\n command: [\">\", \"]\"],\n queries: [\"{{\", \"}}\"], // hexagon\n query: [\"{{\", \"}}\"],\n channels: [\"[(\", \")]\"], // cylinder\n channel: [\"[(\", \")]\"],\n domains: [\"[\", \"]\"], // rectangle\n domain: [\"[\", \"]\"],\n flows: [\"([\", \"])\"], // stadium (rounded)\n flow: [\"([\", \"])\"],\n step: [\"[\", \"]\"], // rectangle\n user: [\"((\", \"))\"], // circle\n actor: [\"((\", \"))\"], // circle\n externalSystem: [\"[[\", \"]]\"], // stadium\n \"external-system\": [\"[[\", \"]]\"],\n data: [\"[(\", \")]\"], // cylinder (database)\n \"data-product\": [\"[[\", \"]]\"], // stadium\n \"data-products\": [\"[[\", \"]]\"],\n entities: [\"[\", \"]\"], // rectangle\n entity: [\"[\", \"]\"],\n custom: [\"[\", \"]\"], // rectangle\n view: [\"[\", \"]\"], // rectangle\n note: [\"[\", \"]\"], // rectangle\n};\n\n/**\n * Mermaid class definitions for styling different node types\n */\nconst NODE_STYLE_CLASSES: Record<string, string> = {\n services: \"fill:#ec4899,stroke:#be185d,color:#fff\",\n service: \"fill:#ec4899,stroke:#be185d,color:#fff\",\n events: \"fill:#f97316,stroke:#c2410c,color:#fff\",\n event: \"fill:#f97316,stroke:#c2410c,color:#fff\",\n commands: \"fill:#3b82f6,stroke:#1d4ed8,color:#fff\",\n command: \"fill:#3b82f6,stroke:#1d4ed8,color:#fff\",\n queries: \"fill:#22c55e,stroke:#15803d,color:#fff\",\n query: \"fill:#22c55e,stroke:#15803d,color:#fff\",\n channels: \"fill:#6b7280,stroke:#374151,color:#fff\",\n channel: \"fill:#6b7280,stroke:#374151,color:#fff\",\n domains: \"fill:#eab308,stroke:#a16207,color:#000\",\n domain: \"fill:#eab308,stroke:#a16207,color:#000\",\n flows: \"fill:#14b8a6,stroke:#0f766e,color:#fff\",\n flow: \"fill:#14b8a6,stroke:#0f766e,color:#fff\",\n step: \"fill:#374151,stroke:#1f2937,color:#fff\",\n user: \"fill:#8b5cf6,stroke:#6d28d9,color:#fff\",\n actor: \"fill:#eab308,stroke:#a16207,color:#000\",\n externalSystem: \"fill:#ec4899,stroke:#be185d,color:#fff\",\n \"external-system\": \"fill:#ec4899,stroke:#be185d,color:#fff\",\n data: \"fill:#3b82f6,stroke:#1d4ed8,color:#fff\",\n \"data-product\": \"fill:#6366f1,stroke:#4338ca,color:#fff\",\n \"data-products\": \"fill:#6366f1,stroke:#4338ca,color:#fff\",\n entities: \"fill:#6b7280,stroke:#374151,color:#fff\",\n entity: \"fill:#6b7280,stroke:#374151,color:#fff\",\n custom: \"fill:#9ca3af,stroke:#6b7280,color:#000\",\n view: \"fill:#9ca3af,stroke:#6b7280,color:#000\",\n note: \"fill:#fef3c7,stroke:#d97706,color:#000\",\n};\n\n/**\n * Sanitize a string to be a valid Mermaid node ID\n * Mermaid IDs should be alphanumeric with underscores\n */\nexport function sanitizeMermaidId(id: string): string {\n // Replace any non-alphanumeric characters (except underscores) with underscores\n // Also handle dots and hyphens which are common in version strings\n return id.replace(/[^a-zA-Z0-9_]/g, \"_\");\n}\n\n/**\n * Escape special characters in Mermaid labels\n */\nfunction escapeMermaidLabel(label: string): string {\n // Escape quotes and other special characters\n return label.replace(/\"/g, \"#quot;\").replace(/\\n/g, \"<br/>\");\n}\n\n/**\n * Get the Mermaid shape syntax for a node type\n */\nexport function getMermaidNodeShape(type: string): [string, string] {\n return NODE_SHAPE_MAP[type] || [\"[\", \"]\"];\n}\n\n/**\n * Helper to format label with version\n */\nfunction formatLabelWithVersion(name: string, version?: string): string {\n if (version) {\n return `${name} (${version})`;\n }\n return name;\n}\n\n/**\n * Extract the display label from a node based on its type and data\n * Includes version information when available\n */\nexport function getNodeLabel(node: Node): string {\n const { type, data } = node;\n\n if (!data) return node.id;\n\n // Handle different node types and their data structures\n if (type === \"services\" || type === \"service\") {\n const service = (data as any).service;\n const name = service?.name || service?.id || node.id;\n const version = service?.data?.version || service?.version;\n return formatLabelWithVersion(name, version);\n }\n\n if (\n type === \"events\" ||\n type === \"event\" ||\n type === \"commands\" ||\n type === \"command\" ||\n type === \"queries\" ||\n type === \"query\"\n ) {\n const message = (data as any).message;\n const name = message?.name || message?.id || node.id;\n const version = message?.data?.version || message?.version;\n return formatLabelWithVersion(name, version);\n }\n\n if (type === \"channels\" || type === \"channel\") {\n const channel = (data as any).channel;\n const name = channel?.name || channel?.id || node.id;\n const version = channel?.data?.version || channel?.version;\n return formatLabelWithVersion(name, version);\n }\n\n if (type === \"domains\" || type === \"domain\") {\n const domain = (data as any).domain;\n // Domain data can be nested in .data\n const domainData = domain?.data || domain;\n const name = domainData?.name || domainData?.id || node.id;\n const version = domainData?.version || domain?.version;\n return formatLabelWithVersion(name, version);\n }\n\n if (type === \"flows\" || type === \"flow\") {\n const flow = (data as any).flow;\n const name = flow?.name || flow?.id || node.id;\n const version = flow?.data?.version || flow?.version;\n return formatLabelWithVersion(name, version);\n }\n\n if (type === \"step\") {\n const step = (data as any).step;\n return step?.title || step?.name || step?.id || node.id;\n }\n\n if (type === \"user\" || type === \"actor\") {\n return (\n (data as any).name || (data as any).label || (data as any).id || node.id\n );\n }\n\n if (type === \"externalSystem\" || type === \"external-system\") {\n const system = (data as any).externalSystem || data;\n return system?.name || system?.id || node.id;\n }\n\n if (type === \"data\") {\n const dataNode = (data as any).data;\n return dataNode?.name || dataNode?.id || node.id;\n }\n\n if (type === \"data-product\" || type === \"data-products\") {\n const dataProduct = (data as any).dataProduct;\n const name = dataProduct?.name || dataProduct?.id || node.id;\n const version = dataProduct?.data?.version || dataProduct?.version;\n return formatLabelWithVersion(name, version);\n }\n\n if (type === \"entities\" || type === \"entity\") {\n const entity = (data as any).entity;\n return entity?.name || entity?.id || node.id;\n }\n\n if (type === \"note\") {\n return (data as any).text || (data as any).label || \"Note\";\n }\n\n // Fallback: try common data patterns\n return (\n (data as any).name ||\n (data as any).label ||\n (data as any).title ||\n (data as any).id ||\n node.id\n );\n}\n\n/**\n * Extract label from an edge\n */\nfunction getEdgeLabel(edge: Edge): string | undefined {\n if (edge.label && typeof edge.label === \"string\") {\n return edge.label;\n }\n if (edge.data?.label && typeof edge.data.label === \"string\") {\n return edge.data.label;\n }\n return undefined;\n}\n\n/**\n * Convert React Flow nodes and edges to Mermaid flowchart syntax\n */\nexport function convertToMermaid(\n nodes: Node[],\n edges: Edge[],\n options: MermaidExportOptions = {},\n): string {\n const { includeStyles = true, direction = \"LR\" } = options;\n\n const lines: string[] = [];\n\n // Add flowchart header\n lines.push(`flowchart ${direction}`);\n\n // Collect used node types for class definitions\n const usedTypes = new Set<string>();\n\n // Add class definitions if styles are enabled\n if (includeStyles) {\n lines.push(\"\");\n lines.push(\" %% Style definitions\");\n\n // First pass: collect all used node types\n nodes.forEach((node) => {\n if (node.type && NODE_STYLE_CLASSES[node.type]) {\n usedTypes.add(node.type);\n }\n });\n\n // Add class definitions for used types\n usedTypes.forEach((type) => {\n const style = NODE_STYLE_CLASSES[type];\n if (style) {\n lines.push(` classDef ${sanitizeMermaidId(type)} ${style}`);\n }\n });\n }\n\n // Add node definitions\n lines.push(\"\");\n lines.push(\" %% Nodes\");\n\n nodes.forEach((node) => {\n const sanitizedId = sanitizeMermaidId(node.id);\n const label = escapeMermaidLabel(getNodeLabel(node));\n const [prefix, suffix] = getMermaidNodeShape(node.type || \"custom\");\n\n let nodeLine = ` ${sanitizedId}${prefix}\"${label}\"${suffix}`;\n\n // Add class reference if styles are enabled\n if (includeStyles && node.type && usedTypes.has(node.type)) {\n nodeLine += `:::${sanitizeMermaidId(node.type)}`;\n }\n\n lines.push(nodeLine);\n });\n\n // Add edge definitions\n lines.push(\"\");\n lines.push(\" %% Edges\");\n\n edges.forEach((edge) => {\n const sourceId = sanitizeMermaidId(edge.source);\n const targetId = sanitizeMermaidId(edge.target);\n const label = getEdgeLabel(edge);\n\n let edgeLine: string;\n if (label) {\n // Clean up multi-line labels\n const cleanLabel = label.replace(/\\n/g, \" \").trim();\n edgeLine = ` ${sourceId} -->|\"${escapeMermaidLabel(cleanLabel)}\"| ${targetId}`;\n } else {\n edgeLine = ` ${sourceId} --> ${targetId}`;\n }\n\n lines.push(edgeLine);\n });\n\n return lines.join(\"\\n\");\n}\n","/**\n * Utility to copy text to clipboard\n */\nexport async function copyToClipboard(text: string): Promise<boolean> {\n try {\n if (navigator?.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n return true;\n }\n // Fallback for older browsers\n const textArea = document.createElement(\"textarea\");\n textArea.value = text;\n textArea.style.position = \"fixed\";\n textArea.style.left = \"-999999px\";\n document.body.appendChild(textArea);\n textArea.select();\n const success = document.execCommand(\"copy\");\n document.body.removeChild(textArea);\n return success;\n } catch (error) {\n console.error(\"Failed to copy to clipboard:\", error);\n return false;\n }\n}\n","import React, { type RefObject, useState, memo } from \"react\";\nimport * as DropdownMenu from \"@radix-ui/react-dropdown-menu\";\nimport {\n Code,\n Share2,\n Search,\n Grid3x3,\n Maximize2,\n Map,\n Sparkles,\n Zap,\n EyeOff,\n ExternalLink,\n Save,\n RotateCcw,\n Loader2,\n MessageCircle,\n} from \"lucide-react\";\nimport {\n DocumentArrowDownIcon,\n PresentationChartLineIcon,\n} from \"@heroicons/react/24/outline\";\nimport type { VisualiserSearchRef } from \"./VisualiserSearch\";\n\ninterface VisualizerDropdownContentProps {\n isMermaidView: boolean;\n setIsMermaidView: (value: boolean) => void;\n animateMessages: boolean;\n toggleAnimateMessages: () => void;\n hideChannels: boolean;\n toggleChannelsVisibility: () => void;\n hasChannels: boolean;\n showMinimap: boolean;\n setShowMinimap: (value: boolean) => void;\n handleFitView: () => void;\n searchRef: RefObject<VisualiserSearchRef | null>;\n isChatEnabled: boolean;\n openChat: () => void;\n handleCopyArchitectureCode: () => void;\n handleExportVisual: () => void;\n setIsShareModalOpen: (value: boolean) => void;\n toggleFullScreen: () => void;\n openStudioModal: () => void;\n isDevMode?: boolean;\n onSaveLayout?: () => Promise<boolean>;\n onResetLayout?: () => Promise<boolean>;\n notesCount?: number;\n onOpenNotes?: () => void;\n}\n\nconst VisualizerDropdownContent: React.FC<VisualizerDropdownContentProps> =\n memo(\n ({\n isMermaidView,\n setIsMermaidView,\n animateMessages,\n toggleAnimateMessages,\n hideChannels,\n toggleChannelsVisibility,\n hasChannels,\n showMinimap,\n setShowMinimap,\n handleFitView,\n searchRef,\n isChatEnabled,\n openChat,\n handleCopyArchitectureCode,\n handleExportVisual,\n setIsShareModalOpen,\n toggleFullScreen,\n openStudioModal,\n isDevMode = false,\n onSaveLayout,\n onResetLayout,\n notesCount = 0,\n onOpenNotes,\n }) => {\n const [layoutStatus, setLayoutStatus] = useState<\n \"idle\" | \"saving\" | \"resetting\"\n >(\"idle\");\n\n const handleSaveLayout = async () => {\n if (!onSaveLayout) return;\n setLayoutStatus(\"saving\");\n await onSaveLayout();\n setLayoutStatus(\"idle\");\n };\n\n const handleResetLayout = async () => {\n if (!onResetLayout) return;\n if (\n !window.confirm(\n \"Reset layout to auto-positioning? This will delete your saved layout.\",\n )\n ) {\n return;\n }\n setLayoutStatus(\"resetting\");\n const success = await onResetLayout();\n if (success) {\n window.location.reload();\n } else {\n setLayoutStatus(\"idle\");\n }\n };\n\n return (\n <>\n {/* Canvas Settings Submenu */}\n <DropdownMenu.Sub>\n <DropdownMenu.SubTrigger className=\"flex items-center px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer transition-colors gap-2 outline-none\">\n <Grid3x3 className=\"w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0\" />\n <span className=\"flex-1 font-normal\">Canvas</span>\n <svg\n className=\"w-3 h-3 text-[rgb(var(--ec-page-text-muted))]\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </DropdownMenu.SubTrigger>\n <DropdownMenu.Portal>\n <DropdownMenu.SubContent\n className=\"min-w-[200px] bg-[rgb(var(--ec-card-bg))] rounded-lg shadow-xl border border-[rgb(var(--ec-page-border))] py-1.5 z-[60]\"\n sideOffset={8}\n alignOffset={-8}\n >\n <DropdownMenu.CheckboxItem\n checked={isMermaidView}\n onCheckedChange={setIsMermaidView}\n className=\"flex items-center px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer transition-colors gap-2\"\n >\n <Code className=\"w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0\" />\n <span className=\"flex-1 font-normal\">Render as mermaid</span>\n <div\n className={`w-7 h-4 rounded-full transition-all duration-200 flex-shrink-0 relative ${isMermaidView ? \"bg-[rgb(var(--ec-accent))]\" : \"bg-[rgb(var(--ec-page-border))]\"}`}\n >\n <div\n className={`absolute top-0.5 w-3 h-3 rounded-full bg-white shadow-sm transition-all duration-200 ${isMermaidView ? \"left-3.5\" : \"left-0.5\"}`}\n />\n </div>\n </DropdownMenu.CheckboxItem>\n\n <DropdownMenu.Separator className=\"my-1 h-px bg-[rgb(var(--ec-page-border))]\" />\n\n <DropdownMenu.CheckboxItem\n checked={animateMessages}\n onCheckedChange={toggleAnimateMessages}\n className=\"flex items-center px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer transition-colors gap-2\"\n >\n <Zap className=\"w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0\" />\n <span className=\"flex-1 font-normal\">Simulate Messages</span>\n <div\n className={`w-7 h-4 rounded-full transition-all duration-200 flex-shrink-0 relative ${animateMessages ? \"bg-[rgb(var(--ec-accent))]\" : \"bg-[rgb(var(--ec-page-border))]\"}`}\n >\n <div\n className={`absolute top-0.5 w-3 h-3 rounded-full bg-white shadow-sm transition-all duration-200 ${animateMessages ? \"left-3.5\" : \"left-0.5\"}`}\n />\n </div>\n </DropdownMenu.CheckboxItem>\n\n {hasChannels && (\n <DropdownMenu.CheckboxItem\n checked={hideChannels}\n onCheckedChange={toggleChannelsVisibility}\n className=\"flex items-center px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer transition-colors gap-2\"\n >\n <EyeOff className=\"w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0\" />\n <span className=\"flex-1 font-normal\">Hide channels</span>\n <div\n className={`w-7 h-4 rounded-full transition-all duration-200 flex-shrink-0 relative ${hideChannels ? \"bg-[rgb(var(--ec-accent))]\" : \"bg-[rgb(var(--ec-page-border))]\"}`}\n >\n <div\n className={`absolute top-0.5 w-3 h-3 rounded-full bg-white shadow-sm transition-all duration-200 ${hideChannels ? \"left-3.5\" : \"left-0.5\"}`}\n />\n </div>\n </DropdownMenu.CheckboxItem>\n )}\n\n <DropdownMenu.CheckboxItem\n checked={showMinimap}\n onCheckedChange={setShowMinimap}\n className=\"flex items-center px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer transition-colors gap-2\"\n >\n <Map className=\"w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0\" />\n <span className=\"flex-1 font-normal\">Show minimap</span>\n <div\n className={`w-7 h-4 rounded-full transition-all duration-200 flex-shrink-0 relative ${showMinimap ? \"bg-[rgb(var(--ec-accent))]\" : \"bg-[rgb(var(--ec-page-border))]\"}`}\n >\n <div\n className={`absolute top-0.5 w-3 h-3 rounded-full bg-white shadow-sm transition-all duration-200 ${showMinimap ? \"left-3.5\" : \"left-0.5\"}`}\n />\n </div>\n </DropdownMenu.CheckboxItem>\n\n <DropdownMenu.Separator className=\"my-1 h-px bg-[rgb(var(--ec-page-border))]\" />\n\n <DropdownMenu.Item\n onClick={handleFitView}\n className=\"px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer flex items-center gap-2 transition-colors\"\n >\n <Maximize2 className=\"w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0\" />\n <span className=\"flex-1 font-normal\">Fit to view</span>\n </DropdownMenu.Item>\n\n <DropdownMenu.Item\n onClick={() => {\n searchRef.current?.hideSuggestions();\n setTimeout(() => {\n const searchInput = document.querySelector(\n 'input[placeholder=\"Search nodes...\"]',\n ) as HTMLInputElement;\n searchInput?.focus();\n }, 50);\n }}\n className=\"px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer flex items-center gap-2 transition-colors\"\n >\n <Search className=\"w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0\" />\n <span className=\"flex-1 font-normal\">Find on canvas</span>\n </DropdownMenu.Item>\n </DropdownMenu.SubContent>\n </DropdownMenu.Portal>\n </DropdownMenu.Sub>\n\n {/* Notes */}\n {notesCount > 0 && onOpenNotes && (\n <DropdownMenu.Item\n onClick={onOpenNotes}\n className=\"px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer flex items-center gap-2 transition-colors\"\n >\n <MessageCircle className=\"w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0\" />\n <span className=\"flex-1 font-normal\">\n View notes ({notesCount})\n </span>\n </DropdownMenu.Item>\n )}\n\n {/* Dev Mode: Layout Submenu */}\n {isDevMode && onSaveLayout && (\n <DropdownMenu.Sub>\n <DropdownMenu.SubTrigger className=\"flex items-center px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer transition-colors gap-2 outline-none\">\n <Save className=\"w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0\" />\n <span className=\"flex-1 font-normal\">Layout</span>\n <span className=\"text-[10px] text-amber-600 font-medium\">\n DEV\n </span>\n <svg\n className=\"w-3 h-3 text-[rgb(var(--ec-page-text-muted))]\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </DropdownMenu.SubTrigger>\n <DropdownMenu.Portal>\n <DropdownMenu.SubContent\n className=\"min-w-[180px] bg-[rgb(var(--ec-card-bg))] rounded-lg shadow-xl border border-[rgb(var(--ec-page-border))] py-1.5 z-[60]\"\n sideOffset={8}\n alignOffset={-8}\n >\n <DropdownMenu.Item\n onClick={handleSaveLayout}\n disabled={layoutStatus !== \"idle\"}\n className=\"px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer flex items-center gap-2 transition-colors disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n {layoutStatus === \"saving\" ? (\n <Loader2 className=\"w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0 animate-spin\" />\n ) : (\n <Save className=\"w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0\" />\n )}\n <span className=\"flex-1 font-normal\">\n {layoutStatus === \"saving\" ? \"Saving...\" : \"Save Layout\"}\n </span>\n </DropdownMenu.Item>\n <DropdownMenu.Item\n onClick={handleResetLayout}\n disabled={layoutStatus !== \"idle\"}\n className=\"px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer flex items-center gap-2 transition-colors disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n {layoutStatus === \"resetting\" ? (\n <Loader2 className=\"w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0 animate-spin\" />\n ) : (\n <RotateCcw className=\"w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0\" />\n )}\n <span className=\"flex-1 font-normal\">\n {layoutStatus === \"resetting\"\n ? \"Resetting...\"\n : \"Reset Layout\"}\n </span>\n </DropdownMenu.Item>\n </DropdownMenu.SubContent>\n </DropdownMenu.Portal>\n </DropdownMenu.Sub>\n )}\n\n {/* Ask AI */}\n {isChatEnabled && (\n <>\n <DropdownMenu.Separator className=\"my-1 h-px bg-[rgb(var(--ec-page-border))]\" />\n <DropdownMenu.Item\n onClick={openChat}\n className=\"px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer flex items-center gap-2 transition-colors\"\n >\n <Sparkles className=\"w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0\" />\n <span className=\"flex-1 font-normal\">Ask a question</span>\n </DropdownMenu.Item>\n </>\n )}\n\n {/* Export Items */}\n <DropdownMenu.Separator className=\"my-1 h-px bg-[rgb(var(--ec-page-border))]\" />\n <DropdownMenu.Item\n onClick={handleCopyArchitectureCode}\n className=\"px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer flex items-center gap-2 transition-colors\"\n >\n <Code className=\"w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0\" />\n <span className=\"flex-1 font-normal\">Copy as mermaid</span>\n </DropdownMenu.Item>\n\n <DropdownMenu.Item\n onClick={handleExportVisual}\n className=\"px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer flex items-center gap-2 transition-colors\"\n >\n <DocumentArrowDownIcon className=\"w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0\" />\n <span className=\"flex-1 font-normal\">Export image</span>\n </DropdownMenu.Item>\n\n {/* Share Link */}\n <DropdownMenu.Item\n onClick={() => setIsShareModalOpen(true)}\n className=\"px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer flex items-center gap-2 transition-colors\"\n >\n <Share2 className=\"w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0\" />\n <span className=\"flex-1 font-normal\">Share Link</span>\n </DropdownMenu.Item>\n\n {/* Start Presentation */}\n <DropdownMenu.Separator className=\"my-1 h-px bg-[rgb(var(--ec-page-border))]\" />\n <DropdownMenu.Item\n onClick={toggleFullScreen}\n className=\"px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer flex items-center gap-2 transition-colors\"\n >\n <PresentationChartLineIcon className=\"w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0\" />\n <span className=\"flex-1 font-normal\">Start Presentation</span>\n </DropdownMenu.Item>\n\n {/* Open in EventCatalog Studio */}\n <DropdownMenu.Separator className=\"my-1 h-px bg-[rgb(var(--ec-page-border))]\" />\n <DropdownMenu.Item\n onClick={openStudioModal}\n className=\"px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer flex items-center gap-2 transition-colors\"\n >\n <ExternalLink className=\"w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0\" />\n <span className=\"flex-1 font-normal\">\n Open in EventCatalog Studio\n </span>\n </DropdownMenu.Item>\n </>\n );\n },\n );\n\nVisualizerDropdownContent.displayName = \"VisualizerDropdownContent\";\n\nexport default VisualizerDropdownContent;\n","import { memo } from \"react\";\nimport * as ContextMenu from \"@radix-ui/react-context-menu\";\nimport type { ContextMenuItem } from \"../types\";\n\ninterface NodeContextMenuProps {\n items: ContextMenuItem[];\n children: React.ReactNode;\n}\n\nexport default memo(function NodeContextMenu({\n items,\n children,\n}: NodeContextMenuProps) {\n if (!items || items.length === 0) return <>{children}</>;\n\n return (\n <ContextMenu.Root>\n <ContextMenu.Trigger>{children}</ContextMenu.Trigger>\n <ContextMenu.Portal>\n <ContextMenu.Content\n className=\"min-w-[220px] bg-white rounded-md p-1 shadow-md border border-gray-200 z-50\"\n onClick={(e) => e.stopPropagation()}\n >\n {items.map((item, index) => (\n <div key={index}>\n {item.separator && index > 0 && (\n <ContextMenu.Separator className=\"h-[1px] bg-gray-200 m-1\" />\n )}\n <ContextMenu.Item\n asChild\n className=\"text-sm px-2 py-1.5 outline-none cursor-pointer hover:bg-orange-100 rounded-sm flex items-center\"\n >\n <a\n href={item.href}\n {...(item.download ? { download: item.download } : {})}\n {...(item.external\n ? { target: \"_blank\", rel: \"noopener noreferrer\" }\n : {})}\n >\n {item.label}\n </a>\n </ContextMenu.Item>\n </div>\n ))}\n </ContextMenu.Content>\n </ContextMenu.Portal>\n </ContextMenu.Root>\n );\n});\n","import dagre from \"dagre\";\nimport { MarkerType, type Node, type Edge } from \"@xyflow/react\";\nimport type { GraphNode, GraphEdge } from \"../types\";\n\nconst GROUP_HEADER_HEIGHT = 44;\nconst GROUP_CONTENT_PADDING_TOP = 50;\nconst GROUP_CONTENT_PADDING_BOTTOM = 30;\nconst GROUP_PADDING_X = 60;\n\nconst EMPTY_GROUP_WIDTH = 200;\nconst EMPTY_GROUP_HEIGHT = 80;\n\nconst defaultSizes: Record<string, { w: number; h: number }> = {\n service: { w: 300, h: 140 },\n event: { w: 240, h: 140 },\n command: { w: 300, h: 100 },\n query: { w: 300, h: 100 },\n channel: { w: 300, h: 140 },\n container: { w: 300, h: 140 },\n \"data-product\": { w: 300, h: 140 },\n data: { w: 320, h: 120 },\n domain: { w: 300, h: 120 },\n flow: { w: 300, h: 140 },\n actor: { w: 240, h: 100 },\n \"external-system\": { w: 300, h: 100 },\n step: { w: 280, h: 100 },\n};\nconst fallbackSize = { w: 280, h: 100 };\n\nexport function getNodeSize(\n type: string,\n nodeWidth?: number,\n nodeHeight?: number,\n) {\n const size = defaultSizes[type] || fallbackSize;\n return { w: nodeWidth ?? size.w, h: nodeHeight ?? size.h };\n}\n\nexport function buildNodeData(\n node: GraphNode,\n style?: string,\n): Record<string, unknown> {\n const notes =\n (node.metadata.notes as Array<{\n content: string;\n author?: string;\n priority?: string;\n }>) || [];\n const owners = (node.metadata.owners as string[]) || [];\n const base = {\n name: node.label,\n version: (node.metadata.version as string) || \"\",\n summary: (node.metadata.summary as string) || \"\",\n deprecated: node.metadata.deprecated === true,\n draft: node.metadata.draft === true,\n ...(notes.length > 0 ? { notes } : {}),\n ...(owners.length > 0 ? { owners } : {}),\n };\n\n switch (node.type) {\n case \"service\":\n return { mode: \"full\", style, service: base };\n case \"event\":\n case \"command\":\n case \"query\":\n return {\n mode: \"full\",\n style,\n message: {\n ...base,\n schema: (node.metadata.schema as string) || \"\",\n },\n };\n case \"channel\":\n return {\n mode: \"full\",\n style,\n channel: {\n ...base,\n protocols: (node.metadata.protocols as string[]) || [],\n address: (node.metadata.address as string) || \"\",\n },\n };\n case \"container\":\n return {\n mode: \"full\",\n style,\n data: {\n ...base,\n type: (node.metadata.containerType as string) || \"Database\",\n },\n };\n case \"data-product\":\n return { mode: \"full\", style, dataProduct: base };\n case \"data\":\n return {\n mode: \"full\",\n style,\n data: {\n ...base,\n type: (node.metadata.containerType as string) || \"Database\",\n },\n };\n case \"domain\":\n return {\n mode: \"full\",\n style,\n domain: { data: { ...base, id: node.id } },\n };\n case \"flow\":\n return {\n mode: \"full\",\n style,\n flow: { data: { ...base, id: node.id } },\n };\n case \"actor\":\n return { ...base, label: node.label, mode: \"full\", style, id: node.id };\n case \"external-system\":\n return {\n mode: \"full\",\n style,\n externalSystem: { label: node.label, ...base, id: node.id },\n };\n case \"step\":\n return {\n mode: \"full\",\n style,\n step: { ...base, title: node.label, id: node.id },\n };\n default:\n return { ...base, style, resourceType: node.type };\n }\n}\n\nexport function layoutGraph(\n nodes: GraphNode[],\n edges: GraphEdge[],\n options: {\n rankdir?: string;\n nodesep?: number;\n ranksep?: number;\n edgesep?: number;\n } = {},\n style?: string,\n): { nodes: Node[]; edges: Edge[] } {\n if (nodes.length === 0) {\n return { nodes: [], edges: [] };\n }\n\n const { rankdir = \"LR\", nodesep = 80, ranksep = 140, edgesep = 40 } = options;\n\n function nodeSize(type: string) {\n return getNodeSize(type);\n }\n\n // All domain nodes become groups\n const domainNodeIds = new Set(\n nodes.filter((n) => n.type === \"domain\").map((n) => n.id),\n );\n\n const parentNodeIds = new Set(\n nodes.filter((n) => n.parentId).map((n) => n.parentId!),\n );\n\n const allGroupIds = new Set([...domainNodeIds, ...parentNodeIds]);\n\n const childNodeIds = new Set<string>();\n for (const node of nodes) {\n if (node.parentId && allGroupIds.has(node.parentId)) {\n childNodeIds.add(node.id);\n }\n }\n\n // If no groups, use flat layout\n if (allGroupIds.size === 0) {\n return flatLayout(\n nodes,\n edges,\n { rankdir, nodesep, ranksep, edgesep },\n nodeSize,\n style,\n );\n }\n\n // Grouped layout\n const groupChildren = new Map<string, GraphNode[]>();\n for (const id of allGroupIds) {\n groupChildren.set(id, []);\n }\n for (const node of nodes) {\n if (node.parentId && allGroupIds.has(node.parentId)) {\n groupChildren.get(node.parentId)!.push(node);\n }\n }\n\n const nodeById = new Map(nodes.map((n) => [n.id, n]));\n const groupSizes = new Map<string, { width: number; height: number }>();\n const groupInternalLayouts = new Map<\n string,\n {\n childPositions: Map<\n string,\n { x: number; y: number; w: number; h: number }\n >;\n width: number;\n height: number;\n }\n >();\n\n function computeGroupSize(groupId: string): {\n width: number;\n height: number;\n } {\n if (groupSizes.has(groupId)) return groupSizes.get(groupId)!;\n\n const children = groupChildren.get(groupId) || [];\n\n if (children.length === 0) {\n const size = { width: EMPTY_GROUP_WIDTH, height: EMPTY_GROUP_HEIGHT };\n groupSizes.set(groupId, size);\n groupInternalLayouts.set(groupId, {\n childPositions: new Map(),\n width: size.width,\n height: size.height,\n });\n return size;\n }\n\n for (const child of children) {\n if (allGroupIds.has(child.id)) {\n computeGroupSize(child.id);\n }\n }\n\n const ig = new dagre.graphlib.Graph();\n ig.setDefaultEdgeLabel(() => ({}));\n ig.setGraph({\n rankdir,\n nodesep: Math.max(nodesep, 80),\n ranksep: Math.max(ranksep, 100),\n edgesep,\n });\n\n for (const child of children) {\n if (allGroupIds.has(child.id)) {\n const childSize = groupSizes.get(child.id)!;\n ig.setNode(child.id, {\n width: childSize.width,\n height: childSize.height,\n });\n } else {\n const s = nodeSize(child.type);\n ig.setNode(child.id, { width: s.w, height: s.h });\n }\n }\n\n const childIdSet = new Set(children.map((c) => c.id));\n for (const edge of edges) {\n if (childIdSet.has(edge.source) && childIdSet.has(edge.target)) {\n ig.setEdge(edge.source, edge.target);\n }\n }\n\n dagre.layout(ig);\n\n const childPositions = new Map<\n string,\n { x: number; y: number; w: number; h: number }\n >();\n let minX = Infinity,\n minY = Infinity,\n maxX = -Infinity,\n maxY = -Infinity;\n\n for (const child of children) {\n const pos = ig.node(child.id);\n if (!pos) continue;\n const left = pos.x - pos.width / 2;\n const top = pos.y - pos.height / 2;\n const right = pos.x + pos.width / 2;\n const bottom = pos.y + pos.height / 2;\n childPositions.set(child.id, {\n x: left,\n y: top,\n w: pos.width,\n h: pos.height,\n });\n minX = Math.min(minX, left);\n minY = Math.min(minY, top);\n maxX = Math.max(maxX, right);\n maxY = Math.max(maxY, bottom);\n }\n\n const contentH = maxY - minY;\n const contentW = maxX - minX;\n const totalW = contentW + GROUP_PADDING_X * 2;\n const totalH =\n GROUP_HEADER_HEIGHT +\n GROUP_CONTENT_PADDING_TOP +\n contentH +\n GROUP_CONTENT_PADDING_BOTTOM;\n const contentTop = GROUP_HEADER_HEIGHT + GROUP_CONTENT_PADDING_TOP;\n\n for (const [id, pos] of childPositions) {\n childPositions.set(id, {\n x: pos.x - minX + GROUP_PADDING_X,\n y: pos.y - minY + contentTop,\n w: pos.w,\n h: pos.h,\n });\n }\n\n groupSizes.set(groupId, { width: totalW, height: totalH });\n groupInternalLayouts.set(groupId, {\n childPositions,\n width: totalW,\n height: totalH,\n });\n return { width: totalW, height: totalH };\n }\n\n for (const groupId of allGroupIds) {\n computeGroupSize(groupId);\n }\n\n const topLevelGroupIds = new Set<string>();\n for (const groupId of allGroupIds) {\n const node = nodeById.get(groupId);\n if (!node?.parentId || !allGroupIds.has(node.parentId)) {\n topLevelGroupIds.add(groupId);\n }\n }\n\n const outerG = new dagre.graphlib.Graph();\n outerG.setDefaultEdgeLabel(() => ({}));\n outerG.setGraph({ rankdir, nodesep, ranksep, edgesep });\n\n for (const groupId of topLevelGroupIds) {\n const size = groupSizes.get(groupId)!;\n outerG.setNode(groupId, { width: size.width, height: size.height });\n }\n\n for (const node of nodes) {\n if (allGroupIds.has(node.id) || childNodeIds.has(node.id)) continue;\n const s = nodeSize(node.type);\n outerG.setNode(node.id, { width: s.w, height: s.h });\n }\n\n const outerEdgeSet = new Set<string>();\n for (const edge of edges) {\n const srcIsChild = childNodeIds.has(edge.source);\n const tgtIsChild = childNodeIds.has(edge.target);\n const srcIsGroup = allGroupIds.has(edge.source);\n const tgtIsGroup = allGroupIds.has(edge.target);\n\n if (srcIsChild && tgtIsChild) continue;\n if (srcIsGroup || tgtIsGroup) continue;\n\n let src = edge.source;\n let tgt = edge.target;\n\n if (srcIsChild) {\n let parent = nodeById.get(edge.source)?.parentId;\n while (parent && !topLevelGroupIds.has(parent)) {\n parent = nodeById.get(parent)?.parentId;\n }\n if (parent) src = parent;\n }\n if (tgtIsChild) {\n let parent = nodeById.get(edge.target)?.parentId;\n while (parent && !topLevelGroupIds.has(parent)) {\n parent = nodeById.get(parent)?.parentId;\n }\n if (parent) tgt = parent;\n }\n\n const key = `${src}->${tgt}`;\n if (!outerEdgeSet.has(key)) {\n outerEdgeSet.add(key);\n outerG.setEdge(src, tgt);\n }\n }\n\n dagre.layout(outerG);\n\n const outerPositions = new Map<\n string,\n { x: number; y: number; width: number; height: number }\n >();\n outerG.nodes().forEach((id: string) => {\n const pos = outerG.node(id);\n if (pos) {\n outerPositions.set(id, {\n x: pos.x,\n y: pos.y,\n width: pos.width,\n height: pos.height,\n });\n }\n });\n\n const layoutNodes: Node[] = [];\n\n function emitGroup(groupId: string, parentGroupId?: string) {\n const node = nodeById.get(groupId);\n if (!node) return;\n\n const layout = groupInternalLayouts.get(groupId);\n if (!layout) return;\n\n const base = {\n name: node.label,\n version: (node.metadata.version as string) || \"\",\n summary: (node.metadata.summary as string) || \"\",\n };\n\n if (parentGroupId) {\n const parentLayout = groupInternalLayouts.get(parentGroupId);\n const childPos = parentLayout?.childPositions.get(groupId);\n if (!childPos) return;\n\n layoutNodes.push({\n id: groupId,\n type: \"group\",\n position: { x: childPos.x, y: childPos.y },\n parentId: parentGroupId,\n extent: \"parent\",\n data: { mode: \"full\", domain: base },\n style: {\n width: layout.width,\n height: layout.height,\n background: \"transparent\",\n border: \"none\",\n padding: 0,\n },\n });\n } else {\n const outerPos = outerPositions.get(groupId);\n if (!outerPos) return;\n\n // Use internal layout dimensions for centering (dagre may report different width/height)\n layoutNodes.push({\n id: groupId,\n type: \"group\",\n position: {\n x: outerPos.x - layout.width / 2,\n y: outerPos.y - layout.height / 2,\n },\n data: { mode: \"full\", domain: base },\n style: {\n width: layout.width,\n height: layout.height,\n background: \"transparent\",\n border: \"none\",\n padding: 0,\n },\n });\n }\n\n const children = groupChildren.get(groupId) || [];\n for (const child of children) {\n if (allGroupIds.has(child.id)) {\n emitGroup(child.id, groupId);\n }\n }\n for (const child of children) {\n if (allGroupIds.has(child.id)) continue;\n const childPos = layout.childPositions.get(child.id);\n if (!childPos) continue;\n\n layoutNodes.push({\n id: child.id,\n type: child.type,\n position: { x: childPos.x, y: childPos.y },\n parentId: groupId,\n extent: \"parent\",\n data: buildNodeData(child, style),\n });\n }\n }\n\n for (const groupId of topLevelGroupIds) {\n emitGroup(groupId);\n }\n\n for (const node of nodes) {\n if (allGroupIds.has(node.id) || childNodeIds.has(node.id)) continue;\n const pos = outerPositions.get(node.id);\n if (!pos) continue;\n\n layoutNodes.push({\n id: node.id,\n type: node.type,\n position: { x: pos.x - pos.width / 2, y: pos.y - pos.height / 2 },\n data: buildNodeData(node, style),\n });\n }\n\n const layoutEdges: Edge[] = edges\n .filter(\n (edge) => !allGroupIds.has(edge.source) && !allGroupIds.has(edge.target),\n )\n .map((edge) => {\n const collection = getMessageCollection(edge, nodeById);\n const isFlowStep = edge.type === \"flow-step\";\n return {\n id: edge.id,\n source: edge.source,\n target: edge.target,\n label: isFlowStep ? edge.label || undefined : edge.label || edge.type,\n type: isFlowStep ? \"flow-edge\" : \"animated\",\n markerEnd: {\n type: MarkerType.ArrowClosed,\n width: 20,\n height: 20,\n color: \"rgb(var(--ec-page-text-muted))\",\n },\n data: { edgeType: edge.type, message: { collection } },\n };\n });\n\n return { nodes: layoutNodes, edges: layoutEdges };\n}\n\nconst MESSAGE_TYPES = new Set([\"event\", \"command\", \"query\"]);\n\nfunction getMessageCollection(\n edge: GraphEdge,\n nodeById: Map<string, GraphNode>,\n): string | undefined {\n const targetNode = nodeById.get(edge.target);\n if (targetNode && MESSAGE_TYPES.has(targetNode.type)) {\n return `${targetNode.type}s`;\n }\n const sourceNode = nodeById.get(edge.source);\n if (sourceNode && MESSAGE_TYPES.has(sourceNode.type)) {\n return `${sourceNode.type}s`;\n }\n return targetNode ? `${targetNode.type}s` : undefined;\n}\n\nfunction flatLayout(\n nodes: GraphNode[],\n edges: GraphEdge[],\n graphOpts: {\n rankdir: string;\n nodesep: number;\n ranksep: number;\n edgesep: number;\n },\n nodeSize: (type: string) => { w: number; h: number },\n style?: string,\n): { nodes: Node[]; edges: Edge[] } {\n const g = new dagre.graphlib.Graph();\n g.setDefaultEdgeLabel(() => ({}));\n g.setGraph(graphOpts);\n\n nodes.forEach((node) => {\n const s = nodeSize(node.type);\n g.setNode(node.id, { width: s.w, height: s.h });\n });\n\n edges.forEach((edge) => {\n g.setEdge(edge.source, edge.target);\n });\n\n dagre.layout(g);\n\n const layoutNodes: Node[] = nodes.map((node) => {\n const pos = g.node(node.id);\n return {\n id: node.id,\n type: node.type,\n position: { x: pos.x - pos.width / 2, y: pos.y - pos.height / 2 },\n data: buildNodeData(node, style),\n };\n });\n\n const nodeById = new Map(nodes.map((n) => [n.id, n]));\n const layoutEdges: Edge[] = edges.map((edge) => {\n const collection = getMessageCollection(edge, nodeById);\n const isFlowStep = edge.type === \"flow-step\";\n return {\n id: edge.id,\n source: edge.source,\n target: edge.target,\n label: isFlowStep ? edge.label || undefined : edge.label || edge.type,\n type: isFlowStep ? \"flow-edge\" : \"animated\",\n markerEnd: {\n type: MarkerType.ArrowClosed,\n width: 20,\n height: 20,\n color: \"rgb(var(--ec-page-text-muted))\",\n },\n data: { edgeType: edge.type, message: { collection } },\n };\n });\n\n return { nodes: layoutNodes, edges: layoutEdges };\n}\n","import { useState, useCallback } from \"react\";\nimport {\n MessageCircle,\n AlertTriangle,\n X,\n Locate,\n ChevronRight,\n ServerIcon,\n Zap,\n MessageSquare,\n Search,\n ArrowRightLeft,\n Database,\n Package,\n Globe,\n User,\n MonitorIcon,\n BoxesIcon,\n type LucideIcon,\n} from \"lucide-react\";\nimport { useReactFlow, type Node } from \"@xyflow/react\";\nimport * as Dialog from \"@radix-ui/react-dialog\";\nimport type { Note } from \"../types\";\n\n/* ------------------------------------------------------------------ */\n/* Node type → icon + color mapping */\n/* ------------------------------------------------------------------ */\n\nconst NODE_TYPE_META: Record<\n string,\n { icon: LucideIcon; color: string; label: string }\n> = {\n service: { icon: ServerIcon, color: \"#ec4899\", label: \"Service\" },\n services: { icon: ServerIcon, color: \"#ec4899\", label: \"Service\" },\n event: { icon: Zap, color: \"#f97316\", label: \"Event\" },\n events: { icon: Zap, color: \"#f97316\", label: \"Event\" },\n command: { icon: MessageSquare, color: \"#3b82f6\", label: \"Command\" },\n commands: { icon: MessageSquare, color: \"#3b82f6\", label: \"Command\" },\n query: { icon: Search, color: \"#22c55e\", label: \"Query\" },\n queries: { icon: Search, color: \"#22c55e\", label: \"Query\" },\n channel: { icon: ArrowRightLeft, color: \"#6b7280\", label: \"Channel\" },\n channels: { icon: ArrowRightLeft, color: \"#6b7280\", label: \"Channel\" },\n data: { icon: Database, color: \"#3b82f6\", label: \"Data\" },\n \"data-products\": { icon: Package, color: \"#6366f1\", label: \"Data Product\" },\n externalSystem: { icon: Globe, color: \"#ec4899\", label: \"External System\" },\n actor: { icon: User, color: \"#eab308\", label: \"Actor\" },\n view: { icon: MonitorIcon, color: \"#8b5cf6\", label: \"View\" },\n domain: { icon: BoxesIcon, color: \"#14b8a6\", label: \"Domain\" },\n domains: { icon: BoxesIcon, color: \"#14b8a6\", label: \"Domain\" },\n};\n\nfunction getNodeMeta(nodeType?: string) {\n if (!nodeType) return null;\n return NODE_TYPE_META[nodeType] || null;\n}\n\n/* ------------------------------------------------------------------ */\n/* Extract notes from any node type */\n/* ------------------------------------------------------------------ */\n\nexport function getNotesFromNode(\n node: Node<any>,\n): { name: string; notes: Note[]; nodeType: string } | null {\n const d = node.data;\n const containers = [\n d?.service,\n d?.message,\n d?.channel,\n d?.data,\n d?.dataProduct,\n d?.externalSystem,\n d?.actor,\n ];\n for (const container of containers) {\n if (container?.notes && container.notes.length > 0) {\n return {\n name: container.name || node.id,\n notes: container.notes,\n nodeType: node.type || \"unknown\",\n };\n }\n }\n if (d?.notes && d.notes.length > 0) {\n return {\n name: d.name || node.id,\n notes: d.notes,\n nodeType: node.type || \"unknown\",\n };\n }\n return null;\n}\n\n/* ------------------------------------------------------------------ */\n/* Constants */\n/* ------------------------------------------------------------------ */\n\nconst AMBER = {\n 50: \"#fffbeb\",\n 100: \"#fef3c7\",\n 200: \"#fde68a\",\n 400: \"#fbbf24\",\n 500: \"#f59e0b\",\n 600: \"#d97706\",\n 700: \"#b45309\",\n 800: \"#92400e\",\n} as const;\n\nconst PRIORITY: Record<\n string,\n { bg: string; fg: string; border: string; label: string; accent: string }\n> = {\n high: {\n bg: \"#fef2f2\",\n fg: \"#b91c1c\",\n border: \"#fecaca\",\n label: \"High\",\n accent: \"#ef4444\",\n },\n critical: {\n bg: \"#fef2f2\",\n fg: \"#991b1b\",\n border: \"#fecaca\",\n label: \"Critical\",\n accent: \"#dc2626\",\n },\n low: {\n bg: \"#f0fdf4\",\n fg: \"#15803d\",\n border: \"#bbf7d0\",\n label: \"Low\",\n accent: \"#22c55e\",\n },\n};\n\nconst AVATAR_PALETTES = [\n [\"#7c3aed\", \"#a78bfa\"],\n [\"#2563eb\", \"#60a5fa\"],\n [\"#0891b2\", \"#22d3ee\"],\n [\"#059669\", \"#34d399\"],\n [\"#d97706\", \"#fbbf24\"],\n [\"#dc2626\", \"#f87171\"],\n [\"#db2777\", \"#f472b6\"],\n [\"#4f46e5\", \"#818cf8\"],\n];\n\nfunction hashStr(s: string): number {\n let h = 0;\n for (let i = 0; i < s.length; i++) {\n h = (h * 31 + s.charCodeAt(i)) | 0;\n }\n return Math.abs(h);\n}\n\nfunction Avatar({ name, size = 28 }: { name: string; size?: number }) {\n const initials = name\n .split(/\\s+/)\n .map((w) => w[0])\n .join(\"\")\n .toUpperCase()\n .slice(0, 2);\n const [c1, c2] = AVATAR_PALETTES[hashStr(name) % AVATAR_PALETTES.length];\n return (\n <div\n style={{\n width: size,\n height: size,\n borderRadius: \"50%\",\n background: `linear-gradient(135deg, ${c1}, ${c2})`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n <span\n style={{\n fontSize: Math.round(size * 0.42),\n fontWeight: 700,\n color: \"white\",\n lineHeight: 1,\n }}\n >\n {initials}\n </span>\n </div>\n );\n}\n\nfunction PriorityBadge({ priority }: { priority: string }) {\n const p = PRIORITY[priority.toLowerCase()];\n if (!p) return null;\n const isUrgent = priority === \"high\" || priority === \"critical\";\n return (\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 3,\n fontSize: 10,\n fontWeight: 600,\n color: p.fg,\n background: p.bg,\n border: `1px solid ${p.border}`,\n borderRadius: 99,\n padding: \"2px 7px\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.03em\",\n lineHeight: 1.4,\n }}\n >\n {isUrgent && (\n <AlertTriangle style={{ width: 9, height: 9 }} strokeWidth={2.5} />\n )}\n {p.label}\n </span>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Note card for the right panel */\n/* ------------------------------------------------------------------ */\n\nfunction NoteCard({ note, index }: { note: Note; index: number }) {\n const prioStyle = note.priority\n ? PRIORITY[note.priority.toLowerCase()]\n : null;\n\n return (\n <div\n style={{\n background: \"white\",\n border: \"1px solid #e2e8f0\",\n borderRadius: 10,\n padding: \"14px 16px\",\n position: \"relative\",\n boxShadow: \"0 1px 3px rgba(0,0,0,0.04)\",\n }}\n >\n {/* Priority accent stripe */}\n {prioStyle && (\n <div\n style={{\n position: \"absolute\",\n left: 0,\n top: 10,\n bottom: 10,\n width: 3,\n borderRadius: \"0 2px 2px 0\",\n background: prioStyle.accent,\n }}\n />\n )}\n\n {/* Header: author + priority */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n marginBottom: 8,\n }}\n >\n {note.author ? (\n <Avatar name={note.author} size={24} />\n ) : (\n <div\n style={{\n width: 24,\n height: 24,\n borderRadius: \"50%\",\n background: \"#f1f5f9\",\n border: `2px solid ${AMBER[200]}`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n <span style={{ fontSize: 10, fontWeight: 700, color: AMBER[700] }}>\n {index + 1}\n </span>\n </div>\n )}\n <div style={{ flex: 1, minWidth: 0 }}>\n {note.author && (\n <span\n style={{\n fontSize: 13,\n fontWeight: 600,\n color: \"#0f172a\",\n lineHeight: 1,\n }}\n >\n {note.author}\n </span>\n )}\n </div>\n {note.priority && <PriorityBadge priority={note.priority} />}\n </div>\n\n {/* Content */}\n <p\n style={{\n fontSize: 13,\n lineHeight: 1.6,\n color: \"#334155\",\n margin: 0,\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-word\",\n paddingLeft: prioStyle ? 6 : 0,\n }}\n >\n {note.content}\n </p>\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* All Notes Modal — split layout */\n/* ------------------------------------------------------------------ */\n\ninterface NoteGroup {\n nodeId: string;\n name: string;\n notes: Note[];\n nodeType: string;\n}\n\nexport function AllNotesModal({\n noteGroups,\n isOpen,\n onClose,\n nodes,\n}: {\n noteGroups: NoteGroup[];\n isOpen: boolean;\n onClose: () => void;\n nodes: Node<any>[];\n}) {\n const { setCenter, getZoom } = useReactFlow();\n const [selectedIdx, setSelectedIdx] = useState(0);\n\n const totalNotes = noteGroups.reduce((sum, g) => sum + g.notes.length, 0);\n const selected = noteGroups[selectedIdx] || noteGroups[0];\n\n const handleNavigate = useCallback(\n (nodeId: string) => {\n const node = nodes.find((n) => n.id === nodeId);\n if (!node) return;\n const zoom = Math.max(getZoom(), 1);\n setCenter(node.position.x + 100, node.position.y + 50, {\n zoom,\n duration: 600,\n });\n onClose();\n },\n [nodes, setCenter, getZoom, onClose],\n );\n\n if (totalNotes === 0) return null;\n\n return (\n <Dialog.Root\n open={isOpen}\n onOpenChange={(open) => {\n if (!open) {\n onClose();\n setSelectedIdx(0);\n }\n }}\n >\n <Dialog.Portal\n container={typeof document !== \"undefined\" ? document.body : undefined}\n >\n <div\n className=\"fixed inset-0 z-[99999]\"\n style={{ isolation: \"isolate\" }}\n >\n <Dialog.Overlay\n style={{\n position: \"fixed\",\n inset: 0,\n background: \"rgba(15, 23, 42, 0.55)\",\n backdropFilter: \"blur(6px)\",\n }}\n />\n\n <Dialog.Content\n style={{\n position: \"fixed\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n width: \"94vw\",\n maxWidth: 720,\n height: \"78vh\",\n maxHeight: 560,\n background: \"white\",\n borderRadius: 14,\n boxShadow:\n \"0 0 0 1px rgba(0,0,0,0.06), 0 20px 50px rgba(0,0,0,0.2)\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n outline: \"none\",\n }}\n >\n {/* Header */}\n <div\n style={{\n padding: \"14px 20px\",\n borderBottom: \"1px solid #e2e8f0\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n flexShrink: 0,\n }}\n >\n <div\n style={{\n width: 32,\n height: 32,\n borderRadius: 8,\n background: \"#f1f5f9\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n <MessageCircle\n style={{ width: 16, height: 16, color: \"#64748b\" }}\n strokeWidth={2.5}\n />\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <Dialog.Title\n style={{\n fontSize: 15,\n fontWeight: 700,\n color: \"#0f172a\",\n margin: 0,\n lineHeight: 1.25,\n }}\n >\n Notes\n </Dialog.Title>\n <Dialog.Description\n style={{\n fontSize: 12,\n color: \"#64748b\",\n margin: 0,\n marginTop: 1,\n }}\n >\n {totalNotes} note{totalNotes !== 1 ? \"s\" : \"\"} across{\" \"}\n {noteGroups.length} resource\n {noteGroups.length !== 1 ? \"s\" : \"\"}\n </Dialog.Description>\n </div>\n <Dialog.Close asChild>\n <button\n style={{\n width: 30,\n height: 30,\n borderRadius: 8,\n border: \"none\",\n background: \"rgba(0,0,0,0.04)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n color: \"#94a3b8\",\n flexShrink: 0,\n }}\n aria-label=\"Close\"\n >\n <X style={{ width: 15, height: 15 }} />\n </button>\n </Dialog.Close>\n </div>\n\n {/* Split body */}\n <div style={{ display: \"flex\", flex: 1, overflow: \"hidden\" }}>\n {/* Left: resource list */}\n <div\n style={{\n width: 240,\n flexShrink: 0,\n borderRight: \"1px solid #e2e8f0\",\n overflowY: \"auto\",\n background: \"#f8fafc\",\n }}\n >\n {noteGroups.map((group, i) => {\n const isActive = i === selectedIdx;\n const meta = getNodeMeta(group.nodeType);\n const IconComp = meta?.icon || MessageCircle;\n const iconColor = meta?.color || \"#64748b\";\n\n return (\n <button\n key={group.nodeId}\n onClick={() => setSelectedIdx(i)}\n style={{\n width: \"100%\",\n padding: \"12px 16px\",\n background: isActive ? \"white\" : \"transparent\",\n border: \"none\",\n borderBottom: \"1px solid #f1f5f9\",\n borderRight: isActive\n ? `2px solid ${iconColor}`\n : \"2px solid transparent\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n textAlign: \"left\",\n transition: \"background 0.1s\",\n }}\n >\n {/* Resource type icon */}\n <div\n style={{\n width: 28,\n height: 28,\n borderRadius: 7,\n background: isActive ? iconColor : `${iconColor}14`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n transition: \"background 0.15s\",\n }}\n >\n <IconComp\n style={{\n width: 14,\n height: 14,\n color: isActive ? \"white\" : iconColor,\n transition: \"color 0.15s\",\n }}\n strokeWidth={2}\n />\n </div>\n\n <div style={{ flex: 1, minWidth: 0 }}>\n <div\n style={{\n fontSize: 12,\n fontWeight: isActive ? 600 : 500,\n color: isActive ? \"#0f172a\" : \"#475569\",\n lineHeight: 1.3,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {group.name}\n </div>\n <div\n style={{\n fontSize: 10,\n color: \"#94a3b8\",\n lineHeight: 1.3,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n marginTop: 2,\n }}\n >\n {meta?.label || group.nodeType} ·{\" \"}\n {group.notes.length} note\n {group.notes.length !== 1 ? \"s\" : \"\"}\n </div>\n </div>\n\n <ChevronRight\n style={{\n width: 14,\n height: 14,\n color: isActive ? iconColor : \"#cbd5e1\",\n flexShrink: 0,\n }}\n strokeWidth={2}\n />\n </button>\n );\n })}\n </div>\n\n {/* Right: notes for selected resource */}\n <div\n style={{\n flex: 1,\n overflowY: \"auto\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n {selected && (\n <>\n {/* Selected resource header */}\n <div\n style={{\n padding: \"14px 20px\",\n borderBottom: \"1px solid #f1f5f9\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n flexShrink: 0,\n background: \"#fafbfc\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n }}\n >\n {(() => {\n const meta = getNodeMeta(selected.nodeType);\n const Icon = meta?.icon || MessageCircle;\n const color = meta?.color || \"#64748b\";\n return (\n <div\n style={{\n width: 30,\n height: 30,\n borderRadius: 8,\n background: `${color}14`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n <Icon\n style={{\n width: 15,\n height: 15,\n color,\n }}\n strokeWidth={2}\n />\n </div>\n );\n })()}\n <div>\n <div\n style={{\n fontSize: 14,\n fontWeight: 600,\n color: \"#0f172a\",\n lineHeight: 1.3,\n }}\n >\n {selected.name}\n </div>\n <div\n style={{\n fontSize: 11,\n color: \"#94a3b8\",\n marginTop: 2,\n }}\n >\n {getNodeMeta(selected.nodeType)?.label ||\n selected.nodeType}{\" \"}\n · {selected.notes.length} note\n {selected.notes.length !== 1 ? \"s\" : \"\"}\n </div>\n </div>\n </div>\n <button\n onClick={() => handleNavigate(selected.nodeId)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 5,\n padding: \"5px 10px\",\n borderRadius: 6,\n border: \"1px solid #e2e8f0\",\n background: \"white\",\n cursor: \"pointer\",\n fontSize: 11,\n fontWeight: 500,\n color: \"#475569\",\n transition: \"all 0.12s\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.borderColor = AMBER[400];\n e.currentTarget.style.color = AMBER[700];\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.borderColor = \"#e2e8f0\";\n e.currentTarget.style.color = \"#475569\";\n }}\n >\n <Locate style={{ width: 12, height: 12 }} />\n Find on canvas\n </button>\n </div>\n\n {/* Notes list */}\n <div\n style={{\n flex: 1,\n overflowY: \"auto\",\n padding: \"16px 20px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 10,\n }}\n >\n {selected.notes.map((note, i) => (\n <NoteCard key={i} note={note} index={i} />\n ))}\n </div>\n </>\n )}\n </div>\n </div>\n </Dialog.Content>\n </div>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n","/**\n * Node components for EventCatalog Visualizer\n */\n\n// Studio-2 nodes (organized in directories) - import for nodeComponents\nimport { Event, eventConfig } from \"./event\";\nimport { Command } from \"./command\";\nimport { Query } from \"./query\";\nimport { Service } from \"./service\";\nimport { Channel } from \"./channel\";\nimport { Note } from \"./note\";\nimport { Data, dataNodeConfig } from \"./data\";\nimport { View } from \"./view\";\nimport { Actor, actorConfig } from \"./actor\";\nimport { ExternalSystem, externalSystemConfig } from \"./external-system\";\n\n// Re-export studio-2 nodes\nexport { Event, eventConfig };\nexport type { EventNode } from \"./event\";\n\nexport { Command };\nexport type { CommandNode } from \"./command\";\n\nexport { Query };\nexport type { QueryNode } from \"./query\";\n\nexport { Service };\nexport type { ServiceNode } from \"./service\";\n\nexport { Channel };\nexport type { ChannelNode } from \"./channel\";\n\nexport { Note };\nexport type { NoteNode } from \"./note\";\n\nexport { Data, dataNodeConfig };\nexport type { DataNode } from \"./data\";\n\nexport { View };\nexport type { ViewNode } from \"./view\";\n\nexport { Actor, actorConfig };\nexport type { ActorNode } from \"./actor\";\n\nexport { ExternalSystem, externalSystemConfig };\nexport type { ExternalSystemNode } from \"./external-system\";\n\n// Shared components\nexport { NotesIndicator } from \"./NotesIndicator\";\nexport { OwnerIndicator, normalizeOwners } from \"./OwnerIndicator\";\n\n// Core nodes (single files) - import then re-export for nodeComponents\nimport CustomNode from \"./Custom\";\nimport DomainNode from \"./Domain\";\nimport EntityNode from \"./Entity\";\nimport FlowNode from \"./Flow\";\nimport GroupNode from \"./GroupNode\";\nimport StepNode from \"./Step\";\nimport UserNode from \"./User\";\nimport DataProductNode from \"./DataProduct\";\nimport ExternalSystem2Node from \"./ExternalSystem2\";\n\nexport {\n CustomNode,\n DomainNode,\n EntityNode,\n FlowNode,\n GroupNode,\n StepNode,\n UserNode,\n DataProductNode,\n ExternalSystem2Node,\n};\n\n// Node type constants\nexport {\n SERVICE,\n EVENT,\n QUERY,\n COMMAND,\n CHANNEL,\n ACTOR,\n MESSAGE,\n DATA,\n VIEW,\n} from \"./node-types\";\n\n// Re-export for convenience (studio-2 nodes only)\nexport const nodeComponents = {\n event: Event,\n command: Command,\n query: Query,\n service: Service,\n channel: Channel,\n note: Note,\n externalSystem: ExternalSystem,\n data: Data,\n view: View,\n actor: Actor,\n // Core nodes are available via individual imports\n custom: CustomNode,\n domain: DomainNode,\n entity: EntityNode,\n flow: FlowNode,\n group: GroupNode,\n step: StepNode,\n user: UserNode,\n dataProduct: DataProductNode,\n externalSystem2: ExternalSystem2Node,\n};\n\nexport const nodeConfigs = {\n event: eventConfig,\n data: dataNodeConfig,\n actor: actorConfig,\n externalSystem: externalSystemConfig,\n};\n","/**\n * Edge components for EventCatalog Visualizer\n */\n\n// Import for edgeTypes object\nimport AnimatedMessageEdge from \"./AnimatedMessageEdge\";\nimport FlowEdge from \"./FlowEdge\";\nimport MultilineEdgeLabel from \"./MultilineEdgeLabel\";\n\n// Re-export\nexport { AnimatedMessageEdge, FlowEdge, MultilineEdgeLabel };\n\n// Re-export for convenience\nexport const edgeTypes = {\n animated: AnimatedMessageEdge,\n \"flow-edge\": FlowEdge,\n multiline: MultilineEdgeLabel,\n};\n","// Can't use the CollectionEntry type from astro:content because a client component is using this util\n\nimport { MarkerType, Position, type Edge, type Node } from \"@xyflow/react\";\nimport dagre from \"dagre\";\n// import { getItemsFromCollectionByIdAndSemverOrLatest } from \"@utils/collections/util\"; // Not used in visualizer\ninterface BaseCollectionData {\n id: string;\n version: string;\n}\n\ninterface CollectionItem {\n collection: string;\n data: BaseCollectionData;\n}\n\ninterface MessageCollectionItem extends CollectionItem {\n collection: \"commands\" | \"events\" | \"queries\";\n}\n\nexport const generateIdForNode = (node: CollectionItem) => {\n return `${node.data.id}-${node.data.version}`;\n};\nexport const generateIdForNodes = (nodes: any) => {\n return nodes\n .map((node: any) => `${node.data.id}-${node.data.version}`)\n .join(\"-\");\n};\nexport const generatedIdForEdge = (\n source: CollectionItem,\n target: CollectionItem,\n) => {\n return `${source.data.id}-${source.data.version}-${target.data.id}-${target.data.version}`;\n};\n\nexport const getColorFromString = (id: string) => {\n // Takes the given id (string) and returns a custom hex color based on the id\n // Create a hash from the string\n let hash = 0;\n for (let i = 0; i < id.length; i++) {\n hash = id.charCodeAt(i) + ((hash << 5) - hash);\n }\n\n // Convert the hash into a hex color\n let color = \"#\";\n for (let i = 0; i < 3; i++) {\n const value = (hash >> (i * 8)) & 0xff;\n color += value.toString(16).padStart(2, \"0\");\n }\n\n return color;\n};\n\nexport const getEdgeLabelForServiceAsTarget = (data: MessageCollectionItem) => {\n const type = data.collection;\n switch (type) {\n case \"commands\":\n return \"invokes\";\n case \"events\":\n return \"publishes \\nevent\";\n case \"queries\":\n return \"requests\";\n default:\n return \"sends to\";\n }\n};\nexport const getEdgeLabelForMessageAsSource = (\n data: MessageCollectionItem,\n throughChannel = false,\n) => {\n const type = data.collection;\n switch (type) {\n case \"commands\":\n return \"accepts\";\n case \"events\":\n return throughChannel ? \"subscribed to\" : \"subscribed by\";\n case \"queries\":\n return \"accepts\";\n default:\n return \"sends to\";\n }\n};\n\nexport const calculatedNodes = (flow: dagre.graphlib.Graph, nodes: Node[]) => {\n return nodes.map((node: any) => {\n const { x, y } = flow.node(node.id);\n return { ...node, position: { x, y } };\n });\n};\n\n// Creates a new dagre graph\nexport const createDagreGraph = ({\n ranksep = 180,\n nodesep = 50,\n ...rest\n}: any) => {\n const graph = new dagre.graphlib.Graph({ compound: true });\n graph.setGraph({ rankdir: \"LR\", ranksep, nodesep, ...rest });\n graph.setDefaultEdgeLabel(() => ({}));\n return graph;\n};\n\nexport const createEdge = (edgeOptions: Edge): Edge => {\n return {\n label: \"subscribed by\",\n animated: false,\n // markerStart: {\n // type: MarkerType.Arrow,\n // width: 40,\n // height: 40,\n // },\n markerEnd: {\n type: MarkerType.ArrowClosed,\n width: 40,\n height: 40,\n color: \"rgb(var(--ec-page-text-muted))\",\n },\n style: {\n strokeWidth: 1.5,\n stroke: \"rgb(var(--ec-page-text-muted))\",\n strokeDasharray: \"5 5\",\n },\n ...edgeOptions,\n };\n};\n\nexport const createNode = (values: Node): Node => {\n return {\n sourcePosition: Position.Right,\n targetPosition: Position.Left,\n ...values,\n };\n};\n\ntype DagreGraph = any;\n\nexport const getNodesAndEdgesFromDagre = ({\n nodes,\n edges,\n defaultFlow,\n}: {\n nodes: Node[];\n edges: Edge[];\n defaultFlow?: DagreGraph;\n}) => {\n const flow = defaultFlow || createDagreGraph({ ranksep: 300, nodesep: 50 });\n\n nodes.forEach((node: any) => {\n flow.setNode(node.id, { width: 150, height: 100 });\n });\n\n edges.forEach((edge: any) => {\n flow.setEdge(edge.source, edge.target);\n });\n\n // Render the diagram in memory getting hte X and Y\n dagre.layout(flow);\n\n return {\n nodes: calculatedNodes(flow, nodes),\n edges,\n };\n};\n"],"mappings":"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","names":["useEffect","useMemo","useState","useCallback","useRef","memo","ReactFlow","Background","Controls","ReactFlowProvider","useNodesState","useEdgesState","useReactFlow","ExternalLink","CheckIcon","ClipboardIcon","DropdownMenu","memo","OwnerIndicator","memo","jsx","jsxs","memo","NotesIndicator","jsx","jsxs","memo","MiniEnvelope","ServiceMessageFlow","GlowHandle","memo","useMemo","useState","useCallback","Handle","Position","useHandleConnections","jsx","jsxs","GlowHandle","memo","classNames","useState","useCallback","Handle","Position","useMemo","useHandleConnections","Zap","Zap","memo","useMemo","Handle","Position","useHandleConnections","jsx","jsxs","GlowHandle","memo","classNames","Handle","Position","useMemo","useHandleConnections","memo","useMemo","Handle","Position","useHandleConnections","jsx","jsxs","GlowHandle","memo","classNames","Handle","Position","useMemo","useHandleConnections","Handle","Position","useHandleConnections","jsx","jsxs","memo","useMemo","jsx","jsxs","GlowHandle","classNames","Handle","Position","useHandleConnections","memo","useMemo","Handle","Position","useHandleConnections","jsx","jsxs","GlowHandle","classNames","Handle","Position","useMemo","useHandleConnections","memo","MarkerType","Database","config_default","Database","MarkerType","memo","Handle","Position","jsx","jsxs","classNames","memo","Handle","Position","memo","Handle","Position","useHandleConnections","jsx","jsxs","GlowHandle","classNames","Handle","Position","useHandleConnections","memo","MarkerType","User","config_default","User","MarkerType","memo","Globe","Handle","Position","useHandleConnections","jsx","jsxs","GlowHandle","classNames","Handle","Position","Globe","useHandleConnections","memo","MarkerType","Globe","config_default","Globe","MarkerType","Handle","Position","memo","useState","useCallback","jsx","jsxs","classNames","memo","useState","useCallback","Handle","Position","memo","useMemo","Handle","jsx","jsxs","classNames","memo","useMemo","Handle","Handle","Position","ContextMenu","memo","useState","useMemo","Fragment","jsx","jsxs","classNames","memo","useMemo","useState","Handle","Position","memo","UserIcon","Handle","jsx","jsxs","classNames","memo","UserIcon","Handle","memo","Handle","Position","jsx","jsxs","classNames","memo","Handle","Position","Handle","Position","ContextMenu","memo","useState","useCallback","useMemo","jsx","jsxs","memo","useState","useMemo","ServerIcon","useCallback","Handle","Position","memo","jsx","jsxs","Handle","memo","useMemo","ContextMenu","jsx","jsxs","classNames","memo","UserNode","useMemo","Handle","memo","Handle","Position","jsx","jsxs","memo","Handle","Position","memo","Handle","Position","useHandleConnections","jsx","jsxs","GlowHandle","classNames","Handle","Position","useHandleConnections","memo","memo","useMemo","Fragment","jsx","jsxs","memo","useMemo","memo","useMemo","getSmoothStepPath","Fragment","jsx","jsxs","TSPAN_NORMAL_STYLE","TSPAN_ITALIC_STYLE","memo","useMemo","BaseEdge","getSmoothStepPath","Fragment","jsx","jsxs","messageColor","memo","getSmoothStepPath","useMemo","BaseEdge","useState","useCallback","useRef","useEffect","memo","jsx","jsxs","useState","useEffect","useCallback","useMemo","useRef","memo","Fragment","jsx","jsxs","title","description","useState","useCallback","Dialog","useReactFlow","Fragment","jsx","jsxs","useState","useReactFlow","useCallback","useState","useCallback","useEffect","Dialog","XIcon","useMemo","useCallback","useEffect","useState","useRef","useReactFlow","Position","ArrowRightLeft","jsx","jsxs","Position","ArrowRightLeft","Handle","Position","jsx","jsxs","jsx","jsxs","edgeTypes","useReactFlow","useState","useRef","useEffect","useCallback","useMemo","jsx","jsxs","edgeTypes","useState","useEffect","useCallback","XIcon","useState","useEffect","useRef","useCallback","CheckIcon","ClipboardIcon","jsx","jsxs","useState","useRef","useEffect","useCallback","CheckIcon","ClipboardIcon","useState","memo","Search","Map","Zap","MessageCircle","Fragment","jsx","jsxs","memo","ContextMenu","Fragment","jsx","jsxs","MarkerType","useState","useCallback","MessageCircle","AlertTriangle","ServerIcon","Zap","MessageSquare","Search","ArrowRightLeft","Database","Package","Globe","User","MonitorIcon","BoxesIcon","useReactFlow","Dialog","Fragment","jsx","jsxs","AMBER","PRIORITY","AVATAR_PALETTES","hashStr","Avatar","NoteCard","Fragment","jsx","jsxs","memo","LegendPanel","useMemo","edgeTypes","useNodesState","useEdgesState","useReactFlow","useEffect","useState","useRef","useCallback","nodes","ReactFlow","Background","Controls","ExternalLink","CheckIcon","ClipboardIcon","ReactFlowProvider","config_default","MarkerType","Position","dagre"]}
|