@nyaruka/temba-components 0.138.4 → 0.139.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/locales/es.js +5 -5
  3. package/dist/locales/es.js.map +1 -1
  4. package/dist/locales/fr.js +5 -5
  5. package/dist/locales/fr.js.map +1 -1
  6. package/dist/locales/locale-codes.js +2 -11
  7. package/dist/locales/locale-codes.js.map +1 -1
  8. package/dist/locales/pt.js +5 -5
  9. package/dist/locales/pt.js.map +1 -1
  10. package/dist/temba-components.js +816 -852
  11. package/dist/temba-components.js.map +1 -1
  12. package/out-tsc/src/display/FloatingTab.js +23 -30
  13. package/out-tsc/src/display/FloatingTab.js.map +1 -1
  14. package/out-tsc/src/flow/CanvasMenu.js +5 -3
  15. package/out-tsc/src/flow/CanvasMenu.js.map +1 -1
  16. package/out-tsc/src/flow/CanvasNode.js +6 -7
  17. package/out-tsc/src/flow/CanvasNode.js.map +1 -1
  18. package/out-tsc/src/flow/Editor.js +152 -235
  19. package/out-tsc/src/flow/Editor.js.map +1 -1
  20. package/out-tsc/src/flow/Plumber.js +757 -403
  21. package/out-tsc/src/flow/Plumber.js.map +1 -1
  22. package/out-tsc/src/flow/utils.js +138 -66
  23. package/out-tsc/src/flow/utils.js.map +1 -1
  24. package/out-tsc/src/interfaces.js +1 -0
  25. package/out-tsc/src/interfaces.js.map +1 -1
  26. package/out-tsc/src/list/TicketList.js +4 -1
  27. package/out-tsc/src/list/TicketList.js.map +1 -1
  28. package/out-tsc/src/live/ContactChat.js +18 -1
  29. package/out-tsc/src/live/ContactChat.js.map +1 -1
  30. package/out-tsc/src/locales/es.js +5 -5
  31. package/out-tsc/src/locales/es.js.map +1 -1
  32. package/out-tsc/src/locales/fr.js +5 -5
  33. package/out-tsc/src/locales/fr.js.map +1 -1
  34. package/out-tsc/src/locales/locale-codes.js +2 -11
  35. package/out-tsc/src/locales/locale-codes.js.map +1 -1
  36. package/out-tsc/src/locales/pt.js +5 -5
  37. package/out-tsc/src/locales/pt.js.map +1 -1
  38. package/out-tsc/src/simulator/Simulator.js +1 -0
  39. package/out-tsc/src/simulator/Simulator.js.map +1 -1
  40. package/out-tsc/test/temba-floating-tab.test.js +4 -6
  41. package/out-tsc/test/temba-floating-tab.test.js.map +1 -1
  42. package/out-tsc/test/temba-flow-collision.test.js +221 -223
  43. package/out-tsc/test/temba-flow-collision.test.js.map +1 -1
  44. package/out-tsc/test/temba-flow-editor.test.js +0 -2
  45. package/out-tsc/test/temba-flow-editor.test.js.map +1 -1
  46. package/out-tsc/test/temba-flow-plumber-connections.test.js +83 -84
  47. package/out-tsc/test/temba-flow-plumber-connections.test.js.map +1 -1
  48. package/out-tsc/test/temba-flow-plumber.test.js +102 -93
  49. package/out-tsc/test/temba-flow-plumber.test.js.map +1 -1
  50. package/package.json +1 -1
  51. package/src/display/FloatingTab.ts +22 -31
  52. package/src/flow/CanvasMenu.ts +8 -3
  53. package/src/flow/CanvasNode.ts +6 -7
  54. package/src/flow/Editor.ts +184 -279
  55. package/src/flow/Plumber.ts +1011 -457
  56. package/src/flow/utils.ts +162 -84
  57. package/src/interfaces.ts +2 -1
  58. package/src/list/TicketList.ts +4 -1
  59. package/src/live/ContactChat.ts +19 -1
  60. package/src/locales/es.ts +13 -18
  61. package/src/locales/fr.ts +13 -18
  62. package/src/locales/locale-codes.ts +2 -11
  63. package/src/locales/pt.ts +13 -18
  64. package/src/simulator/Simulator.ts +1 -0
  65. package/test/temba-floating-tab.test.ts +4 -6
  66. package/test/temba-flow-collision.test.ts +225 -303
  67. package/test/temba-flow-editor.test.ts +0 -2
  68. package/test/temba-flow-plumber-connections.test.ts +97 -97
  69. package/test/temba-flow-plumber.test.ts +116 -103
