@nyaruka/temba-components 0.142.2 → 0.142.3

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.
Files changed (40) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/temba-components.js +266 -192
  3. package/dist/temba-components.js.map +1 -1
  4. package/out-tsc/src/flow/CanvasMenu.js +8 -3
  5. package/out-tsc/src/flow/CanvasMenu.js.map +1 -1
  6. package/out-tsc/src/flow/CanvasNode.js +158 -9
  7. package/out-tsc/src/flow/CanvasNode.js.map +1 -1
  8. package/out-tsc/src/flow/Editor.js +473 -17
  9. package/out-tsc/src/flow/Editor.js.map +1 -1
  10. package/out-tsc/src/flow/NodeEditor.js +8 -8
  11. package/out-tsc/src/flow/NodeEditor.js.map +1 -1
  12. package/out-tsc/src/flow/Plumber.js +89 -27
  13. package/out-tsc/src/flow/Plumber.js.map +1 -1
  14. package/out-tsc/src/flow/StickyNote.js +63 -3
  15. package/out-tsc/src/flow/StickyNote.js.map +1 -1
  16. package/out-tsc/src/flow/actions/send_msg.js +11 -8
  17. package/out-tsc/src/flow/actions/send_msg.js.map +1 -1
  18. package/out-tsc/src/flow/nodes/split_by_subflow.js +3 -1
  19. package/out-tsc/src/flow/nodes/split_by_subflow.js.map +1 -1
  20. package/out-tsc/src/flow/utils.js +1 -3
  21. package/out-tsc/src/flow/utils.js.map +1 -1
  22. package/out-tsc/src/list/SortableList.js +104 -43
  23. package/out-tsc/src/list/SortableList.js.map +1 -1
  24. package/out-tsc/src/simulator/Simulator.js +5 -1
  25. package/out-tsc/src/simulator/Simulator.js.map +1 -1
  26. package/package.json +1 -1
  27. package/screenshots/truth/actions/send_msg/render/long-quick-replies.png +0 -0
  28. package/screenshots/truth/actions/send_msg/render/text-with-many-quick-replies.png +0 -0
  29. package/screenshots/truth/actions/send_msg/render/text-with-quick-replies.png +0 -0
  30. package/src/flow/CanvasMenu.ts +12 -4
  31. package/src/flow/CanvasNode.ts +185 -9
  32. package/src/flow/Editor.ts +552 -19
  33. package/src/flow/NodeEditor.ts +12 -12
  34. package/src/flow/Plumber.ts +101 -36
  35. package/src/flow/StickyNote.ts +76 -4
  36. package/src/flow/actions/send_msg.ts +11 -8
  37. package/src/flow/nodes/split_by_subflow.ts +3 -1
  38. package/src/flow/utils.ts +1 -3
  39. package/src/list/SortableList.ts +117 -47
  40. package/src/simulator/Simulator.ts +5 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Editor.js","sourceRoot":"","sources":["../../../src/flow/Editor.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, TemplateResult } from 'lit-html';\nimport { css, PropertyValueMap, unsafeCSS } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport {\n FlowDefinition,\n FlowPosition,\n Action,\n Node,\n NodeUI\n} from '../store/flow-definition';\nimport { getStore } from '../store/Store';\nimport {\n AppState,\n FlowIssue,\n fromStore,\n zustand,\n FLOW_SPEC_VERSION\n} from '../store/AppState';\nimport { RapidElement } from '../RapidElement';\nimport { repeat } from 'lit-html/directives/repeat.js';\nimport { CustomEventType, Workspace } from '../interfaces';\nimport {\n generateUUID,\n postJSON,\n fetchResults,\n getClasses,\n WebResponse\n} from '../utils';\nimport { TEMBA_COMPONENTS_VERSION } from '../version';\nimport {\n formatIssueMessage,\n getNodeBounds,\n calculateReflowPositions,\n isRightClick,\n NodeBounds,\n snapToGrid\n} from './utils';\nimport { ACTION_CONFIG, NODE_CONFIG } from './config';\nimport { calculateLayeredLayout, placeStickyNotes } from './reflow';\nimport { FloatingTab } from '../display/FloatingTab';\n\ninterface Revision {\n id: number;\n user: {\n id: number;\n username: string;\n first_name: string;\n last_name: string;\n name?: string;\n };\n created_on: string;\n comment?: string;\n}\n\nimport { ACTION_GROUP_METADATA } from './types';\nimport { Checkbox } from '../form/Checkbox';\n\nimport {\n Plumber,\n calculateFlowchartPath,\n ARROW_LENGTH,\n ARROW_HALF_WIDTH,\n CURSOR_GAP\n} from './Plumber';\nimport { CanvasNode } from './CanvasNode';\nimport { Dialog } from '../layout/Dialog';\n\nimport { CanvasMenu, CanvasMenuSelection } from './CanvasMenu';\nimport { NodeTypeSelector, NodeTypeSelection } from './NodeTypeSelector';\nimport { FloatingWindow } from '../layout/FloatingWindow';\nimport { Icon } from '../Icons';\n\nexport function findNodeForExit(\n definition: FlowDefinition,\n exitUuid: string\n): string | null {\n for (const node of definition.nodes) {\n const exit = node.exits.find((e) => e.uuid === exitUuid);\n if (exit) {\n return node.uuid;\n }\n }\n return null;\n}\n\nconst SAVE_QUIET_TIME = 2000;\n\nexport interface DraggableItem {\n uuid: string;\n position: FlowPosition;\n element: HTMLElement;\n type: 'node' | 'sticky';\n}\n\nexport interface SelectionBox {\n startX: number;\n startY: number;\n endX: number;\n endY: number;\n}\n\nconst DRAG_THRESHOLD = 5;\nconst AUTO_SCROLL_EDGE_ZONE = 100;\nconst AUTO_SCROLL_MAX_SPEED = 15;\n\ntype TranslationType = 'property' | 'category';\n\ninterface TranslationEntry {\n uuid: string;\n type: TranslationType;\n attribute: string;\n from: string;\n to: string | null;\n}\n\ninterface TranslationBundle {\n nodeUuid: string;\n actionUuid?: string;\n translations: TranslationEntry[];\n}\n\ninterface TranslationModel {\n uuid: string;\n name: string;\n description?: string;\n}\n\ninterface LocalizationUpdate {\n uuid: string;\n translations: Record<string, string>;\n}\n\nconst AUTO_TRANSLATE_MODELS_ENDPOINT = '/api/internal/llms.json';\n\n// How long the reflow auto-save countdown runs (in ms).\n// Used in both the CSS animation and the JS setTimeout.\nconst REFLOW_AUTO_SAVE_DELAY = 5000;\n\n// Offset for positioning dropped action node relative to mouse cursor\n// Keep small to make drop location close to cursor position\nconst DROP_PREVIEW_OFFSET_X = 20;\nconst DROP_PREVIEW_OFFSET_Y = 20;\n\nexport class Editor extends RapidElement {\n // connection SVGs are appended directly to the canvas, so we need light DOM\n createRenderRoot() {\n return this;\n }\n\n // this is the master plumber\n private plumber: Plumber;\n\n // timer for debounced saving\n private saveTimer: number | null = null;\n\n @property({ type: String })\n public flow: string;\n\n @property({ type: String })\n public version: string;\n\n @property({ type: String })\n public flowType: string = 'message';\n\n @property({ type: Array })\n public features: string[] = [];\n\n private activityTimer: number | null = null;\n private activityInterval = 100; // Start with 100ms interval for fast initial load\n\n @fromStore(zustand, (state: AppState) => state.flowDefinition)\n private definition!: FlowDefinition;\n\n @fromStore(zustand, (state: AppState) => state.simulatorActive)\n private simulatorActive!: boolean;\n\n @fromStore(zustand, (state: AppState) => state.canvasSize)\n private canvasSize!: { width: number; height: number };\n\n @fromStore(zustand, (state: AppState) => state.dirtyDate)\n private dirtyDate!: Date;\n\n @fromStore(zustand, (state: AppState) => state.languageCode)\n private languageCode!: string;\n\n @fromStore(zustand, (state: AppState) => state.isTranslating)\n private isTranslating!: boolean;\n\n @fromStore(zustand, (state: AppState) => state.workspace)\n private workspace!: Workspace;\n\n @fromStore(zustand, (state: AppState) => state.getCurrentActivity())\n private activityData!: any;\n\n @fromStore(zustand, (state: AppState) => state.flowInfo?.issues || [])\n private flowIssues!: FlowIssue[];\n\n // Drag state\n @state()\n private isDragging = false;\n private isMouseDown = false;\n private dragStartPos = { x: 0, y: 0 };\n\n // Public getter for drag state\n public get dragging(): boolean {\n return this.isDragging;\n }\n\n @state()\n private currentDragItem: DraggableItem | null = null;\n private startPos = { left: 0, top: 0 };\n\n // Auto-scroll state\n private autoScrollAnimationId: number | null = null;\n private autoScrollDeltaX = 0;\n private autoScrollDeltaY = 0;\n private lastMouseEvent: MouseEvent | null = null;\n\n // Selection state\n @state()\n private selectedItems: Set<string> = new Set();\n\n @state()\n private isSelecting = false;\n\n @state()\n private selectionBox: SelectionBox | null = null;\n\n @state()\n private targetId: string | null = null;\n\n @state()\n private sourceId: string | null = null;\n\n @state()\n private dragFromNodeId: string | null = null;\n\n @state()\n private originalConnectionTargetId: string | null = null;\n\n @state()\n private isValidTarget = true;\n\n // Canvas-relative source exit position (set at drag start)\n private connectionSourceX: number | null = null;\n private connectionSourceY: number | null = null;\n\n @state()\n private issuesWindowHidden = true;\n\n @state()\n private localizationWindowHidden = true;\n\n @state()\n private translationFilters: { categories: boolean } = {\n categories: false\n };\n\n @state()\n private translationSettingsExpanded = false;\n\n @state()\n private autoTranslateDialogOpen = false;\n\n @state()\n private autoTranslating = false;\n\n @state()\n private autoTranslateModel: TranslationModel | null = null;\n\n @state()\n private autoTranslateError: string | null = null;\n\n @state()\n private revisionsWindowHidden = true;\n\n @state()\n private revisions: Revision[] = [];\n\n @state()\n private viewingRevision: Revision | null = null;\n\n @state()\n private isLoadingRevisions = false;\n\n @state()\n private isSaving = false;\n\n @state()\n private saveError: string | null = null;\n\n @state()\n private zoom = 1.0;\n\n @state()\n private zoomFitted = false;\n\n @state()\n private reflowPending = false;\n\n @state()\n private reflowUnsaved = false;\n\n private savedReflowPositions: Record<string, FlowPosition> | null = null;\n private reflowAutoSaveTimer: ReturnType<typeof setTimeout> | null = null;\n\n private clearReflowAutoSaveTimer(): void {\n if (this.reflowAutoSaveTimer !== null) {\n clearTimeout(this.reflowAutoSaveTimer);\n this.reflowAutoSaveTimer = null;\n }\n }\n\n private preRevertState: {\n definition: FlowDefinition;\n dirtyDate: Date | null;\n } | null = null;\n\n private translationCache = new Map<string, string>();\n\n // NodeEditor state - handles both node and action editing\n @state()\n private editingNode: Node | null = null;\n\n @state()\n private editingNodeUI: NodeUI | null = null;\n\n @state()\n private editingAction: Action | null = null;\n\n private dialogOrigin: { x: number; y: number } | null = null;\n\n @state()\n private isCreatingNewNode = false;\n\n @state()\n private pendingNodePosition: FlowPosition | null = null;\n\n // Canvas drop state for dragging actions to canvas\n @state()\n private canvasDropPreview: {\n action: Action;\n nodeUuid: string;\n actionIndex: number;\n position: FlowPosition;\n actionHeight: number;\n } | null = null;\n @state()\n private addActionToNodeUuid: string | null = null;\n\n // Track target node for action drag\n @state()\n private actionDragTargetNodeUuid: string | null = null;\n\n // Track previous target node to clear placeholder when moving between nodes\n private previousActionDragTargetNodeUuid: string | null = null;\n\n // Connection placeholder state for dropping connections on empty canvas\n @state()\n private connectionPlaceholder: {\n position: FlowPosition;\n visible: boolean;\n dragUp?: boolean;\n } | null = null;\n\n // Track pending connection when dropping on canvas\n private pendingCanvasConnection: {\n fromNodeId: string;\n exitId: string;\n position: FlowPosition;\n } | null = null;\n\n private canvasMouseDown = false;\n\n private getAvailableLanguages(): Array<{ code: string; name: string }> {\n // Use languages from workspace if available\n if (this.workspace?.languages && this.workspace.languages.length > 0) {\n const languageNames = new Intl.DisplayNames(['en'], { type: 'language' });\n return this.workspace.languages\n .map((code) => {\n try {\n const name = languageNames.of(code);\n return name ? { code, name } : { code, name: code };\n } catch {\n return { code, name: code };\n }\n })\n .filter((lang) => lang.code && lang.name);\n }\n\n // Fall back to flow definition languages if available\n if (\n this.definition?._ui?.languages &&\n this.definition._ui.languages.length > 0\n ) {\n return this.definition._ui.languages.map((lang: any) => ({\n code: typeof lang === 'string' ? lang : lang.iso || lang.code,\n name: typeof lang === 'string' ? lang : lang.name\n }));\n }\n\n // No languages available\n return [];\n }\n\n // Bound event handlers to maintain proper 'this' context\n private boundMouseMove = this.handleMouseMove.bind(this);\n private boundMouseUp = this.handleMouseUp.bind(this);\n private boundGlobalMouseDown = this.handleGlobalMouseDown.bind(this);\n private boundKeyDown = this.handleKeyDown.bind(this);\n private boundCanvasContextMenu = this.handleCanvasContextMenu.bind(this);\n private boundWheel = this.handleWheel.bind(this);\n\n static get styles() {\n return css`\n #editor-container {\n position: relative;\n flex: 1;\n display: flex;\n min-height: 0;\n }\n\n #editor {\n overflow: scroll;\n flex: 1;\n -webkit-font-smoothing: antialiased;\n }\n\n temba-floating-tab {\n --floating-tab-right: 15px;\n }\n\n #grid {\n position: relative;\n background-color: #f9f9f9;\n background-image: radial-gradient(\n circle,\n rgba(61, 177, 255, 0.3) 1px,\n transparent 1px\n );\n background-size: 20px 20px;\n background-position: 10px 10px;\n width: 100%;\n display: flex;\n padding-top: 20px;\n transform-origin: 0 0;\n }\n\n #canvas {\n position: relative;\n padding: 0px;\n flex-grow: 1;\n margin: 20px;\n }\n\n #canvas > .draggable {\n position: absolute;\n z-index: 100;\n }\n\n #canvas > .dragging {\n z-index: 99999 !important;\n transition: none !important;\n }\n\n #canvas.viewing-revision {\n pointer-events: none;\n }\n\n #canvas.read-only svg {\n pointer-events: none;\n }\n\n #grid.viewing-revision {\n background-color: #fff9fc;\n background-image: radial-gradient(\n circle,\n rgba(166, 38, 164, 0.2) 1px,\n transparent 1px\n );\n }\n\n #grid.viewing-revision temba-flow-node,\n #grid.viewing-revision svg.plumb-connector {\n opacity: 0.5;\n }\n\n svg.plumb-connector {\n z-index: 10;\n }\n\n svg.plumb-connector path {\n stroke: var(--color-connectors);\n stroke-width: 3px;\n }\n\n svg.plumb-connector .plumb-arrow {\n fill: var(--color-connectors);\n stroke: none;\n }\n\n svg.plumb-connector.hover path {\n stroke: var(--color-success);\n }\n\n svg.plumb-connector.hover .plumb-arrow {\n fill: var(--color-success);\n }\n\n #canvas.read-only-connections svg.plumb-connector.hover path {\n stroke: var(--color-connectors);\n }\n\n #canvas.read-only-connections svg.plumb-connector.hover .plumb-arrow {\n fill: var(--color-connectors);\n }\n\n #canvas.read-only-connections svg.plumb-connector,\n #canvas.read-only-connections svg.plumb-connector * {\n pointer-events: none !important;\n cursor: default !important;\n }\n\n svg.plumb-connector.removing path {\n stroke: var(--color-error);\n }\n\n svg.plumb-connector.removing .plumb-arrow {\n fill: var(--color-error);\n }\n\n svg.plumb-connector.dragging {\n z-index: 99999;\n }\n\n /* Active contact count on nodes */\n .active-count {\n position: absolute;\n background: #3498db;\n border: 1px solid #2980b9;\n border-radius: 12px;\n padding: 3px 6px;\n color: #fff;\n font-weight: 500;\n top: -10px;\n left: -10px;\n font-size: 13px;\n\n text-align: center;\n z-index: 600;\n line-height: 1;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n }\n\n /* Activity overlay badges on connection exit stubs */\n .activity-overlay {\n position: absolute;\n background: #f3f3f3;\n border: 1px solid #d9d9d9;\n color: #333;\n border-radius: 4px;\n padding: 2px 4px;\n font-size: 10px;\n font-weight: 600;\n line-height: 0.9;\n cursor: pointer;\n z-index: 10;\n pointer-events: auto;\n white-space: nowrap;\n user-select: none;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);\n }\n\n #grid.viewing-revision .activity-overlay {\n opacity: 0.5;\n pointer-events: none;\n }\n\n /* Recent contacts popup */\n @keyframes popupBounceIn {\n 0% {\n transform: scale(0.8);\n opacity: 0;\n }\n 50% {\n transform: scale(1.05);\n }\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n }\n\n .recent-contacts-popup {\n display: none;\n position: absolute;\n width: 200px;\n background: #f3f3f3;\n border-radius: 10px;\n box-shadow: 0 1px 3px 1px rgba(130, 130, 130, 0.2);\n z-index: 1015;\n transform-origin: top center;\n }\n\n .recent-contacts-popup.show {\n display: block;\n animation: popupBounceIn 0.3s cubic-bezier(0.68, -0.55, 0.265, 1.55);\n }\n\n .recent-contacts-popup .popup-title {\n background: #999;\n color: #fff;\n padding: 6px 0;\n text-align: center;\n border-top-left-radius: 10px;\n border-top-right-radius: 10px;\n font-size: 12px;\n }\n\n .recent-contacts-popup .no-contacts-message {\n padding: 15px;\n text-align: center;\n color: #999;\n font-size: 12px;\n }\n\n .recent-contacts-popup .contact-row {\n padding: 8px 10px;\n border-top: 1px solid #e0e0e0;\n text-align: left;\n }\n\n .recent-contacts-popup .contact-row:last-child {\n border-bottom-left-radius: 10px;\n border-bottom-right-radius: 10px;\n }\n\n .recent-contacts-popup .contact-name {\n display: block;\n font-weight: 500;\n font-size: 12px;\n color: var(--color-link-primary, #1d4ed8);\n cursor: pointer;\n }\n\n .recent-contacts-popup .contact-name:hover {\n text-decoration: underline;\n }\n\n .recent-contacts-popup .contact-operand {\n padding-top: 3px;\n font-size: 11px;\n color: #666;\n word-wrap: break-word;\n }\n\n .recent-contacts-popup .contact-time {\n padding-top: 3px;\n font-size: 10px;\n color: #999;\n }\n\n /* Connection target feedback */\n temba-flow-node.connection-target-valid {\n outline: 3px solid var(--color-success, #22c55e) !important;\n outline-offset: 2px;\n border-radius: var(--curvature);\n }\n\n temba-flow-node.connection-target-invalid {\n outline: 3px solid var(--color-error, #ef4444) !important;\n outline-offset: 2px;\n border-radius: var(--curvature);\n }\n\n /* Selection box styles */\n .selection-box {\n position: absolute;\n border: 2px dashed #6298f0ff;\n background-color: rgba(59, 130, 246, 0.1);\n z-index: 9999;\n pointer-events: none;\n }\n\n /* Selected item styles */\n .draggable.selected {\n outline: 3px solid #6298f0ff;\n outline-offset: 0px;\n border-radius: var(--curvature);\n }\n\n .localization-window-content {\n display: flex;\n flex-direction: column;\n gap: 16px;\n height: 100%;\n }\n\n .localization-header {\n font-size: 13px;\n color: #4b5563;\n line-height: 1.4;\n }\n\n .localization-language-select {\n --color-widget-border: #d1d5db;\n --color-widget-background: #fff;\n }\n\n .localization-language-row {\n display: flex;\n align-items: flex-end;\n gap: 12px;\n }\n\n .localization-language-row temba-select {\n flex: 1;\n }\n\n .localization-progress {\n margin-top: auto;\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .localization-progress-bar-row {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .localization-progress-trigger {\n flex: 1;\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n }\n\n .localization-progress-trigger:focus-visible {\n outline: 2px solid #94a3b8;\n outline-offset: 2px;\n }\n\n .localization-progress-trigger temba-progress {\n flex: 1;\n }\n\n .localization-progress h5 {\n margin: 0;\n font-size: 13px;\n font-weight: 600;\n color: #374151;\n }\n\n .localization-progress-summary {\n font-size: 12px;\n color: #6b7280;\n display: flex;\n align-items: center;\n gap: 6px;\n min-height: 20px;\n }\n\n .translation-settings-toggle {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n background: transparent;\n border: none;\n color: #6b7280;\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n }\n\n .translation-settings-label {\n font-size: 12px;\n color: #6b7280;\n }\n\n .translation-settings-toggle:focus-visible {\n outline: 2px solid #94a3b8;\n outline-offset: 2px;\n }\n\n .translation-settings-arrow {\n width: 8px;\n height: 8px;\n border-right: 2px solid currentColor;\n border-bottom: 2px solid currentColor;\n transform: rotate(-45deg);\n transition: transform 0.2s ease;\n margin-left: 2px;\n }\n\n .translation-settings-arrow.expanded {\n transform: rotate(45deg);\n }\n\n .translation-settings {\n }\n\n .translation-settings-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n\n .translation-settings-row temba-checkbox {\n width: 100%;\n }\n\n .revert-button {\n background: var(--color-primary-dark);\n border: none;\n color: #fff;\n padding: 6px 10px;\n border-radius: var(--curvature);\n font-size: 11px;\n font-weight: 600;\n cursor: pointer;\n transition: opacity 0.2s ease;\n }\n\n .auto-translate-button {\n background: var(--color-primary-dark);\n border: none;\n color: #fff;\n padding: 10px 12px;\n border-radius: var(--curvature);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: opacity 0.2s ease;\n }\n\n .auto-translate-button[disabled] {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .auto-translate-error {\n font-size: 12px;\n color: #b91c1c;\n }\n\n .auto-translate-dialog-content {\n padding: 20px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n font-size: 14px;\n color: #374151;\n }\n\n .auto-translate-dialog-content p {\n margin: 0;\n }\n\n .auto-translate-loading {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n color: #6b7280;\n }\n\n .auto-translate-empty {\n font-size: 13px;\n color: #6b7280;\n }\n\n .localization-empty {\n font-size: 13px;\n color: #9ca3af;\n white-space: nowrap;\n }\n\n .issue-list-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px;\n border-radius: 4px;\n cursor: pointer;\n font-size: 13px;\n color: #333;\n }\n\n .issue-list-item:hover {\n background: #fff5f5;\n }\n\n .issue-list-item temba-icon {\n color: tomato;\n flex-shrink: 0;\n }\n\n .empty-flow {\n position: sticky;\n top: 80px;\n left: 0;\n right: 0;\n height: 0;\n display: flex;\n justify-content: center;\n pointer-events: none;\n z-index: 50;\n }\n\n .empty-flow-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 16px;\n text-align: center;\n pointer-events: auto;\n }\n\n .empty-flow-title {\n font-size: 18px;\n font-weight: 600;\n color: #374151;\n }\n\n .empty-flow-description {\n font-size: 14px;\n color: #6b7280;\n max-width: 320px;\n line-height: 1.5;\n }\n\n .empty-flow-button {\n background: var(--color-primary-dark);\n border: none;\n color: #fff;\n padding: 10px 20px;\n border-radius: var(--curvature);\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: opacity 0.2s ease;\n }\n\n .empty-flow-button:hover {\n opacity: 0.9;\n }\n\n .save-indicator {\n position: absolute;\n top: 8px;\n right: 240px;\n padding: 6px 10px;\n z-index: 4999;\n pointer-events: none;\n opacity: 0;\n transition: opacity 0.15s ease-in-out;\n }\n\n .save-indicator.visible {\n opacity: 1;\n }\n\n .zoom-controls {\n position: absolute;\n top: 8px;\n right: 16px;\n z-index: 4999;\n display: flex;\n align-items: center;\n gap: 2px;\n background: white;\n border-radius: var(--curvature);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);\n padding: 4px;\n user-select: none;\n }\n\n .zoom-controls button {\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n border-radius: var(--curvature);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n color: #555;\n font-size: 16px;\n line-height: 1;\n outline: none;\n }\n\n .zoom-controls button:hover {\n background: rgba(0, 0, 0, 0.06);\n }\n\n .zoom-controls button:disabled {\n opacity: 0.3;\n cursor: default;\n background: transparent;\n }\n\n .zoom-controls .zoom-level {\n font-size: 12px;\n min-width: 40px;\n text-align: center;\n color: #555;\n font-weight: 500;\n }\n\n .zoom-controls .zoom-divider {\n width: 1px;\n height: 16px;\n background: #e0e0e0;\n margin: 0 2px;\n }\n\n .reflow-card {\n position: absolute;\n top: 16px;\n left: 50%;\n transform: translateX(-50%);\n z-index: 10000;\n background: rgba(0, 0, 0, 0.65);\n backdrop-filter: blur(8px);\n border-radius: 10px;\n padding: 12px 16px 8px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n color: white;\n font-size: 13px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n }\n\n .reflow-card .reflow-top {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .reflow-card .reflow-label {\n white-space: nowrap;\n }\n\n .reflow-card button {\n border: none;\n border-radius: 6px;\n padding: 6px 14px;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n white-space: nowrap;\n transition: opacity 0.15s ease;\n }\n\n .reflow-card button:hover {\n opacity: 0.85;\n }\n\n .reflow-card .reflow-discard {\n background: rgba(255, 255, 255, 0.2);\n color: white;\n }\n\n .reflow-meter {\n height: 3px;\n border-radius: 2px;\n background: rgba(255, 255, 255, 0.15);\n overflow: hidden;\n }\n\n .reflow-meter-fill {\n height: 100%;\n background: rgba(255, 255, 255, 0.5);\n border-radius: 2px;\n animation: reflow-countdown ${unsafeCSS(REFLOW_AUTO_SAVE_DELAY / 1000)}s\n linear forwards;\n }\n\n @keyframes reflow-countdown {\n from {\n width: 100%;\n }\n to {\n width: 0%;\n }\n }\n `;\n }\n\n constructor() {\n super();\n }\n\n protected firstUpdated(\n changes: PropertyValueMap<any> | Map<PropertyKey, unknown>\n ): void {\n super.firstUpdated(changes);\n this.plumber = new Plumber(this.querySelector('#canvas'), this);\n this.setupGlobalEventListeners();\n this.updateZoomControlPositioning();\n if (changes.has('flow')) {\n getStore().getState().fetchRevision(`/flow/revisions/${this.flow}`);\n this.fetchRevisions();\n }\n\n this.plumber.on('connection:drag', (connection: any) => {\n this.dragFromNodeId = connection.data.nodeId;\n this.sourceId = connection.sourceId;\n this.connectionSourceX = connection.sourceX;\n this.connectionSourceY = connection.sourceY;\n this.originalConnectionTargetId = connection.target.id;\n });\n\n this.plumber.on('connection:abort', (info) => {\n this.makeConnection(info);\n });\n\n this.plumber.on('connection:detach', (info) => {\n // console.log('Connection detached', info);\n this.makeConnection(info);\n });\n }\n\n private makeConnection(info) {\n if (this.sourceId && this.targetId && this.isValidTarget) {\n // going to the same target, just put it back\n if (info.target.id === this.targetId) {\n this.plumber.connectIds(\n this.dragFromNodeId,\n this.sourceId,\n this.targetId\n );\n }\n // otherwise update the connection\n else {\n getStore()\n .getState()\n .updateConnection(this.dragFromNodeId, this.sourceId, this.targetId);\n }\n } else if (\n this.connectionPlaceholder &&\n this.connectionPlaceholder.visible &&\n this.sourceId\n ) {\n // Snap the placeholder position to grid\n const snappedPosition = {\n left: snapToGrid(this.connectionPlaceholder.position.left),\n top: snapToGrid(this.connectionPlaceholder.position.top)\n };\n const isDragUp = !!this.connectionPlaceholder.dragUp;\n\n // Update the placeholder to the snapped position\n this.connectionPlaceholder.position = snappedPosition;\n\n // Store the pending connection info\n this.pendingCanvasConnection = {\n fromNodeId: this.dragFromNodeId,\n exitId: this.sourceId,\n position: snappedPosition\n };\n\n // Show the context menu near the placeholder\n const canvas = this.querySelector('#canvas');\n if (canvas) {\n const canvasRect = canvas.getBoundingClientRect();\n const menuX = canvasRect.left + snappedPosition.left * this.zoom - 40;\n const menuY = isDragUp\n ? canvasRect.top + snappedPosition.top * this.zoom + 74 // just below placeholder bottom\n : canvasRect.top + snappedPosition.top * this.zoom + 80; // just below placeholder\n\n const canvasMenu = this.querySelector(\n 'temba-canvas-menu'\n ) as CanvasMenu;\n if (canvasMenu) {\n canvasMenu.show(\n menuX,\n menuY,\n {\n x: snappedPosition.left,\n y: snappedPosition.top\n },\n false, // Don't show sticky note option for connection drops\n false,\n this.flowType === 'message'\n );\n }\n }\n\n // Request update to render the connection line\n this.requestUpdate();\n\n // Don't clear placeholder or connection info yet - keep them for menu interaction\n return;\n }\n\n // Clean up visual feedback\n document.querySelectorAll('temba-flow-node').forEach((node) => {\n node.classList.remove(\n 'connection-target-valid',\n 'connection-target-invalid'\n );\n });\n\n // Clear connection state (but keep sourceId/dragFromNodeId if we have a pending connection)\n if (!this.pendingCanvasConnection) {\n this.sourceId = null;\n this.connectionSourceX = null;\n this.connectionSourceY = null;\n this.dragFromNodeId = null;\n }\n this.targetId = null;\n this.isValidTarget = true;\n }\n\n protected updated(\n changes: PropertyValueMap<any> | Map<PropertyKey, unknown>\n ): void {\n super.updated(changes);\n if (changes.has('canvasSize')) {\n // console.log('Setting canvas size', this.canvasSize);\n }\n\n if (changes.has('definition')) {\n this.updateCanvasSize();\n\n // Set flowType from the loaded definition\n if (this.definition?.type) {\n this.flowType = this.getFlowTypeFromDefinition(this.definition.type);\n }\n\n const filters = this.definition?._ui?.translation_filters || {\n categories: false\n };\n const normalizedFilters = {\n categories: !!filters.categories\n };\n\n if (this.translationFilters.categories !== normalizedFilters.categories) {\n this.translationFilters = normalizedFilters;\n }\n\n this.translationCache.clear();\n\n // Start fetching activity data when definition is loaded\n if (this.definition?.uuid) {\n this.startActivityFetching();\n }\n }\n\n if (changes.has('simulatorActive')) {\n if (this.simulatorActive) {\n // Stop polling when simulator becomes active\n this.stopActivityFetching();\n } else {\n // Resume polling and refresh activity when simulator closes\n this.activityInterval = 100; // Reset to fast initial interval\n this.startActivityFetching();\n }\n }\n\n if (changes.has('activityData')) {\n // Update plumber with new activity data\n if (this.plumber) {\n this.plumber.setActivityData(this.activityData);\n }\n }\n\n if (changes.has('dirtyDate')) {\n if (this.dirtyDate) {\n if (this.reflowPending) {\n // This dirtyDate is from the reflow itself — suppress save\n this.reflowPending = false;\n } else {\n // Normal change — if reflow card was showing, it goes away\n // because these changes will be included in the save\n if (this.reflowUnsaved) {\n this.reflowUnsaved = false;\n this.savedReflowPositions = null;\n this.clearReflowAutoSaveTimer();\n }\n this.isSaving = true;\n this.debouncedSave();\n }\n }\n }\n\n if (changes.has('saveError') && this.saveError) {\n this.showSaveErrorDialog(this.saveError);\n this.saveError = null;\n }\n\n if (changes.has('languageCode')) {\n this.translationCache.clear();\n }\n }\n\n /**\n * Map FlowDefinition type to Editor flowType\n * FlowDefinition uses: 'messaging', 'messaging_background', 'messaging_offline', 'voice'\n * Editor uses: 'message', 'voice', 'background'\n */\n private getFlowTypeFromDefinition(definitionType: string): string {\n if (definitionType === 'voice') {\n return 'voice';\n } else if (\n definitionType === 'messaging_background' ||\n definitionType === 'messaging_offline'\n ) {\n return 'background';\n } else {\n // 'messaging' or any other messaging type defaults to 'message'\n return 'message';\n }\n }\n\n private debouncedSave(): void {\n // Clear any existing timer\n if (this.saveTimer !== null) {\n clearTimeout(this.saveTimer);\n }\n\n this.saveTimer = window.setTimeout(() => {\n // Don't auto-save while a reflow preview is pending user confirmation\n if (this.reflowUnsaved) {\n this.saveTimer = null;\n return;\n }\n\n const now = new Date();\n const timeSinceLastChange = now.getTime() - this.dirtyDate.getTime();\n\n if (timeSinceLastChange >= SAVE_QUIET_TIME) {\n this.saveChanges();\n this.saveTimer = null;\n } else {\n this.debouncedSave();\n }\n }, SAVE_QUIET_TIME);\n }\n\n private definitionForSave(definition: FlowDefinition): FlowDefinition {\n return {\n ...definition,\n _ui: {\n ...definition._ui,\n editor: TEMBA_COMPONENTS_VERSION\n }\n };\n }\n\n private saveChanges(definitionOverride?: FlowDefinition): Promise<void> {\n const definition = this.definitionForSave(\n definitionOverride || this.definition\n );\n this.isSaving = true;\n\n return getStore()\n .postJSON(`/flow/revisions/${this.flow}/`, definition)\n .then((response) => {\n if (response.status < 200 || response.status >= 300) {\n this.saveError = this.extractErrorMessage(response);\n return;\n }\n\n // Update flow info and revision with the response data\n if (response.json) {\n const state = getStore().getState();\n\n if (response.json.info) {\n state.setFlowInfo(response.json.info);\n }\n\n if (response.json.revision?.revision !== undefined) {\n state.setRevision(response.json.revision.revision);\n }\n\n // Refresh revisions list so the tab visibility stays up to date\n this.fetchRevisions();\n }\n\n getStore().getState().setDirtyDate(null);\n })\n .catch((error) => {\n console.error('Failed to save flow:', error);\n if (error instanceof Response) {\n this.saveError = `Server error (${error.status}). Your changes have not been saved.`;\n } else {\n this.saveError =\n 'Unable to reach the server. Please check your connection and try again.';\n }\n })\n .finally(() => {\n this.isSaving = false;\n });\n }\n\n private extractErrorMessage(response: WebResponse): string {\n if (response.json) {\n if (typeof response.json.detail === 'string') {\n return response.json.detail;\n }\n if (typeof response.json.error === 'string') {\n return response.json.error;\n }\n if (typeof response.json.description === 'string') {\n return response.json.description;\n }\n }\n return `Save failed with status ${response.status}.`;\n }\n\n private showSaveErrorDialog(message: string): void {\n const dialog = document.createElement('temba-dialog') as Dialog;\n dialog.header = 'Save Failed';\n dialog.primaryButtonName = '';\n dialog.cancelButtonName = 'Dismiss';\n\n const content = document.createElement('div');\n content.style.cssText = 'padding: 20px; font-size: 14px; line-height: 1.5;';\n content.textContent = message;\n dialog.appendChild(content);\n\n document.body.appendChild(dialog);\n dialog.open = true;\n\n dialog.addEventListener('temba-dialog-hidden', () => {\n document.body.removeChild(dialog);\n });\n }\n\n private startActivityFetching(): void {\n // Don't start if simulator is active\n if (this.simulatorActive) {\n return;\n }\n // Fetch immediately\n this.fetchActivityData();\n }\n\n private stopActivityFetching(): void {\n if (this.activityTimer !== null) {\n clearTimeout(this.activityTimer);\n this.activityTimer = null;\n }\n }\n\n private fetchActivityData(): void {\n if (!this.definition?.uuid) {\n return;\n }\n\n // Don't fetch if simulator is active\n if (this.simulatorActive) {\n return;\n }\n\n const activityEndpoint = `/flow/activity/${this.definition.uuid}/`;\n const store = getStore();\n if (!store) {\n return;\n }\n const state = store.getState();\n state.fetchActivity(activityEndpoint).then(() => {\n // Guard against responses arriving after the editor is disconnected\n if (!this.isConnected) {\n return;\n }\n\n // Schedule next fetch with exponential backoff (max 5 minutes)\n this.activityInterval = Math.min(60000 * 5, this.activityInterval + 100);\n\n if (this.activityTimer !== null) {\n clearTimeout(this.activityTimer);\n }\n\n this.activityTimer = window.setTimeout(() => {\n this.fetchActivityData();\n }, this.activityInterval);\n });\n }\n\n private handleLanguageChange(languageCode: string): void {\n zustand.getState().setLanguageCode(languageCode);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.stopAutoScroll();\n if (this.saveTimer !== null) {\n clearTimeout(this.saveTimer);\n this.saveTimer = null;\n }\n if (this.activityTimer !== null) {\n clearTimeout(this.activityTimer);\n this.activityTimer = null;\n }\n this.clearReflowAutoSaveTimer();\n document.removeEventListener('mousemove', this.boundMouseMove);\n document.removeEventListener('mouseup', this.boundMouseUp);\n document.removeEventListener('mousedown', this.boundGlobalMouseDown);\n document.removeEventListener('keydown', this.boundKeyDown);\n\n const canvas = this.querySelector('#canvas');\n if (canvas) {\n canvas.removeEventListener('contextmenu', this.boundCanvasContextMenu);\n }\n\n const editor = this.querySelector('#editor');\n if (editor) {\n editor.removeEventListener('wheel', this.boundWheel);\n }\n\n // Clear all flow-specific data from the store so stale data\n // isn't briefly visible when a different flow is opened.\n zustand.getState().clearFlowData();\n }\n\n private setupGlobalEventListeners(): void {\n document.addEventListener('mousemove', this.boundMouseMove);\n document.addEventListener('mouseup', this.boundMouseUp);\n document.addEventListener('mousedown', this.boundGlobalMouseDown);\n document.addEventListener('keydown', this.boundKeyDown);\n\n const canvas = this.querySelector('#canvas');\n if (canvas) {\n canvas.addEventListener('contextmenu', this.boundCanvasContextMenu);\n }\n\n const editor = this.querySelector('#editor');\n if (editor) {\n editor.addEventListener('wheel', this.boundWheel, { passive: false });\n }\n\n // Listen for action edit requests from flow nodes\n this.addEventListener(\n CustomEventType.ActionEditRequested,\n this.handleActionEditRequested.bind(this)\n );\n\n // Listen for add action requests from flow nodes\n this.addEventListener(\n CustomEventType.AddActionRequested,\n this.handleAddActionRequested.bind(this)\n );\n\n // Listen for node edit requests from flow nodes\n this.addEventListener(\n CustomEventType.NodeEditRequested,\n this.handleNodeEditRequested.bind(this)\n );\n\n // Listen for node deletion events\n this.addEventListener(\n CustomEventType.NodeDeleted,\n this.handleNodeDeleted.bind(this)\n );\n\n // Listen for canvas menu selections\n this.addEventListener(CustomEventType.Selection, (event: CustomEvent) => {\n const target = event.target as HTMLElement;\n if (target.tagName === 'TEMBA-CANVAS-MENU') {\n this.handleCanvasMenuSelection(event);\n } else if (target.tagName === 'TEMBA-NODE-TYPE-SELECTOR') {\n this.handleNodeTypeSelection(event);\n }\n });\n\n // Listen for canvas menu cancel (close without selection)\n this.addEventListener(CustomEventType.Canceled, (event: CustomEvent) => {\n const target = event.target as HTMLElement;\n if (target.tagName === 'TEMBA-CANVAS-MENU') {\n this.handleCanvasMenuClosed();\n } else if (target.tagName === 'TEMBA-NODE-TYPE-SELECTOR') {\n this.handleNodeTypeSelectorClosed();\n }\n });\n\n // Listen for action drag events from nodes\n this.addEventListener(\n CustomEventType.DragExternal,\n this.handleActionDragExternal.bind(this)\n );\n\n this.addEventListener(\n CustomEventType.DragInternal,\n this.handleActionDragInternal.bind(this)\n );\n\n this.addEventListener(CustomEventType.DragStop, (event: CustomEvent) => {\n if (event.detail.isExternal) {\n this.handleActionDropExternal(event);\n }\n });\n }\n\n private getPosition(uuid: string, type: 'node' | 'sticky'): FlowPosition {\n if (type === 'node') {\n return this.definition._ui.nodes[uuid]?.position;\n } else {\n return this.definition._ui.stickies?.[uuid]?.position;\n }\n }\n\n private handleMouseDown(event: MouseEvent): void {\n if (isRightClick(event)) return;\n\n if (this.isReadOnly()) return;\n this.blurActiveContentEditable();\n\n const element = event.currentTarget as HTMLElement;\n // Only start dragging if clicking on the element itself, not on exits or other interactive elements\n const target = event.target as HTMLElement;\n if (\n target.classList.contains('exit') ||\n target.closest('.exit') ||\n target.closest('.linked-name')\n ) {\n return;\n }\n\n const uuid = element.getAttribute('uuid');\n const type = element.tagName === 'TEMBA-FLOW-NODE' ? 'node' : 'sticky';\n\n const position = this.getPosition(uuid, type);\n if (!position) return;\n\n // If clicking on a non-selected item, clear selection unless Ctrl/Cmd is held\n if (!this.selectedItems.has(uuid) && !event.ctrlKey && !event.metaKey) {\n this.selectedItems.clear();\n // Don't add single items to selection - single clicks just clear existing selection\n } else if (!this.selectedItems.has(uuid)) {\n // Add this item to selection only if Ctrl/Cmd is held\n this.selectedItems.add(uuid);\n }\n\n // Always set up drag state regardless of selection status\n // This allows single nodes to be dragged without being selected\n this.isMouseDown = true;\n this.dragStartPos = { x: event.clientX, y: event.clientY };\n this.startPos = { left: position.left, top: position.top };\n this.currentDragItem = {\n uuid,\n position,\n element,\n type\n };\n\n event.preventDefault();\n event.stopPropagation();\n }\n\n private handleGlobalMouseDown(event: MouseEvent): void {\n if (isRightClick(event)) return;\n\n // Check if the click is within our canvas\n const canvasRect = this.querySelector('#grid')?.getBoundingClientRect();\n\n if (!canvasRect) return;\n\n const isWithinCanvas =\n event.clientX >= canvasRect.left &&\n event.clientX <= canvasRect.right &&\n event.clientY >= canvasRect.top &&\n event.clientY <= canvasRect.bottom;\n\n if (!isWithinCanvas) return;\n\n // Check if we clicked on a draggable item (node or sticky)\n const target = event.target as HTMLElement;\n const clickedOnDraggable = target.closest('.draggable');\n\n if (clickedOnDraggable) {\n // This is handled by the individual item mousedown handlers\n return;\n }\n\n // We clicked on empty canvas space, start selection\n this.handleCanvasMouseDown(event);\n }\n\n private blurActiveContentEditable(): void {\n let active: Element | null = document.activeElement;\n while (active?.shadowRoot?.activeElement) {\n active = active.shadowRoot.activeElement;\n }\n if (\n active instanceof HTMLElement &&\n active.getAttribute('contenteditable') === 'true'\n ) {\n active.blur();\n }\n }\n\n private handleCanvasMouseDown(event: MouseEvent): void {\n if (this.isReadOnly()) return;\n this.blurActiveContentEditable();\n\n const target = event.target as HTMLElement;\n if (target.id === 'canvas' || target.id === 'grid') {\n // Ignore clicks on exits\n\n // Start selection box\n this.canvasMouseDown = true;\n this.dragStartPos = { x: event.clientX, y: event.clientY };\n\n const canvasRect = this.querySelector('#canvas')?.getBoundingClientRect();\n if (canvasRect) {\n // Clear current selection\n this.selectedItems.clear();\n\n const relativeX = (event.clientX - canvasRect.left) / this.zoom;\n const relativeY = (event.clientY - canvasRect.top) / this.zoom;\n\n this.selectionBox = {\n startX: relativeX,\n startY: relativeY,\n endX: relativeX,\n endY: relativeY\n };\n }\n\n event.preventDefault();\n }\n }\n\n private handleKeyDown(event: KeyboardEvent): void {\n if (event.key === 'Delete' || event.key === 'Backspace') {\n if (this.selectedItems.size > 0) {\n this.showDeleteConfirmation();\n }\n }\n if (event.key === 'Escape') {\n this.selectedItems.clear();\n this.requestUpdate();\n }\n }\n\n // --- Zoom ---\n\n private setZoom(\n newZoom: number,\n center?: { clientX: number; clientY: number }\n ): void {\n const clamped = Math.max(\n 0.1,\n Math.min(1.0, Math.round(newZoom * 100) / 100)\n );\n if (clamped === this.zoom) return;\n\n const editor = this.querySelector('#editor') as HTMLElement;\n const oldZoom = this.zoom;\n this.zoom = clamped;\n this.plumber.zoom = clamped;\n this.zoomFitted = false;\n\n if (editor && center) {\n const editorRect = editor.getBoundingClientRect();\n const ox = center.clientX - editorRect.left;\n const oy = center.clientY - editorRect.top;\n // Canvas point under cursor at old zoom\n const cx = (editor.scrollLeft + ox) / oldZoom;\n const cy = (editor.scrollTop + oy) / oldZoom;\n\n requestAnimationFrame(() => {\n editor.scrollLeft = cx * clamped - ox;\n editor.scrollTop = cy * clamped - oy;\n this.plumber.repaintEverything();\n });\n } else {\n requestAnimationFrame(() => this.plumber.repaintEverything());\n }\n }\n\n private zoomIn(): void {\n this.setZoom(this.zoom + 0.05);\n }\n\n private zoomOut(): void {\n this.setZoom(this.zoom - 0.05);\n }\n\n private zoomToFit(): void {\n if (!this.definition || this.definition.nodes.length === 0) return;\n\n const editor = this.querySelector('#editor') as HTMLElement;\n if (!editor) return;\n\n // Calculate bounding box of all content in canvas coordinates\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n this.definition.nodes.forEach((node) => {\n const ui = this.definition._ui?.nodes[node.uuid];\n if (!ui?.position) return;\n const el = this.querySelector(`[id=\"${node.uuid}\"]`) as HTMLElement;\n if (!el) return;\n const w = el.offsetWidth;\n const h = el.offsetHeight;\n minX = Math.min(minX, ui.position.left);\n minY = Math.min(minY, ui.position.top);\n maxX = Math.max(maxX, ui.position.left + w);\n maxY = Math.max(maxY, ui.position.top + h);\n });\n\n const stickies = this.definition._ui?.stickies || {};\n Object.entries(stickies).forEach(([uuid, sticky]) => {\n if (!sticky.position) return;\n const el = this.querySelector(\n `temba-sticky-note[uuid=\"${uuid}\"]`\n ) as HTMLElement;\n if (!el) return;\n const w = el.offsetWidth;\n const h = el.offsetHeight;\n minX = Math.min(minX, sticky.position.left);\n minY = Math.min(minY, sticky.position.top);\n maxX = Math.max(maxX, sticky.position.left + w);\n maxY = Math.max(maxY, sticky.position.top + h);\n });\n\n if (minX === Infinity) return;\n\n const contentWidth = maxX - minX;\n const contentHeight = maxY - minY;\n const padding = 40;\n\n const availWidth = editor.clientWidth - padding * 2;\n const availHeight = editor.clientHeight - padding * 2;\n\n const scaleX = availWidth / contentWidth;\n const scaleY = availHeight / contentHeight;\n let fitZoom = Math.min(scaleX, scaleY, 1.0);\n fitZoom = Math.max(fitZoom, 0.1);\n fitZoom = Math.round(fitZoom * 20) / 20; // round to nearest 0.05\n\n this.zoom = fitZoom;\n this.plumber.zoom = fitZoom;\n this.zoomFitted = true;\n\n // Center of content in canvas coordinates, plus grid/canvas margin offset\n const centerX = (minX + maxX) / 2 + 40;\n const centerY = (minY + maxY) / 2 + 40;\n\n requestAnimationFrame(() => {\n editor.scrollLeft = centerX * fitZoom - editor.clientWidth / 2;\n editor.scrollTop = centerY * fitZoom - editor.clientHeight / 2;\n this.plumber.repaintEverything();\n });\n }\n\n private zoomToFull(): void {\n this.setZoom(1.0);\n }\n\n /** Adjust zoom control right offset and floating tab positions */\n private updateZoomControlPositioning(): void {\n requestAnimationFrame(() => {\n const editor = this.querySelector('#editor') as HTMLElement;\n const zoomControls = this.querySelector('.zoom-controls') as HTMLElement;\n if (editor && zoomControls) {\n // Match right spacing to the top spacing (8px) by accounting for\n // the scrollbar width\n const scrollbarWidth = editor.offsetWidth - editor.clientWidth;\n zoomControls.style.right = `${8 + scrollbarWidth}px`;\n }\n if (zoomControls) {\n const rect = zoomControls.getBoundingClientRect();\n FloatingTab.START_TOP = rect.bottom + 8;\n FloatingTab.updateAllPositions();\n }\n });\n }\n\n private handleWheel(event: WheelEvent): void {\n if (!event.ctrlKey && !event.metaKey) return;\n event.preventDefault();\n\n const delta = event.deltaY > 0 ? -0.05 : 0.05;\n this.setZoom(this.zoom + delta, {\n clientX: event.clientX,\n clientY: event.clientY\n });\n }\n\n private showDeleteConfirmation(): void {\n const itemCount = this.selectedItems.size;\n const itemType = itemCount === 1 ? 'item' : 'items';\n\n // Create and show confirmation dialog\n const dialog = document.createElement('temba-dialog') as Dialog;\n dialog.header = 'Delete Items';\n dialog.primaryButtonName = 'Delete';\n dialog.cancelButtonName = 'Cancel';\n dialog.destructive = true;\n dialog.innerHTML = `<div style=\"padding: 20px;\">Are you sure you want to delete ${itemCount} ${itemType}?</div>`;\n\n dialog.addEventListener('temba-button-clicked', (event: any) => {\n if (event.detail.button.name === 'Delete') {\n this.deleteSelectedItems();\n dialog.open = false;\n }\n });\n\n // Add to document and show\n document.body.appendChild(dialog);\n dialog.open = true;\n\n // Clean up dialog when closed\n dialog.addEventListener('temba-dialog-hidden', () => {\n document.body.removeChild(dialog);\n });\n }\n\n private performReflow(): void {\n if (!this.definition || this.definition.nodes.length === 0) return;\n\n // Save current positions for discard (nodes + stickies)\n const savedPositions: Record<string, FlowPosition> = {};\n for (const node of this.definition.nodes) {\n const ui = this.definition._ui?.nodes[node.uuid];\n if (ui?.position) {\n savedPositions[node.uuid] = { ...ui.position };\n }\n }\n const stickies = this.definition._ui?.stickies || {};\n for (const [uuid, sticky] of Object.entries(stickies)) {\n if (sticky.position) {\n savedPositions[uuid] = { ...sticky.position };\n }\n }\n this.savedReflowPositions = savedPositions;\n\n // Save old node positions before reflow for sticky proximity calculation\n const oldNodePositions: Record<string, FlowPosition> = {};\n for (const node of this.definition.nodes) {\n const ui = this.definition._ui?.nodes[node.uuid];\n if (ui?.position) {\n oldNodePositions[node.uuid] = { ...ui.position };\n }\n }\n\n // Identify start node (first in sorted array)\n const startNodeUuid = this.definition.nodes[0].uuid;\n\n // Gather node sizes from DOM\n const nodeSizes = new Map<string, { width: number; height: number }>();\n const getNodeSize = (uuid: string): { width: number; height: number } => {\n const element = this.querySelector(`[id=\"${uuid}\"]`) as HTMLElement;\n if (element) {\n const size = {\n width: element.offsetWidth,\n height: element.offsetHeight\n };\n nodeSizes.set(uuid, size);\n return size;\n }\n const fallback = { width: 200, height: 100 };\n nodeSizes.set(uuid, fallback);\n return fallback;\n };\n\n // Compute new layout\n const newPositions = calculateLayeredLayout(\n this.definition.nodes,\n this.definition._ui.nodes,\n startNodeUuid,\n getNodeSize\n );\n\n // Place sticky notes next to their closest nodes\n if (Object.keys(stickies).length > 0) {\n const stickySizes = new Map<string, { width: number; height: number }>();\n for (const uuid of Object.keys(stickies)) {\n const el = this.querySelector(\n `temba-sticky-note[uuid=\"${uuid}\"]`\n ) as HTMLElement;\n if (el) {\n stickySizes.set(uuid, {\n width: el.offsetWidth,\n height: el.offsetHeight\n });\n } else {\n stickySizes.set(uuid, { width: 182, height: 100 });\n }\n }\n\n const stickyPositions = placeStickyNotes(\n stickies,\n oldNodePositions,\n newPositions,\n nodeSizes,\n stickySizes,\n startNodeUuid\n );\n\n // Merge sticky positions into newPositions\n Object.assign(newPositions, stickyPositions);\n }\n\n // Cancel any in-flight save timer so it doesn't persist the reflowed\n // layout before the user has a chance to Save or Discard.\n if (this.saveTimer !== null) {\n clearTimeout(this.saveTimer);\n this.saveTimer = null;\n }\n\n // Suppress the auto-save from this updateCanvasPositions call\n this.reflowPending = true;\n this.reflowUnsaved = true;\n\n // Apply new positions\n getStore().getState().updateCanvasPositions(newPositions);\n\n // Update canvas size and repaint connections\n this.updateCanvasSize();\n requestAnimationFrame(() => {\n this.plumber.repaintEverything();\n });\n\n // Scroll to top-left so the start node is visible\n const editor = this.querySelector('#editor') as HTMLElement;\n if (editor) {\n editor.scrollTo({ left: 0, top: 0, behavior: 'smooth' });\n }\n\n // Start auto-save countdown (duration shared with CSS animation)\n this.clearReflowAutoSaveTimer();\n this.reflowAutoSaveTimer = setTimeout(() => {\n this.reflowAutoSaveTimer = null;\n if (this.reflowUnsaved) {\n this.reflowUnsaved = false;\n this.savedReflowPositions = null;\n this.saveChanges();\n }\n }, REFLOW_AUTO_SAVE_DELAY);\n }\n\n private handleReflowDiscard(): void {\n this.reflowUnsaved = false;\n this.clearReflowAutoSaveTimer();\n\n if (this.savedReflowPositions) {\n // Cancel any pending save timer before reverting\n if (this.saveTimer !== null) {\n clearTimeout(this.saveTimer);\n this.saveTimer = null;\n }\n\n // Suppress the auto-save from reverting positions\n this.reflowPending = true;\n getStore().getState().updateCanvasPositions(this.savedReflowPositions);\n this.savedReflowPositions = null;\n\n // Clear dirty state since we reverted to the saved version\n setTimeout(() => {\n getStore().getState().setDirtyDate(null);\n this.isSaving = false;\n }, 0);\n\n requestAnimationFrame(() => {\n this.plumber.repaintEverything();\n });\n }\n }\n\n private deleteNodes(uuids: string[]): void {\n // Remove nodes from the definition - CanvasNode will handle plumber cleanup\n if (uuids.length > 0) {\n getStore().getState().removeNodes(uuids);\n }\n }\n\n private deleteSelectedItems(): void {\n const nodes = Array.from(this.selectedItems).filter((uuid) =>\n this.definition.nodes.some((node) => node.uuid === uuid)\n );\n this.deleteNodes(Array.from(nodes));\n\n const stickies = Array.from(this.selectedItems).filter(\n (uuid) => this.definition._ui?.stickies?.[uuid]\n );\n\n getStore().getState().removeStickyNotes(stickies);\n\n // Clear selection\n this.selectedItems.clear();\n }\n\n private updateSelectionBox(event: MouseEvent): void {\n if (!this.selectionBox || !this.canvasMouseDown) return;\n\n const canvasRect = this.querySelector('#canvas')?.getBoundingClientRect();\n if (!canvasRect) return;\n\n const relativeX = (event.clientX - canvasRect.left) / this.zoom;\n const relativeY = (event.clientY - canvasRect.top) / this.zoom;\n\n this.selectionBox = {\n ...this.selectionBox,\n endX: relativeX,\n endY: relativeY\n };\n\n // Update selected items based on selection box\n this.updateSelectedItemsFromBox();\n }\n\n private updateSelectedItemsFromBox(): void {\n if (!this.selectionBox) return;\n\n const newSelection = new Set<string>();\n\n const boxLeft = Math.min(this.selectionBox.startX, this.selectionBox.endX);\n const boxTop = Math.min(this.selectionBox.startY, this.selectionBox.endY);\n const boxRight = Math.max(this.selectionBox.startX, this.selectionBox.endX);\n const boxBottom = Math.max(\n this.selectionBox.startY,\n this.selectionBox.endY\n );\n\n // Check nodes\n this.definition?.nodes.forEach((node) => {\n const nodeElement = this.querySelector(\n `[id=\"${node.uuid}\"]`\n ) as HTMLElement;\n if (nodeElement) {\n const position = this.definition._ui?.nodes[node.uuid]?.position;\n if (position) {\n const canvasRect =\n this.querySelector('#canvas')?.getBoundingClientRect();\n\n if (canvasRect) {\n const nodeLeft = position.left;\n const nodeTop = position.top;\n const nodeRight = nodeLeft + nodeElement.offsetWidth;\n const nodeBottom = nodeTop + nodeElement.offsetHeight;\n\n // Check if selection box intersects with node\n if (\n boxLeft < nodeRight &&\n boxRight > nodeLeft &&\n boxTop < nodeBottom &&\n boxBottom > nodeTop\n ) {\n newSelection.add(node.uuid);\n }\n }\n }\n }\n });\n\n // Check sticky notes\n const stickies = this.definition?._ui?.stickies || {};\n Object.entries(stickies).forEach(([uuid, sticky]) => {\n if (sticky.position) {\n const stickyElement = this.querySelector(\n `temba-sticky-note[uuid=\"${uuid}\"]`\n ) as HTMLElement;\n\n if (stickyElement) {\n // Use clientWidth/clientHeight instead of getBoundingClientRect() to get element dimensions\n // This avoids the coordinate system mismatch between viewport and canvas coordinates\n const width = stickyElement.clientWidth;\n const height = stickyElement.clientHeight;\n\n // Use the canvas coordinates from the sticky's position\n const stickyLeft = sticky.position.left;\n const stickyTop = sticky.position.top;\n const stickyRight = stickyLeft + width;\n const stickyBottom = stickyTop + height;\n\n // Check if selection box intersects with sticky\n if (\n boxLeft < stickyRight &&\n boxRight > stickyLeft &&\n boxTop < stickyBottom &&\n boxBottom > stickyTop\n ) {\n newSelection.add(uuid);\n }\n }\n }\n });\n\n this.selectedItems = newSelection;\n }\n\n private renderSelectionBox(): TemplateResult | string {\n if (!this.selectionBox || !this.isSelecting) return '';\n\n const left = Math.min(this.selectionBox.startX, this.selectionBox.endX);\n const top = Math.min(this.selectionBox.startY, this.selectionBox.endY);\n const width = Math.abs(this.selectionBox.endX - this.selectionBox.startX);\n const height = Math.abs(this.selectionBox.endY - this.selectionBox.startY);\n\n return html`<div\n class=\"selection-box\"\n style=\"left: ${left}px; top: ${top}px; width: ${width}px; height: ${height}px;\"\n ></div>`;\n }\n\n private renderCanvasDropPreview(): TemplateResult | string {\n if (!this.canvasDropPreview) return '';\n\n const { action, position } = this.canvasDropPreview;\n const actionConfig = ACTION_CONFIG[action.type];\n\n if (!actionConfig) return '';\n\n return html`<div\n class=\"canvas-drop-preview\"\n style=\"position: absolute; left: ${position.left}px; top: ${position.top}px; opacity: 0.6; pointer-events: none; z-index: 10000;\"\n >\n <div\n class=\"node execute-actions\"\n style=\"outline: 3px dashed var(--color-primary, #3b82f6); outline-offset: 2px; border-radius: var(--curvature);\"\n >\n <div class=\"action sortable ${action.type}\">\n <div class=\"action-content\">\n <div\n class=\"cn-title\"\n style=\"background: ${actionConfig.group\n ? ACTION_GROUP_METADATA[actionConfig.group]?.color\n : '#aaaaaa'}\"\n >\n <div class=\"title-spacer\"></div>\n <div class=\"name\">${actionConfig.name}</div>\n <div class=\"title-spacer\"></div>\n </div>\n <div class=\"body\">\n ${actionConfig.render\n ? actionConfig.render({ actions: [action] } as any, action)\n : html`<pre>${action.type}</pre>`}\n </div>\n </div>\n </div>\n <div class=\"action-exits\">\n <div class=\"exit-wrapper\">\n <div class=\"exit\"></div>\n </div>\n </div>\n </div>\n </div>`;\n }\n\n private renderConnectionPlaceholder(): TemplateResult | string {\n if (!this.connectionPlaceholder || !this.connectionPlaceholder.visible)\n return '';\n\n const { position, dragUp } = this.connectionPlaceholder;\n\n // Render connection line when we have a pending connection (after drop)\n let svgPath = null;\n if (\n this.sourceId &&\n this.dragFromNodeId &&\n this.pendingCanvasConnection &&\n this.connectionSourceX != null &&\n this.connectionSourceY != null\n ) {\n const sourceX = this.connectionSourceX;\n const sourceY = this.connectionSourceY;\n const targetX = position.left + 100;\n // When dragging up, connect to the placeholder bottom; otherwise to the top\n const targetY = dragUp ? position.top + 64 : position.top;\n\n const routeFace: 'top' | 'left' | 'right' = dragUp\n ? targetX < sourceX\n ? 'left'\n : 'right'\n : 'top';\n\n const pathData = calculateFlowchartPath(\n sourceX,\n sourceY,\n targetX,\n targetY,\n 20,\n dragUp ? 0 : 10,\n 5,\n routeFace\n );\n\n const aw = ARROW_HALF_WIDTH;\n const al = ARROW_LENGTH;\n let arrowPoints: string;\n if (dragUp) {\n // Arrow tip pointing up, base at placeholder bottom\n arrowPoints = `${targetX},${targetY - al} ${targetX - aw},${targetY} ${\n targetX + aw\n },${targetY}`;\n } else {\n // Arrow pointing down into top of placeholder\n arrowPoints = `${targetX},${targetY} ${targetX - aw},${targetY - al} ${\n targetX + aw\n },${targetY - al}`;\n }\n\n svgPath = html`\n <svg\n style=\"position: absolute; left: 0; top: 0; width: 100%; height: 100%; pointer-events: none; z-index: 9999;\"\n >\n <path\n d=\"${pathData}\"\n fill=\"none\"\n stroke=\"var(--color-connectors, #ccc)\"\n stroke-width=\"3\"\n />\n <polygon\n points=\"${arrowPoints}\"\n fill=\"var(--color-connectors, #ccc)\"\n />\n </svg>\n `;\n }\n\n return html`${svgPath}\n <div\n class=\"connection-placeholder\"\n style=\"position: absolute; left: ${position.left}px; top: ${position.top}px; opacity: 0.6; pointer-events: none; z-index: 10000;\"\n >\n <div\n class=\"node execute-actions\"\n style=\"outline: 3px dashed var(--color-primary, #3b82f6); outline-offset: 2px; border-radius: var(--curvature); min-width: 200px;\"\n >\n <div class=\"empty-node-placeholder\" style=\"height: 60px;\"></div>\n <div class=\"action-exits\">\n <div class=\"exit-wrapper\">\n <div class=\"exit\"></div>\n </div>\n </div>\n </div>\n </div>`;\n }\n\n /**\n * Checks for node collisions and reflows nodes as needed.\n * Sacred nodes (just moved/dropped) keep their positions while\n * other nodes are moved in the least-disruptive direction.\n */\n private checkCollisionsAndReflow(sacredNodeUuids: string[]): void {\n if (!this.definition) return;\n\n const allBounds: NodeBounds[] = [];\n for (const node of this.definition.nodes) {\n const nodeUI = this.definition._ui?.nodes[node.uuid];\n if (!nodeUI?.position) continue;\n\n const bounds = getNodeBounds(node.uuid, nodeUI.position);\n if (bounds) {\n allBounds.push(bounds);\n }\n }\n\n const reflowPositions = calculateReflowPositions(\n sacredNodeUuids,\n allBounds\n );\n\n if (reflowPositions.size > 0) {\n const positions: { [uuid: string]: FlowPosition } = {};\n for (const [uuid, position] of reflowPositions.entries()) {\n positions[uuid] = position;\n }\n getStore().getState().updateCanvasPositions(positions);\n }\n }\n\n private handleMouseMove(event: MouseEvent): void {\n // Handle selection box drawing\n if (this.canvasMouseDown && !this.isMouseDown) {\n this.isSelecting = true;\n this.updateSelectionBox(event);\n this.requestUpdate(); // Force re-render\n return;\n }\n\n if (this.plumber.connectionDragging) {\n const targetNode = document.querySelector('temba-flow-node:hover');\n\n // Clear previous target styles\n document.querySelectorAll('temba-flow-node').forEach((node) => {\n node.classList.remove(\n 'connection-target-valid',\n 'connection-target-invalid'\n );\n });\n\n if (targetNode) {\n this.targetId = targetNode.getAttribute('uuid');\n // Check if target is different from source node (prevent self-targeting)\n this.isValidTarget = this.targetId !== this.dragFromNodeId;\n\n // Apply visual feedback based on validity\n if (this.isValidTarget) {\n targetNode.classList.add('connection-target-valid');\n } else {\n targetNode.classList.add('connection-target-invalid');\n }\n\n // Hide connection placeholder when over a node\n this.connectionPlaceholder = null;\n } else {\n this.targetId = null;\n this.isValidTarget = true;\n\n // Show connection placeholder when over empty canvas\n const canvas = this.querySelector('#canvas');\n if (canvas) {\n const canvasRect = canvas.getBoundingClientRect();\n const relativeX = (event.clientX - canvasRect.left) / this.zoom;\n const relativeY = (event.clientY - canvasRect.top) / this.zoom;\n\n const placeholderWidth = 200;\n const placeholderHeight = 64;\n const arrowLength = ARROW_LENGTH;\n const cursorGap = CURSOR_GAP;\n\n // Determine if cursor is above the source exit using stored sourceY\n const dragUp =\n this.connectionSourceY != null\n ? relativeY < this.connectionSourceY\n : false;\n\n let top: number;\n if (dragUp) {\n // Arrow points up: tip at cy + cursorGap.\n // Placeholder bottom should sit just above the arrow tip.\n top = relativeY + cursorGap - placeholderHeight;\n } else {\n // Arrow points down: tip at cy - cursorGap + arrowLength.\n // Placeholder top sits just below the arrow tip.\n top = relativeY - cursorGap + arrowLength;\n }\n\n this.connectionPlaceholder = {\n position: {\n left: relativeX - placeholderWidth / 2,\n top\n },\n visible: true,\n dragUp\n };\n }\n }\n\n // Force update to show/hide placeholder\n this.requestUpdate();\n }\n\n // Handle item dragging\n if (!this.isMouseDown || !this.currentDragItem) return;\n\n this.lastMouseEvent = event;\n\n const deltaX = event.clientX - this.dragStartPos.x + this.autoScrollDeltaX;\n const deltaY = event.clientY - this.dragStartPos.y + this.autoScrollDeltaY;\n const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n\n // Only start dragging if we've moved beyond the threshold\n if (!this.isDragging && distance > DRAG_THRESHOLD) {\n this.isDragging = true;\n this.startAutoScroll();\n }\n\n // If we're actually dragging, update positions\n if (this.isDragging) {\n this.updateDragPositions();\n }\n }\n\n private updateDragPositions(): void {\n if (!this.currentDragItem || !this.lastMouseEvent) return;\n\n // Convert screen + scroll delta to canvas delta\n const deltaX =\n (this.lastMouseEvent.clientX -\n this.dragStartPos.x +\n this.autoScrollDeltaX) /\n this.zoom;\n const deltaY =\n (this.lastMouseEvent.clientY -\n this.dragStartPos.y +\n this.autoScrollDeltaY) /\n this.zoom;\n\n const itemsToMove =\n this.selectedItems.has(this.currentDragItem.uuid) &&\n this.selectedItems.size > 1\n ? Array.from(this.selectedItems)\n : [this.currentDragItem.uuid];\n\n itemsToMove.forEach((uuid) => {\n const element = this.querySelector(`[uuid=\"${uuid}\"]`) as HTMLElement;\n if (element) {\n const type = element.tagName === 'TEMBA-FLOW-NODE' ? 'node' : 'sticky';\n const position = this.getPosition(uuid, type);\n\n if (position) {\n element.style.left = `${position.left + deltaX}px`;\n element.style.top = `${position.top + deltaY}px`;\n element.classList.add('dragging');\n }\n }\n });\n\n this.plumber.revalidate(itemsToMove);\n }\n\n private startAutoScroll(): void {\n if (this.autoScrollAnimationId !== null) return;\n\n const editor = this.querySelector('#editor') as HTMLElement;\n if (!editor) return;\n\n const tick = () => {\n if (!this.isDragging || !this.lastMouseEvent) {\n this.autoScrollAnimationId = null;\n return;\n }\n\n const editorRect = editor.getBoundingClientRect();\n const mouseX = this.lastMouseEvent.clientX;\n const mouseY = this.lastMouseEvent.clientY;\n\n let scrollDx = 0;\n let scrollDy = 0;\n\n // Left edge\n const distFromLeft = mouseX - editorRect.left;\n if (distFromLeft >= 0 && distFromLeft < AUTO_SCROLL_EDGE_ZONE) {\n const ratio = 1 - distFromLeft / AUTO_SCROLL_EDGE_ZONE;\n scrollDx = -(ratio * AUTO_SCROLL_MAX_SPEED);\n }\n\n // Right edge\n const distFromRight = editorRect.right - mouseX;\n if (distFromRight >= 0 && distFromRight < AUTO_SCROLL_EDGE_ZONE) {\n const ratio = 1 - distFromRight / AUTO_SCROLL_EDGE_ZONE;\n scrollDx = ratio * AUTO_SCROLL_MAX_SPEED;\n }\n\n // Top edge\n const distFromTop = mouseY - editorRect.top;\n if (distFromTop >= 0 && distFromTop < AUTO_SCROLL_EDGE_ZONE) {\n const ratio = 1 - distFromTop / AUTO_SCROLL_EDGE_ZONE;\n scrollDy = -(ratio * AUTO_SCROLL_MAX_SPEED);\n }\n\n // Bottom edge\n const distFromBottom = editorRect.bottom - mouseY;\n if (distFromBottom >= 0 && distFromBottom < AUTO_SCROLL_EDGE_ZONE) {\n const ratio = 1 - distFromBottom / AUTO_SCROLL_EDGE_ZONE;\n scrollDy = ratio * AUTO_SCROLL_MAX_SPEED;\n }\n\n if (scrollDx !== 0 || scrollDy !== 0) {\n const beforeScrollLeft = editor.scrollLeft;\n const beforeScrollTop = editor.scrollTop;\n\n // Expand canvas if scrolling toward bottom/right edges\n // Convert from scroll space to canvas space for expandCanvas\n if (scrollDx > 0 || scrollDy > 0) {\n const neededWidth =\n (editor.scrollLeft + editor.clientWidth + scrollDx) / this.zoom;\n const neededHeight =\n (editor.scrollTop + editor.clientHeight + scrollDy) / this.zoom;\n getStore().getState().expandCanvas(neededWidth, neededHeight);\n }\n\n editor.scrollLeft += scrollDx;\n editor.scrollTop += scrollDy;\n\n // Track actual scroll delta (browser clamps at boundaries)\n const actualDx = editor.scrollLeft - beforeScrollLeft;\n const actualDy = editor.scrollTop - beforeScrollTop;\n this.autoScrollDeltaX += actualDx;\n this.autoScrollDeltaY += actualDy;\n\n if (actualDx !== 0 || actualDy !== 0) {\n this.updateDragPositions();\n }\n }\n\n this.autoScrollAnimationId = requestAnimationFrame(tick);\n };\n\n this.autoScrollAnimationId = requestAnimationFrame(tick);\n }\n\n private stopAutoScroll(): void {\n if (this.autoScrollAnimationId !== null) {\n cancelAnimationFrame(this.autoScrollAnimationId);\n this.autoScrollAnimationId = null;\n }\n }\n\n private handleMouseUp(event: MouseEvent): void {\n // Handle selection box completion\n if (this.canvasMouseDown && this.isSelecting) {\n this.isSelecting = false;\n this.selectionBox = null;\n this.canvasMouseDown = false;\n this.requestUpdate();\n return;\n }\n\n // Handle canvas click (clear selection)\n if (this.canvasMouseDown && !this.isSelecting) {\n this.canvasMouseDown = false;\n return;\n }\n\n // Handle item drag completion\n if (!this.isMouseDown || !this.currentDragItem) return;\n\n this.stopAutoScroll();\n\n // If we were actually dragging, handle the drag end\n if (this.isDragging) {\n // Convert screen + scroll delta to canvas delta\n const deltaX =\n (event.clientX - this.dragStartPos.x + this.autoScrollDeltaX) /\n this.zoom;\n const deltaY =\n (event.clientY - this.dragStartPos.y + this.autoScrollDeltaY) /\n this.zoom;\n\n // Determine what items were moved\n const itemsToMove =\n this.selectedItems.has(this.currentDragItem.uuid) &&\n this.selectedItems.size > 1\n ? Array.from(this.selectedItems)\n : [this.currentDragItem.uuid];\n\n // Update positions for all moved items\n const newPositions: { [uuid: string]: FlowPosition } = {};\n\n itemsToMove.forEach((uuid) => {\n const type = this.definition.nodes.find((node) => node.uuid === uuid)\n ? 'node'\n : 'sticky';\n const position = this.getPosition(uuid, type);\n\n if (position) {\n const newLeft = position.left + deltaX;\n const newTop = position.top + deltaY;\n\n // Snap to 20px grid for final position\n const snappedLeft = snapToGrid(newLeft);\n const snappedTop = snapToGrid(newTop);\n\n const newPosition = { left: snappedLeft, top: snappedTop };\n newPositions[uuid] = newPosition;\n\n // Remove dragging class\n const element = this.querySelector(`[uuid=\"${uuid}\"]`) as HTMLElement;\n if (element) {\n element.classList.remove('dragging');\n element.style.left = `${snappedLeft}px`;\n element.style.top = `${snappedTop}px`;\n }\n }\n });\n\n if (Object.keys(newPositions).length > 0) {\n getStore().getState().updateCanvasPositions(newPositions);\n\n // Check for collisions and reflow nodes after updating positions\n // Filter to only check nodes (not stickies)\n const nodeUuids = itemsToMove.filter((uuid) =>\n this.definition.nodes.find((node) => node.uuid === uuid)\n );\n\n if (nodeUuids.length > 0) {\n // Allow DOM to update before checking collisions\n setTimeout(() => {\n this.checkCollisionsAndReflow(nodeUuids);\n }, 0);\n } else {\n // No nodes moved, just repaint connections\n setTimeout(() => {\n this.plumber.repaintEverything();\n }, 0);\n }\n }\n\n this.selectedItems.clear();\n }\n\n // Reset all drag state\n this.isDragging = false;\n this.isMouseDown = false;\n this.currentDragItem = null;\n this.canvasMouseDown = false;\n this.autoScrollDeltaX = 0;\n this.autoScrollDeltaY = 0;\n this.lastMouseEvent = null;\n }\n\n private updateCanvasSize(): void {\n if (!this.definition) return;\n\n const store = getStore();\n if (!store) return;\n\n // Calculate required canvas size based on all elements\n let maxWidth = 0;\n let maxHeight = 0;\n\n // Check node positions\n this.definition.nodes.forEach((node) => {\n const ui = this.definition._ui.nodes[node.uuid];\n if (ui && ui.position) {\n const nodeElement = this.querySelector(\n `[id=\"${node.uuid}\"]`\n ) as HTMLElement;\n if (nodeElement) {\n // Use offsetWidth/offsetHeight (unaffected by ancestor transforms)\n maxWidth = Math.max(\n maxWidth,\n ui.position.left + nodeElement.offsetWidth\n );\n maxHeight = Math.max(\n maxHeight,\n ui.position.top + nodeElement.offsetHeight\n );\n }\n }\n });\n\n // Check sticky note positions\n const stickies = this.definition._ui?.stickies || {};\n Object.entries(stickies).forEach(([uuid, sticky]) => {\n if (sticky.position) {\n const stickyElement = this.querySelector(\n `temba-sticky-note[uuid=\"${uuid}\"]`\n ) as HTMLElement;\n if (stickyElement) {\n // Use clientWidth/clientHeight instead of getBoundingClientRect() to get element dimensions\n // This avoids the coordinate system mismatch between viewport and canvas coordinates\n const width = stickyElement.clientWidth;\n const height = stickyElement.clientHeight;\n\n // Both sticky.position and width/height are now in the same coordinate system\n maxWidth = Math.max(maxWidth, sticky.position.left + width);\n maxHeight = Math.max(maxHeight, sticky.position.top + height);\n } else {\n // Fallback to default sizes if element not found\n maxWidth = Math.max(maxWidth, sticky.position.left + 200);\n maxHeight = Math.max(maxHeight, sticky.position.top + 100);\n }\n }\n });\n\n // Update canvas size in store\n store.getState().expandCanvas(maxWidth, maxHeight);\n }\n\n private handleCanvasContextMenu(event: MouseEvent): void {\n if (this.isReadOnly()) {\n event.preventDefault();\n return;\n }\n\n // Check if we right-clicked on empty canvas space\n const target = event.target as HTMLElement;\n if (target.id !== 'canvas') {\n return;\n }\n\n // Prevent the default browser context menu\n event.preventDefault();\n event.stopPropagation();\n\n // Get canvas position\n const canvas = this.querySelector('#canvas');\n if (!canvas) {\n return;\n }\n\n const canvasRect = canvas.getBoundingClientRect();\n const relativeX = (event.clientX - canvasRect.left) / this.zoom - 10;\n const relativeY = (event.clientY - canvasRect.top) / this.zoom - 10;\n\n // Snap position to grid\n const snappedLeft = snapToGrid(relativeX);\n const snappedTop = snapToGrid(relativeY);\n\n // Show the canvas menu at the mouse position (use viewport coordinates)\n const canvasMenu = this.querySelector('temba-canvas-menu') as CanvasMenu;\n if (canvasMenu) {\n const hasNodes = this.definition && this.definition.nodes.length > 0;\n canvasMenu.show(\n event.clientX,\n event.clientY,\n {\n x: snappedLeft,\n y: snappedTop\n },\n true,\n hasNodes,\n this.flowType === 'message'\n );\n }\n }\n\n private handleEmptyFlowClick(event: MouseEvent): void {\n const editor = this.querySelector('#editor') as HTMLElement;\n if (!editor) return;\n\n // Scroll to top-left\n editor.scrollTo({ left: 0, top: 0, behavior: 'smooth' });\n\n // Place node at top-left of the canvas\n const nodeLeft = 0;\n const nodeTop = 0;\n\n const canvasMenu = this.querySelector('temba-canvas-menu') as CanvasMenu;\n if (canvasMenu) {\n const button = event.currentTarget as HTMLElement;\n const rect = button.getBoundingClientRect();\n const menuWidth = 265;\n const menuX = rect.left + rect.width / 2 - menuWidth / 2;\n const menuY = rect.bottom + 8;\n canvasMenu.show(\n menuX,\n menuY,\n { x: nodeLeft, y: nodeTop },\n false,\n false,\n this.flowType === 'message'\n );\n }\n }\n\n private handleCanvasMenuSelection(event: CustomEvent): void {\n const selection = event.detail as CanvasMenuSelection;\n const store = getStore();\n\n if (selection.action === 'reflow') {\n this.performReflow();\n return;\n }\n\n if (selection.action === 'sticky') {\n // Create new sticky note\n store.getState().createStickyNote({\n left: selection.position.x,\n top: selection.position.y\n });\n // Clear all pending connection state and placeholder\n this.pendingCanvasConnection = null;\n this.connectionPlaceholder = null;\n this.sourceId = null;\n this.connectionSourceX = null;\n this.connectionSourceY = null;\n this.dragFromNodeId = null;\n } else if (\n selection.action === 'send_msg' ||\n selection.action === 'wait_for_response'\n ) {\n // Go directly to the node editor (skip node type selector)\n this.handleNodeTypeSelection(\n new CustomEvent(CustomEventType.Selection, {\n detail: {\n nodeType: selection.action,\n position: selection.position\n } as NodeTypeSelection\n })\n );\n } else {\n // Show node type selector\n const selector = this.querySelector(\n 'temba-node-type-selector'\n ) as NodeTypeSelector;\n if (selector) {\n selector.show(selection.action, selection.position);\n }\n // Note: we don't clear pendingCanvasConnection or placeholder here,\n // they will be used in handleNodeTypeSelection\n }\n }\n\n private cleanUpConnection(): void {\n if (this.isCreatingNewNode) {\n this.isCreatingNewNode = false;\n this.pendingNodePosition = null;\n }\n\n // see if we need to put our connection back\n if (this.originalConnectionTargetId) {\n this.plumber.connectIds(\n this.dragFromNodeId,\n this.sourceId,\n this.originalConnectionTargetId\n );\n this.originalConnectionTargetId = null;\n }\n\n // Menu closed without selection - clear placeholder and pending connection\n if (this.pendingCanvasConnection) {\n this.pendingCanvasConnection = null;\n this.connectionPlaceholder = null;\n this.sourceId = null;\n this.connectionSourceX = null;\n this.connectionSourceY = null;\n this.dragFromNodeId = null;\n this.originalConnectionTargetId = null;\n }\n }\n\n private handleCanvasMenuClosed(): void {\n this.cleanUpConnection();\n }\n\n private handleNodeTypeSelectorClosed(): void {\n this.cleanUpConnection();\n }\n\n private handleNodeTypeSelection(event: CustomEvent): void {\n const selection = event.detail as NodeTypeSelection;\n\n // Check if we have a pending canvas connection (from dropping on empty canvas)\n if (this.pendingCanvasConnection) {\n // Don't clear the placeholder yet - keep it visible while editing\n // The position is already stored in pendingCanvasConnection\n // Fall through to normal node creation flow below\n }\n\n // Check if we're adding an action to an existing node\n if (this.addActionToNodeUuid) {\n // Find the existing node\n const node = this.definition.nodes.find(\n (n) => n.uuid === this.addActionToNodeUuid\n );\n const nodeUI = this.definition._ui.nodes[this.addActionToNodeUuid];\n\n if (node && nodeUI) {\n // Create a new action to add to the existing node\n const actionUuid = generateUUID();\n this.editingAction = {\n uuid: actionUuid,\n type: selection.nodeType as any\n } as Action;\n\n // Set the editing node to the existing node (not creating new)\n this.editingNode = node;\n this.editingNodeUI = nodeUI;\n this.isCreatingNewNode = false;\n\n // Clear the addActionToNodeUuid flag\n this.addActionToNodeUuid = null;\n\n return;\n }\n\n // If we couldn't find the node, clear the flag and continue with normal flow\n this.addActionToNodeUuid = null;\n }\n\n // Create a temporary node structure for editing (not added to store yet)\n const nodeUuid = generateUUID();\n\n // Determine if this is an action type or a node type\n // Actions need to be wrapped in an execute_actions node\n const isActionType = selection.nodeType in ACTION_CONFIG;\n const nodeType = isActionType ? 'execute_actions' : selection.nodeType;\n\n // For nodes with routers, initialize an empty router to ensure fromFormData works correctly\n const nodeConfig = NODE_CONFIG[nodeType];\n const hasRouter =\n nodeConfig?.form &&\n Object.keys(nodeConfig.form).some(\n (key) =>\n ['rules', 'categories', 'cases'].includes(key) ||\n nodeConfig.form[key]?.type === 'array'\n );\n\n const tempNode: Node = {\n uuid: nodeUuid,\n actions: [],\n exits: hasRouter\n ? [] // Router-based nodes will generate their own exits\n : [\n {\n uuid: generateUUID(),\n destination_uuid: null\n }\n ]\n };\n\n if (hasRouter) {\n // This node uses a router - initialize it with empty structure\n tempNode.router = {\n type: 'switch',\n categories: [],\n cases: [],\n operand: '@input.text',\n default_category_uuid: undefined\n };\n }\n\n const tempNodeUI: NodeUI = {\n position: this.pendingCanvasConnection\n ? this.pendingCanvasConnection.position\n : {\n left: selection.position.x,\n top: selection.position.y\n },\n type: nodeType as any,\n config: {}\n };\n\n // Mark that we're creating a new node and store the position\n this.isCreatingNewNode = true;\n this.pendingNodePosition = this.pendingCanvasConnection\n ? this.pendingCanvasConnection.position\n : {\n left: selection.position.x,\n top: selection.position.y\n };\n\n // Open the node editor with the temporary node\n this.editingNode = tempNode;\n this.editingNodeUI = tempNodeUI;\n\n // If this is an action type, we also need to set up an editing action\n if (isActionType) {\n const actionUuid = generateUUID();\n this.editingAction = {\n uuid: actionUuid,\n type: selection.nodeType as any\n } as Action;\n }\n }\n\n private handleActionEditRequested(event: CustomEvent): void {\n // For action editing, we set the action and find the corresponding node\n this.editingAction = event.detail.action;\n this.dialogOrigin =\n event.detail.originX != null\n ? { x: event.detail.originX, y: event.detail.originY }\n : null;\n\n // Find the node that contains this action\n const nodeUuid = event.detail.nodeUuid;\n const node = this.definition.nodes.find((n) => n.uuid === nodeUuid);\n\n if (node) {\n this.editingNode = node;\n this.editingNodeUI = this.definition._ui.nodes[nodeUuid];\n }\n }\n\n private handleAddActionRequested(event: CustomEvent): void {\n // Get the node where we want to add the action\n const nodeUuid = event.detail.nodeUuid;\n const node = this.definition.nodes.find((n) => n.uuid === nodeUuid);\n\n if (!node) {\n return;\n }\n\n // Get the node's position to place the selector near it\n const nodeUI = this.definition._ui.nodes[nodeUuid];\n if (!nodeUI) {\n return;\n }\n\n // Show the node type selector in action mode, excluding branching actions\n const selector = this.querySelector(\n 'temba-node-type-selector'\n ) as NodeTypeSelector;\n if (selector) {\n // Show the selector near the node, using a mode that excludes branching actions\n selector.show('action-no-branching', {\n x: nodeUI.position.left,\n y: nodeUI.position.top\n });\n\n // Store the node UUID so we know which node to add the action to\n this.addActionToNodeUuid = nodeUuid;\n }\n }\n\n private handleNodeEditRequested(event: CustomEvent): void {\n this.editingNode = event.detail.node;\n this.editingNodeUI = event.detail.nodeUI;\n this.dialogOrigin =\n event.detail.originX != null\n ? { x: event.detail.originX, y: event.detail.originY }\n : null;\n }\n\n private handleNodeDeleted(event: CustomEvent): void {\n const nodeUuid = event.detail.uuid;\n if (nodeUuid) {\n this.deleteNodes([nodeUuid]);\n }\n }\n\n private handleActionSaved(updatedAction: Action): void {\n if (this.editingNode && this.editingAction) {\n let updatedActions: Action[];\n\n // Check if this action already exists in the node\n const existingActionIndex = this.editingNode.actions.findIndex(\n (action) => action.uuid === this.editingAction.uuid\n );\n\n if (existingActionIndex >= 0) {\n // Update existing action\n updatedActions = this.editingNode.actions.map((action) =>\n action.uuid === this.editingAction.uuid ? updatedAction : action\n );\n } else {\n // Add new action\n updatedActions = [...this.editingNode.actions, updatedAction];\n }\n\n const updatedNode = { ...this.editingNode, actions: updatedActions };\n\n // Check if we're creating a new node or updating an existing one\n if (this.isCreatingNewNode) {\n // This is a new node with a new action - add it to the store\n const store = getStore();\n\n const nodeUI: NodeUI = {\n position: this.pendingNodePosition || { left: 0, top: 0 },\n type: this.editingNodeUI?.type,\n config: {}\n };\n\n // Add the node to the store\n store.getState().addNode(updatedNode, nodeUI);\n\n // If we have a pending canvas connection, connect it to this new node\n if (this.pendingCanvasConnection) {\n store\n .getState()\n .updateConnection(\n this.pendingCanvasConnection.fromNodeId,\n this.pendingCanvasConnection.exitId,\n updatedNode.uuid\n );\n\n // Clear the pending connection and placeholder\n this.pendingCanvasConnection = null;\n this.connectionPlaceholder = null;\n this.sourceId = null;\n this.connectionSourceX = null;\n this.connectionSourceY = null;\n this.dragFromNodeId = null;\n }\n\n // Reset the creation flags\n this.isCreatingNewNode = false;\n this.pendingNodePosition = null;\n\n // Check for collisions and reflow\n requestAnimationFrame(() => {\n this.checkCollisionsAndReflow([updatedNode.uuid]);\n });\n } else {\n const uuid = this.editingNode.uuid;\n // Update existing node in the store\n getStore()?.getState().updateNode(uuid, updatedNode);\n\n // Check for collisions and reflow in case node size changed\n requestAnimationFrame(() => {\n this.checkCollisionsAndReflow([uuid]);\n });\n }\n }\n this.closeNodeEditor();\n }\n\n private closeNodeEditor(): void {\n this.editingNode = null;\n this.editingNodeUI = null;\n this.editingAction = null;\n this.dialogOrigin = null;\n }\n\n private handleActionEditCanceled(): void {\n // If we were creating a new node, just discard it\n this.cleanUpConnection();\n this.closeNodeEditor();\n }\n\n private handleNodeSaved(\n updatedNode: Node,\n uiConfig?: Record<string, any>\n ): void {\n if (this.editingNode) {\n if (this.isCreatingNewNode) {\n // This is a new node - add it to the store for the first time\n const store = getStore();\n\n const nodeUI: NodeUI = {\n position: this.pendingNodePosition || { left: 0, top: 0 },\n type: this.editingNodeUI?.type,\n config: uiConfig || {}\n };\n\n // Add the node to the store\n store.getState().addNode(updatedNode, nodeUI);\n\n // If we have a pending canvas connection, connect it to this new node\n if (this.pendingCanvasConnection) {\n store\n .getState()\n .updateConnection(\n this.pendingCanvasConnection.fromNodeId,\n this.pendingCanvasConnection.exitId,\n updatedNode.uuid\n );\n\n // Clear the pending connection and placeholder\n this.pendingCanvasConnection = null;\n this.connectionPlaceholder = null;\n this.sourceId = null;\n this.connectionSourceX = null;\n this.connectionSourceY = null;\n this.dragFromNodeId = null;\n }\n\n // Reset the creation flags\n this.isCreatingNewNode = false;\n this.pendingNodePosition = null;\n\n // Check for collisions and reflow\n requestAnimationFrame(() => {\n this.checkCollisionsAndReflow([updatedNode.uuid]);\n });\n } else {\n // This is an existing node - update it\n // Clean up jsPlumb connections for removed exits before updating the node\n if (this.plumber) {\n const oldExits = this.editingNode.exits || [];\n const newExits = updatedNode.exits || [];\n\n // Find exits that were removed\n const removedExits = oldExits.filter(\n (oldExit) =>\n !newExits.find((newExit) => newExit.uuid === oldExit.uuid)\n );\n\n // Remove jsPlumb connections for removed exits\n removedExits.forEach((exit) => {\n this.plumber.removeExitConnection(exit.uuid);\n });\n }\n\n this.plumber.revalidate([updatedNode.uuid]);\n\n // Update the node in the store\n getStore()?.getState().updateNode(this.editingNode.uuid, updatedNode);\n\n // Update the UI config if provided\n if (uiConfig) {\n getStore()?.getState().updateNodeUIConfig(updatedNode.uuid, uiConfig);\n }\n\n // Check for collisions and reflow in case node size changed\n const nodeUuid = updatedNode.uuid;\n requestAnimationFrame(() => {\n this.checkCollisionsAndReflow([nodeUuid]);\n });\n }\n }\n this.closeNodeEditor();\n }\n\n private handleNodeEditCanceled(): void {\n this.cleanUpConnection();\n this.closeNodeEditor();\n }\n\n private getNodeAtPosition(mouseX: number, mouseY: number): string | null {\n // Get all node elements\n const nodeElements = this.querySelectorAll('temba-flow-node');\n\n for (const nodeElement of Array.from(nodeElements)) {\n const rect = nodeElement.getBoundingClientRect();\n\n if (\n mouseX >= rect.left &&\n mouseX <= rect.right &&\n mouseY >= rect.top &&\n mouseY <= rect.bottom\n ) {\n return nodeElement.getAttribute('data-node-uuid');\n }\n }\n\n return null;\n }\n\n private calculateCanvasDropPosition(\n mouseX: number,\n mouseY: number,\n applyGridSnapping: boolean = true\n ): FlowPosition {\n // calculate the position on the canvas\n const canvas = this.querySelector('#canvas');\n if (!canvas) return { left: 0, top: 0 };\n\n const canvasRect = canvas.getBoundingClientRect();\n\n // Convert viewport coordinates to canvas coordinates, accounting for zoom\n const left = (mouseX - canvasRect.left) / this.zoom - DROP_PREVIEW_OFFSET_X;\n const top = (mouseY - canvasRect.top) / this.zoom - DROP_PREVIEW_OFFSET_Y;\n\n // Apply grid snapping only if requested (for final drop position)\n if (applyGridSnapping) {\n return {\n left: snapToGrid(left),\n top: snapToGrid(top)\n };\n }\n\n return { left, top };\n }\n\n private handleActionDragExternal(event: CustomEvent): void {\n const {\n action,\n nodeUuid,\n actionIndex,\n mouseX,\n mouseY,\n actionHeight = 60,\n isLastAction = false\n } = event.detail;\n\n // Check if mouse is over another execute_actions node\n const targetNode = this.getNodeAtPosition(mouseX, mouseY);\n\n if (targetNode && targetNode !== nodeUuid) {\n const targetNodeUI = this.definition._ui.nodes[targetNode];\n const targetNodeDef = this.definition.nodes.find(\n (n) => n.uuid === targetNode\n );\n\n // Only allow dropping on execute_actions nodes, and not the source node\n if (targetNodeUI?.type === 'execute_actions' && targetNodeDef) {\n // If we moved to a different target node, clear the previous one's placeholder\n if (\n this.previousActionDragTargetNodeUuid &&\n this.previousActionDragTargetNodeUuid !== targetNode\n ) {\n const previousElement = this.querySelector(\n `temba-flow-node[data-node-uuid=\"${this.previousActionDragTargetNodeUuid}\"]`\n );\n if (previousElement) {\n previousElement.dispatchEvent(\n new CustomEvent('action-drag-leave', {\n detail: {},\n bubbles: false\n })\n );\n }\n }\n\n // Update target node for drop handling\n this.actionDragTargetNodeUuid = targetNode;\n this.previousActionDragTargetNodeUuid = targetNode;\n\n // Hide canvas preview when over a valid target\n this.canvasDropPreview = null;\n\n // Tell source node to show ghost (we're over a valid target)\n const sourceElement = this.querySelector(\n `temba-flow-node[data-node-uuid=\"${nodeUuid}\"]`\n );\n if (sourceElement) {\n sourceElement.dispatchEvent(\n new CustomEvent('action-show-ghost', {\n detail: {},\n bubbles: false\n })\n );\n }\n\n // Notify the target node about the drag\n const targetElement = this.querySelector(\n `temba-flow-node[data-node-uuid=\"${targetNode}\"]`\n );\n if (targetElement) {\n targetElement.dispatchEvent(\n new CustomEvent('action-drag-over', {\n detail: {\n action,\n sourceNodeUuid: nodeUuid,\n actionIndex,\n mouseX,\n mouseY,\n actionHeight\n },\n bubbles: false\n })\n );\n }\n\n this.requestUpdate();\n return;\n }\n }\n\n // Not over a valid target node, clear any previous target's placeholder\n if (this.previousActionDragTargetNodeUuid) {\n const previousElement = this.querySelector(\n `temba-flow-node[data-node-uuid=\"${this.previousActionDragTargetNodeUuid}\"]`\n );\n if (previousElement) {\n previousElement.dispatchEvent(\n new CustomEvent('action-drag-leave', {\n detail: {},\n bubbles: false\n })\n );\n }\n this.previousActionDragTargetNodeUuid = null;\n }\n\n this.actionDragTargetNodeUuid = null;\n\n const sourceElement = this.querySelector(\n `temba-flow-node[data-node-uuid=\"${nodeUuid}\"]`\n );\n\n // Show canvas drop preview only if this is NOT the last action\n // Last actions can only be dropped on other nodes, not on canvas\n if (!isLastAction) {\n // Hide ghost when showing canvas preview (for canvas drops)\n if (sourceElement) {\n sourceElement.dispatchEvent(\n new CustomEvent('action-hide-ghost', {\n detail: {},\n bubbles: false\n })\n );\n }\n\n // Don't snap to grid for preview - let it follow cursor smoothly\n const position = this.calculateCanvasDropPosition(mouseX, mouseY, false);\n\n this.canvasDropPreview = {\n action,\n nodeUuid,\n actionIndex,\n position,\n actionHeight\n };\n } else {\n // For last action, keep ghost visible (can't drop on canvas)\n if (sourceElement) {\n sourceElement.dispatchEvent(\n new CustomEvent('action-show-ghost', {\n detail: {},\n bubbles: false\n })\n );\n }\n\n // Clear any existing preview for last action\n this.canvasDropPreview = null;\n }\n\n // Force re-render to update preview position\n this.requestUpdate();\n }\n\n private handleActionDragInternal(_event: CustomEvent): void {\n // Clear any previous target's placeholder when returning to internal drag\n if (this.previousActionDragTargetNodeUuid) {\n const previousElement = this.querySelector(\n `temba-flow-node[data-node-uuid=\"${this.previousActionDragTargetNodeUuid}\"]`\n );\n if (previousElement) {\n previousElement.dispatchEvent(\n new CustomEvent('action-drag-leave', {\n detail: {},\n bubbles: false\n })\n );\n }\n this.previousActionDragTargetNodeUuid = null;\n }\n\n this.canvasDropPreview = null;\n this.actionDragTargetNodeUuid = null;\n }\n\n private handleActionDropExternal(event: CustomEvent): void {\n const {\n action,\n nodeUuid,\n actionIndex,\n mouseX,\n mouseY,\n isLastAction = false\n } = event.detail;\n\n // Check if we're dropping on an existing execute_actions node\n const targetNodeUuid = this.actionDragTargetNodeUuid;\n\n if (targetNodeUuid && targetNodeUuid !== nodeUuid) {\n // Dropping on another node - notify the target node to handle the drop\n const targetElement = this.querySelector(\n `temba-flow-node[data-node-uuid=\"${targetNodeUuid}\"]`\n );\n if (targetElement) {\n targetElement.dispatchEvent(\n new CustomEvent('action-drop', {\n detail: {\n action,\n sourceNodeUuid: nodeUuid,\n actionIndex,\n mouseX,\n mouseY\n },\n bubbles: false\n })\n );\n }\n\n // Clear state\n this.canvasDropPreview = null;\n this.actionDragTargetNodeUuid = null;\n return;\n }\n\n // If this is the last action and we're not dropping on another node, do nothing\n // Last actions can only be moved to other nodes, not dropped on canvas\n if (isLastAction) {\n this.canvasDropPreview = null;\n this.actionDragTargetNodeUuid = null;\n return;\n }\n\n // Not dropping on another node, create a new one on canvas\n // Snap to grid for the final drop position\n const position = this.calculateCanvasDropPosition(mouseX, mouseY, true);\n\n // remove the action from the original node\n const originalNode = this.definition.nodes.find((n) => n.uuid === nodeUuid);\n if (!originalNode) return;\n\n const updatedActions = originalNode.actions.filter(\n (_a, idx) => idx !== actionIndex\n );\n\n // if no actions remain, delete the node\n if (updatedActions.length === 0) {\n // Use deleteNodes to properly clean up Plumber connections before removing\n this.deleteNodes([nodeUuid]);\n } else {\n // update the node\n const updatedNode = { ...originalNode, actions: updatedActions };\n getStore()?.getState().updateNode(nodeUuid, updatedNode);\n }\n\n // create a new execute_actions node with the dropped action\n const newNode: Node = {\n uuid: generateUUID(),\n actions: [action],\n exits: [\n {\n uuid: generateUUID(),\n destination_uuid: null\n }\n ]\n };\n\n const newNodeUI: NodeUI = {\n position,\n type: 'execute_actions',\n config: {}\n };\n\n // add the new node\n getStore()?.getState().addNode(newNode, newNodeUI);\n\n // clear the preview\n this.canvasDropPreview = null;\n this.actionDragTargetNodeUuid = null;\n\n // Check for collisions and reflow after adding new node\n requestAnimationFrame(() => {\n this.checkCollisionsAndReflow([newNode.uuid]);\n });\n }\n\n private getLocalizationLanguages(): Array<{ code: string; name: string }> {\n if (!this.definition) {\n return [];\n }\n\n const baseLanguage = this.definition.language;\n return this.getAvailableLanguages().filter(\n (lang) => lang.code !== baseLanguage\n );\n }\n\n private getLocalizationProgress(languageCode: string): {\n total: number;\n localized: number;\n } {\n if (\n !this.definition ||\n !languageCode ||\n languageCode === this.definition.language\n ) {\n return { total: 0, localized: 0 };\n }\n\n const bundles = this.buildTranslationBundles(\n this.translationFilters.categories,\n languageCode\n );\n return this.getTranslationCounts(bundles);\n }\n\n private getLanguageLocalization(languageCode: string): Record<string, any> {\n if (!this.definition?.localization) {\n return {};\n }\n return this.definition.localization[languageCode] || {};\n }\n\n private buildTranslationBundles(\n includeCategories: boolean,\n languageCode: string = this.languageCode\n ): TranslationBundle[] {\n if (\n !this.definition ||\n !languageCode ||\n languageCode === this.definition.language\n ) {\n return [];\n }\n\n const languageLocalization = this.getLanguageLocalization(languageCode);\n const bundles: TranslationBundle[] = [];\n\n this.definition.nodes.forEach((node) => {\n node.actions?.forEach((action) => {\n const config = ACTION_CONFIG[action.type];\n if (!config?.localizable || config.localizable.length === 0) {\n return;\n }\n\n // For send_msg actions, only count 'text' for progress tracking\n // (quick_replies and attachments are still localizable but don't count toward progress)\n const localizableKeys =\n action.type === 'send_msg'\n ? config.localizable.filter((key) => key === 'text')\n : config.localizable;\n\n const translations = this.findTranslations(\n 'property',\n action.uuid,\n localizableKeys,\n action,\n languageLocalization\n );\n\n if (translations.length > 0) {\n bundles.push({\n nodeUuid: node.uuid,\n actionUuid: action.uuid,\n translations\n });\n }\n });\n\n if (!includeCategories) {\n return;\n }\n\n const nodeUI = this.definition._ui?.nodes?.[node.uuid];\n const nodeType = nodeUI?.type;\n if (!nodeType) {\n return;\n }\n\n const nodeConfig = NODE_CONFIG[nodeType];\n if (\n nodeConfig?.localizable === 'categories' &&\n node.router?.categories?.length\n ) {\n const categoryTranslations = node.router.categories.flatMap(\n (category) =>\n this.findTranslations(\n 'category',\n category.uuid,\n ['name'],\n category,\n languageLocalization\n )\n );\n\n if (categoryTranslations.length > 0) {\n bundles.push({\n nodeUuid: node.uuid,\n translations: categoryTranslations\n });\n }\n }\n });\n\n return bundles;\n }\n\n private findTranslations(\n type: TranslationType,\n uuid: string,\n localizeableKeys: string[],\n source: any,\n localization: Record<string, any>\n ): TranslationEntry[] {\n const translations: TranslationEntry[] = [];\n\n localizeableKeys.forEach((attribute) => {\n if (attribute === 'quick_replies') {\n return;\n }\n\n const pathSegments = attribute.split('.');\n let from: any = source;\n let to: any = [];\n\n while (pathSegments.length > 0 && from) {\n if (from.uuid) {\n to = localization[from.uuid];\n }\n\n const path = pathSegments.shift();\n if (!path) {\n break;\n }\n\n if (to) {\n to = to[path];\n }\n from = from[path];\n }\n\n if (!from) {\n return;\n }\n\n const fromValue = this.formatTranslationValue(from);\n if (!fromValue) {\n return;\n }\n\n const toValue = to ? this.formatTranslationValue(to) : null;\n\n translations.push({\n uuid,\n type,\n attribute,\n from: fromValue,\n to: toValue\n });\n });\n\n return translations;\n }\n\n private formatTranslationValue(value: any): string | null {\n if (value === null || value === undefined) {\n return null;\n }\n\n if (Array.isArray(value)) {\n const normalized = value\n .map((entry) => this.formatTranslationValue(entry))\n .filter((entry) => !!entry) as string[];\n return normalized.length > 0 ? normalized.join(', ') : null;\n }\n\n if (typeof value === 'object') {\n if ('name' in value && value.name) {\n return String(value.name);\n }\n\n if ('arguments' in value && Array.isArray(value.arguments)) {\n return value.arguments.join(' ');\n }\n\n return null;\n }\n\n if (typeof value === 'number') {\n return value.toString();\n }\n\n if (typeof value === 'string') {\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n\n return null;\n }\n\n private getTranslationCounts(bundles: TranslationBundle[]): {\n total: number;\n localized: number;\n } {\n return bundles.reduce(\n (counts, bundle) => {\n bundle.translations.forEach((translation) => {\n counts.total += 1;\n if (translation.to && translation.to.trim().length > 0) {\n counts.localized += 1;\n }\n });\n return counts;\n },\n { total: 0, localized: 0 }\n );\n }\n\n private handleLocalizationTabClick(): void {\n const languages = this.getLocalizationLanguages();\n if (!languages.length) {\n return;\n }\n\n this.localizationWindowHidden = false;\n this.revisionsWindowHidden = true;\n this.issuesWindowHidden = true;\n\n const alreadySelected = languages.some(\n (lang) => lang.code === this.languageCode\n );\n\n if (!alreadySelected) {\n this.handleLanguageChange(languages[0].code);\n }\n }\n\n private handleLocalizationLanguageSelect(languageCode: string): void {\n if (languageCode === this.languageCode) {\n return;\n }\n this.handleLanguageChange(languageCode);\n }\n\n private handleLocalizationLanguageSelectChange(event: CustomEvent): void {\n const select = event.target as any;\n const nextValue = select?.values?.[0]?.value;\n if (nextValue) {\n this.handleLocalizationLanguageSelect(nextValue);\n }\n }\n\n private handleLocalizationWindowClosed(): void {\n this.localizationWindowHidden = true;\n\n const baseLanguage = this.definition?.language;\n if (baseLanguage && this.languageCode !== baseLanguage) {\n this.handleLanguageChange(baseLanguage);\n }\n }\n\n private toggleTranslationSettings(): void {\n this.translationSettingsExpanded = !this.translationSettingsExpanded;\n }\n\n private handleLocalizationProgressToggleClick(event: MouseEvent): void {\n const target = event.target as HTMLElement;\n if (target.closest('.translation-settings-toggle')) {\n return;\n }\n this.toggleTranslationSettings();\n }\n\n private handleLocalizationProgressToggleKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.toggleTranslationSettings();\n }\n }\n\n private handleIncludeCategoriesChange(event: Event): void {\n const checkbox = event.target as Checkbox;\n const categories = checkbox?.checked ?? false;\n this.translationFilters = { categories };\n getStore()?.getState().setTranslationFilters({ categories });\n this.requestUpdate();\n }\n\n private async handleAutoTranslateClick(event: Event): Promise<void> {\n event.preventDefault();\n event.stopPropagation();\n\n if (this.autoTranslating) {\n this.autoTranslating = false;\n return;\n }\n\n this.autoTranslateDialogOpen = true;\n }\n\n private handleAutoTranslateDialogButton(event: CustomEvent): void {\n const button = event.detail?.button;\n if (!button) {\n return;\n }\n\n if (button.name === 'Translate') {\n if (!this.autoTranslateModel) {\n return;\n }\n this.autoTranslateDialogOpen = false;\n this.autoTranslateError = null;\n this.autoTranslating = true;\n this.runAutoTranslation().catch((error) => {\n console.error('Auto translation failed', error);\n this.autoTranslateError = 'Auto translation failed. Please try again.';\n this.autoTranslating = false;\n });\n } else if (button.name === 'Cancel' || button.name === 'Close') {\n this.autoTranslateDialogOpen = false;\n }\n }\n\n private handleAutoTranslateModelChange(event: Event): void {\n const select = event.target as any;\n const nextModel = select?.values?.[0] || null;\n this.autoTranslateModel = nextModel;\n }\n\n private shouldTranslateValue(text: string): boolean {\n if (!text) {\n return false;\n }\n const trimmed = text.trim();\n if (trimmed.length <= 1) {\n return false;\n }\n if (/^\\d+$/.test(trimmed)) {\n return false;\n }\n return true;\n }\n\n private async requestAutoTranslation(text: string): Promise<string | null> {\n if (!this.autoTranslateModel || !this.definition) {\n return null;\n }\n\n const payload = {\n text,\n lang: {\n from: this.definition.language,\n to: this.languageCode\n }\n };\n\n const response = await postJSON(\n `/llm/translate/${this.autoTranslateModel.uuid}/`,\n payload\n );\n\n if (response?.status === 200) {\n const result = response.json?.result || response.json?.text;\n return result ? String(result) : null;\n }\n\n throw new Error('Auto translation request failed');\n }\n\n private applyLocalizationUpdates(\n updates: LocalizationUpdate[],\n autoTranslated = false\n ): void {\n if (!updates.length || !this.definition) {\n return;\n }\n\n const store = getStore();\n if (!store) {\n return;\n }\n\n updates.forEach(({ uuid, translations }) => {\n const normalized = Object.entries(translations).reduce(\n (acc, [key, value]) => {\n if (!value) {\n return acc;\n }\n acc[key] = Array.isArray(value) ? value : [value];\n return acc;\n },\n {} as Record<string, any>\n );\n\n const existing =\n this.definition.localization?.[this.languageCode]?.[uuid] || {};\n const merged = { ...existing, ...normalized };\n\n store.getState().updateLocalization(this.languageCode, uuid, merged);\n\n if (autoTranslated) {\n zustand\n .getState()\n .markAutoTranslated(\n this.languageCode,\n uuid,\n Object.keys(translations)\n );\n }\n });\n }\n\n private async runAutoTranslation(): Promise<void> {\n if (\n !this.definition ||\n this.languageCode === this.definition.language ||\n !this.autoTranslateModel\n ) {\n this.autoTranslating = false;\n return;\n }\n\n const bundles = this.buildTranslationBundles(\n this.translationFilters.categories\n );\n\n for (const bundle of bundles) {\n if (!this.autoTranslating) {\n break;\n }\n\n const untranslated = bundle.translations.filter(\n (translation) => !translation.to || translation.to.trim().length === 0\n );\n\n if (untranslated.length === 0) {\n continue;\n }\n\n const updates: LocalizationUpdate[] = [];\n\n for (const translation of untranslated) {\n if (!this.autoTranslating) {\n break;\n }\n\n if (!this.shouldTranslateValue(translation.from)) {\n continue;\n }\n\n const cached = this.translationCache.get(translation.from);\n if (cached) {\n updates.push({\n uuid: translation.uuid,\n translations: { [translation.attribute]: cached }\n });\n continue;\n }\n\n try {\n const result = await this.requestAutoTranslation(translation.from);\n if (result) {\n this.translationCache.set(translation.from, result);\n updates.push({\n uuid: translation.uuid,\n translations: { [translation.attribute]: result }\n });\n }\n } catch (error) {\n console.error('Auto translation request failed', error);\n this.autoTranslateError =\n 'Auto translation failed. Please try again.';\n this.autoTranslating = false;\n break;\n }\n }\n\n if (updates.length > 0) {\n this.applyLocalizationUpdates(updates, true);\n }\n\n if (!this.autoTranslating) {\n break;\n }\n }\n\n this.autoTranslating = false;\n }\n\n private handleIssuesTabClick(): void {\n this.issuesWindowHidden = false;\n this.revisionsWindowHidden = true;\n this.localizationWindowHidden = true;\n }\n\n private handleIssuesWindowClosed(): void {\n this.issuesWindowHidden = true;\n }\n\n private handleIssueItemClick(issue: FlowIssue): void {\n const issuesWindow = document.getElementById(\n 'issues-window'\n ) as FloatingWindow;\n issuesWindow?.handleClose();\n this.issuesWindowHidden = true;\n\n this.focusNode(issue.node_uuid);\n\n const node = this.definition.nodes.find((n) => n.uuid === issue.node_uuid);\n if (!node) return;\n\n if (issue.action_uuid) {\n const action = node.actions?.find((a) => a.uuid === issue.action_uuid);\n if (action) {\n this.editingAction = action;\n this.editingNode = node;\n this.editingNodeUI = this.definition._ui.nodes[issue.node_uuid];\n }\n } else {\n this.editingNode = node;\n this.editingNodeUI = this.definition._ui.nodes[issue.node_uuid];\n }\n }\n\n private handleRevisionsTabClick(): void {\n if (this.revisionsWindowHidden) {\n this.fetchRevisions();\n this.revisionsWindowHidden = false;\n this.issuesWindowHidden = true;\n this.localizationWindowHidden = true;\n }\n }\n\n private handleRevisionsWindowClosed(): void {\n this.resetRevisionsScroll();\n this.revisionsWindowHidden = true;\n if (this.viewingRevision) {\n this.handleCancelRevisionView();\n }\n }\n\n private resetRevisionsScroll() {\n const list =\n this.querySelector('#revisions-window').shadowRoot?.querySelector(\n '.body'\n );\n if (list) {\n list.scrollTop = 0;\n }\n }\n\n private async fetchRevisions() {\n this.isLoadingRevisions = true;\n try {\n const results = await fetchResults(\n `/flow/revisions/${this.flow}/?version=${FLOW_SPEC_VERSION}`\n );\n this.revisions = results.slice(1);\n } catch (e) {\n console.error('Error fetching revisions', e);\n } finally {\n this.isLoadingRevisions = false;\n }\n }\n\n private async handleRevisionClick(revision: Revision) {\n if (this.viewingRevision?.id === revision.id) {\n return;\n }\n\n if (!this.viewingRevision) {\n // Save current state first\n this.preRevertState = {\n definition: this.definition,\n dirtyDate: this.dirtyDate\n };\n }\n\n this.viewingRevision = revision;\n this.isLoadingRevisions = true;\n this.plumber?.reset();\n\n try {\n await getStore()\n .getState()\n .fetchRevision(`/flow/revisions/${this.flow}`, revision.id.toString());\n } catch (e) {\n console.error('Error fetching revision details', e);\n this.handleCancelRevisionView();\n } finally {\n this.isLoadingRevisions = false;\n }\n }\n\n private handleCancelRevisionView() {\n this.plumber?.reset();\n if (this.preRevertState) {\n const currentInfo = getStore().getState().flowInfo;\n getStore().getState().setFlowContents({\n definition: this.preRevertState.definition,\n info: currentInfo\n });\n if (this.preRevertState.dirtyDate) {\n getStore().getState().setDirtyDate(this.preRevertState.dirtyDate);\n }\n } else {\n // Fallback if no pre-revert definition\n getStore().getState().fetchRevision(`/flow/revisions/${this.flow}`);\n }\n\n this.viewingRevision = null;\n this.preRevertState = null;\n }\n\n private async handleRevertClick() {\n if (!this.viewingRevision || !this.preRevertState) return;\n this.plumber?.reset();\n\n // Use the content of the viewing revision (this.definition)\n // but the revision number of the current head (preRevertState)\n // so the server accepts it as a valid update\n const definitionToSave = {\n ...this.definition,\n revision: this.preRevertState.definition.revision\n };\n\n await this.saveChanges(definitionToSave);\n this.viewingRevision = null;\n this.preRevertState = null;\n this.revisionsWindowHidden = true;\n\n const revisionsWindow = document.getElementById(\n 'revisions-window'\n ) as FloatingWindow;\n revisionsWindow.handleClose();\n\n // Refresh revisions list to show the new one\n this.fetchRevisions();\n\n // Fetch the latest version of the flow to ensure the store is up to date\n getStore().getState().fetchRevision(`/flow/revisions/${this.flow}`);\n }\n\n private renderIssuesTab(): TemplateResult | string {\n if (!this.flowIssues?.length || !this.revisionsWindowHidden) return '';\n return html`\n <temba-floating-tab\n id=\"issues-tab\"\n icon=\"alert_warning\"\n label=\"Flow Issues\"\n color=\"tomato\"\n order=\"1\"\n .hidden=${!this.issuesWindowHidden}\n @temba-button-clicked=${this.handleIssuesTabClick}\n ></temba-floating-tab>\n `;\n }\n\n private renderIssuesWindow(): TemplateResult | string {\n if (!this.flowIssues?.length) return '';\n return html`\n <temba-floating-window\n id=\"issues-window\"\n header=\"Flow Issues\"\n .width=${360}\n .maxHeight=${600}\n .top=${75}\n color=\"tomato\"\n .hidden=${this.issuesWindowHidden}\n @temba-dialog-hidden=${this.handleIssuesWindowClosed}\n >\n <div style=\"display:flex; flex-direction:column; gap:2px;\">\n ${this.flowIssues.map(\n (issue) => html`\n <div\n class=\"issue-list-item\"\n @click=${() => this.handleIssueItemClick(issue)}\n >\n <temba-icon name=\"alert_warning\" size=\"1.2\"></temba-icon>\n <span>${formatIssueMessage(issue)}</span>\n </div>\n `\n )}\n </div>\n </temba-floating-window>\n `;\n }\n\n private renderRevisionsTab(): TemplateResult | string {\n if (this.revisions.length <= 1) return '';\n return html`\n <temba-floating-tab\n id=\"revisions-tab\"\n icon=\"revisions\"\n label=\"Revisions\"\n color=\"rgb(142, 94, 167)\"\n order=\"2\"\n .hidden=${!this.revisionsWindowHidden && this.localizationWindowHidden}\n @temba-button-clicked=${this.handleRevisionsTabClick}\n ></temba-floating-tab>\n `;\n }\n\n private renderRevisionsWindow(): TemplateResult | string {\n return html`\n <temba-floating-window\n id=\"revisions-window\"\n header=\"Revisions\"\n .width=${360}\n .maxHeight=${600}\n .top=${75}\n color=\"rgb(142, 94, 167)\"\n .hidden=${this.revisionsWindowHidden}\n @temba-dialog-hidden=${this.handleRevisionsWindowClosed}\n >\n <div class=\"localization-window-content\">\n <div\n class=\"revisions-list\"\n style=\"display:flex; flex-direction:column; gap:8px; overflow-y:auto; padding-bottom:10px;\"\n >\n ${this.isLoadingRevisions && !this.revisions.length\n ? html`<temba-loading></temba-loading>`\n : this.revisions.map((rev) => {\n const isSelected = this.viewingRevision?.id === rev.id;\n return html`\n <div\n class=\"revision-item ${isSelected ? 'selected' : ''}\"\n style=\"padding:8px; border-radius:4px; cursor:pointer; background:${\n isSelected\n ? '#f0f6ff' // Light blue bg for selected\n : '#f9fafb'\n }; border:1px solid ${\n isSelected ? '#a4cafe' : '#e5e7eb'\n }; transition: all 0.2s ease;\"\n @click=${() => this.handleRevisionClick(rev)}\n >\n <div\n style=\"display:flex; justify-content:space-between; align-items:center;\"\n >\n <div\n class=\"revision-header\"\n style=\"margin-bottom: 2px;\"\n >\n <div\n style=\"font-weight:600; font-size:13px; color:#111827;\"\n >\n <temba-date value=${\n rev.created_on\n } display=\"duration\"></temba-date>\n \n </div>\n <div style=\"font-size:11px; color:#6b7280;\">\n ${rev.user.name || rev.user.username}\n </div>\n </div>\n ${\n isSelected\n ? html`<button\n class=\"revert-button\"\n @click=${this.handleRevertClick}\n >\n Revert\n </button>`\n : html``\n }\n \n </button>\n </div>\n\n ${\n rev.comment\n ? html`<div\n style=\"font-size:12px; color:#4b5563; margin-top:4px;\"\n >\n ${rev.comment}\n </div>`\n : ''\n }\n \n </div>\n `;\n })}\n </div>\n </div>\n </temba-floating-window>\n `;\n }\n\n private renderLocalizationWindow(): TemplateResult | string {\n const languages = this.getLocalizationLanguages();\n if (!languages.length) {\n return html``;\n }\n\n const baseLanguage = this.definition?.language;\n const availableLanguages = this.getAvailableLanguages();\n const baseName =\n availableLanguages.find((lang) => lang.code === baseLanguage)?.name ||\n 'Base Language';\n\n const activeLanguageCode = languages.some(\n (lang) => lang.code === this.languageCode\n )\n ? this.languageCode\n : languages[0]?.code;\n const activeLanguage = activeLanguageCode\n ? languages.find((lang) => lang.code === activeLanguageCode)\n : null;\n const progress = this.getLocalizationProgress(activeLanguageCode || '');\n const includeCategories = this.translationFilters.categories;\n const settingsPanelId = 'translation-settings-panel';\n const remainingTranslations = Math.max(\n progress.total - progress.localized,\n 0\n );\n const hasTranslations = progress.total > 0;\n const hasPendingTranslations = remainingTranslations > 0;\n const autoTranslateButtonLabel = this.autoTranslating\n ? 'Stop Auto Translate'\n : 'Auto Translate';\n const autoTranslateButtonDisabled =\n !this.autoTranslating && !hasTranslations;\n\n return html`\n <temba-floating-window\n id=\"localization-window\"\n header=\"Translations\"\n .width=${360}\n .maxHeight=${600}\n .top=${75}\n color=\"#6b7280\"\n .hidden=${this.localizationWindowHidden}\n @temba-dialog-hidden=${this.handleLocalizationWindowClosed}\n >\n <div class=\"localization-window-content\">\n <div class=\"localization-header\">\n Translate from <strong>${baseName}</strong> to the languages below.\n Closing this window returns you to editing in ${baseName}.\n </div>\n <div class=\"localization-language-row\">\n <temba-select\n flavor=\"small\"\n class=\"localization-language-select\"\n .values=${activeLanguage\n ? [{ name: activeLanguage.name, value: activeLanguage.code }]\n : []}\n @change=${this.handleLocalizationLanguageSelectChange}\n >\n ${languages.map(\n (lang) => html`<temba-option\n value=\"${lang.code}\"\n name=\"${lang.name}\"\n ></temba-option>`\n )}\n </temba-select>\n <button\n class=\"auto-translate-button\"\n type=\"button\"\n ?disabled=${autoTranslateButtonDisabled}\n @click=${this.handleAutoTranslateClick}\n >\n ${autoTranslateButtonLabel}\n </button>\n </div>\n <div class=\"localization-progress\">\n <div class=\"localization-progress-summary\">\n ${this.autoTranslating\n ? html`<temba-loading units=\"3\" size=\"8\"></temba-loading>\n <span>Auto translating remaining text…</span>`\n : !hasTranslations\n ? html`<span>\n Add content or enable more options to start translating.\n </span>`\n : hasPendingTranslations\n ? html`<span>\n ${progress.localized} of ${progress.total} items translated\n </span>`\n : html`<span>All items are translated.</span>`}\n </div>\n ${this.autoTranslateError\n ? html`<div class=\"auto-translate-error\">\n ${this.autoTranslateError}\n </div>`\n : ''}\n <div class=\"localization-progress-bar-row\">\n <div\n class=\"localization-progress-trigger\"\n role=\"button\"\n tabindex=\"0\"\n aria-expanded=\"${this.translationSettingsExpanded}\"\n aria-controls=\"${settingsPanelId}\"\n @click=${this.handleLocalizationProgressToggleClick}\n @keydown=${this.handleLocalizationProgressToggleKeydown}\n >\n <temba-progress\n .current=${progress.localized}\n .total=${Math.max(progress.total, 1)}\n .animated=${false}\n ></temba-progress>\n </div>\n <button\n class=\"translation-settings-toggle\"\n type=\"button\"\n @click=${this.toggleTranslationSettings}\n aria-expanded=\"${this.translationSettingsExpanded}\"\n aria-controls=\"${settingsPanelId}\"\n >\n <span\n class=\"translation-settings-arrow ${this\n .translationSettingsExpanded\n ? 'expanded'\n : ''}\"\n ></span>\n </button>\n </div>\n ${this.translationSettingsExpanded\n ? html`<div id=\"${settingsPanelId}\" class=\"translation-settings\">\n <div class=\"translation-settings-row\">\n <temba-checkbox\n name=\"include-categories\"\n label=\"Include categories\"\n ?checked=${includeCategories}\n style=\"--checkbox-padding:5px; border-radius:var(--curvature);\"\n @change=${this.handleIncludeCategoriesChange}\n ></temba-checkbox>\n </div>\n </div>`\n : ''}\n </div>\n </div>\n </temba-floating-window>\n `;\n }\n\n private renderAutoTranslateDialog(): TemplateResult | string {\n if (!this.autoTranslateDialogOpen) {\n return html``;\n }\n\n const selectedModel = this.autoTranslateModel\n ? [this.autoTranslateModel]\n : [];\n const disableTranslate = !this.autoTranslateModel;\n\n return html`\n <temba-dialog\n header=\"Auto translate\"\n .open=${this.autoTranslateDialogOpen}\n primaryButtonName=\"Translate\"\n cancelButtonName=\"Cancel\"\n size=\"small\"\n .disabled=${disableTranslate}\n @temba-button-clicked=${this.handleAutoTranslateDialogButton}\n >\n <div class=\"auto-translate-dialog-content\">\n <p>\n We'll send any untranslated text to the selected AI model and save\n the responses automatically.\n </p>\n <div class=\"auto-translate-models\">\n <temba-select\n class=\"auto-translate-model-select\"\n endpoint=\"${AUTO_TRANSLATE_MODELS_ENDPOINT}\"\n .valueKey=${'uuid'}\n .values=${selectedModel}\n ?searchable=${true}\n ?clearable=${true}\n placeholder=\"Select an AI model\"\n @change=${this.handleAutoTranslateModelChange}\n ></temba-select>\n </div>\n <p>Only text without translations will be sent.</p>\n ${this.autoTranslateError\n ? html`<div class=\"auto-translate-error\">\n ${this.autoTranslateError}\n </div>`\n : ''}\n </div>\n </temba-dialog>\n `;\n }\n\n private renderLocalizationTab(): TemplateResult | string {\n if (!this.revisionsWindowHidden) return '';\n if (this.definition?.nodes.length === 0) return '';\n const languages = this.getLocalizationLanguages();\n if (!languages.length) {\n return html``;\n }\n\n return html`\n <temba-floating-tab\n id=\"localization-tab\"\n icon=\"language\"\n label=\"Translate Flow\"\n color=\"#6b7280\"\n order=\"3\"\n .hidden=${!this.localizationWindowHidden}\n @temba-button-clicked=${this.handleLocalizationTabClick}\n ></temba-floating-tab>\n `;\n }\n\n /**\n * Focus on a specific node by smoothly scrolling it to the center of the canvas\n */\n public focusNode(nodeUuid: string) {\n const nodeElement = this.querySelector(\n `temba-flow-node[uuid=\"${nodeUuid}\"]`\n ) as HTMLElement;\n if (!nodeElement) {\n return;\n }\n\n const editor = this.querySelector('#editor') as HTMLElement;\n if (!editor) {\n return;\n }\n\n // Get the editor's dimensions and scroll position\n const editorRect = editor.getBoundingClientRect();\n const editorCenterX = editorRect.width / 2;\n const editorCenterY = editorRect.height / 2;\n\n // Use offsetWidth/offsetHeight (unaffected by ancestor transforms)\n const nodeCenterX = nodeElement.offsetLeft + nodeElement.offsetWidth / 2;\n const nodeCenterY = nodeElement.offsetTop + nodeElement.offsetHeight / 2;\n\n // Calculate the scroll position needed to center the node.\n // Multiply by zoom because scroll operates in visual (transformed) space\n // while offsetLeft/offsetTop are in layout space.\n const targetScrollX = nodeCenterX * this.zoom - editorCenterX;\n const targetScrollY = nodeCenterY * this.zoom - editorCenterY;\n\n // Smooth scroll the editor container to the target position\n editor.scrollTo({\n left: Math.max(0, targetScrollX),\n top: Math.max(0, targetScrollY),\n behavior: 'smooth'\n });\n }\n\n private isReadOnly(): boolean {\n return this.viewingRevision !== null || this.isTranslating;\n }\n\n public render(): TemplateResult {\n // we have to embed our own style since we are in light DOM\n const style = html`<style>\n ${unsafeCSS(Editor.styles.cssText)}\n ${unsafeCSS(CanvasNode.styles.cssText)}\n </style>`;\n\n const stickies = this.definition?._ui?.stickies || {};\n\n return html`${style} ${this.renderIssuesWindow()}\n ${this.renderRevisionsWindow()} ${this.renderLocalizationWindow()}\n ${this.renderAutoTranslateDialog()}\n <div id=\"editor-container\">\n <div id=\"editor\">\n ${this.definition &&\n this.definition.nodes.length === 0 &&\n !this.isReadOnly()\n ? html`<div class=\"empty-flow\">\n <div class=\"empty-flow-content\">\n <div class=\"empty-flow-title\">This flow is empty</div>\n <div class=\"empty-flow-description\">\n Get started by adding your first action or split to define\n how this flow will work.\n </div>\n <button\n class=\"empty-flow-button\"\n @click=${this.handleEmptyFlowClick}\n >\n Add first step\n </button>\n </div>\n </div>`\n : ''}\n <div\n id=\"grid\"\n class=\"${this.viewingRevision ? 'viewing-revision' : ''}\"\n style=\"min-width:${100 / this.zoom}%;min-height:${100 /\n this.zoom}%;width:${this.canvasSize.width}px; height:${this\n .canvasSize.height}px;transform:scale(${this.zoom})\"\n >\n <div\n id=\"canvas\"\n class=\"${getClasses({\n 'viewing-revision': !!this.viewingRevision,\n 'read-only-connections':\n !!this.viewingRevision || this.isTranslating\n })}\"\n >\n ${this.definition\n ? repeat(\n [...this.definition.nodes].sort((a, b) =>\n a.uuid.localeCompare(b.uuid)\n ),\n (node) => node.uuid,\n (node) => {\n const position = this.definition._ui?.nodes[node.uuid]\n ?.position || {\n left: 0,\n top: 0\n };\n\n const dragging =\n this.isDragging &&\n this.currentDragItem?.uuid === node.uuid;\n\n const selected = this.selectedItems.has(node.uuid);\n\n // first node is the flow start (nodes are sorted by position)\n const isFlowStart =\n this.definition.nodes.length > 0 &&\n this.definition.nodes[0].uuid === node.uuid;\n\n return html`<temba-flow-node\n class=\"draggable ${dragging\n ? 'dragging'\n : ''} ${selected ? 'selected' : ''} ${isFlowStart\n ? 'flow-start'\n : ''}\"\n @mousedown=${this.handleMouseDown.bind(this)}\n uuid=${node.uuid}\n data-node-uuid=${node.uuid}\n style=\"left:${position.left}px; top:${position.top}px;transition: all 0.2s ease-in-out;\"\n .plumber=${this.plumber}\n .node=${node}\n .ui=${this.definition._ui.nodes[node.uuid]}\n @temba-node-deleted=${(event) => {\n this.deleteNodes([event.detail.uuid]);\n }}\n ></temba-flow-node>`;\n }\n )\n : html`<temba-loading></temba-loading>`}\n ${repeat(\n Object.entries(stickies),\n ([uuid]) => uuid,\n ([uuid, sticky]) => {\n const position = sticky.position || { left: 0, top: 0 };\n const dragging =\n this.isDragging && this.currentDragItem?.uuid === uuid;\n const selected = this.selectedItems.has(uuid);\n return html`<temba-sticky-note\n class=\"draggable ${dragging ? 'dragging' : ''} ${selected\n ? 'selected'\n : ''}\"\n @mousedown=${this.handleMouseDown.bind(this)}\n style=\"left:${position.left}px; top:${position.top}px;\"\n uuid=${uuid}\n .data=${sticky}\n .dragging=${dragging}\n .selected=${selected}\n ></temba-sticky-note>`;\n }\n )}\n ${this.renderSelectionBox()} ${this.renderCanvasDropPreview()}\n ${this.renderConnectionPlaceholder()}\n </div>\n </div>\n </div>\n <div class=\"save-indicator ${this.isSaving ? 'visible' : ''}\">\n <temba-loading units=\"3\" size=\"8\"></temba-loading>\n </div>\n <div class=\"zoom-controls\">\n <button\n @click=${this.zoomToFit}\n ?disabled=${this.zoomFitted}\n title=\"Zoom to fit\"\n >\n <temba-icon name=${Icon.zoom_fit} size=\"1\"></temba-icon>\n </button>\n <div class=\"zoom-divider\"></div>\n <button\n @click=${this.zoomOut}\n ?disabled=${this.zoom <= 0.1}\n title=\"Zoom out\"\n >\n −\n </button>\n <span class=\"zoom-level\">${Math.round(this.zoom * 100)}%</span>\n <button\n @click=${this.zoomIn}\n ?disabled=${this.zoom >= 1.0}\n title=\"Zoom in\"\n >\n +\n </button>\n <div class=\"zoom-divider\"></div>\n <button\n @click=${this.zoomToFull}\n ?disabled=${this.zoom >= 1.0}\n title=\"Zoom to 100%\"\n >\n <temba-icon name=${Icon.zoom_in} size=\"1\"></temba-icon>\n </button>\n </div>\n ${this.reflowUnsaved\n ? html`<div class=\"reflow-card\">\n <div class=\"reflow-top\">\n <span class=\"reflow-label\">Unsaved layout changes</span>\n <button\n class=\"reflow-discard\"\n @click=${this.handleReflowDiscard}\n >\n Discard\n </button>\n </div>\n <div class=\"reflow-meter\">\n <div class=\"reflow-meter-fill\"></div>\n </div>\n </div>`\n : ''}\n </div>\n\n ${this.editingNode || this.editingAction\n ? html`<temba-node-editor\n .node=${this.editingNode}\n .nodeUI=${this.editingNodeUI}\n .action=${this.editingAction}\n .dialogOrigin=${this.dialogOrigin}\n @temba-node-saved=${(e: CustomEvent) =>\n this.handleNodeSaved(e.detail.node, e.detail.uiConfig)}\n @temba-action-saved=${(e: CustomEvent) =>\n this.handleActionSaved(e.detail.action)}\n @temba-node-edit-cancelled=${this.handleNodeEditCanceled}\n ></temba-node-editor>`\n : ''}\n\n <temba-canvas-menu></temba-canvas-menu>\n ${!this.viewingRevision\n ? html`<temba-node-type-selector\n .flowType=${this.flowType}\n .features=${this.features}\n ></temba-node-type-selector>`\n : ''}\n ${this.renderIssuesTab()} ${this.renderRevisionsTab()}\n ${this.renderLocalizationTab()} `;\n }\n}\n"]}
