{"version":3,"file":"lit-flow.cjs","sources":["../../src/core/flow-instance.ts","../../src/core/store.ts","../../src/utils/geometry.ts","../../src/components/flow-canvas.ts","../../src/components/node-resizer.ts","../../src/components/flow-node.ts","../../src/components/flow-edge.ts","../../src/components/flow-background.ts","../../src/components/flow-minimap.ts","../../src/components/flow-controls.ts","../../src/components/ui/erd-table-node.ts","../../src/components/shapes/shapes/basic-shapes.ts","../../src/components/shapes/shapes/geometric-shapes.ts","../../src/components/shapes/shapes/symbolic-shapes.ts","../../src/components/shapes/shape-registry.ts","../../src/components/shapes/shape-node.ts","../../src/components/ui/base-node.ts","../../src/mixins/node-mixin.ts"],"sourcesContent":["/**\r\n * FlowInstance - Core wrapper around @xyflow/system\r\n * This class provides the main API for interacting with the flow\r\n */\r\n\r\nimport { XYPanZoom } from '@xyflow/system';\r\nimport type { PanOnScrollMode, Transform } from '@xyflow/system';\r\nimport type { Node, Edge, FlowOptions, FlowState, InternalNode, Viewport } from './types';\r\nimport type { PanZoomUpdateOptions } from '@xyflow/system';\r\n\r\nexport class FlowInstance {\r\n  private container: HTMLElement | null = null;\r\n  private state: FlowState = {\r\n    nodes: [],\r\n    edges: [],\r\n    viewport: { x: 0, y: 0, zoom: 1 },\r\n    nodeLookup: new Map(),\r\n    edgeLookup: new Map()\r\n  };\r\n  private subscribers: Set<(state: FlowState) => void> = new Set();\r\n  private panZoomInstance: ReturnType<typeof XYPanZoom> | null = null;\r\n  private options: FlowOptions;\r\n  \r\n  // Track nodes that are pending rendering\r\n  private pendingNodes: string[] = [];\r\n  \r\n  // Store current pan/zoom update options for reuse\r\n  private panZoomUpdateOptions: PanZoomUpdateOptions | null = null;\r\n\r\n  constructor(options: FlowOptions = {}) {\r\n    this.options = {\r\n      minZoom: 0.5,\r\n      maxZoom: 2,\r\n      defaultZoom: 1,\r\n      nodesDraggable: true,\r\n      nodesConnectable: true,\r\n      elementsSelectable: true,\r\n      ...options\r\n    };\r\n    \r\n    this.state.nodes = options.nodes || [];\r\n    this.state.edges = options.edges || [];\r\n    this.updateLookups();\r\n  }\r\n\r\n  mount(container: HTMLElement) {\r\n    this.container = container;\r\n    \r\n    // Initialize XYPanZoom for viewport control\r\n    this.panZoomInstance = XYPanZoom({\r\n      domNode: container,\r\n      minZoom: this.options.minZoom || 0.5,\r\n      maxZoom: this.options.maxZoom || 2,\r\n      paneClickDistance: 0,\r\n      translateExtent: [[-Infinity, -Infinity], [Infinity, Infinity]],\r\n      viewport: this.state.viewport,\r\n      onDraggingChange: (isDragging: boolean) => {\r\n        // Toggle panning cursor\r\n        this.container?.classList.toggle('panning', isDragging);\r\n      },\r\n      onPanZoom: (_event, viewport) => {\r\n        this.state.viewport = viewport;\r\n        this.notifySubscribers();\r\n      },\r\n      onPanZoomStart: (_event, _viewport) => {\r\n        // Handle pan/zoom start\r\n      },\r\n      onPanZoomEnd: (_event, _viewport) => {\r\n        // Handle pan/zoom end\r\n      }\r\n    });\r\n\r\n    // Enable panning/zooming interactions\r\n    this.panZoomUpdateOptions = {\r\n      noWheelClassName: 'nowheel',\r\n      noPanClassName: 'nopan',\r\n      onPaneContextMenu: undefined,\r\n      preventScrolling: true,\r\n      panOnScroll: true,\r\n      panOnDrag: true,\r\n      panOnScrollMode: 'free' as unknown as PanOnScrollMode,\r\n      panOnScrollSpeed: 0.8,\r\n      userSelectionActive: false,\r\n      zoomOnPinch: true,\r\n      zoomOnScroll: true,\r\n      zoomOnDoubleClick: true,\r\n      zoomActivationKeyPressed: false,\r\n      lib: 'lit-flow',\r\n      onTransformChange: (_t: Transform) => {},\r\n      connectionInProgress: false,\r\n    };\r\n    this.panZoomInstance.update(this.panZoomUpdateOptions);\r\n\r\n    this.notifySubscribers();\r\n  }\r\n\r\n  /**\r\n   * Enable or disable panning on drag\r\n   */\r\n  setPanOnDrag(enabled: boolean) {\r\n    if (this.panZoomInstance && this.panZoomUpdateOptions) {\r\n      this.panZoomUpdateOptions = {\r\n        ...this.panZoomUpdateOptions,\r\n        panOnDrag: enabled\r\n      };\r\n      this.panZoomInstance.update(this.panZoomUpdateOptions);\r\n    }\r\n  }\r\n\r\n  destroy() {\r\n    this.panZoomInstance?.destroy();\r\n    this.panZoomInstance = null;\r\n    this.container = null;\r\n    this.subscribers.clear();\r\n  }\r\n\r\n  getState(): FlowState {\r\n    return this.state;\r\n  }\r\n\r\n  get nodes(): Node[] {\r\n    return this.state.nodes;\r\n  }\r\n\r\n  get edges(): Edge[] {\r\n    return this.state.edges;\r\n  }\r\n\r\n  getViewport(): Viewport {\r\n    return this.state.viewport;\r\n  }\r\n\r\n  setViewport(viewport: Viewport) {\r\n    this.state.viewport = viewport;\r\n    this.panZoomInstance?.setViewport?.(viewport);\r\n    this.notifySubscribers();\r\n  }\r\n\r\n  setNodes(nodes: Node[]) {\r\n    // Register all node IDs as pending\r\n    this.pendingNodes.push(...nodes.map(node => node.id));\r\n    \r\n    this.state.nodes = nodes;\r\n    this.updateLookups();\r\n    this.notifySubscribers();\r\n  }\r\n\r\n  setEdges(edges: Edge[]) {\r\n    this.retryEdgeRendering(edges);\r\n  }\r\n\r\n  updateNode(id: string, updates: Partial<Node>) {\r\n    this.state.nodes = this.state.nodes.map(node => \r\n      node.id === id ? { ...node, ...updates } : node\r\n    );\r\n    this.updateLookups();\r\n    this.notifySubscribers();\r\n  }\r\n\r\n  updateEdge(id: string, updates: Partial<Edge>) {\r\n    this.state.edges = this.state.edges.map(edge => \r\n      edge.id === id ? { ...edge, ...updates } : edge\r\n    );\r\n    this.updateLookups();\r\n    this.notifySubscribers();\r\n  }\r\n\r\n  addNode(node: Node) {\r\n    this.state.nodes = [...this.state.nodes, node];\r\n    this.updateLookups();\r\n    this.notifySubscribers();\r\n  }\r\n\r\n  removeNode(id: string) {\r\n    this.state.nodes = this.state.nodes.filter(node => node.id !== id);\r\n    // Also remove connected edges\r\n    this.state.edges = this.state.edges.filter(\r\n      edge => edge.source !== id && edge.target !== id\r\n    );\r\n    this.updateLookups();\r\n    this.notifySubscribers();\r\n  }\r\n\r\n  addEdge(edge: Edge) {\r\n    this.state.edges = [...this.state.edges, edge];\r\n    this.updateLookups();\r\n    this.notifySubscribers();\r\n  }\r\n\r\n  removeEdge(id: string) {\r\n    this.state.edges = this.state.edges.filter(edge => edge.id !== id);\r\n    this.updateLookups();\r\n    this.notifySubscribers();\r\n  }\r\n\r\n  subscribe(callback: (state: FlowState) => void): () => void {\r\n    this.subscribers.add(callback);\r\n    return () => this.subscribers.delete(callback);\r\n  }\r\n\r\n  zoomIn() {\r\n    const currentZoom = this.state.viewport.zoom;\r\n    const newZoom = Math.min(currentZoom * 1.2, this.options.maxZoom || 2);\r\n    this.setViewport({ ...this.state.viewport, zoom: newZoom });\r\n  }\r\n\r\n  zoomOut() {\r\n    const currentZoom = this.state.viewport.zoom;\r\n    const newZoom = Math.max(currentZoom / 1.2, this.options.minZoom || 0.5);\r\n    this.setViewport({ ...this.state.viewport, zoom: newZoom });\r\n  }\r\n\r\n  fitView() {\r\n    if (this.state.nodes.length === 0 || !this.container) return;\r\n\r\n    // Calculate bounds of all nodes\r\n    let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\r\n    \r\n    this.state.nodes.forEach(node => {\r\n      const width = node.measured?.width || node.width || 150;\r\n      const height = node.measured?.height || node.height || 50;\r\n      \r\n      minX = Math.min(minX, node.position.x);\r\n      minY = Math.min(minY, node.position.y);\r\n      maxX = Math.max(maxX, node.position.x + width);\r\n      maxY = Math.max(maxY, node.position.y + height);\r\n    });\r\n\r\n    const bounds = {\r\n      x: minX,\r\n      y: minY,\r\n      width: maxX - minX,\r\n      height: maxY - minY\r\n    };\r\n\r\n    const containerWidth = this.container.clientWidth;\r\n    const containerHeight = this.container.clientHeight;\r\n    \r\n    const padding = 50;\r\n    const zoomX = (containerWidth - padding * 2) / bounds.width;\r\n    const zoomY = (containerHeight - padding * 2) / bounds.height;\r\n    const zoom = Math.min(zoomX, zoomY, this.options.maxZoom || 2);\r\n\r\n    const x = (containerWidth - bounds.width * zoom) / 2 - bounds.x * zoom;\r\n    const y = (containerHeight - bounds.height * zoom) / 2 - bounds.y * zoom;\r\n\r\n    this.setViewport({ x, y, zoom });\r\n  }\r\n\r\n  private updateLookups() {\r\n    // Update node lookup\r\n    this.state.nodeLookup.clear();\r\n    this.state.nodes.forEach(node => {\r\n      const internalNode: InternalNode = {\r\n        ...node,\r\n        measured: node.measured || { width: node.width, height: node.height },\r\n        internals: {\r\n          positionAbsolute: node.position,\r\n          z: node.zIndex || 0,\r\n          userNode: node\r\n        }\r\n      };\r\n      this.state.nodeLookup.set(node.id, internalNode);\r\n    });\r\n\r\n    // Update edge lookup\r\n    this.state.edgeLookup.clear();\r\n    this.state.edges.forEach(edge => {\r\n      this.state.edgeLookup.set(edge.id, edge);\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Check if a node is fully rendered\r\n   */\r\n  private isNodeRendered(nodeId: string): boolean {\r\n    if (!this.container) return false;\r\n    const nodeEl = this.container.querySelector(`[id=\"${CSS.escape(nodeId)}\"]`) as HTMLElement | null;\r\n    if (!nodeEl) return false;\r\n    \r\n    const rect = nodeEl.getBoundingClientRect();\r\n    return rect.width > 0 && rect.height > 0;\r\n  }\r\n\r\n  /**\r\n   * Check if any of the required nodes are still pending\r\n   */\r\n  private hasPendingNodes(nodeIds: string[]): boolean {\r\n    return nodeIds.some(id => this.pendingNodes.includes(id) || !this.isNodeRendered(id));\r\n  }\r\n\r\n  /**\r\n   * Remove node from pending list when it's rendered\r\n   */\r\n  private markNodeAsRendered(nodeId: string) {\r\n    const index = this.pendingNodes.indexOf(nodeId);\r\n    if (index > -1) {\r\n      this.pendingNodes.splice(index, 1);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Retry edge rendering with delay if nodes are still pending\r\n   */\r\n  private retryEdgeRendering(edges: Edge[], retryCount: number = 0, maxRetries: number = 10) {\r\n    const allNodeIds = edges.flatMap(edge => [edge.source, edge.target]);\r\n    const uniqueNodeIds = [...new Set(allNodeIds)];\r\n    \r\n    if (this.hasPendingNodes(uniqueNodeIds) && retryCount < maxRetries) {\r\n      setTimeout(() => {\r\n        this.retryEdgeRendering(edges, retryCount + 1, maxRetries);\r\n      }, 100);\r\n    } else {\r\n      // All nodes are rendered, proceed with edge rendering\r\n      this.state.edges = edges;\r\n      this.updateLookups();\r\n      this.notifySubscribers();\r\n      \r\n      // Mark nodes as rendered\r\n      uniqueNodeIds.forEach(id => this.markNodeAsRendered(id));\r\n    }\r\n  }\r\n\r\n  private notifySubscribers() {\r\n    this.subscribers.forEach(callback => callback(this.state));\r\n  }\r\n}\r\n\r\n","/**\r\n * Store utilities for managing flow state\r\n * Placeholder for future state management integration with @xyflow/system\r\n */\r\n\r\nimport type { FlowState, InternalNode, Node, Edge } from './types';\r\n\r\nexport function createStore(initialState: Partial<FlowState> = {}) {\r\n  const state: FlowState = {\r\n    nodes: initialState.nodes || [],\r\n    edges: initialState.edges || [],\r\n    viewport: initialState.viewport || { x: 0, y: 0, zoom: 1 },\r\n    nodeLookup: new Map(),\r\n    edgeLookup: new Map()\r\n  };\r\n\r\n  const listeners = new Set<(state: FlowState) => void>();\r\n\r\n  const updateLookups = () => {\r\n    state.nodeLookup.clear();\r\n    state.nodes.forEach((node: Node) => {\r\n      const internalNode: InternalNode = {\r\n        ...node,\r\n        measured: node.measured || { width: node.width, height: node.height },\r\n        internals: {\r\n          positionAbsolute: node.position,\r\n          z: node.zIndex || 0,\r\n          userNode: node\r\n        }\r\n      };\r\n      state.nodeLookup.set(node.id, internalNode);\r\n    });\r\n\r\n    state.edgeLookup.clear();\r\n    state.edges.forEach((edge: Edge) => {\r\n      state.edgeLookup.set(edge.id, edge);\r\n    });\r\n  };\r\n\r\n  // initialize lookups based on provided initial state\r\n  updateLookups();\r\n\r\n  return {\r\n    getState: () => state,\r\n    setState: (updates: Partial<FlowState>) => {\r\n      Object.assign(state, updates);\r\n      updateLookups();\r\n      listeners.forEach(listener => listener(state));\r\n    },\r\n    subscribe: (listener: (state: FlowState) => void) => {\r\n      listeners.add(listener);\r\n      return () => listeners.delete(listener);\r\n    }\r\n  };\r\n}\r\n\r\n","/**\r\n * Geometry utilities for calculating positions, paths, and intersections\r\n * Wraps @xyflow/system utilities for Lit integration\r\n */\r\n\r\nimport { \r\n  getBezierPath as getSystemBezierPath,\r\n  getSmoothStepPath as getSystemSmoothStepPath,\r\n  getStraightPath as getSystemStraightPath,\r\n  Position\r\n} from '@xyflow/system';\r\nimport type { XYPosition } from '../core/types';\r\n\r\n/**\r\n * Calculate distance between two points\r\n */\r\nexport function getDistance(a: XYPosition, b: XYPosition): number {\r\n  return Math.sqrt(Math.pow(b.x - a.x, 2) + Math.pow(b.y - a.y, 2));\r\n}\r\n\r\n/**\r\n * Calculate the center point between two positions\r\n */\r\nexport function getCenter(a: XYPosition, b: XYPosition): XYPosition {\r\n  return {\r\n    x: (a.x + b.x) / 2,\r\n    y: (a.y + b.y) / 2,\r\n  };\r\n}\r\n\r\n/**\r\n * Generate a bezier curve path between two points\r\n * Uses @xyflow/system's getBezierPath utility\r\n */\r\nexport function getBezierPath(params: {\r\n  sourceX: number;\r\n  sourceY: number;\r\n  sourcePosition?: Position;\r\n  targetX: number;\r\n  targetY: number;\r\n  targetPosition?: Position;\r\n  curvature?: number;\r\n}): [path: string, labelX: number, labelY: number, offsetX: number, offsetY: number] {\r\n  return getSystemBezierPath(params);\r\n}\r\n\r\n/**\r\n * Generate a smooth step path between two points\r\n * Uses @xyflow/system's getSmoothStepPath utility\r\n */\r\nexport function getSmoothStepPath(params: {\r\n  sourceX: number;\r\n  sourceY: number;\r\n  sourcePosition?: Position;\r\n  targetX: number;\r\n  targetY: number;\r\n  targetPosition?: Position;\r\n  borderRadius?: number;\r\n  offset?: number;\r\n}): [path: string, labelX: number, labelY: number, offsetX: number, offsetY: number] {\r\n  return getSystemSmoothStepPath(params);\r\n}\r\n\r\n/**\r\n * Generate a straight line path\r\n * Uses @xyflow/system's getStraightPath utility\r\n */\r\nexport function getStraightPath(params: {\r\n  sourceX: number;\r\n  sourceY: number;\r\n  targetX: number;\r\n  targetY: number;\r\n}): [path: string, labelX: number, labelY: number, offsetX: number, offsetY: number] {\r\n  return getSystemStraightPath(params);\r\n}\r\n\r\n/**\r\n * Check if a point is inside a rectangle\r\n */\r\nexport function isPointInRect(\r\n  point: XYPosition,\r\n  rect: { x: number; y: number; width: number; height: number }\r\n): boolean {\r\n  return (\r\n    point.x >= rect.x &&\r\n    point.x <= rect.x + rect.width &&\r\n    point.y >= rect.y &&\r\n    point.y <= rect.y + rect.height\r\n  );\r\n}\r\n\r\n// Re-export Position enum from @xyflow/system\r\nexport { Position };\r\n\r\n","/**\n * FlowCanvas - Main container component for the flow diagram\n * This is the root element that manages the viewport and renders nodes/edges\n */\n\nimport { LitElement, css } from 'lit';\nimport { html, svg, unsafeStatic } from 'lit/static-html.js';\nimport { customElement, property } from 'lit/decorators.js';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport { FlowInstance } from '../core/flow-instance';\nimport type { Node, Edge, Viewport } from '../core/types';\nimport { getBezierPath, Position } from '../utils/geometry';\n\n@customElement('flow-canvas')\nexport class FlowCanvas extends LitElement {\n  protected createRenderRoot() {\n    return super.createRenderRoot();\n  }\n  static styles = css`\n    :host {\n      display: block;\n      width: 100%;\n      height: 100%;\n      position: relative;\n      overflow: hidden;\n      background: var(--flow-background-color, #fafafa);\n    }\n\n    .flow-container {\n      width: 100%;\n      height: 100%;\n      position: relative;\n      cursor: grab;\n    }\n\n    .flow-container.panning {\n      cursor: grabbing;\n    }\n\n    .flow-viewport {\n      width: 100%;\n      height: 100%;\n      position: relative;\n      transform-origin: 0 0;\n      will-change: transform;\n    }\n\n    .flow-nodes-layer {\n      position: absolute;\n      top: 0;\n      left: 0;\n      width: 100%;\n      height: 100%;\n      pointer-events: none;\n    }\n\n    .flow-edges-layer {\n      position: absolute;\n      top: 0;\n      left: 0;\n      width: 100%;\n      height: 100%;\n       pointer-events: none;\n    }\n\n    .flow-labels-overlay {\n      position: absolute;\n      top: 0;\n      left: 0;\n      width: 100%;\n      height: 100%;\n      pointer-events: none;\n    }\n\n    .edge-label {\n      position: absolute;\n      transform: translate(-50%, -50%);\n      background: white;\n      border: 1px solid rgba(0, 0, 0, 0.1);\n      border-radius: 4px;\n      padding: 2px 6px;\n      font-size: 12px;\n      color: #333;\n      pointer-events: all;\n      white-space: nowrap;\n      user-select: none;\n    }\n  `;\n\n  @property({ type: Array }) nodes: Node[] = [];\n  @property({ type: Array }) edges: Edge[] = [];\n  @property({ type: Object }) viewport: Viewport = { x: 0, y: 0, zoom: 1 };\n  \n  // Node type registry (maps type name to tag name)\n  @property({ type: Object }) nodeTypes: Record<string, string> = {\n    'default': 'flow-node',\n    'shape': 'shape-node',\n    'erd-table': 'erd-table-node'\n  };\n\n  private connection: { \n    from?: { nodeId: string; handleId?: string }; \n    to?: { nodeId: string; handleId?: string }; \n    preview?: { x: number; y: number } \n  } | null = null;\n\n  private isHoveringNode = false;\n\n\n\n  private getNodeGeom(nodeId: string): { left: { x: number; y: number }; right: { x: number; y: number } } | null {\n    const el = this.renderRoot.querySelector(`flow-node[id=\"${CSS.escape(nodeId)}\"]`) as HTMLElement | null;\n    const viewportEl = this.renderRoot.querySelector('.flow-viewport') as HTMLElement | null;\n    if (!el || !viewportEl) return null;\n    const rect = el.getBoundingClientRect();\n    const vpRect = viewportEl.getBoundingClientRect();\n    const z = this.viewport.zoom || 1;\n    const x = (rect.left - vpRect.left - this.viewport.x) / z;\n    const y = (rect.top - vpRect.top - this.viewport.y) / z;\n    const w = rect.width / z;\n    const h = rect.height / z;\n    const cy = y + h / 2;\n    return { left: { x: x, y: cy }, right: { x: x + w, y: cy } };\n  }\n\n  /**\n   * Get handle position in canvas coordinates\n   */\n  private getHandleCanvasPosition(nodeId: string, handleId: string): { x: number; y: number } | null {\n    const nodeEl = this.renderRoot.querySelector(`[id=\"${CSS.escape(nodeId)}\"]`) as HTMLElement | null;\n    if (!nodeEl) return null;\n\n    // Find handle element in shadow root or light DOM\n    let handleEl: HTMLElement | null = null;\n    const shadowRoot = nodeEl.shadowRoot;\n    if (shadowRoot) {\n      handleEl = shadowRoot.querySelector(`[data-handle-id=\"${CSS.escape(handleId)}\"]`) as HTMLElement;\n    }\n    if (!handleEl) {\n      handleEl = nodeEl.querySelector(`[data-handle-id=\"${CSS.escape(handleId)}\"]`) as HTMLElement;\n    }\n    if (!handleEl) return null;\n\n    // Get node data\n    const node = this.nodes.find(n => n.id === nodeId);\n    if (!node) return null;\n\n    // For shape nodes, calculate handle position based on shape size and handle type\n    if (node.type === 'shape') {\n      console.log('getHandleCanvasPosition for shape node:', { nodeId, handleId, node });\n      return this.getShapeHandlePosition(node, handleId);\n    }\n\n    // For regular nodes, use the existing method\n    const nodeRect = nodeEl.getBoundingClientRect();\n    const handleRect = handleEl.getBoundingClientRect();\n    const zoom = this.viewport.zoom || 1;\n    \n    const offsetX = (handleRect.left + handleRect.width / 2 - nodeRect.left) / zoom;\n    const offsetY = (handleRect.top + handleRect.height / 2 - nodeRect.top) / zoom;\n    \n    return {\n      x: node.position.x + offsetX,\n      y: node.position.y + offsetY\n    };\n  }\n\n  /**\n   * Get handle position for shape nodes based on shape size and handle type\n   */\n  private getShapeHandlePosition(node: any, handleId: string): { x: number; y: number } | null {\n    const shapeData = node.data;\n    if (!shapeData) return null;\n\n    const size = shapeData.size || { width: 200, height: 200 };\n    const width = size.width;\n    const height = size.height;\n\n    // Parse handle ID to determine position\n    // Handle IDs are like: \"shape-1-source-right\", \"shape-1-target-left\", etc.\n    const parts = handleId.split('-');\n    const handleType = parts[parts.length - 1]; // Get last part (right, left, top, bottom)\n    \n    console.log('getShapeHandlePosition:', { handleId, parts, handleType, node: node.id, size });\n    \n    let offsetX = 0;\n    let offsetY = 0;\n\n    switch (handleType) {\n      case 'right':\n        offsetX = width;\n        offsetY = height / 2;\n        break;\n      case 'left':\n        offsetX = 0;\n        offsetY = height / 2;\n        break;\n      case 'top':\n        offsetX = width / 2;\n        offsetY = 0;\n        break;\n      case 'bottom':\n        offsetX = width / 2;\n        offsetY = height;\n        break;\n      default:\n        // Fallback to center\n        offsetX = width / 2;\n        offsetY = height / 2;\n    }\n\n    const result = {\n      x: node.position.x + offsetX,\n      y: node.position.y + offsetY\n    };\n    \n    console.log('getShapeHandlePosition result:', { \n      nodeId: node.id, \n      position: node.position, \n      offsetX, \n      offsetY, \n      result \n    });\n    \n    return result;\n  }\n\n  setNodes(nodes: Node[]) {\n    this.instance.setNodes(nodes);\n  }\n\n  setEdges(edges: Edge[]) {\n    this.instance.setEdges(edges);\n  }\n\n  /**\n   * Determine the best target handle for a shape node based on connection direction\n   */\n  private determineBestTargetHandle(sourceNodeId: string, targetNodeId: string): string {\n    const sourceNode = this.nodes.find(n => n.id === sourceNodeId);\n    const targetNode = this.nodes.find(n => n.id === targetNodeId);\n    \n    if (!sourceNode || !targetNode) return `${targetNodeId}-target-left`;\n    \n    // Calculate relative positions\n    const sourceX = sourceNode.position.x;\n    const sourceY = sourceNode.position.y;\n    const targetX = targetNode.position.x;\n    const targetY = targetNode.position.y;\n    \n    // Get target node dimensions\n    const targetData = targetNode.data as any;\n    const targetWidth = targetData?.size?.width || 200;\n    const targetHeight = targetData?.size?.height || 200;\n    \n    // Calculate center positions\n    const sourceCenterX = sourceX + (sourceNode.width || 150) / 2;\n    const sourceCenterY = sourceY + (sourceNode.height || 50) / 2;\n    const targetCenterX = targetX + targetWidth / 2;\n    const targetCenterY = targetY + targetHeight / 2;\n    \n    // Determine connection direction\n    const deltaX = targetCenterX - sourceCenterX;\n    const deltaY = targetCenterY - sourceCenterY;\n    \n    // Choose target handle based on direction\n    if (Math.abs(deltaX) > Math.abs(deltaY)) {\n      // Horizontal connection\n      return deltaX > 0 ? `${targetNodeId}-target-left` : `${targetNodeId}-target-right`;\n    } else {\n      // Vertical connection\n      return deltaY > 0 ? `${targetNodeId}-target-top` : `${targetNodeId}-target-bottom`;\n    }\n  }\n\n  private computeLabelCanvasPosition(edge: Edge): { x: number; y: number } | null {\n    const sourceNode = this.nodes.find(n => n.id === edge.source);\n    const targetNode = this.nodes.find(n => n.id === edge.target);\n    if (!sourceNode || !targetNode) return null;\n    \n    // Try to use specific handle positions if available\n    let sourceX: number, sourceY: number;\n    let targetX: number, targetY: number;\n\n    if (edge.sourceHandle) {\n      const handlePos = this.getHandleCanvasPosition(edge.source, edge.sourceHandle);\n      if (handlePos) {\n        sourceX = handlePos.x;\n        sourceY = handlePos.y;\n      } else {\n        // Fallback to node edge\n        const sourceWidth = sourceNode.measured?.width || sourceNode.width || 150;\n        const sourceHeight = sourceNode.measured?.height || sourceNode.height || 50;\n        sourceX = sourceNode.position.x + sourceWidth;\n        sourceY = sourceNode.position.y + sourceHeight / 2;\n      }\n    } else {\n      const sourceWidth = sourceNode.measured?.width || sourceNode.width || 150;\n      const sourceHeight = sourceNode.measured?.height || sourceNode.height || 50;\n      sourceX = sourceNode.position.x + sourceWidth;\n      sourceY = sourceNode.position.y + sourceHeight / 2;\n    }\n\n    if (edge.targetHandle) {\n      const handlePos = this.getHandleCanvasPosition(edge.target, edge.targetHandle);\n      if (handlePos) {\n        targetX = handlePos.x;\n        targetY = handlePos.y;\n      } else {\n        // Fallback to node edge\n        targetX = targetNode.position.x;\n        const targetHeight = targetNode.measured?.height || targetNode.height || 50;\n        targetY = targetNode.position.y + targetHeight / 2;\n      }\n    } else {\n      targetX = targetNode.position.x;\n      const targetHeight = targetNode.measured?.height || targetNode.height || 50;\n      targetY = targetNode.position.y + targetHeight / 2;\n    }\n    \n    const [, labelX, labelY] = getBezierPath({\n      sourceX,\n      sourceY,\n      sourcePosition: Position.Right,\n      targetX,\n      targetY,\n      targetPosition: Position.Left,\n    });\n    \n    return { x: labelX, y: labelY };\n  }\n\n  private computeStartLabelCanvasPosition(edge: Edge): { x: number; y: number } | null {\n    const sourceNode = this.nodes.find(n => n.id === edge.source);\n    if (!sourceNode) return null;\n    \n    let sourceX: number, sourceY: number;\n\n    if (edge.sourceHandle) {\n      const handlePos = this.getHandleCanvasPosition(edge.source, edge.sourceHandle);\n      if (handlePos) {\n        sourceX = handlePos.x;\n        sourceY = handlePos.y;\n      } else {\n        const sourceWidth = sourceNode.measured?.width || sourceNode.width || 150;\n        const sourceHeight = sourceNode.measured?.height || sourceNode.height || 50;\n        sourceX = sourceNode.position.x + sourceWidth;\n        sourceY = sourceNode.position.y + sourceHeight / 2;\n      }\n    } else {\n      const sourceWidth = sourceNode.measured?.width || sourceNode.width || 150;\n      const sourceHeight = sourceNode.measured?.height || sourceNode.height || 50;\n      sourceX = sourceNode.position.x + sourceWidth;\n      sourceY = sourceNode.position.y + sourceHeight / 2;\n    }\n    \n    return { x: sourceX + 12, y: sourceY - 10 };\n  }\n\n  private computeEndLabelCanvasPosition(edge: Edge): { x: number; y: number } | null {\n    const targetNode = this.nodes.find(n => n.id === edge.target);\n    if (!targetNode) return null;\n    \n    let targetX: number, targetY: number;\n\n    if (edge.targetHandle) {\n      const handlePos = this.getHandleCanvasPosition(edge.target, edge.targetHandle);\n      if (handlePos) {\n        targetX = handlePos.x;\n        targetY = handlePos.y;\n      } else {\n        const targetHeight = targetNode.measured?.height || targetNode.height || 50;\n        targetX = targetNode.position.x;\n        targetY = targetNode.position.y + targetHeight / 2;\n      }\n    } else {\n      const targetHeight = targetNode.measured?.height || targetNode.height || 50;\n      targetX = targetNode.position.x;\n      targetY = targetNode.position.y + targetHeight / 2;\n    }\n    \n    return { x: targetX - 12, y: targetY - 10 };\n  }\n\n  instance: FlowInstance;\n  private unsubscribe?: () => void;\n\n  constructor() {\n    super();\n    this.instance = new FlowInstance({ nodes: this.nodes, edges: this.edges });\n  }\n\n  firstUpdated() {\n    const container = this.renderRoot.querySelector('.flow-container') as HTMLElement;\n    if (container) {\n      this.instance.mount(container);\n      this.unsubscribe = this.instance.subscribe((state) => {\n        this.nodes = state.nodes;\n        this.edges = state.edges;\n        this.viewport = state.viewport;\n        this.requestUpdate();\n      });\n      container.addEventListener('mousemove', this.onMouseMove);\n      window.addEventListener('mouseup', this.onMouseUp);\n      \n      // Add selection event listeners\n      container.addEventListener('node-select', this.onNodeSelect as EventListener);\n      // Edge events come from light DOM, so listen on document\n      document.addEventListener('edge-select', this.onEdgeSelect as EventListener);\n      \n      // Listen for node hover events to prevent canvas panning\n      container.addEventListener('mouseenter', this.onNodeMouseEnter, true);\n      container.addEventListener('mouseleave', this.onNodeMouseLeave, true);\n    }\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    this.unsubscribe?.();\n    this.instance.destroy();\n    const container = this.renderRoot.querySelector('.flow-container') as HTMLElement | null;\n      container?.removeEventListener('mousemove', this.onMouseMove);\n      window.removeEventListener('mouseup', this.onMouseUp);\n      container?.removeEventListener('node-select', this.onNodeSelect as EventListener);\n      document.removeEventListener('edge-select', this.onEdgeSelect as EventListener);\n      container?.removeEventListener('mouseenter', this.onNodeMouseEnter, true);\n      container?.removeEventListener('mouseleave', this.onNodeMouseLeave, true);\n  }\n\n  /**\n   * Renders a node with dynamic tag name based on node type\n   * Falls back to 'flow-node' if type is not registered\n   */\n  private renderNode(node: Node) {\n    // Get the tag name for this node type, or use default 'flow-node'\n    const nodeType = node.type || 'default';\n    const tagName = this.nodeTypes[nodeType] || 'flow-node';\n    \n    // Use lit-html's unsafeStatic to render dynamic tag names\n    const tag = unsafeStatic(tagName);\n    \n    return html`\n      <${tag}\n        .id=${node.id}\n        .data=${node.data}\n        .position=${node.position}\n        .selected=${node.selected || false}\n        .draggable=${node.draggable !== false}\n        .connectable=${node.connectable !== false}\n        .resizable=${node.resizable || false}\n        .drag_handle_selector=${(node as any).drag_handle_selector || null}\n        .instance=${this.instance}\n        @handle-start=${this.onHandleStart}\n      ></${tag}>\n    `;\n  }\n\n  render() {\n    const transform = `translate(${this.viewport.x}px, ${this.viewport.y}px) scale(${this.viewport.zoom})`;\n    \n    return html`\n      <div class=\"flow-container\">\n        <slot name=\"background\"></slot>\n        <div \n          class=\"flow-viewport\" \n          style=${styleMap({ transform })}\n        >\n          <div class=\"flow-edges-layer\">\n            ${this.edges.map(edge => {\n              const sourceNode = this.nodes.find(n => n.id === edge.source);\n              const targetNode = this.nodes.find(n => n.id === edge.target);\n              \n              if (!sourceNode || !targetNode) return null;\n              \n              return html`\n                <flow-edge \n                  .id=${edge.id}\n                  .source=${edge.source}\n                  .target=${edge.target}\n                  .sourceHandle=${edge.sourceHandle}\n                  .targetHandle=${edge.targetHandle}\n                  .sourceNode=${sourceNode}\n                  .targetNode=${targetNode}\n                  .animated=${edge.animated || false}\n                  .label=${(edge as any).label || ''}\n                  .type=${edge.type || 'default'}\n                  .markerStart=${edge.markerStart}\n                  .markerEnd=${edge.markerEnd}\n                ></flow-edge>\n              `;\n            })}\n            ${this.renderPreviewEdge()}\n          </div>\n          <div class=\"flow-nodes-layer\">\n            ${this.nodes.map(node => this.renderNode(node))}\n          </div>\n          <div class=\"flow-labels-overlay\">\n            ${this.edges.map(edge => {\n              const labelHtml = (edge.data && (edge.data as any).labelHtml) as string | undefined;\n              const labelText = (edge.data && (edge.data as any).label) as string | undefined;\n              const hasCenter = !!labelHtml || !!labelText;\n              if (!hasCenter) return null;\n              const pos = this.computeLabelCanvasPosition(edge);\n              if (!pos) return null;\n              const style = `transform: translate(-50%, -50%) translate(${pos.x}px, ${pos.y}px);`;\n              return labelHtml\n                ? html`<div class=\"edge-label\" style=\"${style}\" .innerHTML=${labelHtml}></div>`\n                : html`<div class=\"edge-label\" style=\"${style}\">${labelText}</div>`;\n            })}\n            ${this.edges.map(edge => {\n              const startHtml = (edge.data && (edge.data as any).startLabelHtml) as string | undefined;\n              const startText = (edge.data && (edge.data as any).startLabel) as string | undefined;\n              if (!startHtml && !startText) return null;\n              const pos = this.computeStartLabelCanvasPosition(edge);\n              if (!pos) return null;\n              const style = `transform: translate(-50%, -50%) translate(${pos.x}px, ${pos.y}px);`;\n              return startHtml\n                ? html`<div class=\"edge-label\" style=\"${style}\" .innerHTML=${startHtml}></div>`\n                : html`<div class=\"edge-label\" style=\"${style}\">${startText}</div>`;\n            })}\n            ${this.edges.map(edge => {\n              const endHtml = (edge.data && (edge.data as any).endLabelHtml) as string | undefined;\n              const endText = (edge.data && (edge.data as any).endLabel) as string | undefined;\n              if (!endHtml && !endText) return null;\n              const pos = this.computeEndLabelCanvasPosition(edge);\n              if (!pos) return null;\n              const style = `transform: translate(-50%, -50%) translate(${pos.x}px, ${pos.y}px);`;\n              return endHtml\n                ? html`<div class=\"edge-label\" style=\"${style}\" .innerHTML=${endHtml}></div>`\n                : html`<div class=\"edge-label\" style=\"${style}\">${endText}</div>`;\n            })}\n          </div>\n        </div>\n        <slot></slot>\n      </div>\n    `;\n  }\n\n  private screenToCanvas(x: number, y: number) {\n    const container = this.renderRoot.querySelector('.flow-container') as HTMLElement | null;\n    if (!container) return { x, y };\n    const rect = container.getBoundingClientRect();\n    const vx = this.viewport.x;\n    const vy = this.viewport.y;\n    const z = this.viewport.zoom || 1;\n    return { x: (x - rect.left - vx) / z, y: (y - rect.top - vy) / z };\n  }\n\n  private onHandleStart = (e: CustomEvent<{ nodeId: string; type: 'source' | 'target'; handleId?: string }>) => {\n    const { nodeId, type, handleId } = e.detail;\n    // Always start a connection FROM this handle, regardless of its type\n    // The handle type will be determined by the connection direction\n    this.connection = { from: { nodeId, handleId } };\n  };\n\n  private onMouseMove = (e: MouseEvent) => {\n    if (!this.connection) return;\n    const p = this.screenToCanvas(e.clientX, e.clientY);\n    this.connection.preview = p;\n    this.requestUpdate();\n  };\n\n  private onMouseUp = (e: MouseEvent) => {\n    if (!this.connection) return;\n\n    const path = e.composedPath() as EventTarget[];\n    let targetEl: HTMLElement | null = null;\n    let targetHandleId: string | undefined;\n    \n    // Find target node element (can be flow-node or any custom node type)\n    for (const t of path) {\n      if (t instanceof HTMLElement) {\n        const tagName = t.tagName.toLowerCase();\n        // Check if it's a node element (flow-node or any registered custom node type)\n        if (tagName === 'flow-node' || Object.values(this.nodeTypes).some(tag => tag === tagName)) {\n          targetEl = t;\n          break;\n        }\n        // Check if it's a handle element\n        if (t.dataset.handleId) {\n          targetHandleId = t.dataset.handleId;\n        }\n      }\n    }\n    const targetId = targetEl?.getAttribute('id') || undefined;\n\n    // Handle connection completion - always from a source handle to a target handle\n    if (this.connection.from && targetId && targetId !== this.connection.from.nodeId) {\n      const newEdgeId = `e-${this.connection.from.nodeId}-${targetId}-${Date.now()}`;\n      const sourceNodeId = this.connection.from.nodeId;\n      const sourceHandleId = this.connection.from.handleId;\n      \n      // If no target handle was found, determine the best target handle for shape nodes\n      let finalTargetHandleId = targetHandleId;\n      if (!finalTargetHandleId) {\n        const targetNode = this.nodes.find(n => n.id === targetId);\n        if (targetNode && targetNode.type === 'shape') {\n          finalTargetHandleId = this.determineBestTargetHandle(sourceNodeId, targetId);\n          console.log('Auto-determined target handle:', { sourceNodeId, targetId, finalTargetHandleId });\n        }\n      }\n      \n      // Use the instance method which handles retry logic automatically\n      this.instance.addEdge({ \n        id: newEdgeId, \n        source: sourceNodeId, \n        target: targetId, \n        sourceHandle: sourceHandleId,\n        targetHandle: finalTargetHandleId,\n        data: {} \n      });\n    }\n\n    this.connection = null;\n    this.requestUpdate();\n  };\n\n  private onNodeMouseEnter = (e: MouseEvent) => {\n    // Check if the event originated from within a node\n    const target = e.target as HTMLElement;\n    \n    // Find the node element by checking all registered node types\n    const nodeTypes = ['flow-node', ...Object.values(this.nodeTypes)];\n    let nodeElement: HTMLElement | null = null;\n    \n    // Check if target is a node or is inside a node\n    for (const nodeType of nodeTypes) {\n      const element = target.closest(nodeType) as HTMLElement;\n      if (element && element.id) {\n        // Verify it's actually one of our nodes\n        if (this.nodes.some(node => node.id === element.id)) {\n          nodeElement = element;\n          break;\n        }\n      }\n    }\n    \n    if (nodeElement && !this.isHoveringNode) {\n      this.isHoveringNode = true;\n      // Disable panning when hovering over a node\n      this.instance.setPanOnDrag(false);\n    }\n  };\n\n  private onNodeMouseLeave = (e: MouseEvent) => {\n    // Check if we're leaving a node\n    const target = e.target as HTMLElement;\n    const nodeTypes = ['flow-node', ...Object.values(this.nodeTypes)];\n    let nodeElement: HTMLElement | null = null;\n    \n    for (const nodeType of nodeTypes) {\n      const element = target.closest(nodeType) as HTMLElement;\n      if (element && element.id && this.nodes.some(node => node.id === element.id)) {\n        nodeElement = element;\n        break;\n      }\n    }\n    \n    if (nodeElement && this.isHoveringNode) {\n      // Small delay to check if we're moving to another node\n      setTimeout(() => {\n        const pointElement = document.elementFromPoint(e.clientX, e.clientY);\n        if (!pointElement || !(pointElement instanceof HTMLElement) || !this.isElementNode(pointElement)) {\n          this.isHoveringNode = false;\n          // Re-enable panning when not hovering over a node\n          this.instance.setPanOnDrag(true);\n        }\n      }, 10);\n    }\n  };\n\n  private isElementNode(element: HTMLElement | null): boolean {\n    if (!element) return false;\n    const nodeTypes = ['flow-node', ...Object.values(this.nodeTypes)];\n    \n    for (const nodeType of nodeTypes) {\n      const nodeElement = element.closest(nodeType) as HTMLElement;\n      if (nodeElement && nodeElement.id) {\n        return this.nodes.some(node => node.id === nodeElement.id);\n      }\n    }\n    return false;\n  }\n\n  private onNodeSelect = (e: CustomEvent<{ nodeId: string; selected: boolean; node: any }>) => {\n    const { nodeId, selected, node } = e.detail;\n    \n    // Update the node selection state in the instance\n    this.instance.updateNode(nodeId, { selected });\n    \n    // Dispatch a higher-level selection event from flow-canvas\n    this.dispatchEvent(new CustomEvent('node-selected', {\n      detail: {\n        nodeId,\n        selected,\n        node,\n        allSelectedNodes: this.nodes.filter(n => n.selected)\n      },\n      bubbles: true,\n      composed: true\n    }));\n  };\n\n  private onEdgeSelect = (e: CustomEvent<{ edgeId: string; selected: boolean; edge: any }>) => {\n    const { edgeId, selected, edge } = e.detail;\n    \n    // Update the edge selection state in the instance\n    this.instance.updateEdge(edgeId, { selected });\n    \n    // Dispatch a higher-level selection event from flow-canvas\n    this.dispatchEvent(new CustomEvent('edge-selected', {\n      detail: {\n        edgeId,\n        selected,\n        edge,\n        allSelectedEdges: this.edges.filter(e => e.selected)\n      },\n      bubbles: true,\n      composed: true\n    }));\n  };\n\n  private renderPreviewEdge() {\n    if (!this.connection || !this.connection.preview) return null;\n\n    const preview = this.connection.preview;\n    const nodeFrom = this.connection.from ? this.nodes.find(n => n.id === this.connection!.from!.nodeId) : null;\n    const nodeTo = this.connection.to ? this.nodes.find(n => n.id === this.connection!.to!.nodeId) : null;\n\n    if (nodeFrom) {\n      return html`\n        <flow-edge\n          .id=${'preview'}\n          .source=${nodeFrom.id}\n          .target=${'__preview__'}\n          .sourceHandle=${this.connection.from?.handleId}\n          .sourceNode=${{ ...nodeFrom, position: nodeFrom.position } as any}\n          .targetNode=${{ id: '__preview__', position: { x: preview.x, y: preview.y }, width: 1, height: 1, data: {} } as any}\n          .animated=${true}\n          .label=${''}\n        ></flow-edge>\n      `;\n    }\n\n    if (nodeTo) {\n      return html`\n        <flow-edge\n          .id=${'preview'}\n          .source=${'__preview__'}\n          .target=${nodeTo.id}\n          .sourceNode=${{ id: '__preview__', position: { x: preview.x, y: preview.y }, width: 1, height: 1, data: {} } as any}\n          .targetHandle=${this.connection.to?.handleId}\n          .targetNode=${{ ...nodeTo, position: nodeTo.position } as any}\n          .animated=${true}\n          .label=${''}\n        ></flow-edge>\n      `;\n    }\n\n    return null;\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'flow-canvas': FlowCanvas;\n  }\n}\n\n","/**\r\n * NodeResizer - A modular resize component that can be added to any node\r\n * Inspired by React Flow's NodeResizer component\r\n */\r\n\r\nimport { LitElement, html, css } from 'lit';\r\nimport { customElement, property } from 'lit/decorators.js';\r\n\r\n@customElement('node-resizer')\r\nexport class NodeResizer extends LitElement {\r\n  static styles = css`\r\n    :host {\r\n      position: absolute;\r\n      top: 0;\r\n      left: 0;\r\n      right: 0;\r\n      bottom: 0;\r\n      pointer-events: none;\r\n      z-index: 10;\r\n    }\r\n\r\n    .resize-handle {\r\n      position: absolute;\r\n      background: var(--flow-node-selected-color, #1a73e8);\r\n      border: 2px solid #fff;\r\n      border-radius: 2px;\r\n      opacity: 0;\r\n      transition: opacity 0.2s ease;\r\n      pointer-events: auto;\r\n      box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\r\n    }\r\n\r\n    .resize-handle:hover {\r\n      opacity: 1;\r\n    }\r\n\r\n    :host([visible]) .resize-handle {\r\n      opacity: 1;\r\n    }\r\n\r\n    .resize-handle.nw {\r\n      top: -8px;\r\n      left: -8px;\r\n      width: 12px;\r\n      height: 12px;\r\n      cursor: nw-resize;\r\n    }\r\n\r\n    .resize-handle.ne {\r\n      top: -8px;\r\n      right: -8px;\r\n      width: 12px;\r\n      height: 12px;\r\n      cursor: ne-resize;\r\n    }\r\n\r\n    .resize-handle.sw {\r\n      bottom: -8px;\r\n      left: -8px;\r\n      width: 12px;\r\n      height: 12px;\r\n      cursor: sw-resize;\r\n    }\r\n\r\n    .resize-handle.se {\r\n      bottom: -8px;\r\n      right: -8px;\r\n      width: 12px;\r\n      height: 12px;\r\n      cursor: se-resize;\r\n    }\r\n\r\n    .resize-handle.n {\r\n      top: -8px;\r\n      left: 50%;\r\n      transform: translateX(-50%);\r\n      width: 12px;\r\n      height: 12px;\r\n      cursor: n-resize;\r\n    }\r\n\r\n    .resize-handle.s {\r\n      bottom: -8px;\r\n      left: 50%;\r\n      transform: translateX(-50%);\r\n      width: 12px;\r\n      height: 12px;\r\n      cursor: s-resize;\r\n    }\r\n\r\n    .resize-handle.w {\r\n      top: 50%;\r\n      left: -8px;\r\n      transform: translateY(-50%);\r\n      width: 12px;\r\n      height: 12px;\r\n      cursor: w-resize;\r\n    }\r\n\r\n    .resize-handle.e {\r\n      top: 50%;\r\n      right: -8px;\r\n      transform: translateY(-50%);\r\n      width: 12px;\r\n      height: 12px;\r\n      cursor: e-resize;\r\n    }\r\n\r\n    .resize-border {\r\n      position: absolute;\r\n      top: 0;\r\n      left: 0;\r\n      right: 0;\r\n      bottom: 0;\r\n      border: 1px dashed var(--flow-node-selected-color, #1a73e8);\r\n      opacity: 0;\r\n      pointer-events: none;\r\n    }\r\n\r\n    :host([visible]) .resize-border {\r\n      opacity: 1;\r\n    }\r\n  `;\r\n\r\n  @property({ type: Boolean, reflect: true }) visible = false;\r\n  @property({ type: Number }) minWidth = 10;\r\n  @property({ type: Number }) minHeight = 10;\r\n  @property({ type: Number }) maxWidth = Number.MAX_VALUE;\r\n  @property({ type: Number }) maxHeight = Number.MAX_VALUE;\r\n  @property({ type: Boolean }) keepAspectRatio = false;\r\n\r\n  private isResizing = false;\r\n  private resizeStart = { x: 0, y: 0, width: 0, height: 0 };\r\n  private resizeHandle = '';\r\n\r\n  connectedCallback() {\r\n    super.connectedCallback();\r\n    this.addEventListener('mousedown', this.handleMouseDown);\r\n  }\r\n\r\n  disconnectedCallback() {\r\n    super.disconnectedCallback();\r\n    this.removeEventListener('mousedown', this.handleMouseDown);\r\n    this.cleanup();\r\n  }\r\n\r\n  private cleanup() {\r\n    document.removeEventListener('mousemove', this.handleMouseMove);\r\n    document.removeEventListener('mouseup', this.handleMouseUp);\r\n  }\r\n\r\n  private handleMouseDown = (e: MouseEvent) => {\r\n    const target = e.target as HTMLElement;\r\n    console.log('NodeResizer handleMouseDown:', target, target.classList);\r\n    \r\n    // Check if the target is a resize handle\r\n    // If target is the host element, check if the event originated from a resize handle in shadow DOM\r\n    let isResizeHandle = target.classList.contains('resize-handle');\r\n    \r\n    if (!isResizeHandle && target === this) {\r\n      // If target is the host element, check if the event came from a resize handle\r\n      const path = e.composedPath();\r\n      isResizeHandle = path.some(el => \r\n        el instanceof HTMLElement && el.classList.contains('resize-handle')\r\n      );\r\n    }\r\n    \r\n    console.log('Is resize handle:', isResizeHandle);\r\n    if (!isResizeHandle) return;\r\n\r\n    e.preventDefault();\r\n    e.stopPropagation();\r\n    e.stopImmediatePropagation();\r\n\r\n    this.isResizing = true;\r\n    \r\n    // Get the parent element (host of the shadow root)\r\n    const parentElement = (this.getRootNode() as ShadowRoot).host as HTMLElement;\r\n    \r\n    this.resizeStart = {\r\n      x: e.clientX,\r\n      y: e.clientY,\r\n      width: parentElement?.offsetWidth || 0,\r\n      height: parentElement?.offsetHeight || 0\r\n    };\r\n    // Get the handle direction from the actual resize handle element\r\n    let resizeHandleEl: HTMLElement | null = null;\r\n    \r\n    if (target.classList.contains('resize-handle')) {\r\n      resizeHandleEl = target;\r\n    } else if (target === this) {\r\n      // Find the resize handle in the composed path\r\n      const path = e.composedPath();\r\n      resizeHandleEl = path.find(el => \r\n        el instanceof HTMLElement && el.classList.contains('resize-handle')\r\n      ) as HTMLElement || null;\r\n    }\r\n    \r\n    if (resizeHandleEl) {\r\n      const classes = Array.from(resizeHandleEl.classList);\r\n      this.resizeHandle = classes.find(cls => cls !== 'resize-handle') || '';\r\n      console.log('Resize handle direction:', this.resizeHandle);\r\n    }\r\n\r\n    document.addEventListener('mousemove', this.handleMouseMove);\r\n    document.addEventListener('mouseup', this.handleMouseUp);\r\n\r\n    console.log({\r\n        width: this.resizeStart.width,\r\n        height: this.resizeStart.height\r\n      })\r\n\r\n    // Dispatch resize start event\r\n    this.dispatchEvent(new CustomEvent('resize-start', {\r\n      detail: {\r\n        width: this.resizeStart.width,\r\n        height: this.resizeStart.height\r\n      },\r\n      bubbles: true,\r\n      composed: true\r\n    }));\r\n  };\r\n\r\n  private handleMouseMove = (e: MouseEvent) => {\r\n    if (!this.isResizing) return;\r\n    \r\n    // Get the parent element (host of the shadow root)\r\n    const parentElement = (this.getRootNode() as ShadowRoot).host as HTMLElement;\r\n    if (!parentElement) return;\r\n    \r\n    console.log('NodeResizer handleMouseMove:', e);\r\n\r\n    const deltaX = e.clientX - this.resizeStart.x;\r\n    const deltaY = e.clientY - this.resizeStart.y;\r\n\r\n    let newWidth = this.resizeStart.width;\r\n    let newHeight = this.resizeStart.height;\r\n\r\n    // Calculate new dimensions based on handle direction\r\n    switch (this.resizeHandle) {\r\n      case 'nw':\r\n        newWidth = this.resizeStart.width - deltaX;\r\n        newHeight = this.resizeStart.height - deltaY;\r\n        break;\r\n      case 'ne':\r\n        newWidth = this.resizeStart.width + deltaX;\r\n        newHeight = this.resizeStart.height - deltaY;\r\n        break;\r\n      case 'sw':\r\n        newWidth = this.resizeStart.width - deltaX;\r\n        newHeight = this.resizeStart.height + deltaY;\r\n        break;\r\n      case 'se':\r\n        newWidth = this.resizeStart.width + deltaX;\r\n        newHeight = this.resizeStart.height + deltaY;\r\n        break;\r\n      case 'n':\r\n        newHeight = this.resizeStart.height - deltaY;\r\n        break;\r\n      case 's':\r\n        newHeight = this.resizeStart.height + deltaY;\r\n        break;\r\n      case 'w':\r\n        newWidth = this.resizeStart.width - deltaX;\r\n        break;\r\n      case 'e':\r\n        newWidth = this.resizeStart.width + deltaX;\r\n        break;\r\n    }\r\n\r\n    // Apply constraints\r\n    newWidth = Math.max(this.minWidth, Math.min(this.maxWidth, newWidth));\r\n    newHeight = Math.max(this.minHeight, Math.min(this.maxHeight, newHeight));\r\n\r\n    // Keep aspect ratio if enabled\r\n    if (this.keepAspectRatio) {\r\n      const aspectRatio = this.resizeStart.width / this.resizeStart.height;\r\n      if (this.resizeHandle.includes('w') || this.resizeHandle.includes('e')) {\r\n        newHeight = newWidth / aspectRatio;\r\n      } else {\r\n        newWidth = newHeight * aspectRatio;\r\n      }\r\n    }\r\n\r\n    // Apply new dimensions to parent element\r\n    parentElement.style.width = `${newWidth}px`;\r\n    parentElement.style.height = `${newHeight}px`;\r\n\r\n    // Dispatch resize event\r\n    this.dispatchEvent(new CustomEvent('resize', {\r\n      detail: {\r\n        width: newWidth,\r\n        height: newHeight,\r\n        handle: this.resizeHandle\r\n      },\r\n      bubbles: true,\r\n      composed: true\r\n    }));\r\n  };\r\n\r\n  private handleMouseUp = () => {\r\n    if (!this.isResizing) return;\r\n\r\n    this.isResizing = false;\r\n    this.cleanup();\r\n\r\n    // Get the parent element for final dimensions\r\n    const parentElement = (this.getRootNode() as ShadowRoot).host as HTMLElement;\r\n    \r\n    // Dispatch resize end event\r\n    this.dispatchEvent(new CustomEvent('resize-end', {\r\n      detail: {\r\n        width: parentElement?.offsetWidth || 0,\r\n        height: parentElement?.offsetHeight || 0\r\n      },\r\n      bubbles: true,\r\n      composed: true\r\n    }));\r\n  };\r\n\r\n  render() {\r\n    if (!this.visible) return html``;\r\n\r\n    return html`\r\n      <div class=\"resize-border\"></div>\r\n      <div class=\"resize-handle nw\"></div>\r\n      <div class=\"resize-handle ne\"></div>\r\n      <div class=\"resize-handle sw\"></div>\r\n      <div class=\"resize-handle se\"></div>\r\n      <div class=\"resize-handle n\"></div>\r\n      <div class=\"resize-handle s\"></div>\r\n      <div class=\"resize-handle w\"></div>\r\n      <div class=\"resize-handle e\"></div>\r\n    `;\r\n  }\r\n}\r\n\r\ndeclare global {\r\n  interface HTMLElementTagNameMap {\r\n    'node-resizer': NodeResizer;\r\n  }\r\n}\r\n","/**\r\n * FlowNode - Basic node component\r\n * Represents a draggable node in the flow diagram\r\n */\r\n\r\nimport { LitElement, html, css, CSSResult } from 'lit';\r\nimport { customElement, property } from 'lit/decorators.js';\r\nimport type { XYPosition } from '../core/types';\r\nimport type { FlowInstance } from '../core/flow-instance';\r\nimport './node-resizer';\r\n\r\n@customElement('flow-node')\r\nexport class FlowNode extends LitElement {\r\n  static styles: CSSResult | CSSResult[] = css`\r\n    :host {\r\n      position: absolute;\r\n      border: 1px solid var(--flow-node-border, #ddd);\r\n      border-radius: 8px;\r\n      background: var(--flow-node-background, white);\r\n      padding: 10px 20px;\r\n      cursor: grab;\r\n      user-select: none;\r\n      box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\r\n      transition: box-shadow 0.2s;\r\n      transform-origin: 0 0;\r\n      will-change: transform;\r\n      pointer-events: auto;\r\n    }\r\n\r\n    :host([dragging]) {\r\n      cursor: grabbing;\r\n      box-shadow: 0 8px 16px rgba(0, 0, 0, 0.25);\r\n    }\r\n\r\n    :host(:hover) {\r\n      box-shadow: 0 4px 6px rgba(0, 0, 0, 0.15);\r\n    }\r\n\r\n    :host([selected]) {\r\n      border-color: var(--flow-node-selected-border, #1a73e8);\r\n      box-shadow: 0 0 0 2px rgba(26, 115, 232, 0.3);\r\n    }\r\n\r\n    .node-content {\r\n      display: flex;\r\n      align-items: center;\r\n      gap: 8px;\r\n    }\r\n\r\n    .handle {\r\n      position: absolute;\r\n      width: 10px;\r\n      height: 10px;\r\n      border-radius: 50%;\r\n      background: var(--flow-handle-bg, #fff);\r\n      border: 1px solid var(--flow-handle-border, #1a73e8);\r\n      box-shadow: 0 0 0 1px rgba(26, 115, 232, 0.15);\r\n      cursor: crosshair;\r\n      pointer-events: auto;\r\n    }\r\n\r\n    .handle.source {\r\n      right: -5px;\r\n      top: 50%;\r\n      transform: translateY(-50%);\r\n    }\r\n\r\n    .handle.target {\r\n      left: -5px;\r\n      top: 50%;\r\n      transform: translateY(-50%);\r\n    }\r\n  `;\r\n\r\n  @property({ type: String, reflect: true }) id = '';\r\n  @property({ type: Object }) data: any = {};\r\n  @property({ type: Object }) position: XYPosition = { x: 0, y: 0 };\r\n  @property({ type: Boolean, reflect: true }) selected = false;\r\n  @property({ type: Boolean, reflect: true }) dragging = false;\r\n  @property({ type: Boolean }) draggable = true;\r\n  @property({ type: Object }) instance?: FlowInstance;\r\n  @property({ type: Boolean }) resizable = false;\r\n\r\n  private isDragging = false;\r\n  private dragStart: XYPosition = { x: 0, y: 0 };\r\n  private nodeStart: XYPosition = { x: 0, y: 0 };\r\n  private lastMeasured: { width: number; height: number } | null = null;\r\n\r\n  firstUpdated() {\r\n    if (this.draggable) {\r\n      this.addEventListener('mousedown', this.handleMouseDown);\r\n    }\r\n    this.addEventListener('click', this.handleClick);\r\n    this.addEventListener('wheel', this.handleWheel, { passive: false });\r\n    if (this.resizable) {\r\n      this.addEventListener('resize', this.handleResize as EventListener);\r\n      this.addEventListener('resize-end', this.handleResizeEnd as EventListener);\r\n    }\r\n    this.updateMeasuredSize();\r\n  }\r\n\r\n  disconnectedCallback() {\r\n    super.disconnectedCallback();\r\n    this.removeEventListener('mousedown', this.handleMouseDown);\r\n    this.removeEventListener('click', this.handleClick);\r\n    this.removeEventListener('wheel', this.handleWheel);\r\n    if (this.resizable) {\r\n      this.removeEventListener('resize', this.handleResize as EventListener);\r\n      this.removeEventListener('resize-end', this.handleResizeEnd as EventListener);\r\n    }\r\n    this.cleanup();\r\n  }\r\n\r\n  /**\r\n   * Find the nearest scrollable parent element\r\n   */\r\n  private findScrollableElement(element: Element | null): HTMLElement | null {\r\n    if (!element || !(element instanceof HTMLElement)) return null;\r\n    \r\n    // Check if element has the nowheel class (explicitly marked as non-pannable)\r\n    if (element.classList.contains('nowheel')) {\r\n      return element;\r\n    }\r\n    \r\n    // Check computed styles for overflow\r\n    const style = window.getComputedStyle(element);\r\n    const overflow = style.overflow + style.overflowX + style.overflowY;\r\n    if (overflow.includes('auto') || overflow.includes('scroll')) {\r\n      // Check if element is actually scrollable (has scrollable content)\r\n      if (element.scrollHeight > element.clientHeight || element.scrollWidth > element.clientWidth) {\r\n        return element;\r\n      }\r\n    }\r\n    \r\n    // Check parent, but stop at this node's boundary (don't traverse outside the component)\r\n    const parent = element.parentElement;\r\n    if (parent && (parent === this || parent.closest('flow-node') === this || this.shadowRoot?.contains(parent))) {\r\n      return this.findScrollableElement(parent);\r\n    }\r\n    \r\n    return null;\r\n  }\r\n\r\n  /**\r\n   * Handle wheel events to prevent panning when scrolling inside scrollable content\r\n   */\r\n  private handleWheel = (e: WheelEvent) => {\r\n    // Use composedPath to get the actual event path through shadow boundaries\r\n    const path = e.composedPath();\r\n    \r\n    // Find the first scrollable element in the event path\r\n    let scrollableEl: HTMLElement | null = null;\r\n    for (const element of path) {\r\n      if (element instanceof Element) {\r\n        scrollableEl = this.findScrollableElement(element);\r\n        if (scrollableEl) break;\r\n      }\r\n    }\r\n    \r\n    if (scrollableEl) {\r\n      // Check if the scrollable element can actually scroll in this direction\r\n      const canScrollVertically = \r\n        (e.deltaY < 0 && scrollableEl.scrollTop > 0) ||\r\n        (e.deltaY > 0 && scrollableEl.scrollTop < scrollableEl.scrollHeight - scrollableEl.clientHeight);\r\n      \r\n      const canScrollHorizontally = \r\n        (e.deltaX < 0 && scrollableEl.scrollLeft > 0) ||\r\n        (e.deltaX > 0 && scrollableEl.scrollLeft < scrollableEl.scrollWidth - scrollableEl.clientWidth);\r\n      \r\n      // If we can scroll in the direction of the wheel event, prevent panning\r\n      if (canScrollVertically || canScrollHorizontally) {\r\n        // Stop propagation to prevent panning, but allow default scrolling behavior\r\n        e.stopPropagation();\r\n      }\r\n    }\r\n  };\r\n\r\n  private handleClick = (e: MouseEvent) => {\r\n    e.stopPropagation();\r\n    if (!this.isDragging && this.instance) {\r\n      // Toggle selection\r\n      const newSelected = !this.selected;\r\n      this.instance.updateNode(this.id, { selected: newSelected });\r\n      \r\n      // Dispatch selection event\r\n      this.dispatchEvent(new CustomEvent('node-select', {\r\n        detail: { \r\n          nodeId: this.id, \r\n          selected: newSelected,\r\n          node: {\r\n            id: this.id,\r\n            data: this.data,\r\n            position: this.position,\r\n            selected: newSelected\r\n          }\r\n        },\r\n        bubbles: true,\r\n        composed: true\r\n      }));\r\n    }\r\n  };\r\n\r\n  private handleResize = (e: Event) => {\r\n    const { width, height } = (e as CustomEvent).detail;\r\n    \r\n    // Update node dimensions in the instance\r\n    if (this.instance) {\r\n      this.instance.updateNode(this.id, { \r\n        width: width,\r\n        height: height,\r\n        measured: { width, height }\r\n      });\r\n    }\r\n  };\r\n\r\n  private handleResizeEnd = (e: Event) => {\r\n    const { width, height } = (e as CustomEvent).detail;\r\n    \r\n    // Final update with new dimensions\r\n    if (this.instance) {\r\n      this.instance.updateNode(this.id, { \r\n        width: width,\r\n        height: height,\r\n        measured: { width, height }\r\n      });\r\n    }\r\n\r\n    // Dispatch resize end event\r\n    this.dispatchEvent(new CustomEvent('node-resize-end', {\r\n      detail: {\r\n        nodeId: this.id,\r\n        width: width,\r\n        height: height\r\n      },\r\n      bubbles: true,\r\n      composed: true\r\n    }));\r\n  };\r\n\r\n  private handleMouseDown = (e: MouseEvent) => {\r\n    if (!this.draggable || e.button !== 0) return;\r\n    \r\n    // Check if the event is coming from a resize handle or node-resizer\r\n    const target = e.target as HTMLElement;\r\n    \r\n    // Check if the event originated from a resize handle or node-resizer\r\n    const isFromResizeHandle = target.classList.contains('resize-handle') || \r\n                              target.tagName === 'NODE-RESIZER' ||\r\n                              target.closest('node-resizer') !== null;\r\n    \r\n    if (isFromResizeHandle) {\r\n      return; // Don't start dragging if clicking on resize handle\r\n    }\r\n    \r\n    e.preventDefault();\r\n    e.stopPropagation();\r\n    \r\n    this.isDragging = false;\r\n    this.dragStart = { x: e.clientX, y: e.clientY };\r\n    this.nodeStart = { ...this.position };\r\n\r\n    document.addEventListener('mousemove', this.handleMouseMove);\r\n    document.addEventListener('mouseup', this.handleMouseUp);\r\n  };\r\n\r\n  private handleMouseMove = (e: MouseEvent) => {\r\n    const dx = e.clientX - this.dragStart.x;\r\n    const dy = e.clientY - this.dragStart.y;\r\n    \r\n    // Start dragging if moved more than 3px\r\n    if (!this.isDragging && (Math.abs(dx) > 3 || Math.abs(dy) > 3)) {\r\n      this.isDragging = true;\r\n      this.dragging = true;\r\n      if (this.instance) {\r\n        this.instance.updateNode(this.id, { dragging: true });\r\n      }\r\n    }\r\n\r\n    if (this.isDragging && this.instance) {\r\n      const viewport = this.instance.getViewport();\r\n      const newPosition = {\r\n        x: this.nodeStart.x + dx / viewport.zoom,\r\n        y: this.nodeStart.y + dy / viewport.zoom\r\n      };\r\n      \r\n      this.instance.updateNode(this.id, { position: newPosition });\r\n    }\r\n  };\r\n\r\n  private handleMouseUp = () => {\r\n    if (this.isDragging && this.instance) {\r\n      this.instance.updateNode(this.id, { dragging: false });\r\n    }\r\n    \r\n    this.cleanup();\r\n    \r\n    // Small delay to prevent click event after drag\r\n    setTimeout(() => {\r\n      this.isDragging = false;\r\n      this.dragging = false;\r\n    }, 50);\r\n  };\r\n\r\n  private cleanup() {\r\n    document.removeEventListener('mousemove', this.handleMouseMove);\r\n    document.removeEventListener('mouseup', this.handleMouseUp);\r\n  }\r\n\r\n  render() {\r\n    return html`\r\n      <div class=\"node-container\">\r\n        <div class=\"node-content\">\r\n          ${this.data?.label || 'Node'}\r\n        </div>\r\n        <div \r\n          class=\"handle target\" \r\n          data-handle=\"target\" \r\n          data-node-id=${this.id}\r\n          @mousedown=${this.onHandleMouseDown('target')}\r\n        ></div>\r\n        <div \r\n          class=\"handle source\" \r\n          data-handle=\"source\" \r\n          data-node-id=${this.id}\r\n          @mousedown=${this.onHandleMouseDown('source')}\r\n        ></div>\r\n      </div>\r\n      ${this.resizable ? html`\r\n        <node-resizer\r\n          .visible=${this.selected}\r\n          min-width=\"50\"\r\n          min-height=\"30\"\r\n          max-width=\"500\"\r\n          max-height=\"300\"\r\n        ></node-resizer>\r\n      ` : ''}\r\n    `;\r\n  }\r\n\r\n  updated(changedProperties: Map<string | number | symbol, unknown>) {\r\n    super.updated(changedProperties);\r\n    this.style.transform = `translate(${this.position.x}px, ${this.position.y}px)`;\r\n    this.updateMeasuredSize();\r\n    \r\n    if (changedProperties.has('resizable')) {\r\n      console.log('FlowNode resizable changed:', this.resizable);\r\n    }\r\n  }\r\n\r\n  private updateMeasuredSize() {\r\n    if (!this.instance) return;\r\n    const rect = this.getBoundingClientRect();\r\n    const zoom = this.instance.getViewport().zoom || 1;\r\n    const width = rect.width / zoom;\r\n    const height = rect.height / zoom;\r\n\r\n    const changed =\r\n      !this.lastMeasured ||\r\n      Math.abs(this.lastMeasured.width - width) > 0.5 ||\r\n      Math.abs(this.lastMeasured.height - height) > 0.5;\r\n\r\n    if (changed) {\r\n      this.lastMeasured = { width, height };\r\n      this.instance.updateNode(this.id, { measured: { width, height }, width, height });\r\n    }\r\n  }\r\n\r\n  private onHandleMouseDown(type: 'source' | 'target') {\r\n    return (e: MouseEvent) => {\r\n      e.stopPropagation();\r\n      e.preventDefault();\r\n      this.dispatchEvent(new CustomEvent('handle-start', {\r\n        detail: { nodeId: this.id, type },\r\n        bubbles: true,\r\n        composed: true\r\n      }));\r\n    };\r\n  }\r\n}\r\n\r\ndeclare global {\r\n  interface HTMLElementTagNameMap {\r\n    'flow-node': FlowNode;\r\n  }\r\n}\r\n\r\n","/**\r\n * FlowEdge - Edge component for connecting nodes\r\n * Renders SVG paths between nodes\r\n */\r\n\r\nimport { LitElement, html, css, svg } from 'lit';\r\nimport { customElement, property } from 'lit/decorators.js';\r\nimport { getBezierPath, getSmoothStepPath, getStraightPath, Position } from '../utils/geometry';\r\nimport type { Node, MarkerSpec, EdgeType } from '../core/types';\r\n\r\n@customElement('flow-edge')\r\nexport class FlowEdge extends LitElement {\r\n  // Render in light DOM so marker defs in parent shadow root are addressable\r\n  /*\r\n  protected createRenderRoot() {\r\n    return this;\r\n  }\r\n  */\r\n  static styles = css`\r\n    :host {\r\n      position: absolute;\r\n      top: 0;\r\n      left: 0;\r\n      width: 100%;\r\n      height: 100%;\r\n    }\r\n\r\n    svg {\r\n      position: absolute;\r\n      top: 0;\r\n      left: 0;\r\n      width: 100%;\r\n      height: 100%;\r\n      overflow: visible;\r\n    }\r\n\r\n    .edge-path {\r\n      fill: none;\r\n      stroke: var(--flow-edge-color, #b1b1b7);\r\n      stroke-width: 3;\r\n      cursor: pointer;\r\n      pointer-events: stroke;\r\n    }\r\n\r\n    .edge-path:hover {\r\n      stroke: var(--flow-edge-selected-color, #1a73e8);\r\n    }\r\n\r\n    .edge-path.selected {\r\n      stroke: var(--flow-edge-selected-color, #1a73e8);\r\n    }\r\n\r\n    .edge-path.animated {\r\n      stroke-dasharray: 5;\r\n      animation: dashdraw 0.5s linear infinite;\r\n    }\r\n\r\n    .edge-label {\r\n      pointer-events: none;\r\n      user-select: none;\r\n      fill: #333;\r\n      font-size: 12px;\r\n    }\r\n\r\n    @keyframes dashdraw {\r\n      to {\r\n        stroke-dashoffset: -10;\r\n      }\r\n    }\r\n  `;\r\n\r\n  @property({ type: String }) id = '';\r\n  @property({ type: String }) source = '';\r\n  @property({ type: String }) target = '';\r\n  @property({ type: String }) sourceHandle?: string;\r\n  @property({ type: String }) targetHandle?: string;\r\n  @property({ type: Object }) sourceNode?: Node;\r\n  @property({ type: Object }) targetNode?: Node;\r\n  @property({ type: Boolean }) animated = false;\r\n  @property({ type: Boolean }) selected = false;\r\n  @property({ type: String }) label = '';\r\n  @property({ type: String }) type: EdgeType = 'default';\r\n  @property({ type: Object }) markerStart?: MarkerSpec | string;\r\n  @property({ type: Object }) markerEnd?: MarkerSpec | string;\r\n\r\n  private markerHandleHalf = 5; // half of node handle diameter (10px)\r\n\r\n  /**\r\n   * Create marker ID from marker spec\r\n   */\r\n  private getMarkerId(spec: MarkerSpec | string | undefined): string | undefined {\r\n    if (!spec) return undefined;\r\n    if (typeof spec === 'string') return spec;\r\n    \r\n    const key = this.normalizeMarkerSpec(spec);\r\n    return `marker-${this.hashString(key)}`;\r\n  }\r\n\r\n  /**\r\n   * Create marker SVG from marker spec\r\n   */\r\n  private createMarkerSVG(id: string, spec: MarkerSpec): string {\r\n    if (spec.type === 'custom') {\r\n      const width = spec.width ?? 10;\r\n      const height = spec.height ?? 10;\r\n      const refX = (spec.refX ?? width) + this.markerHandleHalf;\r\n      const refY = spec.refY ?? height / 2;\r\n      const color = spec.color ?? 'currentColor';\r\n      const orient = spec.orient ?? 'auto';\r\n      return `<marker id=\"${id}\" markerWidth=\"${width}\" markerHeight=\"${height}\" refX=\"${refX}\" refY=\"${refY}\" orient=\"${orient}\" markerUnits=\"userSpaceOnUse\"><path d=\"${spec.path}\" fill=\"${color}\" stroke=\"${color}\"/></marker>`;\r\n    }\r\n    \r\n    const width = spec.width ?? 10;\r\n    const height = spec.height ?? 10;\r\n    const orient = spec.orient ?? 'auto';\r\n    const color = spec.color ?? 'currentColor';\r\n    const refX = (spec.type === 'ArrowClosed' ? width : width) + this.markerHandleHalf;\r\n    const refY = height / 2;\r\n    \r\n    if (spec.type === 'ArrowClosed') {\r\n      // Triangle pointing right with tip at (width, height/2)\r\n      const path = `M0,0 L${width},${refY} L0,${height} Z`;\r\n      return `<marker id=\"${id}\" markerWidth=\"${width}\" markerHeight=\"${height}\" refX=\"${refX}\" refY=\"${refY}\" orient=\"${orient}\" markerUnits=\"userSpaceOnUse\"><path d=\"${path}\" fill=\"${color}\"/></marker>`;\r\n    }\r\n    \r\n    // Arrow (open) -> V shape stroke\r\n    const path = `M0,0 L${width},${refY} L0,${height}`;\r\n    return `<marker id=\"${id}\" markerWidth=\"${width}\" markerHeight=\"${height}\" refX=\"${refX}\" refY=\"${refY}\" orient=\"${orient}\" markerUnits=\"userSpaceOnUse\"><path d=\"${path}\" fill=\"none\" stroke=\"${color}\" stroke-width=\"2\"/></marker>`;\r\n  }\r\n\r\n  /**\r\n   * Normalize marker spec to a string key for caching\r\n   */\r\n  private normalizeMarkerSpec(spec: MarkerSpec): string {\r\n    if (spec.type === 'custom') {\r\n      const { path, width = 20, height = 20, refX = 20, refY = 10, orient = 'auto', color = 'currentColor' } = spec;\r\n      return `custom|p=${path}|w=${width}|h=${height}|rx=${refX}|ry=${refY}|o=${orient}|c=${color}`;\r\n    }\r\n    const { width = 20, height = 20, orient = 'auto', color = 'currentColor' } = spec;\r\n    return `builtin|${spec.type}|w=${width}|h=${height}|o=${orient}|c=${color}`;\r\n  }\r\n\r\n  /**\r\n   * Simple hash function for generating unique IDs\r\n   */\r\n  private hashString(input: string): string {\r\n    let h = 0;\r\n    for (let i = 0; i < input.length; i++) {\r\n      h = (h << 5) - h + input.charCodeAt(i);\r\n      h |= 0;\r\n    }\r\n    return Math.abs(h).toString(36);\r\n  }\r\n\r\n  /**\r\n   * Get path based on edge type\r\n   */\r\n  private getPathForType(source: any, target: any): [path: string, labelX: number, labelY: number, offsetX: number, offsetY: number] {\r\n    const sourceX = source.x;\r\n    const sourceY = source.y;\r\n    const targetX = target.x;\r\n    const targetY = target.y;\r\n    const sourcePosition = source.position;\r\n    const targetPosition = target.position;\r\n\r\n    switch (this.type) {\r\n      case 'straight':\r\n        return getStraightPath({\r\n          sourceX,\r\n          sourceY,\r\n          targetX,\r\n          targetY,\r\n        });\r\n      \r\n      case 'smoothstep':\r\n        return getSmoothStepPath({\r\n          sourceX,\r\n          sourceY,\r\n          sourcePosition,\r\n          targetX,\r\n          targetY,\r\n          targetPosition,\r\n        });\r\n      \r\n      case 'step':\r\n        return getSmoothStepPath({\r\n          sourceX,\r\n          sourceY,\r\n          sourcePosition,\r\n          targetX,\r\n          targetY,\r\n          targetPosition,\r\n          borderRadius: 0, // Step edges have no border radius\r\n        });\r\n      \r\n      case 'simplebezier':\r\n        return getBezierPath({\r\n          sourceX,\r\n          sourceY,\r\n          sourcePosition,\r\n          targetX,\r\n          targetY,\r\n          targetPosition,\r\n          curvature: 0.5, // Simple bezier with fixed curvature\r\n        });\r\n      \r\n      case 'default':\r\n      default:\r\n        return getBezierPath({\r\n          sourceX,\r\n          sourceY,\r\n          sourcePosition,\r\n          targetX,\r\n          targetY,\r\n          targetPosition,\r\n        });\r\n    }\r\n  }\r\n\r\n  /** Returns the ShadowRoot of the parent flow-canvas */\r\n  private getFlowCanvasRoot(): ShadowRoot | null {\r\n    const root = this.getRootNode();\r\n    return root instanceof ShadowRoot ? root : null;\r\n  }\r\n\r\n  /** Returns the flow-canvas host element (if available) */\r\n  private getFlowCanvasHost(): HTMLElement | null {\r\n    const root = this.getFlowCanvasRoot();\r\n    // root.host will be the <flow-canvas> instance\r\n    return (root && (root as any).host) || null;\r\n  }\r\n\r\n  /**\r\n   * Find a specific handle element within a node\r\n   */\r\n  private findHandleElement(nodeId: string, handleId: string): HTMLElement | null {\r\n    // Look up the node element by id inside the flow-canvas shadowRoot\r\n    const canvasRoot = this.getFlowCanvasRoot();\r\n    if (!canvasRoot) return null;\r\n\r\n    const node = canvasRoot.querySelector(`[id=\"${CSS.escape(nodeId)}\"]`) as HTMLElement | null;\r\n    if (!node) return null; // node not rendered yet\r\n\r\n    // Look in shadow root first, then light DOM\r\n    const shadowRoot = node.shadowRoot;\r\n    let handle: HTMLElement | null = null;\r\n    \r\n    if (shadowRoot) {\r\n      handle = shadowRoot.querySelector(`[data-handle-id=\"${CSS.escape(handleId)}\"]`) as HTMLElement;\r\n    }\r\n    \r\n    if (!handle) {\r\n      handle = node.querySelector(`[data-handle-id=\"${CSS.escape(handleId)}\"]`) as HTMLElement;\r\n    }\r\n    \r\n    return handle;\r\n  }\r\n\r\n  /**\r\n   * Get the canvas coordinates of a specific handle\r\n   */\r\n  private getHandlePosition(nodeId: string, handleId: string): { x: number; y: number } | null {\r\n    const handleEl = this.findHandleElement(nodeId, handleId);\r\n    if (!handleEl) return null;\r\n\r\n    // Get the node element\r\n    const canvasRoot = this.getFlowCanvasRoot();\r\n    if (!canvasRoot) return null;\r\n    \r\n    const nodeEl = canvasRoot.querySelector(`[id=\"${CSS.escape(nodeId)}\"]`) as HTMLElement | null;\r\n    if (!nodeEl) return null;\r\n\r\n    // Get handle's offset relative to node\r\n    // Handles are positioned absolutely within nodes\r\n    const nodeRect = nodeEl.getBoundingClientRect();\r\n    const handleRect = handleEl.getBoundingClientRect();\r\n    \r\n    // Get node's canvas position from its position property\r\n    // Since nodeEl is already transformed by viewport, we need the original position\r\n    const node = this.sourceNode?.id === nodeId ? this.sourceNode : this.targetNode;\r\n    if (!node) return null;\r\n\r\n    // Calculate handle offset within the node (in unscaled pixels)\r\n    const nodeWidth = node.measured?.width || node.width || 150;\r\n    const nodeHeight = node.measured?.height || node.height || 50;\r\n    \r\n    // Get viewport to calculate scale factor\r\n    const flowCanvas = this.getFlowCanvasHost() as any;\r\n    const viewport = flowCanvas?.viewport || { x: 0, y: 0, zoom: 1 };\r\n    const zoom = viewport.zoom || 1;\r\n    \r\n    // Calculate offset from node's top-left in canvas coordinates\r\n    const offsetX = (handleRect.left + handleRect.width / 2 - nodeRect.left) / zoom;\r\n    const offsetY = (handleRect.top + handleRect.height / 2 - nodeRect.top) / zoom;\r\n    \r\n    return {\r\n      x: node.position.x + offsetX,\r\n      y: node.position.y + offsetY\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Get the source position (handle or node edge)\r\n   */\r\n  private getSourcePosition(): { x: number; y: number; position: Position } {\r\n    // Try to get specific handle position\r\n    if (this.sourceHandle && this.sourceNode) {\r\n      const handlePos = this.getHandlePosition(this.sourceNode.id, this.sourceHandle);\r\n      if (handlePos) {\r\n        return { ...handlePos, position: Position.Right };\r\n      }\r\n    }\r\n\r\n    // Fall back to node right edge center\r\n    const sourceWidth = this.sourceNode!.measured?.width || this.sourceNode!.width || 150;\r\n    const sourceHeight = this.sourceNode!.measured?.height || this.sourceNode!.height || 50;\r\n    return {\r\n      x: this.sourceNode!.position.x + sourceWidth,\r\n      y: this.sourceNode!.position.y + sourceHeight / 2,\r\n      position: Position.Right\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Get the target position (handle or node edge)\r\n   */\r\n  private getTargetPosition(): { x: number; y: number; position: Position } {\r\n    // Try to get specific handle position\r\n    if (this.targetHandle && this.targetNode) {\r\n      const handlePos = this.getHandlePosition(this.targetNode.id, this.targetHandle);\r\n      if (handlePos) {\r\n        return { ...handlePos, position: Position.Left };\r\n      }\r\n    }\r\n\r\n    // Fall back to node left edge center\r\n    const targetHeight = this.targetNode!.measured?.height || this.targetNode!.height || 50;\r\n    return {\r\n      x: this.targetNode!.position.x,\r\n      y: this.targetNode!.position.y + targetHeight / 2,\r\n      position: Position.Left\r\n    };\r\n  }\r\n\r\n  render() {\r\n    if (!this.sourceNode || !this.targetNode) {\r\n      return html``;\r\n    }\r\n\r\n    // Get source and target positions (handles or node edges)\r\n    const source = this.getSourcePosition();\r\n    const target = this.getTargetPosition();\r\n\r\n    // Get path based on edge type\r\n    const [path, labelX, labelY, offsetX, offsetY] = this.getPathForType(source, target);\r\n\r\n    const pathClasses = [\r\n      'edge-path',\r\n      this.animated && 'animated',\r\n      this.selected && 'selected'\r\n    ].filter(Boolean).join(' ');\r\n    \r\n    // Create markers from specs\r\n    const markerStartId = this.getMarkerId(this.markerStart);\r\n    const markerEndId = this.getMarkerId(this.markerEnd);\r\n    \r\n    const markerStart = markerStartId ? `url(#${markerStartId})` : undefined;\r\n    const markerEnd = markerEndId ? `url(#${markerEndId})` : undefined;\r\n\r\n    const dashAttr = this.animated ? '5' : '';\r\n\r\n    return html`\r\n      <svg style=\"position:absolute; top:0; left:0; width:100%; height:100%; overflow:visible\">\r\n        <defs>\r\n          ${markerStartId && typeof this.markerStart === 'object' ? \r\n            svg`<marker id=\"${markerStartId}\" markerWidth=\"${this.markerStart.width || 10}\" markerHeight=\"${this.markerStart.height || 10}\" refX=\"${((this.markerStart.type === 'custom' ? (this.markerStart as any).refX : undefined) || this.markerStart.width || 10) + this.markerHandleHalf}\" refY=\"${(this.markerStart.type === 'custom' ? (this.markerStart as any).refY : undefined) || (this.markerStart.height || 10) / 2}\" orient=\"${this.markerStart.orient || 'auto'}\" markerUnits=\"userSpaceOnUse\">\r\n              ${this.markerStart.type === 'custom' ? \r\n                svg`<path d=\"${(this.markerStart as any).path}\" fill=\"${this.markerStart.color || 'currentColor'}\" stroke=\"${this.markerStart.color || 'currentColor'}\"/>` :\r\n                this.markerStart.type === 'ArrowClosed' ?\r\n                  svg`<path d=\"M0,0 L${this.markerStart.width || 10},${(this.markerStart.height || 10) / 2} L0,${this.markerStart.height || 10} Z\" fill=\"${this.markerStart.color || 'currentColor'}\"/>` :\r\n                  svg`<path d=\"M0,0 L${this.markerStart.width || 10},${(this.markerStart.height || 10) / 2} L0,${this.markerStart.height || 10}\" fill=\"none\" stroke=\"${this.markerStart.color || 'currentColor'}\" stroke-width=\"2\"/>`\r\n              }\r\n            </marker>` : \r\n            ''}\r\n          ${markerEndId && typeof this.markerEnd === 'object' ? \r\n            svg`<marker id=\"${markerEndId}\" markerWidth=\"${this.markerEnd.width || 10}\" markerHeight=\"${this.markerEnd.height || 10}\" refX=\"${((this.markerEnd.type === 'custom' ? (this.markerEnd as any).refX : undefined) || this.markerEnd.width || 10) + this.markerHandleHalf}\" refY=\"${(this.markerEnd.type === 'custom' ? (this.markerEnd as any).refY : undefined) || (this.markerEnd.height || 10) / 2}\" orient=\"${this.markerEnd.orient || 'auto'}\" markerUnits=\"userSpaceOnUse\">\r\n              ${this.markerEnd.type === 'custom' ? \r\n                svg`<path d=\"${(this.markerEnd as any).path}\" fill=\"${this.markerEnd.color || 'currentColor'}\" stroke=\"${this.markerEnd.color || 'currentColor'}\"/>` :\r\n                this.markerEnd.type === 'ArrowClosed' ?\r\n                  svg`<path d=\"M0,0 L${this.markerEnd.width || 10},${(this.markerEnd.height || 10) / 2} L0,${this.markerEnd.height || 10} Z\" fill=\"${this.markerEnd.color || 'currentColor'}\"/>` :\r\n                  svg`<path d=\"M0,0 L${this.markerEnd.width || 10},${(this.markerEnd.height || 10) / 2} L0,${this.markerEnd.height || 10}\" fill=\"none\" stroke=\"${this.markerEnd.color || 'currentColor'}\" stroke-width=\"2\"/>`\r\n              }\r\n            </marker>` : \r\n            ''}\r\n        </defs>\r\n        ${svg`\r\n          <path \r\n            class=\"${pathClasses}\"\r\n            d=\"${path}\"\r\n            stroke-dasharray=\"${dashAttr}\"\r\n            marker-start=\"${markerStart ?? ''}\"\r\n            marker-end=\"${markerEnd ?? ''}\"\r\n            @click=${this.handleClick}\r\n          />\r\n          ${this.label ? svg`\r\n            <text \r\n              x=\"${labelX}\" \r\n              y=\"${labelY}\" \r\n              text-anchor=\"middle\"\r\n              dy=\"-5\"\r\n              fill=\"#333\"\r\n              style=\"user-select:none; pointer-events:none; font-size:12px;\"\r\n            >\r\n              ${this.label}\r\n            </text>\r\n          ` : ''}\r\n        `}\r\n      </svg>\r\n    `;\r\n  }\r\n\r\n  private handleClick(e: MouseEvent) {\r\n    console.log('handleClick', e);\r\n    e.stopPropagation();\r\n    \r\n    // Toggle selection\r\n    const newSelected = !this.selected;\r\n    this.selected = newSelected;\r\n    \r\n    // Dispatch selection event\r\n    this.dispatchEvent(new CustomEvent('edge-select', {\r\n      detail: { \r\n        edgeId: this.id,\r\n        selected: newSelected,\r\n        edge: {\r\n          id: this.id,\r\n          source: this.source,\r\n          target: this.target,\r\n          sourceHandle: this.sourceHandle,\r\n          targetHandle: this.targetHandle,\r\n          label: this.label,\r\n          animated: this.animated,\r\n          selected: newSelected\r\n        }\r\n      },\r\n      bubbles: true,\r\n      composed: true\r\n    }));\r\n  }\r\n}\r\n\r\ndeclare global {\r\n  interface HTMLElementTagNameMap {\r\n    'flow-edge': FlowEdge;\r\n  }\r\n}\r\n\r\n","/**\r\n * FlowBackground - Background pattern component\r\n * Provides dots or lines pattern for the flow canvas\r\n */\r\n\r\nimport { LitElement, html, css, svg } from 'lit';\r\nimport { customElement, property } from 'lit/decorators.js';\r\n\r\nexport type BackgroundVariant = 'dots' | 'lines' | 'cross';\r\n\r\n@customElement('flow-background')\r\nexport class FlowBackground extends LitElement {\r\n  static styles = css`\r\n    :host {\r\n      position: absolute;\r\n      inset: 0;\r\n      pointer-events: none;\r\n      z-index: 0;\r\n    }\r\n\r\n    svg {\r\n      width: 100%;\r\n      height: 100%;\r\n    }\r\n  `;\r\n\r\n  @property({ type: String }) variant: BackgroundVariant = 'dots';\r\n  @property({ type: Number }) gap = 20;\r\n  @property({ type: String }) color = '#ddd';\r\n  @property({ type: Number }) size = 1;\r\n\r\n  render() {\r\n    const patternId = `flow-bg-pattern-${Math.random().toString(36).substr(2, 9)}`;\r\n    \r\n    return html`\r\n      <svg>\r\n        <defs>\r\n          ${this.variant === 'dots' ? this.renderDotsPattern(patternId) : this.renderLinesPattern(patternId)}\r\n        </defs>\r\n        <rect width=\"100%\" height=\"100%\" fill=\"url(#${patternId})\" />\r\n      </svg>\r\n    `;\r\n  }\r\n\r\n  private renderDotsPattern(id: string) {\r\n    return svg`\r\n      <pattern id=\"${id}\" x=\"0\" y=\"0\" width=\"${this.gap}\" height=\"${this.gap}\" patternUnits=\"userSpaceOnUse\">\r\n        <circle cx=\"${this.size}\" cy=\"${this.size}\" r=\"${this.size}\" fill=\"${this.color}\" />\r\n      </pattern>\r\n    `;\r\n  }\r\n\r\n  private renderLinesPattern(id: string) {\r\n    return svg`\r\n      <pattern id=\"${id}\" x=\"0\" y=\"0\" width=\"${this.gap}\" height=\"${this.gap}\" patternUnits=\"userSpaceOnUse\">\r\n        <path d=\"M ${this.gap} 0 L 0 0 0 ${this.gap}\" fill=\"none\" stroke=\"${this.color}\" stroke-width=\"${this.size}\" />\r\n      </pattern>\r\n    `;\r\n  }\r\n}\r\n\r\ndeclare global {\r\n  interface HTMLElementTagNameMap {\r\n    'flow-background': FlowBackground;\r\n  }\r\n}\r\n\r\n","/**\r\n * FlowMinimap - Miniature overview component\r\n * Shows a small overview of the entire flow with viewport indicator\r\n */\r\n\r\nimport { LitElement, html, css } from 'lit';\r\nimport { customElement, property } from 'lit/decorators.js';\r\n\r\n@customElement('flow-minimap')\r\nexport class FlowMinimap extends LitElement {\r\n  static styles = css`\r\n    :host {\r\n      position: absolute;\r\n      bottom: 20px;\r\n      right: 20px;\r\n      width: 200px;\r\n      height: 150px;\r\n      background: white;\r\n      border: 1px solid #ddd;\r\n      border-radius: 8px;\r\n      box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\r\n      overflow: hidden;\r\n      z-index: 10;\r\n    }\r\n\r\n    .minimap-container {\r\n      width: 100%;\r\n      height: 100%;\r\n      position: relative;\r\n    }\r\n\r\n    .viewport-indicator {\r\n      position: absolute;\r\n      border: 2px solid #1a73e8;\r\n      background: rgba(26, 115, 232, 0.1);\r\n      pointer-events: none;\r\n    }\r\n  `;\r\n\r\n  @property({ type: Number }) width = 200;\r\n  @property({ type: Number }) height = 150;\r\n\r\n  render() {\r\n    return html`\r\n      <div class=\"minimap-container\">\r\n        <div class=\"viewport-indicator\"></div>\r\n        <slot></slot>\r\n      </div>\r\n    `;\r\n  }\r\n}\r\n\r\ndeclare global {\r\n  interface HTMLElementTagNameMap {\r\n    'flow-minimap': FlowMinimap;\r\n  }\r\n}\r\n\r\n","/**\r\n * FlowControls - Zoom and pan controls component\r\n * Provides UI buttons for viewport manipulation\r\n */\r\n\r\nimport { LitElement, html, css } from 'lit';\r\nimport { customElement, property } from 'lit/decorators.js';\r\nimport type { FlowInstance } from '../core/flow-instance';\r\n\r\n@customElement('flow-controls')\r\nexport class FlowControls extends LitElement {\r\n  static styles = css`\r\n    :host {\r\n      position: absolute;\r\n      bottom: 20px;\r\n      left: 20px;\r\n      display: flex;\r\n      flex-direction: column;\r\n      gap: 8px;\r\n      z-index: 10;\r\n    }\r\n\r\n    button {\r\n      width: 36px;\r\n      height: 36px;\r\n      border: 1px solid #ddd;\r\n      border-radius: 4px;\r\n      background: white;\r\n      cursor: pointer;\r\n      display: flex;\r\n      align-items: center;\r\n      justify-content: center;\r\n      font-size: 18px;\r\n      transition: all 0.2s;\r\n    }\r\n\r\n    button:hover {\r\n      background: #f5f5f5;\r\n      border-color: #999;\r\n    }\r\n\r\n    button:active {\r\n      background: #e0e0e0;\r\n    }\r\n\r\n    .divider {\r\n      height: 1px;\r\n      background: #ddd;\r\n      margin: 4px 0;\r\n    }\r\n  `;\r\n\r\n  @property({ type: Object }) instance?: FlowInstance;\r\n\r\n  render() {\r\n    return html`\r\n      <button @click=${this.handleZoomIn} title=\"Zoom In\">+</button>\r\n      <button @click=${this.handleZoomOut} title=\"Zoom Out\">−</button>\r\n      <div class=\"divider\"></div>\r\n      <button @click=${this.handleFitView} title=\"Fit View\">⛶</button>\r\n    `;\r\n  }\r\n\r\n  private handleZoomIn = () => {\r\n    this.instance?.zoomIn();\r\n  };\r\n\r\n  private handleZoomOut = () => {\r\n    this.instance?.zoomOut();\r\n  };\r\n\r\n  private handleFitView = () => {\r\n    this.instance?.fitView();\r\n  };\r\n}\r\n\r\ndeclare global {\r\n  interface HTMLElementTagNameMap {\r\n    'flow-controls': FlowControls;\r\n  }\r\n}\r\n\r\n","/**\r\n * ERDTableNode - Database table node with field-level handles\r\n * Example of a custom node type for ERD diagrams\r\n */\r\n\r\nimport { html, css, CSSResult } from 'lit';\r\nimport { customElement } from 'lit/decorators.js';\r\nimport { FlowNode } from '../flow-node';\r\nimport '../node-resizer';\r\n\r\nexport interface ERDField {\r\n  name: string;\r\n  type: string;\r\n  key?: 'PK' | 'FK' | 'UK';\r\n  nullable?: boolean;\r\n}\r\n\r\nexport interface ERDTableData {\r\n  tableName: string;\r\n  fields: ERDField[];\r\n  color?: string;\r\n  size?: { width?: number; height?: number };\r\n}\r\n\r\n@customElement('erd-table-node')\r\nexport class ERDTableNode extends FlowNode {\r\n  static styles: CSSResult | CSSResult[] = [\r\n    ...(Array.isArray(super.styles) ? super.styles : [super.styles]),\r\n    css`\r\n      :host {\r\n        padding: 0;\r\n        min-width: 200px;\r\n        display: flex;\r\n        flex-direction: column;\r\n        background: var(--erd-table-bg, white);\r\n      }\r\n\r\n      .table-header {\r\n        background: var(--erd-table-header-bg, #2563eb);\r\n        color: white;\r\n        padding: 12px 16px;\r\n        font-weight: 600;\r\n        border-radius: 8px 8px 0 0;\r\n        display: flex;\r\n        align-items: center;\r\n        gap: 8px;\r\n      }\r\n\r\n      .table-icon {\r\n        font-size: 18px;\r\n      }\r\n\r\n      .table-body {\r\n        padding: 0;\r\n        overflow: auto;\r\n        /* Prevent panning when scrolling inside the table body */\r\n      }\r\n\r\n      .field-row {\r\n        display: grid;\r\n        grid-template-columns: 30px 1fr auto auto;\r\n        gap: 8px;\r\n        padding: 10px 16px;\r\n        border-bottom: 1px solid var(--erd-border, #e5e7eb);\r\n        align-items: center;\r\n        position: relative;\r\n        background: white;\r\n        transition: background 0.2s;\r\n      }\r\n\r\n      .field-row:hover {\r\n        background: var(--erd-row-hover, #f3f4f6);\r\n      }\r\n\r\n      .field-row:last-child {\r\n        border-bottom: none;\r\n        border-radius: 0 0 8px 8px;\r\n      }\r\n\r\n      .field-key {\r\n        font-size: 10px;\r\n        font-weight: 700;\r\n        color: var(--erd-key-color, #dc2626);\r\n      }\r\n\r\n      .field-name {\r\n        font-weight: 500;\r\n        color: var(--erd-text, #1f2937);\r\n      }\r\n\r\n      .field-type {\r\n        font-size: 11px;\r\n        color: var(--erd-type-color, #6b7280);\r\n        text-transform: uppercase;\r\n      }\r\n\r\n      .field-nullable {\r\n        font-size: 10px;\r\n        color: #9ca3af;\r\n      }\r\n\r\n      /* Handles for each field */\r\n      .field-handle {\r\n        position: absolute;\r\n        width: 10px;\r\n        height: 10px;\r\n        border-radius: 50%;\r\n        background: var(--flow-handle-bg, #f1f1f1);\r\n        cursor: crosshair;\r\n        pointer-events: auto;\r\n        z-index: 10;\r\n        transition: all 0.2s;\r\n      }\r\n\r\n      .field-handle.left {\r\n        left: 3px;\r\n        top: 50%;\r\n        transform: translateY(-50%);\r\n      }\r\n\r\n      .field-handle.right {\r\n        right: 3px;\r\n        top: 50%;\r\n        transform: translateY(-50%);\r\n      }\r\n\r\n      .field-handle:hover {\r\n        background: var(--flow-handle-border, #2563eb);\r\n        transform: translateY(-50%) scale(1.3);\r\n      }\r\n    `\r\n  ];\r\n\r\n  // Apply initial size from data.size exactly once\r\n  private appliedInitialSize = false;\r\n\r\n  firstUpdated() {\r\n    // Apply initial size before base measures, so measured size reflects it\r\n    const data = this.data as ERDTableData | undefined;\r\n    const w = data?.size?.width;\r\n    const h = data?.size?.height;\r\n    if ((typeof w === 'number' && w > 0) || (typeof h === 'number' && h > 0)) {\r\n      if (typeof w === 'number' && w > 0) this.style.width = `${w}px`;\r\n      if (typeof h === 'number' && h > 0) this.style.height = `${h}px`;\r\n      if (this.instance) {\r\n        this.instance.updateNode(this.id, {\r\n          width: typeof w === 'number' && w > 0 ? w : (this as any).width,\r\n          height: typeof h === 'number' && h > 0 ? h : (this as any).height,\r\n        });\r\n      }\r\n      this.appliedInitialSize = true;\r\n    }\r\n    super.firstUpdated();\r\n  }\r\n\r\n  updated(changedProperties: Map<string | number | symbol, unknown>) {\r\n    // No-op; initial sizing is handled in firstUpdated before measurement\r\n    super.updated(changedProperties as any);\r\n  }\r\n\r\n  private onFieldHandleMouseDown(fieldName: string, side: 'left' | 'right') {\r\n    return (e: MouseEvent) => {\r\n      e.stopPropagation();\r\n      e.preventDefault();\r\n      \r\n      // Generate unique handle ID\r\n      const handleId = `${this.id}-${fieldName}-${side}`;\r\n      \r\n      // Dispatch handle-start event with field information\r\n      this.dispatchEvent(new CustomEvent('handle-start', {\r\n        detail: { \r\n          nodeId: this.id, \r\n          type: side === 'left' ? 'target' : 'source',\r\n          handleId,\r\n          fieldName\r\n        },\r\n        bubbles: true,\r\n        composed: true\r\n      }));\r\n    };\r\n  }\r\n\r\n  render() {\r\n    const tableData = this.data as ERDTableData;\r\n    const tableName = tableData?.tableName || 'Table';\r\n    const fields = tableData?.fields || [];\r\n\r\n    return html`\r\n      <div class=\"table-header\" style=\"${tableData.color ? `background: ${tableData.color}` : ''}\">\r\n        <span class=\"table-icon\">📊</span>\r\n        <span>${tableName}</span>\r\n      </div>\r\n      \r\n      <div class=\"table-body nowheel\">\r\n        ${fields.map(field => html`\r\n          <div class=\"field-row\" data-field=\"${field.name}\">\r\n            <div class=\"field-key\">\r\n              ${field.key || ''}\r\n            </div>\r\n            <div class=\"field-name\">${field.name}</div>\r\n            <div class=\"field-type\">${field.type}</div>\r\n            <div class=\"field-nullable\">\r\n              ${field.nullable ? 'NULL' : ''}\r\n            </div>\r\n            \r\n            <!-- Left handle (input) for this field -->\r\n            <div \r\n              class=\"field-handle left\"\r\n              data-handle=\"target\"\r\n              data-field=\"${field.name}\"\r\n              data-handle-id=\"${this.id}-${field.name}-left\"\r\n              @mousedown=${this.onFieldHandleMouseDown(field.name, 'left')}\r\n            ></div>\r\n            \r\n            <!-- Right handle (output) for this field -->\r\n            <div \r\n              class=\"field-handle right\"\r\n              data-handle=\"source\"\r\n              data-field=\"${field.name}\"\r\n              data-handle-id=\"${this.id}-${field.name}-right\"\r\n              @mousedown=${this.onFieldHandleMouseDown(field.name, 'right')}\r\n            ></div>\r\n          </div>\r\n        `)}\r\n      </div>\r\n      ${this.resizable ? html`\r\n        <node-resizer\r\n          .visible=${this.selected}\r\n          min-width=\"150\"\r\n          min-height=\"80\"\r\n          max-width=\"500\"\r\n          max-height=\"400\"\r\n        ></node-resizer>\r\n      ` : ''}\r\n    `;\r\n  }\r\n}\r\n\r\ndeclare global {\r\n  interface HTMLElementTagNameMap {\r\n    'erd-table-node': ERDTableNode;\r\n  }\r\n}\r\n\r\n","/**\r\n * Basic shape definitions for Lit Flow\r\n */\r\n\r\nimport type { ShapeDefinition } from '../types';\r\n\r\nexport const basicShapes: ShapeDefinition[] = [\r\n  {\r\n    type: 'circle',\r\n    name: 'Circle',\r\n    category: 'basic',\r\n    path: 'M 100 100 m -95 0 a 95 95 0 1 1 190 0 a 95 95 0 1 1 -190 0',\r\n    viewBox: '0 0 200 200',\r\n    defaultSize: { width: 200, height: 200 },\r\n    centerPoint: { x: 100, y: 100 }\r\n  },\r\n  {\r\n    type: 'rectangle',\r\n    name: 'Rectangle',\r\n    category: 'basic',\r\n    path: 'M 5 5 L 195 5 L 195 195 L 5 195 Z',\r\n    viewBox: '0 0 200 200',\r\n    defaultSize: { width: 200, height: 200 },\r\n    centerPoint: { x: 100, y: 100 }\r\n  },\r\n  {\r\n    type: 'diamond',\r\n    name: 'Diamond',\r\n    category: 'basic',\r\n    path: 'M 100 5 L 195 100 L 100 195 L 5 100 Z',\r\n    viewBox: '0 0 200 200',\r\n    defaultSize: { width: 200, height: 200 },\r\n    centerPoint: { x: 100, y: 100 }\r\n  },\r\n  {\r\n    type: 'triangle',\r\n    name: 'Triangle',\r\n    category: 'basic',\r\n    path: 'M 100 5 L 195 195 L 5 195 Z',\r\n    viewBox: '0 0 200 200',\r\n    defaultSize: { width: 200, height: 200 },\r\n    centerPoint: { x: 100, y: 100 }\r\n  }\r\n];\r\n","/**\r\n * Geometric shape definitions for Lit Flow\r\n */\r\n\r\nimport type { ShapeDefinition } from '../types';\r\n\r\nexport const geometricShapes: ShapeDefinition[] = [\r\n  {\r\n    type: 'hexagon',\r\n    name: 'Hexagon',\r\n    category: 'geometric',\r\n    path: 'M 100 5 L 175 52 L 175 148 L 100 195 L 25 148 L 25 52 Z',\r\n    viewBox: '0 0 200 200',\r\n    defaultSize: { width: 200, height: 200 },\r\n    centerPoint: { x: 100, y: 100 }\r\n  },\r\n  {\r\n    type: 'octagon',\r\n    name: 'Octagon',\r\n    category: 'geometric',\r\n    path: 'M 100 5 L 175 25 L 195 100 L 175 175 L 100 195 L 25 175 L 5 100 L 25 25 Z',\r\n    viewBox: '0 0 200 200',\r\n    defaultSize: { width: 200, height: 200 },\r\n    centerPoint: { x: 100, y: 100 }\r\n  }\r\n];\r\n","/**\r\n * Symbolic shape definitions for Lit Flow\r\n */\r\n\r\nimport type { ShapeDefinition } from '../types';\r\n\r\nexport const symbolicShapes: ShapeDefinition[] = [\r\n  {\r\n    type: 'heart',\r\n    name: 'Heart',\r\n    category: 'symbolic',\r\n    path: 'M 100 185 C 100 185, 10 95, 10 50 C 10 25, 35 5, 60 5 C 80 5, 100 25, 100 50 C 100 25, 120 5, 140 5 C 165 5, 190 25, 190 50 C 190 95, 100 185, 100 185 Z',\r\n    viewBox: '0 0 200 200',\r\n    defaultSize: { width: 200, height: 200 },\r\n    centerPoint: { x: 100, y: 100 }\r\n  }\r\n];\r\n","/**\r\n * Shape Registry - Centralized shape definitions and management\r\n */\r\n\r\nimport type { ShapeType, ShapeDefinition } from './types';\r\nimport { basicShapes } from './shapes/basic-shapes';\r\nimport { geometricShapes } from './shapes/geometric-shapes';\r\nimport { symbolicShapes } from './shapes/symbolic-shapes';\r\n\r\nexport class ShapeRegistry {\r\n  private static shapes = new Map<ShapeType, ShapeDefinition>();\r\n\r\n  /**\r\n   * Initialize the registry with default shapes\r\n   */\r\n  static initialize(): void {\r\n    // Register all default shapes\r\n    const allShapes = [...basicShapes, ...geometricShapes, ...symbolicShapes];\r\n    allShapes.forEach(shape => {\r\n      this.shapes.set(shape.type, shape);\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Register a new shape definition\r\n   */\r\n  static register(definition: ShapeDefinition): void {\r\n    this.shapes.set(definition.type, definition);\r\n  }\r\n\r\n  /**\r\n   * Get a shape definition by type\r\n   */\r\n  static get(shapeType: ShapeType): ShapeDefinition | undefined {\r\n    return this.shapes.get(shapeType);\r\n  }\r\n\r\n  /**\r\n   * Get all registered shapes\r\n   */\r\n  static getAll(): ShapeDefinition[] {\r\n    return Array.from(this.shapes.values());\r\n  }\r\n\r\n  /**\r\n   * Get shapes by category\r\n   */\r\n  static getByCategory(category: string): ShapeDefinition[] {\r\n    return Array.from(this.shapes.values()).filter(shape => shape.category === category);\r\n  }\r\n\r\n  /**\r\n   * Check if a shape type is registered\r\n   */\r\n  static has(shapeType: ShapeType): boolean {\r\n    return this.shapes.has(shapeType);\r\n  }\r\n\r\n  /**\r\n   * Get all available shape types\r\n   */\r\n  static getShapeTypes(): ShapeType[] {\r\n    return Array.from(this.shapes.keys());\r\n  }\r\n\r\n  /**\r\n   * Clear all registered shapes\r\n   */\r\n  static clear(): void {\r\n    this.shapes.clear();\r\n  }\r\n\r\n  /**\r\n   * Get shape count\r\n   */\r\n  static getCount(): number {\r\n    return this.shapes.size;\r\n  }\r\n}\r\n\r\n// Initialize the registry when the module is loaded\r\nShapeRegistry.initialize();\r\n","/**\r\n * ShapeNode - Component for rendering shape-based nodes\r\n * Uses a centralized Shape component that renders different SVG paths based on shape type\r\n */\r\n\r\nimport { LitElement, html, css } from 'lit';\r\nimport { customElement, property } from 'lit/decorators.js';\r\nimport type { ShapeNodeData, ShapeNodeDataDirect } from './types';\r\nimport { ShapeRegistry } from './shape-registry';\r\nimport '../node-resizer';\r\n\r\n@customElement('shape-node')\r\nexport class ShapeNode extends LitElement {\r\n  static styles = css`\r\n    :host {\r\n      position: absolute;\r\n      display: block;\r\n      pointer-events: auto;\r\n      transform-origin: 0 0;\r\n      will-change: transform;\r\n      transform: translate(var(--position-x, 0px), var(--position-y, 0px));\r\n    }\r\n\r\n    .shape-node {\r\n      position: relative;\r\n      display: flex;\r\n      align-items: center;\r\n      justify-content: center;\r\n      cursor: grab;\r\n      user-select: none;\r\n      pointer-events: auto;\r\n      width: var(--shape-width, 200px);\r\n      height: var(--shape-height, 200px);\r\n    }\r\n\r\n    .shape-node:active {\r\n      cursor: grabbing;\r\n    }\r\n\r\n    .shape-node.selected {\r\n      outline: 2px solid var(--flow-node-selected-color, #1a73e8);\r\n      outline-offset: 2px;\r\n    }\r\n\r\n    :host([dragging]) .shape-node {\r\n      cursor: grabbing;\r\n      filter: drop-shadow(0 8px 16px rgba(0, 0, 0, 0.25));\r\n    }\r\n\r\n    .shape-svg {\r\n      display: block;\r\n      transition: transform 0.2s ease;\r\n      pointer-events: none;\r\n    }\r\n\r\n    .shape-content {\r\n      position: absolute;\r\n      top: 50%;\r\n      left: 50%;\r\n      transform: translate(-50%, -50%);\r\n      pointer-events: none;\r\n      z-index: 1;\r\n    }\r\n\r\n    .shape-node:hover .shape-svg {\r\n      transform: scale(1.05);\r\n    }\r\n\r\n    .unknown-shape {\r\n      width: 100px;\r\n      height: 100px;\r\n      background: #f0f0f0;\r\n      border: 2px dashed #ccc;\r\n      display: flex;\r\n      align-items: center;\r\n      justify-content: center;\r\n      color: #666;\r\n      font-size: 12px;\r\n      pointer-events: none;\r\n    }\r\n\r\n    .handle {\r\n      position: absolute;\r\n      width: 10px;\r\n      height: 10px;\r\n      border-radius: 50%;\r\n      background: var(--flow-handle-bg, #fff);\r\n      border: 1px solid var(--flow-handle-border, #1a73e8);\r\n      box-shadow: 0 0 0 1px rgba(26, 115, 232, 0.15);\r\n      cursor: crosshair;\r\n      pointer-events: auto;\r\n      z-index: 10;\r\n      opacity: 0;\r\n      transition: opacity 0.2s ease;\r\n    }\r\n\r\n    .handle:hover {\r\n      opacity: 1;\r\n      transform: scale(1.2);\r\n    }\r\n\r\n    .handle.source {\r\n      right: -5px;\r\n      top: 50%;\r\n      transform: translateY(-50%);\r\n    }\r\n\r\n    .handle.target {\r\n      left: -5px;\r\n      top: 50%;\r\n      transform: translateY(-50%);\r\n    }\r\n\r\n    .handle.top {\r\n      top: -5px;\r\n      left: 50%;\r\n      transform: translateX(-50%);\r\n    }\r\n\r\n    .handle.bottom {\r\n      bottom: -5px;\r\n      left: 50%;\r\n      transform: translateX(-50%);\r\n    }\r\n\r\n    .shape-node:hover .handle {\r\n      opacity: 1;\r\n    }\r\n\r\n    .shape-label {\r\n      position: absolute;\r\n      top: 50%;\r\n      left: 50%;\r\n      transform: translate(-50%, -50%);\r\n      background: rgba(255, 255, 255, 0.9);\r\n      border: 1px solid rgba(0, 0, 0, 0.1);\r\n      border-radius: 4px;\r\n      padding: 2px 6px;\r\n      font-size: 12px;\r\n      color: #333;\r\n      white-space: nowrap;\r\n      user-select: none;\r\n      pointer-events: none;\r\n      box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\r\n      z-index: 5;\r\n    }\r\n\r\n    .shape-label.editable {\r\n      pointer-events: auto;\r\n      cursor: text;\r\n    }\r\n\r\n    .shape-label.editable:hover {\r\n      background: rgba(255, 255, 255, 1);\r\n      border-color: var(--flow-node-selected-color, #1a73e8);\r\n    }\r\n\r\n    .handle:active {\r\n      opacity: 1;\r\n      transform: scale(1.3);\r\n    }\r\n  `;\r\n\r\n  @property({ type: String, reflect: true }) id = '';\r\n  @property({ type: Object }) data!: ShapeNodeDataDirect;\r\n  @property({ \r\n    type: Object, \r\n    hasChanged: (newVal: { x: number; y: number }, oldVal: { x: number; y: number }) => {\r\n      return !oldVal || newVal.x !== oldVal.x || newVal.y !== oldVal.y;\r\n    }\r\n  }) position!: { x: number; y: number };\r\n  @property({ type: Boolean, reflect: true }) selected = false;\r\n  @property({ type: Boolean, reflect: true }) dragging = false;\r\n  @property({ type: Boolean }) draggable = true;\r\n  @property({ type: Boolean }) connectable = true;\r\n  @property({ type: Object }) instance: any = null;\r\n  @property({ type: Boolean }) resizable = false;\r\n\r\n  private isDragging = false;\r\n  private dragStart = { x: 0, y: 0 };\r\n  private nodeStart = { x: 0, y: 0 };\r\n\r\n  updated(changedProperties: Map<string | number | symbol, unknown>) {\r\n    super.updated(changedProperties);\r\n    \r\n    // Handle property changes if needed\r\n    if (changedProperties.has('position') && !this.isDragging) {\r\n      // Position updated from outside (not during dragging)\r\n      // This can be used for future features like animation\r\n    }\r\n    \r\n    if (changedProperties.has('resizable')) {\r\n      console.log('ShapeNode resizable changed:', this.resizable);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get the shape definition from the registry\r\n   */\r\n  private getShapeDefinition() {\r\n    if (!this.data?.type) {\r\n      return undefined;\r\n    }\r\n    return ShapeRegistry.get(this.data.type);\r\n  }\r\n\r\n  /**\r\n   * Render the SVG shape\r\n   */\r\n  private renderShape() {\r\n    const shapeDef = this.getShapeDefinition();\r\n    if (!shapeDef) {\r\n      return html`\r\n        <div class=\"unknown-shape\">\r\n          Unknown shape: ${this.data?.type || 'undefined'}\r\n        </div>\r\n      `;\r\n    }\r\n\r\n    const config = this.data;\r\n    const size = config.size || shapeDef.defaultSize;\r\n    const fillColor = config.backgroundColor || config.color || '#ffffff';\r\n    const strokeColor = config.strokeColor || '#000000';\r\n    const strokeWidth = config.strokeWidth || 2;\r\n    const rotation = config.rotation || 0;\r\n\r\n    return html`\r\n      <svg \r\n        class=\"shape-svg\"\r\n        width=\"${size.width}\" \r\n        height=\"${size.height}\" \r\n        viewBox=\"${shapeDef.viewBox}\"\r\n        style=\"transform: rotate(${rotation}deg)\"\r\n      >\r\n        <path \r\n          d=\"${shapeDef.path}\" \r\n          fill=\"${fillColor}\"\r\n          stroke=\"${strokeColor}\"\r\n          stroke-width=\"${strokeWidth}\"\r\n        />\r\n      </svg>\r\n    `;\r\n  }\r\n\r\n  /**\r\n   * Render gradient definitions if needed\r\n   */\r\n  private renderGradients() {\r\n    const config = this.data;\r\n    if (config && 'gradient' in config && config.gradient) {\r\n      const gradientId = `gradient-${this.data.type}-${Math.random().toString(36).substr(2, 9)}`;\r\n      const gradient = config.gradient;\r\n      \r\n      if (gradient.type === 'linear') {\r\n        return html`\r\n          <defs>\r\n            <linearGradient id=\"${gradientId}\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\r\n              ${gradient.colors.map((color, index) => \r\n                html`<stop offset=\"${(index / (gradient.colors.length - 1)) * 100}%\" stop-color=\"${color}\"/>`\r\n              )}\r\n            </linearGradient>\r\n          </defs>\r\n        `;\r\n      } else if (gradient.type === 'radial') {\r\n        return html`\r\n          <defs>\r\n            <radialGradient id=\"${gradientId}\" cx=\"50%\" cy=\"50%\" r=\"50%\">\r\n              ${gradient.colors.map((color, index) => \r\n                html`<stop offset=\"${(index / (gradient.colors.length - 1)) * 100}%\" stop-color=\"${color}\"/>`\r\n              )}\r\n            </radialGradient>\r\n          </defs>\r\n        `;\r\n      }\r\n    }\r\n    return html``;\r\n  }\r\n\r\n  connectedCallback() {\r\n    super.connectedCallback();\r\n    this.addEventListener('click', this.handleClick);\r\n    this.addEventListener('mousedown', this.handleMouseDown);\r\n    if (this.resizable) {\r\n      this.addEventListener('resize', this.handleResize as EventListener);\r\n      this.addEventListener('resize-end', this.handleResizeEnd as EventListener);\r\n    }\r\n  }\r\n\r\n  disconnectedCallback() {\r\n    super.disconnectedCallback();\r\n    this.removeEventListener('click', this.handleClick);\r\n    this.removeEventListener('mousedown', this.handleMouseDown);\r\n    if (this.resizable) {\r\n      this.removeEventListener('resize', this.handleResize as EventListener);\r\n      this.removeEventListener('resize-end', this.handleResizeEnd as EventListener);\r\n    }\r\n    this.cleanup();\r\n  }\r\n\r\n  private cleanup() {\r\n    document.removeEventListener('mousemove', this.handleMouseMove);\r\n    document.removeEventListener('mouseup', this.handleMouseUp);\r\n  }\r\n\r\n  /**\r\n   * Handle click events\r\n   */\r\n  private handleClick = (e: MouseEvent) => {\r\n    e.stopPropagation();\r\n    if (!this.isDragging && this.instance) {\r\n      // Toggle selection\r\n      const newSelected = !this.selected;\r\n      this.instance.updateNode(this.id, { selected: newSelected });\r\n      \r\n      // Dispatch selection event\r\n      this.dispatchEvent(new CustomEvent('node-select', {\r\n        detail: {\r\n          nodeId: this.id,\r\n          selected: newSelected,\r\n          node: {\r\n            id: this.id,\r\n            data: this.data,\r\n            position: this.position,\r\n            selected: newSelected\r\n          }\r\n        },\r\n        bubbles: true,\r\n        composed: true\r\n      }));\r\n    }\r\n  };\r\n\r\n  private handleResize = (e: Event) => {\r\n    const { width, height } = (e as CustomEvent).detail;\r\n    \r\n    // Update the shape data with new size\r\n    if (this.data && this.instance) {\r\n      const updatedData = {\r\n        ...this.data,\r\n        size: { width, height }\r\n      };\r\n      \r\n      this.instance.updateNode(this.id, { \r\n        data: updatedData,\r\n        width: width,\r\n        height: height,\r\n        measured: { width, height }\r\n      });\r\n    }\r\n  };\r\n\r\n  private handleResizeEnd = (e: Event) => {\r\n    const { width, height } = (e as CustomEvent).detail;\r\n    \r\n    // Final update with new dimensions\r\n    if (this.data && this.instance) {\r\n      const updatedData = {\r\n        ...this.data,\r\n        size: { width, height }\r\n      };\r\n      \r\n      this.instance.updateNode(this.id, { \r\n        data: updatedData,\r\n        width: width,\r\n        height: height,\r\n        measured: { width, height }\r\n      });\r\n    }\r\n\r\n    // Dispatch resize end event\r\n    this.dispatchEvent(new CustomEvent('node-resize-end', {\r\n      detail: {\r\n        nodeId: this.id,\r\n        width: width,\r\n        height: height\r\n      },\r\n      bubbles: true,\r\n      composed: true\r\n    }));\r\n  };\r\n\r\n  private handleMouseDown = (e: MouseEvent) => {\r\n    if (!this.draggable || e.button !== 0) return;\r\n    \r\n    // Check if the event is coming from a resize handle or node-resizer\r\n    const target = e.target as HTMLElement;\r\n    \r\n    // Check if the event originated from a resize handle or node-resizer\r\n    const isFromResizeHandle = target.classList.contains('resize-handle') || \r\n                              target.tagName === 'NODE-RESIZER' ||\r\n                              target.closest('node-resizer') !== null;\r\n    \r\n    if (isFromResizeHandle) {\r\n      return; // Don't start dragging if clicking on resize handle\r\n    }\r\n    \r\n    e.preventDefault();\r\n    e.stopPropagation();\r\n    \r\n    this.isDragging = false;\r\n    this.dragStart = { x: e.clientX, y: e.clientY };\r\n    this.nodeStart = { ...this.position };\r\n\r\n    document.addEventListener('mousemove', this.handleMouseMove);\r\n    document.addEventListener('mouseup', this.handleMouseUp);\r\n  };\r\n\r\n  private handleMouseMove = (e: MouseEvent) => {\r\n    const dx = e.clientX - this.dragStart.x;\r\n    const dy = e.clientY - this.dragStart.y;\r\n    \r\n    // Start dragging if moved more than 3px\r\n    if (!this.isDragging && (Math.abs(dx) > 3 || Math.abs(dy) > 3)) {\r\n      this.isDragging = true;\r\n      if (this.instance) {\r\n        this.instance.updateNode(this.id, { dragging: true });\r\n      }\r\n    }\r\n\r\n    if (this.isDragging && this.instance) {\r\n      const viewport = this.instance.getViewport();\r\n      const newPosition = {\r\n        x: this.nodeStart.x + dx / viewport.zoom,\r\n        y: this.nodeStart.y + dy / viewport.zoom\r\n      };\r\n      \r\n      this.instance.updateNode(this.id, { position: newPosition });\r\n    }\r\n  };\r\n\r\n  private handleMouseUp = () => {\r\n    console.log('handleMouseUp');\r\n    if (this.isDragging && this.instance) {\r\n      this.instance.updateNode(this.id, { dragging: false });\r\n    }\r\n    \r\n    this.isDragging = false;\r\n    this.cleanup();\r\n  };\r\n\r\n  private handleHandleStart = (e: MouseEvent) => {\r\n    console.log('handleHandleStart', e);\r\n    e.stopPropagation();\r\n    this.isDragging = false;\r\n    \r\n    const handle = e.target as HTMLElement;\r\n    const handleId = handle.dataset.handleId;\r\n    const handleType = handle.dataset.handleType;\r\n    \r\n    if (handleType && handleId) {\r\n      this.dispatchEvent(new CustomEvent('handle-start', {\r\n        detail: {\r\n          nodeId: this.id,\r\n          handleId: handleId,\r\n          handleType: handleType,\r\n          position: this.position\r\n        },\r\n        bubbles: true,\r\n        composed: true\r\n      }));\r\n    }\r\n  };\r\n\r\n  render() {\r\n    // Set CSS custom properties on the host element\r\n    this.style.setProperty('--position-x', `${this.position.x}px`);\r\n    this.style.setProperty('--position-y', `${this.position.y}px`);\r\n    \r\n    // Set shape dimensions\r\n    const shapeDef = this.getShapeDefinition();\r\n    const config = this.data;\r\n    const size = config?.size || shapeDef?.defaultSize || { width: 200, height: 200 };\r\n    this.style.setProperty('--shape-width', `${size.width}px`);\r\n    this.style.setProperty('--shape-height', `${size.height}px`);\r\n    \r\n    return html`\r\n      <div class=\"shape-node ${this.selected ? 'selected' : ''}\">\r\n        ${this.renderGradients()}\r\n        ${this.renderShape()}\r\n        <div class=\"shape-content\">\r\n          <slot></slot>\r\n        </div>\r\n        ${this.connectable ? this.renderHandles() : ''}\r\n        ${this.renderLabel()}\r\n      </div>\r\n      ${this.resizable ? html`\r\n        <node-resizer\r\n          .visible=${this.selected}\r\n          min-width=\"50\"\r\n          min-height=\"50\"\r\n          max-width=\"500\"\r\n          max-height=\"500\"\r\n        ></node-resizer>\r\n      ` : ''}\r\n    `;\r\n  }\r\n\r\n  private renderHandles() {\r\n    const nodeId = this.id;\r\n    return html`\r\n      <div \r\n        class=\"handle source\" \r\n        data-handle=\"source\" \r\n        data-node-id=\"${nodeId}\"\r\n        data-handle-id=\"${nodeId}-source-right\"\r\n        data-handle-type=\"source\"\r\n        @mousedown=${this.handleHandleStart}\r\n      ></div>\r\n      <div \r\n        class=\"handle target\" \r\n        data-handle=\"target\" \r\n        data-node-id=\"${nodeId}\"\r\n        data-handle-id=\"${nodeId}-target-left\"\r\n        data-handle-type=\"target\"\r\n        @mousedown=${this.handleHandleStart}\r\n      ></div>\r\n      <div \r\n        class=\"handle top\" \r\n        data-handle=\"source\" \r\n        data-node-id=\"${nodeId}\"\r\n        data-handle-id=\"${nodeId}-source-top\"\r\n        data-handle-type=\"source\"\r\n        @mousedown=${this.handleHandleStart}\r\n      ></div>\r\n      <div \r\n        class=\"handle bottom\" \r\n        data-handle=\"target\" \r\n        data-node-id=\"${nodeId}\"\r\n        data-handle-id=\"${nodeId}-target-bottom\"\r\n        data-handle-type=\"target\"\r\n        @mousedown=${this.handleHandleStart}\r\n      ></div>\r\n    `;\r\n  }\r\n\r\n  private renderLabel() {\r\n    const shapeConfig = this.data;\r\n    if (!shapeConfig) return '';\r\n\r\n    // Get the label - use provided label or default to shape type\r\n    const label = shapeConfig.label || shapeConfig.type;\r\n    \r\n    return html`\r\n      <div class=\"shape-label\">\r\n        ${label}\r\n      </div>\r\n    `;\r\n  }\r\n}\r\n\r\ndeclare global {\r\n  interface HTMLElementTagNameMap {\r\n    'shape-node': ShapeNode;\r\n  }\r\n}\r\n","/**\r\n * Base Node UI components (Lit)\r\n * Similar to React Flow UI Base Node: header, content, footer wrappers\r\n */\r\n\r\nimport { LitElement, html, css } from 'lit';\r\nimport { customElement, property } from 'lit/decorators.js';\r\n\r\n@customElement('base-node')\r\nexport class BaseNode extends LitElement {\r\n  static styles = css`\r\n    :host {\r\n      display: block;\r\n      border: 1px solid var(--flow-node-border, #e5e7eb);\r\n      border-radius: 8px;\r\n      background: var(--flow-node-background, #ffffff);\r\n      color: var(--flow-node-foreground, #111827);\r\n      overflow: hidden;\r\n    }\r\n  `;\r\n\r\n  render() {\r\n    return html`<slot></slot>`;\r\n  }\r\n}\r\n\r\n@customElement('base-node-header')\r\nexport class BaseNodeHeader extends LitElement {\r\n  static styles = css`\r\n    :host {\r\n      display: flex;\r\n      align-items: center;\r\n      gap: 8px;\r\n      padding: 10px 12px;\r\n      background: var(--base-node-header-bg, #f9fafb);\r\n      border-bottom: 1px solid var(--flow-node-border, #e5e7eb);\r\n      font-weight: 600;\r\n    }\r\n  `;\r\n  render() {\r\n    return html`<slot></slot>`;\r\n  }\r\n}\r\n\r\n@customElement('base-node-header-title')\r\nexport class BaseNodeHeaderTitle extends LitElement {\r\n  static styles = css`\r\n    :host { display: contents; }\r\n    .title {\r\n      font-size: 14px;\r\n      font-weight: 600;\r\n      color: var(--base-node-title, #111827);\r\n    }\r\n  `;\r\n  render() {\r\n    return html`<span class=\"title\"><slot></slot></span>`;\r\n  }\r\n}\r\n\r\n@customElement('base-node-content')\r\nexport class BaseNodeContent extends LitElement {\r\n  static styles = css`\r\n    :host {\r\n      display: block;\r\n      padding: 12px;\r\n    }\r\n  `;\r\n  render() {\r\n    return html`<slot></slot>`;\r\n  }\r\n}\r\n\r\n@customElement('base-node-footer')\r\nexport class BaseNodeFooter extends LitElement {\r\n  static styles = css`\r\n    :host {\r\n      display: flex;\r\n      align-items: center;\r\n      gap: 8px;\r\n      padding: 10px 12px;\r\n      background: var(--base-node-footer-bg, #fafafa);\r\n      border-top: 1px solid var(--flow-node-border, #e5e7eb);\r\n    }\r\n  `;\r\n  render() {\r\n    return html`<slot></slot>`;\r\n  }\r\n}\r\n\r\ndeclare global {\r\n  interface HTMLElementTagNameMap {\r\n    'base-node': BaseNode;\r\n    'base-node-header': BaseNodeHeader;\r\n    'base-node-header-title': BaseNodeHeaderTitle;\r\n    'base-node-content': BaseNodeContent;\r\n    'base-node-footer': BaseNodeFooter;\r\n  }\r\n}\r\n\r\n\r\n","/**\r\n * NodeMixin - Provides core node functionality without inheritance\r\n * Can be applied to any LitElement to add node behavior\r\n * \r\n * Features:\r\n * - Dragging and positioning\r\n * - Selection handling\r\n * - Resizing with configurable constraints\r\n * - Event dispatching for all interactions\r\n * \r\n * Usage:\r\n * \r\n * The mixin automatically appends the resizer to the DOM when resizable=true and selected=true.\r\n * Components can use any render method - the resizer will be automatically added.\r\n * \r\n * ```typescript\r\n * @customElement('my-node')\r\n * export class MyNode extends NodeMixin(LitElement) {\r\n *   constructor() {\r\n *     super();\r\n *     this.resizable = true;\r\n *     this.minWidth = 100;\r\n *     this.minHeight = 50;\r\n *   }\r\n * \r\n *   // Any render method works - resizer is automatically appended\r\n *   render() {\r\n *     return html`<div>My node content</div>`;\r\n *   }\r\n * }\r\n * ```\r\n * \r\n * To restrict dragging to a specific element (e.g., only header):\r\n * ```typescript\r\n * @customElement('my-node')\r\n * export class MyNode extends NodeMixin(LitElement) {\r\n *   constructor() {\r\n *     super();\r\n *     this.drag_handle_selector = '.node-header'; // Only header can be used to drag\r\n *   }\r\n * \r\n *   render() {\r\n *     return html`\r\n *       <div class=\"node-header\">Header - drag from here</div>\r\n *       <div class=\"node-body\">\r\n *         Body content - interactive elements here won't trigger dragging\r\n *       </div>\r\n *     `;\r\n *   }\r\n * }\r\n * ```\r\n * \r\n * For manual control, you can also use:\r\n * ```typescript\r\n * render() {\r\n *   return html`\r\n *     <div>My node content</div>\r\n *     ${this.getResizer()}\r\n *   `;\r\n * }\r\n * ```\r\n */\r\n\r\nimport { LitElement, html, css, render } from 'lit';\r\nimport { property } from 'lit/decorators.js';\r\n\r\nexport interface NodeMixinInterface {\r\n  id: string;\r\n  position: { x: number; y: number };\r\n  data: any;\r\n  selected: boolean;\r\n  dragging: boolean;\r\n  instance: any;\r\n  resizable: boolean;\r\n  draggable: boolean;\r\n  drag_handle_selector: string | null;\r\n  connectable: boolean;\r\n  minWidth: number;\r\n  maxWidth: number;\r\n  minHeight: number;\r\n  maxHeight: number;\r\n  keepAspectRatio: boolean;\r\n  maxInitialHeight: number;\r\n  renderComponent(): any;\r\n  getResizer(): any;\r\n  adjustHeightToContent(): void;\r\n  notifyHandlesUpdated(options?: { handleIds?: string[]; updateDimensions?: boolean }): Promise<void>;\r\n}\r\n\r\nexport const NodeMixin = <T extends Constructor<LitElement>>(superClass: T) => {\r\n  class NodeMixinClass extends superClass {\r\n    static get styles() {\r\n      return [css`\r\n      :host {\r\n        position: absolute;\r\n        cursor: var(--node-cursor, grab);\r\n        user-select: none;\r\n        transform-origin: 0 0;\r\n        will-change: transform;\r\n        pointer-events: auto;\r\n        border: var(--node-border, 1px solid #ddd);\r\n        border-radius: var(--node-border-radius, 8px);\r\n        background: var(--node-background, white);\r\n        box-shadow: var(--node-shadow, 0 1px 3px rgba(0, 0, 0, 0.1));\r\n        transition: var(--node-transition, box-shadow 0.2s);\r\n      }\r\n\r\n      /* When drag_handle_selector is set, default cursor is normal (not grab) */\r\n      :host([data-drag-handle-selector]) {\r\n        cursor: default;\r\n      }\r\n\r\n      :host(:hover) {\r\n        box-shadow: var(--node-hover-shadow, 0 4px 6px rgba(0, 0, 0, 0.15));\r\n      }\r\n\r\n      :host([dragging]) {\r\n        cursor: var(--node-dragging-cursor, grabbing);\r\n        box-shadow: var(--node-dragging-shadow, 0 8px 16px rgba(0, 0, 0, 0.25));\r\n      }\r\n\r\n      :host([selected]) {\r\n        border-color: var(--node-selected-border, #1a73e8);\r\n        box-shadow: var(--node-selected-shadow, 0 0 0 2px rgba(26, 115, 232, 0.3));\r\n      }\r\n\r\n      /* Resizer styles - matching existing components */\r\n      .resize-border {\r\n        position: absolute;\r\n        top: 0;\r\n        left: 0;\r\n        right: 0;\r\n        bottom: 0;\r\n        border: var(--resize-border-style, 1px dashed var(--node-selected-border, #1a73e8));\r\n        border-radius: var(--node-border-radius, 8px);\r\n        opacity: var(--resize-border-opacity, 0);\r\n        pointer-events: none;\r\n        transition: var(--resize-transition, opacity 0.2s ease);\r\n      }\r\n\r\n      :host([selected]) .resize-border {\r\n        opacity: var(--resize-border-opacity-selected, 1);\r\n      }\r\n\r\n      .resize-handle {\r\n        position: absolute;\r\n        background: var(--resize-handle-background, var(--node-selected-border, #1a73e8));\r\n        border: var(--resize-handle-border, 2px solid #fff);\r\n        border-radius: var(--resize-handle-border-radius, 2px);\r\n        width: var(--resize-handle-size, 12px);\r\n        height: var(--resize-handle-size, 12px);\r\n        opacity: var(--resize-handle-opacity, 0);\r\n        transition: var(--resize-transition, opacity 0.2s ease);\r\n        pointer-events: auto;\r\n        box-shadow: var(--resize-handle-shadow, 0 2px 4px rgba(0, 0, 0, 0.2));\r\n        z-index: 10;\r\n      }\r\n\r\n      .resize-handle:hover {\r\n        opacity: var(--resize-handle-opacity-hover, 1);\r\n      }\r\n\r\n      :host([selected]) .resize-handle {\r\n        opacity: var(--resize-handle-opacity-selected, 1);\r\n      }\r\n\r\n      .resize-handle.nw {\r\n        top: var(--resize-handle-offset, -8px);\r\n        left: var(--resize-handle-offset, -8px);\r\n        cursor: nw-resize;\r\n      }\r\n\r\n      .resize-handle.ne {\r\n        top: var(--resize-handle-offset, -8px);\r\n        right: var(--resize-handle-offset, -8px);\r\n        cursor: ne-resize;\r\n      }\r\n\r\n      .resize-handle.sw {\r\n        bottom: var(--resize-handle-offset, -8px);\r\n        left: var(--resize-handle-offset, -8px);\r\n        cursor: sw-resize;\r\n      }\r\n\r\n      .resize-handle.se {\r\n        bottom: var(--resize-handle-offset, -8px);\r\n        right: var(--resize-handle-offset, -8px);\r\n        cursor: se-resize;\r\n      }\r\n\r\n      .resize-handle.n {\r\n        top: var(--resize-handle-offset, -8px);\r\n        left: 50%;\r\n        transform: translateX(-50%);\r\n        cursor: n-resize;\r\n      }\r\n\r\n      .resize-handle.s {\r\n        bottom: var(--resize-handle-offset, -8px);\r\n        left: 50%;\r\n        transform: translateX(-50%);\r\n        cursor: s-resize;\r\n      }\r\n\r\n      .resize-handle.w {\r\n        top: 50%;\r\n        left: var(--resize-handle-offset, -8px);\r\n        transform: translateY(-50%);\r\n        cursor: w-resize;\r\n      }\r\n\r\n      .resize-handle.e {\r\n        top: 50%;\r\n        right: var(--resize-handle-offset, -8px);\r\n        transform: translateY(-50%);\r\n        cursor: e-resize;\r\n      }\r\n      `];\r\n    }\r\n\r\n    @property({ type: String, reflect: true }) id = '';\r\n    @property({ type: Object }) position = { x: 0, y: 0 };\r\n    @property({ type: Object }) data = {};\r\n    @property({ type: Boolean, reflect: true }) selected = false;\r\n    @property({ type: Boolean, reflect: true }) dragging = false;\r\n    @property({ type: Object }) instance: any = null;\r\n    @property({ type: Boolean }) resizable = false;\r\n    @property({ type: Boolean }) draggable = true;\r\n    @property({ type: String }) drag_handle_selector: string | null = null;\r\n    @property({ type: Boolean }) connectable = true;\r\n    @property({ type: Number }) minWidth = 10;\r\n    @property({ type: Number }) maxWidth = Number.MAX_VALUE;\r\n    @property({ type: Number }) minHeight = 10;\r\n    @property({ type: Number }) maxHeight = Number.MAX_VALUE;\r\n    @property({ type: Boolean }) keepAspectRatio = false;\r\n    @property({ type: Number }) maxInitialHeight = 0; // 0 = no initial height limit, otherwise sets max height if content exceeds\r\n\r\n    private isDragging = false;\r\n    private dragStart = { x: 0, y: 0 };\r\n    private nodeStart = { x: 0, y: 0 };\r\n    \r\n    // Resizer state\r\n    private isResizing = false;\r\n    private resizeStart = { x: 0, y: 0, width: 0, height: 0 };\r\n    private resizeHandle = '';\r\n    \r\n    // Drag handle element reference\r\n    private dragHandleElement: HTMLElement | null = null;\r\n\r\n    connectedCallback() {\r\n      super.connectedCallback();\r\n      // Only attach mousedown to entire node if no drag_handle_selector is set\r\n      if (this.draggable && !this.drag_handle_selector) {\r\n        this.addEventListener('mousedown', this.handleMouseDown);\r\n      }\r\n      this.addEventListener('click', this.handleClick);\r\n      this.addEventListener('wheel', this.handleWheel as EventListener, { passive: false });\r\n      // Add global click handler for deselection\r\n      document.addEventListener('click', this.handleGlobalClick);\r\n      // Resizer functionality is now handled directly in the mixin\r\n    }\r\n\r\n    disconnectedCallback() {\r\n      super.disconnectedCallback();\r\n      this.removeEventListener('mousedown', this.handleMouseDown);\r\n      this.removeEventListener('click', this.handleClick);\r\n      this.removeEventListener('wheel', this.handleWheel as EventListener);\r\n      document.removeEventListener('click', this.handleGlobalClick);\r\n      // Clean up drag handle listener\r\n      this.removeDragHandleListener();\r\n      // Resizer functionality is now handled directly in the mixin\r\n      this.cleanup();\r\n    }\r\n\r\n\r\n    private handleClick = (e: MouseEvent) => {\r\n      e.stopPropagation();\r\n      if (!this.isDragging) {\r\n        const newSelected = !this.selected;\r\n        this.selected = newSelected;\r\n        \r\n        // Update instance if available\r\n        if (this.instance) {\r\n          this.instance.updateNode(this.id, { selected: newSelected });\r\n        }\r\n        \r\n        this.dispatchEvent(new CustomEvent('node-select', {\r\n          detail: { \r\n            nodeId: this.id, \r\n            selected: newSelected,\r\n            node: {\r\n              id: this.id,\r\n              data: this.data,\r\n              position: this.position,\r\n              selected: newSelected\r\n            }\r\n          },\r\n          bubbles: true,\r\n          composed: true\r\n        }));\r\n      }\r\n    };\r\n\r\n    /**\r\n     * Find the nearest scrollable parent element\r\n     */\r\n    private findScrollableElement(element: Element | null): HTMLElement | null {\r\n      if (!element || !(element instanceof HTMLElement)) return null;\r\n      \r\n      // Check if element has the nowheel class (explicitly marked as non-pannable)\r\n      if (element.classList.contains('nowheel')) {\r\n        return element;\r\n      }\r\n      \r\n      // Check computed styles for overflow\r\n      const style = window.getComputedStyle(element);\r\n      const overflow = style.overflow + style.overflowX + style.overflowY;\r\n      if (overflow.includes('auto') || overflow.includes('scroll')) {\r\n        // Check if element is actually scrollable (has scrollable content)\r\n        if (element.scrollHeight > element.clientHeight || element.scrollWidth > element.clientWidth) {\r\n          return element;\r\n        }\r\n      }\r\n      \r\n      // Check parent, but stop at this node's boundary\r\n      const parent = element.parentElement;\r\n      if (parent && (parent === (this as any) || this.shadowRoot?.contains(parent))) {\r\n        return this.findScrollableElement(parent);\r\n      }\r\n      \r\n      return null;\r\n    }\r\n\r\n    /**\r\n     * Handle wheel events to prevent panning when scrolling inside scrollable content\r\n     */\r\n    private handleWheel = (e: WheelEvent) => {\r\n      // Use composedPath to get the actual event path through shadow boundaries\r\n      const path = e.composedPath();\r\n      \r\n      // Find the first scrollable element in the event path\r\n      let scrollableEl: HTMLElement | null = null;\r\n      for (const element of path) {\r\n        if (element instanceof Element) {\r\n          scrollableEl = this.findScrollableElement(element);\r\n          if (scrollableEl) break;\r\n        }\r\n      }\r\n      \r\n      if (scrollableEl) {\r\n        // Check if the scrollable element can actually scroll in this direction\r\n        const canScrollVertically = \r\n          (e.deltaY < 0 && scrollableEl.scrollTop > 0) ||\r\n          (e.deltaY > 0 && scrollableEl.scrollTop < scrollableEl.scrollHeight - scrollableEl.clientHeight);\r\n        \r\n        const canScrollHorizontally = \r\n          (e.deltaX < 0 && scrollableEl.scrollLeft > 0) ||\r\n          (e.deltaX > 0 && scrollableEl.scrollLeft < scrollableEl.scrollWidth - scrollableEl.clientWidth);\r\n        \r\n        // If we can scroll in the direction of the wheel event, prevent panning\r\n        if (canScrollVertically || canScrollHorizontally) {\r\n          // Stop propagation to prevent panning, but allow default scrolling behavior\r\n          e.stopPropagation();\r\n        }\r\n      }\r\n    };\r\n\r\n    private handleMouseDown = (e: MouseEvent) => {\r\n      if (e.button !== 0) return;\r\n      \r\n      const target = e.target as HTMLElement;\r\n      \r\n      // Check if the target is a resize handle or if it's inside a resize handle\r\n      const isFromResizeHandle = target.classList.contains('resize-handle') || \r\n                                target.closest('.resize-handle') !== null;\r\n      \r\n      if (isFromResizeHandle) {\r\n        this.handleResizeStart(e);\r\n        return;\r\n      }\r\n      \r\n      if (!this.draggable) return;\r\n      \r\n      // If drag_handle_selector is set, the listener is only on the drag handle element\r\n      // So if we reach here, it means the click was on the drag handle or node (if no selector set)\r\n      e.preventDefault();\r\n      e.stopPropagation();\r\n      \r\n      this.isDragging = false;\r\n      this.dragStart = { x: e.clientX, y: e.clientY };\r\n      this.nodeStart = { ...this.position };\r\n\r\n      document.addEventListener('mousemove', this.handleMouseMove);\r\n      document.addEventListener('mouseup', this.handleMouseUp);\r\n    };\r\n\r\n    private handleMouseMove = (e: MouseEvent) => {\r\n      if (this.isResizing) {\r\n        this.handleResizeMove(e);\r\n        return;\r\n      }\r\n      \r\n      const dx = e.clientX - this.dragStart.x;\r\n      const dy = e.clientY - this.dragStart.y;\r\n      \r\n      if (!this.isDragging && (Math.abs(dx) > 3 || Math.abs(dy) > 3)) {\r\n        this.isDragging = true;\r\n        this.dragging = true;\r\n        // Update cursor on drag handle element if it exists\r\n        if (this.dragHandleElement) {\r\n          this.dragHandleElement.style.cursor = 'grabbing';\r\n        }\r\n        if (this.instance) {\r\n          this.instance.updateNode(this.id, { dragging: true });\r\n        }\r\n      }\r\n\r\n      if (this.isDragging && this.instance) {\r\n        const viewport = this.instance.getViewport();\r\n        const newPosition = {\r\n          x: this.nodeStart.x + dx / viewport.zoom,\r\n          y: this.nodeStart.y + dy / viewport.zoom\r\n        };\r\n        \r\n        this.instance.updateNode(this.id, { position: newPosition });\r\n      }\r\n    };\r\n\r\n    private handleMouseUp = () => {\r\n      if (this.isDragging && this.instance) {\r\n        this.instance.updateNode(this.id, { dragging: false });\r\n      }\r\n      \r\n      // Restore cursor on drag handle element when dragging ends\r\n      if (this.dragHandleElement && this.isDragging) {\r\n        this.dragHandleElement.style.cursor = 'grab';\r\n      }\r\n      \r\n      if (this.isResizing) {\r\n        this.handleResizeEnd();\r\n      }\r\n      \r\n      this.cleanup();\r\n      setTimeout(() => {\r\n        this.isDragging = false;\r\n        this.dragging = false;\r\n        this.isResizing = false;\r\n      }, 50);\r\n    };\r\n\r\n    private handleResizeStart = (e: MouseEvent, handle?: string) => {\r\n      e.preventDefault();\r\n      e.stopPropagation();\r\n      e.stopImmediatePropagation();\r\n\r\n      this.isResizing = true;\r\n      \r\n      // Get the actual computed dimensions, accounting for any CSS transforms\r\n      const rect = this.getBoundingClientRect();\r\n      const computedStyle = getComputedStyle(this);\r\n      \r\n      // Use the computed width/height if available, otherwise use the bounding rect\r\n      let width = parseFloat(computedStyle.width);\r\n      let height = parseFloat(computedStyle.height);\r\n      \r\n      // If computed values are not available or are 0, use the bounding rect\r\n      if (!width || width === 0) {\r\n        width = rect.width;\r\n      }\r\n      if (!height || height === 0) {\r\n        height = rect.height;\r\n      }\r\n      \r\n      this.resizeStart = {\r\n        x: e.clientX,\r\n        y: e.clientY,\r\n        width: width,\r\n        height: height\r\n      };\r\n\r\n      // Use the provided handle or try to detect it\r\n      if (handle) {\r\n        this.resizeHandle = handle;\r\n      } else {\r\n        // Get the handle direction from the target element\r\n        let target = e.target as HTMLElement;\r\n        \r\n        // If the target is not a resize handle, find the closest one\r\n        if (!target.classList.contains('resize-handle')) {\r\n          const resizeHandle = target.closest('.resize-handle') as HTMLElement;\r\n          if (resizeHandle) {\r\n            target = resizeHandle;\r\n          }\r\n        }\r\n        \r\n        const classes = Array.from(target.classList);\r\n        this.resizeHandle = classes.find(cls => cls !== 'resize-handle') || '';\r\n      }\r\n\r\n      // console.log('Resize started with handle:', this.resizeHandle);\r\n\r\n      document.addEventListener('mousemove', this.handleMouseMove);\r\n      document.addEventListener('mouseup', this.handleMouseUp);\r\n\r\n      // Dispatch resize start event\r\n      this.dispatchEvent(new CustomEvent('resize-start', {\r\n        detail: {\r\n          width: this.resizeStart.width,\r\n          height: this.resizeStart.height\r\n        },\r\n        bubbles: true,\r\n        composed: true\r\n      }));\r\n    };\r\n\r\n    private handleResizeMove = (e: MouseEvent) => {\r\n      if (!this.isResizing) return;\r\n\r\n      const deltaX = e.clientX - this.resizeStart.x;\r\n      const deltaY = e.clientY - this.resizeStart.y;\r\n\r\n      // console.log('Resizing with handle:', this.resizeHandle, 'delta:', deltaX, deltaY);\r\n\r\n      let newWidth = this.resizeStart.width;\r\n      let newHeight = this.resizeStart.height;\r\n\r\n      // Calculate new dimensions based on handle direction\r\n      switch (this.resizeHandle) {\r\n        case 'nw':\r\n          newWidth = this.resizeStart.width - deltaX;\r\n          newHeight = this.resizeStart.height - deltaY;\r\n          break;\r\n        case 'ne':\r\n          newWidth = this.resizeStart.width + deltaX;\r\n          newHeight = this.resizeStart.height - deltaY;\r\n          break;\r\n        case 'sw':\r\n          newWidth = this.resizeStart.width - deltaX;\r\n          newHeight = this.resizeStart.height + deltaY;\r\n          break;\r\n        case 'se':\r\n          newWidth = this.resizeStart.width + deltaX;\r\n          newHeight = this.resizeStart.height + deltaY;\r\n          break;\r\n        case 'n':\r\n          newHeight = this.resizeStart.height - deltaY;\r\n          break;\r\n        case 's':\r\n          newHeight = this.resizeStart.height + deltaY;\r\n          break;\r\n        case 'w':\r\n          newWidth = this.resizeStart.width - deltaX;\r\n          break;\r\n        case 'e':\r\n          newWidth = this.resizeStart.width + deltaX;\r\n          break;\r\n      }\r\n\r\n      // Apply constraints\r\n      newWidth = Math.max(this.minWidth, Math.min(this.maxWidth, newWidth));\r\n      newHeight = Math.max(this.minHeight, Math.min(this.maxHeight, newHeight));\r\n\r\n      // Keep aspect ratio if enabled\r\n      if (this.keepAspectRatio) {\r\n        const aspectRatio = this.resizeStart.width / this.resizeStart.height;\r\n        if (this.resizeHandle.includes('w') || this.resizeHandle.includes('e')) {\r\n          newHeight = newWidth / aspectRatio;\r\n        } else {\r\n          newWidth = newHeight * aspectRatio;\r\n        }\r\n      }\r\n\r\n      // Apply new dimensions\r\n      this.style.width = `${newWidth}px`;\r\n      this.style.height = `${newHeight}px`;\r\n\r\n      // Dispatch resize event\r\n      this.dispatchEvent(new CustomEvent('resize', {\r\n        detail: {\r\n          width: newWidth,\r\n          height: newHeight,\r\n          handle: this.resizeHandle\r\n        },\r\n        bubbles: true,\r\n        composed: true\r\n      }));\r\n\r\n      // Update instance if available\r\n      if (this.instance) {\r\n        this.instance.updateNode(this.id, { \r\n          width: newWidth,\r\n          height: newHeight,\r\n          measured: { width: newWidth, height: newHeight }\r\n        });\r\n      }\r\n    };\r\n\r\n    private handleResizeEnd = () => {\r\n      if (!this.isResizing) return;\r\n\r\n      // console.log('Resize ending - final dimensions:', this.offsetWidth, this.offsetHeight);\r\n      this.isResizing = false;\r\n\r\n      // Dispatch resize end event\r\n      this.dispatchEvent(new CustomEvent('resize-end', {\r\n        detail: {\r\n          width: this.offsetWidth,\r\n          height: this.offsetHeight\r\n        },\r\n        bubbles: true,\r\n        composed: true\r\n      }));\r\n\r\n      // Update instance if available\r\n      if (this.instance) {\r\n        this.instance.updateNode(this.id, { \r\n          width: this.offsetWidth,\r\n          height: this.offsetHeight,\r\n          measured: { width: this.offsetWidth, height: this.offsetHeight }\r\n        });\r\n      }\r\n    };\r\n\r\n    private handleGlobalClick = (e: MouseEvent) => {\r\n      // Check if the click is outside this node\r\n      const target = e.target as HTMLElement;\r\n      const isNodeClick = target.closest(this.tagName.toLowerCase()) !== null;\r\n      \r\n      if (!isNodeClick) {\r\n        // Deselect this node if it's selected\r\n        if (this.selected) {\r\n          this.selected = false;\r\n          \r\n          // Update instance if available\r\n          if (this.instance) {\r\n            this.instance.updateNode(this.id, { selected: false });\r\n          }\r\n          \r\n          // Dispatch deselection event\r\n          this.dispatchEvent(new CustomEvent('node-deselect', {\r\n            detail: { \r\n              nodeId: this.id, \r\n              selected: false,\r\n              node: {\r\n                id: this.id,\r\n                data: this.data,\r\n                position: this.position,\r\n                selected: false\r\n              }\r\n            },\r\n            bubbles: true,\r\n            composed: true\r\n          }));\r\n        }\r\n      }\r\n    };\r\n\r\n    private cleanup() {\r\n      document.removeEventListener('mousemove', this.handleMouseMove);\r\n      document.removeEventListener('mouseup', this.handleMouseUp);\r\n    }\r\n\r\n    /**\r\n     * Renders the resizer handles and border when the node is resizable and selected\r\n     * This is now called automatically by the mixin's render method\r\n     */\r\n    private renderResizer() {\r\n      if (!this.resizable || !this.selected) {\r\n        return html``;\r\n      }\r\n      return html`\r\n        <div class=\"resize-border\"></div>\r\n        <div class=\"resize-handle nw\" @mousedown=${this.handleResizeHandleClick('nw')}></div>\r\n        <div class=\"resize-handle ne\" @mousedown=${this.handleResizeHandleClick('ne')}></div>\r\n        <div class=\"resize-handle sw\" @mousedown=${this.handleResizeHandleClick('sw')}></div>\r\n        <div class=\"resize-handle se\" @mousedown=${this.handleResizeHandleClick('se')}></div>\r\n        <div class=\"resize-handle n\" @mousedown=${this.handleResizeHandleClick('n')}></div>\r\n        <div class=\"resize-handle s\" @mousedown=${this.handleResizeHandleClick('s')}></div>\r\n        <div class=\"resize-handle w\" @mousedown=${this.handleResizeHandleClick('w')}></div>\r\n        <div class=\"resize-handle e\" @mousedown=${this.handleResizeHandleClick('e')}></div>\r\n      `;\r\n    }\r\n\r\n    /**\r\n     * Helper method to get just the resizer HTML\r\n     * Use this in components that override render() method\r\n     */\r\n    protected getResizer() {\r\n      return this.renderResizer();\r\n    }\r\n\r\n    /**\r\n     * Automatically append resizer to DOM after rendering\r\n     * This works even when components override render() method\r\n     */\r\n    firstUpdated() {\r\n      this.appendResizerToDOM();\r\n      \r\n      // Set data attribute for CSS cursor styling\r\n      if (this.drag_handle_selector) {\r\n        this.setAttribute('data-drag-handle-selector', '');\r\n      }\r\n      \r\n      // Wait for DOM to be fully rendered before attaching drag handle listener\r\n      Promise.resolve().then(() => {\r\n        this.attachDragHandleListener();\r\n        this.adjustHeightToContent();\r\n      });\r\n    }\r\n\r\n    updated(changedProperties: Map<string | number | symbol, unknown>) {\r\n      super.updated(changedProperties);\r\n      // Apply transform for positioning\r\n      this.style.transform = `translate(${this.position.x}px, ${this.position.y}px)`;\r\n      \r\n      // Adjust height to content if maxInitialHeight changed (only if not resizing)\r\n      if (changedProperties.has('maxInitialHeight') && !this.isResizing) {\r\n        // Wait a tick for content to render, then adjust height\r\n        Promise.resolve().then(() => {\r\n          this.adjustHeightToContent();\r\n        });\r\n      }\r\n      \r\n      // Re-append resizer if resizable or selected state changed\r\n      if (changedProperties.has('resizable') || changedProperties.has('selected')) {\r\n        this.appendResizerToDOM();\r\n      }\r\n      \r\n      // Re-attach drag handle listener if drag_handle_selector or draggable changed\r\n      if (changedProperties.has('drag_handle_selector') || changedProperties.has('draggable')) {\r\n        Promise.resolve().then(() => {\r\n          this.attachDragHandleListener();\r\n        });\r\n      }\r\n      \r\n      // Update cursor style based on drag_handle_selector\r\n      if (changedProperties.has('drag_handle_selector')) {\r\n        if (this.drag_handle_selector) {\r\n          this.setAttribute('data-drag-handle-selector', '');\r\n        } else {\r\n          this.removeAttribute('data-drag-handle-selector');\r\n        }\r\n      }\r\n    }\r\n\r\n    private appendResizerToDOM() {\r\n      // Remove existing resizer if it exists\r\n      this.removeExistingResizer();\r\n      \r\n      // Only append resizer if resizable and selected\r\n      if (this.resizable && this.selected) {\r\n        const resizerTemplate = this.renderResizer();\r\n        if (resizerTemplate) {\r\n          // Create a container for the resizer\r\n          const resizerContainer = document.createElement('div');\r\n          resizerContainer.className = 'mixin-resizer-container';\r\n          resizerContainer.style.cssText = `\r\n            position: absolute;\r\n            top: 0;\r\n            left: 0;\r\n            right: 0;\r\n            bottom: 0;\r\n            pointer-events: none;\r\n            z-index: 10;\r\n          `;\r\n          \r\n          // Append to shadow DOM\r\n          this.shadowRoot?.appendChild(resizerContainer);\r\n          \r\n          // Render the resizer content using Lit's render function\r\n          render(resizerTemplate, resizerContainer);\r\n        }\r\n      }\r\n    }\r\n\r\n    private removeExistingResizer() {\r\n      const existingResizer = this.shadowRoot?.querySelector('.mixin-resizer-container');\r\n      if (existingResizer) {\r\n        existingResizer.remove();\r\n      }\r\n    }\r\n\r\n    /**\r\n     * Attach mousedown listener to the drag handle element if drag_handle_selector is set\r\n     */\r\n    private attachDragHandleListener() {\r\n      // Remove existing listener first\r\n      this.removeDragHandleListener();\r\n      \r\n      // Only attach if draggable and drag_handle_selector is set\r\n      if (!this.draggable || !this.drag_handle_selector) {\r\n        return;\r\n      }\r\n      \r\n      const shadowRoot = this.shadowRoot;\r\n      if (!shadowRoot) {\r\n        // Shadow root not ready yet, try again after a short delay\r\n        setTimeout(() => this.attachDragHandleListener(), 0);\r\n        return;\r\n      }\r\n      \r\n      // Find the drag handle element in shadow root\r\n      const dragHandleElement = shadowRoot.querySelector(this.drag_handle_selector) as HTMLElement;\r\n      \r\n      if (dragHandleElement) {\r\n        this.dragHandleElement = dragHandleElement;\r\n        // Attach the mousedown listener directly to the drag handle element\r\n        dragHandleElement.addEventListener('mousedown', this.handleMouseDown);\r\n        \r\n        // Set cursor style on the drag handle - it will show grab cursor\r\n        dragHandleElement.style.cursor = 'grab';\r\n      }\r\n    }\r\n\r\n    /**\r\n     * Remove mousedown listener from the drag handle element\r\n     */\r\n    private removeDragHandleListener() {\r\n      if (this.dragHandleElement) {\r\n        this.dragHandleElement.removeEventListener('mousedown', this.handleMouseDown);\r\n        this.dragHandleElement.style.cursor = '';\r\n        this.dragHandleElement = null;\r\n      }\r\n    }\r\n\r\n    private handleResizeHandleClick = (handle: string) => {\r\n      return (e: MouseEvent) => {\r\n        e.preventDefault();\r\n        e.stopPropagation();\r\n        e.stopImmediatePropagation();\r\n        this.handleResizeStart(e, handle);\r\n      };\r\n    };\r\n\r\n    /**\r\n     * Adjusts node height to fit content up to maxInitialHeight\r\n     * If maxInitialHeight is 0, this method does nothing\r\n     * If content height > maxInitialHeight: sets height to maxInitialHeight (content will scroll)\r\n     * If content height <= maxInitialHeight: doesn't set height (lets it fit to content)\r\n     * Called automatically in firstUpdated, but can be called manually after content loads\r\n     */\r\n    protected adjustHeightToContent() {\r\n      // Only apply logic if maxInitialHeight is set (> 0)\r\n      if (this.maxInitialHeight <= 0) return;\r\n      \r\n      // Don't adjust if currently resizing or if instance/node not ready\r\n      if (!this.instance || !this.id || this.isResizing) return;\r\n      \r\n      // Temporarily remove height constraint to measure actual content height\r\n      const originalHeight = this.style.height;\r\n      this.style.height = 'auto';\r\n      \r\n      // Force a reflow to ensure content is measured\r\n      this.offsetHeight;\r\n      \r\n      // Measure the actual content height (scrollHeight includes all content)\r\n      const contentHeight = this.scrollHeight || this.getBoundingClientRect().height;\r\n      \r\n      // Only set height if content exceeds maxInitialHeight\r\n      if (contentHeight > this.maxInitialHeight) {\r\n        // Content exceeds limit - set height to maxInitialHeight\r\n        this.style.height = `${this.maxInitialHeight}px`;\r\n        \r\n        // Update instance with calculated height\r\n        this.instance.updateNode(this.id, {\r\n          height: this.maxInitialHeight,\r\n          measured: { \r\n            width: this.offsetWidth || this.getBoundingClientRect().width,\r\n            height: this.maxInitialHeight \r\n          }\r\n        });\r\n      } else {\r\n        // Content fits within limit - don't set height, let it fit naturally\r\n        // But restore original height style if it was set\r\n        if (originalHeight) {\r\n          this.style.height = originalHeight;\r\n        } else {\r\n          // Clear height to let content determine size\r\n          this.style.height = '';\r\n        }\r\n        \r\n        // Update instance with actual content height\r\n        if (contentHeight > 0) {\r\n          this.instance.updateNode(this.id, {\r\n            height: contentHeight,\r\n            measured: { \r\n              width: this.offsetWidth || this.getBoundingClientRect().width,\r\n              height: contentHeight \r\n            }\r\n          });\r\n        }\r\n      }\r\n    }\r\n\r\n    /**\r\n     * Notifies the flow instance that handles have been dynamically added/updated\r\n     * Call this after using Lit's render() to add handles dynamically (e.g., after API data loads)\r\n     * \r\n     * This method:\r\n     * 1. Waits for DOM update to complete\r\n     * 2. Updates node dimensions to trigger handle position recalculation\r\n     * 3. Dispatches a custom event for flow canvas to listen to\r\n     * \r\n     * @example\r\n     * ```typescript\r\n     * async loadFields() {\r\n     *   const fields = await fetchFields();\r\n     *   const container = this.shadowRoot.querySelector('.fields-container');\r\n     *   render(fieldsTemplate, container);\r\n     *   \r\n     *   // Notify flow instance after handles are rendered\r\n     *   this.notifyHandlesUpdated();\r\n     * }\r\n     * ```\r\n     */\r\n    protected async notifyHandlesUpdated(options?: {\r\n      /** Optional list of handle IDs that were added/updated */\r\n      handleIds?: string[];\r\n      /** Whether to update node dimensions (default: true) */\r\n      updateDimensions?: boolean;\r\n    }) {\r\n      const { handleIds, updateDimensions = true } = options || {};\r\n      \r\n      // Wait for any pending DOM updates\r\n      await this.updateComplete;\r\n      \r\n      // Small delay to ensure handles are fully rendered in the DOM\r\n      await new Promise(resolve => setTimeout(resolve, 0));\r\n      \r\n      if (this.instance && this.id) {\r\n        // Update node dimensions to trigger flow canvas recalculation\r\n        // This forces the flow canvas to recalculate handle positions\r\n        if (updateDimensions) {\r\n          const rect = this.getBoundingClientRect();\r\n          const currentWidth = rect.width;\r\n          const currentHeight = rect.height;\r\n          \r\n          this.instance.updateNode(this.id, {\r\n            width: currentWidth,\r\n            height: currentHeight,\r\n            measured: { width: currentWidth, height: currentHeight }\r\n          });\r\n        }\r\n        \r\n        // Dispatch custom event that flow canvas can listen to\r\n        this.dispatchEvent(new CustomEvent('node-handles-updated', {\r\n          detail: { \r\n            nodeId: this.id,\r\n            handleIds: handleIds || [],\r\n            timestamp: Date.now()\r\n          },\r\n          bubbles: true,\r\n          composed: true\r\n        }));\r\n      }\r\n    }\r\n  }\r\n\r\n  return NodeMixinClass as any;\r\n};\r\n\r\ntype Constructor<T = {}> = new (...args: any[]) => T;\r\n"],"names":["XYPanZoom","getSystemBezierPath","getSystemSmoothStepPath","getSystemStraightPath","FlowCanvas","LitElement","e","Position","unsafeStatic","html","styleMap","css","__decorateClass","property","customElement","NodeResizer","FlowNode","FlowEdge","width","height","refX","refY","color","orient","path","svg","FlowBackground","FlowMinimap","FlowControls","ERDTableNode","ShapeNode","BaseNode","BaseNodeHeader","BaseNodeHeaderTitle","BaseNodeContent","BaseNodeFooter","render"],"mappings":"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"}