@@ -1 +1 @@
1
- {"version":3,"file":"temba-flow-collision.test.js","sourceRoot":"","sources":["../../test/temba-flow-collision.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect } from '@open-wc/testing';\nimport {\n getNodeBounds,\n nodesOverlap,\n detectCollisions,\n calculateReflowPositions,\n NodeBounds\n} from '../src/flow/utils';\n\ndescribe('Collision Detection Utilities', () => {\n describe('getNodeBounds', () => {\n it('returns null when element not found', () => {\n const position = { left: 100, top: 200 };\n const bounds = getNodeBounds('nonexistent-uuid', position);\n expect(bounds).to.be.null;\n });\n\n it('calculates bounds correctly from element', () => {\n // Create a mock element\n const mockElement = document.createElement('div');\n mockElement.id = 'test-node';\n mockElement.style.width = '200px';\n mockElement.style.height = '150px';\n document.body.appendChild(mockElement);\n\n const position = { left: 100, top: 200 };\n const bounds = getNodeBounds('test-node', position, mockElement);\n\n expect(bounds).to.not.be.null;\n expect(bounds!.uuid).to.equal('test-node');\n expect(bounds!.left).to.equal(100);\n expect(bounds!.top).to.equal(200);\n expect(bounds!.right).to.equal(300); // left + width\n expect(bounds!.bottom).to.equal(350); // top + height\n expect(bounds!.width).to.equal(200);\n expect(bounds!.height).to.equal(150);\n\n document.body.removeChild(mockElement);\n });\n });\n\n describe('nodesOverlap', () => {\n it('detects overlapping nodes horizontally and vertically', () => {\n const bounds1: NodeBounds = {\n uuid: 'node1',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n };\n\n const bounds2: NodeBounds = {\n uuid: 'node2',\n left: 150,\n top: 150,\n right: 250,\n bottom: 250,\n width: 100,\n height: 100\n };\n\n expect(nodesOverlap(bounds1, bounds2)).to.be.true;\n });\n\n it('detects non-overlapping nodes to the right', () => {\n const bounds1: NodeBounds = {\n uuid: 'node1',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n };\n\n const bounds2: NodeBounds = {\n uuid: 'node2',\n left: 300,\n top: 100,\n right: 400,\n bottom: 200,\n width: 100,\n height: 100\n };\n\n expect(nodesOverlap(bounds1, bounds2)).to.be.false;\n });\n\n it('detects non-overlapping nodes below', () => {\n const bounds1: NodeBounds = {\n uuid: 'node1',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n };\n\n const bounds2: NodeBounds = {\n uuid: 'node2',\n left: 100,\n top: 300,\n right: 200,\n bottom: 400,\n width: 100,\n height: 100\n };\n\n expect(nodesOverlap(bounds1, bounds2)).to.be.false;\n });\n\n it('detects edge touching as overlapping (within buffer)', () => {\n const bounds1: NodeBounds = {\n uuid: 'node1',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n };\n\n const bounds2: NodeBounds = {\n uuid: 'node2',\n left: 200,\n top: 100,\n right: 300,\n bottom: 200,\n width: 100,\n height: 100\n };\n\n // edges touching should be considered overlapping due to buffer\n expect(nodesOverlap(bounds1, bounds2)).to.be.true;\n });\n\n it('detects partial vertical overlap', () => {\n const bounds1: NodeBounds = {\n uuid: 'node1',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n };\n\n const bounds2: NodeBounds = {\n uuid: 'node2',\n left: 150,\n top: 50,\n right: 250,\n bottom: 150,\n width: 100,\n height: 100\n };\n\n expect(nodesOverlap(bounds1, bounds2)).to.be.true;\n });\n });\n\n describe('detectCollisions', () => {\n it('returns empty array when no collisions', () => {\n const targetBounds: NodeBounds = {\n uuid: 'target',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n };\n\n const allBounds: NodeBounds[] = [\n {\n uuid: 'node1',\n left: 300,\n top: 100,\n right: 400,\n bottom: 200,\n width: 100,\n height: 100\n },\n {\n uuid: 'node2',\n left: 100,\n top: 300,\n right: 200,\n bottom: 400,\n width: 100,\n height: 100\n }\n ];\n\n const collisions = detectCollisions(targetBounds, allBounds);\n expect(collisions).to.have.length(0);\n });\n\n it('detects single collision', () => {\n const targetBounds: NodeBounds = {\n uuid: 'target',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n };\n\n const allBounds: NodeBounds[] = [\n {\n uuid: 'node1',\n left: 150,\n top: 150,\n right: 250,\n bottom: 250,\n width: 100,\n height: 100\n },\n {\n uuid: 'node2',\n left: 300,\n top: 300,\n right: 400,\n bottom: 400,\n width: 100,\n height: 100\n }\n ];\n\n const collisions = detectCollisions(targetBounds, allBounds);\n expect(collisions).to.have.length(1);\n expect(collisions[0].uuid).to.equal('node1');\n });\n\n it('detects multiple collisions', () => {\n const targetBounds: NodeBounds = {\n uuid: 'target',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n };\n\n const allBounds: NodeBounds[] = [\n {\n uuid: 'node1',\n left: 150,\n top: 150,\n right: 250,\n bottom: 250,\n width: 100,\n height: 100\n },\n {\n uuid: 'node2',\n left: 50,\n top: 50,\n right: 150,\n bottom: 150,\n width: 100,\n height: 100\n }\n ];\n\n const collisions = detectCollisions(targetBounds, allBounds);\n expect(collisions).to.have.length(2);\n });\n\n it('excludes target node from collisions', () => {\n const targetBounds: NodeBounds = {\n uuid: 'target',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n };\n\n const allBounds: NodeBounds[] = [\n targetBounds,\n {\n uuid: 'node1',\n left: 150,\n top: 150,\n right: 250,\n bottom: 250,\n width: 100,\n height: 100\n }\n ];\n\n const collisions = detectCollisions(targetBounds, allBounds);\n expect(collisions).to.have.length(1);\n expect(collisions[0].uuid).to.equal('node1');\n });\n });\n\n describe('calculateReflowPositions', () => {\n it('returns empty map when no collisions', () => {\n const movedBounds: NodeBounds = {\n uuid: 'moved',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n };\n\n const allBounds: NodeBounds[] = [\n movedBounds,\n {\n uuid: 'node1',\n left: 300,\n top: 100,\n right: 400,\n bottom: 200,\n width: 100,\n height: 100\n }\n ];\n\n const positions = calculateReflowPositions(\n 'moved',\n movedBounds,\n allBounds,\n false\n );\n expect(positions.size).to.equal(0);\n });\n\n it('moves colliding node down', () => {\n const movedBounds: NodeBounds = {\n uuid: 'moved',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n };\n\n const allBounds: NodeBounds[] = [\n movedBounds,\n {\n uuid: 'node1',\n left: 150,\n top: 150,\n right: 250,\n bottom: 250,\n width: 100,\n height: 100\n }\n ];\n\n const positions = calculateReflowPositions(\n 'moved',\n movedBounds,\n allBounds,\n false\n );\n\n expect(positions.size).to.equal(1);\n expect(positions.has('node1')).to.be.true;\n\n const newPos = positions.get('node1')!;\n expect(newPos.left).to.equal(150); // left unchanged\n expect(newPos.top).to.be.greaterThan(200); // moved below the moved node\n });\n\n it('handles droppedBelowMidpoint by moving dropped node down', () => {\n const movedBounds: NodeBounds = {\n uuid: 'moved',\n left: 100,\n top: 150,\n right: 200,\n bottom: 250,\n width: 100,\n height: 100\n };\n\n const allBounds: NodeBounds[] = [\n movedBounds,\n {\n uuid: 'existing',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n }\n ];\n\n const positions = calculateReflowPositions(\n 'moved',\n movedBounds,\n allBounds,\n true // droppedBelowMidpoint\n );\n\n expect(positions.size).to.equal(1);\n expect(positions.has('moved')).to.be.true;\n\n const newPos = positions.get('moved')!;\n expect(newPos.top).to.be.greaterThan(200); // moved below existing node\n });\n\n it('gives priority to dropped node when dropped above midpoint', () => {\n // Dropped node overlaps with bottom of existing node\n // Bottom of dropped (180) is above midpoint of existing (150)\n // So dropped node should keep position, existing moves down\n const movedBounds: NodeBounds = {\n uuid: 'dropped',\n left: 100,\n top: 80,\n right: 200,\n bottom: 180,\n width: 100,\n height: 100\n };\n\n const allBounds: NodeBounds[] = [\n movedBounds,\n {\n uuid: 'existing',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n }\n ];\n\n const positions = calculateReflowPositions(\n 'dropped',\n movedBounds,\n allBounds,\n false // dropped node's bottom is above target midpoint, dropped node gets priority\n );\n\n // Existing node should be moved down\n expect(positions.has('existing')).to.be.true;\n expect(positions.has('dropped')).to.be.false; // dropped keeps its position\n\n const existingNewPos = positions.get('existing')!;\n expect(existingNewPos.top).to.be.greaterThan(180); // moved below dropped node\n });\n\n it('gives priority to existing node when dropped below midpoint', () => {\n // Dropped node overlaps with top of existing node\n // Bottom of dropped (220) is below midpoint of existing (150)\n // So existing node keeps position, dropped moves down\n const movedBounds: NodeBounds = {\n uuid: 'dropped',\n left: 100,\n top: 120,\n right: 200,\n bottom: 220,\n width: 100,\n height: 100\n };\n\n const allBounds: NodeBounds[] = [\n movedBounds,\n {\n uuid: 'existing',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n }\n ];\n\n const positions = calculateReflowPositions(\n 'dropped',\n movedBounds,\n allBounds,\n true // dropped node's bottom is below target midpoint, target gets priority\n );\n\n // Dropped node should be moved down\n expect(positions.has('dropped')).to.be.true;\n expect(positions.has('existing')).to.be.false; // existing keeps its position\n\n const droppedNewPos = positions.get('dropped')!;\n expect(droppedNewPos.top).to.be.greaterThan(200); // moved below existing node\n });\n\n it('resolves cascading collisions', () => {\n const movedBounds: NodeBounds = {\n uuid: 'moved',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n };\n\n const allBounds: NodeBounds[] = [\n movedBounds,\n {\n uuid: 'node1',\n left: 100,\n top: 150,\n right: 200,\n bottom: 250,\n width: 100,\n height: 100\n },\n {\n uuid: 'node2',\n left: 100,\n top: 200,\n right: 200,\n bottom: 300,\n width: 100,\n height: 100\n }\n ];\n\n const positions = calculateReflowPositions(\n 'moved',\n movedBounds,\n allBounds,\n false\n );\n\n // Both nodes should be repositioned to avoid collision\n expect(positions.size).to.be.greaterThan(0);\n\n // Check that moved nodes maintain vertical order and spacing\n if (positions.has('node1') && positions.has('node2')) {\n const node1Pos = positions.get('node1')!;\n const node2Pos = positions.get('node2')!;\n\n // node2 should be below node1\n expect(node2Pos.top).to.be.greaterThan(node1Pos.top);\n }\n });\n\n it('handles multiple iterations for complex cascading collisions', () => {\n // Test case that requires multiple iterations to resolve all collisions\n // This scenario has nodes that initially don't collide with moved node,\n // but will collide with other nodes that get moved\n const movedBounds: NodeBounds = {\n uuid: 'moved',\n left: 100,\n top: 50,\n right: 200,\n bottom: 150,\n width: 100,\n height: 100\n };\n\n const allBounds: NodeBounds[] = [\n movedBounds,\n {\n uuid: 'node1',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n },\n {\n uuid: 'node2',\n left: 100,\n top: 180,\n right: 200,\n bottom: 280,\n width: 100,\n height: 100\n },\n {\n uuid: 'node3',\n left: 100,\n top: 260,\n right: 200,\n bottom: 360,\n width: 100,\n height: 100\n }\n ];\n\n const positions = calculateReflowPositions(\n 'moved',\n movedBounds,\n allBounds,\n false\n );\n\n // All three nodes should be repositioned to be stacked below the moved node\n expect(positions.size).to.equal(3);\n expect(positions.has('node1')).to.be.true;\n expect(positions.has('node2')).to.be.true;\n expect(positions.has('node3')).to.be.true;\n\n const node1Pos = positions.get('node1')!;\n const node2Pos = positions.get('node2')!;\n const node3Pos = positions.get('node3')!;\n\n // Nodes should be stacked vertically with proper spacing\n expect(node1Pos.top).to.be.at.least(170); // 150 (bottom of moved) + 20\n expect(node2Pos.top).to.be.at.least(node1Pos.top + 120); // node1 top + height + spacing\n expect(node3Pos.top).to.be.at.least(node2Pos.top + 120); // node2 top + height + spacing\n });\n\n it('handles nodes that collide with already repositioned nodes', () => {\n // This test creates a scenario where node3 doesn't collide with the moved node,\n // but collides with node2 which itself got repositioned due to collision with node1\n const movedBounds: NodeBounds = {\n uuid: 'moved',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n };\n\n const allBounds: NodeBounds[] = [\n movedBounds,\n {\n uuid: 'node1',\n left: 100,\n top: 150,\n right: 200,\n bottom: 250,\n width: 100,\n height: 100\n },\n {\n uuid: 'node2',\n left: 100,\n top: 240,\n right: 200,\n bottom: 340,\n width: 100,\n height: 100\n }\n ];\n\n const positions = calculateReflowPositions(\n 'moved',\n movedBounds,\n allBounds,\n false\n );\n\n // Both nodes should be moved\n expect(positions.size).to.equal(2);\n expect(positions.has('node1')).to.be.true;\n expect(positions.has('node2')).to.be.true;\n\n const node1Pos = positions.get('node1')!;\n const node2Pos = positions.get('node2')!;\n\n // node1 should be moved below moved node\n expect(node1Pos.top).to.be.at.least(220); // 200 + 20\n\n // node2 should be moved below the new position of node1\n // This tests the code path where we check against already repositioned nodes\n expect(node2Pos.top).to.be.at.least(node1Pos.top + 120);\n });\n\n it('maintains horizontal position while moving vertically', () => {\n const movedBounds: NodeBounds = {\n uuid: 'moved',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n };\n\n const allBounds: NodeBounds[] = [\n movedBounds,\n {\n uuid: 'node1',\n left: 150,\n top: 150,\n right: 250,\n bottom: 250,\n width: 100,\n height: 100\n }\n ];\n\n const positions = calculateReflowPositions(\n 'moved',\n movedBounds,\n allBounds,\n false\n );\n\n const newPos = positions.get('node1')!;\n // Horizontal position should remain unchanged\n expect(newPos.left).to.equal(150);\n });\n\n it('adds minimum spacing between nodes', () => {\n const movedBounds: NodeBounds = {\n uuid: 'moved',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n };\n\n const allBounds: NodeBounds[] = [\n movedBounds,\n {\n uuid: 'node1',\n left: 100,\n top: 150,\n right: 200,\n bottom: 250,\n width: 100,\n height: 100\n }\n ];\n\n const positions = calculateReflowPositions(\n 'moved',\n movedBounds,\n allBounds,\n false\n );\n\n const newPos = positions.get('node1')!;\n // Should have at least 20px spacing (MIN_NODE_SPACING)\n expect(newPos.top).to.be.at.least(220); // 200 (bottom of moved) + 20\n });\n });\n\n describe('edge cases', () => {\n it('handles empty allBounds array', () => {\n const movedBounds: NodeBounds = {\n uuid: 'moved',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n };\n\n const positions = calculateReflowPositions(\n 'moved',\n movedBounds,\n [],\n false\n );\n\n expect(positions.size).to.equal(0);\n });\n\n it('handles single node (no other nodes to collide with)', () => {\n const movedBounds: NodeBounds = {\n uuid: 'moved',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n };\n\n const positions = calculateReflowPositions(\n 'moved',\n movedBounds,\n [movedBounds],\n false\n );\n\n expect(positions.size).to.equal(0);\n });\n\n it('prevents infinite loops with complex collisions', () => {\n const movedBounds: NodeBounds = {\n uuid: 'moved',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n };\n\n // Create a complex scenario with many overlapping nodes\n const allBounds: NodeBounds[] = [movedBounds];\n\n for (let i = 0; i < 20; i++) {\n allBounds.push({\n uuid: `node${i}`,\n left: 100 + i * 10,\n top: 100 + i * 10,\n right: 200 + i * 10,\n bottom: 200 + i * 10,\n width: 100,\n height: 100\n });\n }\n\n // Should complete without hanging\n const positions = calculateReflowPositions(\n 'moved',\n movedBounds,\n allBounds,\n false\n );\n\n // Should have resolved some collisions\n expect(positions.size).to.be.greaterThan(0);\n });\n });\n});\n"]}
1
+ {"version":3,"file":"temba-flow-collision.test.js","sourceRoot":"","sources":["../../test/temba-flow-collision.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EACL,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,wBAAwB,EAEzB,MAAM,mBAAmB,CAAC;AAE3B,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,QAAQ,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,aAAa,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;YAC3D,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,wBAAwB;YACxB,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAClD,WAAW,CAAC,EAAE,GAAG,WAAW,CAAC;YAC7B,WAAW,CAAC,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC;YAClC,WAAW,CAAC,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC;YACnC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;YAEvC,MAAM,QAAQ,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,aAAa,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;YAEjE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;YAC9B,MAAM,CAAC,MAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC3C,MAAM,CAAC,MAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACnC,MAAM,CAAC,MAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAClC,MAAM,CAAC,MAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe;YACpD,MAAM,CAAC,MAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe;YACrD,MAAM,CAAC,MAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACpC,MAAM,CAAC,MAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAErC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,MAAM,OAAO,GAAe;gBAC1B,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,GAAG;gBACT,GAAG,EAAE,GAAG;gBACR,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;gBACX,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;aACZ,CAAC;YAEF,MAAM,OAAO,GAAe;gBAC1B,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,GAAG;gBACT,GAAG,EAAE,GAAG;gBACR,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;gBACX,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;aACZ,CAAC;YAEF,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,OAAO,GAAe;gBAC1B,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,GAAG;gBACT,GAAG,EAAE,GAAG;gBACR,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;gBACX,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;aACZ,CAAC;YAEF,MAAM,OAAO,GAAe;gBAC1B,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,GAAG;gBACT,GAAG,EAAE,GAAG;gBACR,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;gBACX,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;aACZ,CAAC;YAEF,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,OAAO,GAAe;gBAC1B,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,GAAG;gBACT,GAAG,EAAE,GAAG;gBACR,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;gBACX,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;aACZ,CAAC;YAEF,MAAM,OAAO,GAAe;gBAC1B,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,GAAG;gBACT,GAAG,EAAE,GAAG;gBACR,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;gBACX,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;aACZ,CAAC;YAEF,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,MAAM,OAAO,GAAe;gBAC1B,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,GAAG;gBACT,GAAG,EAAE,GAAG;gBACR,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;gBACX,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;aACZ,CAAC;YAEF,MAAM,OAAO,GAAe;gBAC1B,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,GAAG;gBACT,GAAG,EAAE,GAAG;gBACR,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;gBACX,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;aACZ,CAAC;YAEF,gEAAgE;YAChE,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,OAAO,GAAe;gBAC1B,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,GAAG;gBACT,GAAG,EAAE,GAAG;gBACR,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;gBACX,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;aACZ,CAAC;YAEF,MAAM,OAAO,GAAe;gBAC1B,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,GAAG;gBACT,GAAG,EAAE,EAAE;gBACP,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;gBACX,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;aACZ,CAAC;YAEF,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QACpD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,YAAY,GAAe;gBAC/B,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,GAAG;gBACT,GAAG,EAAE,GAAG;gBACR,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;gBACX,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;aACZ,CAAC;YAEF,MAAM,SAAS,GAAiB;gBAC9B;oBACE,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,GAAG;oBACT,GAAG,EAAE,GAAG;oBACR,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;oBACX,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;iBACZ;gBACD;oBACE,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,GAAG;oBACT,GAAG,EAAE,GAAG;oBACR,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;oBACX,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;iBACZ;aACF,CAAC;YAEF,MAAM,UAAU,GAAG,gBAAgB,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;YAC7D,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;YAClC,MAAM,YAAY,GAAe;gBAC/B,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,GAAG;gBACT,GAAG,EAAE,GAAG;gBACR,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;gBACX,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;aACZ,CAAC;YAEF,MAAM,SAAS,GAAiB;gBAC9B;oBACE,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,GAAG;oBACT,GAAG,EAAE,GAAG;oBACR,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;oBACX,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;iBACZ;gBACD;oBACE,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,GAAG;oBACT,GAAG,EAAE,GAAG;oBACR,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;oBACX,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;iBACZ;aACF,CAAC;YAEF,MAAM,UAAU,GAAG,gBAAgB,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;YAC7D,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,MAAM,YAAY,GAAe;gBAC/B,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,GAAG;gBACT,GAAG,EAAE,GAAG;gBACR,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;gBACX,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;aACZ,CAAC;YAEF,MAAM,SAAS,GAAiB;gBAC9B;oBACE,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,GAAG;oBACT,GAAG,EAAE,GAAG;oBACR,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;oBACX,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;iBACZ;gBACD;oBACE,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,EAAE;oBACR,GAAG,EAAE,EAAE;oBACP,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;oBACX,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;iBACZ;aACF,CAAC;YAEF,MAAM,UAAU,GAAG,gBAAgB,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;YAC7D,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,YAAY,GAAe;gBAC/B,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,GAAG;gBACT,GAAG,EAAE,GAAG;gBACR,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;gBACX,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;aACZ,CAAC;YAEF,MAAM,SAAS,GAAiB;gBAC9B,YAAY;gBACZ;oBACE,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,GAAG;oBACT,GAAG,EAAE,GAAG;oBACR,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;oBACX,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;iBACZ;aACF,CAAC;YAEF,MAAM,UAAU,GAAG,gBAAgB,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;YAC7D,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACxC,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,SAAS,GAAiB;gBAC9B;oBACE,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,GAAG;oBACT,GAAG,EAAE,GAAG;oBACR,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;oBACX,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;iBACZ;gBACD;oBACE,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,GAAG;oBACT,GAAG,EAAE,GAAG;oBACR,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;oBACX,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;iBACZ;aACF,CAAC;YAEF,MAAM,SAAS,GAAG,wBAAwB,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC;YACjE,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,SAAS,GAAiB;gBAC9B;oBACE,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,GAAG;oBACT,GAAG,EAAE,GAAG;oBACR,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;oBACX,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;iBACZ;gBACD;oBACE,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,GAAG;oBACT,GAAG,EAAE,GAAG;oBACR,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;oBACX,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;iBACZ;aACF,CAAC;YAEF,MAAM,SAAS,GAAG,wBAAwB,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC;YAEjE,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;YAC1C,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,SAAS,GAAiB;gBAC9B;oBACE,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,GAAG;oBACT,GAAG,EAAE,GAAG;oBACR,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;oBACX,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;iBACZ;gBACD;oBACE,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,GAAG;oBACT,GAAG,EAAE,GAAG;oBACR,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;oBACX,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;iBACZ;aACF,CAAC;YAEF,MAAM,SAAS,GAAG,wBAAwB,CAAC,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;YAEnE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;YAC7C,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,iEAAiE;YACjE,6DAA6D;YAC7D,MAAM,SAAS,GAAiB;gBAC9B;oBACE,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,GAAG;oBACT,GAAG,EAAE,GAAG;oBACR,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;oBACX,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;iBACZ;gBACD;oBACE,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,GAAG;oBACT,GAAG,EAAE,GAAG;oBACR,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;oBACX,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;iBACZ;aACF,CAAC;YAEF,MAAM,SAAS,GAAG,wBAAwB,CAAC,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC;YAElE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;YAC7C,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC;YAC1C,wDAAwD;YACxD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YAC3C,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,8BAA8B;QAClE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,iEAAiE;YACjE,oEAAoE;YACpE,oDAAoD;YACpD,sDAAsD;YACtD,MAAM,SAAS,GAAiB;gBAC9B;oBACE,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,GAAG;oBACT,GAAG,EAAE,GAAG;oBACR,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;oBACX,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;iBACZ;gBACD;oBACE,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,GAAG;oBACT,GAAG,EAAE,GAAG;oBACR,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;oBACX,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;iBACZ;aACF,CAAC;YAEF,MAAM,SAAS,GAAG,wBAAwB,CAAC,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC;YAElE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;YAC7C,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC;YAC1C,yCAAyC;YACzC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACvC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,gCAAgC;QACrE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,iEAAiE;YACjE,sEAAsE;YACtE,sCAAsC;YACtC,MAAM,SAAS,GAAiB;gBAC9B;oBACE,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,GAAG;oBACT,GAAG,EAAE,GAAG;oBACR,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;oBACX,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;iBACZ;gBACD;oBACE,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,GAAG;oBACT,GAAG,EAAE,GAAG;oBACR,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;oBACX,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;iBACZ;gBACD;oBACE,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,GAAG;oBACT,GAAG,EAAE,GAAG;oBACR,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;oBACX,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;iBACZ;aACF,CAAC;YAEF,MAAM,SAAS,GAAG,wBAAwB,CAAC,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC;YAElE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;YAC7C,wDAAwD;YACxD,kCAAkC;YAClC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,SAAS,GAAiB;gBAC9B;oBACE,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,GAAG;oBACT,GAAG,EAAE,GAAG;oBACR,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;oBACX,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;iBACZ;gBACD;oBACE,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,GAAG;oBACT,GAAG,EAAE,GAAG;oBACR,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;oBACX,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;iBACZ;gBACD;oBACE,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,GAAG;oBACT,GAAG,EAAE,GAAG;oBACR,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;oBACX,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;iBACZ;aACF,CAAC;YAEF,MAAM,SAAS,GAAG,wBAAwB,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC;YAEjE,2CAA2C;YAC3C,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;YAE5C,yEAAyE;YACzE,sDAAsD;QACxD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,0DAA0D;YAC1D,MAAM,SAAS,GAAiB;gBAC9B;oBACE,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,GAAG;oBACT,GAAG,EAAE,GAAG;oBACR,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;oBACX,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;iBACZ;gBACD;oBACE,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,GAAG;oBACT,GAAG,EAAE,GAAG;oBACR,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;oBACX,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;iBACZ;gBACD;oBACE,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,GAAG;oBACT,GAAG,EAAE,GAAG;oBACR,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;oBACX,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;iBACZ;aACF,CAAC;YAEF,MAAM,SAAS,GAAG,wBAAwB,CACxC,CAAC,SAAS,EAAE,SAAS,CAAC,EACtB,SAAS,CACV,CAAC;YAEF,qCAAqC;YACrC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;YAC7C,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;YAC7C,2BAA2B;YAC3B,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,+DAA+D;YAC/D,4EAA4E;YAC5E,MAAM,SAAS,GAAiB;gBAC9B;oBACE,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,GAAG;oBACT,GAAG,EAAE,GAAG;oBACR,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;oBACX,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;iBACZ;gBACD;oBACE,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,GAAG;oBACT,GAAG,EAAE,GAAG;oBACR,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;oBACX,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;iBACZ;gBACD;oBACE,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,GAAG;oBACT,GAAG,EAAE,GAAG;oBACR,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;oBACX,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;iBACZ;aACF,CAAC;YAEF,MAAM,SAAS,GAAG,wBAAwB,CACxC,CAAC,SAAS,EAAE,SAAS,CAAC,EACtB,SAAS,CACV,CAAC;YAEF,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;YAC7C,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC;YAC1C,qDAAqD;YACrD,MAAM,SAAS,GAAe;gBAC5B,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,GAAG,EAAE,MAAM,CAAC,GAAG;gBACf,KAAK,EAAE,MAAM,CAAC,IAAI,GAAG,GAAG;gBACxB,MAAM,EAAE,MAAM,CAAC,GAAG,GAAG,GAAG;gBACxB,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;aACZ,CAAC;YACF,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;YAC1D,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,SAAS,GAAiB;gBAC9B;oBACE,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,GAAG;oBACT,GAAG,EAAE,GAAG;oBACR,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;oBACX,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;iBACZ;gBACD;oBACE,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,GAAG;oBACT,GAAG,EAAE,GAAG;oBACR,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;oBACX,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;iBACZ;aACF,CAAC;YAEF,MAAM,SAAS,GAAG,wBAAwB,CAAC,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC;YAElE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;YAC7C,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC;YAC1C,yDAAyD;YACzD,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;YAC5D,+CAA+C;YAC/C,sDAAsD;YACtD,MAAM,SAAS,GAAiB;gBAC9B;oBACE,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC;oBACP,GAAG,EAAE,CAAC;oBACN,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;oBACX,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;iBACZ;gBACD;oBACE,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,CAAC;oBACP,GAAG,EAAE,GAAG;oBACR,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;oBACX,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;iBACZ;aACF,CAAC;YAEF,MAAM,SAAS,GAAG,wBAAwB,CAAC,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC;YAElE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;YAC7C,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACtC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,SAAS,GAAG,wBAAwB,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1D,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,MAAM,WAAW,GAAe;gBAC9B,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,GAAG;gBACT,GAAG,EAAE,GAAG;gBACR,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;gBACX,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;aACZ,CAAC;YAEF,MAAM,SAAS,GAAG,wBAAwB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;YACrE,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,WAAW,GAAe;gBAC9B,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,GAAG;gBACT,GAAG,EAAE,GAAG;gBACR,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;gBACX,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;aACZ,CAAC;YAEF,wDAAwD;YACxD,MAAM,SAAS,GAAiB,CAAC,WAAW,CAAC,CAAC;YAE9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5B,SAAS,CAAC,IAAI,CAAC;oBACb,IAAI,EAAE,OAAO,CAAC,EAAE;oBAChB,IAAI,EAAE,GAAG,GAAG,CAAC,GAAG,EAAE;oBAClB,GAAG,EAAE,GAAG,GAAG,CAAC,GAAG,EAAE;oBACjB,KAAK,EAAE,GAAG,GAAG,CAAC,GAAG,EAAE;oBACnB,MAAM,EAAE,GAAG,GAAG,CAAC,GAAG,EAAE;oBACpB,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;iBACZ,CAAC,CAAC;YACL,CAAC;YAED,kCAAkC;YAClC,MAAM,SAAS,GAAG,wBAAwB,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC;YAEjE,uCAAuC;YACvC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { expect } from '@open-wc/testing';\nimport {\n getNodeBounds,\n nodesOverlap,\n detectCollisions,\n calculateReflowPositions,\n NodeBounds\n} from '../src/flow/utils';\n\ndescribe('Collision Detection Utilities', () => {\n describe('getNodeBounds', () => {\n it('returns null when element not found', () => {\n const position = { left: 100, top: 200 };\n const bounds = getNodeBounds('nonexistent-uuid', position);\n expect(bounds).to.be.null;\n });\n\n it('calculates bounds correctly from element', () => {\n // Create a mock element\n const mockElement = document.createElement('div');\n mockElement.id = 'test-node';\n mockElement.style.width = '200px';\n mockElement.style.height = '150px';\n document.body.appendChild(mockElement);\n\n const position = { left: 100, top: 200 };\n const bounds = getNodeBounds('test-node', position, mockElement);\n\n expect(bounds).to.not.be.null;\n expect(bounds!.uuid).to.equal('test-node');\n expect(bounds!.left).to.equal(100);\n expect(bounds!.top).to.equal(200);\n expect(bounds!.right).to.equal(300); // left + width\n expect(bounds!.bottom).to.equal(350); // top + height\n expect(bounds!.width).to.equal(200);\n expect(bounds!.height).to.equal(150);\n\n document.body.removeChild(mockElement);\n });\n });\n\n describe('nodesOverlap', () => {\n it('detects overlapping nodes horizontally and vertically', () => {\n const bounds1: NodeBounds = {\n uuid: 'node1',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n };\n\n const bounds2: NodeBounds = {\n uuid: 'node2',\n left: 150,\n top: 150,\n right: 250,\n bottom: 250,\n width: 100,\n height: 100\n };\n\n expect(nodesOverlap(bounds1, bounds2)).to.be.true;\n });\n\n it('detects non-overlapping nodes to the right', () => {\n const bounds1: NodeBounds = {\n uuid: 'node1',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n };\n\n const bounds2: NodeBounds = {\n uuid: 'node2',\n left: 300,\n top: 100,\n right: 400,\n bottom: 200,\n width: 100,\n height: 100\n };\n\n expect(nodesOverlap(bounds1, bounds2)).to.be.false;\n });\n\n it('detects non-overlapping nodes below', () => {\n const bounds1: NodeBounds = {\n uuid: 'node1',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n };\n\n const bounds2: NodeBounds = {\n uuid: 'node2',\n left: 100,\n top: 300,\n right: 200,\n bottom: 400,\n width: 100,\n height: 100\n };\n\n expect(nodesOverlap(bounds1, bounds2)).to.be.false;\n });\n\n it('detects edge touching as overlapping (within buffer)', () => {\n const bounds1: NodeBounds = {\n uuid: 'node1',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n };\n\n const bounds2: NodeBounds = {\n uuid: 'node2',\n left: 200,\n top: 100,\n right: 300,\n bottom: 200,\n width: 100,\n height: 100\n };\n\n // edges touching should be considered overlapping due to buffer\n expect(nodesOverlap(bounds1, bounds2)).to.be.true;\n });\n\n it('detects partial vertical overlap', () => {\n const bounds1: NodeBounds = {\n uuid: 'node1',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n };\n\n const bounds2: NodeBounds = {\n uuid: 'node2',\n left: 150,\n top: 50,\n right: 250,\n bottom: 150,\n width: 100,\n height: 100\n };\n\n expect(nodesOverlap(bounds1, bounds2)).to.be.true;\n });\n });\n\n describe('detectCollisions', () => {\n it('returns empty array when no collisions', () => {\n const targetBounds: NodeBounds = {\n uuid: 'target',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n };\n\n const allBounds: NodeBounds[] = [\n {\n uuid: 'node1',\n left: 300,\n top: 100,\n right: 400,\n bottom: 200,\n width: 100,\n height: 100\n },\n {\n uuid: 'node2',\n left: 100,\n top: 300,\n right: 200,\n bottom: 400,\n width: 100,\n height: 100\n }\n ];\n\n const collisions = detectCollisions(targetBounds, allBounds);\n expect(collisions).to.have.length(0);\n });\n\n it('detects single collision', () => {\n const targetBounds: NodeBounds = {\n uuid: 'target',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n };\n\n const allBounds: NodeBounds[] = [\n {\n uuid: 'node1',\n left: 150,\n top: 150,\n right: 250,\n bottom: 250,\n width: 100,\n height: 100\n },\n {\n uuid: 'node2',\n left: 300,\n top: 300,\n right: 400,\n bottom: 400,\n width: 100,\n height: 100\n }\n ];\n\n const collisions = detectCollisions(targetBounds, allBounds);\n expect(collisions).to.have.length(1);\n expect(collisions[0].uuid).to.equal('node1');\n });\n\n it('detects multiple collisions', () => {\n const targetBounds: NodeBounds = {\n uuid: 'target',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n };\n\n const allBounds: NodeBounds[] = [\n {\n uuid: 'node1',\n left: 150,\n top: 150,\n right: 250,\n bottom: 250,\n width: 100,\n height: 100\n },\n {\n uuid: 'node2',\n left: 50,\n top: 50,\n right: 150,\n bottom: 150,\n width: 100,\n height: 100\n }\n ];\n\n const collisions = detectCollisions(targetBounds, allBounds);\n expect(collisions).to.have.length(2);\n });\n\n it('excludes target node from collisions', () => {\n const targetBounds: NodeBounds = {\n uuid: 'target',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n };\n\n const allBounds: NodeBounds[] = [\n targetBounds,\n {\n uuid: 'node1',\n left: 150,\n top: 150,\n right: 250,\n bottom: 250,\n width: 100,\n height: 100\n }\n ];\n\n const collisions = detectCollisions(targetBounds, allBounds);\n expect(collisions).to.have.length(1);\n expect(collisions[0].uuid).to.equal('node1');\n });\n });\n\n describe('calculateReflowPositions', () => {\n it('returns empty map when no collisions', () => {\n const allBounds: NodeBounds[] = [\n {\n uuid: 'moved',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n },\n {\n uuid: 'node1',\n left: 300,\n top: 100,\n right: 400,\n bottom: 200,\n width: 100,\n height: 100\n }\n ];\n\n const positions = calculateReflowPositions(['moved'], allBounds);\n expect(positions.size).to.equal(0);\n });\n\n it('moves colliding node out of the way', () => {\n const allBounds: NodeBounds[] = [\n {\n uuid: 'moved',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n },\n {\n uuid: 'node1',\n left: 100,\n top: 150,\n right: 200,\n bottom: 250,\n width: 100,\n height: 100\n }\n ];\n\n const positions = calculateReflowPositions(['moved'], allBounds);\n\n expect(positions.size).to.equal(1);\n expect(positions.has('node1')).to.be.true;\n expect(positions.has('moved')).to.be.false;\n });\n\n it('sacred node never appears in returned positions', () => {\n const allBounds: NodeBounds[] = [\n {\n uuid: 'dropped',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n },\n {\n uuid: 'existing',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n }\n ];\n\n const positions = calculateReflowPositions(['dropped'], allBounds);\n\n expect(positions.has('dropped')).to.be.false;\n expect(positions.has('existing')).to.be.true;\n });\n\n it('prefers least-displacement direction', () => {\n // Sacred at (100,100)-(200,200), collider at (180,100)-(280,200)\n // Right requires only 60px displacement, down requires 140px\n const allBounds: NodeBounds[] = [\n {\n uuid: 'sacred',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n },\n {\n uuid: 'collider',\n left: 180,\n top: 100,\n right: 280,\n bottom: 200,\n width: 100,\n height: 100\n }\n ];\n\n const positions = calculateReflowPositions(['sacred'], allBounds);\n\n expect(positions.has('collider')).to.be.true;\n const newPos = positions.get('collider')!;\n // Should move right (shorter) rather than down (longer)\n expect(newPos.left).to.be.greaterThan(200);\n expect(newPos.top).to.equal(100); // vertical position unchanged\n });\n\n it('prefers up when it is the shortest move', () => {\n // Sacred at (100,200)-(200,300), collider at (100,180)-(200,280)\n // Up: newTop=snapToGrid(200-100-30)=snapToGrid(70)=80, distance=100\n // Down: newTop=snapToGrid(300+30)=340, distance=160\n // Right: newLeft=snapToGrid(200+30)=240, distance=140\n const allBounds: NodeBounds[] = [\n {\n uuid: 'sacred',\n left: 100,\n top: 200,\n right: 200,\n bottom: 300,\n width: 100,\n height: 100\n },\n {\n uuid: 'collider',\n left: 100,\n top: 180,\n right: 200,\n bottom: 280,\n width: 100,\n height: 100\n }\n ];\n\n const positions = calculateReflowPositions(['sacred'], allBounds);\n\n expect(positions.has('collider')).to.be.true;\n const newPos = positions.get('collider')!;\n // Should move up (shortest displacement)\n expect(newPos.top).to.be.lessThan(200);\n expect(newPos.left).to.equal(100); // horizontal position unchanged\n });\n\n it('prefers direction with fewer cascading collisions', () => {\n // Sacred at (100,100)-(200,200), collider at (100,150)-(200,250)\n // A node sits below at (100,280)-(200,380) blocking the downward path\n // Down causes cascade, right does not\n const allBounds: NodeBounds[] = [\n {\n uuid: 'sacred',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n },\n {\n uuid: 'collider',\n left: 100,\n top: 150,\n right: 200,\n bottom: 250,\n width: 100,\n height: 100\n },\n {\n uuid: 'blocker',\n left: 100,\n top: 280,\n right: 200,\n bottom: 380,\n width: 100,\n height: 100\n }\n ];\n\n const positions = calculateReflowPositions(['sacred'], allBounds);\n\n expect(positions.has('collider')).to.be.true;\n // Should avoid moving down (would cascade into blocker)\n // blocker should not need to move\n expect(positions.has('blocker')).to.be.false;\n });\n\n it('resolves cascading collisions', () => {\n const allBounds: NodeBounds[] = [\n {\n uuid: 'moved',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n },\n {\n uuid: 'node1',\n left: 100,\n top: 150,\n right: 200,\n bottom: 250,\n width: 100,\n height: 100\n },\n {\n uuid: 'node2',\n left: 100,\n top: 200,\n right: 200,\n bottom: 300,\n width: 100,\n height: 100\n }\n ];\n\n const positions = calculateReflowPositions(['moved'], allBounds);\n\n // At least one node should be repositioned\n expect(positions.size).to.be.greaterThan(0);\n\n // No node should overlap with the sacred node or each other after reflow\n // (verified by the algorithm's correctness guarantee)\n });\n\n it('handles multiple sacred nodes', () => {\n // Two sacred nodes with a non-sacred node overlapping one\n const allBounds: NodeBounds[] = [\n {\n uuid: 'sacred1',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n },\n {\n uuid: 'sacred2',\n left: 100,\n top: 400,\n right: 200,\n bottom: 500,\n width: 100,\n height: 100\n },\n {\n uuid: 'collider',\n left: 100,\n top: 150,\n right: 200,\n bottom: 250,\n width: 100,\n height: 100\n }\n ];\n\n const positions = calculateReflowPositions(\n ['sacred1', 'sacred2'],\n allBounds\n );\n\n // Sacred nodes should never be moved\n expect(positions.has('sacred1')).to.be.false;\n expect(positions.has('sacred2')).to.be.false;\n // Collider should be moved\n expect(positions.has('collider')).to.be.true;\n });\n\n it('does not move a node into another sacred node', () => {\n // Two sacred nodes close together with a collider between them\n // Moving right would overlap sacred2, so it should choose another direction\n const allBounds: NodeBounds[] = [\n {\n uuid: 'sacred1',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n },\n {\n uuid: 'sacred2',\n left: 240,\n top: 100,\n right: 340,\n bottom: 200,\n width: 100,\n height: 100\n },\n {\n uuid: 'collider',\n left: 150,\n top: 100,\n right: 250,\n bottom: 200,\n width: 100,\n height: 100\n }\n ];\n\n const positions = calculateReflowPositions(\n ['sacred1', 'sacred2'],\n allBounds\n );\n\n expect(positions.has('collider')).to.be.true;\n const newPos = positions.get('collider')!;\n // Should not overlap either sacred node after reflow\n const newBounds: NodeBounds = {\n uuid: 'collider',\n left: newPos.left,\n top: newPos.top,\n right: newPos.left + 100,\n bottom: newPos.top + 100,\n width: 100,\n height: 100\n };\n expect(nodesOverlap(newBounds, allBounds[0])).to.be.false;\n expect(nodesOverlap(newBounds, allBounds[1])).to.be.false;\n });\n\n it('snaps reflow positions to grid', () => {\n const allBounds: NodeBounds[] = [\n {\n uuid: 'sacred',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n },\n {\n uuid: 'collider',\n left: 100,\n top: 150,\n right: 200,\n bottom: 250,\n width: 100,\n height: 100\n }\n ];\n\n const positions = calculateReflowPositions(['sacred'], allBounds);\n\n expect(positions.has('collider')).to.be.true;\n const newPos = positions.get('collider')!;\n // Both coordinates should be multiples of 20 (grid size)\n expect(newPos.left % 20).to.equal(0);\n expect(newPos.top % 20).to.equal(0);\n });\n\n it('clamps positions to zero (no negative coordinates)', () => {\n // Sacred node near top-left, collider above it\n // Moving up would go negative, so it should fall back\n const allBounds: NodeBounds[] = [\n {\n uuid: 'sacred',\n left: 0,\n top: 0,\n right: 200,\n bottom: 200,\n width: 200,\n height: 200\n },\n {\n uuid: 'collider',\n left: 0,\n top: 100,\n right: 200,\n bottom: 200,\n width: 200,\n height: 100\n }\n ];\n\n const positions = calculateReflowPositions(['sacred'], allBounds);\n\n expect(positions.has('collider')).to.be.true;\n const newPos = positions.get('collider')!;\n expect(newPos.left).to.be.at.least(0);\n expect(newPos.top).to.be.at.least(0);\n });\n });\n\n describe('edge cases', () => {\n it('handles empty allBounds array', () => {\n const positions = calculateReflowPositions(['moved'], []);\n expect(positions.size).to.equal(0);\n });\n\n it('handles single node (no other nodes to collide with)', () => {\n const movedBounds: NodeBounds = {\n uuid: 'moved',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n };\n\n const positions = calculateReflowPositions(['moved'], [movedBounds]);\n expect(positions.size).to.equal(0);\n });\n\n it('prevents infinite loops with complex collisions', () => {\n const movedBounds: NodeBounds = {\n uuid: 'moved',\n left: 100,\n top: 100,\n right: 200,\n bottom: 200,\n width: 100,\n height: 100\n };\n\n // Create a complex scenario with many overlapping nodes\n const allBounds: NodeBounds[] = [movedBounds];\n\n for (let i = 0; i < 20; i++) {\n allBounds.push({\n uuid: `node${i}`,\n left: 100 + i * 10,\n top: 100 + i * 10,\n right: 200 + i * 10,\n bottom: 200 + i * 10,\n width: 100,\n height: 100\n });\n }\n\n // Should complete without hanging\n const positions = calculateReflowPositions(['moved'], allBounds);\n\n // Should have resolved some collisions\n expect(positions.size).to.be.greaterThan(0);\n });\n });\n});\n"]}
@@ -24,8 +24,6 @@ describe('Editor', () => {
24
24
  expect(styles.cssText).to.contain('#editor');
25
25
  expect(styles.cssText).to.contain('#grid');
26
26
  expect(styles.cssText).to.contain('#canvas');
27
- expect(styles.cssText).to.contain('.plumb-source');
28
- expect(styles.cssText).to.contain('.plumb-target');
29
27
  expect(styles.cssText).to.contain('.plumb-connector');
30
28
  });