1
+ {"version":3,"file":"Editor.js","sourceRoot":"","sources":["../../../src/flow/Editor.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, TemplateResult } from 'lit-html';\nimport { css, PropertyValueMap, unsafeCSS } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport {\n FlowDefinition,\n FlowPosition,\n Action,\n Node,\n NodeUI\n} from '../store/flow-definition';\nimport { getStore } from '../store/Store';\nimport {\n AppState,\n FlowIssue,\n fromStore,\n zustand,\n FLOW_SPEC_VERSION\n} from '../store/AppState';\nimport { RapidElement } from '../RapidElement';\nimport { repeat } from 'lit-html/directives/repeat.js';\nimport { CustomEventType, Workspace } from '../interfaces';\nimport {\n generateUUID,\n postJSON,\n fetchResults,\n getClasses,\n WebResponse\n} from '../utils';\nimport { TEMBA_COMPONENTS_VERSION } from '../version';\nimport {\n formatIssueMessage,\n getNodeBounds,\n calculateReflowPositions,\n isRightClick,\n NodeBounds,\n snapToGrid\n} from './utils';\nimport { ACTION_CONFIG, NODE_CONFIG } from './config';\nimport { calculateLayeredLayout, placeStickyNotes } from './reflow';\nimport { FloatingTab } from '../display/FloatingTab';\n\ninterface Revision {\n id: number;\n user: {\n id: number;\n username: string;\n first_name: string;\n last_name: string;\n name?: string;\n };\n created_on: string;\n comment?: string;\n}\n\nimport { ACTION_GROUP_METADATA } from './types';\nimport { Checkbox } from '../form/Checkbox';\n\nimport {\n Plumber,\n calculateFlowchartPath,\n ARROW_LENGTH,\n ARROW_HALF_WIDTH,\n CURSOR_GAP\n} from './Plumber';\nimport { CanvasNode } from './CanvasNode';\nimport { Dialog } from '../layout/Dialog';\n\nimport { CanvasMenu, CanvasMenuSelection } from './CanvasMenu';\nimport { NodeTypeSelector, NodeTypeSelection } from './NodeTypeSelector';\nimport { FloatingWindow } from '../layout/FloatingWindow';\nimport { Icon } from '../Icons';\n\nexport function findNodeForExit(\n definition: FlowDefinition,\n exitUuid: string\n): string | null {\n for (const node of definition.nodes) {\n const exit = node.exits.find((e) => e.uuid === exitUuid);\n if (exit) {\n return node.uuid;\n }\n }\n return null;\n}\n\nconst SAVE_QUIET_TIME = 2000;\n\nexport interface DraggableItem {\n uuid: string;\n position: FlowPosition;\n element: HTMLElement;\n type: 'node' | 'sticky';\n}\n\nexport interface SelectionBox {\n startX: number;\n startY: number;\n endX: number;\n endY: number;\n}\n\nconst DRAG_THRESHOLD = 5;\nconst AUTO_SCROLL_EDGE_ZONE = 100;\nconst AUTO_SCROLL_MAX_SPEED = 15;\n\ntype TranslationType = 'property' | 'category';\n\ninterface TranslationEntry {\n uuid: string;\n type: TranslationType;\n attribute: string;\n from: string;\n to: string | null;\n}\n\ninterface TranslationBundle {\n nodeUuid: string;\n actionUuid?: string;\n translations: TranslationEntry[];\n}\n\ninterface TranslationModel {\n uuid: string;\n name: string;\n description?: string;\n}\n\ninterface LocalizationUpdate {\n uuid: string;\n translations: Record<string, string>;\n}\n\nconst AUTO_TRANSLATE_MODELS_ENDPOINT = '/api/internal/llms.json';\n\n// How long the reflow auto-save countdown runs (in ms).\n// Used in both the CSS animation and the JS setTimeout.\nconst REFLOW_AUTO_SAVE_DELAY = 5000;\n\n// Offset for positioning dropped action node relative to mouse cursor\n// Keep small to make drop location close to cursor position\nconst DROP_PREVIEW_OFFSET_X = 20;\nconst DROP_PREVIEW_OFFSET_Y = 20;\n\nexport class Editor extends RapidElement {\n // connection SVGs are appended directly to the canvas, so we need light DOM\n createRenderRoot() {\n return this;\n }\n\n // this is the master plumber\n private plumber: Plumber;\n\n // timer for debounced saving\n private saveTimer: number | null = null;\n\n @property({ type: String })\n public flow: string;\n\n @property({ type: String })\n public version: string;\n\n @property({ type: String })\n public flowType: string = 'message';\n\n @property({ type: Array })\n public features: string[] = [];\n\n private activityTimer: number | null = null;\n private activityInterval = 100; // Start with 100ms interval for fast initial load\n\n @fromStore(zustand, (state: AppState) => state.flowDefinition)\n private definition!: FlowDefinition;\n\n @fromStore(zustand, (state: AppState) => state.simulatorActive)\n private simulatorActive!: boolean;\n\n @fromStore(zustand, (state: AppState) => state.canvasSize)\n private canvasSize!: { width: number; height: number };\n\n @fromStore(zustand, (state: AppState) => state.dirtyDate)\n private dirtyDate!: Date;\n\n @fromStore(zustand, (state: AppState) => state.languageCode)\n private languageCode!: string;\n\n @fromStore(zustand, (state: AppState) => state.isTranslating)\n private isTranslating!: boolean;\n\n @fromStore(zustand, (state: AppState) => state.workspace)\n private workspace!: Workspace;\n\n @fromStore(zustand, (state: AppState) => state.getCurrentActivity())\n private activityData!: any;\n\n @fromStore(zustand, (state: AppState) => state.flowInfo?.issues || [])\n private flowIssues!: FlowIssue[];\n\n // Drag state\n @state()\n private isDragging = false;\n private isMouseDown = false;\n private dragStartPos = { x: 0, y: 0 };\n\n // Public getter for drag state\n public get dragging(): boolean {\n return this.isDragging;\n }\n\n @state()\n private currentDragItem: DraggableItem | null = null;\n private startPos = { left: 0, top: 0 };\n\n // Auto-scroll state\n private autoScrollAnimationId: number | null = null;\n private autoScrollDeltaX = 0;\n private autoScrollDeltaY = 0;\n private lastPointerPos: { clientX: number; clientY: number } | null = null;\n\n // Selection state\n @state()\n private selectedItems: Set<string> = new Set();\n\n @state()\n private isSelecting = false;\n\n @state()\n private selectionBox: SelectionBox | null = null;\n\n // Touch device state\n private isTouchDevice = false;\n private isTwoFingerPanning = false;\n private twoFingerDidPan = false;\n private twoFingerStartMidX = 0;\n private twoFingerStartMidY = 0;\n private twoFingerOnCanvas = false;\n private lastPanX = 0;\n private lastPanY = 0;\n\n @state()\n private targetId: string | null = null;\n\n @state()\n private sourceId: string | null = null;\n\n @state()\n private dragFromNodeId: string | null = null;\n\n @state()\n private originalConnectionTargetId: string | null = null;\n\n @state()\n private isValidTarget = true;\n\n // Canvas-relative source exit position (set at drag start)\n private connectionSourceX: number | null = null;\n private connectionSourceY: number | null = null;\n\n @state()\n private issuesWindowHidden = true;\n\n @state()\n private localizationWindowHidden = true;\n\n @state()\n private translationFilters: { categories: boolean } = {\n categories: false\n };\n\n @state()\n private translationSettingsExpanded = false;\n\n @state()\n private autoTranslateDialogOpen = false;\n\n @state()\n private autoTranslating = false;\n\n @state()\n private autoTranslateModel: TranslationModel | null = null;\n\n @state()\n private autoTranslateError: string | null = null;\n\n @state()\n private revisionsWindowHidden = true;\n\n @state()\n private revisions: Revision[] = [];\n\n @state()\n private viewingRevision: Revision | null = null;\n\n @state()\n private isLoadingRevisions = false;\n\n @state()\n private isSaving = false;\n\n @state()\n private saveError: string | null = null;\n\n @state()\n private zoom = 1.0;\n\n @state()\n private zoomFitted = false;\n\n @state()\n private reflowPending = false;\n\n @state()\n private reflowUnsaved = false;\n\n private savedReflowPositions: Record<string, FlowPosition> | null = null;\n private reflowAutoSaveTimer: ReturnType<typeof setTimeout> | null = null;\n\n private clearReflowAutoSaveTimer(): void {\n if (this.reflowAutoSaveTimer !== null) {\n clearTimeout(this.reflowAutoSaveTimer);\n this.reflowAutoSaveTimer = null;\n }\n }\n\n private preRevertState: {\n definition: FlowDefinition;\n dirtyDate: Date | null;\n } | null = null;\n\n private translationCache = new Map<string, string>();\n\n // NodeEditor state - handles both node and action editing\n @state()\n private editingNode: Node | null = null;\n\n @state()\n private editingNodeUI: NodeUI | null = null;\n\n @state()\n private editingAction: Action | null = null;\n\n private dialogOrigin: { x: number; y: number } | null = null;\n\n @state()\n private isCreatingNewNode = false;\n\n @state()\n private pendingNodePosition: FlowPosition | null = null;\n\n // Canvas drop state for dragging actions to canvas\n @state()\n private canvasDropPreview: {\n action: Action;\n nodeUuid: string;\n actionIndex: number;\n position: FlowPosition;\n actionHeight: number;\n } | null = null;\n @state()\n private addActionToNodeUuid: string | null = null;\n\n // Track target node for action drag\n @state()\n private actionDragTargetNodeUuid: string | null = null;\n\n // Track previous target node to clear placeholder when moving between nodes\n private previousActionDragTargetNodeUuid: string | null = null;\n\n // Connection placeholder state for dropping connections on empty canvas\n @state()\n private connectionPlaceholder: {\n position: FlowPosition;\n visible: boolean;\n dragUp?: boolean;\n } | null = null;\n\n // Track pending connection when dropping on canvas\n private pendingCanvasConnection: {\n fromNodeId: string;\n exitId: string;\n position: FlowPosition;\n } | null = null;\n\n private canvasMouseDown = false;\n\n private getAvailableLanguages(): Array<{ code: string; name: string }> {\n // Use languages from workspace if available\n if (this.workspace?.languages && this.workspace.languages.length > 0) {\n const languageNames = new Intl.DisplayNames(['en'], { type: 'language' });\n return this.workspace.languages\n .map((code) => {\n try {\n const name = languageNames.of(code);\n return name ? { code, name } : { code, name: code };\n } catch {\n return { code, name: code };\n }\n })\n .filter((lang) => lang.code && lang.name);\n }\n\n // Fall back to flow definition languages if available\n if (\n this.definition?._ui?.languages &&\n this.definition._ui.languages.length > 0\n ) {\n return this.definition._ui.languages.map((lang: any) => ({\n code: typeof lang === 'string' ? lang : lang.iso || lang.code,\n name: typeof lang === 'string' ? lang : lang.name\n }));\n }\n\n // No languages available\n return [];\n }\n\n // Bound event handlers to maintain proper 'this' context\n private boundMouseMove = this.handleMouseMove.bind(this);\n private boundMouseUp = this.handleMouseUp.bind(this);\n private boundGlobalMouseDown = this.handleGlobalMouseDown.bind(this);\n private boundKeyDown = this.handleKeyDown.bind(this);\n private boundCanvasContextMenu = this.handleCanvasContextMenu.bind(this);\n private boundWheel = this.handleWheel.bind(this);\n private boundTouchMove = this.handleTouchMove.bind(this);\n private boundTouchEnd = this.handleTouchEnd.bind(this);\n private boundTouchCancel = this.handleTouchCancel.bind(this);\n private boundCanvasTouchStart = this.handleCanvasTouchStart.bind(this);\n\n static get styles() {\n return css`\n #editor-container {\n position: relative;\n flex: 1;\n display: flex;\n min-height: 0;\n }\n\n #editor {\n overflow: scroll;\n flex: 1;\n -webkit-font-smoothing: antialiased;\n }\n\n /* On touch devices, disable native scroll-by-touch so canvas\n drag draws a selection rectangle. Users scroll via scrollbars. */\n #editor.touch-device {\n touch-action: none;\n }\n\n #editor.touch-device::-webkit-scrollbar {\n -webkit-appearance: none;\n width: 12px;\n height: 12px;\n }\n\n #editor.touch-device::-webkit-scrollbar-thumb {\n background: rgba(0, 0, 0, 0.3);\n border-radius: 6px;\n border: 2px solid transparent;\n background-clip: padding-box;\n }\n\n #editor.touch-device::-webkit-scrollbar-track {\n background: rgba(0, 0, 0, 0.05);\n }\n\n temba-floating-tab {\n --floating-tab-right: 15px;\n }\n\n #grid {\n position: relative;\n background-color: #f9f9f9;\n background-image: radial-gradient(\n circle,\n rgba(61, 177, 255, 0.3) 1px,\n transparent 1px\n );\n background-size: 20px 20px;\n background-position: 10px 10px;\n width: 100%;\n display: flex;\n padding-top: 20px;\n transform-origin: 0 0;\n }\n\n #canvas {\n position: relative;\n padding: 0px;\n flex-grow: 1;\n margin: 20px;\n }\n\n #canvas > .draggable {\n position: absolute;\n z-index: 100;\n touch-action: none;\n }\n\n #canvas > .dragging {\n z-index: 99999 !important;\n transition: none !important;\n }\n\n #canvas.viewing-revision {\n pointer-events: none;\n }\n\n #canvas.read-only svg {\n pointer-events: none;\n }\n\n #grid.viewing-revision {\n background-color: #fff9fc;\n background-image: radial-gradient(\n circle,\n rgba(166, 38, 164, 0.2) 1px,\n transparent 1px\n );\n }\n\n #grid.viewing-revision temba-flow-node,\n #grid.viewing-revision svg.plumb-connector {\n opacity: 0.5;\n }\n\n svg.plumb-connector {\n z-index: 10;\n }\n\n svg.plumb-connector path {\n stroke: var(--color-connectors);\n stroke-width: 3px;\n }\n\n svg.plumb-connector .plumb-arrow {\n fill: var(--color-connectors);\n stroke: none;\n }\n\n svg.plumb-connector.hover path {\n stroke: var(--color-success);\n }\n\n svg.plumb-connector.hover .plumb-arrow {\n fill: var(--color-success);\n }\n\n #canvas.read-only-connections svg.plumb-connector.hover path {\n stroke: var(--color-connectors);\n }\n\n #canvas.read-only-connections svg.plumb-connector.hover .plumb-arrow {\n fill: var(--color-connectors);\n }\n\n #canvas.read-only-connections svg.plumb-connector,\n #canvas.read-only-connections svg.plumb-connector * {\n pointer-events: none !important;\n cursor: default !important;\n }\n\n svg.plumb-connector.removing path {\n stroke: var(--color-error);\n }\n\n svg.plumb-connector.removing .plumb-arrow {\n fill: var(--color-error);\n }\n\n svg.plumb-connector.dragging {\n z-index: 99999;\n }\n\n /* Active contact count on nodes */\n .active-count {\n position: absolute;\n background: #3498db;\n border: 1px solid #2980b9;\n border-radius: 12px;\n padding: 3px 6px;\n color: #fff;\n font-weight: 500;\n top: -10px;\n left: -10px;\n font-size: 13px;\n\n text-align: center;\n z-index: 600;\n line-height: 1;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n }\n\n /* Activity overlay badges on connection exit stubs */\n .activity-overlay {\n position: absolute;\n background: #f3f3f3;\n border: 1px solid #d9d9d9;\n color: #333;\n border-radius: 4px;\n padding: 2px 4px;\n font-size: 10px;\n font-weight: 600;\n line-height: 0.9;\n cursor: pointer;\n z-index: 10;\n pointer-events: auto;\n white-space: nowrap;\n user-select: none;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);\n }\n\n #grid.viewing-revision .activity-overlay {\n opacity: 0.5;\n pointer-events: none;\n }\n\n /* Recent contacts popup */\n @keyframes popupBounceIn {\n 0% {\n transform: scale(0.8);\n opacity: 0;\n }\n 50% {\n transform: scale(1.05);\n }\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n }\n\n .recent-contacts-popup {\n display: none;\n position: absolute;\n width: 200px;\n background: #f3f3f3;\n border-radius: 10px;\n box-shadow: 0 1px 3px 1px rgba(130, 130, 130, 0.2);\n z-index: 1015;\n transform-origin: top center;\n }\n\n .recent-contacts-popup.show {\n display: block;\n animation: popupBounceIn 0.3s cubic-bezier(0.68, -0.55, 0.265, 1.55);\n }\n\n .recent-contacts-popup .popup-title {\n background: #999;\n color: #fff;\n padding: 6px 0;\n text-align: center;\n border-top-left-radius: 10px;\n border-top-right-radius: 10px;\n font-size: 12px;\n }\n\n .recent-contacts-popup .no-contacts-message {\n padding: 15px;\n text-align: center;\n color: #999;\n font-size: 12px;\n }\n\n .recent-contacts-popup .contact-row {\n padding: 8px 10px;\n border-top: 1px solid #e0e0e0;\n text-align: left;\n }\n\n .recent-contacts-popup .contact-row:last-child {\n border-bottom-left-radius: 10px;\n border-bottom-right-radius: 10px;\n }\n\n .recent-contacts-popup .contact-name {\n display: block;\n font-weight: 500;\n font-size: 12px;\n color: var(--color-link-primary, #1d4ed8);\n cursor: pointer;\n }\n\n .recent-contacts-popup .contact-name:hover {\n text-decoration: underline;\n }\n\n .recent-contacts-popup .contact-operand {\n padding-top: 3px;\n font-size: 11px;\n color: #666;\n word-wrap: break-word;\n }\n\n .recent-contacts-popup .contact-time {\n padding-top: 3px;\n font-size: 10px;\n color: #999;\n }\n\n /* Connection target feedback */\n temba-flow-node.connection-target-valid {\n outline: 3px solid var(--color-success, #22c55e) !important;\n outline-offset: 2px;\n border-radius: var(--curvature);\n }\n\n temba-flow-node.connection-target-invalid {\n outline: 3px solid var(--color-error, #ef4444) !important;\n outline-offset: 2px;\n border-radius: var(--curvature);\n }\n\n /* Selection box styles */\n .selection-box {\n position: absolute;\n border: 2px dashed #6298f0ff;\n background-color: rgba(59, 130, 246, 0.1);\n z-index: 9999;\n pointer-events: none;\n }\n\n /* Selected item styles */\n .draggable.selected {\n outline: 3px solid #6298f0ff;\n outline-offset: 0px;\n border-radius: var(--curvature);\n }\n\n .localization-window-content {\n display: flex;\n flex-direction: column;\n gap: 16px;\n height: 100%;\n }\n\n .localization-header {\n font-size: 13px;\n color: #4b5563;\n line-height: 1.4;\n }\n\n .localization-language-select {\n --color-widget-border: #d1d5db;\n --color-widget-background: #fff;\n }\n\n .localization-language-row {\n display: flex;\n align-items: flex-end;\n gap: 12px;\n }\n\n .localization-language-row temba-select {\n flex: 1;\n }\n\n .localization-progress {\n margin-top: auto;\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .localization-progress-bar-row {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .localization-progress-trigger {\n flex: 1;\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n }\n\n .localization-progress-trigger:focus-visible {\n outline: 2px solid #94a3b8;\n outline-offset: 2px;\n }\n\n .localization-progress-trigger temba-progress {\n flex: 1;\n }\n\n .localization-progress h5 {\n margin: 0;\n font-size: 13px;\n font-weight: 600;\n color: #374151;\n }\n\n .localization-progress-summary {\n font-size: 12px;\n color: #6b7280;\n display: flex;\n align-items: center;\n gap: 6px;\n min-height: 20px;\n }\n\n .translation-settings-toggle {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n background: transparent;\n border: none;\n color: #6b7280;\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n }\n\n .translation-settings-label {\n font-size: 12px;\n color: #6b7280;\n }\n\n .translation-settings-toggle:focus-visible {\n outline: 2px solid #94a3b8;\n outline-offset: 2px;\n }\n\n .translation-settings-arrow {\n width: 8px;\n height: 8px;\n border-right: 2px solid currentColor;\n border-bottom: 2px solid currentColor;\n transform: rotate(-45deg);\n transition: transform 0.2s ease;\n margin-left: 2px;\n }\n\n .translation-settings-arrow.expanded {\n transform: rotate(45deg);\n }\n\n .translation-settings {\n }\n\n .translation-settings-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n\n .translation-settings-row temba-checkbox {\n width: 100%;\n }\n\n .revert-button {\n background: var(--color-primary-dark);\n border: none;\n color: #fff;\n padding: 6px 10px;\n border-radius: var(--curvature);\n font-size: 11px;\n font-weight: 600;\n cursor: pointer;\n transition: opacity 0.2s ease;\n }\n\n .auto-translate-button {\n background: var(--color-primary-dark);\n border: none;\n color: #fff;\n padding: 10px 12px;\n border-radius: var(--curvature);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: opacity 0.2s ease;\n }\n\n .auto-translate-button[disabled] {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .auto-translate-error {\n font-size: 12px;\n color: #b91c1c;\n }\n\n .auto-translate-dialog-content {\n padding: 20px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n font-size: 14px;\n color: #374151;\n }\n\n .auto-translate-dialog-content p {\n margin: 0;\n }\n\n .auto-translate-loading {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n color: #6b7280;\n }\n\n .auto-translate-empty {\n font-size: 13px;\n color: #6b7280;\n }\n\n .localization-empty {\n font-size: 13px;\n color: #9ca3af;\n white-space: nowrap;\n }\n\n .issue-list-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px;\n border-radius: 4px;\n cursor: pointer;\n font-size: 13px;\n color: #333;\n }\n\n .issue-list-item:hover {\n background: #fff5f5;\n }\n\n .issue-list-item temba-icon {\n color: tomato;\n flex-shrink: 0;\n }\n\n .empty-flow {\n position: sticky;\n top: 80px;\n left: 0;\n right: 0;\n height: 0;\n display: flex;\n justify-content: center;\n pointer-events: none;\n z-index: 50;\n }\n\n .empty-flow-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 16px;\n text-align: center;\n pointer-events: auto;\n }\n\n .empty-flow-title {\n font-size: 18px;\n font-weight: 600;\n color: #374151;\n }\n\n .empty-flow-description {\n font-size: 14px;\n color: #6b7280;\n max-width: 320px;\n line-height: 1.5;\n }\n\n .empty-flow-button {\n background: var(--color-primary-dark);\n border: none;\n color: #fff;\n padding: 10px 20px;\n border-radius: var(--curvature);\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: opacity 0.2s ease;\n }\n\n .empty-flow-button:hover {\n opacity: 0.9;\n }\n\n .save-indicator {\n position: absolute;\n top: 8px;\n right: 240px;\n padding: 6px 10px;\n z-index: 4999;\n pointer-events: none;\n opacity: 0;\n transition: opacity 0.15s ease-in-out;\n }\n\n .save-indicator.visible {\n opacity: 1;\n }\n\n .zoom-controls {\n position: absolute;\n top: 8px;\n right: 16px;\n z-index: 4999;\n display: flex;\n align-items: center;\n gap: 2px;\n background: white;\n border-radius: var(--curvature);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);\n padding: 4px;\n user-select: none;\n }\n\n .zoom-controls button {\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n border-radius: var(--curvature);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n color: #555;\n font-size: 16px;\n line-height: 1;\n outline: none;\n }\n\n .zoom-controls button:hover {\n background: rgba(0, 0, 0, 0.06);\n }\n\n .zoom-controls button:disabled {\n opacity: 0.3;\n cursor: default;\n background: transparent;\n }\n\n .zoom-controls .zoom-level {\n font-size: 12px;\n min-width: 40px;\n text-align: center;\n color: #555;\n font-weight: 500;\n }\n\n .zoom-controls .zoom-divider {\n width: 1px;\n height: 16px;\n background: #e0e0e0;\n margin: 0 2px;\n }\n\n .reflow-card {\n position: absolute;\n top: 16px;\n left: 50%;\n transform: translateX(-50%);\n z-index: 10000;\n background: rgba(0, 0, 0, 0.65);\n backdrop-filter: blur(8px);\n border-radius: 10px;\n padding: 12px 16px 8px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n color: white;\n font-size: 13px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n }\n\n .reflow-card .reflow-top {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .reflow-card .reflow-label {\n white-space: nowrap;\n }\n\n .reflow-card button {\n border: none;\n border-radius: 6px;\n padding: 6px 14px;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n white-space: nowrap;\n transition: opacity 0.15s ease;\n }\n\n .reflow-card button:hover {\n opacity: 0.85;\n }\n\n .reflow-card .reflow-discard {\n background: rgba(255, 255, 255, 0.2);\n color: white;\n }\n\n .reflow-meter {\n height: 3px;\n border-radius: 2px;\n background: rgba(255, 255, 255, 0.15);\n overflow: hidden;\n }\n\n .reflow-meter-fill {\n height: 100%;\n background: rgba(255, 255, 255, 0.5);\n border-radius: 2px;\n animation: reflow-countdown ${unsafeCSS(REFLOW_AUTO_SAVE_DELAY / 1000)}s\n linear forwards;\n }\n\n @keyframes reflow-countdown {\n from {\n width: 100%;\n }\n to {\n width: 0%;\n }\n }\n `;\n }\n\n constructor() {\n super();\n }\n\n protected firstUpdated(\n changes: PropertyValueMap<any> | Map<PropertyKey, unknown>\n ): void {\n super.firstUpdated(changes);\n this.plumber = new Plumber(this.querySelector('#canvas'), this);\n this.setupGlobalEventListeners();\n\n // Eagerly detect touch capability so hover-only controls are visible\n // from the start and scrollbar/touch-action CSS is applied immediately.\n if (navigator.maxTouchPoints > 0) {\n this.markTouchDevice();\n }\n this.updateZoomControlPositioning();\n if (changes.has('flow')) {\n getStore().getState().fetchRevision(`/flow/revisions/${this.flow}`);\n this.fetchRevisions();\n }\n\n this.plumber.on('connection:drag', (connection: any) => {\n this.dragFromNodeId = connection.data.nodeId;\n this.sourceId = connection.sourceId;\n this.connectionSourceX = connection.sourceX;\n this.connectionSourceY = connection.sourceY;\n this.originalConnectionTargetId = connection.target.id;\n });\n\n this.plumber.on('connection:abort', (info) => {\n this.makeConnection(info);\n });\n\n this.plumber.on('connection:detach', (info) => {\n // console.log('Connection detached', info);\n this.makeConnection(info);\n });\n }\n\n private makeConnection(info) {\n if (this.sourceId && this.targetId && this.isValidTarget) {\n // going to the same target, just put it back\n if (info.target.id === this.targetId) {\n this.plumber.connectIds(\n this.dragFromNodeId,\n this.sourceId,\n this.targetId\n );\n }\n // otherwise update the connection\n else {\n getStore()\n .getState()\n .updateConnection(this.dragFromNodeId, this.sourceId, this.targetId);\n }\n } else if (\n this.connectionPlaceholder &&\n this.connectionPlaceholder.visible &&\n this.sourceId\n ) {\n // Snap the placeholder position to grid\n const snappedPosition = {\n left: snapToGrid(this.connectionPlaceholder.position.left),\n top: snapToGrid(this.connectionPlaceholder.position.top)\n };\n const isDragUp = !!this.connectionPlaceholder.dragUp;\n\n // Update the placeholder to the snapped position\n this.connectionPlaceholder.position = snappedPosition;\n\n // Store the pending connection info\n this.pendingCanvasConnection = {\n fromNodeId: this.dragFromNodeId,\n exitId: this.sourceId,\n position: snappedPosition\n };\n\n // Show the context menu near the placeholder\n const canvas = this.querySelector('#canvas');\n if (canvas) {\n const canvasRect = canvas.getBoundingClientRect();\n const menuX = canvasRect.left + snappedPosition.left * this.zoom - 40;\n const menuY = isDragUp\n ? canvasRect.top + snappedPosition.top * this.zoom + 74 // just below placeholder bottom\n : canvasRect.top + snappedPosition.top * this.zoom + 80; // just below placeholder\n\n const canvasMenu = this.querySelector(\n 'temba-canvas-menu'\n ) as CanvasMenu;\n if (canvasMenu) {\n canvasMenu.show(\n menuX,\n menuY,\n {\n x: snappedPosition.left,\n y: snappedPosition.top\n },\n false, // Don't show sticky note option for connection drops\n false,\n this.flowType === 'message'\n );\n }\n }\n\n // Request update to render the connection line\n this.requestUpdate();\n\n // Don't clear placeholder or connection info yet - keep them for menu interaction\n return;\n }\n\n // Clean up visual feedback\n document.querySelectorAll('temba-flow-node').forEach((node) => {\n node.classList.remove(\n 'connection-target-valid',\n 'connection-target-invalid'\n );\n });\n\n // Clear connection state (but keep sourceId/dragFromNodeId if we have a pending connection)\n if (!this.pendingCanvasConnection) {\n this.sourceId = null;\n this.connectionSourceX = null;\n this.connectionSourceY = null;\n this.dragFromNodeId = null;\n }\n this.targetId = null;\n this.isValidTarget = true;\n }\n\n protected updated(\n changes: PropertyValueMap<any> | Map<PropertyKey, unknown>\n ): void {\n super.updated(changes);\n if (changes.has('canvasSize')) {\n // console.log('Setting canvas size', this.canvasSize);\n }\n\n if (changes.has('definition')) {\n this.updateCanvasSize();\n\n // Set flowType from the loaded definition\n if (this.definition?.type) {\n this.flowType = this.getFlowTypeFromDefinition(this.definition.type);\n }\n\n const filters = this.definition?._ui?.translation_filters || {\n categories: false\n };\n const normalizedFilters = {\n categories: !!filters.categories\n };\n\n if (this.translationFilters.categories !== normalizedFilters.categories) {\n this.translationFilters = normalizedFilters;\n }\n\n this.translationCache.clear();\n\n // Start fetching activity data when definition is loaded\n if (this.definition?.uuid) {\n this.startActivityFetching();\n }\n }\n\n if (changes.has('simulatorActive')) {\n if (this.simulatorActive) {\n // Stop polling when simulator becomes active\n this.stopActivityFetching();\n } else {\n // Resume polling and refresh activity when simulator closes\n this.activityInterval = 100; // Reset to fast initial interval\n this.startActivityFetching();\n }\n }\n\n if (changes.has('activityData')) {\n // Update plumber with new activity data\n if (this.plumber) {\n this.plumber.setActivityData(this.activityData);\n }\n }\n\n if (changes.has('dirtyDate')) {\n if (this.dirtyDate) {\n if (this.reflowPending) {\n // This dirtyDate is from the reflow itself — suppress save\n this.reflowPending = false;\n } else {\n // Normal change — if reflow card was showing, it goes away\n // because these changes will be included in the save\n if (this.reflowUnsaved) {\n this.reflowUnsaved = false;\n this.savedReflowPositions = null;\n this.clearReflowAutoSaveTimer();\n }\n this.isSaving = true;\n this.debouncedSave();\n }\n }\n }\n\n if (changes.has('saveError') && this.saveError) {\n this.showSaveErrorDialog(this.saveError);\n this.saveError = null;\n }\n\n if (changes.has('languageCode')) {\n this.translationCache.clear();\n }\n }\n\n /**\n * Map FlowDefinition type to Editor flowType\n * FlowDefinition uses: 'messaging', 'messaging_background', 'messaging_offline', 'voice'\n * Editor uses: 'message', 'voice', 'background'\n */\n private getFlowTypeFromDefinition(definitionType: string): string {\n if (definitionType === 'voice') {\n return 'voice';\n } else if (\n definitionType === 'messaging_background' ||\n definitionType === 'messaging_offline'\n ) {\n return 'background';\n } else {\n // 'messaging' or any other messaging type defaults to 'message'\n return 'message';\n }\n }\n\n private debouncedSave(): void {\n // Clear any existing timer\n if (this.saveTimer !== null) {\n clearTimeout(this.saveTimer);\n }\n\n this.saveTimer = window.setTimeout(() => {\n // Don't auto-save while a reflow preview is pending user confirmation\n if (this.reflowUnsaved) {\n this.saveTimer = null;\n return;\n }\n\n const now = new Date();\n const timeSinceLastChange = now.getTime() - this.dirtyDate.getTime();\n\n if (timeSinceLastChange >= SAVE_QUIET_TIME) {\n this.saveChanges();\n this.saveTimer = null;\n } else {\n this.debouncedSave();\n }\n }, SAVE_QUIET_TIME);\n }\n\n private definitionForSave(definition: FlowDefinition): FlowDefinition {\n return {\n ...definition,\n _ui: {\n ...definition._ui,\n editor: TEMBA_COMPONENTS_VERSION\n }\n };\n }\n\n private saveChanges(definitionOverride?: FlowDefinition): Promise<void> {\n const definition = this.definitionForSave(\n definitionOverride || this.definition\n );\n this.isSaving = true;\n\n return getStore()\n .postJSON(`/flow/revisions/${this.flow}/`, definition)\n .then((response) => {\n if (response.status < 200 || response.status >= 300) {\n this.saveError = this.extractErrorMessage(response);\n return;\n }\n\n // Update flow info and revision with the response data\n if (response.json) {\n const state = getStore().getState();\n\n if (response.json.info) {\n state.setFlowInfo(response.json.info);\n }\n\n if (response.json.revision?.revision !== undefined) {\n state.setRevision(response.json.revision.revision);\n }\n\n // Refresh revisions list so the tab visibility stays up to date\n this.fetchRevisions();\n }\n\n getStore().getState().setDirtyDate(null);\n })\n .catch((error) => {\n console.error('Failed to save flow:', error);\n if (error instanceof Response) {\n this.saveError = `Server error (${error.status}). Your changes have not been saved.`;\n } else {\n this.saveError =\n 'Unable to reach the server. Please check your connection and try again.';\n }\n })\n .finally(() => {\n this.isSaving = false;\n });\n }\n\n private extractErrorMessage(response: WebResponse): string {\n if (response.json) {\n if (typeof response.json.detail === 'string') {\n return response.json.detail;\n }\n if (typeof response.json.error === 'string') {\n return response.json.error;\n }\n if (typeof response.json.description === 'string') {\n return response.json.description;\n }\n }\n return `Save failed with status ${response.status}.`;\n }\n\n private showSaveErrorDialog(message: string): void {\n const dialog = document.createElement('temba-dialog') as Dialog;\n dialog.header = 'Save Failed';\n dialog.primaryButtonName = '';\n dialog.cancelButtonName = 'Dismiss';\n\n const content = document.createElement('div');\n content.style.cssText = 'padding: 20px; font-size: 14px; line-height: 1.5;';\n content.textContent = message;\n dialog.appendChild(content);\n\n document.body.appendChild(dialog);\n dialog.open = true;\n\n dialog.addEventListener('temba-dialog-hidden', () => {\n document.body.removeChild(dialog);\n });\n }\n\n private startActivityFetching(): void {\n // Don't start if simulator is active\n if (this.simulatorActive) {\n return;\n }\n // Fetch immediately\n this.fetchActivityData();\n }\n\n private stopActivityFetching(): void {\n if (this.activityTimer !== null) {\n clearTimeout(this.activityTimer);\n this.activityTimer = null;\n }\n }\n\n private fetchActivityData(): void {\n if (!this.definition?.uuid) {\n return;\n }\n\n // Don't fetch if simulator is active\n if (this.simulatorActive) {\n return;\n }\n\n const activityEndpoint = `/flow/activity/${this.definition.uuid}/`;\n const store = getStore();\n if (!store) {\n return;\n }\n const state = store.getState();\n state.fetchActivity(activityEndpoint).then(() => {\n // Guard against responses arriving after the editor is disconnected\n if (!this.isConnected) {\n return;\n }\n\n // Schedule next fetch with exponential backoff (max 5 minutes)\n this.activityInterval = Math.min(60000 * 5, this.activityInterval + 100);\n\n if (this.activityTimer !== null) {\n clearTimeout(this.activityTimer);\n }\n\n this.activityTimer = window.setTimeout(() => {\n this.fetchActivityData();\n }, this.activityInterval);\n });\n }\n\n private handleLanguageChange(languageCode: string): void {\n zustand.getState().setLanguageCode(languageCode);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.stopAutoScroll();\n if (this.saveTimer !== null) {\n clearTimeout(this.saveTimer);\n this.saveTimer = null;\n }\n if (this.activityTimer !== null) {\n clearTimeout(this.activityTimer);\n this.activityTimer = null;\n }\n this.clearReflowAutoSaveTimer();\n document.removeEventListener('mousemove', this.boundMouseMove);\n document.removeEventListener('mouseup', this.boundMouseUp);\n document.removeEventListener('mousedown', this.boundGlobalMouseDown);\n document.removeEventListener('keydown', this.boundKeyDown);\n document.removeEventListener('touchmove', this.boundTouchMove);\n document.removeEventListener('touchend', this.boundTouchEnd);\n document.removeEventListener('touchcancel', this.boundTouchCancel);\n\n const canvas = this.querySelector('#canvas');\n if (canvas) {\n canvas.removeEventListener('contextmenu', this.boundCanvasContextMenu);\n canvas.removeEventListener('touchstart', this.boundCanvasTouchStart);\n }\n\n const editor = this.querySelector('#editor');\n if (editor) {\n editor.removeEventListener('wheel', this.boundWheel);\n }\n\n // Clear all flow-specific data from the store so stale data\n // isn't briefly visible when a different flow is opened.\n zustand.getState().clearFlowData();\n }\n\n private setupGlobalEventListeners(): void {\n document.addEventListener('mousemove', this.boundMouseMove);\n document.addEventListener('mouseup', this.boundMouseUp);\n document.addEventListener('mousedown', this.boundGlobalMouseDown);\n document.addEventListener('keydown', this.boundKeyDown);\n document.addEventListener('touchmove', this.boundTouchMove, {\n passive: false\n });\n document.addEventListener('touchend', this.boundTouchEnd);\n document.addEventListener('touchcancel', this.boundTouchCancel);\n\n // Fallback: on first touch, mark as touch device in case\n // navigator.maxTouchPoints wasn't detected in firstUpdated.\n const markTouchOnce = () => {\n this.markTouchDevice();\n document.removeEventListener('touchstart', markTouchOnce);\n };\n document.addEventListener('touchstart', markTouchOnce);\n\n const canvas = this.querySelector('#canvas');\n if (canvas) {\n canvas.addEventListener('contextmenu', this.boundCanvasContextMenu);\n canvas.addEventListener('touchstart', this.boundCanvasTouchStart, {\n passive: false\n });\n }\n\n const editor = this.querySelector('#editor');\n if (editor) {\n editor.addEventListener('wheel', this.boundWheel, { passive: false });\n }\n\n // Listen for action edit requests from flow nodes\n this.addEventListener(\n CustomEventType.ActionEditRequested,\n this.handleActionEditRequested.bind(this)\n );\n\n // Listen for add action requests from flow nodes\n this.addEventListener(\n CustomEventType.AddActionRequested,\n this.handleAddActionRequested.bind(this)\n );\n\n // Listen for node edit requests from flow nodes\n this.addEventListener(\n CustomEventType.NodeEditRequested,\n this.handleNodeEditRequested.bind(this)\n );\n\n // Listen for node deletion events\n this.addEventListener(\n CustomEventType.NodeDeleted,\n this.handleNodeDeleted.bind(this)\n );\n\n // Listen for canvas menu selections\n this.addEventListener(CustomEventType.Selection, (event: CustomEvent) => {\n const target = event.target as HTMLElement;\n if (target.tagName === 'TEMBA-CANVAS-MENU') {\n this.handleCanvasMenuSelection(event);\n } else if (target.tagName === 'TEMBA-NODE-TYPE-SELECTOR') {\n this.handleNodeTypeSelection(event);\n }\n });\n\n // Listen for canvas menu cancel (close without selection)\n this.addEventListener(CustomEventType.Canceled, (event: CustomEvent) => {\n const target = event.target as HTMLElement;\n if (target.tagName === 'TEMBA-CANVAS-MENU') {\n this.handleCanvasMenuClosed();\n } else if (target.tagName === 'TEMBA-NODE-TYPE-SELECTOR') {\n this.handleNodeTypeSelectorClosed();\n }\n });\n\n // Listen for action drag events from nodes\n this.addEventListener(\n CustomEventType.DragExternal,\n this.handleActionDragExternal.bind(this)\n );\n\n this.addEventListener(\n CustomEventType.DragInternal,\n this.handleActionDragInternal.bind(this)\n );\n\n this.addEventListener(CustomEventType.DragStop, (event: CustomEvent) => {\n if (event.detail.isExternal) {\n this.handleActionDropExternal(event);\n }\n });\n }\n\n private getPosition(uuid: string, type: 'node' | 'sticky'): FlowPosition {\n if (type === 'node') {\n return this.definition._ui.nodes[uuid]?.position;\n } else {\n return this.definition._ui.stickies?.[uuid]?.position;\n }\n }\n\n private handleMouseDown(event: MouseEvent): void {\n if (isRightClick(event)) return;\n\n if (this.isReadOnly()) return;\n this.blurActiveContentEditable();\n\n const element = event.currentTarget as HTMLElement;\n // Only start dragging if clicking on the element itself, not on exits or other interactive elements\n const target = event.target as HTMLElement;\n if (\n target.classList.contains('exit') ||\n target.closest('.exit') ||\n target.closest('.linked-name')\n ) {\n return;\n }\n\n const uuid = element.getAttribute('uuid');\n const type = element.tagName === 'TEMBA-FLOW-NODE' ? 'node' : 'sticky';\n\n const position = this.getPosition(uuid, type);\n if (!position) return;\n\n // If clicking on a non-selected item, clear selection unless Ctrl/Cmd is held\n if (!this.selectedItems.has(uuid) && !event.ctrlKey && !event.metaKey) {\n this.selectedItems.clear();\n // Don't add single items to selection - single clicks just clear existing selection\n } else if (!this.selectedItems.has(uuid)) {\n // Add this item to selection only if Ctrl/Cmd is held\n this.selectedItems.add(uuid);\n }\n\n // Always set up drag state regardless of selection status\n // This allows single nodes to be dragged without being selected\n this.isMouseDown = true;\n this.dragStartPos = { x: event.clientX, y: event.clientY };\n this.startPos = { left: position.left, top: position.top };\n this.currentDragItem = {\n uuid,\n position,\n element,\n type\n };\n\n event.preventDefault();\n event.stopPropagation();\n }\n\n /**\n * Mirror of handleMouseDown for touch devices.\n * Sets up the same drag state so handleTouchMove/End can drive the drag.\n */\n /* c8 ignore start -- touch-only handlers untestable in headless Chromium */\n\n /**\n * Mark the editor as a touch device — adds classes to #canvas and\n * #editor so touch-specific CSS activates (visible controls,\n * always-on scrollbars, touch-action: none).\n */\n private markTouchDevice(): void {\n if (this.isTouchDevice) return;\n this.isTouchDevice = true;\n this.querySelector('#canvas')?.classList.add('touch-device');\n this.querySelector('#editor')?.classList.add('touch-device');\n }\n\n private handleItemTouchStart(event: TouchEvent): void {\n this.markTouchDevice();\n\n if (this.isReadOnly()) return;\n this.blurActiveContentEditable();\n\n const touch = event.touches[0];\n if (!touch) return;\n\n const element = event.currentTarget as HTMLElement;\n const target = event.target as HTMLElement;\n if (\n target.classList.contains('exit') ||\n target.closest('.exit') ||\n target.closest('.linked-name')\n ) {\n return;\n }\n\n const uuid = element.getAttribute('uuid');\n const type = element.tagName === 'TEMBA-FLOW-NODE' ? 'node' : 'sticky';\n\n const position = this.getPosition(uuid, type);\n if (!position) return;\n\n // Touch doesn't support Ctrl/Cmd selection — just clear\n if (!this.selectedItems.has(uuid)) {\n this.selectedItems.clear();\n }\n\n this.isMouseDown = true;\n this.dragStartPos = { x: touch.clientX, y: touch.clientY };\n this.startPos = { left: position.left, top: position.top };\n this.currentDragItem = {\n uuid,\n position,\n element,\n type\n };\n\n // Don't preventDefault here — allow the threshold check in touchmove\n // to decide whether this is a drag or a tap\n event.stopPropagation();\n }\n\n /* c8 ignore stop */\n\n private handleGlobalMouseDown(event: MouseEvent): void {\n if (isRightClick(event)) return;\n\n // Check if the click is within our canvas\n const canvasRect = this.querySelector('#grid')?.getBoundingClientRect();\n\n if (!canvasRect) return;\n\n const isWithinCanvas =\n event.clientX >= canvasRect.left &&\n event.clientX <= canvasRect.right &&\n event.clientY >= canvasRect.top &&\n event.clientY <= canvasRect.bottom;\n\n if (!isWithinCanvas) return;\n\n // Check if we clicked on a draggable item (node or sticky)\n const target = event.target as HTMLElement;\n const clickedOnDraggable = target.closest('.draggable');\n\n if (clickedOnDraggable) {\n // This is handled by the individual item mousedown handlers\n return;\n }\n\n // We clicked on empty canvas space, start selection\n this.handleCanvasMouseDown(event);\n }\n\n private blurActiveContentEditable(): void {\n let active: Element | null = document.activeElement;\n while (active?.shadowRoot?.activeElement) {\n active = active.shadowRoot.activeElement;\n }\n if (\n active instanceof HTMLElement &&\n active.getAttribute('contenteditable') === 'true'\n ) {\n active.blur();\n }\n }\n\n private handleCanvasMouseDown(event: MouseEvent): void {\n if (this.isReadOnly()) return;\n this.blurActiveContentEditable();\n\n const target = event.target as HTMLElement;\n if (target.id === 'canvas' || target.id === 'grid') {\n // Ignore clicks on exits\n\n // Start selection box\n this.canvasMouseDown = true;\n this.dragStartPos = { x: event.clientX, y: event.clientY };\n\n const canvasRect = this.querySelector('#canvas')?.getBoundingClientRect();\n if (canvasRect) {\n // Clear current selection\n this.selectedItems.clear();\n\n const relativeX = (event.clientX - canvasRect.left) / this.zoom;\n const relativeY = (event.clientY - canvasRect.top) / this.zoom;\n\n this.selectionBox = {\n startX: relativeX,\n startY: relativeY,\n endX: relativeX,\n endY: relativeY\n };\n }\n\n event.preventDefault();\n }\n }\n\n private handleKeyDown(event: KeyboardEvent): void {\n if (event.key === 'Delete' || event.key === 'Backspace') {\n if (this.selectedItems.size > 0) {\n this.showDeleteConfirmation();\n }\n }\n if (event.key === 'Escape') {\n this.selectedItems.clear();\n this.requestUpdate();\n }\n }\n\n // --- Zoom ---\n\n private setZoom(\n newZoom: number,\n center?: { clientX: number; clientY: number }\n ): void {\n const clamped = Math.max(\n 0.1,\n Math.min(1.0, Math.round(newZoom * 100) / 100)\n );\n if (clamped === this.zoom) return;\n\n const editor = this.querySelector('#editor') as HTMLElement;\n const oldZoom = this.zoom;\n this.zoom = clamped;\n this.plumber.zoom = clamped;\n this.zoomFitted = false;\n\n if (editor && center) {\n const editorRect = editor.getBoundingClientRect();\n const ox = center.clientX - editorRect.left;\n const oy = center.clientY - editorRect.top;\n // Canvas point under cursor at old zoom\n const cx = (editor.scrollLeft + ox) / oldZoom;\n const cy = (editor.scrollTop + oy) / oldZoom;\n\n requestAnimationFrame(() => {\n editor.scrollLeft = cx * clamped - ox;\n editor.scrollTop = cy * clamped - oy;\n this.plumber.repaintEverything();\n });\n } else {\n requestAnimationFrame(() => this.plumber.repaintEverything());\n }\n }\n\n private zoomIn(): void {\n this.setZoom(this.zoom + 0.05);\n }\n\n private zoomOut(): void {\n this.setZoom(this.zoom - 0.05);\n }\n\n private zoomToFit(): void {\n if (!this.definition || this.definition.nodes.length === 0) return;\n\n const editor = this.querySelector('#editor') as HTMLElement;\n if (!editor) return;\n\n // Calculate bounding box of all content in canvas coordinates\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n this.definition.nodes.forEach((node) => {\n const ui = this.definition._ui?.nodes[node.uuid];\n if (!ui?.position) return;\n const el = this.querySelector(`[id=\"${node.uuid}\"]`) as HTMLElement;\n if (!el) return;\n const w = el.offsetWidth;\n const h = el.offsetHeight;\n minX = Math.min(minX, ui.position.left);\n minY = Math.min(minY, ui.position.top);\n maxX = Math.max(maxX, ui.position.left + w);\n maxY = Math.max(maxY, ui.position.top + h);\n });\n\n const stickies = this.definition._ui?.stickies || {};\n Object.entries(stickies).forEach(([uuid, sticky]) => {\n if (!sticky.position) return;\n const el = this.querySelector(\n `temba-sticky-note[uuid=\"${uuid}\"]`\n ) as HTMLElement;\n if (!el) return;\n const w = el.offsetWidth;\n const h = el.offsetHeight;\n minX = Math.min(minX, sticky.position.left);\n minY = Math.min(minY, sticky.position.top);\n maxX = Math.max(maxX, sticky.position.left + w);\n maxY = Math.max(maxY, sticky.position.top + h);\n });\n\n if (minX === Infinity) return;\n\n const contentWidth = maxX - minX;\n const contentHeight = maxY - minY;\n const padding = 40;\n\n const availWidth = editor.clientWidth - padding * 2;\n const availHeight = editor.clientHeight - padding * 2;\n\n const scaleX = availWidth / contentWidth;\n const scaleY = availHeight / contentHeight;\n let fitZoom = Math.min(scaleX, scaleY, 1.0);\n fitZoom = Math.max(fitZoom, 0.1);\n fitZoom = Math.round(fitZoom * 20) / 20; // round to nearest 0.05\n\n this.zoom = fitZoom;\n this.plumber.zoom = fitZoom;\n this.zoomFitted = true;\n\n // Center of content in canvas coordinates, plus grid/canvas margin offset\n const centerX = (minX + maxX) / 2 + 40;\n const centerY = (minY + maxY) / 2 + 40;\n\n requestAnimationFrame(() => {\n editor.scrollLeft = centerX * fitZoom - editor.clientWidth / 2;\n editor.scrollTop = centerY * fitZoom - editor.clientHeight / 2;\n this.plumber.repaintEverything();\n });\n }\n\n private zoomToFull(): void {\n this.setZoom(1.0);\n }\n\n /** Adjust zoom control right offset and floating tab positions */\n private updateZoomControlPositioning(): void {\n requestAnimationFrame(() => {\n const editor = this.querySelector('#editor') as HTMLElement;\n const zoomControls = this.querySelector('.zoom-controls') as HTMLElement;\n if (editor && zoomControls) {\n // Match right spacing to the top spacing (8px) by accounting for\n // the scrollbar width\n const scrollbarWidth = editor.offsetWidth - editor.clientWidth;\n zoomControls.style.right = `${8 + scrollbarWidth}px`;\n }\n if (zoomControls) {\n const rect = zoomControls.getBoundingClientRect();\n FloatingTab.START_TOP = rect.bottom + 8;\n FloatingTab.updateAllPositions();\n }\n });\n }\n\n private handleWheel(event: WheelEvent): void {\n if (!event.ctrlKey && !event.metaKey) return;\n event.preventDefault();\n\n const delta = event.deltaY > 0 ? -0.05 : 0.05;\n this.setZoom(this.zoom + delta, {\n clientX: event.clientX,\n clientY: event.clientY\n });\n }\n\n private showDeleteConfirmation(): void {\n const itemCount = this.selectedItems.size;\n const itemType = itemCount === 1 ? 'item' : 'items';\n\n // Create and show confirmation dialog\n const dialog = document.createElement('temba-dialog') as Dialog;\n dialog.header = 'Delete Items';\n dialog.primaryButtonName = 'Delete';\n dialog.cancelButtonName = 'Cancel';\n dialog.destructive = true;\n dialog.innerHTML = `<div style=\"padding: 20px;\">Are you sure you want to delete ${itemCount} ${itemType}?</div>`;\n\n dialog.addEventListener('temba-button-clicked', (event: any) => {\n if (event.detail.button.name === 'Delete') {\n this.deleteSelectedItems();\n dialog.open = false;\n }\n });\n\n // Add to document and show\n document.body.appendChild(dialog);\n dialog.open = true;\n\n // Clean up dialog when closed\n dialog.addEventListener('temba-dialog-hidden', () => {\n document.body.removeChild(dialog);\n });\n }\n\n private performReflow(): void {\n if (!this.definition || this.definition.nodes.length === 0) return;\n\n // Save current positions for discard (nodes + stickies)\n const savedPositions: Record<string, FlowPosition> = {};\n for (const node of this.definition.nodes) {\n const ui = this.definition._ui?.nodes[node.uuid];\n if (ui?.position) {\n savedPositions[node.uuid] = { ...ui.position };\n }\n }\n const stickies = this.definition._ui?.stickies || {};\n for (const [uuid, sticky] of Object.entries(stickies)) {\n if (sticky.position) {\n savedPositions[uuid] = { ...sticky.position };\n }\n }\n this.savedReflowPositions = savedPositions;\n\n // Save old node positions before reflow for sticky proximity calculation\n const oldNodePositions: Record<string, FlowPosition> = {};\n for (const node of this.definition.nodes) {\n const ui = this.definition._ui?.nodes[node.uuid];\n if (ui?.position) {\n oldNodePositions[node.uuid] = { ...ui.position };\n }\n }\n\n // Identify start node (first in sorted array)\n const startNodeUuid = this.definition.nodes[0].uuid;\n\n // Gather node sizes from DOM\n const nodeSizes = new Map<string, { width: number; height: number }>();\n const getNodeSize = (uuid: string): { width: number; height: number } => {\n const element = this.querySelector(`[id=\"${uuid}\"]`) as HTMLElement;\n if (element) {\n const size = {\n width: element.offsetWidth,\n height: element.offsetHeight\n };\n nodeSizes.set(uuid, size);\n return size;\n }\n const fallback = { width: 200, height: 100 };\n nodeSizes.set(uuid, fallback);\n return fallback;\n };\n\n // Compute new layout\n const newPositions = calculateLayeredLayout(\n this.definition.nodes,\n this.definition._ui.nodes,\n startNodeUuid,\n getNodeSize\n );\n\n // Place sticky notes next to their closest nodes\n if (Object.keys(stickies).length > 0) {\n const stickySizes = new Map<string, { width: number; height: number }>();\n for (const uuid of Object.keys(stickies)) {\n const el = this.querySelector(\n `temba-sticky-note[uuid=\"${uuid}\"]`\n ) as HTMLElement;\n if (el) {\n stickySizes.set(uuid, {\n width: el.offsetWidth,\n height: el.offsetHeight\n });\n } else {\n stickySizes.set(uuid, { width: 182, height: 100 });\n }\n }\n\n const stickyPositions = placeStickyNotes(\n stickies,\n oldNodePositions,\n newPositions,\n nodeSizes,\n stickySizes,\n startNodeUuid\n );\n\n // Merge sticky positions into newPositions\n Object.assign(newPositions, stickyPositions);\n }\n\n // Cancel any in-flight save timer so it doesn't persist the reflowed\n // layout before the user has a chance to Save or Discard.\n if (this.saveTimer !== null) {\n clearTimeout(this.saveTimer);\n this.saveTimer = null;\n }\n\n // Suppress the auto-save from this updateCanvasPositions call\n this.reflowPending = true;\n this.reflowUnsaved = true;\n\n // Apply new positions\n getStore().getState().updateCanvasPositions(newPositions);\n\n // Update canvas size and repaint connections\n this.updateCanvasSize();\n requestAnimationFrame(() => {\n this.plumber.repaintEverything();\n });\n\n // Scroll to top-left so the start node is visible\n const editor = this.querySelector('#editor') as HTMLElement;\n if (editor) {\n editor.scrollTo({ left: 0, top: 0, behavior: 'smooth' });\n }\n\n // Start auto-save countdown (duration shared with CSS animation)\n this.clearReflowAutoSaveTimer();\n this.reflowAutoSaveTimer = setTimeout(() => {\n this.reflowAutoSaveTimer = null;\n if (this.reflowUnsaved) {\n this.reflowUnsaved = false;\n this.savedReflowPositions = null;\n this.saveChanges();\n }\n }, REFLOW_AUTO_SAVE_DELAY);\n }\n\n private handleReflowDiscard(): void {\n this.reflowUnsaved = false;\n this.clearReflowAutoSaveTimer();\n\n if (this.savedReflowPositions) {\n // Cancel any pending save timer before reverting\n if (this.saveTimer !== null) {\n clearTimeout(this.saveTimer);\n this.saveTimer = null;\n }\n\n // Suppress the auto-save from reverting positions\n this.reflowPending = true;\n getStore().getState().updateCanvasPositions(this.savedReflowPositions);\n this.savedReflowPositions = null;\n\n // Clear dirty state since we reverted to the saved version\n setTimeout(() => {\n getStore().getState().setDirtyDate(null);\n this.isSaving = false;\n }, 0);\n\n requestAnimationFrame(() => {\n this.plumber.repaintEverything();\n });\n }\n }\n\n private deleteNodes(uuids: string[]): void {\n // Remove nodes from the definition - CanvasNode will handle plumber cleanup\n if (uuids.length > 0) {\n getStore().getState().removeNodes(uuids);\n }\n }\n\n private deleteSelectedItems(): void {\n const nodes = Array.from(this.selectedItems).filter((uuid) =>\n this.definition.nodes.some((node) => node.uuid === uuid)\n );\n this.deleteNodes(Array.from(nodes));\n\n const stickies = Array.from(this.selectedItems).filter(\n (uuid) => this.definition._ui?.stickies?.[uuid]\n );\n\n getStore().getState().removeStickyNotes(stickies);\n\n // Clear selection\n this.selectedItems.clear();\n }\n\n private updateSelectionBox(event: MouseEvent): void {\n if (!this.selectionBox || !this.canvasMouseDown) return;\n\n const canvasRect = this.querySelector('#canvas')?.getBoundingClientRect();\n if (!canvasRect) return;\n\n const relativeX = (event.clientX - canvasRect.left) / this.zoom;\n const relativeY = (event.clientY - canvasRect.top) / this.zoom;\n\n this.selectionBox = {\n ...this.selectionBox,\n endX: relativeX,\n endY: relativeY\n };\n\n // Update selected items based on selection box\n this.updateSelectedItemsFromBox();\n }\n\n private updateSelectedItemsFromBox(): void {\n if (!this.selectionBox) return;\n\n const newSelection = new Set<string>();\n\n const boxLeft = Math.min(this.selectionBox.startX, this.selectionBox.endX);\n const boxTop = Math.min(this.selectionBox.startY, this.selectionBox.endY);\n const boxRight = Math.max(this.selectionBox.startX, this.selectionBox.endX);\n const boxBottom = Math.max(\n this.selectionBox.startY,\n this.selectionBox.endY\n );\n\n // Check nodes\n this.definition?.nodes.forEach((node) => {\n const nodeElement = this.querySelector(\n `[id=\"${node.uuid}\"]`\n ) as HTMLElement;\n if (nodeElement) {\n const position = this.definition._ui?.nodes[node.uuid]?.position;\n if (position) {\n const canvasRect =\n this.querySelector('#canvas')?.getBoundingClientRect();\n\n if (canvasRect) {\n const nodeLeft = position.left;\n const nodeTop = position.top;\n const nodeRight = nodeLeft + nodeElement.offsetWidth;\n const nodeBottom = nodeTop + nodeElement.offsetHeight;\n\n // Check if selection box intersects with node\n if (\n boxLeft < nodeRight &&\n boxRight > nodeLeft &&\n boxTop < nodeBottom &&\n boxBottom > nodeTop\n ) {\n newSelection.add(node.uuid);\n }\n }\n }\n }\n });\n\n // Check sticky notes\n const stickies = this.definition?._ui?.stickies || {};\n Object.entries(stickies).forEach(([uuid, sticky]) => {\n if (sticky.position) {\n const stickyElement = this.querySelector(\n `temba-sticky-note[uuid=\"${uuid}\"]`\n ) as HTMLElement;\n\n if (stickyElement) {\n // Use clientWidth/clientHeight instead of getBoundingClientRect() to get element dimensions\n // This avoids the coordinate system mismatch between viewport and canvas coordinates\n const width = stickyElement.clientWidth;\n const height = stickyElement.clientHeight;\n\n // Use the canvas coordinates from the sticky's position\n const stickyLeft = sticky.position.left;\n const stickyTop = sticky.position.top;\n const stickyRight = stickyLeft + width;\n const stickyBottom = stickyTop + height;\n\n // Check if selection box intersects with sticky\n if (\n boxLeft < stickyRight &&\n boxRight > stickyLeft &&\n boxTop < stickyBottom &&\n boxBottom > stickyTop\n ) {\n newSelection.add(uuid);\n }\n }\n }\n });\n\n this.selectedItems = newSelection;\n }\n\n private renderSelectionBox(): TemplateResult | string {\n if (!this.selectionBox || !this.isSelecting) return '';\n\n const left = Math.min(this.selectionBox.startX, this.selectionBox.endX);\n const top = Math.min(this.selectionBox.startY, this.selectionBox.endY);\n const width = Math.abs(this.selectionBox.endX - this.selectionBox.startX);\n const height = Math.abs(this.selectionBox.endY - this.selectionBox.startY);\n\n return html`<div\n class=\"selection-box\"\n style=\"left: ${left}px; top: ${top}px; width: ${width}px; height: ${height}px;\"\n ></div>`;\n }\n\n private renderCanvasDropPreview(): TemplateResult | string {\n if (!this.canvasDropPreview) return '';\n\n const { action, position } = this.canvasDropPreview;\n const actionConfig = ACTION_CONFIG[action.type];\n\n if (!actionConfig) return '';\n\n return html`<div\n class=\"canvas-drop-preview\"\n style=\"position: absolute; left: ${position.left}px; top: ${position.top}px; opacity: 0.6; pointer-events: none; z-index: 10000;\"\n >\n <div\n class=\"node execute-actions\"\n style=\"outline: 3px dashed var(--color-primary, #3b82f6); outline-offset: 2px; border-radius: var(--curvature);\"\n >\n <div class=\"action sortable ${action.type}\">\n <div class=\"action-content\">\n <div\n class=\"cn-title\"\n style=\"background: ${actionConfig.group\n ? ACTION_GROUP_METADATA[actionConfig.group]?.color\n : '#aaaaaa'}\"\n >\n <div class=\"title-spacer\"></div>\n <div class=\"name\">${actionConfig.name}</div>\n <div class=\"title-spacer\"></div>\n </div>\n <div class=\"body\">\n ${actionConfig.render\n ? actionConfig.render({ actions: [action] } as any, action)\n : html`<pre>${action.type}</pre>`}\n </div>\n </div>\n </div>\n <div class=\"action-exits\">\n <div class=\"exit-wrapper\">\n <div class=\"exit\"></div>\n </div>\n </div>\n </div>\n </div>`;\n }\n\n private renderConnectionPlaceholder(): TemplateResult | string {\n if (!this.connectionPlaceholder || !this.connectionPlaceholder.visible)\n return '';\n\n const { position, dragUp } = this.connectionPlaceholder;\n\n // Render connection line when we have a pending connection (after drop)\n let svgPath = null;\n if (\n this.sourceId &&\n this.dragFromNodeId &&\n this.pendingCanvasConnection &&\n this.connectionSourceX != null &&\n this.connectionSourceY != null\n ) {\n const sourceX = this.connectionSourceX;\n const sourceY = this.connectionSourceY;\n const targetX = position.left + 100;\n // When dragging up, connect to the placeholder bottom; otherwise to the top\n const targetY = dragUp ? position.top + 64 : position.top;\n\n const routeFace: 'top' | 'left' | 'right' = dragUp\n ? targetX < sourceX\n ? 'left'\n : 'right'\n : 'top';\n\n const pathData = calculateFlowchartPath(\n sourceX,\n sourceY,\n targetX,\n targetY,\n 20,\n dragUp ? 0 : 10,\n 5,\n routeFace\n );\n\n const aw = ARROW_HALF_WIDTH;\n const al = ARROW_LENGTH;\n let arrowPoints: string;\n if (dragUp) {\n // Arrow tip pointing up, base at placeholder bottom\n arrowPoints = `${targetX},${targetY - al} ${targetX - aw},${targetY} ${\n targetX + aw\n },${targetY}`;\n } else {\n // Arrow pointing down into top of placeholder\n arrowPoints = `${targetX},${targetY} ${targetX - aw},${targetY - al} ${\n targetX + aw\n },${targetY - al}`;\n }\n\n svgPath = html`\n <svg\n style=\"position: absolute; left: 0; top: 0; width: 100%; height: 100%; pointer-events: none; z-index: 9999;\"\n >\n <path\n d=\"${pathData}\"\n fill=\"none\"\n stroke=\"var(--color-connectors, #ccc)\"\n stroke-width=\"3\"\n />\n <polygon\n points=\"${arrowPoints}\"\n fill=\"var(--color-connectors, #ccc)\"\n />\n </svg>\n `;\n }\n\n return html`${svgPath}\n <div\n class=\"connection-placeholder\"\n style=\"position: absolute; left: ${position.left}px; top: ${position.top}px; opacity: 0.6; pointer-events: none; z-index: 10000;\"\n >\n <div\n class=\"node execute-actions\"\n style=\"outline: 3px dashed var(--color-primary, #3b82f6); outline-offset: 2px; border-radius: var(--curvature); min-width: 200px;\"\n >\n <div class=\"empty-node-placeholder\" style=\"height: 60px;\"></div>\n <div class=\"action-exits\">\n <div class=\"exit-wrapper\">\n <div class=\"exit\"></div>\n </div>\n </div>\n </div>\n </div>`;\n }\n\n /**\n * Checks for node collisions and reflows nodes as needed.\n * Sacred nodes (just moved/dropped) keep their positions while\n * other nodes are moved in the least-disruptive direction.\n */\n private checkCollisionsAndReflow(sacredNodeUuids: string[]): void {\n if (!this.definition) return;\n\n const allBounds: NodeBounds[] = [];\n for (const node of this.definition.nodes) {\n const nodeUI = this.definition._ui?.nodes[node.uuid];\n if (!nodeUI?.position) continue;\n\n const bounds = getNodeBounds(node.uuid, nodeUI.position);\n if (bounds) {\n allBounds.push(bounds);\n }\n }\n\n const reflowPositions = calculateReflowPositions(\n sacredNodeUuids,\n allBounds\n );\n\n if (reflowPositions.size > 0) {\n const positions: { [uuid: string]: FlowPosition } = {};\n for (const [uuid, position] of reflowPositions.entries()) {\n positions[uuid] = position;\n }\n getStore().getState().updateCanvasPositions(positions);\n }\n }\n\n /* c8 ignore start -- touch-only handlers */\n\n /**\n * Find the temba-flow-node element at the given viewport coordinates.\n * Uses elementFromPoint which works for both mouse and touch input.\n */\n private findTargetNodeAt(clientX: number, clientY: number): Element | null {\n const el = document.elementFromPoint(clientX, clientY);\n return el?.closest('temba-flow-node') ?? null;\n }\n\n /**\n * Handle touchstart on the canvas element. Mirrors handleGlobalMouseDown\n * + handleCanvasMouseDown for touch: starts selection on empty canvas,\n * and detects double-tap to show the context menu.\n */\n private handleCanvasTouchStart(event: TouchEvent): void {\n this.markTouchDevice();\n\n const touch = event.touches[0];\n if (!touch) return;\n\n // Only handle touches directly on canvas/grid (not on nodes)\n const target = event.target as HTMLElement;\n if (target.closest('.draggable')) return;\n if (target.id !== 'canvas' && target.id !== 'grid') return;\n\n // Two-finger touch on canvas — record start position and enter the\n // two-finger state immediately (even before any touchmove). If the\n // fingers lift without panning, we show the context menu (handleTouchEnd).\n if (event.touches.length >= 2) {\n // Cancel any single-finger selection that the first touch started\n this.canvasMouseDown = false;\n this.isSelecting = false;\n this.selectionBox = null;\n\n this.isTwoFingerPanning = true;\n this.twoFingerOnCanvas = true;\n this.twoFingerDidPan = false;\n this.twoFingerStartMidX =\n (event.touches[0].clientX + event.touches[1].clientX) / 2;\n this.twoFingerStartMidY =\n (event.touches[0].clientY + event.touches[1].clientY) / 2;\n this.lastPanX = this.twoFingerStartMidX;\n this.lastPanY = this.twoFingerStartMidY;\n return;\n }\n\n // Start selection box (mirrors handleCanvasMouseDown)\n if (this.isReadOnly()) return;\n\n this.canvasMouseDown = true;\n this.dragStartPos = { x: touch.clientX, y: touch.clientY };\n\n const canvasRect = this.querySelector('#canvas')?.getBoundingClientRect();\n if (canvasRect) {\n this.selectedItems.clear();\n\n const relativeX = (touch.clientX - canvasRect.left) / this.zoom;\n const relativeY = (touch.clientY - canvasRect.top) / this.zoom;\n\n this.selectionBox = {\n startX: relativeX,\n startY: relativeY,\n endX: relativeX,\n endY: relativeY\n };\n }\n\n event.preventDefault();\n }\n\n /* c8 ignore stop */\n\n private handleMouseMove(event: MouseEvent): void {\n // Handle selection box drawing\n if (this.canvasMouseDown && !this.isMouseDown) {\n this.isSelecting = true;\n this.updateSelectionBox(event);\n this.requestUpdate(); // Force re-render\n return;\n }\n\n if (this.plumber.connectionDragging) {\n const targetNode = document.querySelector('temba-flow-node:hover');\n\n // Clear previous target styles\n document.querySelectorAll('temba-flow-node').forEach((node) => {\n node.classList.remove(\n 'connection-target-valid',\n 'connection-target-invalid'\n );\n });\n\n if (targetNode) {\n this.targetId = targetNode.getAttribute('uuid');\n // Check if target is different from source node (prevent self-targeting)\n this.isValidTarget = this.targetId !== this.dragFromNodeId;\n\n // Apply visual feedback based on validity\n if (this.isValidTarget) {\n targetNode.classList.add('connection-target-valid');\n } else {\n targetNode.classList.add('connection-target-invalid');\n }\n\n // Hide connection placeholder when over a node\n this.connectionPlaceholder = null;\n } else {\n this.targetId = null;\n this.isValidTarget = true;\n\n // Show connection placeholder when over empty canvas\n const canvas = this.querySelector('#canvas');\n if (canvas) {\n const canvasRect = canvas.getBoundingClientRect();\n const relativeX = (event.clientX - canvasRect.left) / this.zoom;\n const relativeY = (event.clientY - canvasRect.top) / this.zoom;\n\n const placeholderWidth = 200;\n const placeholderHeight = 64;\n const arrowLength = ARROW_LENGTH;\n const cursorGap = CURSOR_GAP;\n\n // Determine if cursor is above the source exit using stored sourceY\n const dragUp =\n this.connectionSourceY != null\n ? relativeY < this.connectionSourceY\n : false;\n\n let top: number;\n if (dragUp) {\n // Arrow points up: tip at cy + cursorGap.\n // Placeholder bottom should sit just above the arrow tip.\n top = relativeY + cursorGap - placeholderHeight;\n } else {\n // Arrow points down: tip at cy - cursorGap + arrowLength.\n // Placeholder top sits just below the arrow tip.\n top = relativeY - cursorGap + arrowLength;\n }\n\n this.connectionPlaceholder = {\n position: {\n left: relativeX - placeholderWidth / 2,\n top\n },\n visible: true,\n dragUp\n };\n }\n }\n\n // Force update to show/hide placeholder\n this.requestUpdate();\n }\n\n // Handle item dragging\n if (!this.isMouseDown || !this.currentDragItem) return;\n\n this.lastPointerPos = { clientX: event.clientX, clientY: event.clientY };\n\n const deltaX = event.clientX - this.dragStartPos.x + this.autoScrollDeltaX;\n const deltaY = event.clientY - this.dragStartPos.y + this.autoScrollDeltaY;\n const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n\n // Only start dragging if we've moved beyond the threshold\n if (!this.isDragging && distance > DRAG_THRESHOLD) {\n this.isDragging = true;\n this.startAutoScroll();\n }\n\n // If we're actually dragging, update positions\n if (this.isDragging) {\n this.updateDragPositions();\n }\n }\n\n private updateDragPositions(): void {\n if (!this.currentDragItem || !this.lastPointerPos) return;\n\n // Convert screen + scroll delta to canvas delta\n const deltaX =\n (this.lastPointerPos.clientX -\n this.dragStartPos.x +\n this.autoScrollDeltaX) /\n this.zoom;\n const deltaY =\n (this.lastPointerPos.clientY -\n this.dragStartPos.y +\n this.autoScrollDeltaY) /\n this.zoom;\n\n const itemsToMove =\n this.selectedItems.has(this.currentDragItem.uuid) &&\n this.selectedItems.size > 1\n ? Array.from(this.selectedItems)\n : [this.currentDragItem.uuid];\n\n itemsToMove.forEach((uuid) => {\n const element = this.querySelector(`[uuid=\"${uuid}\"]`) as HTMLElement;\n if (element) {\n const type = element.tagName === 'TEMBA-FLOW-NODE' ? 'node' : 'sticky';\n const position = this.getPosition(uuid, type);\n\n if (position) {\n element.style.left = `${position.left + deltaX}px`;\n element.style.top = `${position.top + deltaY}px`;\n element.classList.add('dragging');\n }\n }\n });\n\n this.plumber.revalidate(itemsToMove);\n }\n\n private startAutoScroll(): void {\n if (this.autoScrollAnimationId !== null) return;\n\n const editor = this.querySelector('#editor') as HTMLElement;\n if (!editor) return;\n\n const tick = () => {\n if (!this.isDragging || !this.lastPointerPos) {\n this.autoScrollAnimationId = null;\n return;\n }\n\n const editorRect = editor.getBoundingClientRect();\n const mouseX = this.lastPointerPos.clientX;\n const mouseY = this.lastPointerPos.clientY;\n\n let scrollDx = 0;\n let scrollDy = 0;\n\n // Left edge\n const distFromLeft = mouseX - editorRect.left;\n if (distFromLeft >= 0 && distFromLeft < AUTO_SCROLL_EDGE_ZONE) {\n const ratio = 1 - distFromLeft / AUTO_SCROLL_EDGE_ZONE;\n scrollDx = -(ratio * AUTO_SCROLL_MAX_SPEED);\n }\n\n // Right edge\n const distFromRight = editorRect.right - mouseX;\n if (distFromRight >= 0 && distFromRight < AUTO_SCROLL_EDGE_ZONE) {\n const ratio = 1 - distFromRight / AUTO_SCROLL_EDGE_ZONE;\n scrollDx = ratio * AUTO_SCROLL_MAX_SPEED;\n }\n\n // Top edge\n const distFromTop = mouseY - editorRect.top;\n if (distFromTop >= 0 && distFromTop < AUTO_SCROLL_EDGE_ZONE) {\n const ratio = 1 - distFromTop / AUTO_SCROLL_EDGE_ZONE;\n scrollDy = -(ratio * AUTO_SCROLL_MAX_SPEED);\n }\n\n // Bottom edge\n const distFromBottom = editorRect.bottom - mouseY;\n if (distFromBottom >= 0 && distFromBottom < AUTO_SCROLL_EDGE_ZONE) {\n const ratio = 1 - distFromBottom / AUTO_SCROLL_EDGE_ZONE;\n scrollDy = ratio * AUTO_SCROLL_MAX_SPEED;\n }\n\n if (scrollDx !== 0 || scrollDy !== 0) {\n const beforeScrollLeft = editor.scrollLeft;\n const beforeScrollTop = editor.scrollTop;\n\n // Expand canvas if scrolling toward bottom/right edges\n // Convert from scroll space to canvas space for expandCanvas\n if (scrollDx > 0 || scrollDy > 0) {\n const neededWidth =\n (editor.scrollLeft + editor.clientWidth + scrollDx) / this.zoom;\n const neededHeight =\n (editor.scrollTop + editor.clientHeight + scrollDy) / this.zoom;\n getStore().getState().expandCanvas(neededWidth, neededHeight);\n }\n\n editor.scrollLeft += scrollDx;\n editor.scrollTop += scrollDy;\n\n // Track actual scroll delta (browser clamps at boundaries)\n const actualDx = editor.scrollLeft - beforeScrollLeft;\n const actualDy = editor.scrollTop - beforeScrollTop;\n this.autoScrollDeltaX += actualDx;\n this.autoScrollDeltaY += actualDy;\n\n if (actualDx !== 0 || actualDy !== 0) {\n this.updateDragPositions();\n }\n }\n\n this.autoScrollAnimationId = requestAnimationFrame(tick);\n };\n\n this.autoScrollAnimationId = requestAnimationFrame(tick);\n }\n\n private stopAutoScroll(): void {\n if (this.autoScrollAnimationId !== null) {\n cancelAnimationFrame(this.autoScrollAnimationId);\n this.autoScrollAnimationId = null;\n }\n }\n\n private handleMouseUp(event: MouseEvent): void {\n // Handle selection box completion\n if (this.canvasMouseDown && this.isSelecting) {\n this.isSelecting = false;\n this.selectionBox = null;\n this.canvasMouseDown = false;\n this.requestUpdate();\n return;\n }\n\n // Handle canvas click (clear selection)\n if (this.canvasMouseDown && !this.isSelecting) {\n this.canvasMouseDown = false;\n return;\n }\n\n // Handle item drag completion\n if (!this.isMouseDown || !this.currentDragItem) return;\n\n this.stopAutoScroll();\n\n // If we were actually dragging, handle the drag end\n if (this.isDragging) {\n // Convert screen + scroll delta to canvas delta\n const deltaX =\n (event.clientX - this.dragStartPos.x + this.autoScrollDeltaX) /\n this.zoom;\n const deltaY =\n (event.clientY - this.dragStartPos.y + this.autoScrollDeltaY) /\n this.zoom;\n\n // Determine what items were moved\n const itemsToMove =\n this.selectedItems.has(this.currentDragItem.uuid) &&\n this.selectedItems.size > 1\n ? Array.from(this.selectedItems)\n : [this.currentDragItem.uuid];\n\n // Update positions for all moved items\n const newPositions: { [uuid: string]: FlowPosition } = {};\n\n itemsToMove.forEach((uuid) => {\n const type = this.definition.nodes.find((node) => node.uuid === uuid)\n ? 'node'\n : 'sticky';\n const position = this.getPosition(uuid, type);\n\n if (position) {\n const newLeft = position.left + deltaX;\n const newTop = position.top + deltaY;\n\n // Snap to 20px grid for final position\n const snappedLeft = snapToGrid(newLeft);\n const snappedTop = snapToGrid(newTop);\n\n const newPosition = { left: snappedLeft, top: snappedTop };\n newPositions[uuid] = newPosition;\n\n // Remove dragging class\n const element = this.querySelector(`[uuid=\"${uuid}\"]`) as HTMLElement;\n if (element) {\n element.classList.remove('dragging');\n element.style.left = `${snappedLeft}px`;\n element.style.top = `${snappedTop}px`;\n }\n }\n });\n\n if (Object.keys(newPositions).length > 0) {\n getStore().getState().updateCanvasPositions(newPositions);\n\n // Check for collisions and reflow nodes after updating positions\n // Filter to only check nodes (not stickies)\n const nodeUuids = itemsToMove.filter((uuid) =>\n this.definition.nodes.find((node) => node.uuid === uuid)\n );\n\n if (nodeUuids.length > 0) {\n // Allow DOM to update before checking collisions\n setTimeout(() => {\n this.checkCollisionsAndReflow(nodeUuids);\n }, 0);\n } else {\n // No nodes moved, just repaint connections\n setTimeout(() => {\n this.plumber.repaintEverything();\n }, 0);\n }\n }\n\n this.selectedItems.clear();\n }\n\n // Reset all drag state\n this.isDragging = false;\n this.isMouseDown = false;\n this.currentDragItem = null;\n this.canvasMouseDown = false;\n this.autoScrollDeltaX = 0;\n this.autoScrollDeltaY = 0;\n this.lastPointerPos = null;\n }\n\n /* c8 ignore start -- touch-only handlers */\n\n /**\n * Handle touch move on the document — mirrors handleMouseMove for\n * both connection dragging and node/sticky dragging on touch devices.\n */\n private handleTouchMove(event: TouchEvent): void {\n // --- Two-finger panning ---\n if (event.touches.length >= 2) {\n event.preventDefault();\n const midX = (event.touches[0].clientX + event.touches[1].clientX) / 2;\n const midY = (event.touches[0].clientY + event.touches[1].clientY) / 2;\n\n if (this.isTwoFingerPanning) {\n const dx = this.lastPanX - midX;\n const dy = this.lastPanY - midY;\n if (Math.abs(dx) > 2 || Math.abs(dy) > 2) {\n this.twoFingerDidPan = true;\n }\n const editor = this.querySelector('#editor') as HTMLElement;\n if (editor) {\n editor.scrollBy(dx, dy);\n }\n }\n\n // Cancel any in-progress single-finger actions\n this.canvasMouseDown = false;\n this.isSelecting = false;\n this.selectionBox = null;\n\n this.isTwoFingerPanning = true;\n this.lastPanX = midX;\n this.lastPanY = midY;\n return;\n }\n\n const touch = event.touches[0];\n if (!touch) return;\n\n // --- Selection box drawing ---\n if (this.canvasMouseDown && !this.isMouseDown) {\n event.preventDefault();\n this.isSelecting = true;\n\n const canvasRect = this.querySelector('#canvas')?.getBoundingClientRect();\n if (canvasRect && this.selectionBox) {\n this.selectionBox = {\n ...this.selectionBox,\n endX: (touch.clientX - canvasRect.left) / this.zoom,\n endY: (touch.clientY - canvasRect.top) / this.zoom\n };\n this.updateSelectedItemsFromBox();\n }\n\n this.requestUpdate();\n return;\n }\n\n // --- Connection dragging ---\n if (this.plumber.connectionDragging) {\n event.preventDefault();\n\n const targetNode = this.findTargetNodeAt(touch.clientX, touch.clientY);\n\n // Clear previous target styles\n document.querySelectorAll('temba-flow-node').forEach((node) => {\n node.classList.remove(\n 'connection-target-valid',\n 'connection-target-invalid'\n );\n });\n\n if (targetNode) {\n this.targetId = targetNode.getAttribute('uuid');\n this.isValidTarget = this.targetId !== this.dragFromNodeId;\n\n if (this.isValidTarget) {\n targetNode.classList.add('connection-target-valid');\n } else {\n targetNode.classList.add('connection-target-invalid');\n }\n\n this.connectionPlaceholder = null;\n } else {\n this.targetId = null;\n this.isValidTarget = true;\n\n const canvas = this.querySelector('#canvas');\n if (canvas) {\n const canvasRect = canvas.getBoundingClientRect();\n const relativeX = (touch.clientX - canvasRect.left) / this.zoom;\n const relativeY = (touch.clientY - canvasRect.top) / this.zoom;\n\n const placeholderWidth = 200;\n const placeholderHeight = 64;\n const arrowLength = ARROW_LENGTH;\n const cursorGap = CURSOR_GAP;\n\n const dragUp =\n this.connectionSourceY != null\n ? relativeY < this.connectionSourceY\n : false;\n\n let top: number;\n if (dragUp) {\n top = relativeY + cursorGap - placeholderHeight;\n } else {\n top = relativeY - cursorGap + arrowLength;\n }\n\n this.connectionPlaceholder = {\n position: {\n left: relativeX - placeholderWidth / 2,\n top\n },\n visible: true,\n dragUp\n };\n }\n }\n\n this.requestUpdate();\n return;\n }\n\n // --- Node/sticky dragging ---\n if (!this.isMouseDown || !this.currentDragItem) return;\n\n this.lastPointerPos = { clientX: touch.clientX, clientY: touch.clientY };\n\n const deltaX = touch.clientX - this.dragStartPos.x + this.autoScrollDeltaX;\n const deltaY = touch.clientY - this.dragStartPos.y + this.autoScrollDeltaY;\n const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n\n if (!this.isDragging && distance > DRAG_THRESHOLD) {\n this.isDragging = true;\n this.startAutoScroll();\n }\n\n // Only prevent default scrolling once we're actually dragging.\n // Before the threshold, allow the browser to fire synthetic click\n // events for taps on buttons (remove, add-action, etc.).\n if (this.isDragging) {\n event.preventDefault();\n this.updateDragPositions();\n }\n }\n\n /**\n * Handle touch end on the document — mirrors handleMouseUp for\n * both connection dragging and node/sticky dragging on touch devices.\n */\n private handleTouchEnd(event: TouchEvent): void {\n // --- Two-finger gesture end ---\n if (this.isTwoFingerPanning) {\n if (event.touches.length === 0) {\n const didPan = this.twoFingerDidPan;\n const onCanvas = this.twoFingerOnCanvas;\n const midX = this.twoFingerStartMidX;\n const midY = this.twoFingerStartMidY;\n\n // Reset state\n this.isTwoFingerPanning = false;\n this.twoFingerOnCanvas = false;\n this.twoFingerDidPan = false;\n\n // Two-finger tap (no pan) on canvas → show context menu\n if (!didPan && onCanvas) {\n this.showContextMenuAt(midX, midY);\n }\n }\n return;\n }\n\n const touch = event.changedTouches[0];\n\n // --- Selection box completion ---\n if (this.canvasMouseDown && this.isSelecting) {\n this.isSelecting = false;\n this.selectionBox = null;\n this.canvasMouseDown = false;\n this.requestUpdate();\n return;\n }\n\n // --- Canvas tap (no drag) — clear selection ---\n if (this.canvasMouseDown && !this.isSelecting) {\n this.canvasMouseDown = false;\n return;\n }\n\n // --- Connection dragging ---\n if (this.plumber.connectionDragging) {\n if (touch) {\n const targetNode = this.findTargetNodeAt(touch.clientX, touch.clientY);\n if (targetNode) {\n this.targetId = targetNode.getAttribute('uuid');\n this.isValidTarget = this.targetId !== this.dragFromNodeId;\n }\n }\n return;\n }\n\n // --- Node/sticky dragging ---\n if (!this.isMouseDown || !this.currentDragItem) return;\n\n this.stopAutoScroll();\n\n if (this.isDragging && touch) {\n const deltaX =\n (touch.clientX - this.dragStartPos.x + this.autoScrollDeltaX) /\n this.zoom;\n const deltaY =\n (touch.clientY - this.dragStartPos.y + this.autoScrollDeltaY) /\n this.zoom;\n\n const itemsToMove =\n this.selectedItems.has(this.currentDragItem.uuid) &&\n this.selectedItems.size > 1\n ? Array.from(this.selectedItems)\n : [this.currentDragItem.uuid];\n\n const newPositions: { [uuid: string]: FlowPosition } = {};\n\n itemsToMove.forEach((uuid) => {\n const type = this.definition.nodes.find((node) => node.uuid === uuid)\n ? 'node'\n : 'sticky';\n const position = this.getPosition(uuid, type);\n\n if (position) {\n const newLeft = position.left + deltaX;\n const newTop = position.top + deltaY;\n const snappedLeft = snapToGrid(newLeft);\n const snappedTop = snapToGrid(newTop);\n\n newPositions[uuid] = { left: snappedLeft, top: snappedTop };\n\n const element = this.querySelector(`[uuid=\"${uuid}\"]`) as HTMLElement;\n if (element) {\n element.classList.remove('dragging');\n element.style.left = `${snappedLeft}px`;\n element.style.top = `${snappedTop}px`;\n }\n }\n });\n\n if (Object.keys(newPositions).length > 0) {\n getStore().getState().updateCanvasPositions(newPositions);\n\n const nodeUuids = itemsToMove.filter((uuid) =>\n this.definition.nodes.find((node) => node.uuid === uuid)\n );\n\n if (nodeUuids.length > 0) {\n setTimeout(() => {\n this.checkCollisionsAndReflow(nodeUuids);\n }, 0);\n } else {\n setTimeout(() => {\n this.plumber.repaintEverything();\n }, 0);\n }\n }\n\n this.selectedItems.clear();\n }\n\n // Reset all drag state\n this.isDragging = false;\n this.isMouseDown = false;\n this.currentDragItem = null;\n this.canvasMouseDown = false;\n this.autoScrollDeltaX = 0;\n this.autoScrollDeltaY = 0;\n this.lastPointerPos = null;\n }\n\n /**\n * Handle touchcancel — reset all touch-related state so the editor\n * doesn't get stuck in a partial drag/selection mode.\n */\n private handleTouchCancel(): void {\n this.isTwoFingerPanning = false;\n this.isSelecting = false;\n this.selectionBox = null;\n this.canvasMouseDown = false;\n\n if (this.isDragging && this.currentDragItem) {\n // Remove dragging class from all moved items\n const itemsToReset =\n this.selectedItems.has(this.currentDragItem.uuid) &&\n this.selectedItems.size > 1\n ? Array.from(this.selectedItems)\n : [this.currentDragItem.uuid];\n itemsToReset.forEach((uuid) => {\n const el = this.querySelector(`[uuid=\"${uuid}\"]`) as HTMLElement;\n if (el) el.classList.remove('dragging');\n });\n }\n\n this.stopAutoScroll();\n this.isDragging = false;\n this.isMouseDown = false;\n this.currentDragItem = null;\n this.autoScrollDeltaX = 0;\n this.autoScrollDeltaY = 0;\n this.lastPointerPos = null;\n\n // Clear connection drag visual state\n document.querySelectorAll('temba-flow-node').forEach((node) => {\n node.classList.remove(\n 'connection-target-valid',\n 'connection-target-invalid'\n );\n });\n this.connectionPlaceholder = null;\n\n this.requestUpdate();\n }\n\n /* c8 ignore stop */\n\n private updateCanvasSize(): void {\n if (!this.definition) return;\n\n const store = getStore();\n if (!store) return;\n\n // Calculate required canvas size based on all elements\n let maxWidth = 0;\n let maxHeight = 0;\n\n // Check node positions\n this.definition.nodes.forEach((node) => {\n const ui = this.definition._ui.nodes[node.uuid];\n if (ui && ui.position) {\n const nodeElement = this.querySelector(\n `[id=\"${node.uuid}\"]`\n ) as HTMLElement;\n if (nodeElement) {\n // Use offsetWidth/offsetHeight (unaffected by ancestor transforms)\n maxWidth = Math.max(\n maxWidth,\n ui.position.left + nodeElement.offsetWidth\n );\n maxHeight = Math.max(\n maxHeight,\n ui.position.top + nodeElement.offsetHeight\n );\n }\n }\n });\n\n // Check sticky note positions\n const stickies = this.definition._ui?.stickies || {};\n Object.entries(stickies).forEach(([uuid, sticky]) => {\n if (sticky.position) {\n const stickyElement = this.querySelector(\n `temba-sticky-note[uuid=\"${uuid}\"]`\n ) as HTMLElement;\n if (stickyElement) {\n // Use clientWidth/clientHeight instead of getBoundingClientRect() to get element dimensions\n // This avoids the coordinate system mismatch between viewport and canvas coordinates\n const width = stickyElement.clientWidth;\n const height = stickyElement.clientHeight;\n\n // Both sticky.position and width/height are now in the same coordinate system\n maxWidth = Math.max(maxWidth, sticky.position.left + width);\n maxHeight = Math.max(maxHeight, sticky.position.top + height);\n } else {\n // Fallback to default sizes if element not found\n maxWidth = Math.max(maxWidth, sticky.position.left + 200);\n maxHeight = Math.max(maxHeight, sticky.position.top + 100);\n }\n }\n });\n\n // Update canvas size in store\n store.getState().expandCanvas(maxWidth, maxHeight);\n }\n\n private handleCanvasContextMenu(event: MouseEvent): void {\n if (this.isReadOnly()) {\n event.preventDefault();\n return;\n }\n\n // Check if we right-clicked on empty canvas space\n const target = event.target as HTMLElement;\n if (target.id !== 'canvas') {\n return;\n }\n\n // Prevent the default browser context menu\n event.preventDefault();\n event.stopPropagation();\n\n this.showContextMenuAt(event.clientX, event.clientY);\n }\n\n /**\n * Show the canvas context menu at the given viewport coordinates.\n * Shared by right-click (mouse) and double-tap (touch).\n */\n private showContextMenuAt(clientX: number, clientY: number): void {\n if (this.isReadOnly()) return;\n\n const canvas = this.querySelector('#canvas');\n if (!canvas) return;\n\n const canvasRect = canvas.getBoundingClientRect();\n const relativeX = (clientX - canvasRect.left) / this.zoom - 10;\n const relativeY = (clientY - canvasRect.top) / this.zoom - 10;\n\n const snappedLeft = snapToGrid(relativeX);\n const snappedTop = snapToGrid(relativeY);\n\n const canvasMenu = this.querySelector('temba-canvas-menu') as CanvasMenu;\n if (canvasMenu) {\n const hasNodes = this.definition && this.definition.nodes.length > 0;\n canvasMenu.show(\n clientX,\n clientY,\n {\n x: snappedLeft,\n y: snappedTop\n },\n true,\n hasNodes,\n this.flowType === 'message'\n );\n }\n }\n\n private handleEmptyFlowClick(event: MouseEvent): void {\n const editor = this.querySelector('#editor') as HTMLElement;\n if (!editor) return;\n\n // Scroll to top-left\n editor.scrollTo({ left: 0, top: 0, behavior: 'smooth' });\n\n // Place node at top-left of the canvas\n const nodeLeft = 0;\n const nodeTop = 0;\n\n const canvasMenu = this.querySelector('temba-canvas-menu') as CanvasMenu;\n if (canvasMenu) {\n const button = event.currentTarget as HTMLElement;\n const rect = button.getBoundingClientRect();\n const menuWidth = 265;\n const menuX = rect.left + rect.width / 2 - menuWidth / 2;\n const menuY = rect.bottom + 8;\n canvasMenu.show(\n menuX,\n menuY,\n { x: nodeLeft, y: nodeTop },\n false,\n false,\n this.flowType === 'message'\n );\n }\n }\n\n private handleCanvasMenuSelection(event: CustomEvent): void {\n const selection = event.detail as CanvasMenuSelection;\n const store = getStore();\n\n if (selection.action === 'reflow') {\n this.performReflow();\n return;\n }\n\n if (selection.action === 'sticky') {\n // Create new sticky note\n store.getState().createStickyNote({\n left: selection.position.x,\n top: selection.position.y\n });\n // Clear all pending connection state and placeholder\n this.pendingCanvasConnection = null;\n this.connectionPlaceholder = null;\n this.sourceId = null;\n this.connectionSourceX = null;\n this.connectionSourceY = null;\n this.dragFromNodeId = null;\n } else if (\n selection.action === 'send_msg' ||\n selection.action === 'wait_for_response'\n ) {\n // Go directly to the node editor (skip node type selector)\n this.handleNodeTypeSelection(\n new CustomEvent(CustomEventType.Selection, {\n detail: {\n nodeType: selection.action,\n position: selection.position\n } as NodeTypeSelection\n })\n );\n } else {\n // Show node type selector\n const selector = this.querySelector(\n 'temba-node-type-selector'\n ) as NodeTypeSelector;\n if (selector) {\n selector.show(selection.action, selection.position);\n }\n // Note: we don't clear pendingCanvasConnection or placeholder here,\n // they will be used in handleNodeTypeSelection\n }\n }\n\n private cleanUpConnection(): void {\n if (this.isCreatingNewNode) {\n this.isCreatingNewNode = false;\n this.pendingNodePosition = null;\n }\n\n // see if we need to put our connection back\n if (this.originalConnectionTargetId) {\n this.plumber.connectIds(\n this.dragFromNodeId,\n this.sourceId,\n this.originalConnectionTargetId\n );\n this.originalConnectionTargetId = null;\n }\n\n // Menu closed without selection - clear placeholder and pending connection\n if (this.pendingCanvasConnection) {\n this.pendingCanvasConnection = null;\n this.connectionPlaceholder = null;\n this.sourceId = null;\n this.connectionSourceX = null;\n this.connectionSourceY = null;\n this.dragFromNodeId = null;\n this.originalConnectionTargetId = null;\n }\n }\n\n private handleCanvasMenuClosed(): void {\n this.cleanUpConnection();\n }\n\n private handleNodeTypeSelectorClosed(): void {\n this.cleanUpConnection();\n }\n\n private handleNodeTypeSelection(event: CustomEvent): void {\n const selection = event.detail as NodeTypeSelection;\n\n // Check if we have a pending canvas connection (from dropping on empty canvas)\n if (this.pendingCanvasConnection) {\n // Don't clear the placeholder yet - keep it visible while editing\n // The position is already stored in pendingCanvasConnection\n // Fall through to normal node creation flow below\n }\n\n // Check if we're adding an action to an existing node\n if (this.addActionToNodeUuid) {\n // Find the existing node\n const node = this.definition.nodes.find(\n (n) => n.uuid === this.addActionToNodeUuid\n );\n const nodeUI = this.definition._ui.nodes[this.addActionToNodeUuid];\n\n if (node && nodeUI) {\n // Create a new action to add to the existing node\n const actionUuid = generateUUID();\n this.editingAction = {\n uuid: actionUuid,\n type: selection.nodeType as any\n } as Action;\n\n // Set the editing node to the existing node (not creating new)\n this.editingNode = node;\n this.editingNodeUI = nodeUI;\n this.isCreatingNewNode = false;\n\n // Clear the addActionToNodeUuid flag\n this.addActionToNodeUuid = null;\n\n return;\n }\n\n // If we couldn't find the node, clear the flag and continue with normal flow\n this.addActionToNodeUuid = null;\n }\n\n // Create a temporary node structure for editing (not added to store yet)\n const nodeUuid = generateUUID();\n\n // Determine if this is an action type or a node type\n // Actions need to be wrapped in an execute_actions node\n const isActionType = selection.nodeType in ACTION_CONFIG;\n const nodeType = isActionType ? 'execute_actions' : selection.nodeType;\n\n // For nodes with routers, initialize an empty router to ensure fromFormData works correctly\n const nodeConfig = NODE_CONFIG[nodeType];\n const hasRouter =\n nodeConfig?.form &&\n Object.keys(nodeConfig.form).some(\n (key) =>\n ['rules', 'categories', 'cases'].includes(key) ||\n nodeConfig.form[key]?.type === 'array'\n );\n\n const tempNode: Node = {\n uuid: nodeUuid,\n actions: [],\n exits: hasRouter\n ? [] // Router-based nodes will generate their own exits\n : [\n {\n uuid: generateUUID(),\n destination_uuid: null\n }\n ]\n };\n\n if (hasRouter) {\n // This node uses a router - initialize it with empty structure\n tempNode.router = {\n type: 'switch',\n categories: [],\n cases: [],\n operand: '@input.text',\n default_category_uuid: undefined\n };\n }\n\n const tempNodeUI: NodeUI = {\n position: this.pendingCanvasConnection\n ? this.pendingCanvasConnection.position\n : {\n left: selection.position.x,\n top: selection.position.y\n },\n type: nodeType as any,\n config: {}\n };\n\n // Mark that we're creating a new node and store the position\n this.isCreatingNewNode = true;\n this.pendingNodePosition = this.pendingCanvasConnection\n ? this.pendingCanvasConnection.position\n : {\n left: selection.position.x,\n top: selection.position.y\n };\n\n // Open the node editor with the temporary node\n this.editingNode = tempNode;\n this.editingNodeUI = tempNodeUI;\n\n // If this is an action type, we also need to set up an editing action\n if (isActionType) {\n const actionUuid = generateUUID();\n this.editingAction = {\n uuid: actionUuid,\n type: selection.nodeType as any\n } as Action;\n }\n }\n\n private handleActionEditRequested(event: CustomEvent): void {\n // For action editing, we set the action and find the corresponding node\n this.editingAction = event.detail.action;\n this.dialogOrigin =\n event.detail.originX != null\n ? { x: event.detail.originX, y: event.detail.originY }\n : null;\n\n // Find the node that contains this action\n const nodeUuid = event.detail.nodeUuid;\n const node = this.definition.nodes.find((n) => n.uuid === nodeUuid);\n\n if (node) {\n this.editingNode = node;\n this.editingNodeUI = this.definition._ui.nodes[nodeUuid];\n }\n }\n\n private handleAddActionRequested(event: CustomEvent): void {\n // Get the node where we want to add the action\n const nodeUuid = event.detail.nodeUuid;\n const node = this.definition.nodes.find((n) => n.uuid === nodeUuid);\n\n if (!node) {\n return;\n }\n\n // Get the node's position to place the selector near it\n const nodeUI = this.definition._ui.nodes[nodeUuid];\n if (!nodeUI) {\n return;\n }\n\n // Show the node type selector in action mode, excluding branching actions\n const selector = this.querySelector(\n 'temba-node-type-selector'\n ) as NodeTypeSelector;\n if (selector) {\n // Show the selector near the node, using a mode that excludes branching actions\n selector.show('action-no-branching', {\n x: nodeUI.position.left,\n y: nodeUI.position.top\n });\n\n // Store the node UUID so we know which node to add the action to\n this.addActionToNodeUuid = nodeUuid;\n }\n }\n\n private handleNodeEditRequested(event: CustomEvent): void {\n this.editingNode = event.detail.node;\n this.editingNodeUI = event.detail.nodeUI;\n this.dialogOrigin =\n event.detail.originX != null\n ? { x: event.detail.originX, y: event.detail.originY }\n : null;\n }\n\n private handleNodeDeleted(event: CustomEvent): void {\n const nodeUuid = event.detail.uuid;\n if (nodeUuid) {\n this.deleteNodes([nodeUuid]);\n }\n }\n\n private handleActionSaved(updatedAction: Action): void {\n if (this.editingNode && this.editingAction) {\n let updatedActions: Action[];\n\n // Check if this action already exists in the node\n const existingActionIndex = this.editingNode.actions.findIndex(\n (action) => action.uuid === this.editingAction.uuid\n );\n\n if (existingActionIndex >= 0) {\n // Update existing action\n updatedActions = this.editingNode.actions.map((action) =>\n action.uuid === this.editingAction.uuid ? updatedAction : action\n );\n } else {\n // Add new action\n updatedActions = [...this.editingNode.actions, updatedAction];\n }\n\n const updatedNode = { ...this.editingNode, actions: updatedActions };\n\n // Check if we're creating a new node or updating an existing one\n if (this.isCreatingNewNode) {\n // This is a new node with a new action - add it to the store\n const store = getStore();\n\n const nodeUI: NodeUI = {\n position: this.pendingNodePosition || { left: 0, top: 0 },\n type: this.editingNodeUI?.type,\n config: {}\n };\n\n // Add the node to the store\n store.getState().addNode(updatedNode, nodeUI);\n\n // If we have a pending canvas connection, connect it to this new node\n if (this.pendingCanvasConnection) {\n store\n .getState()\n .updateConnection(\n this.pendingCanvasConnection.fromNodeId,\n this.pendingCanvasConnection.exitId,\n updatedNode.uuid\n );\n\n // Clear the pending connection and placeholder\n this.pendingCanvasConnection = null;\n this.connectionPlaceholder = null;\n this.sourceId = null;\n this.connectionSourceX = null;\n this.connectionSourceY = null;\n this.dragFromNodeId = null;\n }\n\n // Reset the creation flags\n this.isCreatingNewNode = false;\n this.pendingNodePosition = null;\n\n // Check for collisions and reflow\n requestAnimationFrame(() => {\n this.checkCollisionsAndReflow([updatedNode.uuid]);\n });\n } else {\n const uuid = this.editingNode.uuid;\n // Update existing node in the store\n getStore()?.getState().updateNode(uuid, updatedNode);\n\n // Check for collisions and reflow in case node size changed\n requestAnimationFrame(() => {\n this.checkCollisionsAndReflow([uuid]);\n });\n }\n }\n this.closeNodeEditor();\n }\n\n private closeNodeEditor(): void {\n this.editingNode = null;\n this.editingNodeUI = null;\n this.editingAction = null;\n this.dialogOrigin = null;\n }\n\n private handleActionEditCanceled(): void {\n // If we were creating a new node, just discard it\n this.cleanUpConnection();\n this.closeNodeEditor();\n }\n\n private handleNodeSaved(\n updatedNode: Node,\n uiConfig?: Record<string, any>\n ): void {\n if (this.editingNode) {\n if (this.isCreatingNewNode) {\n // This is a new node - add it to the store for the first time\n const store = getStore();\n\n const nodeUI: NodeUI = {\n position: this.pendingNodePosition || { left: 0, top: 0 },\n type: this.editingNodeUI?.type,\n config: uiConfig || {}\n };\n\n // Add the node to the store\n store.getState().addNode(updatedNode, nodeUI);\n\n // If we have a pending canvas connection, connect it to this new node\n if (this.pendingCanvasConnection) {\n store\n .getState()\n .updateConnection(\n this.pendingCanvasConnection.fromNodeId,\n this.pendingCanvasConnection.exitId,\n updatedNode.uuid\n );\n\n // Clear the pending connection and placeholder\n this.pendingCanvasConnection = null;\n this.connectionPlaceholder = null;\n this.sourceId = null;\n this.connectionSourceX = null;\n this.connectionSourceY = null;\n this.dragFromNodeId = null;\n }\n\n // Reset the creation flags\n this.isCreatingNewNode = false;\n this.pendingNodePosition = null;\n\n // Check for collisions and reflow\n requestAnimationFrame(() => {\n this.checkCollisionsAndReflow([updatedNode.uuid]);\n });\n } else {\n // This is an existing node - update it\n // Clean up jsPlumb connections for removed exits before updating the node\n if (this.plumber) {\n const oldExits = this.editingNode.exits || [];\n const newExits = updatedNode.exits || [];\n\n // Find exits that were removed\n const removedExits = oldExits.filter(\n (oldExit) =>\n !newExits.find((newExit) => newExit.uuid === oldExit.uuid)\n );\n\n // Remove jsPlumb connections for removed exits\n removedExits.forEach((exit) => {\n this.plumber.removeExitConnection(exit.uuid);\n });\n }\n\n this.plumber.revalidate([updatedNode.uuid]);\n\n // Update the node in the store\n getStore()?.getState().updateNode(this.editingNode.uuid, updatedNode);\n\n // Update the UI config if provided\n if (uiConfig) {\n getStore()?.getState().updateNodeUIConfig(updatedNode.uuid, uiConfig);\n }\n\n // Check for collisions and reflow in case node size changed\n const nodeUuid = updatedNode.uuid;\n requestAnimationFrame(() => {\n this.checkCollisionsAndReflow([nodeUuid]);\n });\n }\n }\n this.closeNodeEditor();\n }\n\n private handleNodeEditCanceled(): void {\n this.cleanUpConnection();\n this.closeNodeEditor();\n }\n\n private getNodeAtPosition(mouseX: number, mouseY: number): string | null {\n // Get all node elements\n const nodeElements = this.querySelectorAll('temba-flow-node');\n\n for (const nodeElement of Array.from(nodeElements)) {\n const rect = nodeElement.getBoundingClientRect();\n\n if (\n mouseX >= rect.left &&\n mouseX <= rect.right &&\n mouseY >= rect.top &&\n mouseY <= rect.bottom\n ) {\n return nodeElement.getAttribute('data-node-uuid');\n }\n }\n\n return null;\n }\n\n private calculateCanvasDropPosition(\n mouseX: number,\n mouseY: number,\n applyGridSnapping: boolean = true\n ): FlowPosition {\n // calculate the position on the canvas\n const canvas = this.querySelector('#canvas');\n if (!canvas) return { left: 0, top: 0 };\n\n const canvasRect = canvas.getBoundingClientRect();\n\n // Convert viewport coordinates to canvas coordinates, accounting for zoom\n const left = (mouseX - canvasRect.left) / this.zoom - DROP_PREVIEW_OFFSET_X;\n const top = (mouseY - canvasRect.top) / this.zoom - DROP_PREVIEW_OFFSET_Y;\n\n // Apply grid snapping only if requested (for final drop position)\n if (applyGridSnapping) {\n return {\n left: snapToGrid(left),\n top: snapToGrid(top)\n };\n }\n\n return { left, top };\n }\n\n private handleActionDragExternal(event: CustomEvent): void {\n const {\n action,\n nodeUuid,\n actionIndex,\n mouseX,\n mouseY,\n actionHeight = 60,\n isLastAction = false\n } = event.detail;\n\n // Check if mouse is over another execute_actions node\n const targetNode = this.getNodeAtPosition(mouseX, mouseY);\n\n if (targetNode && targetNode !== nodeUuid) {\n const targetNodeUI = this.definition._ui.nodes[targetNode];\n const targetNodeDef = this.definition.nodes.find(\n (n) => n.uuid === targetNode\n );\n\n // Only allow dropping on execute_actions nodes, and not the source node\n if (targetNodeUI?.type === 'execute_actions' && targetNodeDef) {\n // If we moved to a different target node, clear the previous one's placeholder\n if (\n this.previousActionDragTargetNodeUuid &&\n this.previousActionDragTargetNodeUuid !== targetNode\n ) {\n const previousElement = this.querySelector(\n `temba-flow-node[data-node-uuid=\"${this.previousActionDragTargetNodeUuid}\"]`\n );\n if (previousElement) {\n previousElement.dispatchEvent(\n new CustomEvent('action-drag-leave', {\n detail: {},\n bubbles: false\n })\n );\n }\n }\n\n // Update target node for drop handling\n this.actionDragTargetNodeUuid = targetNode;\n this.previousActionDragTargetNodeUuid = targetNode;\n\n // Hide canvas preview when over a valid target\n this.canvasDropPreview = null;\n\n // Tell source node to show ghost (we're over a valid target)\n const sourceElement = this.querySelector(\n `temba-flow-node[data-node-uuid=\"${nodeUuid}\"]`\n );\n if (sourceElement) {\n sourceElement.dispatchEvent(\n new CustomEvent('action-show-ghost', {\n detail: {},\n bubbles: false\n })\n );\n }\n\n // Notify the target node about the drag\n const targetElement = this.querySelector(\n `temba-flow-node[data-node-uuid=\"${targetNode}\"]`\n );\n if (targetElement) {\n targetElement.dispatchEvent(\n new CustomEvent('action-drag-over', {\n detail: {\n action,\n sourceNodeUuid: nodeUuid,\n actionIndex,\n mouseX,\n mouseY,\n actionHeight\n },\n bubbles: false\n })\n );\n }\n\n this.requestUpdate();\n return;\n }\n }\n\n // Not over a valid target node, clear any previous target's placeholder\n if (this.previousActionDragTargetNodeUuid) {\n const previousElement = this.querySelector(\n `temba-flow-node[data-node-uuid=\"${this.previousActionDragTargetNodeUuid}\"]`\n );\n if (previousElement) {\n previousElement.dispatchEvent(\n new CustomEvent('action-drag-leave', {\n detail: {},\n bubbles: false\n })\n );\n }\n this.previousActionDragTargetNodeUuid = null;\n }\n\n this.actionDragTargetNodeUuid = null;\n\n const sourceElement = this.querySelector(\n `temba-flow-node[data-node-uuid=\"${nodeUuid}\"]`\n );\n\n // Show canvas drop preview only if this is NOT the last action\n // Last actions can only be dropped on other nodes, not on canvas\n if (!isLastAction) {\n // Hide ghost when showing canvas preview (for canvas drops)\n if (sourceElement) {\n sourceElement.dispatchEvent(\n new CustomEvent('action-hide-ghost', {\n detail: {},\n bubbles: false\n })\n );\n }\n\n // Don't snap to grid for preview - let it follow cursor smoothly\n const position = this.calculateCanvasDropPosition(mouseX, mouseY, false);\n\n this.canvasDropPreview = {\n action,\n nodeUuid,\n actionIndex,\n position,\n actionHeight\n };\n } else {\n // For last action, keep ghost visible (can't drop on canvas)\n if (sourceElement) {\n sourceElement.dispatchEvent(\n new CustomEvent('action-show-ghost', {\n detail: {},\n bubbles: false\n })\n );\n }\n\n // Clear any existing preview for last action\n this.canvasDropPreview = null;\n }\n\n // Force re-render to update preview position\n this.requestUpdate();\n }\n\n private handleActionDragInternal(_event: CustomEvent): void {\n // Clear any previous target's placeholder when returning to internal drag\n if (this.previousActionDragTargetNodeUuid) {\n const previousElement = this.querySelector(\n `temba-flow-node[data-node-uuid=\"${this.previousActionDragTargetNodeUuid}\"]`\n );\n if (previousElement) {\n previousElement.dispatchEvent(\n new CustomEvent('action-drag-leave', {\n detail: {},\n bubbles: false\n })\n );\n }\n this.previousActionDragTargetNodeUuid = null;\n }\n\n this.canvasDropPreview = null;\n this.actionDragTargetNodeUuid = null;\n }\n\n private handleActionDropExternal(event: CustomEvent): void {\n const {\n action,\n nodeUuid,\n actionIndex,\n mouseX,\n mouseY,\n isLastAction = false\n } = event.detail;\n\n // Check if we're dropping on an existing execute_actions node\n const targetNodeUuid = this.actionDragTargetNodeUuid;\n\n if (targetNodeUuid && targetNodeUuid !== nodeUuid) {\n // Dropping on another node - notify the target node to handle the drop\n const targetElement = this.querySelector(\n `temba-flow-node[data-node-uuid=\"${targetNodeUuid}\"]`\n );\n if (targetElement) {\n targetElement.dispatchEvent(\n new CustomEvent('action-drop', {\n detail: {\n action,\n sourceNodeUuid: nodeUuid,\n actionIndex,\n mouseX,\n mouseY\n },\n bubbles: false\n })\n );\n }\n\n // Clear state\n this.canvasDropPreview = null;\n this.actionDragTargetNodeUuid = null;\n return;\n }\n\n // If this is the last action and we're not dropping on another node, do nothing\n // Last actions can only be moved to other nodes, not dropped on canvas\n if (isLastAction) {\n this.canvasDropPreview = null;\n this.actionDragTargetNodeUuid = null;\n return;\n }\n\n // Not dropping on another node, create a new one on canvas\n // Snap to grid for the final drop position\n const position = this.calculateCanvasDropPosition(mouseX, mouseY, true);\n\n // remove the action from the original node\n const originalNode = this.definition.nodes.find((n) => n.uuid === nodeUuid);\n if (!originalNode) return;\n\n const updatedActions = originalNode.actions.filter(\n (_a, idx) => idx !== actionIndex\n );\n\n // if no actions remain, delete the node\n if (updatedActions.length === 0) {\n // Use deleteNodes to properly clean up Plumber connections before removing\n this.deleteNodes([nodeUuid]);\n } else {\n // update the node\n const updatedNode = { ...originalNode, actions: updatedActions };\n getStore()?.getState().updateNode(nodeUuid, updatedNode);\n }\n\n // create a new execute_actions node with the dropped action\n const newNode: Node = {\n uuid: generateUUID(),\n actions: [action],\n exits: [\n {\n uuid: generateUUID(),\n destination_uuid: null\n }\n ]\n };\n\n const newNodeUI: NodeUI = {\n position,\n type: 'execute_actions',\n config: {}\n };\n\n // add the new node\n getStore()?.getState().addNode(newNode, newNodeUI);\n\n // clear the preview\n this.canvasDropPreview = null;\n this.actionDragTargetNodeUuid = null;\n\n // Check for collisions and reflow after adding new node\n requestAnimationFrame(() => {\n this.checkCollisionsAndReflow([newNode.uuid]);\n });\n }\n\n private getLocalizationLanguages(): Array<{ code: string; name: string }> {\n if (!this.definition) {\n return [];\n }\n\n const baseLanguage = this.definition.language;\n return this.getAvailableLanguages().filter(\n (lang) => lang.code !== baseLanguage\n );\n }\n\n private getLocalizationProgress(languageCode: string): {\n total: number;\n localized: number;\n } {\n if (\n !this.definition ||\n !languageCode ||\n languageCode === this.definition.language\n ) {\n return { total: 0, localized: 0 };\n }\n\n const bundles = this.buildTranslationBundles(\n this.translationFilters.categories,\n languageCode\n );\n return this.getTranslationCounts(bundles);\n }\n\n private getLanguageLocalization(languageCode: string): Record<string, any> {\n if (!this.definition?.localization) {\n return {};\n }\n return this.definition.localization[languageCode] || {};\n }\n\n private buildTranslationBundles(\n includeCategories: boolean,\n languageCode: string = this.languageCode\n ): TranslationBundle[] {\n if (\n !this.definition ||\n !languageCode ||\n languageCode === this.definition.language\n ) {\n return [];\n }\n\n const languageLocalization = this.getLanguageLocalization(languageCode);\n const bundles: TranslationBundle[] = [];\n\n this.definition.nodes.forEach((node) => {\n node.actions?.forEach((action) => {\n const config = ACTION_CONFIG[action.type];\n if (!config?.localizable || config.localizable.length === 0) {\n return;\n }\n\n // For send_msg actions, only count 'text' for progress tracking\n // (quick_replies and attachments are still localizable but don't count toward progress)\n const localizableKeys =\n action.type === 'send_msg'\n ? config.localizable.filter((key) => key === 'text')\n : config.localizable;\n\n const translations = this.findTranslations(\n 'property',\n action.uuid,\n localizableKeys,\n action,\n languageLocalization\n );\n\n if (translations.length > 0) {\n bundles.push({\n nodeUuid: node.uuid,\n actionUuid: action.uuid,\n translations\n });\n }\n });\n\n if (!includeCategories) {\n return;\n }\n\n const nodeUI = this.definition._ui?.nodes?.[node.uuid];\n const nodeType = nodeUI?.type;\n if (!nodeType) {\n return;\n }\n\n const nodeConfig = NODE_CONFIG[nodeType];\n if (\n nodeConfig?.localizable === 'categories' &&\n node.router?.categories?.length\n ) {\n const categoryTranslations = node.router.categories.flatMap(\n (category) =>\n this.findTranslations(\n 'category',\n category.uuid,\n ['name'],\n category,\n languageLocalization\n )\n );\n\n if (categoryTranslations.length > 0) {\n bundles.push({\n nodeUuid: node.uuid,\n translations: categoryTranslations\n });\n }\n }\n });\n\n return bundles;\n }\n\n private findTranslations(\n type: TranslationType,\n uuid: string,\n localizeableKeys: string[],\n source: any,\n localization: Record<string, any>\n ): TranslationEntry[] {\n const translations: TranslationEntry[] = [];\n\n localizeableKeys.forEach((attribute) => {\n if (attribute === 'quick_replies') {\n return;\n }\n\n const pathSegments = attribute.split('.');\n let from: any = source;\n let to: any = [];\n\n while (pathSegments.length > 0 && from) {\n if (from.uuid) {\n to = localization[from.uuid];\n }\n\n const path = pathSegments.shift();\n if (!path) {\n break;\n }\n\n if (to) {\n to = to[path];\n }\n from = from[path];\n }\n\n if (!from) {\n return;\n }\n\n const fromValue = this.formatTranslationValue(from);\n if (!fromValue) {\n return;\n }\n\n const toValue = to ? this.formatTranslationValue(to) : null;\n\n translations.push({\n uuid,\n type,\n attribute,\n from: fromValue,\n to: toValue\n });\n });\n\n return translations;\n }\n\n private formatTranslationValue(value: any): string | null {\n if (value === null || value === undefined) {\n return null;\n }\n\n if (Array.isArray(value)) {\n const normalized = value\n .map((entry) => this.formatTranslationValue(entry))\n .filter((entry) => !!entry) as string[];\n return normalized.length > 0 ? normalized.join(', ') : null;\n }\n\n if (typeof value === 'object') {\n if ('name' in value && value.name) {\n return String(value.name);\n }\n\n if ('arguments' in value && Array.isArray(value.arguments)) {\n return value.arguments.join(' ');\n }\n\n return null;\n }\n\n if (typeof value === 'number') {\n return value.toString();\n }\n\n if (typeof value === 'string') {\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n\n return null;\n }\n\n private getTranslationCounts(bundles: TranslationBundle[]): {\n total: number;\n localized: number;\n } {\n return bundles.reduce(\n (counts, bundle) => {\n bundle.translations.forEach((translation) => {\n counts.total += 1;\n if (translation.to && translation.to.trim().length > 0) {\n counts.localized += 1;\n }\n });\n return counts;\n },\n { total: 0, localized: 0 }\n );\n }\n\n private handleLocalizationTabClick(): void {\n const languages = this.getLocalizationLanguages();\n if (!languages.length) {\n return;\n }\n\n this.localizationWindowHidden = false;\n this.revisionsWindowHidden = true;\n this.issuesWindowHidden = true;\n\n const alreadySelected = languages.some(\n (lang) => lang.code === this.languageCode\n );\n\n if (!alreadySelected) {\n this.handleLanguageChange(languages[0].code);\n }\n }\n\n private handleLocalizationLanguageSelect(languageCode: string): void {\n if (languageCode === this.languageCode) {\n return;\n }\n this.handleLanguageChange(languageCode);\n }\n\n private handleLocalizationLanguageSelectChange(event: CustomEvent): void {\n const select = event.target as any;\n const nextValue = select?.values?.[0]?.value;\n if (nextValue) {\n this.handleLocalizationLanguageSelect(nextValue);\n }\n }\n\n private handleLocalizationWindowClosed(): void {\n this.localizationWindowHidden = true;\n\n const baseLanguage = this.definition?.language;\n if (baseLanguage && this.languageCode !== baseLanguage) {\n this.handleLanguageChange(baseLanguage);\n }\n }\n\n private toggleTranslationSettings(): void {\n this.translationSettingsExpanded = !this.translationSettingsExpanded;\n }\n\n private handleLocalizationProgressToggleClick(event: MouseEvent): void {\n const target = event.target as HTMLElement;\n if (target.closest('.translation-settings-toggle')) {\n return;\n }\n this.toggleTranslationSettings();\n }\n\n private handleLocalizationProgressToggleKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.toggleTranslationSettings();\n }\n }\n\n private handleIncludeCategoriesChange(event: Event): void {\n const checkbox = event.target as Checkbox;\n const categories = checkbox?.checked ?? false;\n this.translationFilters = { categories };\n getStore()?.getState().setTranslationFilters({ categories });\n this.requestUpdate();\n }\n\n private async handleAutoTranslateClick(event: Event): Promise<void> {\n event.preventDefault();\n event.stopPropagation();\n\n if (this.autoTranslating) {\n this.autoTranslating = false;\n return;\n }\n\n this.autoTranslateDialogOpen = true;\n }\n\n private handleAutoTranslateDialogButton(event: CustomEvent): void {\n const button = event.detail?.button;\n if (!button) {\n return;\n }\n\n if (button.name === 'Translate') {\n if (!this.autoTranslateModel) {\n return;\n }\n this.autoTranslateDialogOpen = false;\n this.autoTranslateError = null;\n this.autoTranslating = true;\n this.runAutoTranslation().catch((error) => {\n console.error('Auto translation failed', error);\n this.autoTranslateError = 'Auto translation failed. Please try again.';\n this.autoTranslating = false;\n });\n } else if (button.name === 'Cancel' || button.name === 'Close') {\n this.autoTranslateDialogOpen = false;\n }\n }\n\n private handleAutoTranslateModelChange(event: Event): void {\n const select = event.target as any;\n const nextModel = select?.values?.[0] || null;\n this.autoTranslateModel = nextModel;\n }\n\n private shouldTranslateValue(text: string): boolean {\n if (!text) {\n return false;\n }\n const trimmed = text.trim();\n if (trimmed.length <= 1) {\n return false;\n }\n if (/^\\d+$/.test(trimmed)) {\n return false;\n }\n return true;\n }\n\n private async requestAutoTranslation(text: string): Promise<string | null> {\n if (!this.autoTranslateModel || !this.definition) {\n return null;\n }\n\n const payload = {\n text,\n lang: {\n from: this.definition.language,\n to: this.languageCode\n }\n };\n\n const response = await postJSON(\n `/llm/translate/${this.autoTranslateModel.uuid}/`,\n payload\n );\n\n if (response?.status === 200) {\n const result = response.json?.result || response.json?.text;\n return result ? String(result) : null;\n }\n\n throw new Error('Auto translation request failed');\n }\n\n private applyLocalizationUpdates(\n updates: LocalizationUpdate[],\n autoTranslated = false\n ): void {\n if (!updates.length || !this.definition) {\n return;\n }\n\n const store = getStore();\n if (!store) {\n return;\n }\n\n updates.forEach(({ uuid, translations }) => {\n const normalized = Object.entries(translations).reduce(\n (acc, [key, value]) => {\n if (!value) {\n return acc;\n }\n acc[key] = Array.isArray(value) ? value : [value];\n return acc;\n },\n {} as Record<string, any>\n );\n\n const existing =\n this.definition.localization?.[this.languageCode]?.[uuid] || {};\n const merged = { ...existing, ...normalized };\n\n store.getState().updateLocalization(this.languageCode, uuid, merged);\n\n if (autoTranslated) {\n zustand\n .getState()\n .markAutoTranslated(\n this.languageCode,\n uuid,\n Object.keys(translations)\n );\n }\n });\n }\n\n private async runAutoTranslation(): Promise<void> {\n if (\n !this.definition ||\n this.languageCode === this.definition.language ||\n !this.autoTranslateModel\n ) {\n this.autoTranslating = false;\n return;\n }\n\n const bundles = this.buildTranslationBundles(\n this.translationFilters.categories\n );\n\n for (const bundle of bundles) {\n if (!this.autoTranslating) {\n break;\n }\n\n const untranslated = bundle.translations.filter(\n (translation) => !translation.to || translation.to.trim().length === 0\n );\n\n if (untranslated.length === 0) {\n continue;\n }\n\n const updates: LocalizationUpdate[] = [];\n\n for (const translation of untranslated) {\n if (!this.autoTranslating) {\n break;\n }\n\n if (!this.shouldTranslateValue(translation.from)) {\n continue;\n }\n\n const cached = this.translationCache.get(translation.from);\n if (cached) {\n updates.push({\n uuid: translation.uuid,\n translations: { [translation.attribute]: cached }\n });\n continue;\n }\n\n try {\n const result = await this.requestAutoTranslation(translation.from);\n if (result) {\n this.translationCache.set(translation.from, result);\n updates.push({\n uuid: translation.uuid,\n translations: { [translation.attribute]: result }\n });\n }\n } catch (error) {\n console.error('Auto translation request failed', error);\n this.autoTranslateError =\n 'Auto translation failed. Please try again.';\n this.autoTranslating = false;\n break;\n }\n }\n\n if (updates.length > 0) {\n this.applyLocalizationUpdates(updates, true);\n }\n\n if (!this.autoTranslating) {\n break;\n }\n }\n\n this.autoTranslating = false;\n }\n\n private handleIssuesTabClick(): void {\n this.issuesWindowHidden = false;\n this.revisionsWindowHidden = true;\n this.localizationWindowHidden = true;\n }\n\n private handleIssuesWindowClosed(): void {\n this.issuesWindowHidden = true;\n }\n\n private handleIssueItemClick(issue: FlowIssue): void {\n const issuesWindow = document.getElementById(\n 'issues-window'\n ) as FloatingWindow;\n issuesWindow?.handleClose();\n this.issuesWindowHidden = true;\n\n this.focusNode(issue.node_uuid);\n\n const node = this.definition.nodes.find((n) => n.uuid === issue.node_uuid);\n if (!node) return;\n\n if (issue.action_uuid) {\n const action = node.actions?.find((a) => a.uuid === issue.action_uuid);\n if (action) {\n this.editingAction = action;\n this.editingNode = node;\n this.editingNodeUI = this.definition._ui.nodes[issue.node_uuid];\n }\n } else {\n this.editingNode = node;\n this.editingNodeUI = this.definition._ui.nodes[issue.node_uuid];\n }\n }\n\n private handleRevisionsTabClick(): void {\n if (this.revisionsWindowHidden) {\n this.fetchRevisions();\n this.revisionsWindowHidden = false;\n this.issuesWindowHidden = true;\n this.localizationWindowHidden = true;\n }\n }\n\n private handleRevisionsWindowClosed(): void {\n this.resetRevisionsScroll();\n this.revisionsWindowHidden = true;\n if (this.viewingRevision) {\n this.handleCancelRevisionView();\n }\n }\n\n private resetRevisionsScroll() {\n const list =\n this.querySelector('#revisions-window').shadowRoot?.querySelector(\n '.body'\n );\n if (list) {\n list.scrollTop = 0;\n }\n }\n\n private async fetchRevisions() {\n this.isLoadingRevisions = true;\n try {\n const results = await fetchResults(\n `/flow/revisions/${this.flow}/?version=${FLOW_SPEC_VERSION}`\n );\n this.revisions = results.slice(1);\n } catch (e) {\n console.error('Error fetching revisions', e);\n } finally {\n this.isLoadingRevisions = false;\n }\n }\n\n private async handleRevisionClick(revision: Revision) {\n if (this.viewingRevision?.id === revision.id) {\n return;\n }\n\n if (!this.viewingRevision) {\n // Save current state first\n this.preRevertState = {\n definition: this.definition,\n dirtyDate: this.dirtyDate\n };\n }\n\n this.viewingRevision = revision;\n this.isLoadingRevisions = true;\n this.plumber?.reset();\n\n try {\n await getStore()\n .getState()\n .fetchRevision(`/flow/revisions/${this.flow}`, revision.id.toString());\n } catch (e) {\n console.error('Error fetching revision details', e);\n this.handleCancelRevisionView();\n } finally {\n this.isLoadingRevisions = false;\n }\n }\n\n private handleCancelRevisionView() {\n this.plumber?.reset();\n if (this.preRevertState) {\n const currentInfo = getStore().getState().flowInfo;\n getStore().getState().setFlowContents({\n definition: this.preRevertState.definition,\n info: currentInfo\n });\n if (this.preRevertState.dirtyDate) {\n getStore().getState().setDirtyDate(this.preRevertState.dirtyDate);\n }\n } else {\n // Fallback if no pre-revert definition\n getStore().getState().fetchRevision(`/flow/revisions/${this.flow}`);\n }\n\n this.viewingRevision = null;\n this.preRevertState = null;\n }\n\n private async handleRevertClick() {\n if (!this.viewingRevision || !this.preRevertState) return;\n this.plumber?.reset();\n\n // Use the content of the viewing revision (this.definition)\n // but the revision number of the current head (preRevertState)\n // so the server accepts it as a valid update\n const definitionToSave = {\n ...this.definition,\n revision: this.preRevertState.definition.revision\n };\n\n await this.saveChanges(definitionToSave);\n this.viewingRevision = null;\n this.preRevertState = null;\n this.revisionsWindowHidden = true;\n\n const revisionsWindow = document.getElementById(\n 'revisions-window'\n ) as FloatingWindow;\n revisionsWindow.handleClose();\n\n // Refresh revisions list to show the new one\n this.fetchRevisions();\n\n // Fetch the latest version of the flow to ensure the store is up to date\n getStore().getState().fetchRevision(`/flow/revisions/${this.flow}`);\n }\n\n private renderIssuesTab(): TemplateResult | string {\n if (!this.flowIssues?.length || !this.revisionsWindowHidden) return '';\n return html`\n <temba-floating-tab\n id=\"issues-tab\"\n icon=\"alert_warning\"\n label=\"Flow Issues\"\n color=\"tomato\"\n order=\"1\"\n .hidden=${!this.issuesWindowHidden}\n @temba-button-clicked=${this.handleIssuesTabClick}\n ></temba-floating-tab>\n `;\n }\n\n private renderIssuesWindow(): TemplateResult | string {\n if (!this.flowIssues?.length) return '';\n return html`\n <temba-floating-window\n id=\"issues-window\"\n header=\"Flow Issues\"\n .width=${360}\n .maxHeight=${600}\n .top=${75}\n color=\"tomato\"\n .hidden=${this.issuesWindowHidden}\n @temba-dialog-hidden=${this.handleIssuesWindowClosed}\n >\n <div style=\"display:flex; flex-direction:column; gap:2px;\">\n ${this.flowIssues.map(\n (issue) => html`\n <div\n class=\"issue-list-item\"\n @click=${() => this.handleIssueItemClick(issue)}\n >\n <temba-icon name=\"alert_warning\" size=\"1.2\"></temba-icon>\n <span>${formatIssueMessage(issue)}</span>\n </div>\n `\n )}\n </div>\n </temba-floating-window>\n `;\n }\n\n private renderRevisionsTab(): TemplateResult | string {\n if (this.revisions.length <= 1) return '';\n return html`\n <temba-floating-tab\n id=\"revisions-tab\"\n icon=\"revisions\"\n label=\"Revisions\"\n color=\"rgb(142, 94, 167)\"\n order=\"2\"\n .hidden=${!this.revisionsWindowHidden && this.localizationWindowHidden}\n @temba-button-clicked=${this.handleRevisionsTabClick}\n ></temba-floating-tab>\n `;\n }\n\n private renderRevisionsWindow(): TemplateResult | string {\n return html`\n <temba-floating-window\n id=\"revisions-window\"\n header=\"Revisions\"\n .width=${360}\n .maxHeight=${600}\n .top=${75}\n color=\"rgb(142, 94, 167)\"\n .hidden=${this.revisionsWindowHidden}\n @temba-dialog-hidden=${this.handleRevisionsWindowClosed}\n >\n <div class=\"localization-window-content\">\n <div\n class=\"revisions-list\"\n style=\"display:flex; flex-direction:column; gap:8px; overflow-y:auto; padding-bottom:10px;\"\n >\n ${this.isLoadingRevisions && !this.revisions.length\n ? html`<temba-loading></temba-loading>`\n : this.revisions.map((rev) => {\n const isSelected = this.viewingRevision?.id === rev.id;\n return html`\n <div\n class=\"revision-item ${isSelected ? 'selected' : ''}\"\n style=\"padding:8px; border-radius:4px; cursor:pointer; background:${\n isSelected\n ? '#f0f6ff' // Light blue bg for selected\n : '#f9fafb'\n }; border:1px solid ${\n isSelected ? '#a4cafe' : '#e5e7eb'\n }; transition: all 0.2s ease;\"\n @click=${() => this.handleRevisionClick(rev)}\n >\n <div\n style=\"display:flex; justify-content:space-between; align-items:center;\"\n >\n <div\n class=\"revision-header\"\n style=\"margin-bottom: 2px;\"\n >\n <div\n style=\"font-weight:600; font-size:13px; color:#111827;\"\n >\n <temba-date value=${\n rev.created_on\n } display=\"duration\"></temba-date>\n \n </div>\n <div style=\"font-size:11px; color:#6b7280;\">\n ${rev.user.name || rev.user.username}\n </div>\n </div>\n ${\n isSelected\n ? html`<button\n class=\"revert-button\"\n @click=${this.handleRevertClick}\n >\n Revert\n </button>`\n : html``\n }\n \n </button>\n </div>\n\n ${\n rev.comment\n ? html`<div\n style=\"font-size:12px; color:#4b5563; margin-top:4px;\"\n >\n ${rev.comment}\n </div>`\n : ''\n }\n \n </div>\n `;\n })}\n </div>\n </div>\n </temba-floating-window>\n `;\n }\n\n private renderLocalizationWindow(): TemplateResult | string {\n const languages = this.getLocalizationLanguages();\n if (!languages.length) {\n return html``;\n }\n\n const baseLanguage = this.definition?.language;\n const availableLanguages = this.getAvailableLanguages();\n const baseName =\n availableLanguages.find((lang) => lang.code === baseLanguage)?.name ||\n 'Base Language';\n\n const activeLanguageCode = languages.some(\n (lang) => lang.code === this.languageCode\n )\n ? this.languageCode\n : languages[0]?.code;\n const activeLanguage = activeLanguageCode\n ? languages.find((lang) => lang.code === activeLanguageCode)\n : null;\n const progress = this.getLocalizationProgress(activeLanguageCode || '');\n const includeCategories = this.translationFilters.categories;\n const settingsPanelId = 'translation-settings-panel';\n const remainingTranslations = Math.max(\n progress.total - progress.localized,\n 0\n );\n const hasTranslations = progress.total > 0;\n const hasPendingTranslations = remainingTranslations > 0;\n const autoTranslateButtonLabel = this.autoTranslating\n ? 'Stop Auto Translate'\n : 'Auto Translate';\n const autoTranslateButtonDisabled =\n !this.autoTranslating && !hasTranslations;\n\n return html`\n <temba-floating-window\n id=\"localization-window\"\n header=\"Translations\"\n .width=${360}\n .maxHeight=${600}\n .top=${75}\n color=\"#6b7280\"\n .hidden=${this.localizationWindowHidden}\n @temba-dialog-hidden=${this.handleLocalizationWindowClosed}\n >\n <div class=\"localization-window-content\">\n <div class=\"localization-header\">\n Translate from <strong>${baseName}</strong> to the languages below.\n Closing this window returns you to editing in ${baseName}.\n </div>\n <div class=\"localization-language-row\">\n <temba-select\n flavor=\"small\"\n class=\"localization-language-select\"\n .values=${activeLanguage\n ? [{ name: activeLanguage.name, value: activeLanguage.code }]\n : []}\n @change=${this.handleLocalizationLanguageSelectChange}\n >\n ${languages.map(\n (lang) => html`<temba-option\n value=\"${lang.code}\"\n name=\"${lang.name}\"\n ></temba-option>`\n )}\n </temba-select>\n <button\n class=\"auto-translate-button\"\n type=\"button\"\n ?disabled=${autoTranslateButtonDisabled}\n @click=${this.handleAutoTranslateClick}\n >\n ${autoTranslateButtonLabel}\n </button>\n </div>\n <div class=\"localization-progress\">\n <div class=\"localization-progress-summary\">\n ${this.autoTranslating\n ? html`<temba-loading units=\"3\" size=\"8\"></temba-loading>\n <span>Auto translating remaining text…</span>`\n : !hasTranslations\n ? html`<span>\n Add content or enable more options to start translating.\n </span>`\n : hasPendingTranslations\n ? html`<span>\n ${progress.localized} of ${progress.total} items translated\n </span>`\n : html`<span>All items are translated.</span>`}\n </div>\n ${this.autoTranslateError\n ? html`<div class=\"auto-translate-error\">\n ${this.autoTranslateError}\n </div>`\n : ''}\n <div class=\"localization-progress-bar-row\">\n <div\n class=\"localization-progress-trigger\"\n role=\"button\"\n tabindex=\"0\"\n aria-expanded=\"${this.translationSettingsExpanded}\"\n aria-controls=\"${settingsPanelId}\"\n @click=${this.handleLocalizationProgressToggleClick}\n @keydown=${this.handleLocalizationProgressToggleKeydown}\n >\n <temba-progress\n .current=${progress.localized}\n .total=${Math.max(progress.total, 1)}\n .animated=${false}\n ></temba-progress>\n </div>\n <button\n class=\"translation-settings-toggle\"\n type=\"button\"\n @click=${this.toggleTranslationSettings}\n aria-expanded=\"${this.translationSettingsExpanded}\"\n aria-controls=\"${settingsPanelId}\"\n >\n <span\n class=\"translation-settings-arrow ${this\n .translationSettingsExpanded\n ? 'expanded'\n : ''}\"\n ></span>\n </button>\n </div>\n ${this.translationSettingsExpanded\n ? html`<div id=\"${settingsPanelId}\" class=\"translation-settings\">\n <div class=\"translation-settings-row\">\n <temba-checkbox\n name=\"include-categories\"\n label=\"Include categories\"\n ?checked=${includeCategories}\n style=\"--checkbox-padding:5px; border-radius:var(--curvature);\"\n @change=${this.handleIncludeCategoriesChange}\n ></temba-checkbox>\n </div>\n </div>`\n : ''}\n </div>\n </div>\n </temba-floating-window>\n `;\n }\n\n private renderAutoTranslateDialog(): TemplateResult | string {\n if (!this.autoTranslateDialogOpen) {\n return html``;\n }\n\n const selectedModel = this.autoTranslateModel\n ? [this.autoTranslateModel]\n : [];\n const disableTranslate = !this.autoTranslateModel;\n\n return html`\n <temba-dialog\n header=\"Auto translate\"\n .open=${this.autoTranslateDialogOpen}\n primaryButtonName=\"Translate\"\n cancelButtonName=\"Cancel\"\n size=\"small\"\n .disabled=${disableTranslate}\n @temba-button-clicked=${this.handleAutoTranslateDialogButton}\n >\n <div class=\"auto-translate-dialog-content\">\n <p>\n We'll send any untranslated text to the selected AI model and save\n the responses automatically.\n </p>\n <div class=\"auto-translate-models\">\n <temba-select\n class=\"auto-translate-model-select\"\n endpoint=\"${AUTO_TRANSLATE_MODELS_ENDPOINT}\"\n .valueKey=${'uuid'}\n .values=${selectedModel}\n ?searchable=${true}\n ?clearable=${true}\n placeholder=\"Select an AI model\"\n @change=${this.handleAutoTranslateModelChange}\n ></temba-select>\n </div>\n <p>Only text without translations will be sent.</p>\n ${this.autoTranslateError\n ? html`<div class=\"auto-translate-error\">\n ${this.autoTranslateError}\n </div>`\n : ''}\n </div>\n </temba-dialog>\n `;\n }\n\n private renderLocalizationTab(): TemplateResult | string {\n if (!this.revisionsWindowHidden) return '';\n if (this.definition?.nodes.length === 0) return '';\n const languages = this.getLocalizationLanguages();\n if (!languages.length) {\n return html``;\n }\n\n return html`\n <temba-floating-tab\n id=\"localization-tab\"\n icon=\"language\"\n label=\"Translate Flow\"\n color=\"#6b7280\"\n order=\"3\"\n .hidden=${!this.localizationWindowHidden}\n @temba-button-clicked=${this.handleLocalizationTabClick}\n ></temba-floating-tab>\n `;\n }\n\n /**\n * Focus on a specific node by smoothly scrolling it to the center of the canvas\n */\n public focusNode(nodeUuid: string) {\n const nodeElement = this.querySelector(\n `temba-flow-node[uuid=\"${nodeUuid}\"]`\n ) as HTMLElement;\n if (!nodeElement) {\n return;\n }\n\n const editor = this.querySelector('#editor') as HTMLElement;\n if (!editor) {\n return;\n }\n\n // Get the editor's dimensions and scroll position\n const editorRect = editor.getBoundingClientRect();\n const editorCenterX = editorRect.width / 2;\n const editorCenterY = editorRect.height / 2;\n\n // Use offsetWidth/offsetHeight (unaffected by ancestor transforms)\n const nodeCenterX = nodeElement.offsetLeft + nodeElement.offsetWidth / 2;\n const nodeCenterY = nodeElement.offsetTop + nodeElement.offsetHeight / 2;\n\n // Calculate the scroll position needed to center the node.\n // Multiply by zoom because scroll operates in visual (transformed) space\n // while offsetLeft/offsetTop are in layout space.\n const targetScrollX = nodeCenterX * this.zoom - editorCenterX;\n const targetScrollY = nodeCenterY * this.zoom - editorCenterY;\n\n // Smooth scroll the editor container to the target position\n editor.scrollTo({\n left: Math.max(0, targetScrollX),\n top: Math.max(0, targetScrollY),\n behavior: 'smooth'\n });\n }\n\n private isReadOnly(): boolean {\n return this.viewingRevision !== null || this.isTranslating;\n }\n\n public render(): TemplateResult {\n // we have to embed our own style since we are in light DOM\n const style = html`<style>\n ${unsafeCSS(Editor.styles.cssText)}\n ${unsafeCSS(CanvasNode.styles.cssText)}\n </style>`;\n\n const stickies = this.definition?._ui?.stickies || {};\n\n return html`${style} ${this.renderIssuesWindow()}\n ${this.renderRevisionsWindow()} ${this.renderLocalizationWindow()}\n ${this.renderAutoTranslateDialog()}\n <div id=\"editor-container\">\n <div id=\"editor\">\n ${this.definition &&\n this.definition.nodes.length === 0 &&\n !this.isReadOnly()\n ? html`<div class=\"empty-flow\">\n <div class=\"empty-flow-content\">\n <div class=\"empty-flow-title\">This flow is empty</div>\n <div class=\"empty-flow-description\">\n Get started by adding your first action or split to define\n how this flow will work.\n </div>\n <button\n class=\"empty-flow-button\"\n @click=${this.handleEmptyFlowClick}\n >\n Add first step\n </button>\n </div>\n </div>`\n : ''}\n <div\n id=\"grid\"\n class=\"${this.viewingRevision ? 'viewing-revision' : ''}\"\n style=\"min-width:${100 / this.zoom}%;min-height:${100 /\n this.zoom}%;width:${this.canvasSize.width}px; height:${this\n .canvasSize.height}px;transform:scale(${this.zoom})\"\n >\n <div\n id=\"canvas\"\n class=\"${getClasses({\n 'viewing-revision': !!this.viewingRevision,\n 'read-only-connections':\n !!this.viewingRevision || this.isTranslating\n })}\"\n >\n ${this.definition\n ? repeat(\n [...this.definition.nodes].sort((a, b) =>\n a.uuid.localeCompare(b.uuid)\n ),\n (node) => node.uuid,\n (node) => {\n const position = this.definition._ui?.nodes[node.uuid]\n ?.position || {\n left: 0,\n top: 0\n };\n\n const dragging =\n this.isDragging &&\n this.currentDragItem?.uuid === node.uuid;\n\n const selected = this.selectedItems.has(node.uuid);\n\n // first node is the flow start (nodes are sorted by position)\n const isFlowStart =\n this.definition.nodes.length > 0 &&\n this.definition.nodes[0].uuid === node.uuid;\n\n return html`<temba-flow-node\n class=\"draggable ${dragging\n ? 'dragging'\n : ''} ${selected ? 'selected' : ''} ${isFlowStart\n ? 'flow-start'\n : ''}\"\n @mousedown=${this.handleMouseDown.bind(this)}\n @touchstart=${this.handleItemTouchStart.bind(this)}\n uuid=${node.uuid}\n data-node-uuid=${node.uuid}\n style=\"left:${position.left}px; top:${position.top}px;transition: all 0.2s ease-in-out;\"\n .plumber=${this.plumber}\n .node=${node}\n .ui=${this.definition._ui.nodes[node.uuid]}\n @temba-node-deleted=${(event) => {\n this.deleteNodes([event.detail.uuid]);\n }}\n ></temba-flow-node>`;\n }\n )\n : html`<temba-loading></temba-loading>`}\n ${repeat(\n Object.entries(stickies),\n ([uuid]) => uuid,\n ([uuid, sticky]) => {\n const position = sticky.position || { left: 0, top: 0 };\n const dragging =\n this.isDragging && this.currentDragItem?.uuid === uuid;\n const selected = this.selectedItems.has(uuid);\n return html`<temba-sticky-note\n class=\"draggable ${dragging ? 'dragging' : ''} ${selected\n ? 'selected'\n : ''}\"\n @mousedown=${this.handleMouseDown.bind(this)}\n @touchstart=${this.handleItemTouchStart.bind(this)}\n style=\"left:${position.left}px; top:${position.top}px;\"\n uuid=${uuid}\n .data=${sticky}\n .dragging=${dragging}\n .selected=${selected}\n ></temba-sticky-note>`;\n }\n )}\n ${this.renderSelectionBox()} ${this.renderCanvasDropPreview()}\n ${this.renderConnectionPlaceholder()}\n </div>\n </div>\n </div>\n <div class=\"save-indicator ${this.isSaving ? 'visible' : ''}\">\n <temba-loading units=\"3\" size=\"8\"></temba-loading>\n </div>\n <div class=\"zoom-controls\">\n <button\n @click=${this.zoomToFit}\n ?disabled=${this.zoomFitted}\n title=\"Zoom to fit\"\n >\n <temba-icon name=${Icon.zoom_fit} size=\"1\"></temba-icon>\n </button>\n <div class=\"zoom-divider\"></div>\n <button\n @click=${this.zoomOut}\n ?disabled=${this.zoom <= 0.1}\n title=\"Zoom out\"\n >\n −\n </button>\n <span class=\"zoom-level\">${Math.round(this.zoom * 100)}%</span>\n <button\n @click=${this.zoomIn}\n ?disabled=${this.zoom >= 1.0}\n title=\"Zoom in\"\n >\n +\n </button>\n <div class=\"zoom-divider\"></div>\n <button\n @click=${this.zoomToFull}\n ?disabled=${this.zoom >= 1.0}\n title=\"Zoom to 100%\"\n >\n <temba-icon name=${Icon.zoom_in} size=\"1\"></temba-icon>\n </button>\n </div>\n ${this.reflowUnsaved\n ? html`<div class=\"reflow-card\">\n <div class=\"reflow-top\">\n <span class=\"reflow-label\">Unsaved layout changes</span>\n <button\n class=\"reflow-discard\"\n @click=${this.handleReflowDiscard}\n >\n Discard\n </button>\n </div>\n <div class=\"reflow-meter\">\n <div class=\"reflow-meter-fill\"></div>\n </div>\n </div>`\n : ''}\n </div>\n\n ${this.editingNode || this.editingAction\n ? html`<temba-node-editor\n .node=${this.editingNode}\n .nodeUI=${this.editingNodeUI}\n .action=${this.editingAction}\n .dialogOrigin=${this.dialogOrigin}\n @temba-node-saved=${(e: CustomEvent) =>\n this.handleNodeSaved(e.detail.node, e.detail.uiConfig)}\n @temba-action-saved=${(e: CustomEvent) =>\n this.handleActionSaved(e.detail.action)}\n @temba-node-edit-cancelled=${this.handleNodeEditCanceled}\n ></temba-node-editor>`\n : ''}\n\n <temba-canvas-menu></temba-canvas-menu>\n ${!this.viewingRevision\n ? html`<temba-node-type-selector\n .flowType=${this.flowType}\n .features=${this.features}\n ></temba-node-type-selector>`\n : ''}\n ${this.renderIssuesTab()} ${this.renderRevisionsTab()}\n ${this.renderLocalizationTab()} `;\n }\n}\n"]}