@aceshooting/lyra-ui 28.1.1 → 28.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +26 -0
- package/dist/components/agent-tools/span-waterfall/span-waterfall.class.js +1 -1
- package/dist/components/charts/chart/box-plot.class.d.ts +1 -1
- package/dist/components/charts/chart/box-plot.class.js +2 -2
- package/dist/components/charts/chart/chart.class.d.ts +1 -1
- package/dist/components/charts/chart/chart.class.js +3 -3
- package/dist/components/conversation/push-to-talk/push-to-talk.class.d.ts +2 -1
- package/dist/components/conversation/push-to-talk/push-to-talk.class.js +1 -1
- package/dist/components/data/flow-canvas/flow-canvas.class.js +1 -1
- package/dist/components/data/heatmap/heatmap.class.js +1 -1
- package/dist/components/forms/textarea/textarea.class.js +1 -1
- package/dist/components/layout/details/accordion.class.js +1 -1
- package/dist/components/layout/menu/menu.class.d.ts +1 -1
- package/dist/components/layout/menu/menu.class.js +1 -1
- package/dist/components/layout/page/page.class.d.ts +1 -1
- package/dist/components/layout/page/page.class.js +1 -1
- package/dist/components/layout/responsive-panel/responsive-panel.class.js +1 -1
- package/dist/components/layout/widget/widget.class.js +1 -1
- package/dist/components/media/image-viewer/image-viewer.class.js +1 -1
- package/dist/components/overlays/overlay/dropdown.class.js +1 -1
- package/dist/components/overlays/overlay/popover.class.js +1 -1
- package/dist/components/retrieval/graph/graph.class.d.ts +1 -1
- package/dist/components/retrieval/graph/graph.class.js +1 -1
- package/dist/components/utility/tour/tour.class.js +4 -4
- package/dist/internal/dev-mode-attribute-warning.development.js +1 -1
- package/dist/internal/package-metadata.js +1 -1
- package/llms/components/lr-push-to-talk.md +3 -0
- package/llms/peers.md +1 -1
- package/package.json +2 -2
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{__decorate}from"tslib";import{html,nothing,svg}from"lit";import{property,state}from"lit/decorators.js";import{repeat}from"lit/directives/repeat.js";import{LyraElement}from"../../../internal/lyra-element.js";import{fitTransform}from"../../../internal/fit-transform.js";import{nextId,srOnly}from"../../../internal/a11y.js";import{AnnouncementSinkController,Announcer}from"../../../internal/announcer.js";import{isRtl}from"../../../internal/rtl.js";import{prefersReducedMotion}from"../../../internal/motion.js";import{observeReducedMotion}from"../../../internal/motion-observer.js";import{layeredLayout}from"../../../internal/layered-layout.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{finiteNumber,finiteRange}from"../../../internal/numbers.js";import{isActionableElement}from"../../../internal/focus-navigation.js";import{isNativeTopLayerElement}from"../../../internal/fixed-containing-block.js";import{isHtmlElement}from"../../../internal/dom-guards.js";import{resolveCssTokenLength}from"../../../internal/css-token-length.js";import{devWarnOnce}from"../../../internal/dev-mode-attribute-warning.js";import{tag}from"../../../internal/prefix.js";import{DEFAULT_FLOW_INPUTS,DEFAULT_FLOW_OUTPUTS,snapshotFlowDecorations,snapshotFlowEdges,snapshotFlowNodes,MAX_FLOW_COLLECTION_ENTRIES}from"./flow-model.js";import{FLOW_PALETTE_MIME_TYPE}from"./flow-types.js";import{styles}from"./flow-canvas.styles.js";import{LYRA_DEFAULT_flowCanvasLabel,LYRA_DEFAULT_flowCanvasLayoutLimit,LYRA_DEFAULT_flowCanvasSummary,LYRA_DEFAULT_flowConnectCancelled,LYRA_DEFAULT_flowConnectCommitted,LYRA_DEFAULT_flowConnectStarted,LYRA_DEFAULT_flowConnectTarget,LYRA_DEFAULT_flowEdge,LYRA_DEFAULT_flowEdgeList,LYRA_DEFAULT_flowEdgeWithLabel,LYRA_DEFAULT_flowNode,LYRA_DEFAULT_flowNodeDeselected,LYRA_DEFAULT_flowNodeMoved,LYRA_DEFAULT_flowNodeSelected,LYRA_DEFAULT_flowSelectionCleared}from"../../../internal/default-strings/data.generated.js";import{LYRA_DEFAULT_flowItemAnnouncement,LYRA_DEFAULT_noData}from"../../../internal/default-strings/shared.generated.js";export*from"./flow-types.js";const FLOW_EDGE_TONES=["neutral","brand","success","warning","danger"],CONNECT_OFFSET_MIN=24,CONNECT_OFFSET_MAX=120,ZOOM_MULTIPLIER=1.2,DEFAULT_FIT_PADDING=24,KEYBOARD_PAN_STEP=32,UNMATCHED_AUTHORED_CARD_WARNING="lyra-flow-canvas-unmatched-authored-card";function toggledSelection(list,id){return list.includes(id)?list.filter(x=>x!==id):[...list,id]}const nodeMaps=new WeakMap;function nodeById(nodes,id){let map=nodeMaps.get(nodes);return map||nodeMaps.set(nodes,map=new Map(nodes.map(node=>[node.id,node]))),map.get(id)}function nodeTypePart(type){if(!type)return null;const normalized=type.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return normalized?`node-type-${/^\d/.test(normalized)?`type-${normalized}`:normalized}`:null}class LyraFlowCanvas extends LyraElement{constructor(){super(...arguments),this._nodes=Object.freeze([]),this._edges=Object.freeze([]),this._orientation="horizontal",this.nodesDraggable=!1,this.connectable=!1,this.droppable=!1,this.readonly=!1,this._selectedNodeIds=Object.freeze([]),this._requestedSelectedNodeIds=Object.freeze([]),this._selectedEdgeIds=Object.freeze([]),this._requestedSelectedEdgeIds=Object.freeze([]),this.minZoom=.25,this.maxZoom=2,this.grid=8,this.layerGap=64,this.nodeGap=24,this._decorations=null,this.accessibleLabel=null,this.arrowMarkerIds={neutral:nextId("flow-canvas-arrow-neutral"),brand:nextId("flow-canvas-arrow-brand"),success:nextId("flow-canvas-arrow-success"),warning:nextId("flow-canvas-arrow-warning"),danger:nextId("flow-canvas-arrow-danger")},this.liveRegionId=nextId("flow-canvas-live"),this.announcements=new AnnouncementSinkController(this,{eager:["polite"]}),this.announcer=new Announcer({onFlush:text=>{this.mirrorAnnouncement(text),this.announcements.announcePolite(text)}}),this.activeItemIndex=0,this.connecting=!1,this.layoutTruncated=!1,this.hasConnectedLayoutBaseline=!1,this.layoutLimitAnnouncementPending=!1,this.keyboardConnectSourceId=null,this.keyboardConnectTargetIndex=0,this.autoPositions=new Map,this.measuredSizes=new Map,this.observedNodeEls=new Set,this.authoredCardObserverGeneration=0,this.authoredCardSyncQueued=!1,this.authoredCardSlotLeases=new Map,this.layoutRaf=null,this.panX=0,this.panY=0,this.zoomLevel=1,this.viewportChangeRaf=null,this.hasFitOnce=!1,this.wheelMeasure=null,this.wheelMeasureRaf=null,this.nodeIncidentEdges=new Map,this.connectInvalidNodeId=null,this.companionCallbacks=new Set,this.companionRaf=null,this.onWheel=e=>{if(this.readonly||!this.viewportEl||this.isFromTopLayerSurface(e,this.viewportEl))return;e.preventDefault(),this.wheelMeasure||(this.wheelMeasure={rect:this.viewportEl.getBoundingClientRect(),rtl:isRtl(this)},this.wheelMeasureRaf=this.requestOwnerAnimationFrame(()=>{this.wheelMeasure=null,this.wheelMeasureRaf=null}));const{rect,rtl}=this.wheelMeasure,localX=this.localWorldX(e.clientX,rect,rtl),localY=e.clientY-rect.top,factor=e.deltaY<0?ZOOM_MULTIPLIER:1/ZOOM_MULTIPLIER;this.zoomAtPoint(localX,localY,this.zoomLevel*factor)},this.onBackgroundPointerDown=e=>{this.readonly||this.isFromTopLayerSurface(e,this.viewportEl)||(this.panDrag={pointerId:e.pointerId,startClientX:e.clientX,startClientY:e.clientY,startPanX:this.panX,startPanY:this.panY,rtlFlip:this.orientation==="horizontal"&&isRtl(this)?-1:1},e.target.setPointerCapture?.(e.pointerId),this.viewportEl?.setAttribute("data-panning",""),this.connectedWindow?.addEventListener("pointermove",this.onBackgroundPointerMove),this.connectedWindow?.addEventListener("pointerup",this.onBackgroundPointerUp),this.connectedWindow?.addEventListener("pointercancel",this.onBackgroundPointerUp),this.connectedWindow?.addEventListener("lostpointercapture",this.onBackgroundPointerUp))},this.onBackgroundPointerMove=e=>{const drag=this.panDrag;if(!(!drag||e.pointerId!==drag.pointerId)){if(this.readonly){this.endBackgroundPan(!0);return}this.panX=drag.startPanX+(e.clientX-drag.startClientX)*drag.rtlFlip,this.panY=drag.startPanY+(e.clientY-drag.startClientY),this.applyWorldTransform(),this.scheduleViewportChange()}},this.onBackgroundPointerUp=e=>{!this.panDrag||e.pointerId!==this.panDrag.pointerId||this.endBackgroundPan(this.readonly||e.type!=="pointerup")},this.onViewportKeyDown=e=>{if(!(e.target!==this.viewportEl||this.readonly))if(e.key==="+"||e.key==="=")e.preventDefault(),this.zoomIn();else if(e.key==="-"||e.key==="_")e.preventDefault(),this.zoomOut();else if(e.key==="0")e.preventDefault(),this.resetZoom();else if(e.key==="ArrowRight"){e.preventDefault();const rtlFlip=this.orientation==="horizontal"&&isRtl(this)?-1:1;this.panBy(-KEYBOARD_PAN_STEP*rtlFlip,0)}else if(e.key==="ArrowLeft"){e.preventDefault();const rtlFlip=this.orientation==="horizontal"&&isRtl(this)?-1:1;this.panBy(KEYBOARD_PAN_STEP*rtlFlip,0)}else e.key==="ArrowDown"?(e.preventDefault(),this.panBy(0,-KEYBOARD_PAN_STEP)):e.key==="ArrowUp"&&(e.preventDefault(),this.panBy(0,KEYBOARD_PAN_STEP))},this.onViewportDragOver=e=>{!this.droppable||this.readonly||e.dataTransfer?.types.includes(FLOW_PALETTE_MIME_TYPE)&&(e.preventDefault(),e.dataTransfer.dropEffect="copy",this.viewportEl?.setAttribute("data-drop-active",""))},this.onViewportDragLeave=()=>{this.viewportEl?.removeAttribute("data-drop-active")},this.onViewportDrop=e=>{if(this.viewportEl?.removeAttribute("data-drop-active"),!this.droppable||this.readonly)return;const raw=e.dataTransfer?.getData(FLOW_PALETTE_MIME_TYPE);if(!raw)return;e.preventDefault();const maxPayloadBytes=4096;if(raw.length>maxPayloadBytes)return;const TextEncoderCtor=this.ownerDocument.defaultView?.TextEncoder??globalThis.TextEncoder;if(TextEncoderCtor&&new TextEncoderCtor().encode(raw).byteLength>maxPayloadBytes)return;let payload;try{payload=JSON.parse(raw)}catch{return}if(typeof payload!="object"||payload===null||Array.isArray(payload)||Object.getPrototypeOf(payload)!==Object.prototype&&Object.getPrototypeOf(payload)!==null)return;const rawType=payload.type;if(typeof rawType!="string")return;const type=rawType.trim();if(!type||type.length>128)return;const contentPoint=this.toContentPoint(e.clientX,e.clientY);this.emit("lr-node-add",Object.freeze({type,position:Object.freeze({x:this.snap(contentPoint.x),y:this.snap(contentPoint.y)})}))},this.onNodePointerMove=e=>{const drag=this.nodeDrag;if(!drag||e.pointerId!==drag.pointerId)return;if(this.readonly||!this.nodesDraggable){this.endNodeDrag(!1);return}const dx=(e.clientX-drag.startClientX)*drag.rtlFlip/this.zoomLevel,dy=(e.clientY-drag.startClientY)/this.zoomLevel,x=this.snap(drag.startX+dx),y=this.snap(drag.startY+dy);drag.wrapper.style.transform=`translate(${x}px, ${y}px)`,this.updateIncidentEdges(drag.nodeId,x,y),drag.currentX=x,drag.currentY=y},this.onNodePointerUp=e=>{const drag=this.nodeDrag;!drag||e.pointerId!==drag.pointerId||this.endNodeDrag(!this.readonly&&e.type==="pointerup")},this.onWorldPointerDown=e=>{if(!this.connectable||this.readonly||this.connectState||this.isFromTopLayerSurface(e,this.viewportEl))return;const path=e.composedPath(),handleEl=path.find(el=>isHtmlElement(el)&&el.dataset.handleKind==="output");if(!handleEl)return;const nodeId=this.nodeIdFromComposedPath(path),handleId=handleEl.dataset.handleId;!nodeId||!handleId||(e.stopPropagation(),this.startConnectGesture(nodeId,handleId,e.clientX,e.clientY))},this.onConnectPointerMove=e=>{if(!this.connectState)return;if(this.readonly||!this.connectable){this.onConnectPointerCancel();return}const targetPt=this.connectContentPoint(e.clientX,e.clientY);this.connectionLineEl?.setAttribute("d",this.edgePathD(this.connectState.startPt,targetPt));const hoveredId=this.nodeIdFromComposedPath(e.composedPath()),invalid=hoveredId!=null&&this.isInvalidConnectTarget(hoveredId);this.connectInvalidNodeId&&this.connectInvalidNodeId!==(invalid?hoveredId:null)&&this.renderedNodeById(this.connectInvalidNodeId)?.removeAttribute("data-connect-invalid"),this.connectInvalidNodeId=invalid?hoveredId:null,invalid&&this.renderedNodeById(hoveredId)?.setAttribute("data-connect-invalid","")},this.onConnectPointerUp=e=>{if(!this.connectState)return;if(this.readonly||!this.connectable){this.onConnectPointerCancel();return}const state2=this.connectState,path=e.composedPath(),targetNodeId=this.nodeIdFromComposedPath(path);if(this.endConnectGesture(),!targetNodeId||this.isInvalidConnectTargetFor(state2,targetNodeId)){this.announcer.announce(this.localize("flowConnectCancelled"));return}const targetHandle=path.find(el=>isHtmlElement(el)&&el.dataset.handleKind==="input")?.dataset.handleId??"in";this.emit("lr-connect",Object.freeze({source:state2.sourceId,target:targetNodeId,sourceHandle:state2.sourceHandle,targetHandle}));const sourceNode=this.nodes.find(node=>node.id===state2.sourceId),targetNode=this.nodes.find(node=>node.id===targetNodeId);this.announcer.announce(this.localize("flowConnectCommitted",void 0,{source:sourceNode?this.nodeAccessibleText(sourceNode):state2.sourceId,target:targetNode?this.nodeAccessibleText(targetNode):targetNodeId}))},this.onConnectPointerCancel=()=>{this.connectState&&(this.endConnectGesture(),this.announcer.announce(this.localize("flowConnectCancelled")))}}static{this.defaultStrings={...super.defaultStrings,flowCanvasLabel:LYRA_DEFAULT_flowCanvasLabel,flowCanvasLayoutLimit:LYRA_DEFAULT_flowCanvasLayoutLimit,flowCanvasSummary:LYRA_DEFAULT_flowCanvasSummary,flowConnectCancelled:LYRA_DEFAULT_flowConnectCancelled,flowConnectCommitted:LYRA_DEFAULT_flowConnectCommitted,flowConnectStarted:LYRA_DEFAULT_flowConnectStarted,flowConnectTarget:LYRA_DEFAULT_flowConnectTarget,flowEdge:LYRA_DEFAULT_flowEdge,flowEdgeList:LYRA_DEFAULT_flowEdgeList,flowEdgeWithLabel:LYRA_DEFAULT_flowEdgeWithLabel,flowItemAnnouncement:LYRA_DEFAULT_flowItemAnnouncement,flowNode:LYRA_DEFAULT_flowNode,flowNodeDeselected:LYRA_DEFAULT_flowNodeDeselected,flowNodeMoved:LYRA_DEFAULT_flowNodeMoved,flowNodeSelected:LYRA_DEFAULT_flowNodeSelected,flowSelectionCleared:LYRA_DEFAULT_flowSelectionCleared,noData:LYRA_DEFAULT_noData}}static{this.styles=[LyraElement.styles,styles,srOnly]}get nodes(){return this._nodes}set nodes(value){if(value===this.nodesSource||value===this._nodes)return;const previous=this._nodes;this.nodesSource=value,this._nodes=snapshotFlowNodes(value),this.rovingCache=void 0,this.requestUpdate("nodes",previous)}get edges(){return this._edges}set edges(value){if(value===this.edgesSource||value===this._edges)return;const previous=this._edges;this.edgesSource=value,this._edges=snapshotFlowEdges(value),this.rovingCache=void 0,this.requestUpdate("edges",previous)}get orientation(){return this._orientation}set orientation(value){const previous=this._orientation,next=value==="vertical"?"vertical":"horizontal";this._orientation=next,this.rovingCache=void 0,(next!==previous||value!==next)&&this.requestUpdate("orientation",previous)}get selectedNodeIds(){return this._selectedNodeIds}set selectedNodeIds(value){if(value===this.selectedNodeIdsSource||value===this._selectedNodeIds)return;const previous=this._selectedNodeIds;this.selectedNodeIdsSource=value,this._requestedSelectedNodeIds=this.sanitizeSelectionCandidates(value),this._selectedNodeIds=this.snapshotSelectedIds(this._requestedSelectedNodeIds,new Set(this.nodes.map(node=>node.id))),this.requestUpdate("selectedNodeIds",previous)}get selectedEdgeIds(){return this._selectedEdgeIds}set selectedEdgeIds(value){if(value===this.selectedEdgeIdsSource||value===this._selectedEdgeIds)return;const previous=this._selectedEdgeIds;this.selectedEdgeIdsSource=value,this._requestedSelectedEdgeIds=this.sanitizeSelectionCandidates(value),this._selectedEdgeIds=this.snapshotSelectedIds(this._requestedSelectedEdgeIds,new Set(this.edges.map(edge=>edge.id))),this.requestUpdate("selectedEdgeIds",previous)}sanitizeSelectionCandidates(value){if(!Array.isArray(value))return Object.freeze([]);const selected=[],seen=new Set;for(const candidate of value.slice(0,MAX_FLOW_COLLECTION_ENTRIES))typeof candidate!="string"||candidate.trim().length===0||seen.has(candidate)||(seen.add(candidate),selected.push(candidate));return Object.freeze(selected)}snapshotSelectedIds(value,validIds){const selected=value.filter(candidate=>validIds.has(candidate));return selected.length===value.length?value:Object.freeze(selected)}get decorations(){return this._decorations}set decorations(value){if(value===this.decorationsSource||value===this._decorations)return;const previous=this._decorations;this.decorationsSource=value,this._decorations=value==null?null:snapshotFlowDecorations(value),this.requestUpdate("decorations",previous)}get safeMinZoom(){return finiteRange(this.minZoom,.25,.001,1e3)}get safeMaxZoom(){return finiteRange(this.maxZoom,2,.001,1e3)}get effectiveZoomBounds(){return{min:Math.min(this.safeMinZoom,this.safeMaxZoom),max:Math.max(this.safeMinZoom,this.safeMaxZoom)}}get safeGrid(){return finiteRange(this.grid,8,0)}get safeLayerGap(){return finiteRange(this.layerGap,64,0)}get safeNodeGap(){return finiteRange(this.nodeGap,24,0)}connectedCallback(){super.connectedCallback(),this.stopMotionWatch=observeReducedMotion(this,()=>this.requestUpdate());const ownerWindow=this.ownerDocument.defaultView;this.connectedWindow=ownerWindow??void 0,ownerWindow&&this.announcer.setTimerHost(ownerWindow);const ResizeObserverCtor=ownerWindow?.ResizeObserver;this.resizeObserver=ResizeObserverCtor?new ResizeObserverCtor(entries=>this.onNodesResized(entries)):void 0,this.bindAuthoredCardObserver(),this.syncAuthoredCards(),this.pushCardPropsAll(),this.hasUpdated&&(this.observeNodeWrappers(),this.nodes.length>0&&this.scheduleLayoutPass())}disconnectedCallback(){super.disconnectedCallback(),this.stopMotionWatch?.(),this.stopMotionWatch=void 0,this.resetAuthoredCardObserver(),this.restoreAuthoredCardSlots(),this.hasConnectedLayoutBaseline=!1,this.layoutLimitAnnouncementPending=!1,this.announcer.cancel(),this.mirrorAnnouncement(""),this.resizeObserver?.disconnect(),this.resizeObserver=void 0,this.observedNodeEls.clear(),this.layoutRaf!=null&&(this.cancelOwnerAnimationFrame(this.layoutRaf),this.layoutRaf=null),this.companionRaf!=null&&(this.cancelOwnerAnimationFrame(this.companionRaf),this.companionRaf=null),this.viewportChangeRaf!=null&&(this.cancelOwnerAnimationFrame(this.viewportChangeRaf),this.viewportChangeRaf=null),this.wheelMeasureRaf!=null&&(this.cancelOwnerAnimationFrame(this.wheelMeasureRaf),this.wheelMeasureRaf=null,this.wheelMeasure=null),this.panDrag=void 0,this.connectedWindow?.removeEventListener("pointermove",this.onBackgroundPointerMove),this.connectedWindow?.removeEventListener("pointerup",this.onBackgroundPointerUp),this.connectedWindow?.removeEventListener("pointercancel",this.onBackgroundPointerUp),this.connectedWindow?.removeEventListener("lostpointercapture",this.onBackgroundPointerUp),this.nodeDrag=void 0,this.dragEdgeRefs=void 0,this.connectedWindow?.removeEventListener("pointermove",this.onNodePointerMove),this.connectedWindow?.removeEventListener("pointerup",this.onNodePointerUp),this.connectedWindow?.removeEventListener("pointercancel",this.onNodePointerUp),this.connectedWindow?.removeEventListener("lostpointercapture",this.onNodePointerUp),this.connectState=void 0,this.connecting=!1,this.connectInvalidNodeId=null,this.keyboardConnectSourceId=null,this.keyboardConnectTargetIndex=0,this.connectedWindow?.removeEventListener("pointermove",this.onConnectPointerMove),this.connectedWindow?.removeEventListener("pointerup",this.onConnectPointerUp),this.connectedWindow?.removeEventListener("pointercancel",this.onConnectPointerCancel),this.connectedWindow?.removeEventListener("lostpointercapture",this.onConnectPointerCancel),this.connectedWindow=void 0}adoptedCallback(){super.adoptedCallback(),this.announcements.adopted(),this.resetAuthoredCardObserver(),this.restoreAuthoredCardSlots(),this.hasConnectedLayoutBaseline=!1,this.layoutLimitAnnouncementPending=!1;const ownerWindow=this.ownerDocument.defaultView;ownerWindow&&this.announcer.setTimerHost(ownerWindow),this.isConnected&&(this.bindAuthoredCardObserver(),this.scheduleAuthoredCardReconciliation(),this.nodes.length>0&&this.scheduleLayoutPass())}requestOwnerAnimationFrame(callback){const owner=this.ownerDocument.defaultView;return owner?{owner,handle:owner.requestAnimationFrame(callback)}:null}cancelOwnerAnimationFrame(frame){frame.owner.cancelAnimationFrame(frame.handle)}mirrorAnnouncement(text){this.renderRoot?.querySelector('[part="live-region"]')?.replaceChildren(text)}resetAuthoredCardObserver(){this.authoredCardObserverGeneration+=1,this.authoredCardObserver?.disconnect(),this.authoredCardObserver=void 0,this.authoredCardObserverDocument=void 0,this.authoredCardSyncQueued=!1}bindAuthoredCardObserver(){const ownerDocument=this.ownerDocument;if(!this.isConnected||this.authoredCardObserver&&this.authoredCardObserverDocument===ownerDocument)return;this.resetAuthoredCardObserver();const MutationObserverCtor=ownerDocument.defaultView?.MutationObserver;if(!MutationObserverCtor)return;const generation=this.authoredCardObserverGeneration,observer=new MutationObserverCtor(records=>{if(this.authoredCardObserver!==observer||this.authoredCardObserverDocument!==ownerDocument||this.authoredCardObserverGeneration!==generation||!this.isConnected||this.ownerDocument!==ownerDocument)return;records.some(record=>record.type==="childList"?record.target===this:record.type==="attributes"&&record.attributeName==="node-id"&&record.target.parentNode===this)&&this.scheduleAuthoredCardReconciliation()});observer.observe(this,{childList:!0,attributes:!0,attributeFilter:["node-id"],subtree:!0}),this.authoredCardObserver=observer,this.authoredCardObserverDocument=ownerDocument}scheduleAuthoredCardReconciliation(){const generation=this.authoredCardObserverGeneration,ownerDocument=this.authoredCardObserverDocument??this.ownerDocument;!this.isConnected||this.authoredCardSyncQueued||(this.authoredCardSyncQueued=!0,queueMicrotask(()=>{this.authoredCardObserverGeneration!==generation||!this.isConnected||this.ownerDocument!==ownerDocument||(this.authoredCardSyncQueued=!1,this.syncAuthoredCards(),this.pushCardPropsAll())}))}observeNodeWrappers(){for(const el of Array.from(this.renderRoot.querySelectorAll('[part="node"]')))this.observedNodeEls.has(el)||(this.observedNodeEls.add(el),this.resizeObserver?.observe(el))}willUpdate(changed){if(super.willUpdate(changed),this.rovingCache=void 0,this.companionStructure=void 0,changed.has("nodes")){this.cancelModelBoundGestures(),this.pruneNodeCaches(),this.syncAuthoredCards();const nodeIds=new Set(this.nodes.map(node=>node.id));this._selectedNodeIds=this.snapshotSelectedIds(this._requestedSelectedNodeIds,nodeIds)}if(changed.has("edges")){this.cancelModelBoundGestures();const edgeIds=new Set(this.edges.map(edge=>edge.id));this._selectedEdgeIds=this.snapshotSelectedIds(this._requestedSelectedEdgeIds,edgeIds)}if((changed.has("readonly")&&this.readonly||changed.has("orientation"))&&this.cancelActiveGestures(),changed.has("nodesDraggable")&&!this.nodesDraggable&&this.endNodeDrag(!1),changed.has("connectable")&&!this.connectable&&(this.onConnectPointerCancel(),this.keyboardConnectSourceId=null,this.keyboardConnectTargetIndex=0),changed.has("droppable")&&!this.droppable&&this.viewportEl?.removeAttribute("data-drop-active"),changed.has("grid")&&this.endNodeDrag(!1),changed.has("nodes")||changed.has("edges")||changed.has("orientation")||changed.has("layerGap")||changed.has("nodeGap"))for(const node of this.nodes)node.position||this.autoPositions.delete(node.id);(changed.has("nodes")||changed.has("selectedNodeIds")||changed.has("decorations")||changed.has("orientation"))&&this.pushCardPropsAll(changed)}pruneNodeCaches(){const nodeIds=new Set(this.nodes.map(node=>node.id));for(const id of this.autoPositions.keys())nodeIds.has(id)||this.autoPositions.delete(id);for(const id of this.measuredSizes.keys())nodeIds.has(id)||this.measuredSizes.delete(id);for(const element of this.observedNodeEls){const id=element.dataset.nodeId;id&&nodeIds.has(id)||(this.resizeObserver?.unobserve(element),this.observedNodeEls.delete(element))}}updated(changed){super.updated(changed),changed.has("edges")&&this.rebuildIncidentEdgesIndex(),changed.has("layoutTruncated")&&this.layoutLimitAnnouncementPending&&(this.layoutLimitAnnouncementPending=!1,this.isConnected&&this.layoutTruncated&&this.announcer.announce(this.localize("flowCanvasLayoutLimit"))),this.observeNodeWrappers(),(changed.has("nodes")||changed.has("edges")||changed.has("orientation")||changed.has("layerGap")||changed.has("nodeGap"))&&this.scheduleLayoutPass(),(changed.has("nodes")||changed.has("edges")||changed.has("decorations")||changed.has("minZoom")||changed.has("maxZoom")||changed.has("readonly")||changed.has("orientation")||changed.has("layerGap")||changed.has("nodeGap"))&&this.scheduleCompanionNotify();const viewportEl=this.renderRoot.querySelector('[part="viewport"]');viewportEl&&viewportEl!==this.viewportEl&&(this.viewportEl=viewportEl,this.worldEl=this.renderRoot.querySelector(".world"),viewportEl.addEventListener("wheel",this.onWheel,{passive:!1}),viewportEl.addEventListener("keydown",this.onViewportKeyDown),viewportEl.addEventListener("dragover",this.onViewportDragOver),viewportEl.addEventListener("dragleave",this.onViewportDragLeave),viewportEl.addEventListener("drop",this.onViewportDrop),this.applyWorldTransform())}syncAuthoredCards(){const ids=new Set(this.nodes.map(node=>node.id)),adopted=new Set;for(const child of Array.from(this.children)){const nodeId=child.getAttribute("node-id");if(nodeId&&ids.has(nodeId)){this.leaseAuthoredCardSlot(child,nodeId),adopted.add(child);continue}this.releaseAuthoredCardSlot(child),nodeId&&devWarnOnce(UNMATCHED_AUTHORED_CARD_WARNING,"<lr-flow-canvas> has a direct child with a node-id that matches no node; it will not render.")}for(const child of[...this.authoredCardSlotLeases.keys()])adopted.has(child)||this.releaseAuthoredCardSlot(child)}leaseAuthoredCardSlot(child,nodeId){let lease=this.authoredCardSlotLeases.get(child);if(!lease){const slot2=child.getAttribute("slot");lease={authoredSlot:slot2,appliedSlot:slot2,authorOwnsSlot:!1},this.authoredCardSlotLeases.set(child,lease)}if(lease.authorOwnsSlot||child.getAttribute("slot")!==lease.appliedSlot){lease.authorOwnsSlot=!0;return}const slot=`node-${nodeId}`;child.getAttribute("slot")!==slot&&child.setAttribute("slot",slot),lease.appliedSlot=child.getAttribute("slot")}releaseAuthoredCardSlot(child){const lease=this.authoredCardSlotLeases.get(child);lease&&(!lease.authorOwnsSlot&&child.getAttribute("slot")===lease.appliedSlot&&(lease.authoredSlot===null?child.removeAttribute("slot"):child.setAttribute("slot",lease.authoredSlot)),this.authoredCardSlotLeases.delete(child))}restoreAuthoredCardSlots(){for(const child of[...this.authoredCardSlotLeases.keys()])this.releaseAuthoredCardSlot(child)}pushCardPropsAll(changed){const nodesChanged=changed?.has("nodes")??!0,selectionChanged=nodesChanged||changed?.has("selectedNodeIds")===!0,decorationsChanged=nodesChanged||changed?.has("decorations")===!0,orientationChanged=nodesChanged||changed?.has("orientation")===!0,cardsByNodeId=new Map;for(const child of Array.from(this.children)){const nodeId=child.getAttribute("node-id");nodeId&&this.authoredCardSlotLeases.has(child)&&cardsByNodeId.set(nodeId,child)}const selectedNodeIds=selectionChanged?new Set(this.selectedNodeIds):null;for(const node of this.nodes){const card=cardsByNodeId.get(node.id);if(card&&(nodesChanged&&(this.setCardProperty(card,"inputs",node.inputs??DEFAULT_FLOW_INPUTS),this.setCardProperty(card,"outputs",node.outputs??DEFAULT_FLOW_OUTPUTS),this.setCardProperty(card,"flowType",node.type??"")),orientationChanged&&this.setCardProperty(card,"orientation",this.orientation),selectedNodeIds&&this.setCardProperty(card,"selected",selectedNodeIds.has(node.id)),decorationsChanged)){const decoration=this.decorations?.[node.id];this.setCardProperty(card,"status",decoration?.status??null),this.setCardProperty(card,"progress",decoration?.progress??null),this.setCardProperty(card,"statusDetail",decoration?.detail??""),this.setCardProperty(card,"durationMs",decoration?.durationMs??null)}}}setCardProperty(card,property2,value){try{card[property2]=value}catch{}}nodePosition(node){const position=node.position??this.autoPositions.get(node.id)??{x:0,y:0};return{x:finiteNumber(position.x,0),y:finiteNumber(position.y,0)}}nodeSize(id){const measured=this.measuredSizes.get(id);if(measured)return measured;const ownerWindow=this.ownerDocument?.defaultView,host=this.renderedNodeById(id)??this,computed=ownerWindow?.getComputedStyle(host),customWidth=resolveCssTokenLength(computed?.getPropertyValue("--lr-flow-canvas-node-fallback-inline-size").trim(),{host}),customHeight=resolveCssTokenLength(computed?.getPropertyValue("--lr-flow-canvas-node-fallback-block-size").trim(),{host}),width=customWidth??(resolveCssTokenLength(computed?.getPropertyValue("--lr-size-10rem").trim()||"10rem",{host})??0)+(resolveCssTokenLength(computed?.getPropertyValue("--lr-size-1rem").trim()||"1rem",{host})??0),height=customHeight??resolveCssTokenLength(computed?.getPropertyValue("--lr-size-4rem").trim()||"4rem",{host})??0;return{width,height}}resolvedNode(node){const pos=this.nodePosition(node),size=this.nodeSize(node.id);return{node,x:pos.x,y:pos.y,width:size.width,height:size.height}}handleOffset(count,index,span){return count<=1?span/2:span*(index+.5)/count}handlePoint(resolved,kind,handleId){const handles=kind==="input"?resolved.node.inputs??DEFAULT_FLOW_INPUTS:resolved.node.outputs??DEFAULT_FLOW_OUTPUTS,index=handles.findIndex(h=>h.id===handleId),horizontal=this.orientation==="horizontal",edgeSpan=horizontal?resolved.height:resolved.width,offset=index>=0?this.handleOffset(handles.length,index,edgeSpan):edgeSpan/2;if(horizontal)return{x:kind==="input"?resolved.x:resolved.x+resolved.width,y:resolved.y+offset};const y=kind==="input"?resolved.y:resolved.y+resolved.height;return{x:resolved.x+offset,y}}edgePathD(sourcePt,targetPt){const dx=targetPt.x-sourcePt.x,dy=targetPt.y-sourcePt.y,distance=Math.hypot(dx,dy),offset=Math.min(CONNECT_OFFSET_MAX,Math.max(CONNECT_OFFSET_MIN,distance/2)),horizontal=this.orientation==="horizontal",c1x=sourcePt.x+(horizontal?offset:0),c1y=sourcePt.y+(horizontal?0:offset),c2x=targetPt.x-(horizontal?offset:0),c2y=targetPt.y-(horizontal?0:offset);return`M ${sourcePt.x} ${sourcePt.y} C ${c1x} ${c1y}, ${c2x} ${c2y}, ${targetPt.x} ${targetPt.y}`}nodeAccessibleText(node){if(node.accessibleLabel)return node.accessibleLabel;const label=typeof node.data?.label=="string"?node.data.label:node.id;return this.localize("flowNode",void 0,{label})}edgeAccessibleText(edge){const sourceNode=nodeById(this.nodes,edge.source),targetNode=nodeById(this.nodes,edge.target),source=sourceNode?this.nodeAccessibleText(sourceNode):edge.source,target=targetNode?this.nodeAccessibleText(targetNode):edge.target;return edge.label?this.localize("flowEdgeWithLabel",void 0,{label:edge.label,source,target}):this.localize("flowEdge",void 0,{source,target})}onNodesResized(entries){let changedAny=!1;for(const entry of entries){const id=entry.target.dataset.nodeId;if(!id)continue;const box=entry.borderBoxSize?.[0],width=box?box.inlineSize:entry.contentRect.width,height=box?box.blockSize:entry.contentRect.height,prev=this.measuredSizes.get(id);(!prev||prev.width!==width||prev.height!==height)&&(this.measuredSizes.set(id,{width,height}),changedAny=!0)}changedAny&&(this.scheduleLayoutPass(),this.scheduleCompanionNotify())}measureNodeWrappers(){for(const wrapper of Array.from(this.renderRoot.querySelectorAll('[part="node"]'))){const id=wrapper.dataset.nodeId;if(!id)continue;const rect=wrapper.getBoundingClientRect(),width=wrapper.offsetWidth||rect.width/Math.max(this.zoomLevel,Number.EPSILON),height=wrapper.offsetHeight||rect.height/Math.max(this.zoomLevel,Number.EPSILON);Number.isFinite(width)&&Number.isFinite(height)&&width>0&&height>0&&this.measuredSizes.set(id,{width,height})}}scheduleLayoutPass(){!this.isConnected||this.layoutRaf!=null||(this.layoutRaf=this.requestOwnerAnimationFrame(()=>{this.layoutRaf=null,this.isConnected&&(this.measureNodeWrappers(),this.runAutoLayoutIfNeeded(),this.requestUpdate(),this.hasFitOnce||(this.hasFitOnce=this.applyFit()))}))}setLayoutTruncated(truncated){const previous=this.layoutTruncated;if(this.layoutTruncated=truncated,truncated||(this.layoutLimitAnnouncementPending=!1),!(!this.isConnected||this.nodes.length===0)){if(!this.hasConnectedLayoutBaseline){this.hasConnectedLayoutBaseline=!0;return}!previous&&truncated&&(this.layoutLimitAnnouncementPending=!0)}}runAutoLayoutIfNeeded(){const unpositioned=this.nodes.filter(n=>!n.position);if(unpositioned.length===0){this.setLayoutTruncated(!1);return}const swap=this.orientation==="horizontal",graphNodes=this.nodes.map(n=>{const size=this.nodeSize(n.id);return{id:n.id,width:swap?size.height:size.width,height:swap?size.width:size.height}}),nodeIds=new Set(this.nodes.map(n=>n.id)),graphEdges=this.edges.filter(e=>nodeIds.has(e.source)&&nodeIds.has(e.target)).map(e=>({source:e.source,target:e.target})),fixedPositions=new Map;for(const n of this.nodes){if(!n.position||n.position.x<0||n.position.y<0)continue;const size=this.nodeSize(n.id),center={x:n.position.x+size.width/2,y:n.position.y+size.height/2};!Number.isSafeInteger(Math.trunc(center.x))||!Number.isSafeInteger(Math.trunc(center.y))||fixedPositions.set(n.id,swap?{x:center.y,y:center.x}:center)}const result=layeredLayout({nodes:graphNodes,edges:graphEdges,options:{gapX:this.safeNodeGap,gapY:this.safeLayerGap,fixedPositions}}),positions={};for(const n of unpositioned){const raw=result.positions.get(n.id);if(!raw)continue;const center=swap?{x:raw.y,y:raw.x}:{x:raw.x,y:raw.y},size=this.nodeSize(n.id),resolved={x:center.x-size.width/2,y:center.y-size.height/2};this.autoPositions.set(n.id,resolved),positions[n.id]=Object.freeze(resolved)}this.rovingCache=void 0,this.setLayoutTruncated(result.truncated),Object.keys(positions).length>0&&this.emit("lr-layout-change",Object.freeze({positions:Object.freeze(positions),truncated:result.truncated}))}get viewport(){return Object.freeze({x:this.panX,y:this.panY,zoom:this.zoomLevel})}set viewport(_value){}setViewport(next){this.readonly||(this.panX=finiteNumber(next.x,this.panX),this.panY=finiteNumber(next.y,this.panY),this.zoomLevel=this.clampZoom(next.zoom),this.applyWorldTransform(),this.emit("lr-viewport-change",Object.freeze({x:this.panX,y:this.panY,zoom:this.zoomLevel})))}zoomIn(){this.readonly||this.zoomAtCenter(this.zoomLevel*ZOOM_MULTIPLIER)}zoomOut(){this.readonly||this.zoomAtCenter(this.zoomLevel/ZOOM_MULTIPLIER)}resetZoom(){this.readonly||this.setViewport({x:this.panX,y:this.panY,zoom:1})}fit(options){this.readonly||this.applyFit(options?.padding)}applyFit(requestedPadding=DEFAULT_FIT_PADDING){const rect=this.viewportEl?.getBoundingClientRect();if(this.nodes.length===0||!rect?.width||!rect.height)return!1;const padding=finiteRange(requestedPadding,DEFAULT_FIT_PADDING,0);let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0;for(const node of this.nodes){const resolved=this.resolvedNode(node);minX=Math.min(minX,resolved.x),minY=Math.min(minY,resolved.y),maxX=Math.max(maxX,resolved.x+resolved.width),maxY=Math.max(maxY,resolved.y+resolved.height)}const viewW=rect.width,viewH=rect.height,transform=fitTransform({minX,minY,maxX,maxY},{width:viewW,height:viewH},padding,this.effectiveZoomBounds,{minimumAvailableSize:0,invalidZoomFallback:1,centerWithMinimumExtent:!0});return this.panX=transform.x,this.panY=transform.y,this.zoomLevel=transform.zoom,this.applyWorldTransform(),this.scheduleViewportChange(),!0}focusNode(id,options){if(this.readonly)return;const node=this.nodes.find(n=>n.id===id);if(!node)return;const resolved=this.resolvedNode(node),rect=this.viewportEl?.getBoundingClientRect(),viewW=rect?.width??0,viewH=rect?.height??0,zoom=options?.zoom!=null?this.clampZoom(options.zoom):this.zoomLevel;this.panX=viewW/2-(resolved.x+resolved.width/2)*zoom,this.panY=viewH/2-(resolved.y+resolved.height/2)*zoom,this.zoomLevel=zoom,this.applyWorldTransform(),this.scheduleViewportChange(),this.focusActiveItem(this.spatialItemIndex("node",id))}toContentPoint(clientX,clientY){const rect=this.viewportEl?.getBoundingClientRect();if(!rect)return{x:0,y:0};const localX=this.localWorldX(clientX,rect),localY=clientY-rect.top;return{x:(localX-this.panX)/this.zoomLevel,y:(localY-this.panY)/this.zoomLevel}}registerCompanion(cb){return this.companionCallbacks.add(cb),this.scheduleCompanionNotify(),()=>{this.companionCallbacks.delete(cb)}}scheduleCompanionNotify(structural=!0){structural&&(this.companionStructure=void 0),!(this.companionRaf!=null||this.companionCallbacks.size===0)&&(this.companionRaf=this.requestOwnerAnimationFrame(()=>{this.companionRaf=null;for(const cb of this.companionCallbacks)cb(this.buildSnapshot())}))}buildSnapshot(){const rect=this.viewportEl?.getBoundingClientRect(),bounds=this.effectiveZoomBounds;return this.companionStructure??={nodes:Object.freeze(this.nodes.map(n=>{const resolved=this.resolvedNode(n);return Object.freeze({id:n.id,x:resolved.x,y:resolved.y,width:resolved.width,height:resolved.height,status:this.decorations?.[n.id]?.status})})),edges:Object.freeze(this.edges.map(e=>Object.freeze({id:e.id,source:e.source,target:e.target,status:this.decorations?.[e.id]?.status})))},Object.freeze({...this.companionStructure,viewport:Object.freeze({x:this.panX,y:this.panY,zoom:this.zoomLevel,width:rect?.width??0,height:rect?.height??0,minZoom:bounds.min,maxZoom:bounds.max}),locked:this.readonly,orientation:this.orientation,layerGap:this.safeLayerGap,nodeGap:this.safeNodeGap})}clampZoom(z){const{min,max}=this.effectiveZoomBounds;return finiteRange(z,1,min,max)}applyWorldTransform(){this.worldEl&&(this.worldEl.style.transform=`translate(${this.panX}px, ${this.panY}px) scale(${this.zoomLevel})`),this.scheduleCompanionNotify(!1)}scheduleViewportChange(){this.viewportChangeRaf==null&&(this.viewportChangeRaf=this.requestOwnerAnimationFrame(()=>{this.viewportChangeRaf=null,this.emit("lr-viewport-change",Object.freeze({x:this.panX,y:this.panY,zoom:this.zoomLevel}))}))}zoomAtCenter(nextZoom){const rect=this.viewportEl?.getBoundingClientRect();this.zoomAtPoint(rect?rect.width/2:0,rect?rect.height/2:0,nextZoom)}zoomAtPoint(localX,localY,nextZoom){const clamped=this.clampZoom(nextZoom);if(clamped===this.zoomLevel)return;const contentX=(localX-this.panX)/this.zoomLevel,contentY=(localY-this.panY)/this.zoomLevel;this.panX=localX-contentX*clamped,this.panY=localY-contentY*clamped,this.zoomLevel=clamped,this.applyWorldTransform(),this.scheduleViewportChange()}localWorldX(clientX,rect,rtl=isRtl(this)){const local=clientX-rect.left;return this.orientation==="horizontal"&&rtl?rect.width-local:local}isFromTopLayerSurface(e,boundary){for(const entry of e.composedPath()){if(entry===boundary)return!1;if(entry instanceof Element&&(entry.hasAttribute("data-lr-top-layer")||isNativeTopLayerElement(entry)))return!0}return!1}endBackgroundPan(rollback){const drag=this.panDrag;drag&&(this.panDrag=void 0,this.viewportEl?.removeAttribute("data-panning"),this.connectedWindow?.removeEventListener("pointermove",this.onBackgroundPointerMove),this.connectedWindow?.removeEventListener("pointerup",this.onBackgroundPointerUp),this.connectedWindow?.removeEventListener("pointercancel",this.onBackgroundPointerUp),this.connectedWindow?.removeEventListener("lostpointercapture",this.onBackgroundPointerUp),rollback&&(this.panX!==drag.startPanX||this.panY!==drag.startPanY)&&(this.panX=drag.startPanX,this.panY=drag.startPanY,this.applyWorldTransform(),this.scheduleViewportChange()))}panBy(dx,dy){this.panX+=dx,this.panY+=dy,this.applyWorldTransform(),this.scheduleViewportChange()}focusableEdges(){const nodeIds=new Set(this.nodes.map(n=>n.id));return this.edges.filter(e=>nodeIds.has(e.source)&&nodeIds.has(e.target))}rovingItems(){if(this.rovingCache)return this.rovingCache;const horizontal=this.orientation==="horizontal",keyed=this.nodes.map(node=>{const{x,y}=this.nodePosition(node);return{node,main:horizontal?x:y,cross:horizontal?y:x}});return keyed.sort((a,b)=>a.main-b.main||a.cross-b.cross),this.rovingCache=[...keyed.map(({node})=>({kind:"node",id:node.id,disabled:node.disabled===!0})),...this.focusableEdges().map(e=>({kind:"edge",id:e.id}))]}itemCount(){return this.rovingItems().length}isRovingItemDisabled(item){return item.disabled===!0}normalizedItemIndex(index=this.activeItemIndex){const items=this.rovingItems(),count=items.length;if(!count)return-1;const clamped=Math.min(Math.max(index,0),count-1);if(!this.isRovingItemDisabled(items[clamped]))return clamped;for(let forward=clamped+1;forward<count;forward+=1)if(!this.isRovingItemDisabled(items[forward]))return forward;for(let backward=clamped-1;backward>=0;backward-=1)if(!this.isRovingItemDisabled(items[backward]))return backward;return-1}nextEnabledItemIndex(from,direction){const items=this.rovingItems(),count=items.length;if(!count)return-1;let index=Math.min(Math.max(from+direction,0),count-1);for(let steps=0;steps<count;steps+=1){if(!this.isRovingItemDisabled(items[index]))return index;if(index+=direction,index<0||index>=count)break}return from>=0&&from<count&&!this.isRovingItemDisabled(items[from])?from:-1}firstEnabledItemIndex(){return this.rovingItems().findIndex(item=>!this.isRovingItemDisabled(item))}lastEnabledItemIndex(){const items=this.rovingItems();for(let index=items.length-1;index>=0;index-=1)if(!this.isRovingItemDisabled(items[index]))return index;return-1}itemAccessibleText(item){if(item.kind==="node"){const node=this.nodes.find(n=>n.id===item.id);return node?this.nodeAccessibleText(node):""}const edge=this.edges.find(e=>e.id===item.id);return edge?this.edgeAccessibleText(edge):""}spatialItemIndex(kind,id){return this.rovingItems().findIndex(it=>it.kind===kind&&it.id===id)}announceItem(index){const item=this.rovingItems()[index];item&&this.announcer.announce(this.localize("flowItemAnnouncement",void 0,{item:this.itemAccessibleText(item),index:this.formatNumber(index+1),total:this.formatNumber(this.itemCount())}))}formatNumber(value){return getNumberFormat(this.effectiveLocale).format(value)}onItemFocus(index){this.normalizedItemIndex(index)<0||(this.activeItemIndex=index,this.announceItem(index))}renderedElementByDataId(attribute,id){const renderRoot=this.renderRoot;if(!renderRoot)return null;const ownerCss=this.ownerDocument?.defaultView?.CSS,escape=ownerCss?.escape;if(typeof escape=="function")try{const match=renderRoot.querySelector(`[${attribute}="${escape.call(ownerCss,id)}"]`);if(match)return match}catch{}return[...renderRoot.querySelectorAll(`[${attribute}]`)].find(candidate=>candidate.getAttribute(attribute)===id)??null}renderedNodeById(id){return this.renderedElementByDataId("data-node-id",id)}renderedEdgeById(id){return this.renderedElementByDataId("data-edge-id",id)}focusActiveItem(index=this.activeItemIndex){const normalized=this.normalizedItemIndex(index);if(normalized<0)return;this.activeItemIndex=normalized,this.announceItem(normalized);const item=this.rovingItems()[normalized];item&&this.updateComplete.then(()=>{(item.kind==="node"?this.renderedNodeById(item.id)?.querySelector('[part="node-control"]'):this.renderedEdgeById(item.id)?.querySelector('[part="edge"]'))?.focus()})}applySelection(kind,id,additive){kind==="node"?(this.selectedNodeIds=additive?toggledSelection(this.selectedNodeIds,id):[id],additive||(this.selectedEdgeIds=[])):(this.selectedEdgeIds=additive?toggledSelection(this.selectedEdgeIds,id):[id],additive||(this.selectedNodeIds=[])),this.emit("lr-selection-change",Object.freeze({selectedNodeIds:Object.freeze([...this.selectedNodeIds]),selectedEdgeIds:Object.freeze([...this.selectedEdgeIds])}));const selected=kind==="node"?this.selectedNodeIds.includes(id):this.selectedEdgeIds.includes(id),label=this.itemAccessibleText({kind,id});this.announcer.announce(this.localize(selected?"flowNodeSelected":"flowNodeDeselected",void 0,{label}))}clearSelection(){this.selectedNodeIds.length===0&&this.selectedEdgeIds.length===0||(this.selectedNodeIds=[],this.selectedEdgeIds=[],this.emit("lr-selection-change",Object.freeze({selectedNodeIds:Object.freeze([]),selectedEdgeIds:Object.freeze([])})),this.announcer.announce(this.localize("flowSelectionCleared")))}deleteSelection(){!this.nodesDraggable&&!this.connectable&&!this.droppable||this.selectedNodeIds.length===0&&this.selectedEdgeIds.length===0||this.emit("lr-selection-delete",Object.freeze({nodeIds:Object.freeze([...this.selectedNodeIds]),edgeIds:Object.freeze([...this.selectedEdgeIds])}))}onNodeActivate(node,additive){node.disabled||(this.emit("lr-node-activate",Object.freeze({nodeId:node.id})),this.applySelection("node",node.id,additive))}startedOnAction(event,boundary){for(const entry of event.composedPath()){if(entry===boundary)return!1;if(entry.nodeType===1&&isActionableElement(entry))return!0}return!1}onNodeClick(event,node){if(this.startedOnAction(event,event.currentTarget)){event.stopPropagation();return}this.onNodeActivate(node,event.ctrlKey||event.metaKey)}onEdgeActivate(edge,additive){this.emit("lr-edge-activate",Object.freeze({edgeId:edge.id,sourceNodeId:edge.source,targetNodeId:edge.target,source:edge.source,target:edge.target})),this.applySelection("edge",edge.id,additive)}onItemKeyDown(e,index,activate){const arrowKeys=["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"];if(this.nodesDraggable&&!this.readonly&&(e.ctrlKey||e.metaKey)&&arrowKeys.includes(e.key)){const item=this.rovingItems()[index];if(item?.kind==="node"){e.preventDefault(),this.nudgeNode(item.id,e.key);return}}if(this.keyboardConnectSourceId){if(e.key==="Escape"){e.preventDefault(),this.cancelKeyboardConnect();return}if(e.key==="Enter"){e.preventDefault(),this.commitKeyboardConnect();return}const rtlForConnect=isRtl(this),forwardConnectKey=rtlForConnect?"ArrowLeft":"ArrowRight",backwardConnectKey=rtlForConnect?"ArrowRight":"ArrowLeft";if(e.key===forwardConnectKey||e.key==="ArrowDown"){e.preventDefault(),this.cycleKeyboardConnectTarget(1);return}if(e.key===backwardConnectKey||e.key==="ArrowUp"){e.preventDefault(),this.cycleKeyboardConnectTarget(-1);return}return}if(this.connectable&&!this.readonly&&e.key==="c"&&e.target===e.currentTarget){const item=this.rovingItems()[index];if(item?.kind==="node"){e.preventDefault(),this.startKeyboardConnect(item.id);return}}if(e.key==="Enter"||e.key===" "){e.preventDefault(),this.setActiveItemQuiet(index),activate(e.ctrlKey||e.metaKey);return}if(e.key==="Escape"){e.preventDefault(),e.target!==e.currentTarget?e.currentTarget.focus():this.clearSelection();return}if((e.key==="Delete"||e.key==="Backspace")&&e.target===e.currentTarget){e.preventDefault(),this.deleteSelection();return}if(!this.itemCount())return;const rtl=isRtl(this),forwardKey=rtl?"ArrowLeft":"ArrowRight",backwardKey=rtl?"ArrowRight":"ArrowLeft";let next;if(e.key===forwardKey||e.key==="ArrowDown")next=this.nextEnabledItemIndex(index,1);else if(e.key===backwardKey||e.key==="ArrowUp")next=this.nextEnabledItemIndex(index,-1);else if(e.key==="Home")next=this.firstEnabledItemIndex();else if(e.key==="End")next=this.lastEnabledItemIndex();else return;e.preventDefault(),next>=0&&this.focusActiveItem(next)}setActiveItemQuiet(index){const normalized=this.normalizedItemIndex(index);normalized>=0&&(this.activeItemIndex=normalized)}itemIndexMaps(){const items=this.rovingItems(),nodeIndex=new Map,edgeIndex=new Map;return items.forEach((item,i)=>{item.kind==="node"?nodeIndex.set(item.id,i):edgeIndex.set(item.id,i-nodeIndex.size)}),{nodeIndex,edgeIndex}}snap(value){const grid=this.safeGrid;return grid>0?Math.round(value/grid)*grid:value}rebuildIncidentEdgesIndex(){const map=new Map;for(const edge of this.edges)(map.get(edge.source)??map.set(edge.source,[]).get(edge.source)).push(edge.id),edge.target!==edge.source&&(map.get(edge.target)??map.set(edge.target,[]).get(edge.target)).push(edge.id);this.nodeIncidentEdges=map}buildDragEdgeRefs(nodeId){const refs=[];for(const edgeId of this.nodeIncidentEdges.get(nodeId)??[]){const edge=this.edges.find(e=>e.id===edgeId),sourceNode=edge&&this.nodes.find(n=>n.id===edge.source),targetNode=edge&&this.nodes.find(n=>n.id===edge.target);if(!edge||!sourceNode||!targetNode)continue;const group=this.renderedEdgeById(edgeId);refs.push({edge,sourceNode,targetNode,pathEl:group?.querySelector('[part="edge"]')??null,labelEl:group?.querySelector('[part="edge-label"]')??null})}return refs}updateIncidentEdges(nodeId,x,y){for(const{edge,sourceNode,targetNode,pathEl,labelEl}of this.dragEdgeRefs??[]){const sourceResolved=edge.source===nodeId?{...this.resolvedNode(sourceNode),x,y}:this.resolvedNode(sourceNode),targetResolved=edge.target===nodeId?{...this.resolvedNode(targetNode),x,y}:this.resolvedNode(targetNode),sourcePt=this.handlePoint(sourceResolved,"output",edge.sourceHandle??"out"),targetPt=this.handlePoint(targetResolved,"input",edge.targetHandle??"in");if(pathEl?.setAttribute("d",this.edgePathD(sourcePt,targetPt)),labelEl){const midX=(sourcePt.x+targetPt.x)/2;labelEl.setAttribute("x",String(midX)),labelEl.setAttribute("y",String((sourcePt.y+targetPt.y)/2)),this.orientation==="horizontal"&&isRtl(this)?labelEl.setAttribute("transform",`translate(${2*midX} 0) scale(-1 1)`):labelEl.removeAttribute("transform")}}}onNodePointerDown(e,node){if(!this.nodesDraggable||this.readonly||node.disabled)return;const wrapper=e.currentTarget;if(this.isFromTopLayerSurface(e,wrapper)||this.startedOnAction(e,wrapper))return;e.stopPropagation();const start=this.nodePosition(node);this.nodeDrag={pointerId:e.pointerId,nodeId:node.id,startClientX:e.clientX,startClientY:e.clientY,startX:start.x,startY:start.y,wrapper,rtlFlip:this.orientation==="horizontal"&&isRtl(this)?-1:1},this.dragEdgeRefs=this.buildDragEdgeRefs(node.id),wrapper.setPointerCapture?.(e.pointerId),this.connectedWindow?.addEventListener("pointermove",this.onNodePointerMove),this.connectedWindow?.addEventListener("pointerup",this.onNodePointerUp),this.connectedWindow?.addEventListener("pointercancel",this.onNodePointerUp),this.connectedWindow?.addEventListener("lostpointercapture",this.onNodePointerUp)}endNodeDrag(commit){const drag=this.nodeDrag;if(!drag)return;this.nodeDrag=void 0,this.connectedWindow?.removeEventListener("pointermove",this.onNodePointerMove),this.connectedWindow?.removeEventListener("pointerup",this.onNodePointerUp),this.connectedWindow?.removeEventListener("pointercancel",this.onNodePointerUp),this.connectedWindow?.removeEventListener("lostpointercapture",this.onNodePointerUp);const previous={x:drag.startX,y:drag.startY},position={x:drag.currentX??drag.startX,y:drag.currentY??drag.startY};commit&&this.nodesDraggable&&this.nodes.some(node=>node.id===drag.nodeId)&&(position.x!==previous.x||position.y!==previous.y)&&this.emit("lr-node-move",Object.freeze({nodeId:drag.nodeId,position:Object.freeze(position),previous:Object.freeze(previous)}));const resetNode=this.nodes.find(n=>n.id===drag.nodeId),resetPos=resetNode?this.nodePosition(resetNode):previous;drag.wrapper.style.transform=`translate(${resetPos.x}px, ${resetPos.y}px)`,this.updateIncidentEdges(drag.nodeId,resetPos.x,resetPos.y),this.dragEdgeRefs=void 0,this.requestUpdate()}nudgeNode(nodeId,key){const node=this.nodes.find(n=>n.id===nodeId);if(!node)return;const current=this.nodePosition(node),step=this.safeGrid>0?this.safeGrid:1,rtlFlip=this.orientation==="horizontal"&&isRtl(this)?-1:1;let dx=0,dy=0;key==="ArrowRight"?dx=step*rtlFlip:key==="ArrowLeft"?dx=-step*rtlFlip:key==="ArrowDown"?dy=step:key==="ArrowUp"&&(dy=-step);const position={x:current.x+dx,y:current.y+dy};this.emit("lr-node-move",Object.freeze({nodeId,position:Object.freeze(position),previous:Object.freeze(current)})),this.announcer.announce(this.localize("flowNodeMoved",void 0,{label:this.nodeAccessibleText(node),x:this.formatNumber(position.x),y:this.formatNumber(position.y)})),this.requestUpdate()}nodeIdFromComposedPath(path){for(const el of path)if(isHtmlElement(el)&&el.getAttribute("part")==="node"&&el.dataset.nodeId)return el.dataset.nodeId;return null}isInvalidConnectTarget(hoveredId){return this.connectState?hoveredId===this.connectState.sourceId||this.nodes.find(n=>n.id===hoveredId)?.disabled?!0:this.edges.some(e=>e.source===this.connectState.sourceId&&e.target===hoveredId):!1}startConnectGesture(nodeId,handleId,clientX,clientY){const sourceNode=this.nodes.find(n=>n.id===nodeId);if(!sourceNode||sourceNode.disabled)return;const startPt=this.handlePoint(this.resolvedNode(sourceNode),"output",handleId);this.connectState={sourceId:nodeId,sourceHandle:handleId,startPt,rect:this.viewportEl?.getBoundingClientRect()??null,rtl:isRtl(this)},this.connecting=!0,this.announcer.announce(this.localize("flowConnectStarted",void 0,{label:this.nodeAccessibleText(sourceNode)})),this.updateComplete.then(()=>{this.connectionLineEl=this.renderRoot.querySelector('[part="connection-line"]')??void 0,this.connectionLineEl?.setAttribute("d",this.edgePathD(startPt,this.connectContentPoint(clientX,clientY)))}),this.connectedWindow?.addEventListener("pointermove",this.onConnectPointerMove),this.connectedWindow?.addEventListener("pointerup",this.onConnectPointerUp),this.connectedWindow?.addEventListener("pointercancel",this.onConnectPointerCancel),this.connectedWindow?.addEventListener("lostpointercapture",this.onConnectPointerCancel)}connectContentPoint(clientX,clientY){const state2=this.connectState;if(!state2?.rect)return{x:0,y:0};const localX=this.localWorldX(clientX,state2.rect,state2.rtl),localY=clientY-state2.rect.top;return{x:(localX-this.panX)/this.zoomLevel,y:(localY-this.panY)/this.zoomLevel}}isInvalidConnectTargetFor(state2,hoveredId){return hoveredId===state2.sourceId||this.nodes.find(n=>n.id===hoveredId)?.disabled?!0:this.edges.some(e=>e.source===state2.sourceId&&e.target===hoveredId)}endConnectGesture(){this.connectInvalidNodeId&&(this.renderedNodeById(this.connectInvalidNodeId)?.removeAttribute("data-connect-invalid"),this.connectInvalidNodeId=null),this.connectState=void 0,this.connecting=!1,this.connectedWindow?.removeEventListener("pointermove",this.onConnectPointerMove),this.connectedWindow?.removeEventListener("pointerup",this.onConnectPointerUp),this.connectedWindow?.removeEventListener("pointercancel",this.onConnectPointerCancel),this.connectedWindow?.removeEventListener("lostpointercapture",this.onConnectPointerCancel)}cancelActiveGestures(){this.endBackgroundPan(!0),this.cancelModelBoundGestures(),this.viewportEl?.removeAttribute("data-drop-active")}cancelModelBoundGestures(){this.endNodeDrag(!1),this.onConnectPointerCancel(),this.keyboardConnectSourceId=null,this.keyboardConnectTargetIndex=0}eligibleConnectTargets(sourceId){const linked=new Set(this.edges.filter(e=>e.source===sourceId).map(e=>e.target));return this.nodes.filter(n=>n.id!==sourceId&&!n.disabled&&!linked.has(n.id))}startKeyboardConnect(sourceId){const sourceNode=this.nodes.find(n=>n.id===sourceId);!sourceNode||sourceNode.disabled||this.eligibleConnectTargets(sourceId).length===0||(this.keyboardConnectSourceId=sourceId,this.keyboardConnectTargetIndex=0,sourceNode&&this.announceKeyboardConnectTarget())}cycleKeyboardConnectTarget(direction){if(!this.keyboardConnectSourceId)return;const targets=this.eligibleConnectTargets(this.keyboardConnectSourceId);targets.length!==0&&(this.keyboardConnectTargetIndex=(this.keyboardConnectTargetIndex+direction+targets.length)%targets.length,this.announceKeyboardConnectTarget())}announceKeyboardConnectTarget(){const sourceId=this.keyboardConnectSourceId;if(!sourceId)return;const source=this.nodes.find(node=>node.id===sourceId),targets=this.eligibleConnectTargets(sourceId),target=targets[this.keyboardConnectTargetIndex];!source||!target||this.announcer.announce(this.localize("flowConnectTarget",void 0,{source:this.nodeAccessibleText(source),target:this.nodeAccessibleText(target),index:this.formatNumber(this.keyboardConnectTargetIndex+1),total:this.formatNumber(targets.length)}))}commitKeyboardConnect(){const sourceId=this.keyboardConnectSourceId;if(!sourceId)return;const target=this.eligibleConnectTargets(sourceId)[this.keyboardConnectTargetIndex];if(this.keyboardConnectSourceId=null,!target)return;const sourceOutputs=nodeById(this.nodes,sourceId)?.outputs??DEFAULT_FLOW_OUTPUTS,targetInputs=target.inputs??DEFAULT_FLOW_INPUTS;if(!this.connectable||this.readonly)return;this.emit("lr-connect",Object.freeze({source:sourceId,target:target.id,sourceHandle:sourceOutputs[0]?.id??"out",targetHandle:targetInputs[0]?.id??"in"}));const source=this.nodes.find(node=>node.id===sourceId);this.announcer.announce(this.localize("flowConnectCommitted",void 0,{source:source?this.nodeAccessibleText(source):sourceId,target:this.nodeAccessibleText(target)}))}cancelKeyboardConnect(){this.keyboardConnectSourceId&&(this.keyboardConnectSourceId=null,this.announcer.announce(this.localize("flowConnectCancelled")))}statusTone(status){return status==="running"?"brand":status==="success"?"success":status==="error"?"danger":status==="denied"?"warning":"neutral"}edgeTone(edge){const decoration=this.decorations?.[edge.id];return decoration?this.statusTone(decoration.status):edge.tone??"neutral"}edgeIsRunning(edge){return this.decorations?.[edge.id]?.status==="running"}renderEdges(resolvedById,nodeIndex,edgeIndex,activeIndex){const selectedEdges=new Set(this.selectedEdgeIds),items=[],reducedMotion=!this.ownerDocument?.defaultView||prefersReducedMotion(this),counterMirrorLabels=this.orientation==="horizontal"&&!!this.ownerDocument?.defaultView&&isRtl(this);for(const edge of this.edges){const sourceResolved=resolvedById.get(edge.source);if(!sourceResolved)continue;const targetResolved=resolvedById.get(edge.target),sourcePt=this.handlePoint(sourceResolved,"output",edge.sourceHandle??"out");if(!targetResolved){const stubPt={x:sourcePt.x+14,y:sourcePt.y+14};items.push(svg`<line
|
|
1
|
+
import{__decorate}from"tslib";import{html,nothing,svg}from"lit";import{property,state}from"lit/decorators.js";import{repeat}from"lit/directives/repeat.js";import{LyraElement}from"../../../internal/lyra-element.js";import{fitTransform}from"../../../internal/fit-transform.js";import{nextId,srOnly}from"../../../internal/a11y.js";import{AnnouncementSinkController,Announcer}from"../../../internal/announcer.js";import{isRtl}from"../../../internal/rtl.js";import{prefersReducedMotion}from"../../../internal/motion.js";import{observeReducedMotion}from"../../../internal/motion-observer.js";import{layeredLayout}from"../../../internal/layered-layout.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{finiteNumber,finiteRange}from"../../../internal/numbers.js";import{isActionableElement}from"../../../internal/focus-navigation.js";import{isNativeTopLayerElement}from"../../../internal/fixed-containing-block.js";import{isHtmlElement}from"../../../internal/dom-guards.js";import{resolveCssTokenLength}from"../../../internal/css-token-length.js";import{devWarnOnce}from"../../../internal/dev-mode-attribute-warning.js";import{tag}from"../../../internal/prefix.js";import{DEFAULT_FLOW_INPUTS,DEFAULT_FLOW_OUTPUTS,snapshotFlowDecorations,snapshotFlowEdges,snapshotFlowNodes,MAX_FLOW_COLLECTION_ENTRIES}from"./flow-model.js";import{FLOW_PALETTE_MIME_TYPE}from"./flow-types.js";import{styles}from"./flow-canvas.styles.js";import{LYRA_DEFAULT_flowCanvasLabel,LYRA_DEFAULT_flowCanvasLayoutLimit,LYRA_DEFAULT_flowCanvasSummary,LYRA_DEFAULT_flowConnectCancelled,LYRA_DEFAULT_flowConnectCommitted,LYRA_DEFAULT_flowConnectStarted,LYRA_DEFAULT_flowConnectTarget,LYRA_DEFAULT_flowEdge,LYRA_DEFAULT_flowEdgeList,LYRA_DEFAULT_flowEdgeWithLabel,LYRA_DEFAULT_flowNode,LYRA_DEFAULT_flowNodeDeselected,LYRA_DEFAULT_flowNodeMoved,LYRA_DEFAULT_flowNodeSelected,LYRA_DEFAULT_flowSelectionCleared}from"../../../internal/default-strings/data.generated.js";import{LYRA_DEFAULT_flowItemAnnouncement,LYRA_DEFAULT_noData}from"../../../internal/default-strings/shared.generated.js";export*from"./flow-types.js";const FLOW_EDGE_TONES=["neutral","brand","success","warning","danger"],CONNECT_OFFSET_MIN=24,CONNECT_OFFSET_MAX=120,ZOOM_MULTIPLIER=1.2,DEFAULT_FIT_PADDING=24,KEYBOARD_PAN_STEP=32,UNMATCHED_AUTHORED_CARD_WARNING="lyra-flow-canvas-unmatched-authored-card";function toggledSelection(list,id){return list.includes(id)?list.filter(x=>x!==id):[...list,id]}const nodeMaps=new WeakMap;function nodeById(nodes,id){let map=nodeMaps.get(nodes);return map||nodeMaps.set(nodes,map=new Map(nodes.map(node=>[node.id,node]))),map.get(id)}function nodeTypePart(type){if(!type)return null;const normalized=type.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return normalized?`node-type-${/^\d/.test(normalized)?`type-${normalized}`:normalized}`:null}class LyraFlowCanvas extends LyraElement{constructor(){super(...arguments),this._nodes=Object.freeze([]),this._edges=Object.freeze([]),this._orientation="horizontal",this.nodesDraggable=!1,this.connectable=!1,this.droppable=!1,this.readonly=!1,this._selectedNodeIds=Object.freeze([]),this._requestedSelectedNodeIds=Object.freeze([]),this._selectedEdgeIds=Object.freeze([]),this._requestedSelectedEdgeIds=Object.freeze([]),this.minZoom=.25,this.maxZoom=2,this.grid=8,this.layerGap=64,this.nodeGap=24,this._decorations=null,this.accessibleLabel=null,this.arrowMarkerIds={neutral:nextId("flow-canvas-arrow-neutral"),brand:nextId("flow-canvas-arrow-brand"),success:nextId("flow-canvas-arrow-success"),warning:nextId("flow-canvas-arrow-warning"),danger:nextId("flow-canvas-arrow-danger")},this.liveRegionId=nextId("flow-canvas-live"),this.announcements=new AnnouncementSinkController(this,{eager:["polite"]}),this.announcer=new Announcer({onFlush:text=>{this.mirrorAnnouncement(text),this.announcements.announcePolite(text)}}),this.activeItemIndex=0,this.connecting=!1,this.layoutTruncated=!1,this.hasConnectedLayoutBaseline=!1,this.layoutLimitAnnouncementPending=!1,this.keyboardConnectSourceId=null,this.keyboardConnectTargetIndex=0,this.autoPositions=new Map,this.measuredSizes=new Map,this.observedNodeEls=new Set,this.authoredCardObserverGeneration=0,this.authoredCardSyncQueued=!1,this.authoredCardSlotLeases=new Map,this.layoutRaf=null,this.panX=0,this.panY=0,this.zoomLevel=1,this.viewportChangeRaf=null,this.hasFitOnce=!1,this.wheelMeasure=null,this.wheelMeasureRaf=null,this.nodeIncidentEdges=new Map,this.connectInvalidNodeId=null,this.companionCallbacks=new Set,this.companionRaf=null,this.onWheel=e=>{if(this.readonly||!this.viewportEl||this.isFromTopLayerSurface(e,this.viewportEl))return;e.preventDefault(),this.wheelMeasure||(this.wheelMeasure={rect:this.viewportEl.getBoundingClientRect(),rtl:isRtl(this)},this.wheelMeasureRaf=this.requestOwnerAnimationFrame(()=>{this.wheelMeasure=null,this.wheelMeasureRaf=null}));const{rect,rtl}=this.wheelMeasure,localX=this.localWorldX(e.clientX,rect,rtl),localY=e.clientY-rect.top,factor=e.deltaY<0?ZOOM_MULTIPLIER:1/ZOOM_MULTIPLIER;this.zoomAtPoint(localX,localY,this.zoomLevel*factor)},this.onBackgroundPointerDown=e=>{this.readonly||this.isFromTopLayerSurface(e,this.viewportEl)||(this.panDrag={pointerId:e.pointerId,startClientX:e.clientX,startClientY:e.clientY,startPanX:this.panX,startPanY:this.panY,rtlFlip:this.orientation==="horizontal"&&isRtl(this)?-1:1},e.target.setPointerCapture?.(e.pointerId),this.viewportEl?.setAttribute("data-panning",""),this.connectedWindow?.addEventListener("pointermove",this.onBackgroundPointerMove),this.connectedWindow?.addEventListener("pointerup",this.onBackgroundPointerUp),this.connectedWindow?.addEventListener("pointercancel",this.onBackgroundPointerUp),this.connectedWindow?.addEventListener("lostpointercapture",this.onBackgroundPointerUp))},this.onBackgroundPointerMove=e=>{const drag=this.panDrag;if(!(!drag||e.pointerId!==drag.pointerId)){if(this.readonly){this.endBackgroundPan(!0);return}this.panX=drag.startPanX+(e.clientX-drag.startClientX)*drag.rtlFlip,this.panY=drag.startPanY+(e.clientY-drag.startClientY),this.applyWorldTransform(),this.scheduleViewportChange()}},this.onBackgroundPointerUp=e=>{!this.panDrag||e.pointerId!==this.panDrag.pointerId||this.endBackgroundPan(this.readonly||e.type!=="pointerup")},this.onViewportKeyDown=e=>{if(!(e.target!==this.viewportEl||this.readonly))if(e.key==="+"||e.key==="=")e.preventDefault(),this.zoomIn();else if(e.key==="-"||e.key==="_")e.preventDefault(),this.zoomOut();else if(e.key==="0")e.preventDefault(),this.resetZoom();else if(e.key==="ArrowRight"){e.preventDefault();const rtlFlip=this.orientation==="horizontal"&&isRtl(this)?-1:1;this.panBy(-KEYBOARD_PAN_STEP*rtlFlip,0)}else if(e.key==="ArrowLeft"){e.preventDefault();const rtlFlip=this.orientation==="horizontal"&&isRtl(this)?-1:1;this.panBy(KEYBOARD_PAN_STEP*rtlFlip,0)}else e.key==="ArrowDown"?(e.preventDefault(),this.panBy(0,-KEYBOARD_PAN_STEP)):e.key==="ArrowUp"&&(e.preventDefault(),this.panBy(0,KEYBOARD_PAN_STEP))},this.onViewportDragOver=e=>{!this.droppable||this.readonly||e.dataTransfer?.types.includes(FLOW_PALETTE_MIME_TYPE)&&(e.preventDefault(),e.dataTransfer.dropEffect="copy",this.viewportEl?.setAttribute("data-drop-active",""))},this.onViewportDragLeave=()=>{this.viewportEl?.removeAttribute("data-drop-active")},this.onViewportDrop=e=>{if(this.viewportEl?.removeAttribute("data-drop-active"),!this.droppable||this.readonly)return;const raw=e.dataTransfer?.getData(FLOW_PALETTE_MIME_TYPE);if(!raw)return;e.preventDefault();const maxPayloadBytes=4096;if(raw.length>maxPayloadBytes)return;const TextEncoderCtor=this.ownerDocument.defaultView?.TextEncoder??globalThis.TextEncoder;if(TextEncoderCtor&&new TextEncoderCtor().encode(raw).byteLength>maxPayloadBytes)return;let payload;try{payload=JSON.parse(raw)}catch{return}if(typeof payload!="object"||payload===null||Array.isArray(payload)||Object.getPrototypeOf(payload)!==Object.prototype&&Object.getPrototypeOf(payload)!==null)return;const rawType=payload.type;if(typeof rawType!="string")return;const type=rawType.trim();if(!type||type.length>128)return;const contentPoint=this.toContentPoint(e.clientX,e.clientY);this.emit("lr-node-add",Object.freeze({type,position:Object.freeze({x:this.snap(contentPoint.x),y:this.snap(contentPoint.y)})}))},this.onNodePointerMove=e=>{const drag=this.nodeDrag;if(!drag||e.pointerId!==drag.pointerId)return;if(this.readonly||!this.nodesDraggable){this.endNodeDrag(!1);return}const dx=(e.clientX-drag.startClientX)*drag.rtlFlip/this.zoomLevel,dy=(e.clientY-drag.startClientY)/this.zoomLevel,x=this.snap(drag.startX+dx),y=this.snap(drag.startY+dy);drag.wrapper.style.transform=`translate(${x}px, ${y}px)`,this.updateIncidentEdges(drag.nodeId,x,y),drag.currentX=x,drag.currentY=y},this.onNodePointerUp=e=>{const drag=this.nodeDrag;!drag||e.pointerId!==drag.pointerId||this.endNodeDrag(!this.readonly&&e.type==="pointerup")},this.onWorldPointerDown=e=>{if(!this.connectable||this.readonly||this.connectState||this.isFromTopLayerSurface(e,this.viewportEl))return;const path=e.composedPath(),handleEl=path.find(el=>isHtmlElement(el)&&el.dataset.handleKind==="output");if(!handleEl)return;const nodeId=this.nodeIdFromComposedPath(path),handleId=handleEl.dataset.handleId;!nodeId||!handleId||(e.stopPropagation(),this.startConnectGesture(nodeId,handleId,e.clientX,e.clientY))},this.onConnectPointerMove=e=>{if(!this.connectState)return;if(this.readonly||!this.connectable){this.onConnectPointerCancel();return}const targetPt=this.connectContentPoint(e.clientX,e.clientY);this.connectionLineEl?.setAttribute("d",this.edgePathD(this.connectState.startPt,targetPt));const hoveredId=this.nodeIdFromComposedPath(e.composedPath()),invalid=hoveredId!=null&&this.isInvalidConnectTarget(hoveredId);this.connectInvalidNodeId&&this.connectInvalidNodeId!==(invalid?hoveredId:null)&&this.renderedNodeById(this.connectInvalidNodeId)?.removeAttribute("data-connect-invalid"),this.connectInvalidNodeId=invalid?hoveredId:null,invalid&&this.renderedNodeById(hoveredId)?.setAttribute("data-connect-invalid","")},this.onConnectPointerUp=e=>{if(!this.connectState)return;if(this.readonly||!this.connectable){this.onConnectPointerCancel();return}const state2=this.connectState,path=e.composedPath(),targetNodeId=this.nodeIdFromComposedPath(path);if(this.endConnectGesture(),!targetNodeId||this.isInvalidConnectTargetFor(state2,targetNodeId)){this.announcer.announce(this.localize("flowConnectCancelled"));return}const targetHandle=path.find(el=>isHtmlElement(el)&&el.dataset.handleKind==="input")?.dataset.handleId??"in";this.emit("lr-connect",Object.freeze({source:state2.sourceId,target:targetNodeId,sourceHandle:state2.sourceHandle,targetHandle}));const sourceNode=this.nodes.find(node=>node.id===state2.sourceId),targetNode=this.nodes.find(node=>node.id===targetNodeId);this.announcer.announce(this.localize("flowConnectCommitted",void 0,{source:sourceNode?this.nodeAccessibleText(sourceNode):state2.sourceId,target:targetNode?this.nodeAccessibleText(targetNode):targetNodeId}))},this.onConnectPointerCancel=()=>{this.connectState&&(this.endConnectGesture(),this.announcer.announce(this.localize("flowConnectCancelled")))}}static{this.defaultStrings={...super.defaultStrings,flowCanvasLabel:LYRA_DEFAULT_flowCanvasLabel,flowCanvasLayoutLimit:LYRA_DEFAULT_flowCanvasLayoutLimit,flowCanvasSummary:LYRA_DEFAULT_flowCanvasSummary,flowConnectCancelled:LYRA_DEFAULT_flowConnectCancelled,flowConnectCommitted:LYRA_DEFAULT_flowConnectCommitted,flowConnectStarted:LYRA_DEFAULT_flowConnectStarted,flowConnectTarget:LYRA_DEFAULT_flowConnectTarget,flowEdge:LYRA_DEFAULT_flowEdge,flowEdgeList:LYRA_DEFAULT_flowEdgeList,flowEdgeWithLabel:LYRA_DEFAULT_flowEdgeWithLabel,flowItemAnnouncement:LYRA_DEFAULT_flowItemAnnouncement,flowNode:LYRA_DEFAULT_flowNode,flowNodeDeselected:LYRA_DEFAULT_flowNodeDeselected,flowNodeMoved:LYRA_DEFAULT_flowNodeMoved,flowNodeSelected:LYRA_DEFAULT_flowNodeSelected,flowSelectionCleared:LYRA_DEFAULT_flowSelectionCleared,noData:LYRA_DEFAULT_noData}}static{this.styles=[LyraElement.styles,styles,srOnly]}get nodes(){return this._nodes}set nodes(value){if(value===this.nodesSource||value===this._nodes)return;const previous=this._nodes;this.nodesSource=value,this._nodes=snapshotFlowNodes(value),this.rovingCache=void 0,this.requestUpdate("nodes",previous)}get edges(){return this._edges}set edges(value){if(value===this.edgesSource||value===this._edges)return;const previous=this._edges;this.edgesSource=value,this._edges=snapshotFlowEdges(value),this.rovingCache=void 0,this.requestUpdate("edges",previous)}get orientation(){return this._orientation}set orientation(value){const previous=this._orientation,next=value==="vertical"?"vertical":"horizontal";this._orientation=next,this.rovingCache=void 0,(next!==previous||value!==next)&&this.requestUpdate("orientation",previous)}get selectedNodeIds(){return this._selectedNodeIds}set selectedNodeIds(value){if(value===this.selectedNodeIdsSource||value===this._selectedNodeIds)return;const previous=this._selectedNodeIds;this.selectedNodeIdsSource=value,this._requestedSelectedNodeIds=this.sanitizeSelectionCandidates(value),this._selectedNodeIds=this.snapshotSelectedIds(this._requestedSelectedNodeIds,new Set(this.nodes.map(node=>node.id))),this.requestUpdate("selectedNodeIds",previous)}get selectedEdgeIds(){return this._selectedEdgeIds}set selectedEdgeIds(value){if(value===this.selectedEdgeIdsSource||value===this._selectedEdgeIds)return;const previous=this._selectedEdgeIds;this.selectedEdgeIdsSource=value,this._requestedSelectedEdgeIds=this.sanitizeSelectionCandidates(value),this._selectedEdgeIds=this.snapshotSelectedIds(this._requestedSelectedEdgeIds,new Set(this.edges.map(edge=>edge.id))),this.requestUpdate("selectedEdgeIds",previous)}sanitizeSelectionCandidates(value){if(!Array.isArray(value))return Object.freeze([]);const selected=[],seen=new Set;for(const candidate of value.slice(0,MAX_FLOW_COLLECTION_ENTRIES))typeof candidate!="string"||candidate.trim().length===0||seen.has(candidate)||(seen.add(candidate),selected.push(candidate));return Object.freeze(selected)}snapshotSelectedIds(value,validIds){const selected=value.filter(candidate=>validIds.has(candidate));return selected.length===value.length?value:Object.freeze(selected)}get decorations(){return this._decorations}set decorations(value){if(value===this.decorationsSource||value===this._decorations)return;const previous=this._decorations;this.decorationsSource=value,this._decorations=value==null?null:snapshotFlowDecorations(value),this.requestUpdate("decorations",previous)}get safeMinZoom(){return finiteRange(this.minZoom,.25,.001,1e3)}get safeMaxZoom(){return finiteRange(this.maxZoom,2,.001,1e3)}get effectiveZoomBounds(){return{min:Math.min(this.safeMinZoom,this.safeMaxZoom),max:Math.max(this.safeMinZoom,this.safeMaxZoom)}}get safeGrid(){return finiteRange(this.grid,8,0)}get safeLayerGap(){return finiteRange(this.layerGap,64,0)}get safeNodeGap(){return finiteRange(this.nodeGap,24,0)}connectedCallback(){super.connectedCallback(),this.stopMotionWatch=observeReducedMotion(this,()=>this.requestUpdate());const ownerWindow=this.ownerDocument.defaultView;this.connectedWindow=ownerWindow??void 0,ownerWindow&&this.announcer.setTimerHost(ownerWindow);const ResizeObserverCtor=ownerWindow?.ResizeObserver;this.resizeObserver=ResizeObserverCtor?new ResizeObserverCtor(entries=>this.onNodesResized(entries)):void 0,this.bindAuthoredCardObserver(),this.syncAuthoredCards(),this.pushCardPropsAll(),this.scheduleCompanionNotify(),this.hasUpdated&&(this.observeNodeWrappers(),this.nodes.length>0&&this.scheduleLayoutPass())}disconnectedCallback(){super.disconnectedCallback(),this.stopMotionWatch?.(),this.stopMotionWatch=void 0,this.resetAuthoredCardObserver(),this.restoreAuthoredCardSlots(),this.hasConnectedLayoutBaseline=!1,this.layoutLimitAnnouncementPending=!1,this.announcer.cancel(),this.mirrorAnnouncement(""),this.resizeObserver?.disconnect(),this.resizeObserver=void 0,this.observedNodeEls.clear(),this.layoutRaf!=null&&(this.cancelOwnerAnimationFrame(this.layoutRaf),this.layoutRaf=null),this.companionRaf!=null&&(this.cancelOwnerAnimationFrame(this.companionRaf),this.companionRaf=null),this.viewportChangeRaf!=null&&(this.cancelOwnerAnimationFrame(this.viewportChangeRaf),this.viewportChangeRaf=null),this.wheelMeasureRaf!=null&&(this.cancelOwnerAnimationFrame(this.wheelMeasureRaf),this.wheelMeasureRaf=null,this.wheelMeasure=null),this.panDrag=void 0,this.connectedWindow?.removeEventListener("pointermove",this.onBackgroundPointerMove),this.connectedWindow?.removeEventListener("pointerup",this.onBackgroundPointerUp),this.connectedWindow?.removeEventListener("pointercancel",this.onBackgroundPointerUp),this.connectedWindow?.removeEventListener("lostpointercapture",this.onBackgroundPointerUp),this.nodeDrag=void 0,this.dragEdgeRefs=void 0,this.connectedWindow?.removeEventListener("pointermove",this.onNodePointerMove),this.connectedWindow?.removeEventListener("pointerup",this.onNodePointerUp),this.connectedWindow?.removeEventListener("pointercancel",this.onNodePointerUp),this.connectedWindow?.removeEventListener("lostpointercapture",this.onNodePointerUp),this.connectState=void 0,this.connecting=!1,this.connectInvalidNodeId=null,this.keyboardConnectSourceId=null,this.keyboardConnectTargetIndex=0,this.connectedWindow?.removeEventListener("pointermove",this.onConnectPointerMove),this.connectedWindow?.removeEventListener("pointerup",this.onConnectPointerUp),this.connectedWindow?.removeEventListener("pointercancel",this.onConnectPointerCancel),this.connectedWindow?.removeEventListener("lostpointercapture",this.onConnectPointerCancel),this.connectedWindow=void 0}adoptedCallback(){super.adoptedCallback(),this.announcements.adopted(),this.resetAuthoredCardObserver(),this.restoreAuthoredCardSlots(),this.hasConnectedLayoutBaseline=!1,this.layoutLimitAnnouncementPending=!1;const ownerWindow=this.ownerDocument.defaultView;ownerWindow&&this.announcer.setTimerHost(ownerWindow),this.isConnected&&(this.bindAuthoredCardObserver(),this.scheduleAuthoredCardReconciliation(),this.nodes.length>0&&this.scheduleLayoutPass())}requestOwnerAnimationFrame(callback){const owner=this.ownerDocument.defaultView;return owner?{owner,handle:owner.requestAnimationFrame(callback)}:null}cancelOwnerAnimationFrame(frame){frame.owner.cancelAnimationFrame(frame.handle)}mirrorAnnouncement(text){this.renderRoot?.querySelector('[part="live-region"]')?.replaceChildren(text)}resetAuthoredCardObserver(){this.authoredCardObserverGeneration+=1,this.authoredCardObserver?.disconnect(),this.authoredCardObserver=void 0,this.authoredCardObserverDocument=void 0,this.authoredCardSyncQueued=!1}bindAuthoredCardObserver(){const ownerDocument=this.ownerDocument;if(!this.isConnected||this.authoredCardObserver&&this.authoredCardObserverDocument===ownerDocument)return;this.resetAuthoredCardObserver();const MutationObserverCtor=ownerDocument.defaultView?.MutationObserver;if(!MutationObserverCtor)return;const generation=this.authoredCardObserverGeneration,observer=new MutationObserverCtor(records=>{if(this.authoredCardObserver!==observer||this.authoredCardObserverDocument!==ownerDocument||this.authoredCardObserverGeneration!==generation||!this.isConnected||this.ownerDocument!==ownerDocument)return;records.some(record=>record.type==="childList"?record.target===this:record.type==="attributes"&&record.attributeName==="node-id"&&record.target.parentNode===this)&&this.scheduleAuthoredCardReconciliation()});observer.observe(this,{childList:!0,attributes:!0,attributeFilter:["node-id"],subtree:!0}),this.authoredCardObserver=observer,this.authoredCardObserverDocument=ownerDocument}scheduleAuthoredCardReconciliation(){const generation=this.authoredCardObserverGeneration,ownerDocument=this.authoredCardObserverDocument??this.ownerDocument;!this.isConnected||this.authoredCardSyncQueued||(this.authoredCardSyncQueued=!0,queueMicrotask(()=>{this.authoredCardObserverGeneration!==generation||!this.isConnected||this.ownerDocument!==ownerDocument||(this.authoredCardSyncQueued=!1,this.syncAuthoredCards(),this.pushCardPropsAll())}))}observeNodeWrappers(){for(const el of Array.from(this.renderRoot.querySelectorAll('[part="node"]')))this.observedNodeEls.has(el)||(this.observedNodeEls.add(el),this.resizeObserver?.observe(el))}willUpdate(changed){if(super.willUpdate(changed),this.rovingCache=void 0,this.companionStructure=void 0,changed.has("nodes")){this.cancelModelBoundGestures(),this.pruneNodeCaches(),this.syncAuthoredCards();const nodeIds=new Set(this.nodes.map(node=>node.id));this._selectedNodeIds=this.snapshotSelectedIds(this._requestedSelectedNodeIds,nodeIds)}if(changed.has("edges")){this.cancelModelBoundGestures();const edgeIds=new Set(this.edges.map(edge=>edge.id));this._selectedEdgeIds=this.snapshotSelectedIds(this._requestedSelectedEdgeIds,edgeIds)}if((changed.has("readonly")&&this.readonly||changed.has("orientation"))&&this.cancelActiveGestures(),changed.has("nodesDraggable")&&!this.nodesDraggable&&this.endNodeDrag(!1),changed.has("connectable")&&!this.connectable&&(this.onConnectPointerCancel(),this.keyboardConnectSourceId=null,this.keyboardConnectTargetIndex=0),changed.has("droppable")&&!this.droppable&&this.viewportEl?.removeAttribute("data-drop-active"),changed.has("grid")&&this.endNodeDrag(!1),changed.has("nodes")||changed.has("edges")||changed.has("orientation")||changed.has("layerGap")||changed.has("nodeGap"))for(const node of this.nodes)node.position||this.autoPositions.delete(node.id);(changed.has("nodes")||changed.has("selectedNodeIds")||changed.has("decorations")||changed.has("orientation"))&&this.pushCardPropsAll(changed)}pruneNodeCaches(){const nodeIds=new Set(this.nodes.map(node=>node.id));for(const id of this.autoPositions.keys())nodeIds.has(id)||this.autoPositions.delete(id);for(const id of this.measuredSizes.keys())nodeIds.has(id)||this.measuredSizes.delete(id);for(const element of this.observedNodeEls){const id=element.dataset.nodeId;id&&nodeIds.has(id)||(this.resizeObserver?.unobserve(element),this.observedNodeEls.delete(element))}}updated(changed){super.updated(changed),changed.has("edges")&&this.rebuildIncidentEdgesIndex(),changed.has("layoutTruncated")&&this.layoutLimitAnnouncementPending&&(this.layoutLimitAnnouncementPending=!1,this.isConnected&&this.layoutTruncated&&this.announcer.announce(this.localize("flowCanvasLayoutLimit"))),this.observeNodeWrappers(),(changed.has("nodes")||changed.has("edges")||changed.has("orientation")||changed.has("layerGap")||changed.has("nodeGap"))&&this.scheduleLayoutPass(),(changed.has("nodes")||changed.has("edges")||changed.has("decorations")||changed.has("minZoom")||changed.has("maxZoom")||changed.has("readonly")||changed.has("orientation")||changed.has("layerGap")||changed.has("nodeGap"))&&this.scheduleCompanionNotify();const viewportEl=this.renderRoot.querySelector('[part="viewport"]');viewportEl&&viewportEl!==this.viewportEl&&(this.viewportEl=viewportEl,this.worldEl=this.renderRoot.querySelector(".world"),viewportEl.addEventListener("wheel",this.onWheel,{passive:!1}),viewportEl.addEventListener("keydown",this.onViewportKeyDown),viewportEl.addEventListener("dragover",this.onViewportDragOver),viewportEl.addEventListener("dragleave",this.onViewportDragLeave),viewportEl.addEventListener("drop",this.onViewportDrop),this.applyWorldTransform())}syncAuthoredCards(){const ids=new Set(this.nodes.map(node=>node.id)),adopted=new Set;for(const child of Array.from(this.children)){const nodeId=child.getAttribute("node-id");if(nodeId&&ids.has(nodeId)){this.leaseAuthoredCardSlot(child,nodeId),adopted.add(child);continue}this.releaseAuthoredCardSlot(child),nodeId&&devWarnOnce(UNMATCHED_AUTHORED_CARD_WARNING,"<lr-flow-canvas> has a direct child with a node-id that matches no node; it will not render.")}for(const child of[...this.authoredCardSlotLeases.keys()])adopted.has(child)||this.releaseAuthoredCardSlot(child)}leaseAuthoredCardSlot(child,nodeId){let lease=this.authoredCardSlotLeases.get(child);if(!lease){const slot2=child.getAttribute("slot");lease={authoredSlot:slot2,appliedSlot:slot2,authorOwnsSlot:!1},this.authoredCardSlotLeases.set(child,lease)}if(lease.authorOwnsSlot||child.getAttribute("slot")!==lease.appliedSlot){lease.authorOwnsSlot=!0;return}const slot=`node-${nodeId}`;child.getAttribute("slot")!==slot&&child.setAttribute("slot",slot),lease.appliedSlot=child.getAttribute("slot")}releaseAuthoredCardSlot(child){const lease=this.authoredCardSlotLeases.get(child);lease&&(!lease.authorOwnsSlot&&child.getAttribute("slot")===lease.appliedSlot&&(lease.authoredSlot===null?child.removeAttribute("slot"):child.setAttribute("slot",lease.authoredSlot)),this.authoredCardSlotLeases.delete(child))}restoreAuthoredCardSlots(){for(const child of[...this.authoredCardSlotLeases.keys()])this.releaseAuthoredCardSlot(child)}pushCardPropsAll(changed){const nodesChanged=changed?.has("nodes")??!0,selectionChanged=nodesChanged||changed?.has("selectedNodeIds")===!0,decorationsChanged=nodesChanged||changed?.has("decorations")===!0,orientationChanged=nodesChanged||changed?.has("orientation")===!0,cardsByNodeId=new Map;for(const child of Array.from(this.children)){const nodeId=child.getAttribute("node-id");nodeId&&this.authoredCardSlotLeases.has(child)&&cardsByNodeId.set(nodeId,child)}const selectedNodeIds=selectionChanged?new Set(this.selectedNodeIds):null;for(const node of this.nodes){const card=cardsByNodeId.get(node.id);if(card&&(nodesChanged&&(this.setCardProperty(card,"inputs",node.inputs??DEFAULT_FLOW_INPUTS),this.setCardProperty(card,"outputs",node.outputs??DEFAULT_FLOW_OUTPUTS),this.setCardProperty(card,"flowType",node.type??"")),orientationChanged&&this.setCardProperty(card,"orientation",this.orientation),selectedNodeIds&&this.setCardProperty(card,"selected",selectedNodeIds.has(node.id)),decorationsChanged)){const decoration=this.decorations?.[node.id];this.setCardProperty(card,"status",decoration?.status??null),this.setCardProperty(card,"progress",decoration?.progress??null),this.setCardProperty(card,"statusDetail",decoration?.detail??""),this.setCardProperty(card,"durationMs",decoration?.durationMs??null)}}}setCardProperty(card,property2,value){try{card[property2]=value}catch{}}nodePosition(node){const position=node.position??this.autoPositions.get(node.id)??{x:0,y:0};return{x:finiteNumber(position.x,0),y:finiteNumber(position.y,0)}}nodeSize(id){const measured=this.measuredSizes.get(id);if(measured)return measured;const ownerWindow=this.ownerDocument?.defaultView,host=this.renderedNodeById(id)??this,computed=ownerWindow?.getComputedStyle(host),customWidth=resolveCssTokenLength(computed?.getPropertyValue("--lr-flow-canvas-node-fallback-inline-size").trim(),{host}),customHeight=resolveCssTokenLength(computed?.getPropertyValue("--lr-flow-canvas-node-fallback-block-size").trim(),{host}),width=customWidth??(resolveCssTokenLength(computed?.getPropertyValue("--lr-size-10rem").trim()||"10rem",{host})??0)+(resolveCssTokenLength(computed?.getPropertyValue("--lr-size-1rem").trim()||"1rem",{host})??0),height=customHeight??resolveCssTokenLength(computed?.getPropertyValue("--lr-size-4rem").trim()||"4rem",{host})??0;return{width,height}}resolvedNode(node){const pos=this.nodePosition(node),size=this.nodeSize(node.id);return{node,x:pos.x,y:pos.y,width:size.width,height:size.height}}handleOffset(count,index,span){return count<=1?span/2:span*(index+.5)/count}handlePoint(resolved,kind,handleId){const handles=kind==="input"?resolved.node.inputs??DEFAULT_FLOW_INPUTS:resolved.node.outputs??DEFAULT_FLOW_OUTPUTS,index=handles.findIndex(h=>h.id===handleId),horizontal=this.orientation==="horizontal",edgeSpan=horizontal?resolved.height:resolved.width,offset=index>=0?this.handleOffset(handles.length,index,edgeSpan):edgeSpan/2;if(horizontal)return{x:kind==="input"?resolved.x:resolved.x+resolved.width,y:resolved.y+offset};const y=kind==="input"?resolved.y:resolved.y+resolved.height;return{x:resolved.x+offset,y}}edgePathD(sourcePt,targetPt){const dx=targetPt.x-sourcePt.x,dy=targetPt.y-sourcePt.y,distance=Math.hypot(dx,dy),offset=Math.min(CONNECT_OFFSET_MAX,Math.max(CONNECT_OFFSET_MIN,distance/2)),horizontal=this.orientation==="horizontal",c1x=sourcePt.x+(horizontal?offset:0),c1y=sourcePt.y+(horizontal?0:offset),c2x=targetPt.x-(horizontal?offset:0),c2y=targetPt.y-(horizontal?0:offset);return`M ${sourcePt.x} ${sourcePt.y} C ${c1x} ${c1y}, ${c2x} ${c2y}, ${targetPt.x} ${targetPt.y}`}nodeAccessibleText(node){if(node.accessibleLabel)return node.accessibleLabel;const label=typeof node.data?.label=="string"?node.data.label:node.id;return this.localize("flowNode",void 0,{label})}edgeAccessibleText(edge){const sourceNode=nodeById(this.nodes,edge.source),targetNode=nodeById(this.nodes,edge.target),source=sourceNode?this.nodeAccessibleText(sourceNode):edge.source,target=targetNode?this.nodeAccessibleText(targetNode):edge.target;return edge.label?this.localize("flowEdgeWithLabel",void 0,{label:edge.label,source,target}):this.localize("flowEdge",void 0,{source,target})}onNodesResized(entries){let changedAny=!1;for(const entry of entries){const id=entry.target.dataset.nodeId;if(!id)continue;const box=entry.borderBoxSize?.[0],width=box?box.inlineSize:entry.contentRect.width,height=box?box.blockSize:entry.contentRect.height,prev=this.measuredSizes.get(id);(!prev||prev.width!==width||prev.height!==height)&&(this.measuredSizes.set(id,{width,height}),changedAny=!0)}changedAny&&(this.scheduleLayoutPass(),this.scheduleCompanionNotify())}measureNodeWrappers(){for(const wrapper of Array.from(this.renderRoot.querySelectorAll('[part="node"]'))){const id=wrapper.dataset.nodeId;if(!id)continue;const rect=wrapper.getBoundingClientRect(),width=wrapper.offsetWidth||rect.width/Math.max(this.zoomLevel,Number.EPSILON),height=wrapper.offsetHeight||rect.height/Math.max(this.zoomLevel,Number.EPSILON);Number.isFinite(width)&&Number.isFinite(height)&&width>0&&height>0&&this.measuredSizes.set(id,{width,height})}}scheduleLayoutPass(){!this.isConnected||this.layoutRaf!=null||(this.layoutRaf=this.requestOwnerAnimationFrame(()=>{this.layoutRaf=null,this.isConnected&&(this.measureNodeWrappers(),this.runAutoLayoutIfNeeded(),this.requestUpdate(),this.hasFitOnce||(this.hasFitOnce=this.applyFit()))}))}setLayoutTruncated(truncated){const previous=this.layoutTruncated;if(this.layoutTruncated=truncated,truncated||(this.layoutLimitAnnouncementPending=!1),!(!this.isConnected||this.nodes.length===0)){if(!this.hasConnectedLayoutBaseline){this.hasConnectedLayoutBaseline=!0;return}!previous&&truncated&&(this.layoutLimitAnnouncementPending=!0)}}runAutoLayoutIfNeeded(){const unpositioned=this.nodes.filter(n=>!n.position);if(unpositioned.length===0){this.setLayoutTruncated(!1);return}const swap=this.orientation==="horizontal",graphNodes=this.nodes.map(n=>{const size=this.nodeSize(n.id);return{id:n.id,width:swap?size.height:size.width,height:swap?size.width:size.height}}),nodeIds=new Set(this.nodes.map(n=>n.id)),graphEdges=this.edges.filter(e=>nodeIds.has(e.source)&&nodeIds.has(e.target)).map(e=>({source:e.source,target:e.target})),fixedPositions=new Map;for(const n of this.nodes){if(!n.position||n.position.x<0||n.position.y<0)continue;const size=this.nodeSize(n.id),center={x:n.position.x+size.width/2,y:n.position.y+size.height/2};!Number.isSafeInteger(Math.trunc(center.x))||!Number.isSafeInteger(Math.trunc(center.y))||fixedPositions.set(n.id,swap?{x:center.y,y:center.x}:center)}const result=layeredLayout({nodes:graphNodes,edges:graphEdges,options:{gapX:this.safeNodeGap,gapY:this.safeLayerGap,fixedPositions}}),positions={};for(const n of unpositioned){const raw=result.positions.get(n.id);if(!raw)continue;const center=swap?{x:raw.y,y:raw.x}:{x:raw.x,y:raw.y},size=this.nodeSize(n.id),resolved={x:center.x-size.width/2,y:center.y-size.height/2};this.autoPositions.set(n.id,resolved),positions[n.id]=Object.freeze(resolved)}this.rovingCache=void 0,this.setLayoutTruncated(result.truncated),Object.keys(positions).length>0&&this.emit("lr-layout-change",Object.freeze({positions:Object.freeze(positions),truncated:result.truncated}))}get viewport(){return Object.freeze({x:this.panX,y:this.panY,zoom:this.zoomLevel})}set viewport(_value){}setViewport(next){this.readonly||(this.panX=finiteNumber(next.x,this.panX),this.panY=finiteNumber(next.y,this.panY),this.zoomLevel=this.clampZoom(next.zoom),this.applyWorldTransform(),this.emit("lr-viewport-change",Object.freeze({x:this.panX,y:this.panY,zoom:this.zoomLevel})))}zoomIn(){this.readonly||this.zoomAtCenter(this.zoomLevel*ZOOM_MULTIPLIER)}zoomOut(){this.readonly||this.zoomAtCenter(this.zoomLevel/ZOOM_MULTIPLIER)}resetZoom(){this.readonly||this.setViewport({x:this.panX,y:this.panY,zoom:1})}fit(options){this.readonly||this.applyFit(options?.padding)}applyFit(requestedPadding=DEFAULT_FIT_PADDING){const rect=this.viewportEl?.getBoundingClientRect();if(this.nodes.length===0||!rect?.width||!rect.height)return!1;const padding=finiteRange(requestedPadding,DEFAULT_FIT_PADDING,0);let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0;for(const node of this.nodes){const resolved=this.resolvedNode(node);minX=Math.min(minX,resolved.x),minY=Math.min(minY,resolved.y),maxX=Math.max(maxX,resolved.x+resolved.width),maxY=Math.max(maxY,resolved.y+resolved.height)}const viewW=rect.width,viewH=rect.height,transform=fitTransform({minX,minY,maxX,maxY},{width:viewW,height:viewH},padding,this.effectiveZoomBounds,{minimumAvailableSize:0,invalidZoomFallback:1,centerWithMinimumExtent:!0});return this.panX=transform.x,this.panY=transform.y,this.zoomLevel=transform.zoom,this.applyWorldTransform(),this.scheduleViewportChange(),!0}focusNode(id,options){if(this.readonly)return;const node=this.nodes.find(n=>n.id===id);if(!node)return;const resolved=this.resolvedNode(node),rect=this.viewportEl?.getBoundingClientRect(),viewW=rect?.width??0,viewH=rect?.height??0,zoom=options?.zoom!=null?this.clampZoom(options.zoom):this.zoomLevel;this.panX=viewW/2-(resolved.x+resolved.width/2)*zoom,this.panY=viewH/2-(resolved.y+resolved.height/2)*zoom,this.zoomLevel=zoom,this.applyWorldTransform(),this.scheduleViewportChange(),this.focusActiveItem(this.spatialItemIndex("node",id))}toContentPoint(clientX,clientY){const rect=this.viewportEl?.getBoundingClientRect();if(!rect)return{x:0,y:0};const localX=this.localWorldX(clientX,rect),localY=clientY-rect.top;return{x:(localX-this.panX)/this.zoomLevel,y:(localY-this.panY)/this.zoomLevel}}registerCompanion(cb){return this.companionCallbacks.add(cb),this.scheduleCompanionNotify(),()=>{this.companionCallbacks.delete(cb)}}scheduleCompanionNotify(structural=!0){if(structural&&(this.companionStructure=void 0),!this.isConnected||this.companionRaf!=null||this.companionCallbacks.size===0)return;const request=this.requestOwnerAnimationFrame(()=>{if(this.companionRaf===request&&(this.companionRaf=null,!(!this.isConnected||this.ownerDocument.defaultView!==request?.owner)))for(const cb of this.companionCallbacks)cb(this.buildSnapshot())});this.companionRaf=request}buildSnapshot(){const rect=this.viewportEl?.getBoundingClientRect(),bounds=this.effectiveZoomBounds;return this.companionStructure??={nodes:Object.freeze(this.nodes.map(n=>{const resolved=this.resolvedNode(n);return Object.freeze({id:n.id,x:resolved.x,y:resolved.y,width:resolved.width,height:resolved.height,status:this.decorations?.[n.id]?.status})})),edges:Object.freeze(this.edges.map(e=>Object.freeze({id:e.id,source:e.source,target:e.target,status:this.decorations?.[e.id]?.status})))},Object.freeze({...this.companionStructure,viewport:Object.freeze({x:this.panX,y:this.panY,zoom:this.zoomLevel,width:rect?.width??0,height:rect?.height??0,minZoom:bounds.min,maxZoom:bounds.max}),locked:this.readonly,orientation:this.orientation,layerGap:this.safeLayerGap,nodeGap:this.safeNodeGap})}clampZoom(z){const{min,max}=this.effectiveZoomBounds;return finiteRange(z,1,min,max)}applyWorldTransform(){this.worldEl&&(this.worldEl.style.transform=`translate(${this.panX}px, ${this.panY}px) scale(${this.zoomLevel})`),this.scheduleCompanionNotify(!1)}scheduleViewportChange(){this.viewportChangeRaf==null&&(this.viewportChangeRaf=this.requestOwnerAnimationFrame(()=>{this.viewportChangeRaf=null,this.emit("lr-viewport-change",Object.freeze({x:this.panX,y:this.panY,zoom:this.zoomLevel}))}))}zoomAtCenter(nextZoom){const rect=this.viewportEl?.getBoundingClientRect();this.zoomAtPoint(rect?rect.width/2:0,rect?rect.height/2:0,nextZoom)}zoomAtPoint(localX,localY,nextZoom){const clamped=this.clampZoom(nextZoom);if(clamped===this.zoomLevel)return;const contentX=(localX-this.panX)/this.zoomLevel,contentY=(localY-this.panY)/this.zoomLevel;this.panX=localX-contentX*clamped,this.panY=localY-contentY*clamped,this.zoomLevel=clamped,this.applyWorldTransform(),this.scheduleViewportChange()}localWorldX(clientX,rect,rtl=isRtl(this)){const local=clientX-rect.left;return this.orientation==="horizontal"&&rtl?rect.width-local:local}isFromTopLayerSurface(e,boundary){for(const entry of e.composedPath()){if(entry===boundary)return!1;if(entry instanceof Element&&(entry.hasAttribute("data-lr-top-layer")||isNativeTopLayerElement(entry)))return!0}return!1}endBackgroundPan(rollback){const drag=this.panDrag;drag&&(this.panDrag=void 0,this.viewportEl?.removeAttribute("data-panning"),this.connectedWindow?.removeEventListener("pointermove",this.onBackgroundPointerMove),this.connectedWindow?.removeEventListener("pointerup",this.onBackgroundPointerUp),this.connectedWindow?.removeEventListener("pointercancel",this.onBackgroundPointerUp),this.connectedWindow?.removeEventListener("lostpointercapture",this.onBackgroundPointerUp),rollback&&(this.panX!==drag.startPanX||this.panY!==drag.startPanY)&&(this.panX=drag.startPanX,this.panY=drag.startPanY,this.applyWorldTransform(),this.scheduleViewportChange()))}panBy(dx,dy){this.panX+=dx,this.panY+=dy,this.applyWorldTransform(),this.scheduleViewportChange()}focusableEdges(){const nodeIds=new Set(this.nodes.map(n=>n.id));return this.edges.filter(e=>nodeIds.has(e.source)&&nodeIds.has(e.target))}rovingItems(){if(this.rovingCache)return this.rovingCache;const horizontal=this.orientation==="horizontal",keyed=this.nodes.map(node=>{const{x,y}=this.nodePosition(node);return{node,main:horizontal?x:y,cross:horizontal?y:x}});return keyed.sort((a,b)=>a.main-b.main||a.cross-b.cross),this.rovingCache=[...keyed.map(({node})=>({kind:"node",id:node.id,disabled:node.disabled===!0})),...this.focusableEdges().map(e=>({kind:"edge",id:e.id}))]}itemCount(){return this.rovingItems().length}isRovingItemDisabled(item){return item.disabled===!0}normalizedItemIndex(index=this.activeItemIndex){const items=this.rovingItems(),count=items.length;if(!count)return-1;const clamped=Math.min(Math.max(index,0),count-1);if(!this.isRovingItemDisabled(items[clamped]))return clamped;for(let forward=clamped+1;forward<count;forward+=1)if(!this.isRovingItemDisabled(items[forward]))return forward;for(let backward=clamped-1;backward>=0;backward-=1)if(!this.isRovingItemDisabled(items[backward]))return backward;return-1}nextEnabledItemIndex(from,direction){const items=this.rovingItems(),count=items.length;if(!count)return-1;let index=Math.min(Math.max(from+direction,0),count-1);for(let steps=0;steps<count;steps+=1){if(!this.isRovingItemDisabled(items[index]))return index;if(index+=direction,index<0||index>=count)break}return from>=0&&from<count&&!this.isRovingItemDisabled(items[from])?from:-1}firstEnabledItemIndex(){return this.rovingItems().findIndex(item=>!this.isRovingItemDisabled(item))}lastEnabledItemIndex(){const items=this.rovingItems();for(let index=items.length-1;index>=0;index-=1)if(!this.isRovingItemDisabled(items[index]))return index;return-1}itemAccessibleText(item){if(item.kind==="node"){const node=this.nodes.find(n=>n.id===item.id);return node?this.nodeAccessibleText(node):""}const edge=this.edges.find(e=>e.id===item.id);return edge?this.edgeAccessibleText(edge):""}spatialItemIndex(kind,id){return this.rovingItems().findIndex(it=>it.kind===kind&&it.id===id)}announceItem(index){const item=this.rovingItems()[index];item&&this.announcer.announce(this.localize("flowItemAnnouncement",void 0,{item:this.itemAccessibleText(item),index:this.formatNumber(index+1),total:this.formatNumber(this.itemCount())}))}formatNumber(value){return getNumberFormat(this.effectiveLocale).format(value)}onItemFocus(index){this.normalizedItemIndex(index)<0||(this.activeItemIndex=index,this.announceItem(index))}renderedElementByDataId(attribute,id){const renderRoot=this.renderRoot;if(!renderRoot)return null;const ownerCss=this.ownerDocument?.defaultView?.CSS,escape=ownerCss?.escape;if(typeof escape=="function")try{const match=renderRoot.querySelector(`[${attribute}="${escape.call(ownerCss,id)}"]`);if(match)return match}catch{}return[...renderRoot.querySelectorAll(`[${attribute}]`)].find(candidate=>candidate.getAttribute(attribute)===id)??null}renderedNodeById(id){return this.renderedElementByDataId("data-node-id",id)}renderedEdgeById(id){return this.renderedElementByDataId("data-edge-id",id)}focusActiveItem(index=this.activeItemIndex){const normalized=this.normalizedItemIndex(index);if(normalized<0)return;this.activeItemIndex=normalized,this.announceItem(normalized);const item=this.rovingItems()[normalized];item&&this.updateComplete.then(()=>{(item.kind==="node"?this.renderedNodeById(item.id)?.querySelector('[part="node-control"]'):this.renderedEdgeById(item.id)?.querySelector('[part="edge"]'))?.focus()})}applySelection(kind,id,additive){kind==="node"?(this.selectedNodeIds=additive?toggledSelection(this.selectedNodeIds,id):[id],additive||(this.selectedEdgeIds=[])):(this.selectedEdgeIds=additive?toggledSelection(this.selectedEdgeIds,id):[id],additive||(this.selectedNodeIds=[])),this.emit("lr-selection-change",Object.freeze({selectedNodeIds:Object.freeze([...this.selectedNodeIds]),selectedEdgeIds:Object.freeze([...this.selectedEdgeIds])}));const selected=kind==="node"?this.selectedNodeIds.includes(id):this.selectedEdgeIds.includes(id),label=this.itemAccessibleText({kind,id});this.announcer.announce(this.localize(selected?"flowNodeSelected":"flowNodeDeselected",void 0,{label}))}clearSelection(){this.selectedNodeIds.length===0&&this.selectedEdgeIds.length===0||(this.selectedNodeIds=[],this.selectedEdgeIds=[],this.emit("lr-selection-change",Object.freeze({selectedNodeIds:Object.freeze([]),selectedEdgeIds:Object.freeze([])})),this.announcer.announce(this.localize("flowSelectionCleared")))}deleteSelection(){!this.nodesDraggable&&!this.connectable&&!this.droppable||this.selectedNodeIds.length===0&&this.selectedEdgeIds.length===0||this.emit("lr-selection-delete",Object.freeze({nodeIds:Object.freeze([...this.selectedNodeIds]),edgeIds:Object.freeze([...this.selectedEdgeIds])}))}onNodeActivate(node,additive){node.disabled||(this.emit("lr-node-activate",Object.freeze({nodeId:node.id})),this.applySelection("node",node.id,additive))}startedOnAction(event,boundary){for(const entry of event.composedPath()){if(entry===boundary)return!1;if(entry.nodeType===1&&isActionableElement(entry))return!0}return!1}onNodeClick(event,node){if(this.startedOnAction(event,event.currentTarget)){event.stopPropagation();return}this.onNodeActivate(node,event.ctrlKey||event.metaKey)}onEdgeActivate(edge,additive){this.emit("lr-edge-activate",Object.freeze({edgeId:edge.id,sourceNodeId:edge.source,targetNodeId:edge.target,source:edge.source,target:edge.target})),this.applySelection("edge",edge.id,additive)}onItemKeyDown(e,index,activate){const arrowKeys=["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"];if(this.nodesDraggable&&!this.readonly&&(e.ctrlKey||e.metaKey)&&arrowKeys.includes(e.key)){const item=this.rovingItems()[index];if(item?.kind==="node"){e.preventDefault(),this.nudgeNode(item.id,e.key);return}}if(this.keyboardConnectSourceId){if(e.key==="Escape"){e.preventDefault(),this.cancelKeyboardConnect();return}if(e.key==="Enter"){e.preventDefault(),this.commitKeyboardConnect();return}const rtlForConnect=isRtl(this),forwardConnectKey=rtlForConnect?"ArrowLeft":"ArrowRight",backwardConnectKey=rtlForConnect?"ArrowRight":"ArrowLeft";if(e.key===forwardConnectKey||e.key==="ArrowDown"){e.preventDefault(),this.cycleKeyboardConnectTarget(1);return}if(e.key===backwardConnectKey||e.key==="ArrowUp"){e.preventDefault(),this.cycleKeyboardConnectTarget(-1);return}return}if(this.connectable&&!this.readonly&&e.key==="c"&&e.target===e.currentTarget){const item=this.rovingItems()[index];if(item?.kind==="node"){e.preventDefault(),this.startKeyboardConnect(item.id);return}}if(e.key==="Enter"||e.key===" "){e.preventDefault(),this.setActiveItemQuiet(index),activate(e.ctrlKey||e.metaKey);return}if(e.key==="Escape"){e.preventDefault(),e.target!==e.currentTarget?e.currentTarget.focus():this.clearSelection();return}if((e.key==="Delete"||e.key==="Backspace")&&e.target===e.currentTarget){e.preventDefault(),this.deleteSelection();return}if(!this.itemCount())return;const rtl=isRtl(this),forwardKey=rtl?"ArrowLeft":"ArrowRight",backwardKey=rtl?"ArrowRight":"ArrowLeft";let next;if(e.key===forwardKey||e.key==="ArrowDown")next=this.nextEnabledItemIndex(index,1);else if(e.key===backwardKey||e.key==="ArrowUp")next=this.nextEnabledItemIndex(index,-1);else if(e.key==="Home")next=this.firstEnabledItemIndex();else if(e.key==="End")next=this.lastEnabledItemIndex();else return;e.preventDefault(),next>=0&&this.focusActiveItem(next)}setActiveItemQuiet(index){const normalized=this.normalizedItemIndex(index);normalized>=0&&(this.activeItemIndex=normalized)}itemIndexMaps(){const items=this.rovingItems(),nodeIndex=new Map,edgeIndex=new Map;return items.forEach((item,i)=>{item.kind==="node"?nodeIndex.set(item.id,i):edgeIndex.set(item.id,i-nodeIndex.size)}),{nodeIndex,edgeIndex}}snap(value){const grid=this.safeGrid;return grid>0?Math.round(value/grid)*grid:value}rebuildIncidentEdgesIndex(){const map=new Map;for(const edge of this.edges)(map.get(edge.source)??map.set(edge.source,[]).get(edge.source)).push(edge.id),edge.target!==edge.source&&(map.get(edge.target)??map.set(edge.target,[]).get(edge.target)).push(edge.id);this.nodeIncidentEdges=map}buildDragEdgeRefs(nodeId){const refs=[];for(const edgeId of this.nodeIncidentEdges.get(nodeId)??[]){const edge=this.edges.find(e=>e.id===edgeId),sourceNode=edge&&this.nodes.find(n=>n.id===edge.source),targetNode=edge&&this.nodes.find(n=>n.id===edge.target);if(!edge||!sourceNode||!targetNode)continue;const group=this.renderedEdgeById(edgeId);refs.push({edge,sourceNode,targetNode,pathEl:group?.querySelector('[part="edge"]')??null,labelEl:group?.querySelector('[part="edge-label"]')??null})}return refs}updateIncidentEdges(nodeId,x,y){for(const{edge,sourceNode,targetNode,pathEl,labelEl}of this.dragEdgeRefs??[]){const sourceResolved=edge.source===nodeId?{...this.resolvedNode(sourceNode),x,y}:this.resolvedNode(sourceNode),targetResolved=edge.target===nodeId?{...this.resolvedNode(targetNode),x,y}:this.resolvedNode(targetNode),sourcePt=this.handlePoint(sourceResolved,"output",edge.sourceHandle??"out"),targetPt=this.handlePoint(targetResolved,"input",edge.targetHandle??"in");if(pathEl?.setAttribute("d",this.edgePathD(sourcePt,targetPt)),labelEl){const midX=(sourcePt.x+targetPt.x)/2;labelEl.setAttribute("x",String(midX)),labelEl.setAttribute("y",String((sourcePt.y+targetPt.y)/2)),this.orientation==="horizontal"&&isRtl(this)?labelEl.setAttribute("transform",`translate(${2*midX} 0) scale(-1 1)`):labelEl.removeAttribute("transform")}}}onNodePointerDown(e,node){if(!this.nodesDraggable||this.readonly||node.disabled)return;const wrapper=e.currentTarget;if(this.isFromTopLayerSurface(e,wrapper)||this.startedOnAction(e,wrapper))return;e.stopPropagation();const start=this.nodePosition(node);this.nodeDrag={pointerId:e.pointerId,nodeId:node.id,startClientX:e.clientX,startClientY:e.clientY,startX:start.x,startY:start.y,wrapper,rtlFlip:this.orientation==="horizontal"&&isRtl(this)?-1:1},this.dragEdgeRefs=this.buildDragEdgeRefs(node.id),wrapper.setPointerCapture?.(e.pointerId),this.connectedWindow?.addEventListener("pointermove",this.onNodePointerMove),this.connectedWindow?.addEventListener("pointerup",this.onNodePointerUp),this.connectedWindow?.addEventListener("pointercancel",this.onNodePointerUp),this.connectedWindow?.addEventListener("lostpointercapture",this.onNodePointerUp)}endNodeDrag(commit){const drag=this.nodeDrag;if(!drag)return;this.nodeDrag=void 0,this.connectedWindow?.removeEventListener("pointermove",this.onNodePointerMove),this.connectedWindow?.removeEventListener("pointerup",this.onNodePointerUp),this.connectedWindow?.removeEventListener("pointercancel",this.onNodePointerUp),this.connectedWindow?.removeEventListener("lostpointercapture",this.onNodePointerUp);const previous={x:drag.startX,y:drag.startY},position={x:drag.currentX??drag.startX,y:drag.currentY??drag.startY};commit&&this.nodesDraggable&&this.nodes.some(node=>node.id===drag.nodeId)&&(position.x!==previous.x||position.y!==previous.y)&&this.emit("lr-node-move",Object.freeze({nodeId:drag.nodeId,position:Object.freeze(position),previous:Object.freeze(previous)}));const resetNode=this.nodes.find(n=>n.id===drag.nodeId),resetPos=resetNode?this.nodePosition(resetNode):previous;drag.wrapper.style.transform=`translate(${resetPos.x}px, ${resetPos.y}px)`,this.updateIncidentEdges(drag.nodeId,resetPos.x,resetPos.y),this.dragEdgeRefs=void 0,this.requestUpdate()}nudgeNode(nodeId,key){const node=this.nodes.find(n=>n.id===nodeId);if(!node)return;const current=this.nodePosition(node),step=this.safeGrid>0?this.safeGrid:1,rtlFlip=this.orientation==="horizontal"&&isRtl(this)?-1:1;let dx=0,dy=0;key==="ArrowRight"?dx=step*rtlFlip:key==="ArrowLeft"?dx=-step*rtlFlip:key==="ArrowDown"?dy=step:key==="ArrowUp"&&(dy=-step);const position={x:current.x+dx,y:current.y+dy};this.emit("lr-node-move",Object.freeze({nodeId,position:Object.freeze(position),previous:Object.freeze(current)})),this.announcer.announce(this.localize("flowNodeMoved",void 0,{label:this.nodeAccessibleText(node),x:this.formatNumber(position.x),y:this.formatNumber(position.y)})),this.requestUpdate()}nodeIdFromComposedPath(path){for(const el of path)if(isHtmlElement(el)&&el.getAttribute("part")==="node"&&el.dataset.nodeId)return el.dataset.nodeId;return null}isInvalidConnectTarget(hoveredId){return this.connectState?hoveredId===this.connectState.sourceId||this.nodes.find(n=>n.id===hoveredId)?.disabled?!0:this.edges.some(e=>e.source===this.connectState.sourceId&&e.target===hoveredId):!1}startConnectGesture(nodeId,handleId,clientX,clientY){const sourceNode=this.nodes.find(n=>n.id===nodeId);if(!sourceNode||sourceNode.disabled)return;const startPt=this.handlePoint(this.resolvedNode(sourceNode),"output",handleId);this.connectState={sourceId:nodeId,sourceHandle:handleId,startPt,rect:this.viewportEl?.getBoundingClientRect()??null,rtl:isRtl(this)},this.connecting=!0,this.announcer.announce(this.localize("flowConnectStarted",void 0,{label:this.nodeAccessibleText(sourceNode)})),this.updateComplete.then(()=>{this.connectionLineEl=this.renderRoot.querySelector('[part="connection-line"]')??void 0,this.connectionLineEl?.setAttribute("d",this.edgePathD(startPt,this.connectContentPoint(clientX,clientY)))}),this.connectedWindow?.addEventListener("pointermove",this.onConnectPointerMove),this.connectedWindow?.addEventListener("pointerup",this.onConnectPointerUp),this.connectedWindow?.addEventListener("pointercancel",this.onConnectPointerCancel),this.connectedWindow?.addEventListener("lostpointercapture",this.onConnectPointerCancel)}connectContentPoint(clientX,clientY){const state2=this.connectState;if(!state2?.rect)return{x:0,y:0};const localX=this.localWorldX(clientX,state2.rect,state2.rtl),localY=clientY-state2.rect.top;return{x:(localX-this.panX)/this.zoomLevel,y:(localY-this.panY)/this.zoomLevel}}isInvalidConnectTargetFor(state2,hoveredId){return hoveredId===state2.sourceId||this.nodes.find(n=>n.id===hoveredId)?.disabled?!0:this.edges.some(e=>e.source===state2.sourceId&&e.target===hoveredId)}endConnectGesture(){this.connectInvalidNodeId&&(this.renderedNodeById(this.connectInvalidNodeId)?.removeAttribute("data-connect-invalid"),this.connectInvalidNodeId=null),this.connectState=void 0,this.connecting=!1,this.connectedWindow?.removeEventListener("pointermove",this.onConnectPointerMove),this.connectedWindow?.removeEventListener("pointerup",this.onConnectPointerUp),this.connectedWindow?.removeEventListener("pointercancel",this.onConnectPointerCancel),this.connectedWindow?.removeEventListener("lostpointercapture",this.onConnectPointerCancel)}cancelActiveGestures(){this.endBackgroundPan(!0),this.cancelModelBoundGestures(),this.viewportEl?.removeAttribute("data-drop-active")}cancelModelBoundGestures(){this.endNodeDrag(!1),this.onConnectPointerCancel(),this.keyboardConnectSourceId=null,this.keyboardConnectTargetIndex=0}eligibleConnectTargets(sourceId){const linked=new Set(this.edges.filter(e=>e.source===sourceId).map(e=>e.target));return this.nodes.filter(n=>n.id!==sourceId&&!n.disabled&&!linked.has(n.id))}startKeyboardConnect(sourceId){const sourceNode=this.nodes.find(n=>n.id===sourceId);!sourceNode||sourceNode.disabled||this.eligibleConnectTargets(sourceId).length===0||(this.keyboardConnectSourceId=sourceId,this.keyboardConnectTargetIndex=0,sourceNode&&this.announceKeyboardConnectTarget())}cycleKeyboardConnectTarget(direction){if(!this.keyboardConnectSourceId)return;const targets=this.eligibleConnectTargets(this.keyboardConnectSourceId);targets.length!==0&&(this.keyboardConnectTargetIndex=(this.keyboardConnectTargetIndex+direction+targets.length)%targets.length,this.announceKeyboardConnectTarget())}announceKeyboardConnectTarget(){const sourceId=this.keyboardConnectSourceId;if(!sourceId)return;const source=this.nodes.find(node=>node.id===sourceId),targets=this.eligibleConnectTargets(sourceId),target=targets[this.keyboardConnectTargetIndex];!source||!target||this.announcer.announce(this.localize("flowConnectTarget",void 0,{source:this.nodeAccessibleText(source),target:this.nodeAccessibleText(target),index:this.formatNumber(this.keyboardConnectTargetIndex+1),total:this.formatNumber(targets.length)}))}commitKeyboardConnect(){const sourceId=this.keyboardConnectSourceId;if(!sourceId)return;const target=this.eligibleConnectTargets(sourceId)[this.keyboardConnectTargetIndex];if(this.keyboardConnectSourceId=null,!target)return;const sourceOutputs=nodeById(this.nodes,sourceId)?.outputs??DEFAULT_FLOW_OUTPUTS,targetInputs=target.inputs??DEFAULT_FLOW_INPUTS;if(!this.connectable||this.readonly)return;this.emit("lr-connect",Object.freeze({source:sourceId,target:target.id,sourceHandle:sourceOutputs[0]?.id??"out",targetHandle:targetInputs[0]?.id??"in"}));const source=this.nodes.find(node=>node.id===sourceId);this.announcer.announce(this.localize("flowConnectCommitted",void 0,{source:source?this.nodeAccessibleText(source):sourceId,target:this.nodeAccessibleText(target)}))}cancelKeyboardConnect(){this.keyboardConnectSourceId&&(this.keyboardConnectSourceId=null,this.announcer.announce(this.localize("flowConnectCancelled")))}statusTone(status){return status==="running"?"brand":status==="success"?"success":status==="error"?"danger":status==="denied"?"warning":"neutral"}edgeTone(edge){const decoration=this.decorations?.[edge.id];return decoration?this.statusTone(decoration.status):edge.tone??"neutral"}edgeIsRunning(edge){return this.decorations?.[edge.id]?.status==="running"}renderEdges(resolvedById,nodeIndex,edgeIndex,activeIndex){const selectedEdges=new Set(this.selectedEdgeIds),items=[],reducedMotion=!this.ownerDocument?.defaultView||prefersReducedMotion(this),counterMirrorLabels=this.orientation==="horizontal"&&!!this.ownerDocument?.defaultView&&isRtl(this);for(const edge of this.edges){const sourceResolved=resolvedById.get(edge.source);if(!sourceResolved)continue;const targetResolved=resolvedById.get(edge.target),sourcePt=this.handlePoint(sourceResolved,"output",edge.sourceHandle??"out");if(!targetResolved){const stubPt={x:sourcePt.x+14,y:sourcePt.y+14};items.push(svg`<line
|
|
2
2
|
part="stub"
|
|
3
3
|
aria-hidden="true"
|
|
4
4
|
x1=${sourcePt.x} y1=${sourcePt.y}
|