@ghchinoy/litflow 0.2.4 → 0.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"litflow.js","sources":["../src/store.ts","../src/lit-node.ts","../src/lit-edge.ts","../src/lit-flow.ts","../src/lit-handle.ts","../src/lit-controls.ts","../src/lit-minimap.ts","../src/lit-sidebar.ts","../src/lit-gemini-prompt-node.ts","../src/lit-gemini-image-node.ts"],"sourcesContent":["import { signal } from '@lit-labs/signals';\nimport {\n type NodeBase,\n type EdgeBase,\n type InternalNodeBase,\n type CoordinateExtent,\n type NodeOrigin,\n type SnapGrid,\n type Transform,\n type PanZoomInstance,\n type ConnectionInProgress,\n infiniteExtent,\n} from '@xyflow/system';\n\nexport interface FlowState {\n nodes: ReturnType<typeof signal<NodeBase[]>>;\n edges: ReturnType<typeof signal<EdgeBase[]>>;\n nodeLookup: Map<string, InternalNodeBase>;\n parentLookup: Map<string, Map<string, InternalNodeBase>>;\n nodeExtent: CoordinateExtent;\n snapGrid: SnapGrid;\n snapToGrid: boolean;\n nodeOrigin: NodeOrigin;\n multiSelectionActive: boolean;\n transform: ReturnType<typeof signal<Transform>>;\n autoPanOnNodeDrag: boolean;\n nodesDraggable: boolean;\n selectNodesOnDrag: boolean;\n nodeDragThreshold: number;\n panZoom: PanZoomInstance | null;\n domNode: Element | null;\n connectionInProgress: ReturnType<typeof signal<ConnectionInProgress | null>>;\n}\n\nexport function createInitialState(): FlowState {\n return {\n nodes: signal([]),\n edges: signal([]),\n nodeLookup: new Map(),\n parentLookup: new Map(),\n nodeExtent: infiniteExtent,\n snapGrid: [15, 15],\n snapToGrid: false,\n nodeOrigin: [0, 0],\n multiSelectionActive: false,\n transform: signal([0, 0, 1]),\n autoPanOnNodeDrag: true,\n nodesDraggable: true,\n selectNodesOnDrag: true,\n nodeDragThreshold: 0,\n panZoom: null,\n domNode: null,\n connectionInProgress: signal(null),\n };\n}\n","import { LitElement, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { SignalWatcher } from '@lit-labs/signals';\n\ntype Constructor<T> = new (...args: any[]) => T;\n\n@customElement('lit-node')\nexport class LitNode extends (SignalWatcher as <T extends Constructor<LitElement>>(base: T) => T)(LitElement) {\n createRenderRoot() {\n return this;\n }\n\n @property({ type: String })\n label = '';\n\n @property({ type: String, reflect: true })\n type = 'default';\n\n @property({ type: Object })\n data: any = {};\n\n @property({ type: Boolean, reflect: true })\n selected = false;\n\n @property({ type: String, attribute: 'data-id', reflect: true })\n nodeId = '';\n\n @property({ type: Number, attribute: 'position-x' })\n positionX = 0;\n\n @property({ type: Number, attribute: 'position-y' })\n positionY = 0;\n\n render() {\n return html`\n <div class=\"label\" style=\"font-size: var(--md-sys-typescale-body-medium-size); color: var(--md-sys-color-on-surface); pointer-events: none; font-family: var(--md-sys-typescale-body-medium-font);\">${this.label}</div>\n <slot></slot>\n ${this.type === 'input' || this.type === 'default'\n ? html`<lit-handle type=\"source\" data-handlepos=\"bottom\" data-nodeid=\"${this.nodeId}\"></lit-handle>`\n : ''}\n ${this.type === 'output' || this.type === 'default'\n ? html`<lit-handle type=\"target\" data-handlepos=\"top\" data-nodeid=\"${this.nodeId}\"></lit-handle>`\n : ''}\n `;\n }\n}\n","import { LitElement, css, svg } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { SignalWatcher } from '@lit-labs/signals';\nimport { getBezierPath, Position } from '@xyflow/system';\n\ntype Constructor<T> = new (...args: any[]) => T;\n\n@customElement('lit-edge')\nexport class LitEdge extends (SignalWatcher as <T extends Constructor<LitElement>>(base: T) => T)(LitElement) {\n static styles = css`\n :host {\n display: contents;\n }\n\n path {\n fill: none;\n stroke: #b1b1b7;\n stroke-width: 2;\n }\n\n :host([selected]) path {\n stroke: #555;\n }\n `;\n\n @property({ type: Number }) sourceX = 0;\n @property({ type: Number }) sourceY = 0;\n @property({ type: Number }) targetX = 0;\n @property({ type: Number }) targetY = 0;\n @property({ type: String }) sourcePosition = Position.Right;\n @property({ type: String }) targetPosition = Position.Left;\n @property({ type: Boolean, reflect: true }) selected = false;\n\n render() {\n const [path] = getBezierPath({\n sourceX: this.sourceX,\n sourceY: this.sourceY,\n sourcePosition: this.sourcePosition as Position,\n targetX: this.targetX,\n targetY: this.targetY,\n targetPosition: this.targetPosition as Position,\n });\n\n return svg`\n <path d=\"${path}\" />\n `;\n }\n}\n","import { LitElement, css, svg } from 'lit';\nimport { html, unsafeStatic } from 'lit/static-html.js';\nimport { customElement, property, query, state } from 'lit/decorators.js';\nimport { SignalWatcher } from '@lit-labs/signals';\nimport {\n XYPanZoom,\n XYDrag,\n XYHandle,\n ConnectionMode,\n PanOnScrollMode,\n Position,\n type PanZoomInstance,\n type XYDragInstance,\n type Viewport,\n type NodeBase,\n adoptUserNodes,\n updateAbsolutePositions,\n getHandlePosition,\n getBezierPath,\n getSmoothStepPath,\n getStraightPath,\n} from '@xyflow/system';\nimport { createInitialState, type FlowState } from './store';\nimport { m3Tokens } from './theme';\nimport './lit-node';\nimport './lit-edge';\n\ntype Constructor<T> = new (...args: any[]) => T;\n\nconst boolConverter = {\n fromAttribute: (value: string | null) => value !== 'false' && value !== null,\n toAttribute: (value: boolean) => (value ? '' : null),\n};\n\n@customElement('lit-flow')\nexport class LitFlow extends (SignalWatcher as <T extends Constructor<LitElement>>(base: T) => T)(LitElement) {\n static styles = [\n m3Tokens,\n css`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n overflow: hidden;\n position: relative;\n background-color: var(--md-sys-color-background);\n color: var(--md-sys-color-on-background);\n font-family: var(--md-sys-typescale-body-medium-font);\n }\n\n .xyflow__renderer {\n width: 100%;\n height: 100%;\n position: absolute;\n top: 0;\n left: 0;\n outline: none;\n }\n\n .xyflow__renderer:focus-visible {\n box-shadow: inset 0 0 0 2px var(--md-sys-color-primary);\n }\n\n .xyflow__renderer.has-grid {\n background-image: radial-gradient(var(--md-sys-color-outline-variant) 1px, transparent 0);\n background-size: 20px 20px;\n }\n\n .xyflow__viewport {\n transform-origin: 0 0;\n width: 100%;\n height: 100%;\n }\n\n .xyflow__edges {\n position: absolute;\n width: 100%;\n height: 100%;\n pointer-events: none;\n overflow: visible;\n }\n\n .xyflow__nodes {\n position: absolute;\n width: 100%;\n height: 100%;\n pointer-events: none;\n }\n\n .xyflow__node {\n position: absolute;\n pointer-events: all;\n cursor: grab;\n user-select: none;\n display: block;\n background: var(--lit-flow-node-bg);\n border: 1px solid var(--lit-flow-node-border);\n padding: 12px;\n border-radius: var(--md-sys-shape-corner-small);\n min-width: 120px;\n text-align: center;\n box-shadow: var(--md-sys-elevation-1);\n box-sizing: border-box;\n color: var(--lit-flow-node-text);\n font-size: var(--md-sys-typescale-body-medium-size);\n transition: box-shadow 0.2s ease-in-out, border-color 0.2s ease-in-out, border-width 0.1s ease-in-out;\n }\n\n .xyflow__node[type=\"group\"] {\n padding: 0;\n background: none;\n border: none;\n box-shadow: none;\n pointer-events: none;\n }\n\n .xyflow__node[type=\"group\"] > * {\n pointer-events: all;\n }\n\n .xyflow__node[selected] {\n border-color: var(--lit-flow-node-selected-border);\n border-width: 3px;\n box-shadow: var(--md-sys-elevation-3);\n margin: -2px; /* Offset the border width increase to prevent layout shift */\n }\n\n .xyflow__node[type=\"input\"] {\n border-top: 4px solid var(--md-sys-color-primary);\n }\n\n .xyflow__node[type=\"output\"] {\n border-bottom: 4px solid var(--md-sys-color-secondary);\n }\n\n .xyflow__node:active {\n cursor: grabbing;\n }\n\n .lit-flow__handle {\n display: block;\n position: absolute;\n width: 10px;\n height: 10px;\n border-radius: 50%;\n z-index: 10;\n pointer-events: all;\n cursor: pointer;\n border: 2px solid var(--lit-flow-handle-outline);\n background-clip: padding-box;\n box-sizing: border-box;\n transition: transform 0.1s ease-in-out;\n }\n\n .lit-flow__handle:hover {\n transform: scale(1.2);\n }\n\n .lit-flow__handle.source {\n background-color: var(--lit-flow-handle-source);\n }\n\n .lit-flow__handle.target {\n background-color: var(--lit-flow-handle-target);\n }\n\n .lit-flow__handle[data-handlepos=\"top\"] {\n top: -5px;\n left: 50%;\n transform: translateX(-50%);\n }\n\n .lit-flow__handle[data-handlepos=\"bottom\"] {\n bottom: -5px;\n left: 50%;\n transform: translateX(-50%);\n }\n\n .lit-flow__handle[data-handlepos=\"left\"] {\n left: -5px;\n top: 50%;\n transform: translateY(-50%);\n }\n\n .lit-flow__handle[data-handlepos=\"right\"] {\n right: -5px;\n top: 50%;\n transform: translateY(-50%);\n }\n\n .xyflow__connection-path {\n fill: none;\n stroke: var(--md-sys-color-outline);\n stroke-width: 2;\n stroke-dasharray: 5,5;\n pointer-events: none;\n }\n\n .xyflow__edge-label {\n background: var(--md-sys-color-surface);\n color: var(--md-sys-color-on-surface);\n padding: 2px 6px;\n border-radius: var(--md-sys-shape-corner-extra-small);\n font-size: var(--md-sys-typescale-label-small-size);\n font-family: var(--md-sys-typescale-body-medium-font);\n border: 1px solid var(--md-sys-color-outline-variant);\n white-space: nowrap;\n pointer-events: all;\n user-select: none;\n box-shadow: var(--md-sys-elevation-1);\n }\n\n .xyflow__selection {\n position: absolute;\n top: 0;\n left: 0;\n background: var(--md-sys-color-primary-container);\n border: 1px solid var(--md-sys-color-primary);\n opacity: 0.4;\n pointer-events: none;\n z-index: 1000;\n }\n `\n ];\n\n @query('.xyflow__renderer')\n _renderer?: HTMLElement;\n\n @query('.xyflow__viewport')\n _viewport?: HTMLElement;\n\n @state()\n private _panZoom?: PanZoomInstance;\n\n private _drags = new Map<string, XYDragInstance>();\n private _resizeObserver?: ResizeObserver;\n\n @state()\n private _state: FlowState = createInitialState();\n\n @property({ type: Object })\n nodeTypes: Record<string, string> = {\n default: 'lit-node',\n input: 'lit-node',\n output: 'lit-node',\n };\n\n @property({ type: Boolean, attribute: 'show-controls', reflect: true })\n showControls = false;\n\n @property({ type: Boolean, attribute: 'show-minimap', reflect: true, converter: boolConverter })\n showMinimap = false;\n\n @property({ type: Boolean, attribute: 'show-grid', reflect: true, converter: boolConverter })\n showGrid = true;\n\n @property({ type: Boolean, attribute: 'nodes-draggable', reflect: true, converter: boolConverter })\n nodesDraggable = true;\n\n @property({ type: Boolean, attribute: 'nodes-connectable', reflect: true, converter: boolConverter })\n nodesConnectable = true;\n\n @property({ type: Boolean, attribute: 'pan-on-drag', reflect: true, converter: boolConverter })\n panOnDrag = true;\n\n @property({ type: Boolean, attribute: 'zoom-on-scroll', reflect: true, converter: boolConverter })\n zoomOnScroll = true;\n\n @property({ type: Boolean, attribute: 'zoom-on-pinch', reflect: true, converter: boolConverter })\n zoomOnPinch = true;\n\n @property({ type: Boolean, attribute: 'zoom-on-double-click', reflect: true, converter: boolConverter })\n zoomOnDoubleClick = true;\n\n @property({ type: Boolean, attribute: 'prompt-on-drop', reflect: true, converter: boolConverter })\n promptOnDrop = false;\n\n @property({ type: String, attribute: 'selection-mode' })\n selectionMode: 'pan' | 'select' = 'pan';\n\n @state()\n private _selectionRect: { x: number; y: number; width: number; height: number } | null = null;\n\n private _selectionStart: { x: number; y: number } | null = null;\n\n @state()\n private _width = 0;\n\n @state()\n private _height = 0;\n\n @property({ type: Array })\n set nodes(nodes: NodeBase[]) {\n this._state.nodes.set(nodes);\n adoptUserNodes(nodes, this._state.nodeLookup, this._state.parentLookup, {\n nodeOrigin: this._state.nodeOrigin,\n nodeExtent: this._state.nodeExtent,\n });\n updateAbsolutePositions(this._state.nodeLookup, this._state.parentLookup, {\n nodeOrigin: this._state.nodeOrigin,\n nodeExtent: this._state.nodeExtent,\n });\n }\n\n get nodes() {\n return this._state.nodes.get();\n }\n\n private _discoverNodes() {\n if (this.nodes.length > 0) return;\n\n const childNodes = Array.from(this.querySelectorAll('lit-node')) as any[];\n if (childNodes.length > 0) {\n const nodes: NodeBase[] = childNodes.map((el) => ({\n id: el.id || el.getAttribute('id') || `node-${Math.random().toString(36).substr(2, 9)}`,\n type: el.type || el.getAttribute('type') || 'default',\n position: {\n x: parseFloat(el.getAttribute('position-x') || '0'),\n y: parseFloat(el.getAttribute('position-y') || '0'),\n },\n data: {\n label: el.label || el.getAttribute('label') || '',\n ...el.data,\n },\n }));\n this.nodes = nodes;\n // Force update of internal nodeId for child elements\n childNodes.forEach((el, i) => {\n el.nodeId = nodes[i].id;\n });\n }\n }\n\n @property({ type: Array })\n set edges(edges: any[]) {\n this._state.edges.set(edges);\n }\n\n get edges() {\n return this._state.edges.get();\n }\n\n @property({ type: Object })\n viewport: Viewport = { x: 0, y: 0, zoom: 1 };\n\n connectedCallback() {\n super.connectedCallback();\n this._discoverNodes();\n this._resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n if (entry.target === this) {\n this._width = entry.contentRect.width;\n this._height = entry.contentRect.height;\n } else if (entry.target === this._renderer) {\n // Handle renderer resize if needed\n } else {\n const id = (entry.target as HTMLElement).dataset.id;\n if (id) {\n this._updateNodeDimensions(id, entry.target as HTMLElement);\n }\n }\n }\n });\n this._resizeObserver.observe(this);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this._resizeObserver?.disconnect();\n }\n\n private async _updateNodeDimensions(id: string, element: HTMLElement) {\n const node = this._state.nodeLookup.get(id);\n if (node) {\n // Wait for Lit element to finish rendering its shadow DOM\n if ('updateComplete' in element) {\n await (element as any).updateComplete;\n }\n\n const { width, height } = element.getBoundingClientRect();\n const zoom = this._state.transform.get()[2];\n node.measured = {\n width: width / zoom,\n height: height / zoom,\n };\n\n // Sync back to user node to preserve dimensions across adoptUserNodes calls\n const userNode = this.nodes.find((n) => n.id === id);\n if (userNode) {\n userNode.measured = node.measured;\n }\n\n // Update handle bounds\n // Since lit-node is now light-DOM, we look in the element itself, not shadowRoot\n const handles = element.querySelectorAll('lit-handle');\n if (handles && handles.length > 0) {\n const sourceBounds: any[] = [];\n const targetBounds: any[] = [];\n\n handles.forEach((h: any) => {\n const bounds = h.getBoundingClientRect();\n const nodeRect = element.getBoundingClientRect();\n const handleData = {\n id: h.handleId || null,\n type: h.type,\n position: h.position,\n x: (bounds.left - nodeRect.left) / zoom,\n y: (bounds.top - nodeRect.top) / zoom,\n width: bounds.width / zoom,\n height: bounds.height / zoom,\n };\n\n if (h.type === 'source') sourceBounds.push(handleData);\n else targetBounds.push(handleData);\n });\n\n node.internals.handleBounds = {\n source: sourceBounds,\n target: targetBounds,\n };\n console.log(`Node ${id} handleBounds:`, node.internals.handleBounds);\n }\n\n // Update absolute positions without clearing the lookup\n updateAbsolutePositions(this._state.nodeLookup, this._state.parentLookup, {\n nodeOrigin: this._state.nodeOrigin,\n nodeExtent: this._state.nodeExtent,\n });\n\n // Trigger update via signal\n this._state.nodes.set([...this.nodes]);\n }\n }\n\n private _selectNode(id: string, multi: boolean) {\n const newNodes = this.nodes.map((node) => {\n if (node.id === id) {\n return { ...node, selected: !node.selected };\n }\n return multi ? node : { ...node, selected: false };\n });\n this.nodes = newNodes;\n }\n\n /**\n * Projects a screen position (relative to the flow container) to canvas coordinates.\n * Useful for Drag & Drop and context menus.\n */\n project(position: { x: number; y: number }): { x: number; y: number } {\n const [tx, ty, zoom] = this._state.transform.get();\n return {\n x: (position.x - tx) / zoom,\n y: (position.y - ty) / zoom,\n };\n }\n\n private _updatePanZoom(userSelectionActive = false) {\n if (!this._panZoom) return;\n\n this._panZoom.update({\n noWheelClassName: 'nowheel',\n noPanClassName: 'nopan',\n preventScrolling: true,\n panOnScroll: false,\n panOnDrag: this.panOnDrag,\n panOnScrollMode: PanOnScrollMode.Free,\n panOnScrollSpeed: 0.5,\n userSelectionActive,\n zoomOnPinch: this.zoomOnPinch,\n zoomOnScroll: this.zoomOnScroll,\n zoomOnDoubleClick: this.zoomOnDoubleClick,\n zoomActivationKeyPressed: false,\n lib: 'lit',\n onTransformChange: () => {},\n connectionInProgress: !!this._state.connectionInProgress.get(),\n paneClickDistance: 0,\n });\n }\n\n firstUpdated() {\n if (this._renderer) {\n this._state.domNode = this._renderer;\n this._resizeObserver?.observe(this._renderer);\n\n // Add capture listener for selection to intercept before D3\n this._renderer.addEventListener('pointerdown', (e) => this._onPointerDown(e), { capture: true });\n\n this._panZoom = XYPanZoom({\n domNode: this._renderer,\n minZoom: 0.5,\n maxZoom: 2,\n translateExtent: this._state.nodeExtent,\n viewport: this.viewport,\n onDraggingChange: () => {},\n onPanZoom: (_, { x, y, zoom }) => {\n this.viewport = { x, y, zoom };\n this._state.transform.set([x, y, zoom]);\n if (this._viewport) {\n this._viewport.style.transform = `translate(${x}px,${y}px) scale(${zoom})`;\n }\n },\n });\n\n this._updatePanZoom();\n this._state.panZoom = this._panZoom;\n }\n }\n\n updated(changedProperties: Map<string, any>) {\n if (changedProperties.has('nodes') || changedProperties.has('nodesDraggable')) {\n this._setupDrags();\n }\n\n if (this._panZoom && (\n changedProperties.has('panOnDrag') ||\n changedProperties.has('zoomOnScroll') ||\n changedProperties.has('zoomOnPinch') ||\n changedProperties.has('zoomOnDoubleClick')\n )) {\n this._updatePanZoom();\n }\n }\n\n private _setupDrags() {\n const nodeElements = this.shadowRoot?.querySelectorAll('.xyflow__node');\n const currentIds = new Set<string>();\n\n nodeElements?.forEach((el) => {\n const id = (el as HTMLElement).dataset.id;\n if (id) {\n currentIds.add(id);\n this._resizeObserver?.observe(el);\n \n // Add click listener for selection\n (el as HTMLElement).onclick = (e) => {\n e.stopPropagation();\n this._selectNode(id, e.shiftKey || e.metaKey);\n };\n\n // Update cursor based on draggability\n (el as HTMLElement).style.cursor = this.nodesDraggable ? 'grab' : 'default';\n\n if (!this.nodesDraggable) {\n this._drags.delete(id);\n return;\n }\n\n let dragInstance = this._drags.get(id);\n if (!dragInstance) {\n dragInstance = XYDrag({\n getStoreItems: () => ({\n ...this._state,\n nodes: this._state.nodes.get(),\n edges: this._state.edges.get(),\n transform: this._state.transform.get(),\n panBy: async (delta) => {\n const { panZoom, nodeExtent } = this._state;\n const transform = this._state.transform.get();\n if (!panZoom) return false;\n const nextViewport = await panZoom.setViewportConstrained(\n {\n x: transform[0] + delta.x,\n y: transform[1] + delta.y,\n zoom: transform[2],\n },\n [[0, 0], [this.offsetWidth, this.offsetHeight]],\n nodeExtent\n );\n return !!nextViewport;\n },\n updateNodePositions: (dragItems) => {\n dragItems.forEach((item, id) => {\n const node = this._state.nodeLookup.get(id);\n if (node) {\n node.position = item.position;\n node.internals.positionAbsolute = item.internals.positionAbsolute;\n const userNode = this.nodes.find((n) => n.id === id);\n if (userNode) userNode.position = item.position;\n }\n });\n\n // Recalculate all absolute positions to ensure children follow parents\n updateAbsolutePositions(this._state.nodeLookup, this._state.parentLookup, {\n nodeOrigin: this._state.nodeOrigin,\n nodeExtent: this._state.nodeExtent,\n });\n\n // Trigger update via signal\n this._state.nodes.set([...this.nodes]);\n },\n unselectNodesAndEdges: () => {},\n }),\n });\n this._drags.set(id, dragInstance);\n }\n\n dragInstance.update({\n domNode: el as HTMLElement,\n nodeId: id,\n });\n }\n });\n\n // Clean up stale drag instances\n for (const id of this._drags.keys()) {\n if (!currentIds.has(id)) {\n this._drags.delete(id);\n }\n }\n }\n\n private _renderEdge(edge: any) {\n const sourceNode = this._state.nodeLookup.get(edge.source);\n const targetNode = this._state.nodeLookup.get(edge.target);\n if (!sourceNode || !targetNode) return null;\n\n // Check if either node is hidden in the user-facing nodes array\n const userSource = this.nodes.find(n => n.id === edge.source);\n const userTarget = this.nodes.find(n => n.id === edge.target);\n if (userSource?.hidden || userTarget?.hidden) return null;\n\n const sourceHandle = (sourceNode.internals.handleBounds?.source || []).find(\n (h: any) => h.id === (edge.sourceHandle || null)\n ) || sourceNode.internals.handleBounds?.source?.[0] || { \n id: null, \n type: 'source', \n nodeId: edge.source, \n position: Position.Bottom, \n x: (sourceNode.measured.width || 0) / 2, \n y: sourceNode.measured.height || 0, \n width: 1, \n height: 1 \n };\n\n const targetHandle = (targetNode.internals.handleBounds?.target || []).find(\n (h: any) => h.id === (edge.targetHandle || null)\n ) || targetNode.internals.handleBounds?.target?.[0] || { \n id: null, \n type: 'target', \n nodeId: edge.target, \n position: Position.Top, \n x: (targetNode.measured.width || 0) / 2, \n y: 0, \n width: 1, \n height: 1 \n };\n\n const sPos = getHandlePosition(sourceNode, sourceHandle, sourceHandle.position, true);\n const tPos = getHandlePosition(targetNode, targetHandle, targetHandle.position, true);\n\n let path = '';\n let labelX = 0;\n let labelY = 0;\n\n const pathParams = {\n sourceX: sPos.x,\n sourceY: sPos.y,\n sourcePosition: sourceHandle.position,\n targetX: tPos.x,\n targetY: tPos.y,\n targetPosition: targetHandle.position,\n };\n\n switch (edge.type) {\n case 'straight':\n [path, labelX, labelY] = getStraightPath(pathParams);\n break;\n case 'smoothstep':\n [path, labelX, labelY] = getSmoothStepPath(pathParams);\n break;\n case 'step':\n [path, labelX, labelY] = getSmoothStepPath({ ...pathParams, borderRadius: 0 });\n break;\n case 'bezier':\n default:\n [path, labelX, labelY] = getBezierPath(pathParams);\n break;\n }\n\n const getMarkerId = (marker: any) => {\n if (!marker) return null;\n const type = typeof marker === 'string' ? marker : marker.type;\n if (!type) return null;\n return `lit-flow__${type}${edge.selected ? '-selected' : ''}`;\n };\n\n const markerEndId = getMarkerId(edge.markerEnd);\n const markerStartId = getMarkerId(edge.markerStart);\n\n return svg`\n <g class=\"xyflow__edge\">\n <path\n d=\"${path}\"\n fill=\"none\"\n stroke=\"${edge.selected ? 'var(--md-sys-color-primary)' : 'var(--md-sys-color-outline-variant)'}\"\n stroke-width=\"${edge.selected ? '3' : '2'}\"\n marker-end=\"${markerEndId ? `url(#${markerEndId})` : ''}\"\n marker-start=\"${markerStartId ? `url(#${markerStartId})` : ''}\"\n style=\"pointer-events: none; transition: stroke 0.2s ease-in-out, stroke-width 0.2s ease-in-out;\"\n />\n ${edge.label \n ? svg`\n <foreignObject\n width=\"100\"\n height=\"30\"\n x=\"${labelX - 50}\"\n y=\"${labelY - 15}\"\n requiredExtensions=\"http://www.w3.org/1999/xhtml\"\n >\n <div style=\"display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;\">\n <div class=\"xyflow__edge-label\">${edge.label}</div>\n </div>\n </foreignObject>\n ` \n : ''}\n </g>\n `;\n }\n\n private _isPaneClick(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement || target instanceof SVGElement)) return false;\n \n // If it's the renderer itself, it's a pane click\n if (target === this._renderer) return true;\n \n // If it's the viewport or the edges SVG, it's a pane click\n if (target.classList.contains('xyflow__viewport') || \n target.classList.contains('xyflow__edges') ||\n target.classList.contains('xyflow__nodes')) return true;\n \n return false;\n }\n\n private _onPointerDown(e: PointerEvent) {\n const isPaneClick = this._isPaneClick(e.target);\n const isSelectionAction = e.shiftKey || this.selectionMode === 'select';\n\n if (isPaneClick && isSelectionAction) {\n console.log('LitFlow: Selection started', { x: e.clientX, y: e.clientY, shift: e.shiftKey });\n const rect = this._renderer!.getBoundingClientRect();\n this._selectionStart = {\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n };\n this._selectionRect = { x: this._selectionStart.x, y: this._selectionStart.y, width: 0, height: 0 };\n \n // Disable panning while selecting\n this._updatePanZoom(true);\n \n this._renderer!.setPointerCapture(e.pointerId);\n \n // Prevent D3 from starting a pan\n e.stopImmediatePropagation();\n }\n }\n\n private _onPointerMove(e: PointerEvent) {\n if (this._selectionStart && this._renderer) {\n const rect = this._renderer.getBoundingClientRect();\n const currentX = e.clientX - rect.left;\n const currentY = e.clientY - rect.top;\n \n const x = Math.min(this._selectionStart.x, currentX);\n const y = Math.min(this._selectionStart.y, currentY);\n const width = Math.abs(this._selectionStart.x - currentX);\n const height = Math.abs(this._selectionStart.y - currentY);\n \n this._selectionRect = { x, y, width, height };\n\n // Live selection\n this._performSelection(e.shiftKey);\n }\n }\n\n private _onPointerUp(e: PointerEvent) {\n if (this._selectionStart) {\n console.log('LitFlow: Selection ended', this._selectionRect);\n // Final selection (already updated live, but good to ensure final state)\n this._performSelection(e.shiftKey);\n \n this._selectionStart = null;\n this._selectionRect = null;\n \n // Re-enable panning\n this._updatePanZoom(false);\n \n if (this._renderer) {\n this._renderer.releasePointerCapture(e.pointerId);\n }\n }\n }\n\n private _performSelection(multi: boolean) {\n if (!this._selectionRect) return;\n\n const start = this.project({ x: this._selectionRect.x, y: this._selectionRect.y });\n const end = this.project({ \n x: this._selectionRect.x + this._selectionRect.width, \n y: this._selectionRect.y + this._selectionRect.height \n });\n\n const selectionBox = {\n x: Math.min(start.x, end.x),\n y: Math.min(start.y, end.y),\n width: Math.abs(start.x - end.x),\n height: Math.abs(start.y - end.y),\n };\n\n let nodesChanged = false;\n const newNodes = this.nodes.map(node => {\n const internalNode = this._state.nodeLookup.get(node.id);\n if (!internalNode) return node;\n\n const pos = internalNode.internals.positionAbsolute;\n const width = internalNode.measured.width || 0;\n const height = internalNode.measured.height || 0;\n\n const isInside = \n pos.x >= selectionBox.x &&\n pos.y >= selectionBox.y &&\n pos.x + width <= selectionBox.x + selectionBox.width &&\n pos.y + height <= selectionBox.y + selectionBox.height;\n\n const nextSelected = isInside || (multi && node.selected);\n \n if (nextSelected !== !!node.selected) {\n nodesChanged = true;\n return { ...node, selected: nextSelected };\n }\n return node;\n });\n\n if (nodesChanged) {\n this.nodes = newNodes;\n }\n\n // Select edges\n let edgesChanged = false;\n const nodeSelectionMap = new Map(newNodes.map(n => [n.id, !!n.selected]));\n \n const newEdges = this.edges.map(edge => {\n const sourceSelected = nodeSelectionMap.get(edge.source);\n const targetSelected = nodeSelectionMap.get(edge.target);\n \n const isInside = sourceSelected && targetSelected;\n const nextSelected = isInside || (multi && edge.selected);\n \n if (nextSelected !== !!edge.selected) {\n edgesChanged = true;\n return { ...edge, selected: nextSelected };\n }\n return edge;\n });\n\n if (edgesChanged) {\n this.edges = newEdges;\n }\n\n if (nodesChanged || edgesChanged) {\n this.dispatchEvent(new CustomEvent('selection-change', {\n detail: { \n nodes: this.nodes.filter(n => n.selected),\n edges: this.edges.filter(e => e.selected)\n }\n }));\n }\n }\n\n private _onHandlePointerDown(e: CustomEvent) {\n const { event, handleId, nodeId, type, handleDomNode } = e.detail;\n const isTarget = type === 'target';\n\n // Prevent starting a new connection if one is already in progress or if connectable is false\n if (this._state.connectionInProgress.get() || !this.nodesConnectable) {\n return;\n }\n\n const bounds = handleDomNode.getBoundingClientRect();\n const nodeRect = handleDomNode.parentElement?.getBoundingClientRect();\n const zoom = this._state.transform.get()[2];\n\n const fromHandle = {\n id: handleId,\n nodeId,\n type,\n position: handleDomNode.position,\n x: (bounds.left - (nodeRect?.left ?? 0)) / zoom,\n y: (bounds.top - (nodeRect?.top ?? 0)) / zoom,\n width: bounds.width / zoom,\n height: bounds.height / zoom,\n };\n\n XYHandle.onPointerDown(event, {\n handleId,\n nodeId,\n isTarget,\n domNode: this._renderer as HTMLDivElement,\n handleDomNode,\n nodeLookup: this._state.nodeLookup,\n connectionMode: ConnectionMode.Strict,\n lib: 'lit',\n autoPanOnConnect: true,\n flowId: 'lit-flow',\n dragThreshold: 0,\n panBy: async (delta) => {\n const viewport = this._panZoom?.getViewport();\n if (!viewport) return false;\n await this._panZoom?.setViewport({\n x: viewport.x + delta.x,\n y: viewport.y + delta.y,\n zoom: viewport.zoom,\n });\n return true;\n },\n getTransform: () => this._state.transform.get(),\n getFromHandle: () => fromHandle,\n updateConnection: (conn) => {\n if (conn.inProgress) {\n this._state.connectionInProgress.set(conn);\n } else {\n this._state.connectionInProgress.set(null);\n }\n },\n cancelConnection: () => {\n this._state.connectionInProgress.set(null);\n },\n onConnect: (connection) => {\n this.dispatchEvent(new CustomEvent('connect', {\n detail: connection\n }));\n // Default behavior: add the edge\n const id = `e-${connection.source}${connection.sourceHandle || ''}-${connection.target}${connection.targetHandle || ''}`;\n this.edges = [...this.edges, { ...connection, id }];\n },\n connectionRadius: 20,\n });\n }\n\n private _onDragOver(e: DragEvent) {\n e.preventDefault();\n if (e.dataTransfer) {\n e.dataTransfer.dropEffect = 'move';\n }\n }\n\n private _onDrop(e: DragEvent) {\n e.preventDefault();\n\n const type = e.dataTransfer?.getData('application/litflow');\n\n // check if the dropped element is valid\n if (typeof type === 'undefined' || !type) {\n return;\n }\n\n // Get the position of the drop relative to the flow container\n const rect = this.getBoundingClientRect();\n const position = this.project({\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n });\n\n let label = `${type} node`;\n if (this.promptOnDrop) {\n const userLabel = window.prompt('Enter node label:', label);\n if (userLabel === null) return; // Cancelled\n label = userLabel || label;\n }\n\n const newNode = {\n id: `node_${Date.now()}`,\n type,\n position,\n data: { label },\n };\n\n this.nodes = [...this.nodes, newNode];\n \n this.dispatchEvent(new CustomEvent('node-drop', {\n detail: { node: newNode, event: e }\n }));\n }\n\n private _renderConnectionLine(conn: any) {\n if (!conn) return null;\n\n const [path] = getBezierPath({\n sourceX: conn.from.x,\n sourceY: conn.from.y,\n sourcePosition: conn.fromPosition,\n targetX: conn.to.x,\n targetY: conn.to.y,\n targetPosition: conn.toPosition,\n });\n\n return svg`\n <path\n class=\"xyflow__connection-path\"\n d=\"${path}\"\n fill=\"none\"\n stroke=\"#b1b1b7\"\n stroke-width=\"2\"\n stroke-dasharray=\"5,5\"\n />\n `;\n }\n\n private _onKeyDown(e: KeyboardEvent) {\n // Don't handle if we are in an input field\n if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement || (e.target as HTMLElement).isContentEditable) {\n return;\n }\n\n if (e.key === 'Delete' || e.key === 'Backspace') {\n const selectedNodes = this.nodes.filter(n => n.selected);\n const selectedEdges = this.edges.filter(e => e.selected);\n\n if (selectedNodes.length > 0 || selectedEdges.length > 0) {\n const nodeIdsToRemove = new Set(selectedNodes.map(n => n.id));\n const edgeIdsToRemove = new Set(selectedEdges.map(e => e.id));\n\n // Also remove edges connected to removed nodes\n this.edges.forEach(edge => {\n if (nodeIdsToRemove.has(edge.source) || nodeIdsToRemove.has(edge.target)) {\n edgeIdsToRemove.add(edge.id);\n }\n });\n\n this.nodes = this.nodes.filter(n => !nodeIdsToRemove.has(n.id));\n this.edges = this.edges.filter(e => !edgeIdsToRemove.has(e.id));\n\n this.dispatchEvent(new CustomEvent('nodes-delete', {\n detail: { nodes: selectedNodes }\n }));\n this.dispatchEvent(new CustomEvent('edges-delete', {\n detail: { edges: selectedEdges }\n }));\n }\n }\n\n if (['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(e.key)) {\n const selectedNodes = this.nodes.filter(n => n.selected);\n if (selectedNodes.length > 0) {\n e.preventDefault();\n const step = e.shiftKey ? 10 : 1;\n const delta = {\n x: e.key === 'ArrowLeft' ? -step : e.key === 'ArrowRight' ? step : 0,\n y: e.key === 'ArrowUp' ? -step : e.key === 'ArrowDown' ? step : 0,\n };\n\n this.nodes = this.nodes.map(node => {\n if (node.selected) {\n return {\n ...node,\n position: {\n x: node.position.x + delta.x,\n y: node.position.y + delta.y,\n }\n };\n }\n return node;\n });\n }\n }\n }\n\n render() {\n const transform = this._state.transform.get();\n const connectionInProgress = this._state.connectionInProgress.get();\n\n return html`\n <div \n class=\"xyflow__renderer ${this.showGrid ? 'has-grid' : ''}\"\n tabindex=\"0\"\n @keydown=\"${this._onKeyDown}\"\n @dragover=\"${this._onDragOver}\"\n @drop=\"${this._onDrop}\"\n @pointermove=\"${this._onPointerMove}\"\n @pointerup=\"${this._onPointerUp}\"\n @click=\"${(e: MouseEvent) => {\n if (this._isPaneClick(e.target)) {\n this.nodes = this.nodes.map(n => ({ ...n, selected: false }));\n this.edges = this.edges.map(e => ({ ...e, selected: false }));\n }\n }}\"\n >\n <div\n class=\"xyflow__viewport\"\n style=\"transform: translate(${transform[0]}px, ${transform[1]}px) scale(${transform[2]})\"\n >\n <div class=\"xyflow__nodes\" @handle-pointer-down=\"${this._onHandlePointerDown}\">\n ${this.nodes.map((node) => {\n if (node.hidden) return null;\n const internalNode = this._state.nodeLookup.get(node.id);\n const pos = internalNode?.internals.positionAbsolute || node.position;\n const tagName = this.nodeTypes[node.type || 'default'] || this.nodeTypes.default;\n const tag = unsafeStatic(tagName);\n\n const style = (node as any).style || {};\n const styleString = Object.entries(style)\n .map(([k, v]) => `${k.replace(/([A-Z])/g, '-$1').toLowerCase()}: ${typeof v === 'number' ? `${v}px` : v}`)\n .join('; ');\n\n const width = (node as any).width || style.width;\n const height = (node as any).height || style.height;\n const widthStyle = width ? `width: ${typeof width === 'number' ? `${width}px` : width};` : '';\n const heightStyle = height ? `height: ${typeof height === 'number' ? `${height}px` : height};` : '';\n const zIndex = (node as any).zIndex ? `z-index: ${(node as any).zIndex};` : '';\n\n return html`\n <${tag}\n class=\"xyflow__node\"\n data-id=\"${node.id}\"\n type=\"${node.type || 'default'}\"\n .nodeId=\"${node.id}\"\n style=\"transform: translate(${pos.x}px, ${pos.y}px); ${styleString} ${widthStyle} ${heightStyle} ${zIndex}\"\n .data=\"${node.data}\"\n .label=\"${(node.data as any).label}\"\n .type=\"${node.type || 'default'}\"\n ?selected=\"${node.selected}\"\n >\n </${tag}>\n `;\n })}\n </div>\n <svg class=\"xyflow__edges\">\n <defs>\n <marker\n id=\"lit-flow__arrow\"\n viewBox=\"0 0 10 10\"\n refX=\"5\"\n refY=\"5\"\n markerWidth=\"6\"\n markerHeight=\"6\"\n orient=\"auto-start-reverse\"\n >\n <path d=\"M 0 0 L 10 5 L 0 10 z\" fill=\"var(--md-sys-color-outline-variant)\" />\n </marker>\n <marker\n id=\"lit-flow__arrowclosed\"\n viewBox=\"0 0 10 10\"\n refX=\"5\"\n refY=\"5\"\n markerWidth=\"6\"\n markerHeight=\"6\"\n orient=\"auto-start-reverse\"\n >\n <path d=\"M 0 0 L 10 5 L 0 10 z\" fill=\"var(--md-sys-color-outline-variant)\" />\n </marker>\n <marker\n id=\"lit-flow__arrow-selected\"\n viewBox=\"0 0 10 10\"\n refX=\"5\"\n refY=\"5\"\n markerWidth=\"6\"\n markerHeight=\"6\"\n orient=\"auto-start-reverse\"\n >\n <path d=\"M 0 0 L 10 5 L 0 10 z\" fill=\"var(--md-sys-color-primary)\" />\n </marker>\n <marker\n id=\"lit-flow__arrowclosed-selected\"\n viewBox=\"0 0 10 10\"\n refX=\"5\"\n refY=\"5\"\n markerWidth=\"6\"\n markerHeight=\"6\"\n orient=\"auto-start-reverse\"\n >\n <path d=\"M 0 0 L 10 5 L 0 10 z\" fill=\"var(--md-sys-color-primary)\" />\n </marker>\n </defs>\n ${this.edges.map((edge) => this._renderEdge(edge))}\n ${this._renderConnectionLine(connectionInProgress)}\n </svg>\n </div>\n ${this._selectionRect \n ? html`\n <div \n class=\"xyflow__selection\" \n style=\"transform: translate(${this._selectionRect.x}px, ${this._selectionRect.y}px); width: ${this._selectionRect.width}px; height: ${this._selectionRect.height}px;\"\n ></div>\n ` \n : ''}\n </div>\n ${this.showControls\n ? html`<lit-controls .panZoom=\"${this._panZoom}\"></lit-controls>`\n : ''}\n ${this.showMinimap\n ? html`\n <lit-minimap\n .panZoom=\"${this._panZoom}\"\n .nodeLookup=\"${this._state.nodeLookup}\"\n .transform=\"${this._state.transform.get()}\"\n .translateExtent=\"${this._state.nodeExtent}\"\n .width=\"${this._width}\"\n .height=\"${this._height}\"\n ></lit-minimap>\n `\n : ''}\n <slot style=\"display: none;\"></slot>\n `;\n }\n}","import { LitElement, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { Position } from '@xyflow/system';\n\n@customElement('lit-handle')\nexport class LitHandle extends LitElement {\n createRenderRoot() {\n return this;\n }\n\n @property({ type: String, reflect: true })\n type: 'source' | 'target' = 'source';\n\n @property({ type: String, reflect: true, attribute: 'data-handlepos' })\n position: Position = Position.Top;\n\n @property({ type: String, reflect: true, attribute: 'data-handleid' })\n handleId?: string;\n\n @property({ type: String, reflect: true, attribute: 'data-nodeid' })\n nodeId?: string;\n\n constructor() {\n super();\n this.addEventListener('mousedown', (e) => this._onPointerDown(e));\n this.addEventListener('touchstart', (e) => this._onPointerDown(e));\n }\n\n private _onPointerDown(e: MouseEvent | TouchEvent) {\n e.stopPropagation();\n const nodeId = this.getAttribute('data-nodeid');\n \n this.dispatchEvent(new CustomEvent('handle-pointer-down', {\n bubbles: true,\n composed: true,\n detail: {\n event: e,\n handleId: this.handleId,\n nodeId,\n type: this.type,\n handleDomNode: this,\n }\n }));\n }\n\n connectedCallback() {\n super.connectedCallback();\n this.classList.add('lit-flow__handle');\n this.classList.add(this.type);\n this.classList.add('connectable');\n this.classList.add('connectableend');\n }\n\n updated(changedProperties: Map<string, any>) {\n if (changedProperties.has('nodeId') || changedProperties.has('handleId') || changedProperties.has('type')) {\n this.setAttribute('data-id', `lit-flow-${this.nodeId || ''}-${this.handleId || ''}-${this.type}`);\n }\n }\n\n render() {\n return html`\n <div style=\"\n width: 100%;\n height: 100%;\n background: inherit;\n border-radius: inherit;\n pointer-events: none;\n \"></div>\n `;\n }\n}","import { LitElement, html, css } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { SignalWatcher } from '@lit-labs/signals';\nimport { type PanZoomInstance } from '@xyflow/system';\n\ntype Constructor<T> = new (...args: any[]) => T;\n\n@customElement('lit-controls')\nexport class LitControls extends (SignalWatcher as <T extends Constructor<LitElement>>(base: T) => T)(LitElement) {\n static styles = css`\n :host {\n display: block;\n position: absolute;\n left: 16px;\n bottom: 16px;\n z-index: 5;\n display: flex;\n flex-direction: column;\n gap: 2px;\n background: var(--md-sys-color-surface);\n padding: 4px;\n border-radius: var(--md-sys-shape-corner-small);\n box-shadow: var(--md-sys-elevation-1);\n border: 1px solid var(--md-sys-color-outline-variant);\n }\n\n button {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n border-radius: var(--md-sys-shape-corner-extra-small);\n cursor: pointer;\n padding: 0;\n color: var(--md-sys-color-on-surface-variant);\n transition: background-color 0.2s ease, color 0.2s ease;\n }\n\n button:hover {\n background: var(--md-sys-color-secondary-container);\n color: var(--md-sys-color-on-secondary-container);\n }\n\n button svg {\n width: 20px;\n height: 20px;\n fill: currentColor;\n }\n `;\n\n @property({ type: Object })\n panZoom?: PanZoomInstance;\n\n private _zoomIn() {\n this.panZoom?.scaleBy(1.2);\n }\n\n private _zoomOut() {\n this.panZoom?.scaleBy(1 / 1.2);\n }\n\n private _fitView() {\n // fitView implementation will need more data from the flow\n // for now just a placeholder or simple zoom reset\n this.panZoom?.setViewport({ x: 0, y: 0, zoom: 1 });\n }\n\n render() {\n return html`\n <button @click=\"${this._zoomIn}\" title=\"Zoom In\">\n <svg viewBox=\"0 0 24 24\"><path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"/></svg>\n </button>\n <button @click=\"${this._zoomOut}\" title=\"Zoom Out\">\n <svg viewBox=\"0 0 24 24\"><path d=\"M19 13H5v-2h14v2z\"/></svg>\n </button>\n <button @click=\"${this._fitView}\" title=\"Reset View\">\n <svg viewBox=\"0 0 24 24\"><path d=\"M4 6h16v2H4zm0 5h16v2H4zm0 5h16v2H4z\"/></svg>\n </button>\n `;\n }\n}\n","import { LitElement, html, css, svg } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { SignalWatcher } from '@lit-labs/signals';\nimport {\n getInternalNodesBounds,\n getBoundsOfRects,\n XYMinimap,\n type Rect,\n type XYMinimapInstance,\n type PanZoomInstance,\n type InternalNodeBase,\n type Transform,\n} from '@xyflow/system';\n\ntype Constructor<T> = new (...args: any[]) => T;\n\n@customElement('lit-minimap')\nexport class LitMinimap extends (SignalWatcher as <T extends Constructor<LitElement>>(base: T) => T)(LitElement) {\n static styles = css`\n :host {\n display: block;\n position: absolute;\n right: 16px;\n bottom: 16px;\n z-index: 5;\n background: var(--md-sys-color-surface);\n border: 1px solid var(--md-sys-color-outline-variant);\n border-radius: var(--md-sys-shape-corner-small);\n box-shadow: var(--md-sys-elevation-1);\n overflow: hidden;\n }\n\n svg {\n display: block;\n }\n\n .minimap-node {\n fill: var(--md-sys-color-surface-variant);\n stroke: var(--md-sys-color-outline-variant);\n stroke-width: 0.5;\n }\n\n .minimap-mask {\n fill: var(--lit-flow-minimap-mask);\n fill-rule: evenodd;\n }\n `;\n\n @property({ type: Object })\n panZoom?: PanZoomInstance;\n\n @property({ type: Object })\n nodeLookup = new Map<string, InternalNodeBase>();\n\n @property({ type: Array })\n transform: Transform = [0, 0, 1];\n\n @property({ type: Array })\n translateExtent: [[number, number], [number, number]] = [[-Infinity, -Infinity], [Infinity, Infinity]];\n\n @property({ type: Number })\n width = 0;\n\n @property({ type: Number })\n height = 0;\n\n @state()\n private _minimapInstance?: XYMinimapInstance;\n\n updated(changedProperties: Map<string, any>) {\n if (!this._minimapInstance && this.panZoom) {\n const svgEl = this.shadowRoot?.querySelector('svg');\n if (svgEl) {\n this._minimapInstance = XYMinimap({\n domNode: svgEl,\n panZoom: this.panZoom,\n getTransform: () => this.transform,\n getViewScale: () => {\n const boundingRect = this._getBoundingRect();\n return Math.max(boundingRect.width / 200, boundingRect.height / 150);\n },\n });\n }\n }\n\n if (this._minimapInstance && (changedProperties.has('width') || changedProperties.has('height') || changedProperties.has('translateExtent'))) {\n this._minimapInstance.update({\n width: this.width,\n height: this.height,\n translateExtent: this.translateExtent,\n });\n }\n }\n\n private _getBoundingRect(): Rect {\n const viewBB: Rect = {\n x: -this.transform[0] / this.transform[2],\n y: -this.transform[1] / this.transform[2],\n width: this.width / this.transform[2],\n height: this.height / this.transform[2],\n };\n\n return this.nodeLookup.size > 0\n ? getBoundsOfRects(getInternalNodesBounds(this.nodeLookup), viewBB)\n : viewBB;\n }\n\n render() {\n const boundingRect = this._getBoundingRect();\n const viewBB: Rect = {\n x: -this.transform[0] / this.transform[2],\n y: -this.transform[1] / this.transform[2],\n width: this.width / this.transform[2],\n height: this.height / this.transform[2],\n };\n\n const elementWidth = 200;\n const elementHeight = 150;\n const scaledWidth = boundingRect.width / elementWidth;\n const scaledHeight = boundingRect.height / elementHeight;\n const viewScale = Math.max(scaledWidth, scaledHeight);\n const viewWidth = viewScale * elementWidth;\n const viewHeight = viewScale * elementHeight;\n const offset = 5 * viewScale;\n\n const x = boundingRect.x - (viewWidth - boundingRect.width) / 2 - offset;\n const y = boundingRect.y - (viewHeight - boundingRect.height) / 2 - offset;\n const width = viewWidth + offset * 2;\n const height = viewHeight + offset * 2;\n\n return html`\n <svg\n width=\"${elementWidth}\"\n height=\"${elementHeight}\"\n viewBox=\"${x} ${y} ${width} ${height}\"\n >\n ${Array.from(this.nodeLookup.values()).map((node) => {\n const { x, y } = node.internals.positionAbsolute;\n const w = node.measured.width || 0;\n const h = node.measured.height || 0;\n return svg`\n <rect\n class=\"minimap-node\"\n x=\"${x}\"\n y=\"${y}\"\n width=\"${w}\"\n height=\"${h}\"\n rx=\"2\"\n ry=\"2\"\n />\n `;\n })}\n <path\n class=\"minimap-mask\"\n d=\"M${x - offset},${y - offset}h${width + offset * 2}v${height + offset * 2}h${-width - offset * 2}z\n M${viewBB.x},${viewBB.y}h${viewBB.width}v${viewBB.height}h${-viewBB.width}z\"\n />\n </svg>\n `;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { m3Tokens } from './theme';\n\n@customElement('lit-sidebar')\nexport class LitSidebar extends LitElement {\n static styles = [\n m3Tokens,\n css`\n :host {\n display: block;\n width: 200px;\n background: var(--md-sys-color-surface);\n border-right: 1px solid var(--md-sys-color-outline-variant);\n padding: 16px;\n box-sizing: border-box;\n height: 100%;\n }\n\n .sidebar-title {\n font-family: var(--md-sys-typescale-body-medium-font);\n font-size: var(--md-sys-typescale-label-medium-size);\n color: var(--md-sys-color-on-surface-variant);\n text-transform: uppercase;\n font-weight: bold;\n margin-bottom: 16px;\n }\n\n .node-palette {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .palette-item {\n padding: 12px;\n background: var(--md-sys-color-surface-container-low);\n border: 1px solid var(--md-sys-color-outline-variant);\n border-radius: var(--md-sys-shape-corner-small);\n cursor: grab;\n font-family: var(--md-sys-typescale-body-medium-font);\n font-size: var(--md-sys-typescale-body-medium-size);\n color: var(--md-sys-color-on-surface);\n user-select: none;\n transition: background-color 0.2s ease;\n }\n\n .palette-item:hover {\n background: var(--md-sys-color-surface-container-high);\n }\n\n .palette-item:active {\n cursor: grabbing;\n }\n `\n ];\n\n @property({ type: Array })\n nodeTypes = [\n { type: 'default', label: 'Default Node' },\n { type: 'input', label: 'Input Node' },\n { type: 'output', label: 'Output Node' },\n ];\n\n private _onDragStart(e: DragEvent, nodeType: string) {\n if (e.dataTransfer) {\n e.dataTransfer.setData('application/litflow', nodeType);\n e.dataTransfer.effectAllowed = 'move';\n }\n }\n\n render() {\n return html`\n <div class=\"sidebar-title\">Node Palette</div>\n <div class=\"node-palette\">\n ${this.nodeTypes.map(\n (node) => html`\n <div\n class=\"palette-item\"\n draggable=\"true\"\n @dragstart=\"${(e: DragEvent) => this._onDragStart(e, node.type)}\"\n >\n ${node.label}\n </div>\n `\n )}\n </div>\n `;\n }\n}\n","import { LitElement, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { Position } from '@xyflow/system';\nimport './lit-handle';\n\n@customElement('lit-gemini-prompt-node')\nexport class LitGeminiPromptNode extends LitElement {\n createRenderRoot() {\n return this;\n }\n\n @property({ type: String, attribute: 'data-id', reflect: true })\n nodeId = '';\n\n @property({ type: Object })\n set data(val: any) {\n this._data = val;\n if (val.prompt) this.prompt = val.prompt;\n }\n get data() { return this._data; }\n private _data: any = {};\n\n @property({ type: String })\n prompt = '';\n\n private _onInput(e: Event) {\n const target = e.target as HTMLTextAreaElement;\n this.prompt = target.value;\n this.dispatchEvent(new CustomEvent('node-data-change', {\n bubbles: true,\n composed: true,\n detail: { id: this.nodeId, data: { prompt: this.prompt } }\n }));\n }\n\n render() {\n return html`\n <div class=\"gemini-node prompt-node\" style=\"\n padding: 12px;\n background: var(--md-sys-color-surface-container-high);\n border-radius: 12px;\n width: 200px;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n gap: 8px;\n border: 1px solid var(--md-sys-color-outline-variant);\n text-align: left;\n \">\n <div style=\"display: flex; align-items: center; gap: 8px; margin-bottom: 4px;\">\n <span style=\"font-size: 18px;\">✨</span>\n <span style=\"font-size: 12px; font-weight: bold; color: var(--md-sys-color-primary);\">GEMINI PROMPT</span>\n </div>\n <textarea\n style=\"\n width: 100%;\n height: 80px;\n border-radius: 8px;\n border: 1px solid var(--md-sys-color-outline);\n padding: 8px;\n font-family: inherit;\n font-size: 12px;\n resize: none;\n box-sizing: border-box;\n background: var(--md-sys-color-surface);\n color: var(--md-sys-color-on-surface);\n \"\n placeholder=\"Enter prompt...\"\n .value=\"${this.prompt}\"\n @input=\"${this._onInput}\"\n ></textarea>\n <button\n style=\"\n width: 100%;\n padding: 8px;\n border-radius: 8px;\n border: none;\n background: var(--md-sys-color-primary);\n color: var(--md-sys-color-on-primary);\n font-size: 12px;\n font-weight: bold;\n cursor: pointer;\n \"\n @click=\"${() => this.dispatchEvent(new CustomEvent('gemini-generate', { bubbles: true, composed: true, detail: { id: this.nodeId, prompt: this.prompt } }))}\"\n >\n Generate\n </button>\n <lit-handle type=\"source\" data-handlepos=\"${Position.Bottom}\" data-nodeid=\"${this.nodeId}\"></lit-handle>\n </div>\n `;\n }\n}\n","import { LitElement, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { Position } from '@xyflow/system';\nimport './lit-handle';\n\n@customElement('lit-gemini-image-node')\nexport class LitGeminiImageNode extends LitElement {\n createRenderRoot() {\n return this;\n }\n\n @property({ type: String, attribute: 'data-id', reflect: true })\n nodeId = '';\n\n @property({ type: Object })\n set data(val: any) {\n this._data = val;\n if (val.imageUrl) this.imageUrl = val.imageUrl;\n if (val.status) this.status = val.status;\n }\n get data() { return this._data; }\n private _data: any = {};\n\n @property({ type: String })\n imageUrl = '';\n\n @property({ type: String })\n status: 'idle' | 'loading' | 'success' | 'error' = 'idle';\n\n render() {\n return html`\n <div class=\"gemini-node image-node\" style=\"\n padding: 12px;\n background: var(--md-sys-color-surface-container-high);\n border-radius: 12px;\n width: 220px;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n gap: 8px;\n border: 1px solid var(--md-sys-color-outline-variant);\n text-align: left;\n \">\n <div style=\"display: flex; align-items: center; gap: 8px; margin-bottom: 4px;\">\n <span style=\"font-size: 18px;\">🖼️</span>\n <span style=\"font-size: 12px; font-weight: bold; color: var(--md-sys-color-secondary);\">GEMINI IMAGE</span>\n </div>\n \n <div style=\"\n width: 100%;\n height: 150px;\n background: var(--md-sys-color-surface-container-lowest);\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n border: 1px dashed var(--md-sys-color-outline);\n \">\n ${this.status === 'loading' \n ? html`<div style=\"font-size: 12px; color: var(--md-sys-color-outline);\">Generating...</div>`\n : this.imageUrl \n ? html`<img src=\"${this.imageUrl}\" style=\"width: 100%; height: 100%; object-fit: cover;\" />`\n : html`<div style=\"font-size: 12px; color: var(--md-sys-color-outline);\">No image generated</div>`\n }\n </div>\n\n <lit-handle type=\"target\" data-handlepos=\"${Position.Top}\" data-nodeid=\"${this.nodeId}\"></lit-handle>\n </div>\n `;\n }\n}\n"],"names":["createInitialState","signal","infiniteExtent","LitNode","SignalWatcher","LitElement","html","__decorateClass","property","customElement","LitEdge","Position","path","getBezierPath","svg","css","boolConverter","value","LitFlow","nodes","adoptUserNodes","updateAbsolutePositions","childNodes","el","i","edges","entries","entry","id","element","node","width","height","zoom","userNode","n","handles","sourceBounds","targetBounds","h","bounds","nodeRect","handleData","multi","newNodes","position","tx","ty","userSelectionActive","PanOnScrollMode","e","XYPanZoom","_","x","y","changedProperties","nodeElements","currentIds","dragInstance","XYDrag","delta","panZoom","nodeExtent","transform","dragItems","item","edge","sourceNode","targetNode","userSource","userTarget","sourceHandle","targetHandle","sPos","getHandlePosition","tPos","labelX","labelY","pathParams","getStraightPath","getSmoothStepPath","getMarkerId","marker","type","markerEndId","markerStartId","target","isPaneClick","isSelectionAction","rect","currentX","currentY","start","end","selectionBox","nodesChanged","internalNode","pos","nextSelected","edgesChanged","nodeSelectionMap","newEdges","sourceSelected","targetSelected","event","handleId","nodeId","handleDomNode","isTarget","fromHandle","XYHandle","ConnectionMode","viewport","conn","connection","label","userLabel","newNode","selectedNodes","selectedEdges","nodeIdsToRemove","edgeIdsToRemove","step","connectionInProgress","tagName","tag","unsafeStatic","style","styleString","k","widthStyle","heightStyle","zIndex","m3Tokens","query","state","LitHandle","LitControls","LitMinimap","svgEl","XYMinimap","boundingRect","viewBB","getBoundsOfRects","getInternalNodesBounds","elementWidth","elementHeight","scaledWidth","scaledHeight","viewScale","viewWidth","viewHeight","offset","w","LitSidebar","nodeType","LitGeminiPromptNode","val","LitGeminiImageNode"],"mappings":"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"}
1
+ {"version":3,"file":"litflow.js","sources":["../src/store.ts","../src/lit-node.ts","../src/lit-edge.ts","../src/lit-flow.ts","../src/lit-handle.ts","../src/lit-controls.ts","../src/lit-minimap.ts","../src/lit-sidebar.ts","../src/lit-gemini-prompt-node.ts","../src/lit-gemini-image-node.ts"],"sourcesContent":["import { signal } from '@lit-labs/signals';\nimport {\n type NodeBase,\n type EdgeBase,\n type InternalNodeBase,\n type CoordinateExtent,\n type NodeOrigin,\n type SnapGrid,\n type Transform,\n type PanZoomInstance,\n type ConnectionInProgress,\n infiniteExtent,\n} from '@xyflow/system';\n\nexport interface FlowState {\n nodes: ReturnType<typeof signal<NodeBase[]>>;\n edges: ReturnType<typeof signal<EdgeBase[]>>;\n nodeLookup: Map<string, InternalNodeBase>;\n parentLookup: Map<string, Map<string, InternalNodeBase>>;\n nodeExtent: CoordinateExtent;\n snapGrid: SnapGrid;\n snapToGrid: boolean;\n nodeOrigin: NodeOrigin;\n multiSelectionActive: boolean;\n transform: ReturnType<typeof signal<Transform>>;\n autoPanOnNodeDrag: boolean;\n nodesDraggable: boolean;\n selectNodesOnDrag: boolean;\n nodeDragThreshold: number;\n panZoom: PanZoomInstance | null;\n domNode: Element | null;\n connectionInProgress: ReturnType<typeof signal<ConnectionInProgress | null>>;\n}\n\nexport function createInitialState(): FlowState {\n return {\n nodes: signal([]),\n edges: signal([]),\n nodeLookup: new Map(),\n parentLookup: new Map(),\n nodeExtent: infiniteExtent,\n snapGrid: [15, 15],\n snapToGrid: false,\n nodeOrigin: [0, 0],\n multiSelectionActive: false,\n transform: signal([0, 0, 1]),\n autoPanOnNodeDrag: true,\n nodesDraggable: true,\n selectNodesOnDrag: true,\n nodeDragThreshold: 0,\n panZoom: null,\n domNode: null,\n connectionInProgress: signal(null),\n };\n}\n","import { LitElement, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { SignalWatcher } from '@lit-labs/signals';\n\ntype Constructor<T> = new (...args: any[]) => T;\n\n@customElement('lit-node')\nexport class LitNode extends (SignalWatcher as <T extends Constructor<LitElement>>(base: T) => T)(LitElement) {\n createRenderRoot() {\n return this;\n }\n\n @property({ type: String })\n label = '';\n\n @property({ type: String, reflect: true })\n type = 'default';\n\n @property({ type: Object })\n data: any = {};\n\n @property({ type: Boolean, reflect: true })\n selected = false;\n\n @property({ type: String, attribute: 'data-id', reflect: true })\n nodeId = '';\n\n @property({ type: Number, attribute: 'position-x' })\n positionX = 0;\n\n @property({ type: Number, attribute: 'position-y' })\n positionY = 0;\n\n render() {\n return html`\n <div class=\"label\" style=\"font-size: var(--md-sys-typescale-body-medium-size); color: var(--md-sys-color-on-surface); pointer-events: none; font-family: var(--md-sys-typescale-body-medium-font);\">${this.label}</div>\n <slot></slot>\n ${this.type === 'input' || this.type === 'default'\n ? html`<lit-handle type=\"source\" data-handlepos=\"bottom\" data-nodeid=\"${this.nodeId}\"></lit-handle>`\n : ''}\n ${this.type === 'output' || this.type === 'default'\n ? html`<lit-handle type=\"target\" data-handlepos=\"top\" data-nodeid=\"${this.nodeId}\"></lit-handle>`\n : ''}\n `;\n }\n}\n","import { LitElement, css, svg } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { SignalWatcher } from '@lit-labs/signals';\nimport { getBezierPath, Position } from '@xyflow/system';\n\ntype Constructor<T> = new (...args: any[]) => T;\n\n@customElement('lit-edge')\nexport class LitEdge extends (SignalWatcher as <T extends Constructor<LitElement>>(base: T) => T)(LitElement) {\n static styles = css`\n :host {\n display: contents;\n }\n\n path {\n fill: none;\n stroke: #b1b1b7;\n stroke-width: 2;\n }\n\n :host([selected]) path {\n stroke: #555;\n }\n `;\n\n @property({ type: Number }) sourceX = 0;\n @property({ type: Number }) sourceY = 0;\n @property({ type: Number }) targetX = 0;\n @property({ type: Number }) targetY = 0;\n @property({ type: String }) sourcePosition = Position.Right;\n @property({ type: String }) targetPosition = Position.Left;\n @property({ type: Boolean, reflect: true }) selected = false;\n\n render() {\n const [path] = getBezierPath({\n sourceX: this.sourceX,\n sourceY: this.sourceY,\n sourcePosition: this.sourcePosition as Position,\n targetX: this.targetX,\n targetY: this.targetY,\n targetPosition: this.targetPosition as Position,\n });\n\n return svg`\n <path d=\"${path}\" />\n `;\n }\n}\n","import { LitElement, css, svg } from 'lit';\nimport { html, unsafeStatic } from 'lit/static-html.js';\nimport { customElement, property, query, state } from 'lit/decorators.js';\nimport { SignalWatcher } from '@lit-labs/signals';\nimport {\n XYPanZoom,\n XYDrag,\n XYHandle,\n ConnectionMode,\n PanOnScrollMode,\n Position,\n type PanZoomInstance,\n type XYDragInstance,\n type Viewport,\n type NodeBase,\n adoptUserNodes,\n updateAbsolutePositions,\n getHandlePosition,\n getBezierPath,\n getSmoothStepPath,\n getStraightPath,\n} from '@xyflow/system';\nimport { createInitialState, type FlowState } from './store';\nimport { m3Tokens } from './theme';\nimport './lit-node';\nimport './lit-edge';\n\ntype Constructor<T> = new (...args: any[]) => T;\n\nconst boolConverter = {\n fromAttribute: (value: string | null) => value !== 'false' && value !== null,\n toAttribute: (value: boolean) => (value ? '' : null),\n};\n\n@customElement('lit-flow')\nexport class LitFlow extends (SignalWatcher as <T extends Constructor<LitElement>>(base: T) => T)(LitElement) {\n static styles = [\n m3Tokens,\n css`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n overflow: hidden;\n position: relative;\n background-color: var(--md-sys-color-background);\n color: var(--md-sys-color-on-background);\n font-family: var(--md-sys-typescale-body-medium-font);\n }\n\n .xyflow__renderer {\n width: 100%;\n height: 100%;\n position: absolute;\n top: 0;\n left: 0;\n outline: none;\n }\n\n .xyflow__renderer:focus-visible {\n box-shadow: inset 0 0 0 2px var(--md-sys-color-primary);\n }\n\n .xyflow__renderer.has-grid {\n background-image: radial-gradient(var(--md-sys-color-outline-variant) 1px, transparent 0);\n background-size: 20px 20px;\n }\n\n .xyflow__viewport {\n transform-origin: 0 0;\n width: 100%;\n height: 100%;\n }\n\n .xyflow__edges {\n position: absolute;\n width: 100%;\n height: 100%;\n pointer-events: none;\n overflow: visible;\n }\n\n .xyflow__nodes {\n position: absolute;\n width: 100%;\n height: 100%;\n pointer-events: none;\n }\n\n .xyflow__node {\n position: absolute;\n pointer-events: all;\n cursor: grab;\n user-select: none;\n display: block;\n background: var(--lit-flow-node-bg);\n border: 1px solid var(--lit-flow-node-border);\n padding: 12px;\n border-radius: var(--md-sys-shape-corner-small);\n min-width: 120px;\n text-align: center;\n box-shadow: var(--md-sys-elevation-1);\n box-sizing: border-box;\n color: var(--lit-flow-node-text);\n font-size: var(--md-sys-typescale-body-medium-size);\n transition: box-shadow 0.2s ease-in-out, border-color 0.2s ease-in-out, border-width 0.1s ease-in-out;\n }\n\n .xyflow__node[type=\"group\"] {\n padding: 0;\n background: none;\n border: none;\n box-shadow: none;\n pointer-events: none;\n }\n\n .xyflow__node[type=\"group\"] > * {\n pointer-events: all;\n }\n\n .xyflow__node[selected] {\n border-color: var(--lit-flow-node-selected-border);\n border-width: 3px;\n box-shadow: var(--md-sys-elevation-3);\n margin: -2px; /* Offset the border width increase to prevent layout shift */\n }\n\n .xyflow__node[type=\"input\"] {\n border-top: 4px solid var(--md-sys-color-primary);\n }\n\n .xyflow__node[type=\"output\"] {\n border-bottom: 4px solid var(--md-sys-color-secondary);\n }\n\n .xyflow__node:active {\n cursor: grabbing;\n }\n\n .lit-flow__handle {\n display: block;\n position: absolute;\n width: 10px;\n height: 10px;\n border-radius: 50%;\n z-index: 10;\n pointer-events: all;\n cursor: pointer;\n border: 2px solid var(--lit-flow-handle-outline);\n background-clip: padding-box;\n box-sizing: border-box;\n transition: transform 0.1s ease-in-out;\n }\n\n .lit-flow__handle:hover {\n transform: scale(1.2);\n }\n\n .lit-flow__handle.source {\n background-color: var(--lit-flow-handle-source);\n }\n\n .lit-flow__handle.target {\n background-color: var(--lit-flow-handle-target);\n }\n\n .lit-flow__handle[data-handlepos=\"top\"] {\n top: -5px;\n left: 50%;\n transform: translateX(-50%);\n }\n\n .lit-flow__handle[data-handlepos=\"bottom\"] {\n bottom: -5px;\n left: 50%;\n transform: translateX(-50%);\n }\n\n .lit-flow__handle[data-handlepos=\"left\"] {\n left: -5px;\n top: 50%;\n transform: translateY(-50%);\n }\n\n .lit-flow__handle[data-handlepos=\"right\"] {\n right: -5px;\n top: 50%;\n transform: translateY(-50%);\n }\n\n .xyflow__connection-path {\n fill: none;\n stroke: var(--md-sys-color-outline);\n stroke-width: 2;\n stroke-dasharray: 5,5;\n pointer-events: none;\n }\n\n .xyflow__edge-label {\n background: var(--md-sys-color-surface);\n color: var(--md-sys-color-on-surface);\n padding: 2px 6px;\n border-radius: var(--md-sys-shape-corner-extra-small);\n font-size: var(--md-sys-typescale-label-small-size);\n font-family: var(--md-sys-typescale-body-medium-font);\n border: 1px solid var(--md-sys-color-outline-variant);\n white-space: nowrap;\n pointer-events: all;\n user-select: none;\n box-shadow: var(--md-sys-elevation-1);\n }\n\n .xyflow__selection {\n position: absolute;\n top: 0;\n left: 0;\n background: var(--md-sys-color-primary-container);\n border: 1px solid var(--md-sys-color-primary);\n opacity: 0.4;\n pointer-events: none;\n z-index: 1000;\n }\n `\n ];\n\n @query('.xyflow__renderer')\n _renderer?: HTMLElement;\n\n @query('.xyflow__viewport')\n _viewport?: HTMLElement;\n\n @state()\n private _panZoom?: PanZoomInstance;\n\n private _drags = new Map<string, XYDragInstance>();\n private _resizeObserver?: ResizeObserver;\n\n @state()\n private _state: FlowState = createInitialState();\n\n @property({ type: Object })\n nodeTypes: Record<string, string> = {\n default: 'lit-node',\n input: 'lit-node',\n output: 'lit-node',\n };\n\n @property({ type: Boolean, attribute: 'show-controls', reflect: true })\n showControls = false;\n\n @property({ type: Boolean, attribute: 'show-minimap', reflect: true, converter: boolConverter })\n showMinimap = false;\n\n @property({ type: Boolean, attribute: 'show-grid', reflect: true, converter: boolConverter })\n showGrid = true;\n\n @property({ type: Boolean, attribute: 'nodes-draggable', reflect: true, converter: boolConverter })\n nodesDraggable = true;\n\n @property({ type: Boolean, attribute: 'nodes-connectable', reflect: true, converter: boolConverter })\n nodesConnectable = true;\n\n @property({ type: Boolean, attribute: 'pan-on-drag', reflect: true, converter: boolConverter })\n panOnDrag = true;\n\n @property({ type: Boolean, attribute: 'zoom-on-scroll', reflect: true, converter: boolConverter })\n zoomOnScroll = true;\n\n @property({ type: Boolean, attribute: 'zoom-on-pinch', reflect: true, converter: boolConverter })\n zoomOnPinch = true;\n\n @property({ type: Boolean, attribute: 'zoom-on-double-click', reflect: true, converter: boolConverter })\n zoomOnDoubleClick = true;\n\n @property({ type: Boolean, attribute: 'prompt-on-drop', reflect: true, converter: boolConverter })\n promptOnDrop = false;\n\n @property({ type: String, attribute: 'selection-mode' })\n selectionMode: 'pan' | 'select' = 'pan';\n\n @state()\n private _selectionRect: { x: number; y: number; width: number; height: number } | null = null;\n\n private _selectionStart: { x: number; y: number } | null = null;\n\n @state()\n private _width = 0;\n\n @state()\n private _height = 0;\n\n @property({ type: Array })\n set nodes(nodes: NodeBase[]) {\n this._state.nodes.set(nodes);\n adoptUserNodes(nodes, this._state.nodeLookup, this._state.parentLookup, {\n nodeOrigin: this._state.nodeOrigin,\n nodeExtent: this._state.nodeExtent,\n });\n updateAbsolutePositions(this._state.nodeLookup, this._state.parentLookup, {\n nodeOrigin: this._state.nodeOrigin,\n nodeExtent: this._state.nodeExtent,\n });\n this._notifyChange();\n }\n\n get nodes() {\n return this._state.nodes.get();\n }\n\n private _notifyChange() {\n this.dispatchEvent(new CustomEvent('change', {\n detail: {\n nodes: this.nodes,\n edges: this.edges,\n },\n bubbles: true,\n composed: true,\n }));\n }\n\n private _discoverNodes() {\n if (this.nodes.length > 0) return;\n\n const childNodes = Array.from(this.querySelectorAll('lit-node')) as any[];\n if (childNodes.length > 0) {\n const nodes: NodeBase[] = childNodes.map((el) => ({\n id: el.id || el.getAttribute('id') || `node-${Math.random().toString(36).substr(2, 9)}`,\n type: el.type || el.getAttribute('type') || 'default',\n position: {\n x: parseFloat(el.getAttribute('position-x') || '0'),\n y: parseFloat(el.getAttribute('position-y') || '0'),\n },\n data: {\n label: el.label || el.getAttribute('label') || '',\n ...el.data,\n },\n }));\n this.nodes = nodes;\n // Force update of internal nodeId for child elements\n childNodes.forEach((el, i) => {\n el.nodeId = nodes[i].id;\n });\n }\n }\n\n @property({ type: Array })\n set edges(edges: any[]) {\n this._state.edges.set(edges);\n this._notifyChange();\n }\n\n get edges() {\n return this._state.edges.get();\n }\n\n @property({ type: Object })\n viewport: Viewport = { x: 0, y: 0, zoom: 1 };\n\n connectedCallback() {\n super.connectedCallback();\n this._discoverNodes();\n this._resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n if (entry.target === this) {\n this._width = entry.contentRect.width;\n this._height = entry.contentRect.height;\n } else if (entry.target === this._renderer) {\n // Handle renderer resize if needed\n } else {\n const id = (entry.target as HTMLElement).dataset.id;\n if (id) {\n this._updateNodeDimensions(id, entry.target as HTMLElement);\n }\n }\n }\n });\n this._resizeObserver.observe(this);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this._resizeObserver?.disconnect();\n }\n\n private async _updateNodeDimensions(id: string, element: HTMLElement) {\n const node = this._state.nodeLookup.get(id);\n if (node) {\n // Wait for Lit element to finish rendering its shadow DOM\n if ('updateComplete' in element) {\n await (element as any).updateComplete;\n }\n\n const { width, height } = element.getBoundingClientRect();\n const zoom = this._state.transform.get()[2];\n node.measured = {\n width: width / zoom,\n height: height / zoom,\n };\n\n // Sync back to user node to preserve dimensions across adoptUserNodes calls\n const userNode = this.nodes.find((n) => n.id === id);\n if (userNode) {\n userNode.measured = node.measured;\n }\n\n // Update handle bounds\n // Since lit-node is now light-DOM, we look in the element itself, not shadowRoot\n const handles = element.querySelectorAll('lit-handle');\n if (handles && handles.length > 0) {\n const sourceBounds: any[] = [];\n const targetBounds: any[] = [];\n\n handles.forEach((h: any) => {\n const bounds = h.getBoundingClientRect();\n const nodeRect = element.getBoundingClientRect();\n const handleData = {\n id: h.handleId || null,\n type: h.type,\n position: h.position,\n x: (bounds.left - nodeRect.left) / zoom,\n y: (bounds.top - nodeRect.top) / zoom,\n width: bounds.width / zoom,\n height: bounds.height / zoom,\n };\n\n if (h.type === 'source') sourceBounds.push(handleData);\n else targetBounds.push(handleData);\n });\n\n node.internals.handleBounds = {\n source: sourceBounds,\n target: targetBounds,\n };\n console.log(`Node ${id} handleBounds:`, node.internals.handleBounds);\n }\n\n // Update absolute positions without clearing the lookup\n updateAbsolutePositions(this._state.nodeLookup, this._state.parentLookup, {\n nodeOrigin: this._state.nodeOrigin,\n nodeExtent: this._state.nodeExtent,\n });\n\n // Trigger update via signal\n this._state.nodes.set([...this.nodes]);\n this._notifyChange();\n }\n }\n\n private _selectNode(id: string, multi: boolean) {\n const newNodes = this.nodes.map((node) => {\n if (node.id === id) {\n return { ...node, selected: !node.selected };\n }\n return multi ? node : { ...node, selected: false };\n });\n this.nodes = newNodes;\n }\n\n /**\n * Projects a screen position (relative to the flow container) to canvas coordinates.\n * Useful for Drag & Drop and context menus.\n */\n project(position: { x: number; y: number }): { x: number; y: number } {\n const [tx, ty, zoom] = this._state.transform.get();\n return {\n x: (position.x - tx) / zoom,\n y: (position.y - ty) / zoom,\n };\n }\n\n /**\n * Fits the view to the current nodes.\n * @param padding Optional padding in pixels (default: 50)\n */\n async fitView(padding = 50) {\n if (!this._panZoom || this.nodes.length === 0) return;\n\n const nodes = Array.from(this._state.nodeLookup.values());\n if (nodes.length === 0) return;\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n nodes.forEach((node) => {\n const { x, y } = node.internals.positionAbsolute;\n const width = node.measured.width || 0;\n const height = node.measured.height || 0;\n\n minX = Math.min(minX, x);\n minY = Math.min(minY, y);\n maxX = Math.max(maxX, x + width);\n maxY = Math.max(maxY, y + height);\n });\n\n const graphWidth = maxX - minX;\n const graphHeight = maxY - minY;\n const containerWidth = this.offsetWidth;\n const containerHeight = this.offsetHeight;\n\n if (containerWidth === 0 || containerHeight === 0) return;\n\n const zoomX = (containerWidth - padding * 2) / graphWidth;\n const zoomY = (containerHeight - padding * 2) / graphHeight;\n const zoom = Math.min(zoomX, zoomY, 1); // Don't zoom in past 1:1\n\n const x = (containerWidth - graphWidth * zoom) / 2 - minX * zoom;\n const y = (containerHeight - graphHeight * zoom) / 2 - minY * zoom;\n\n await this._panZoom.setViewport({ x, y, zoom }, { duration: 400 });\n }\n\n private _updatePanZoom(userSelectionActive = false) {\n if (!this._panZoom) return;\n\n this._panZoom.update({\n noWheelClassName: 'nowheel',\n noPanClassName: 'nopan',\n preventScrolling: true,\n panOnScroll: false,\n panOnDrag: this.panOnDrag,\n panOnScrollMode: PanOnScrollMode.Free,\n panOnScrollSpeed: 0.5,\n userSelectionActive,\n zoomOnPinch: this.zoomOnPinch,\n zoomOnScroll: this.zoomOnScroll,\n zoomOnDoubleClick: this.zoomOnDoubleClick,\n zoomActivationKeyPressed: false,\n lib: 'lit',\n onTransformChange: () => {},\n connectionInProgress: !!this._state.connectionInProgress.get(),\n paneClickDistance: 0,\n });\n }\n\n firstUpdated() {\n if (this._renderer) {\n this._state.domNode = this._renderer;\n this._resizeObserver?.observe(this._renderer);\n\n // Add capture listener for selection to intercept before D3\n this._renderer.addEventListener('pointerdown', (e) => this._onPointerDown(e), { capture: true });\n\n this._panZoom = XYPanZoom({\n domNode: this._renderer,\n minZoom: 0.5,\n maxZoom: 2,\n translateExtent: this._state.nodeExtent,\n viewport: this.viewport,\n onDraggingChange: () => {},\n onPanZoom: (_, { x, y, zoom }) => {\n this.viewport = { x, y, zoom };\n this._state.transform.set([x, y, zoom]);\n if (this._viewport) {\n this._viewport.style.transform = `translate(${x}px,${y}px) scale(${zoom})`;\n }\n },\n });\n\n this._updatePanZoom();\n this._state.panZoom = this._panZoom;\n }\n }\n\n updated(changedProperties: Map<string, any>) {\n if (changedProperties.has('nodes') || changedProperties.has('nodesDraggable')) {\n this._setupDrags();\n }\n\n if (this._panZoom && (\n changedProperties.has('panOnDrag') ||\n changedProperties.has('zoomOnScroll') ||\n changedProperties.has('zoomOnPinch') ||\n changedProperties.has('zoomOnDoubleClick')\n )) {\n this._updatePanZoom();\n }\n }\n\n private _setupDrags() {\n const nodeElements = this.shadowRoot?.querySelectorAll('.xyflow__node');\n const currentIds = new Set<string>();\n\n nodeElements?.forEach((el) => {\n const id = (el as HTMLElement).dataset.id;\n if (id) {\n currentIds.add(id);\n this._resizeObserver?.observe(el);\n \n // Add click listener for selection\n (el as HTMLElement).onclick = (e) => {\n e.stopPropagation();\n this._selectNode(id, e.shiftKey || e.metaKey);\n };\n\n // Update cursor based on draggability\n (el as HTMLElement).style.cursor = this.nodesDraggable ? 'grab' : 'default';\n\n if (!this.nodesDraggable) {\n this._drags.delete(id);\n return;\n }\n\n let dragInstance = this._drags.get(id);\n if (!dragInstance) {\n dragInstance = XYDrag({\n getStoreItems: () => ({\n ...this._state,\n nodes: this._state.nodes.get(),\n edges: this._state.edges.get(),\n transform: this._state.transform.get(),\n panBy: async (delta) => {\n const { panZoom, nodeExtent } = this._state;\n const transform = this._state.transform.get();\n if (!panZoom) return false;\n const nextViewport = await panZoom.setViewportConstrained(\n {\n x: transform[0] + delta.x,\n y: transform[1] + delta.y,\n zoom: transform[2],\n },\n [[0, 0], [this.offsetWidth, this.offsetHeight]],\n nodeExtent\n );\n return !!nextViewport;\n },\n updateNodePositions: (dragItems) => {\n dragItems.forEach((item, id) => {\n const node = this._state.nodeLookup.get(id);\n if (node) {\n node.position = item.position;\n node.internals.positionAbsolute = item.internals.positionAbsolute;\n const userNode = this.nodes.find((n) => n.id === id);\n if (userNode) userNode.position = item.position;\n }\n });\n\n // Recalculate all absolute positions to ensure children follow parents\n updateAbsolutePositions(this._state.nodeLookup, this._state.parentLookup, {\n nodeOrigin: this._state.nodeOrigin,\n nodeExtent: this._state.nodeExtent,\n });\n\n // Trigger update via signal\n this._state.nodes.set([...this.nodes]);\n this._notifyChange();\n },\n unselectNodesAndEdges: () => {},\n }),\n });\n this._drags.set(id, dragInstance);\n }\n\n dragInstance.update({\n domNode: el as HTMLElement,\n nodeId: id,\n });\n }\n });\n\n // Clean up stale drag instances\n for (const id of this._drags.keys()) {\n if (!currentIds.has(id)) {\n this._drags.delete(id);\n }\n }\n }\n\n private _renderEdge(edge: any) {\n const sourceNode = this._state.nodeLookup.get(edge.source);\n const targetNode = this._state.nodeLookup.get(edge.target);\n if (!sourceNode || !targetNode) return null;\n\n // Check if either node is hidden in the user-facing nodes array\n const userSource = this.nodes.find(n => n.id === edge.source);\n const userTarget = this.nodes.find(n => n.id === edge.target);\n if (userSource?.hidden || userTarget?.hidden) return null;\n\n const sourceHandle = (sourceNode.internals.handleBounds?.source || []).find(\n (h: any) => h.id === (edge.sourceHandle || null)\n ) || sourceNode.internals.handleBounds?.source?.[0] || { \n id: null, \n type: 'source', \n nodeId: edge.source, \n position: Position.Bottom, \n x: (sourceNode.measured.width || 0) / 2, \n y: sourceNode.measured.height || 0, \n width: 1, \n height: 1 \n };\n\n const targetHandle = (targetNode.internals.handleBounds?.target || []).find(\n (h: any) => h.id === (edge.targetHandle || null)\n ) || targetNode.internals.handleBounds?.target?.[0] || { \n id: null, \n type: 'target', \n nodeId: edge.target, \n position: Position.Top, \n x: (targetNode.measured.width || 0) / 2, \n y: 0, \n width: 1, \n height: 1 \n };\n\n const sPos = getHandlePosition(sourceNode, sourceHandle, sourceHandle.position, true);\n const tPos = getHandlePosition(targetNode, targetHandle, targetHandle.position, true);\n\n let path = '';\n let labelX = 0;\n let labelY = 0;\n\n const pathParams = {\n sourceX: sPos.x,\n sourceY: sPos.y,\n sourcePosition: sourceHandle.position,\n targetX: tPos.x,\n targetY: tPos.y,\n targetPosition: targetHandle.position,\n };\n\n switch (edge.type) {\n case 'straight':\n [path, labelX, labelY] = getStraightPath(pathParams);\n break;\n case 'smoothstep':\n [path, labelX, labelY] = getSmoothStepPath(pathParams);\n break;\n case 'step':\n [path, labelX, labelY] = getSmoothStepPath({ ...pathParams, borderRadius: 0 });\n break;\n case 'bezier':\n default:\n [path, labelX, labelY] = getBezierPath(pathParams);\n break;\n }\n\n const getMarkerId = (marker: any) => {\n if (!marker) return null;\n const type = typeof marker === 'string' ? marker : marker.type;\n if (!type) return null;\n return `lit-flow__${type}${edge.selected ? '-selected' : ''}`;\n };\n\n const markerEndId = getMarkerId(edge.markerEnd);\n const markerStartId = getMarkerId(edge.markerStart);\n\n return svg`\n <g class=\"xyflow__edge\">\n <path\n d=\"${path}\"\n fill=\"none\"\n stroke=\"${edge.selected ? 'var(--md-sys-color-primary)' : 'var(--md-sys-color-outline-variant)'}\"\n stroke-width=\"${edge.selected ? '3' : '2'}\"\n marker-end=\"${markerEndId ? `url(#${markerEndId})` : ''}\"\n marker-start=\"${markerStartId ? `url(#${markerStartId})` : ''}\"\n style=\"pointer-events: none; transition: stroke 0.2s ease-in-out, stroke-width 0.2s ease-in-out;\"\n />\n ${edge.label \n ? svg`\n <foreignObject\n width=\"100\"\n height=\"30\"\n x=\"${labelX - 50}\"\n y=\"${labelY - 15}\"\n requiredExtensions=\"http://www.w3.org/1999/xhtml\"\n >\n <div style=\"display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;\">\n <div class=\"xyflow__edge-label\">${edge.label}</div>\n </div>\n </foreignObject>\n ` \n : ''}\n </g>\n `;\n }\n\n private _isPaneClick(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement || target instanceof SVGElement)) return false;\n \n // If it's the renderer itself, it's a pane click\n if (target === this._renderer) return true;\n \n // If it's the viewport or the edges SVG, it's a pane click\n if (target.classList.contains('xyflow__viewport') || \n target.classList.contains('xyflow__edges') ||\n target.classList.contains('xyflow__nodes')) return true;\n \n return false;\n }\n\n private _onPointerDown(e: PointerEvent) {\n const isPaneClick = this._isPaneClick(e.target);\n const isSelectionAction = e.shiftKey || this.selectionMode === 'select';\n\n if (isPaneClick && isSelectionAction) {\n console.log('LitFlow: Selection started', { x: e.clientX, y: e.clientY, shift: e.shiftKey });\n const rect = this._renderer!.getBoundingClientRect();\n this._selectionStart = {\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n };\n this._selectionRect = { x: this._selectionStart.x, y: this._selectionStart.y, width: 0, height: 0 };\n \n // Disable panning while selecting\n this._updatePanZoom(true);\n \n this._renderer!.setPointerCapture(e.pointerId);\n \n // Prevent D3 from starting a pan\n e.stopImmediatePropagation();\n }\n }\n\n private _onPointerMove(e: PointerEvent) {\n if (this._selectionStart && this._renderer) {\n const rect = this._renderer.getBoundingClientRect();\n const currentX = e.clientX - rect.left;\n const currentY = e.clientY - rect.top;\n \n const x = Math.min(this._selectionStart.x, currentX);\n const y = Math.min(this._selectionStart.y, currentY);\n const width = Math.abs(this._selectionStart.x - currentX);\n const height = Math.abs(this._selectionStart.y - currentY);\n \n this._selectionRect = { x, y, width, height };\n\n // Live selection\n this._performSelection(e.shiftKey);\n }\n }\n\n private _onPointerUp(e: PointerEvent) {\n if (this._selectionStart) {\n console.log('LitFlow: Selection ended', this._selectionRect);\n // Final selection (already updated live, but good to ensure final state)\n this._performSelection(e.shiftKey);\n \n this._selectionStart = null;\n this._selectionRect = null;\n \n // Re-enable panning\n this._updatePanZoom(false);\n \n if (this._renderer) {\n this._renderer.releasePointerCapture(e.pointerId);\n }\n }\n }\n\n private _performSelection(multi: boolean) {\n if (!this._selectionRect) return;\n\n const start = this.project({ x: this._selectionRect.x, y: this._selectionRect.y });\n const end = this.project({ \n x: this._selectionRect.x + this._selectionRect.width, \n y: this._selectionRect.y + this._selectionRect.height \n });\n\n const selectionBox = {\n x: Math.min(start.x, end.x),\n y: Math.min(start.y, end.y),\n width: Math.abs(start.x - end.x),\n height: Math.abs(start.y - end.y),\n };\n\n let nodesChanged = false;\n const newNodes = this.nodes.map(node => {\n const internalNode = this._state.nodeLookup.get(node.id);\n if (!internalNode) return node;\n\n const pos = internalNode.internals.positionAbsolute;\n const width = internalNode.measured.width || 0;\n const height = internalNode.measured.height || 0;\n\n const isInside = \n pos.x >= selectionBox.x &&\n pos.y >= selectionBox.y &&\n pos.x + width <= selectionBox.x + selectionBox.width &&\n pos.y + height <= selectionBox.y + selectionBox.height;\n\n const nextSelected = isInside || (multi && node.selected);\n \n if (nextSelected !== !!node.selected) {\n nodesChanged = true;\n return { ...node, selected: nextSelected };\n }\n return node;\n });\n\n if (nodesChanged) {\n this.nodes = newNodes;\n }\n\n // Select edges\n let edgesChanged = false;\n const nodeSelectionMap = new Map(newNodes.map(n => [n.id, !!n.selected]));\n \n const newEdges = this.edges.map(edge => {\n const sourceSelected = nodeSelectionMap.get(edge.source);\n const targetSelected = nodeSelectionMap.get(edge.target);\n \n const isInside = sourceSelected && targetSelected;\n const nextSelected = isInside || (multi && edge.selected);\n \n if (nextSelected !== !!edge.selected) {\n edgesChanged = true;\n return { ...edge, selected: nextSelected };\n }\n return edge;\n });\n\n if (edgesChanged) {\n this.edges = newEdges;\n }\n\n if (nodesChanged || edgesChanged) {\n this.dispatchEvent(new CustomEvent('selection-change', {\n detail: { \n nodes: this.nodes.filter(n => n.selected),\n edges: this.edges.filter(e => e.selected)\n }\n }));\n }\n }\n\n private _onHandlePointerDown(e: CustomEvent) {\n const { event, handleId, nodeId, type, handleDomNode } = e.detail;\n const isTarget = type === 'target';\n\n // Prevent starting a new connection if one is already in progress or if connectable is false\n if (this._state.connectionInProgress.get() || !this.nodesConnectable) {\n return;\n }\n\n const bounds = handleDomNode.getBoundingClientRect();\n const nodeRect = handleDomNode.parentElement?.getBoundingClientRect();\n const zoom = this._state.transform.get()[2];\n\n const fromHandle = {\n id: handleId,\n nodeId,\n type,\n position: handleDomNode.position,\n x: (bounds.left - (nodeRect?.left ?? 0)) / zoom,\n y: (bounds.top - (nodeRect?.top ?? 0)) / zoom,\n width: bounds.width / zoom,\n height: bounds.height / zoom,\n };\n\n XYHandle.onPointerDown(event, {\n handleId,\n nodeId,\n isTarget,\n domNode: this._renderer as HTMLDivElement,\n handleDomNode,\n nodeLookup: this._state.nodeLookup,\n connectionMode: ConnectionMode.Strict,\n lib: 'lit',\n autoPanOnConnect: true,\n flowId: 'lit-flow',\n dragThreshold: 0,\n panBy: async (delta) => {\n const viewport = this._panZoom?.getViewport();\n if (!viewport) return false;\n await this._panZoom?.setViewport({\n x: viewport.x + delta.x,\n y: viewport.y + delta.y,\n zoom: viewport.zoom,\n });\n return true;\n },\n getTransform: () => this._state.transform.get(),\n getFromHandle: () => fromHandle,\n updateConnection: (conn) => {\n if (conn.inProgress) {\n this._state.connectionInProgress.set(conn);\n } else {\n this._state.connectionInProgress.set(null);\n }\n },\n cancelConnection: () => {\n this._state.connectionInProgress.set(null);\n },\n onConnect: (connection) => {\n this.dispatchEvent(new CustomEvent('connect', {\n detail: connection\n }));\n // Default behavior: add the edge\n const id = `e-${connection.source}${connection.sourceHandle || ''}-${connection.target}${connection.targetHandle || ''}`;\n this.edges = [...this.edges, { ...connection, id }];\n },\n connectionRadius: 20,\n });\n }\n\n private _onDragOver(e: DragEvent) {\n e.preventDefault();\n if (e.dataTransfer) {\n e.dataTransfer.dropEffect = 'move';\n }\n }\n\n private _onDrop(e: DragEvent) {\n e.preventDefault();\n\n const type = e.dataTransfer?.getData('application/litflow');\n\n // check if the dropped element is valid\n if (typeof type === 'undefined' || !type) {\n return;\n }\n\n // Get the position of the drop relative to the flow container\n const rect = this.getBoundingClientRect();\n const position = this.project({\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n });\n\n let label = `${type} node`;\n if (this.promptOnDrop) {\n const userLabel = window.prompt('Enter node label:', label);\n if (userLabel === null) return; // Cancelled\n label = userLabel || label;\n }\n\n const newNode = {\n id: `node_${Date.now()}`,\n type,\n position,\n data: { label },\n };\n\n this.nodes = [...this.nodes, newNode];\n \n this.dispatchEvent(new CustomEvent('node-drop', {\n detail: { node: newNode, event: e }\n }));\n }\n\n private _renderConnectionLine(conn: any) {\n if (!conn) return null;\n\n const [path] = getBezierPath({\n sourceX: conn.from.x,\n sourceY: conn.from.y,\n sourcePosition: conn.fromPosition,\n targetX: conn.to.x,\n targetY: conn.to.y,\n targetPosition: conn.toPosition,\n });\n\n return svg`\n <path\n class=\"xyflow__connection-path\"\n d=\"${path}\"\n fill=\"none\"\n stroke=\"#b1b1b7\"\n stroke-width=\"2\"\n stroke-dasharray=\"5,5\"\n />\n `;\n }\n\n private _onKeyDown(e: KeyboardEvent) {\n // Don't handle if we are in an input field\n if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement || (e.target as HTMLElement).isContentEditable) {\n return;\n }\n\n if (e.key === 'Delete' || e.key === 'Backspace') {\n const selectedNodes = this.nodes.filter(n => n.selected);\n const selectedEdges = this.edges.filter(e => e.selected);\n\n if (selectedNodes.length > 0 || selectedEdges.length > 0) {\n const nodeIdsToRemove = new Set(selectedNodes.map(n => n.id));\n const edgeIdsToRemove = new Set(selectedEdges.map(e => e.id));\n\n // Also remove edges connected to removed nodes\n this.edges.forEach(edge => {\n if (nodeIdsToRemove.has(edge.source) || nodeIdsToRemove.has(edge.target)) {\n edgeIdsToRemove.add(edge.id);\n }\n });\n\n this.nodes = this.nodes.filter(n => !nodeIdsToRemove.has(n.id));\n this.edges = this.edges.filter(e => !edgeIdsToRemove.has(e.id));\n\n this.dispatchEvent(new CustomEvent('nodes-delete', {\n detail: { nodes: selectedNodes }\n }));\n this.dispatchEvent(new CustomEvent('edges-delete', {\n detail: { edges: selectedEdges }\n }));\n }\n }\n\n if (['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(e.key)) {\n const selectedNodes = this.nodes.filter(n => n.selected);\n if (selectedNodes.length > 0) {\n e.preventDefault();\n const step = e.shiftKey ? 10 : 1;\n const delta = {\n x: e.key === 'ArrowLeft' ? -step : e.key === 'ArrowRight' ? step : 0,\n y: e.key === 'ArrowUp' ? -step : e.key === 'ArrowDown' ? step : 0,\n };\n\n this.nodes = this.nodes.map(node => {\n if (node.selected) {\n return {\n ...node,\n position: {\n x: node.position.x + delta.x,\n y: node.position.y + delta.y,\n }\n };\n }\n return node;\n });\n }\n }\n }\n\n render() {\n const transform = this._state.transform.get();\n const connectionInProgress = this._state.connectionInProgress.get();\n\n return html`\n <div \n class=\"xyflow__renderer ${this.showGrid ? 'has-grid' : ''}\"\n tabindex=\"0\"\n @keydown=\"${this._onKeyDown}\"\n @dragover=\"${this._onDragOver}\"\n @drop=\"${this._onDrop}\"\n @pointermove=\"${this._onPointerMove}\"\n @pointerup=\"${this._onPointerUp}\"\n @click=\"${(e: MouseEvent) => {\n if (this._isPaneClick(e.target)) {\n this.nodes = this.nodes.map(n => ({ ...n, selected: false }));\n this.edges = this.edges.map(e => ({ ...e, selected: false }));\n }\n }}\"\n >\n <div\n class=\"xyflow__viewport\"\n style=\"transform: translate(${transform[0]}px, ${transform[1]}px) scale(${transform[2]})\"\n >\n <div class=\"xyflow__nodes\" @handle-pointer-down=\"${this._onHandlePointerDown}\">\n ${this.nodes.map((node) => {\n if (node.hidden) return null;\n const internalNode = this._state.nodeLookup.get(node.id);\n const pos = internalNode?.internals.positionAbsolute || node.position;\n const tagName = this.nodeTypes[node.type || 'default'] || this.nodeTypes.default;\n const tag = unsafeStatic(tagName);\n\n const style = (node as any).style || {};\n const styleString = Object.entries(style)\n .map(([k, v]) => `${k.replace(/([A-Z])/g, '-$1').toLowerCase()}: ${typeof v === 'number' ? `${v}px` : v}`)\n .join('; ');\n\n const width = (node as any).width || style.width;\n const height = (node as any).height || style.height;\n const widthStyle = width ? `width: ${typeof width === 'number' ? `${width}px` : width};` : '';\n const heightStyle = height ? `height: ${typeof height === 'number' ? `${height}px` : height};` : '';\n const zIndex = (node as any).zIndex ? `z-index: ${(node as any).zIndex};` : '';\n\n return html`\n <${tag}\n class=\"xyflow__node\"\n data-id=\"${node.id}\"\n type=\"${node.type || 'default'}\"\n .nodeId=\"${node.id}\"\n style=\"transform: translate(${pos.x}px, ${pos.y}px); ${styleString} ${widthStyle} ${heightStyle} ${zIndex}\"\n .data=\"${node.data}\"\n .label=\"${(node.data as any).label}\"\n .type=\"${node.type || 'default'}\"\n ?selected=\"${node.selected}\"\n >\n </${tag}>\n `;\n })}\n </div>\n <svg class=\"xyflow__edges\">\n <defs>\n <marker\n id=\"lit-flow__arrow\"\n viewBox=\"0 0 10 10\"\n refX=\"5\"\n refY=\"5\"\n markerWidth=\"6\"\n markerHeight=\"6\"\n orient=\"auto-start-reverse\"\n >\n <path d=\"M 0 0 L 10 5 L 0 10 z\" fill=\"var(--md-sys-color-outline-variant)\" />\n </marker>\n <marker\n id=\"lit-flow__arrowclosed\"\n viewBox=\"0 0 10 10\"\n refX=\"5\"\n refY=\"5\"\n markerWidth=\"6\"\n markerHeight=\"6\"\n orient=\"auto-start-reverse\"\n >\n <path d=\"M 0 0 L 10 5 L 0 10 z\" fill=\"var(--md-sys-color-outline-variant)\" />\n </marker>\n <marker\n id=\"lit-flow__arrow-selected\"\n viewBox=\"0 0 10 10\"\n refX=\"5\"\n refY=\"5\"\n markerWidth=\"6\"\n markerHeight=\"6\"\n orient=\"auto-start-reverse\"\n >\n <path d=\"M 0 0 L 10 5 L 0 10 z\" fill=\"var(--md-sys-color-primary)\" />\n </marker>\n <marker\n id=\"lit-flow__arrowclosed-selected\"\n viewBox=\"0 0 10 10\"\n refX=\"5\"\n refY=\"5\"\n markerWidth=\"6\"\n markerHeight=\"6\"\n orient=\"auto-start-reverse\"\n >\n <path d=\"M 0 0 L 10 5 L 0 10 z\" fill=\"var(--md-sys-color-primary)\" />\n </marker>\n </defs>\n ${this.edges.map((edge) => this._renderEdge(edge))}\n ${this._renderConnectionLine(connectionInProgress)}\n </svg>\n </div>\n ${this._selectionRect \n ? html`\n <div \n class=\"xyflow__selection\" \n style=\"transform: translate(${this._selectionRect.x}px, ${this._selectionRect.y}px); width: ${this._selectionRect.width}px; height: ${this._selectionRect.height}px;\"\n ></div>\n ` \n : ''}\n </div>\n ${this.showControls\n ? html`<lit-controls .panZoom=\"${this._panZoom}\" @fit-view=\"${() => this.fitView()}\"></lit-controls>`\n : ''}\n ${this.showMinimap\n ? html`\n <lit-minimap\n .panZoom=\"${this._panZoom}\"\n .nodeLookup=\"${this._state.nodeLookup}\"\n .transform=\"${this._state.transform.get()}\"\n .translateExtent=\"${this._state.nodeExtent}\"\n .width=\"${this._width}\"\n .height=\"${this._height}\"\n ></lit-minimap>\n `\n : ''}\n <slot style=\"display: none;\"></slot>\n `;\n }\n}","import { LitElement, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { Position } from '@xyflow/system';\n\n@customElement('lit-handle')\nexport class LitHandle extends LitElement {\n createRenderRoot() {\n return this;\n }\n\n @property({ type: String, reflect: true })\n type: 'source' | 'target' = 'source';\n\n @property({ type: String, reflect: true, attribute: 'data-handlepos' })\n position: Position = Position.Top;\n\n @property({ type: String, reflect: true, attribute: 'data-handleid' })\n handleId?: string;\n\n @property({ type: String, reflect: true, attribute: 'data-nodeid' })\n nodeId?: string;\n\n constructor() {\n super();\n this.addEventListener('mousedown', (e) => this._onPointerDown(e));\n this.addEventListener('touchstart', (e) => this._onPointerDown(e));\n }\n\n private _onPointerDown(e: MouseEvent | TouchEvent) {\n e.stopPropagation();\n const nodeId = this.getAttribute('data-nodeid');\n \n this.dispatchEvent(new CustomEvent('handle-pointer-down', {\n bubbles: true,\n composed: true,\n detail: {\n event: e,\n handleId: this.handleId,\n nodeId,\n type: this.type,\n handleDomNode: this,\n }\n }));\n }\n\n connectedCallback() {\n super.connectedCallback();\n this.classList.add('lit-flow__handle');\n this.classList.add(this.type);\n this.classList.add('connectable');\n this.classList.add('connectableend');\n }\n\n updated(changedProperties: Map<string, any>) {\n if (changedProperties.has('nodeId') || changedProperties.has('handleId') || changedProperties.has('type')) {\n this.setAttribute('data-id', `lit-flow-${this.nodeId || ''}-${this.handleId || ''}-${this.type}`);\n }\n }\n\n render() {\n return html`\n <div style=\"\n width: 100%;\n height: 100%;\n background: inherit;\n border-radius: inherit;\n pointer-events: none;\n \"></div>\n `;\n }\n}","import { LitElement, html, css } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { SignalWatcher } from '@lit-labs/signals';\nimport { type PanZoomInstance } from '@xyflow/system';\n\ntype Constructor<T> = new (...args: any[]) => T;\n\n@customElement('lit-controls')\nexport class LitControls extends (SignalWatcher as <T extends Constructor<LitElement>>(base: T) => T)(LitElement) {\n static styles = css`\n :host {\n display: block;\n position: absolute;\n left: 16px;\n bottom: 16px;\n z-index: 5;\n display: flex;\n flex-direction: column;\n gap: 2px;\n background: var(--md-sys-color-surface);\n padding: 4px;\n border-radius: var(--md-sys-shape-corner-small);\n box-shadow: var(--md-sys-elevation-1);\n border: 1px solid var(--md-sys-color-outline-variant);\n }\n\n button {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n border-radius: var(--md-sys-shape-corner-extra-small);\n cursor: pointer;\n padding: 0;\n color: var(--md-sys-color-on-surface-variant);\n transition: background-color 0.2s ease, color 0.2s ease;\n }\n\n button:hover {\n background: var(--md-sys-color-secondary-container);\n color: var(--md-sys-color-on-secondary-container);\n }\n\n button svg {\n width: 20px;\n height: 20px;\n fill: currentColor;\n }\n `;\n\n @property({ type: Object })\n panZoom?: PanZoomInstance;\n\n private _zoomIn() {\n this.panZoom?.scaleBy(1.2);\n }\n\n private _zoomOut() {\n this.panZoom?.scaleBy(1 / 1.2);\n }\n\n private _fitView() {\n this.dispatchEvent(new CustomEvent('fit-view', {\n bubbles: true,\n composed: true\n }));\n }\n\n render() {\n return html`\n <button @click=\"${this._zoomIn}\" title=\"Zoom In\">\n <svg viewBox=\"0 0 24 24\"><path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"/></svg>\n </button>\n <button @click=\"${this._zoomOut}\" title=\"Zoom Out\">\n <svg viewBox=\"0 0 24 24\"><path d=\"M19 13H5v-2h14v2z\"/></svg>\n </button>\n <button @click=\"${this._fitView}\" title=\"Fit View\">\n <svg viewBox=\"0 0 24 24\"><path d=\"M6 16h12V8H6v8zm2-6h8v4H8v-4zM4 4h16v16H4V4zm2 2v12h12V6H6z\"/></svg>\n </button>\n `;\n }\n}\n","import { LitElement, html, css, svg } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { SignalWatcher } from '@lit-labs/signals';\nimport {\n getInternalNodesBounds,\n getBoundsOfRects,\n XYMinimap,\n type Rect,\n type XYMinimapInstance,\n type PanZoomInstance,\n type InternalNodeBase,\n type Transform,\n} from '@xyflow/system';\n\ntype Constructor<T> = new (...args: any[]) => T;\n\n@customElement('lit-minimap')\nexport class LitMinimap extends (SignalWatcher as <T extends Constructor<LitElement>>(base: T) => T)(LitElement) {\n static styles = css`\n :host {\n display: block;\n position: absolute;\n right: 16px;\n bottom: 16px;\n z-index: 5;\n background: var(--md-sys-color-surface);\n border: 1px solid var(--md-sys-color-outline-variant);\n border-radius: var(--md-sys-shape-corner-small);\n box-shadow: var(--md-sys-elevation-1);\n overflow: hidden;\n }\n\n svg {\n display: block;\n }\n\n .minimap-node {\n fill: var(--md-sys-color-surface-variant);\n stroke: var(--md-sys-color-outline-variant);\n stroke-width: 0.5;\n }\n\n .minimap-mask {\n fill: var(--lit-flow-minimap-mask);\n fill-rule: evenodd;\n }\n `;\n\n @property({ type: Object })\n panZoom?: PanZoomInstance;\n\n @property({ type: Object })\n nodeLookup = new Map<string, InternalNodeBase>();\n\n @property({ type: Array })\n transform: Transform = [0, 0, 1];\n\n @property({ type: Array })\n translateExtent: [[number, number], [number, number]] = [[-Infinity, -Infinity], [Infinity, Infinity]];\n\n @property({ type: Number })\n width = 0;\n\n @property({ type: Number })\n height = 0;\n\n @state()\n private _minimapInstance?: XYMinimapInstance;\n\n updated(changedProperties: Map<string, any>) {\n if (!this._minimapInstance && this.panZoom) {\n const svgEl = this.shadowRoot?.querySelector('svg');\n if (svgEl) {\n this._minimapInstance = XYMinimap({\n domNode: svgEl,\n panZoom: this.panZoom,\n getTransform: () => this.transform,\n getViewScale: () => {\n const boundingRect = this._getBoundingRect();\n return Math.max(boundingRect.width / 200, boundingRect.height / 150);\n },\n });\n }\n }\n\n if (this._minimapInstance && (changedProperties.has('width') || changedProperties.has('height') || changedProperties.has('translateExtent'))) {\n this._minimapInstance.update({\n width: this.width,\n height: this.height,\n translateExtent: this.translateExtent,\n });\n }\n }\n\n private _getBoundingRect(): Rect {\n const viewBB: Rect = {\n x: -this.transform[0] / this.transform[2],\n y: -this.transform[1] / this.transform[2],\n width: this.width / this.transform[2],\n height: this.height / this.transform[2],\n };\n\n return this.nodeLookup.size > 0\n ? getBoundsOfRects(getInternalNodesBounds(this.nodeLookup), viewBB)\n : viewBB;\n }\n\n render() {\n const boundingRect = this._getBoundingRect();\n const viewBB: Rect = {\n x: -this.transform[0] / this.transform[2],\n y: -this.transform[1] / this.transform[2],\n width: this.width / this.transform[2],\n height: this.height / this.transform[2],\n };\n\n const elementWidth = 200;\n const elementHeight = 150;\n const scaledWidth = boundingRect.width / elementWidth;\n const scaledHeight = boundingRect.height / elementHeight;\n const viewScale = Math.max(scaledWidth, scaledHeight);\n const viewWidth = viewScale * elementWidth;\n const viewHeight = viewScale * elementHeight;\n const offset = 5 * viewScale;\n\n const x = boundingRect.x - (viewWidth - boundingRect.width) / 2 - offset;\n const y = boundingRect.y - (viewHeight - boundingRect.height) / 2 - offset;\n const width = viewWidth + offset * 2;\n const height = viewHeight + offset * 2;\n\n return html`\n <svg\n width=\"${elementWidth}\"\n height=\"${elementHeight}\"\n viewBox=\"${x} ${y} ${width} ${height}\"\n >\n ${Array.from(this.nodeLookup.values()).map((node) => {\n const { x, y } = node.internals.positionAbsolute;\n const w = node.measured.width || 0;\n const h = node.measured.height || 0;\n return svg`\n <rect\n class=\"minimap-node\"\n x=\"${x}\"\n y=\"${y}\"\n width=\"${w}\"\n height=\"${h}\"\n rx=\"2\"\n ry=\"2\"\n />\n `;\n })}\n <path\n class=\"minimap-mask\"\n d=\"M${x - offset},${y - offset}h${width + offset * 2}v${height + offset * 2}h${-width - offset * 2}z\n M${viewBB.x},${viewBB.y}h${viewBB.width}v${viewBB.height}h${-viewBB.width}z\"\n />\n </svg>\n `;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { m3Tokens } from './theme';\n\n@customElement('lit-sidebar')\nexport class LitSidebar extends LitElement {\n static styles = [\n m3Tokens,\n css`\n :host {\n display: block;\n width: 200px;\n background: var(--md-sys-color-surface);\n border-right: 1px solid var(--md-sys-color-outline-variant);\n padding: 16px;\n box-sizing: border-box;\n height: 100%;\n }\n\n .sidebar-title {\n font-family: var(--md-sys-typescale-body-medium-font);\n font-size: var(--md-sys-typescale-label-medium-size);\n color: var(--md-sys-color-on-surface-variant);\n text-transform: uppercase;\n font-weight: bold;\n margin-bottom: 16px;\n }\n\n .node-palette {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .palette-item {\n padding: 12px;\n background: var(--md-sys-color-surface-container-low);\n border: 1px solid var(--md-sys-color-outline-variant);\n border-radius: var(--md-sys-shape-corner-small);\n cursor: grab;\n font-family: var(--md-sys-typescale-body-medium-font);\n font-size: var(--md-sys-typescale-body-medium-size);\n color: var(--md-sys-color-on-surface);\n user-select: none;\n transition: background-color 0.2s ease;\n }\n\n .palette-item:hover {\n background: var(--md-sys-color-surface-container-high);\n }\n\n .palette-item:active {\n cursor: grabbing;\n }\n `\n ];\n\n @property({ type: Array })\n nodeTypes = [\n { type: 'default', label: 'Default Node' },\n { type: 'input', label: 'Input Node' },\n { type: 'output', label: 'Output Node' },\n ];\n\n private _onDragStart(e: DragEvent, nodeType: string) {\n if (e.dataTransfer) {\n e.dataTransfer.setData('application/litflow', nodeType);\n e.dataTransfer.effectAllowed = 'move';\n }\n }\n\n render() {\n return html`\n <div class=\"sidebar-title\">Node Palette</div>\n <div class=\"node-palette\">\n ${this.nodeTypes.map(\n (node) => html`\n <div\n class=\"palette-item\"\n draggable=\"true\"\n @dragstart=\"${(e: DragEvent) => this._onDragStart(e, node.type)}\"\n >\n ${node.label}\n </div>\n `\n )}\n </div>\n `;\n }\n}\n","import { LitElement, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { Position } from '@xyflow/system';\nimport './lit-handle';\n\n@customElement('lit-gemini-prompt-node')\nexport class LitGeminiPromptNode extends LitElement {\n createRenderRoot() {\n return this;\n }\n\n @property({ type: String, attribute: 'data-id', reflect: true })\n nodeId = '';\n\n @property({ type: Object })\n set data(val: any) {\n this._data = val;\n if (val.prompt) this.prompt = val.prompt;\n }\n get data() { return this._data; }\n private _data: any = {};\n\n @property({ type: String })\n prompt = '';\n\n private _onInput(e: Event) {\n const target = e.target as HTMLTextAreaElement;\n this.prompt = target.value;\n this.dispatchEvent(new CustomEvent('node-data-change', {\n bubbles: true,\n composed: true,\n detail: { id: this.nodeId, data: { prompt: this.prompt } }\n }));\n }\n\n render() {\n return html`\n <div class=\"gemini-node prompt-node\" style=\"\n padding: 12px;\n background: var(--md-sys-color-surface-container-high);\n border-radius: 12px;\n width: 200px;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n gap: 8px;\n border: 1px solid var(--md-sys-color-outline-variant);\n text-align: left;\n \">\n <div style=\"display: flex; align-items: center; gap: 8px; margin-bottom: 4px;\">\n <span style=\"font-size: 18px;\">✨</span>\n <span style=\"font-size: 12px; font-weight: bold; color: var(--md-sys-color-primary);\">GEMINI PROMPT</span>\n </div>\n <textarea\n style=\"\n width: 100%;\n height: 80px;\n border-radius: 8px;\n border: 1px solid var(--md-sys-color-outline);\n padding: 8px;\n font-family: inherit;\n font-size: 12px;\n resize: none;\n box-sizing: border-box;\n background: var(--md-sys-color-surface);\n color: var(--md-sys-color-on-surface);\n \"\n placeholder=\"Enter prompt...\"\n .value=\"${this.prompt}\"\n @input=\"${this._onInput}\"\n ></textarea>\n <button\n style=\"\n width: 100%;\n padding: 8px;\n border-radius: 8px;\n border: none;\n background: var(--md-sys-color-primary);\n color: var(--md-sys-color-on-primary);\n font-size: 12px;\n font-weight: bold;\n cursor: pointer;\n \"\n @click=\"${() => this.dispatchEvent(new CustomEvent('gemini-generate', { bubbles: true, composed: true, detail: { id: this.nodeId, prompt: this.prompt } }))}\"\n >\n Generate\n </button>\n <lit-handle type=\"source\" data-handlepos=\"${Position.Bottom}\" data-nodeid=\"${this.nodeId}\"></lit-handle>\n </div>\n `;\n }\n}\n","import { LitElement, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { Position } from '@xyflow/system';\nimport './lit-handle';\n\n@customElement('lit-gemini-image-node')\nexport class LitGeminiImageNode extends LitElement {\n createRenderRoot() {\n return this;\n }\n\n @property({ type: String, attribute: 'data-id', reflect: true })\n nodeId = '';\n\n @property({ type: Object })\n set data(val: any) {\n this._data = val;\n if (val.imageUrl) this.imageUrl = val.imageUrl;\n if (val.status) this.status = val.status;\n }\n get data() { return this._data; }\n private _data: any = {};\n\n @property({ type: String })\n imageUrl = '';\n\n @property({ type: String })\n status: 'idle' | 'loading' | 'success' | 'error' = 'idle';\n\n render() {\n return html`\n <div class=\"gemini-node image-node\" style=\"\n padding: 12px;\n background: var(--md-sys-color-surface-container-high);\n border-radius: 12px;\n width: 220px;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n gap: 8px;\n border: 1px solid var(--md-sys-color-outline-variant);\n text-align: left;\n \">\n <div style=\"display: flex; align-items: center; gap: 8px; margin-bottom: 4px;\">\n <span style=\"font-size: 18px;\">🖼️</span>\n <span style=\"font-size: 12px; font-weight: bold; color: var(--md-sys-color-secondary);\">GEMINI IMAGE</span>\n </div>\n \n <div style=\"\n width: 100%;\n height: 150px;\n background: var(--md-sys-color-surface-container-lowest);\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n border: 1px dashed var(--md-sys-color-outline);\n \">\n ${this.status === 'loading' \n ? html`<div style=\"font-size: 12px; color: var(--md-sys-color-outline);\">Generating...</div>`\n : this.imageUrl \n ? html`<img src=\"${this.imageUrl}\" style=\"width: 100%; height: 100%; object-fit: cover;\" />`\n : html`<div style=\"font-size: 12px; color: var(--md-sys-color-outline);\">No image generated</div>`\n }\n </div>\n\n <lit-handle type=\"target\" data-handlepos=\"${Position.Top}\" data-nodeid=\"${this.nodeId}\"></lit-handle>\n </div>\n `;\n }\n}\n"],"names":["createInitialState","signal","infiniteExtent","LitNode","SignalWatcher","LitElement","html","__decorateClass","property","customElement","LitEdge","Position","path","getBezierPath","svg","css","boolConverter","value","LitFlow","nodes","adoptUserNodes","updateAbsolutePositions","childNodes","el","i","edges","entries","entry","id","element","node","width","height","zoom","userNode","n","handles","sourceBounds","targetBounds","bounds","nodeRect","handleData","multi","newNodes","position","tx","ty","padding","minX","minY","maxX","maxY","x","y","graphWidth","graphHeight","containerWidth","containerHeight","zoomX","zoomY","userSelectionActive","PanOnScrollMode","e","XYPanZoom","_","changedProperties","nodeElements","currentIds","dragInstance","XYDrag","delta","panZoom","nodeExtent","transform","dragItems","item","edge","sourceNode","targetNode","userSource","userTarget","sourceHandle","h","targetHandle","sPos","getHandlePosition","tPos","labelX","labelY","pathParams","getStraightPath","getSmoothStepPath","getMarkerId","marker","type","markerEndId","markerStartId","target","isPaneClick","isSelectionAction","rect","currentX","currentY","start","end","selectionBox","nodesChanged","internalNode","pos","nextSelected","edgesChanged","nodeSelectionMap","newEdges","sourceSelected","targetSelected","event","handleId","nodeId","handleDomNode","isTarget","fromHandle","XYHandle","ConnectionMode","viewport","conn","connection","label","userLabel","newNode","selectedNodes","selectedEdges","nodeIdsToRemove","edgeIdsToRemove","step","connectionInProgress","tagName","tag","unsafeStatic","style","styleString","k","v","widthStyle","heightStyle","zIndex","m3Tokens","query","state","LitHandle","LitControls","LitMinimap","svgEl","XYMinimap","boundingRect","viewBB","getBoundsOfRects","getInternalNodesBounds","elementWidth","elementHeight","scaledWidth","scaledHeight","viewScale","viewWidth","viewHeight","offset","w","LitSidebar","nodeType","LitGeminiPromptNode","val","LitGeminiImageNode"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "name": "@ghchinoy/litflow",
3
- "version": "0.2.4",
3
+ "version": "0.2.7",
4
4
  "description": "xyflow core integrated with Lit WebComponents",
5
+ "homepage": "https://litflow.dev",
5
6
  "license": "MIT",
6
7
  "author": "G. Hussain Chinoy",
7
8
  "repository": {
@@ -63,9 +63,10 @@ export class LitControls extends (SignalWatcher as <T extends Constructor<LitEle
63
63
  }
64
64
 
65
65
  private _fitView() {
66
- // fitView implementation will need more data from the flow
67
- // for now just a placeholder or simple zoom reset
68
- this.panZoom?.setViewport({ x: 0, y: 0, zoom: 1 });
66
+ this.dispatchEvent(new CustomEvent('fit-view', {
67
+ bubbles: true,
68
+ composed: true
69
+ }));
69
70
  }
70
71
 
71
72
  render() {
@@ -76,8 +77,8 @@ export class LitControls extends (SignalWatcher as <T extends Constructor<LitEle
76
77
  <button @click="${this._zoomOut}" title="Zoom Out">
77
78
  <svg viewBox="0 0 24 24"><path d="M19 13H5v-2h14v2z"/></svg>
78
79
  </button>
79
- <button @click="${this._fitView}" title="Reset View">
80
- <svg viewBox="0 0 24 24"><path d="M4 6h16v2H4zm0 5h16v2H4zm0 5h16v2H4z"/></svg>
80
+ <button @click="${this._fitView}" title="Fit View">
81
+ <svg viewBox="0 0 24 24"><path d="M6 16h12V8H6v8zm2-6h8v4H8v-4zM4 4h16v16H4V4zm2 2v12h12V6H6z"/></svg>
81
82
  </button>
82
83
  `;
83
84
  }