31
29
  it('creates with default properties', () => {
@@ -1 +1 @@
1
- {"version":3,"file":"temba-flow-editor.test.js","sourceRoot":"","sources":["../../test/temba-flow-editor.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, fixture, expect } from '@open-wc/testing';\nimport { Editor } from '../src/flow/Editor';\nimport { Plumber } from '../src/flow/Plumber';\nimport { stub, restore } from 'sinon';\n\n// Register the component\ncustomElements.define('temba-flow-editor', Editor);\n\ndescribe('Editor', () => {\n let editor: Editor;\n\n beforeEach(() => {\n // Reset any stubs\n restore();\n });\n\n afterEach(() => {\n restore();\n });\n\n describe('basic functionality', () => {\n it('creates render root as element itself', () => {\n const editor = new Editor();\n expect(editor.createRenderRoot()).to.equal(editor);\n });\n\n it('has correct CSS styles defined', () => {\n const styles = Editor.styles;\n expect(styles).to.exist;\n expect(styles.cssText).to.contain('#editor');\n expect(styles.cssText).to.contain('#grid');\n expect(styles.cssText).to.contain('#canvas');\n expect(styles.cssText).to.contain('.plumb-source');\n expect(styles.cssText).to.contain('.plumb-target');\n expect(styles.cssText).to.contain('.plumb-connector');\n });\n\n it('creates with default properties', () => {\n editor = new Editor();\n expect(editor.flow).to.be.undefined;\n expect(editor.version).to.be.undefined;\n });\n\n it('accepts flow and version properties without getStore call', async () => {\n editor = document.createElement('temba-flow-editor') as Editor;\n editor.flow = 'test-flow-uuid';\n editor.version = '1.0';\n\n expect(editor.flow).to.equal('test-flow-uuid');\n expect(editor.version).to.equal('1.0');\n });\n });\n\n describe('lifecycle methods', () => {\n it('calls firstUpdated and initializes plumber', async () => {\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"canvas\"></div>\n </temba-flow-editor>\n `);\n\n // Verify that plumber is initialized\n expect((editor as any).plumber).to.be.instanceOf(Plumber);\n });\n\n it('verifies firstUpdated method exists and can be called', () => {\n editor = new Editor();\n\n // Mock canvas element\n const mockCanvas = document.createElement('div');\n mockCanvas.id = 'canvas';\n\n // Mock querySelector to return our mock canvas\n stub(editor, 'querySelector').returns(mockCanvas);\n\n // Verify firstUpdated method exists\n expect(typeof (editor as any).firstUpdated).to.equal('function');\n\n // Test that calling firstUpdated doesn't throw (without getStore)\n expect(() => {\n // Only test the plumber initialization part\n (editor as any).plumber = new Plumber(mockCanvas, editor);\n }).to.not.throw();\n });\n\n it('handles updated with canvasSize changes', async () => {\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"canvas\"></div>\n </temba-flow-editor>\n `);\n\n // Simulate canvasSize change\n (editor as any).canvasSize = { width: 800, height: 600 };\n const changes = new Map();\n changes.set('canvasSize', true);\n\n (editor as any).updated(changes);\n\n // Verify the canvasSize was set correctly\n expect((editor as any).canvasSize).to.deep.equal({\n width: 800,\n height: 600\n });\n });\n\n it('handles updated without canvasSize changes', async () => {\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"canvas\"></div>\n </temba-flow-editor>\n `);\n\n const consoleStub = stub(console, 'log');\n\n const changes = new Map();\n changes.set('other', true);\n\n (editor as any).updated(changes);\n\n expect(consoleStub).to.not.have.been.called;\n\n consoleStub.restore();\n });\n });\n\n describe('render method', () => {\n it('renders loading when no definition', async () => {\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"canvas\"></div>\n </temba-flow-editor>\n `);\n\n // Set canvas size to avoid undefined errors\n (editor as any).canvasSize = { width: 800, height: 600 };\n await editor.updateComplete;\n\n const loadingElement = editor.querySelector('temba-loading');\n expect(loadingElement).to.exist;\n });\n\n it('renders nodes when definition exists', async () => {\n const mockDefinition = {\n nodes: [\n {\n uuid: 'node-1',\n actions: [],\n exits: []\n },\n {\n uuid: 'node-2',\n actions: [],\n exits: []\n }\n ],\n _ui: {\n nodes: {\n 'node-1': { position: { left: 100, top: 200 } },\n 'node-2': { position: { left: 300, top: 400 } }\n }\n }\n };\n\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"canvas\"></div>\n </temba-flow-editor>\n `);\n\n // Set properties\n (editor as any).definition = mockDefinition;\n (editor as any).canvasSize = { width: 800, height: 600 };\n await editor.updateComplete;\n\n const flowNodes = editor.querySelectorAll('temba-flow-node');\n expect(flowNodes).to.have.length(2);\n });\n\n it('includes style elements in light DOM', async () => {\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"canvas\"></div>\n </temba-flow-editor>\n `);\n\n // Set canvas size\n (editor as any).canvasSize = { width: 800, height: 600 };\n await editor.updateComplete;\n\n const styleElements = editor.querySelectorAll('style');\n expect(styleElements.length).to.be.greaterThan(0);\n });\n\n it('renders with correct grid dimensions', async () => {\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"canvas\"></div>\n </temba-flow-editor>\n `);\n\n (editor as any).canvasSize = { width: 1200, height: 800 };\n await editor.updateComplete;\n\n const gridElement = editor.querySelector('#grid');\n expect(gridElement).to.exist;\n\n const style = gridElement?.getAttribute('style');\n expect(style).to.contain('width:1200px');\n expect(style).to.contain('height:800px');\n });\n\n it('renders editor structure', async () => {\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"canvas\"></div>\n </temba-flow-editor>\n `);\n\n (editor as any).canvasSize = { width: 800, height: 600 };\n await editor.updateComplete;\n\n const editorElement = editor.querySelector('#editor');\n expect(editorElement).to.exist;\n\n const gridElement = editor.querySelector('#grid');\n expect(gridElement).to.exist;\n\n const canvasElement = editor.querySelector('#canvas');\n expect(canvasElement).to.exist;\n });\n });\n\n describe('property handling', () => {\n it('handles flow property change', async () => {\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"canvas\"></div>\n </temba-flow-editor>\n `);\n\n // Change flow property\n editor.flow = 'new-flow-uuid';\n await editor.updateComplete;\n\n expect(editor.flow).to.equal('new-flow-uuid');\n });\n\n it('handles version property change', async () => {\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"canvas\"></div>\n </temba-flow-editor>\n `);\n\n editor.version = '2.0';\n await editor.updateComplete;\n\n expect(editor.version).to.equal('2.0');\n });\n });\n\n describe('store integration', () => {\n it('has fromStore decorators for definition and canvasSize', () => {\n editor = new Editor();\n\n // Check that the properties exist (they are private but we can verify they exist)\n expect(editor).to.have.property('definition');\n expect(editor).to.have.property('canvasSize');\n });\n });\n\n describe('constructor behavior', () => {\n it('calls super in constructor', () => {\n // This mainly verifies the constructor doesn't throw\n expect(() => {\n new Editor();\n }).to.not.throw();\n });\n });\n\n describe('multi-selection functionality', () => {\n let mockDefinition: any;\n\n beforeEach(() => {\n mockDefinition = {\n nodes: [\n {\n uuid: 'node-1',\n actions: [],\n exits: []\n },\n {\n uuid: 'node-2',\n actions: [],\n exits: []\n }\n ],\n _ui: {\n nodes: {\n 'node-1': { position: { left: 100, top: 200 } },\n 'node-2': { position: { left: 300, top: 400 } }\n },\n stickies: {\n 'sticky-1': {\n position: { left: 200, top: 100 },\n title: 'Test Sticky',\n body: 'Test content',\n color: 'yellow'\n }\n }\n }\n };\n });\n\n it('initializes with empty selection', async () => {\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"canvas\"></div>\n </temba-flow-editor>\n `);\n\n expect((editor as any).selectedItems.size).to.equal(0);\n expect((editor as any).isSelecting).to.be.false;\n expect((editor as any).selectionBox).to.be.null;\n });\n\n it('adds visual selection styling to selected items', async () => {\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"canvas\"></div>\n </temba-flow-editor>\n `);\n\n // Set up mock definition and selection\n (editor as any).definition = mockDefinition;\n (editor as any).canvasSize = { width: 800, height: 600 };\n (editor as any).selectedItems = new Set(['node-1']);\n await editor.updateComplete;\n\n const selectedNode = editor.querySelector(\n 'temba-flow-node[uuid=\"node-1\"]'\n );\n expect(selectedNode).to.exist;\n expect(selectedNode.classList.contains('selected')).to.be.true;\n });\n\n it('renders selection box when selecting', async () => {\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"canvas\"></div>\n </temba-flow-editor>\n `);\n\n // Set up selection state\n (editor as any).definition = mockDefinition;\n (editor as any).canvasSize = { width: 800, height: 600 };\n (editor as any).isSelecting = true;\n (editor as any).selectionBox = {\n startX: 50,\n startY: 50,\n endX: 150,\n endY: 150\n };\n await editor.updateComplete;\n\n const selectionBox = editor.querySelector('.selection-box');\n expect(selectionBox).to.exist;\n\n const style = selectionBox.getAttribute('style');\n expect(style).to.contain('left: 50px');\n expect(style).to.contain('top: 50px');\n expect(style).to.contain('width: 100px');\n expect(style).to.contain('height: 100px');\n });\n\n it('handles escape key to clear selection', async () => {\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"canvas\"></div>\n </temba-flow-editor>\n `);\n\n // Set up selection\n (editor as any).selectedItems.add('node-1');\n (editor as any).selectedItems.add('node-2');\n\n const mockEvent = new KeyboardEvent('keydown', { key: 'Escape' });\n (editor as any).handleKeyDown(mockEvent);\n\n expect((editor as any).selectedItems.size).to.equal(0);\n });\n });\n\n describe('canvas initialization', () => {\n it('initializes plumber with canvas element', async () => {\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"canvas\"></div>\n </temba-flow-editor>\n `);\n\n const plumber = (editor as any).plumber;\n expect(plumber).to.be.instanceOf(Plumber);\n });\n\n it('handles missing canvas element gracefully', async () => {\n editor = await fixture(html`<temba-flow-editor></temba-flow-editor>`);\n\n // Should not throw even without canvas\n expect((editor as any).plumber).to.be.instanceOf(Plumber);\n });\n });\n\n describe('canvas menu functionality', () => {\n afterEach(() => {\n restore();\n });\n\n it('has context menu handler set up', async () => {\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"grid\">\n <div\n id=\"canvas\"\n style=\"position: relative; width: 800px; height: 600px;\"\n ></div>\n </div>\n </temba-flow-editor>\n `);\n\n // Set up required properties\n (editor as any).canvasSize = { width: 800, height: 600 };\n await editor.updateComplete;\n\n const canvas = editor.querySelector('#canvas') as HTMLElement;\n expect(canvas).to.exist;\n\n // Check that the context menu event listener is set up\n expect((editor as any).boundCanvasContextMenu).to.exist;\n expect(typeof (editor as any).boundCanvasContextMenu).to.equal(\n 'function'\n );\n\n // Test the snapToGrid functionality that would be used\n const snapToGrid = (value: number): number => {\n const snapped = Math.round(value / 20) * 20;\n return Math.max(snapped, 0);\n };\n\n // Test various snap positions\n expect(snapToGrid(245)).to.equal(240);\n expect(snapToGrid(255)).to.equal(260);\n expect(snapToGrid(150)).to.equal(160);\n expect(snapToGrid(-10)).to.equal(0); // Should not go negative\n });\n\n it('tests context menu handler logic independently', () => {\n // Test the logic that would be in handleCanvasContextMenu\n\n // Mock event with canvas target\n const canvasTarget = { id: 'canvas' };\n const validEvent = { target: canvasTarget };\n\n // Mock event with non-canvas target\n const nonCanvasTarget = { id: 'other-element' };\n const invalidEvent = { target: nonCanvasTarget };\n\n // Test the early return condition\n const shouldReturnEarly = (event: any) => {\n const target = event.target as HTMLElement;\n return target.id !== 'canvas';\n };\n\n expect(shouldReturnEarly(validEvent)).to.be.false;\n expect(shouldReturnEarly(invalidEvent)).to.be.true;\n });\n\n it('tests position calculation logic', () => {\n // Mock canvas getBoundingClientRect\n const mockCanvas = {\n getBoundingClientRect: () => ({\n left: 50,\n top: 100,\n right: 850,\n bottom: 700,\n width: 800,\n height: 600\n })\n };\n\n // Mock event\n const mockEvent = {\n clientX: 300,\n clientY: 250\n };\n\n // Calculate relative position (this is what handleCanvasDoubleClick does)\n const canvasRect = mockCanvas.getBoundingClientRect();\n const relativeX = mockEvent.clientX - canvasRect.left; // 300 - 50 = 250\n const relativeY = mockEvent.clientY - canvasRect.top; // 250 - 100 = 150\n\n // Apply snap to grid\n const snapToGrid = (value: number) =>\n Math.max(Math.round(value / 20) * 20, 0);\n const snappedLeft = snapToGrid(relativeX); // 250 -> 260\n const snappedTop = snapToGrid(relativeY); // 150 -> 160\n\n // Verify calculations\n expect(relativeX).to.equal(250);\n expect(relativeY).to.equal(150);\n expect(snappedLeft).to.equal(260);\n expect(snappedTop).to.equal(160);\n\n // This position would be passed to createStickyNote\n const expectedPosition = {\n left: snappedLeft,\n top: snappedTop\n };\n\n expect(expectedPosition).to.deep.equal({ left: 260, top: 160 });\n });\n });\n\n describe('flow-start indicator', () => {\n it('should mark the first node as flow-start', async () => {\n const { zustand } = await import('../src/store/AppState');\n\n // create a flow definition with multiple nodes\n const mockFlowDefinition = {\n language: 'en',\n localization: {},\n name: 'Test Flow',\n nodes: [\n {\n uuid: 'node-1',\n actions: [\n { type: 'send_msg', uuid: 'action-1', text: 'Message 1' }\n ],\n exits: [{ uuid: 'exit-1', destination_uuid: null }]\n },\n {\n uuid: 'node-2',\n actions: [\n { type: 'send_msg', uuid: 'action-2', text: 'Message 2' }\n ],\n exits: [{ uuid: 'exit-2', destination_uuid: null }]\n },\n {\n uuid: 'node-3',\n actions: [\n { type: 'send_msg', uuid: 'action-3', text: 'Message 3' }\n ],\n exits: [{ uuid: 'exit-3', destination_uuid: null }]\n }\n ],\n uuid: 'test-uuid',\n type: 'messaging' as const,\n revision: 1,\n spec_version: '14.3',\n _ui: {\n nodes: {\n 'node-1': { position: { left: 100, top: 100 }, type: 'send_msg' },\n 'node-2': { position: { left: 200, top: 200 }, type: 'send_msg' },\n 'node-3': { position: { left: 300, top: 300 }, type: 'send_msg' }\n },\n languages: []\n }\n };\n\n zustand.getState().setFlowContents({\n definition: mockFlowDefinition as any,\n info: {\n results: [],\n dependencies: [],\n counts: { nodes: 3, languages: 1 },\n locals: []\n }\n });\n\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"canvas\"></div>\n </temba-flow-editor>\n `);\n\n await editor.updateComplete;\n\n // get all flow nodes\n const flowNodes = editor.querySelectorAll('temba-flow-node');\n expect(flowNodes.length).to.equal(3);\n\n // first node should have flow-start class\n expect(flowNodes[0].classList.contains('flow-start')).to.be.true;\n\n // other nodes should not have flow-start class\n expect(flowNodes[1].classList.contains('flow-start')).to.be.false;\n expect(flowNodes[2].classList.contains('flow-start')).to.be.false;\n });\n\n it('should update flow-start when node positions change', async () => {\n const { zustand } = await import('../src/store/AppState');\n\n // create a flow with nodes in a specific order\n const mockFlowDefinition = {\n language: 'en',\n localization: {},\n name: 'Test Flow',\n nodes: [\n {\n uuid: 'node-1',\n actions: [\n { type: 'send_msg', uuid: 'action-1', text: 'Message 1' }\n ],\n exits: [{ uuid: 'exit-1', destination_uuid: null }]\n },\n {\n uuid: 'node-2',\n actions: [\n { type: 'send_msg', uuid: 'action-2', text: 'Message 2' }\n ],\n exits: [{ uuid: 'exit-2', destination_uuid: null }]\n }\n ],\n uuid: 'test-uuid',\n type: 'messaging' as const,\n revision: 1,\n spec_version: '14.3',\n _ui: {\n nodes: {\n 'node-1': { position: { left: 100, top: 200 }, type: 'send_msg' },\n 'node-2': { position: { left: 100, top: 100 }, type: 'send_msg' }\n },\n languages: []\n }\n };\n\n zustand.getState().setFlowContents({\n definition: mockFlowDefinition as any,\n info: {\n results: [],\n dependencies: [],\n counts: { nodes: 2, languages: 1 },\n locals: []\n }\n });\n\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"canvas\"></div>\n </temba-flow-editor>\n `);\n\n await editor.updateComplete;\n\n // node-2 is at top (top: 100 < top: 200) so it should be flow-start\n const node1 = editor.querySelector('temba-flow-node[uuid=\"node-1\"]');\n const node2 = editor.querySelector('temba-flow-node[uuid=\"node-2\"]');\n\n expect(node2).to.exist;\n expect(node1).to.exist;\n expect(node2.classList.contains('flow-start')).to.be.true;\n expect(node1.classList.contains('flow-start')).to.be.false;\n\n // move node-1 to the top\n zustand.getState().updateCanvasPositions({\n 'node-1': { left: 100, top: 50 }\n });\n\n await editor.updateComplete;\n\n // now node-1 should be first\n const updatedFlowNodes = editor.querySelectorAll('temba-flow-node');\n expect(updatedFlowNodes[0].getAttribute('uuid')).to.equal('node-1');\n expect(updatedFlowNodes[0].classList.contains('flow-start')).to.be.true;\n expect(updatedFlowNodes[1].classList.contains('flow-start')).to.be.false;\n });\n\n it('should maintain flow-start when nodes are added', async () => {\n const { zustand } = await import('../src/store/AppState');\n\n // start with one node\n const mockFlowDefinition = {\n language: 'en',\n localization: {},\n name: 'Test Flow',\n nodes: [\n {\n uuid: 'node-1',\n actions: [\n { type: 'send_msg', uuid: 'action-1', text: 'Message 1' }\n ],\n exits: [{ uuid: 'exit-1', destination_uuid: null }]\n }\n ],\n uuid: 'test-uuid',\n type: 'messaging' as const,\n revision: 1,\n spec_version: '14.3',\n _ui: {\n nodes: {\n 'node-1': { position: { left: 100, top: 200 }, type: 'send_msg' }\n },\n languages: []\n }\n };\n\n zustand.getState().setFlowContents({\n definition: mockFlowDefinition as any,\n info: {\n results: [],\n dependencies: [],\n counts: { nodes: 1, languages: 1 },\n locals: []\n }\n });\n\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"canvas\"></div>\n </temba-flow-editor>\n `);\n\n await editor.updateComplete;\n\n const flowNodes = editor.querySelectorAll('temba-flow-node');\n expect(flowNodes[0].classList.contains('flow-start')).to.be.true;\n\n // add a new node at the top\n const newNode = {\n uuid: 'node-2',\n actions: [\n { type: 'send_msg' as const, uuid: 'action-2', text: 'Message 2' }\n ],\n exits: [{ uuid: 'exit-2', destination_uuid: null }]\n };\n const newNodeUI = {\n position: { left: 100, top: 100 },\n type: 'send_msg' as const\n };\n\n zustand.getState().addNode(newNode, newNodeUI);\n\n await editor.updateComplete;\n\n // new node should now be the flow-start\n const node1 = editor.querySelector('temba-flow-node[uuid=\"node-1\"]');\n const node2 = editor.querySelector('temba-flow-node[uuid=\"node-2\"]');\n\n expect(node2).to.exist;\n expect(node1).to.exist;\n expect(node2.classList.contains('flow-start')).to.be.true;\n expect(node1.classList.contains('flow-start')).to.be.false;\n });\n\n it('should handle flow-start when first node is removed', async () => {\n const { zustand } = await import('../src/store/AppState');\n\n // create flow with multiple nodes\n const mockFlowDefinition = {\n language: 'en',\n localization: {},\n name: 'Test Flow',\n nodes: [\n {\n uuid: 'node-1',\n actions: [\n { type: 'send_msg', uuid: 'action-1', text: 'Message 1' }\n ],\n exits: [{ uuid: 'exit-1', destination_uuid: null }]\n },\n {\n uuid: 'node-2',\n actions: [\n { type: 'send_msg', uuid: 'action-2', text: 'Message 2' }\n ],\n exits: [{ uuid: 'exit-2', destination_uuid: null }]\n }\n ],\n uuid: 'test-uuid',\n type: 'messaging' as const,\n revision: 1,\n spec_version: '14.3',\n _ui: {\n nodes: {\n 'node-1': { position: { left: 100, top: 100 }, type: 'send_msg' },\n 'node-2': { position: { left: 100, top: 200 }, type: 'send_msg' }\n },\n languages: []\n }\n };\n\n zustand.getState().setFlowContents({\n definition: mockFlowDefinition as any,\n info: {\n results: [],\n dependencies: [],\n counts: { nodes: 2, languages: 1 },\n locals: []\n }\n });\n\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"canvas\"></div>\n </temba-flow-editor>\n `);\n\n await editor.updateComplete;\n\n let flowNodes = editor.querySelectorAll('temba-flow-node');\n expect(flowNodes[0].getAttribute('uuid')).to.equal('node-1');\n expect(flowNodes[0].classList.contains('flow-start')).to.be.true;\n\n // remove the first node\n zustand.getState().removeNodes(['node-1']);\n\n await editor.updateComplete;\n\n // node-2 should now be the flow-start\n flowNodes = editor.querySelectorAll('temba-flow-node');\n expect(flowNodes.length).to.equal(1);\n expect(flowNodes[0].getAttribute('uuid')).to.equal('node-2');\n expect(flowNodes[0].classList.contains('flow-start')).to.be.true;\n });\n });\n});\n"]}
1
+ {"version":3,"file":"temba-flow-editor.test.js","sourceRoot":"","sources":["../../test/temba-flow-editor.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, fixture, expect } from '@open-wc/testing';\nimport { Editor } from '../src/flow/Editor';\nimport { Plumber } from '../src/flow/Plumber';\nimport { stub, restore } from 'sinon';\n\n// Register the component\ncustomElements.define('temba-flow-editor', Editor);\n\ndescribe('Editor', () => {\n let editor: Editor;\n\n beforeEach(() => {\n // Reset any stubs\n restore();\n });\n\n afterEach(() => {\n restore();\n });\n\n describe('basic functionality', () => {\n it('creates render root as element itself', () => {\n const editor = new Editor();\n expect(editor.createRenderRoot()).to.equal(editor);\n });\n\n it('has correct CSS styles defined', () => {\n const styles = Editor.styles;\n expect(styles).to.exist;\n expect(styles.cssText).to.contain('#editor');\n expect(styles.cssText).to.contain('#grid');\n expect(styles.cssText).to.contain('#canvas');\n expect(styles.cssText).to.contain('.plumb-connector');\n });\n\n it('creates with default properties', () => {\n editor = new Editor();\n expect(editor.flow).to.be.undefined;\n expect(editor.version).to.be.undefined;\n });\n\n it('accepts flow and version properties without getStore call', async () => {\n editor = document.createElement('temba-flow-editor') as Editor;\n editor.flow = 'test-flow-uuid';\n editor.version = '1.0';\n\n expect(editor.flow).to.equal('test-flow-uuid');\n expect(editor.version).to.equal('1.0');\n });\n });\n\n describe('lifecycle methods', () => {\n it('calls firstUpdated and initializes plumber', async () => {\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"canvas\"></div>\n </temba-flow-editor>\n `);\n\n // Verify that plumber is initialized\n expect((editor as any).plumber).to.be.instanceOf(Plumber);\n });\n\n it('verifies firstUpdated method exists and can be called', () => {\n editor = new Editor();\n\n // Mock canvas element\n const mockCanvas = document.createElement('div');\n mockCanvas.id = 'canvas';\n\n // Mock querySelector to return our mock canvas\n stub(editor, 'querySelector').returns(mockCanvas);\n\n // Verify firstUpdated method exists\n expect(typeof (editor as any).firstUpdated).to.equal('function');\n\n // Test that calling firstUpdated doesn't throw (without getStore)\n expect(() => {\n // Only test the plumber initialization part\n (editor as any).plumber = new Plumber(mockCanvas, editor);\n }).to.not.throw();\n });\n\n it('handles updated with canvasSize changes', async () => {\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"canvas\"></div>\n </temba-flow-editor>\n `);\n\n // Simulate canvasSize change\n (editor as any).canvasSize = { width: 800, height: 600 };\n const changes = new Map();\n changes.set('canvasSize', true);\n\n (editor as any).updated(changes);\n\n // Verify the canvasSize was set correctly\n expect((editor as any).canvasSize).to.deep.equal({\n width: 800,\n height: 600\n });\n });\n\n it('handles updated without canvasSize changes', async () => {\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"canvas\"></div>\n </temba-flow-editor>\n `);\n\n const consoleStub = stub(console, 'log');\n\n const changes = new Map();\n changes.set('other', true);\n\n (editor as any).updated(changes);\n\n expect(consoleStub).to.not.have.been.called;\n\n consoleStub.restore();\n });\n });\n\n describe('render method', () => {\n it('renders loading when no definition', async () => {\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"canvas\"></div>\n </temba-flow-editor>\n `);\n\n // Set canvas size to avoid undefined errors\n (editor as any).canvasSize = { width: 800, height: 600 };\n await editor.updateComplete;\n\n const loadingElement = editor.querySelector('temba-loading');\n expect(loadingElement).to.exist;\n });\n\n it('renders nodes when definition exists', async () => {\n const mockDefinition = {\n nodes: [\n {\n uuid: 'node-1',\n actions: [],\n exits: []\n },\n {\n uuid: 'node-2',\n actions: [],\n exits: []\n }\n ],\n _ui: {\n nodes: {\n 'node-1': { position: { left: 100, top: 200 } },\n 'node-2': { position: { left: 300, top: 400 } }\n }\n }\n };\n\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"canvas\"></div>\n </temba-flow-editor>\n `);\n\n // Set properties\n (editor as any).definition = mockDefinition;\n (editor as any).canvasSize = { width: 800, height: 600 };\n await editor.updateComplete;\n\n const flowNodes = editor.querySelectorAll('temba-flow-node');\n expect(flowNodes).to.have.length(2);\n });\n\n it('includes style elements in light DOM', async () => {\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"canvas\"></div>\n </temba-flow-editor>\n `);\n\n // Set canvas size\n (editor as any).canvasSize = { width: 800, height: 600 };\n await editor.updateComplete;\n\n const styleElements = editor.querySelectorAll('style');\n expect(styleElements.length).to.be.greaterThan(0);\n });\n\n it('renders with correct grid dimensions', async () => {\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"canvas\"></div>\n </temba-flow-editor>\n `);\n\n (editor as any).canvasSize = { width: 1200, height: 800 };\n await editor.updateComplete;\n\n const gridElement = editor.querySelector('#grid');\n expect(gridElement).to.exist;\n\n const style = gridElement?.getAttribute('style');\n expect(style).to.contain('width:1200px');\n expect(style).to.contain('height:800px');\n });\n\n it('renders editor structure', async () => {\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"canvas\"></div>\n </temba-flow-editor>\n `);\n\n (editor as any).canvasSize = { width: 800, height: 600 };\n await editor.updateComplete;\n\n const editorElement = editor.querySelector('#editor');\n expect(editorElement).to.exist;\n\n const gridElement = editor.querySelector('#grid');\n expect(gridElement).to.exist;\n\n const canvasElement = editor.querySelector('#canvas');\n expect(canvasElement).to.exist;\n });\n });\n\n describe('property handling', () => {\n it('handles flow property change', async () => {\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"canvas\"></div>\n </temba-flow-editor>\n `);\n\n // Change flow property\n editor.flow = 'new-flow-uuid';\n await editor.updateComplete;\n\n expect(editor.flow).to.equal('new-flow-uuid');\n });\n\n it('handles version property change', async () => {\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"canvas\"></div>\n </temba-flow-editor>\n `);\n\n editor.version = '2.0';\n await editor.updateComplete;\n\n expect(editor.version).to.equal('2.0');\n });\n });\n\n describe('store integration', () => {\n it('has fromStore decorators for definition and canvasSize', () => {\n editor = new Editor();\n\n // Check that the properties exist (they are private but we can verify they exist)\n expect(editor).to.have.property('definition');\n expect(editor).to.have.property('canvasSize');\n });\n });\n\n describe('constructor behavior', () => {\n it('calls super in constructor', () => {\n // This mainly verifies the constructor doesn't throw\n expect(() => {\n new Editor();\n }).to.not.throw();\n });\n });\n\n describe('multi-selection functionality', () => {\n let mockDefinition: any;\n\n beforeEach(() => {\n mockDefinition = {\n nodes: [\n {\n uuid: 'node-1',\n actions: [],\n exits: []\n },\n {\n uuid: 'node-2',\n actions: [],\n exits: []\n }\n ],\n _ui: {\n nodes: {\n 'node-1': { position: { left: 100, top: 200 } },\n 'node-2': { position: { left: 300, top: 400 } }\n },\n stickies: {\n 'sticky-1': {\n position: { left: 200, top: 100 },\n title: 'Test Sticky',\n body: 'Test content',\n color: 'yellow'\n }\n }\n }\n };\n });\n\n it('initializes with empty selection', async () => {\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"canvas\"></div>\n </temba-flow-editor>\n `);\n\n expect((editor as any).selectedItems.size).to.equal(0);\n expect((editor as any).isSelecting).to.be.false;\n expect((editor as any).selectionBox).to.be.null;\n });\n\n it('adds visual selection styling to selected items', async () => {\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"canvas\"></div>\n </temba-flow-editor>\n `);\n\n // Set up mock definition and selection\n (editor as any).definition = mockDefinition;\n (editor as any).canvasSize = { width: 800, height: 600 };\n (editor as any).selectedItems = new Set(['node-1']);\n await editor.updateComplete;\n\n const selectedNode = editor.querySelector(\n 'temba-flow-node[uuid=\"node-1\"]'\n );\n expect(selectedNode).to.exist;\n expect(selectedNode.classList.contains('selected')).to.be.true;\n });\n\n it('renders selection box when selecting', async () => {\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"canvas\"></div>\n </temba-flow-editor>\n `);\n\n // Set up selection state\n (editor as any).definition = mockDefinition;\n (editor as any).canvasSize = { width: 800, height: 600 };\n (editor as any).isSelecting = true;\n (editor as any).selectionBox = {\n startX: 50,\n startY: 50,\n endX: 150,\n endY: 150\n };\n await editor.updateComplete;\n\n const selectionBox = editor.querySelector('.selection-box');\n expect(selectionBox).to.exist;\n\n const style = selectionBox.getAttribute('style');\n expect(style).to.contain('left: 50px');\n expect(style).to.contain('top: 50px');\n expect(style).to.contain('width: 100px');\n expect(style).to.contain('height: 100px');\n });\n\n it('handles escape key to clear selection', async () => {\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"canvas\"></div>\n </temba-flow-editor>\n `);\n\n // Set up selection\n (editor as any).selectedItems.add('node-1');\n (editor as any).selectedItems.add('node-2');\n\n const mockEvent = new KeyboardEvent('keydown', { key: 'Escape' });\n (editor as any).handleKeyDown(mockEvent);\n\n expect((editor as any).selectedItems.size).to.equal(0);\n });\n });\n\n describe('canvas initialization', () => {\n it('initializes plumber with canvas element', async () => {\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"canvas\"></div>\n </temba-flow-editor>\n `);\n\n const plumber = (editor as any).plumber;\n expect(plumber).to.be.instanceOf(Plumber);\n });\n\n it('handles missing canvas element gracefully', async () => {\n editor = await fixture(html`<temba-flow-editor></temba-flow-editor>`);\n\n // Should not throw even without canvas\n expect((editor as any).plumber).to.be.instanceOf(Plumber);\n });\n });\n\n describe('canvas menu functionality', () => {\n afterEach(() => {\n restore();\n });\n\n it('has context menu handler set up', async () => {\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"grid\">\n <div\n id=\"canvas\"\n style=\"position: relative; width: 800px; height: 600px;\"\n ></div>\n </div>\n </temba-flow-editor>\n `);\n\n // Set up required properties\n (editor as any).canvasSize = { width: 800, height: 600 };\n await editor.updateComplete;\n\n const canvas = editor.querySelector('#canvas') as HTMLElement;\n expect(canvas).to.exist;\n\n // Check that the context menu event listener is set up\n expect((editor as any).boundCanvasContextMenu).to.exist;\n expect(typeof (editor as any).boundCanvasContextMenu).to.equal(\n 'function'\n );\n\n // Test the snapToGrid functionality that would be used\n const snapToGrid = (value: number): number => {\n const snapped = Math.round(value / 20) * 20;\n return Math.max(snapped, 0);\n };\n\n // Test various snap positions\n expect(snapToGrid(245)).to.equal(240);\n expect(snapToGrid(255)).to.equal(260);\n expect(snapToGrid(150)).to.equal(160);\n expect(snapToGrid(-10)).to.equal(0); // Should not go negative\n });\n\n it('tests context menu handler logic independently', () => {\n // Test the logic that would be in handleCanvasContextMenu\n\n // Mock event with canvas target\n const canvasTarget = { id: 'canvas' };\n const validEvent = { target: canvasTarget };\n\n // Mock event with non-canvas target\n const nonCanvasTarget = { id: 'other-element' };\n const invalidEvent = { target: nonCanvasTarget };\n\n // Test the early return condition\n const shouldReturnEarly = (event: any) => {\n const target = event.target as HTMLElement;\n return target.id !== 'canvas';\n };\n\n expect(shouldReturnEarly(validEvent)).to.be.false;\n expect(shouldReturnEarly(invalidEvent)).to.be.true;\n });\n\n it('tests position calculation logic', () => {\n // Mock canvas getBoundingClientRect\n const mockCanvas = {\n getBoundingClientRect: () => ({\n left: 50,\n top: 100,\n right: 850,\n bottom: 700,\n width: 800,\n height: 600\n })\n };\n\n // Mock event\n const mockEvent = {\n clientX: 300,\n clientY: 250\n };\n\n // Calculate relative position (this is what handleCanvasDoubleClick does)\n const canvasRect = mockCanvas.getBoundingClientRect();\n const relativeX = mockEvent.clientX - canvasRect.left; // 300 - 50 = 250\n const relativeY = mockEvent.clientY - canvasRect.top; // 250 - 100 = 150\n\n // Apply snap to grid\n const snapToGrid = (value: number) =>\n Math.max(Math.round(value / 20) * 20, 0);\n const snappedLeft = snapToGrid(relativeX); // 250 -> 260\n const snappedTop = snapToGrid(relativeY); // 150 -> 160\n\n // Verify calculations\n expect(relativeX).to.equal(250);\n expect(relativeY).to.equal(150);\n expect(snappedLeft).to.equal(260);\n expect(snappedTop).to.equal(160);\n\n // This position would be passed to createStickyNote\n const expectedPosition = {\n left: snappedLeft,\n top: snappedTop\n };\n\n expect(expectedPosition).to.deep.equal({ left: 260, top: 160 });\n });\n });\n\n describe('flow-start indicator', () => {\n it('should mark the first node as flow-start', async () => {\n const { zustand } = await import('../src/store/AppState');\n\n // create a flow definition with multiple nodes\n const mockFlowDefinition = {\n language: 'en',\n localization: {},\n name: 'Test Flow',\n nodes: [\n {\n uuid: 'node-1',\n actions: [\n { type: 'send_msg', uuid: 'action-1', text: 'Message 1' }\n ],\n exits: [{ uuid: 'exit-1', destination_uuid: null }]\n },\n {\n uuid: 'node-2',\n actions: [\n { type: 'send_msg', uuid: 'action-2', text: 'Message 2' }\n ],\n exits: [{ uuid: 'exit-2', destination_uuid: null }]\n },\n {\n uuid: 'node-3',\n actions: [\n { type: 'send_msg', uuid: 'action-3', text: 'Message 3' }\n ],\n exits: [{ uuid: 'exit-3', destination_uuid: null }]\n }\n ],\n uuid: 'test-uuid',\n type: 'messaging' as const,\n revision: 1,\n spec_version: '14.3',\n _ui: {\n nodes: {\n 'node-1': { position: { left: 100, top: 100 }, type: 'send_msg' },\n 'node-2': { position: { left: 200, top: 200 }, type: 'send_msg' },\n 'node-3': { position: { left: 300, top: 300 }, type: 'send_msg' }\n },\n languages: []\n }\n };\n\n zustand.getState().setFlowContents({\n definition: mockFlowDefinition as any,\n info: {\n results: [],\n dependencies: [],\n counts: { nodes: 3, languages: 1 },\n locals: []\n }\n });\n\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"canvas\"></div>\n </temba-flow-editor>\n `);\n\n await editor.updateComplete;\n\n // get all flow nodes\n const flowNodes = editor.querySelectorAll('temba-flow-node');\n expect(flowNodes.length).to.equal(3);\n\n // first node should have flow-start class\n expect(flowNodes[0].classList.contains('flow-start')).to.be.true;\n\n // other nodes should not have flow-start class\n expect(flowNodes[1].classList.contains('flow-start')).to.be.false;\n expect(flowNodes[2].classList.contains('flow-start')).to.be.false;\n });\n\n it('should update flow-start when node positions change', async () => {\n const { zustand } = await import('../src/store/AppState');\n\n // create a flow with nodes in a specific order\n const mockFlowDefinition = {\n language: 'en',\n localization: {},\n name: 'Test Flow',\n nodes: [\n {\n uuid: 'node-1',\n actions: [\n { type: 'send_msg', uuid: 'action-1', text: 'Message 1' }\n ],\n exits: [{ uuid: 'exit-1', destination_uuid: null }]\n },\n {\n uuid: 'node-2',\n actions: [\n { type: 'send_msg', uuid: 'action-2', text: 'Message 2' }\n ],\n exits: [{ uuid: 'exit-2', destination_uuid: null }]\n }\n ],\n uuid: 'test-uuid',\n type: 'messaging' as const,\n revision: 1,\n spec_version: '14.3',\n _ui: {\n nodes: {\n 'node-1': { position: { left: 100, top: 200 }, type: 'send_msg' },\n 'node-2': { position: { left: 100, top: 100 }, type: 'send_msg' }\n },\n languages: []\n }\n };\n\n zustand.getState().setFlowContents({\n definition: mockFlowDefinition as any,\n info: {\n results: [],\n dependencies: [],\n counts: { nodes: 2, languages: 1 },\n locals: []\n }\n });\n\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"canvas\"></div>\n </temba-flow-editor>\n `);\n\n await editor.updateComplete;\n\n // node-2 is at top (top: 100 < top: 200) so it should be flow-start\n const node1 = editor.querySelector('temba-flow-node[uuid=\"node-1\"]');\n const node2 = editor.querySelector('temba-flow-node[uuid=\"node-2\"]');\n\n expect(node2).to.exist;\n expect(node1).to.exist;\n expect(node2.classList.contains('flow-start')).to.be.true;\n expect(node1.classList.contains('flow-start')).to.be.false;\n\n // move node-1 to the top\n zustand.getState().updateCanvasPositions({\n 'node-1': { left: 100, top: 50 }\n });\n\n await editor.updateComplete;\n\n // now node-1 should be first\n const updatedFlowNodes = editor.querySelectorAll('temba-flow-node');\n expect(updatedFlowNodes[0].getAttribute('uuid')).to.equal('node-1');\n expect(updatedFlowNodes[0].classList.contains('flow-start')).to.be.true;\n expect(updatedFlowNodes[1].classList.contains('flow-start')).to.be.false;\n });\n\n it('should maintain flow-start when nodes are added', async () => {\n const { zustand } = await import('../src/store/AppState');\n\n // start with one node\n const mockFlowDefinition = {\n language: 'en',\n localization: {},\n name: 'Test Flow',\n nodes: [\n {\n uuid: 'node-1',\n actions: [\n { type: 'send_msg', uuid: 'action-1', text: 'Message 1' }\n ],\n exits: [{ uuid: 'exit-1', destination_uuid: null }]\n }\n ],\n uuid: 'test-uuid',\n type: 'messaging' as const,\n revision: 1,\n spec_version: '14.3',\n _ui: {\n nodes: {\n 'node-1': { position: { left: 100, top: 200 }, type: 'send_msg' }\n },\n languages: []\n }\n };\n\n zustand.getState().setFlowContents({\n definition: mockFlowDefinition as any,\n info: {\n results: [],\n dependencies: [],\n counts: { nodes: 1, languages: 1 },\n locals: []\n }\n });\n\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"canvas\"></div>\n </temba-flow-editor>\n `);\n\n await editor.updateComplete;\n\n const flowNodes = editor.querySelectorAll('temba-flow-node');\n expect(flowNodes[0].classList.contains('flow-start')).to.be.true;\n\n // add a new node at the top\n const newNode = {\n uuid: 'node-2',\n actions: [\n { type: 'send_msg' as const, uuid: 'action-2', text: 'Message 2' }\n ],\n exits: [{ uuid: 'exit-2', destination_uuid: null }]\n };\n const newNodeUI = {\n position: { left: 100, top: 100 },\n type: 'send_msg' as const\n };\n\n zustand.getState().addNode(newNode, newNodeUI);\n\n await editor.updateComplete;\n\n // new node should now be the flow-start\n const node1 = editor.querySelector('temba-flow-node[uuid=\"node-1\"]');\n const node2 = editor.querySelector('temba-flow-node[uuid=\"node-2\"]');\n\n expect(node2).to.exist;\n expect(node1).to.exist;\n expect(node2.classList.contains('flow-start')).to.be.true;\n expect(node1.classList.contains('flow-start')).to.be.false;\n });\n\n it('should handle flow-start when first node is removed', async () => {\n const { zustand } = await import('../src/store/AppState');\n\n // create flow with multiple nodes\n const mockFlowDefinition = {\n language: 'en',\n localization: {},\n name: 'Test Flow',\n nodes: [\n {\n uuid: 'node-1',\n actions: [\n { type: 'send_msg', uuid: 'action-1', text: 'Message 1' }\n ],\n exits: [{ uuid: 'exit-1', destination_uuid: null }]\n },\n {\n uuid: 'node-2',\n actions: [\n { type: 'send_msg', uuid: 'action-2', text: 'Message 2' }\n ],\n exits: [{ uuid: 'exit-2', destination_uuid: null }]\n }\n ],\n uuid: 'test-uuid',\n type: 'messaging' as const,\n revision: 1,\n spec_version: '14.3',\n _ui: {\n nodes: {\n 'node-1': { position: { left: 100, top: 100 }, type: 'send_msg' },\n 'node-2': { position: { left: 100, top: 200 }, type: 'send_msg' }\n },\n languages: []\n }\n };\n\n zustand.getState().setFlowContents({\n definition: mockFlowDefinition as any,\n info: {\n results: [],\n dependencies: [],\n counts: { nodes: 2, languages: 1 },\n locals: []\n }\n });\n\n editor = await fixture(html`\n <temba-flow-editor>\n <div id=\"canvas\"></div>\n </temba-flow-editor>\n `);\n\n await editor.updateComplete;\n\n let flowNodes = editor.querySelectorAll('temba-flow-node');\n expect(flowNodes[0].getAttribute('uuid')).to.equal('node-1');\n expect(flowNodes[0].classList.contains('flow-start')).to.be.true;\n\n // remove the first node\n zustand.getState().removeNodes(['node-1']);\n\n await editor.updateComplete;\n\n // node-2 should now be the flow-start\n flowNodes = editor.querySelectorAll('temba-flow-node');\n expect(flowNodes.length).to.equal(1);\n expect(flowNodes[0].getAttribute('uuid')).to.equal('node-2');\n expect(flowNodes[0].classList.contains('flow-start')).to.be.true;\n });\n });\n});\n"]}