@cratis/components 0.1.17 → 0.1.19

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 (180) hide show
  1. package/README.md +83 -0
  2. package/dist/cjs/Common/ErrorBoundary.js +26 -0
  3. package/dist/cjs/Common/ErrorBoundary.js.map +1 -0
  4. package/dist/cjs/Common/FormElement.js +10 -0
  5. package/dist/cjs/Common/FormElement.js.map +1 -0
  6. package/dist/cjs/Common/index.js +12 -0
  7. package/dist/cjs/Common/index.js.map +1 -0
  8. package/dist/cjs/EventModeling/EventModeling.css +146 -0
  9. package/dist/cjs/EventModeling/EventModeling.js +209 -0
  10. package/dist/cjs/EventModeling/EventModeling.js.map +1 -0
  11. package/dist/cjs/EventModeling/components/Canvas.js +403 -0
  12. package/dist/cjs/EventModeling/components/Canvas.js.map +1 -0
  13. package/dist/cjs/EventModeling/components/CanvasControls.js +10 -0
  14. package/dist/cjs/EventModeling/components/CanvasControls.js.map +1 -0
  15. package/dist/cjs/EventModeling/components/Toolbox.js +18 -0
  16. package/dist/cjs/EventModeling/components/Toolbox.js.map +1 -0
  17. package/dist/cjs/EventModeling/engine/connectorGraphics.js +173 -0
  18. package/dist/cjs/EventModeling/engine/connectorGraphics.js.map +1 -0
  19. package/dist/cjs/EventModeling/engine/elementSprites.js +301 -0
  20. package/dist/cjs/EventModeling/engine/elementSprites.js.map +1 -0
  21. package/dist/cjs/EventModeling/index.js +12 -0
  22. package/dist/cjs/EventModeling/index.js.map +1 -0
  23. package/dist/cjs/EventModeling/types.js +60 -0
  24. package/dist/cjs/EventModeling/types.js.map +1 -0
  25. package/dist/cjs/PivotViewer/PivotViewer.css +54 -5
  26. package/dist/cjs/PivotViewer/PivotViewer.js +5 -2
  27. package/dist/cjs/PivotViewer/PivotViewer.js.map +1 -1
  28. package/dist/cjs/PivotViewer/components/AxisLabels.js +5 -8
  29. package/dist/cjs/PivotViewer/components/AxisLabels.js.map +1 -1
  30. package/dist/cjs/PivotViewer/components/DetailPanel.js +9 -2
  31. package/dist/cjs/PivotViewer/components/DetailPanel.js.map +1 -1
  32. package/dist/cjs/PivotViewer/components/PivotCanvas.js +30 -6
  33. package/dist/cjs/PivotViewer/components/PivotCanvas.js.map +1 -1
  34. package/dist/cjs/PivotViewer/components/PivotViewerMain.js +16 -5
  35. package/dist/cjs/PivotViewer/components/PivotViewerMain.js.map +1 -1
  36. package/dist/cjs/PivotViewer/components/Toolbar.js +34 -2
  37. package/dist/cjs/PivotViewer/components/Toolbar.js.map +1 -1
  38. package/dist/cjs/PivotViewer/components/pivot/constants.js +5 -5
  39. package/dist/cjs/PivotViewer/components/pivot/constants.js.map +1 -1
  40. package/dist/cjs/PivotViewer/components/pivot/groups.js +15 -15
  41. package/dist/cjs/PivotViewer/components/pivot/groups.js.map +1 -1
  42. package/dist/cjs/PivotViewer/components/pivot/sprites.js +10 -27
  43. package/dist/cjs/PivotViewer/components/pivot/sprites.js.map +1 -1
  44. package/dist/cjs/PivotViewer/components/pivot/visibility.js +8 -20
  45. package/dist/cjs/PivotViewer/components/pivot/visibility.js.map +1 -1
  46. package/dist/cjs/PivotViewer/constants.js +0 -2
  47. package/dist/cjs/PivotViewer/constants.js.map +1 -1
  48. package/dist/cjs/PivotViewer/engine/layout.js +1 -1
  49. package/dist/cjs/PivotViewer/engine/layout.js.map +1 -1
  50. package/dist/cjs/PivotViewer/hooks/useCardSelection.js +2 -1
  51. package/dist/cjs/PivotViewer/hooks/useCardSelection.js.map +1 -1
  52. package/dist/cjs/PivotViewer/hooks/useZoomState.js +4 -0
  53. package/dist/cjs/PivotViewer/hooks/useZoomState.js.map +1 -1
  54. package/dist/cjs/PivotViewer/types.js.map +1 -1
  55. package/dist/cjs/PivotViewer/utils/animations.js +1 -1
  56. package/dist/cjs/PivotViewer/utils/animations.js.map +1 -1
  57. package/dist/cjs/PivotViewer/utils/constants.js +1 -1
  58. package/dist/cjs/PivotViewer/utils/constants.js.map +1 -1
  59. package/dist/cjs/PivotViewer/utils/selection.js +8 -1
  60. package/dist/cjs/PivotViewer/utils/selection.js.map +1 -1
  61. package/dist/cjs/TimeMachine/TimeMachine.js +0 -3
  62. package/dist/cjs/TimeMachine/TimeMachine.js.map +1 -1
  63. package/dist/cjs/index.js +16 -12
  64. package/dist/cjs/index.js.map +1 -1
  65. package/dist/cjs/package.json +3 -0
  66. package/dist/esm/Common/ErrorBoundary.js +7 -4
  67. package/dist/esm/Common/ErrorBoundary.js.map +1 -1
  68. package/dist/esm/Common/FormElement.js +7 -4
  69. package/dist/esm/Common/FormElement.js.map +1 -1
  70. package/dist/esm/Common/index.js +4 -4
  71. package/dist/esm/Common/index.js.map +1 -1
  72. package/dist/esm/EventModeling/EventModeling.css +146 -0
  73. package/dist/esm/EventModeling/EventModeling.d.ts +11 -0
  74. package/dist/esm/EventModeling/EventModeling.d.ts.map +1 -0
  75. package/dist/esm/EventModeling/EventModeling.js +207 -0
  76. package/dist/esm/EventModeling/EventModeling.js.map +1 -0
  77. package/dist/esm/EventModeling/EventModeling.stories.d.ts +10 -0
  78. package/dist/esm/EventModeling/EventModeling.stories.d.ts.map +1 -0
  79. package/dist/esm/EventModeling/EventModeling.stories.js +252 -0
  80. package/dist/esm/EventModeling/EventModeling.stories.js.map +1 -0
  81. package/dist/esm/EventModeling/components/Canvas.d.ts +23 -0
  82. package/dist/esm/EventModeling/components/Canvas.d.ts.map +1 -0
  83. package/dist/esm/EventModeling/components/Canvas.js +382 -0
  84. package/dist/esm/EventModeling/components/Canvas.js.map +1 -0
  85. package/dist/esm/EventModeling/components/CanvasControls.d.ts +10 -0
  86. package/dist/esm/EventModeling/components/CanvasControls.d.ts.map +1 -0
  87. package/dist/esm/EventModeling/components/CanvasControls.js +8 -0
  88. package/dist/esm/EventModeling/components/CanvasControls.js.map +1 -0
  89. package/dist/esm/EventModeling/components/Toolbox.d.ts +9 -0
  90. package/dist/esm/EventModeling/components/Toolbox.d.ts.map +1 -0
  91. package/dist/esm/EventModeling/components/Toolbox.js +16 -0
  92. package/dist/esm/EventModeling/components/Toolbox.js.map +1 -0
  93. package/dist/esm/EventModeling/engine/connectorGraphics.d.ts +12 -0
  94. package/dist/esm/EventModeling/engine/connectorGraphics.d.ts.map +1 -0
  95. package/dist/esm/EventModeling/engine/connectorGraphics.js +151 -0
  96. package/dist/esm/EventModeling/engine/connectorGraphics.js.map +1 -0
  97. package/dist/esm/EventModeling/engine/elementSprites.d.ts +23 -0
  98. package/dist/esm/EventModeling/engine/elementSprites.d.ts.map +1 -0
  99. package/dist/esm/EventModeling/engine/elementSprites.js +276 -0
  100. package/dist/esm/EventModeling/engine/elementSprites.js.map +1 -0
  101. package/dist/esm/EventModeling/index.d.ts +3 -0
  102. package/dist/esm/EventModeling/index.d.ts.map +1 -0
  103. package/dist/esm/EventModeling/index.js +3 -0
  104. package/dist/esm/EventModeling/index.js.map +1 -0
  105. package/dist/esm/EventModeling/types.d.ts +79 -0
  106. package/dist/esm/EventModeling/types.d.ts.map +1 -0
  107. package/dist/esm/EventModeling/types.js +56 -0
  108. package/dist/esm/EventModeling/types.js.map +1 -0
  109. package/dist/esm/PivotViewer/PivotViewer.css +54 -5
  110. package/dist/esm/PivotViewer/PivotViewer.d.ts.map +1 -1
  111. package/dist/esm/PivotViewer/PivotViewer.js +5 -2
  112. package/dist/esm/PivotViewer/PivotViewer.js.map +1 -1
  113. package/dist/esm/PivotViewer/PivotViewer.stories.d.ts +0 -1
  114. package/dist/esm/PivotViewer/PivotViewer.stories.d.ts.map +1 -1
  115. package/dist/esm/PivotViewer/PivotViewer.stories.js +10 -9
  116. package/dist/esm/PivotViewer/PivotViewer.stories.js.map +1 -1
  117. package/dist/esm/PivotViewer/components/AxisLabels.d.ts +2 -1
  118. package/dist/esm/PivotViewer/components/AxisLabels.d.ts.map +1 -1
  119. package/dist/esm/PivotViewer/components/AxisLabels.js +6 -9
  120. package/dist/esm/PivotViewer/components/AxisLabels.js.map +1 -1
  121. package/dist/esm/PivotViewer/components/DetailPanel.d.ts +3 -1
  122. package/dist/esm/PivotViewer/components/DetailPanel.d.ts.map +1 -1
  123. package/dist/esm/PivotViewer/components/DetailPanel.js +10 -3
  124. package/dist/esm/PivotViewer/components/DetailPanel.js.map +1 -1
  125. package/dist/esm/PivotViewer/components/PivotCanvas.d.ts +5 -2
  126. package/dist/esm/PivotViewer/components/PivotCanvas.d.ts.map +1 -1
  127. package/dist/esm/PivotViewer/components/PivotCanvas.js +30 -6
  128. package/dist/esm/PivotViewer/components/PivotCanvas.js.map +1 -1
  129. package/dist/esm/PivotViewer/components/PivotViewerMain.d.ts +5 -1
  130. package/dist/esm/PivotViewer/components/PivotViewerMain.d.ts.map +1 -1
  131. package/dist/esm/PivotViewer/components/PivotViewerMain.js +16 -5
  132. package/dist/esm/PivotViewer/components/PivotViewerMain.js.map +1 -1
  133. package/dist/esm/PivotViewer/components/Toolbar.d.ts +3 -1
  134. package/dist/esm/PivotViewer/components/Toolbar.d.ts.map +1 -1
  135. package/dist/esm/PivotViewer/components/Toolbar.js +34 -2
  136. package/dist/esm/PivotViewer/components/Toolbar.js.map +1 -1
  137. package/dist/esm/PivotViewer/components/pivot/constants.d.ts.map +1 -1
  138. package/dist/esm/PivotViewer/components/pivot/constants.js +5 -5
  139. package/dist/esm/PivotViewer/components/pivot/constants.js.map +1 -1
  140. package/dist/esm/PivotViewer/components/pivot/groups.d.ts.map +1 -1
  141. package/dist/esm/PivotViewer/components/pivot/groups.js +2 -2
  142. package/dist/esm/PivotViewer/components/pivot/groups.js.map +1 -1
  143. package/dist/esm/PivotViewer/components/pivot/sprites.d.ts +10 -2
  144. package/dist/esm/PivotViewer/components/pivot/sprites.d.ts.map +1 -1
  145. package/dist/esm/PivotViewer/components/pivot/sprites.js +10 -27
  146. package/dist/esm/PivotViewer/components/pivot/sprites.js.map +1 -1
  147. package/dist/esm/PivotViewer/components/pivot/visibility.d.ts.map +1 -1
  148. package/dist/esm/PivotViewer/components/pivot/visibility.js +8 -20
  149. package/dist/esm/PivotViewer/components/pivot/visibility.js.map +1 -1
  150. package/dist/esm/PivotViewer/constants.js +1 -2
  151. package/dist/esm/PivotViewer/constants.js.map +1 -1
  152. package/dist/esm/PivotViewer/engine/layout.js +1 -1
  153. package/dist/esm/PivotViewer/engine/layout.js.map +1 -1
  154. package/dist/esm/PivotViewer/hooks/useCardSelection.d.ts.map +1 -1
  155. package/dist/esm/PivotViewer/hooks/useCardSelection.js +2 -1
  156. package/dist/esm/PivotViewer/hooks/useCardSelection.js.map +1 -1
  157. package/dist/esm/PivotViewer/hooks/useZoomState.d.ts +1 -0
  158. package/dist/esm/PivotViewer/hooks/useZoomState.d.ts.map +1 -1
  159. package/dist/esm/PivotViewer/hooks/useZoomState.js +4 -0
  160. package/dist/esm/PivotViewer/hooks/useZoomState.js.map +1 -1
  161. package/dist/esm/PivotViewer/types.d.ts +5 -1
  162. package/dist/esm/PivotViewer/types.d.ts.map +1 -1
  163. package/dist/esm/PivotViewer/types.js.map +1 -1
  164. package/dist/esm/PivotViewer/utils/animations.js +1 -1
  165. package/dist/esm/PivotViewer/utils/animations.js.map +1 -1
  166. package/dist/esm/PivotViewer/utils/constants.d.ts +1 -1
  167. package/dist/esm/PivotViewer/utils/constants.d.ts.map +1 -1
  168. package/dist/esm/PivotViewer/utils/constants.js +1 -1
  169. package/dist/esm/PivotViewer/utils/constants.js.map +1 -1
  170. package/dist/esm/PivotViewer/utils/selection.d.ts.map +1 -1
  171. package/dist/esm/PivotViewer/utils/selection.js +8 -1
  172. package/dist/esm/PivotViewer/utils/selection.js.map +1 -1
  173. package/dist/esm/TimeMachine/TimeMachine.js +1 -1
  174. package/dist/esm/index.d.ts +5 -3
  175. package/dist/esm/index.d.ts.map +1 -1
  176. package/dist/esm/index.js +16 -12
  177. package/dist/esm/index.js.map +1 -1
  178. package/dist/esm/package.json +3 -0
  179. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  180. package/package.json +36 -78
@@ -0,0 +1,151 @@
1
+ import * as PIXI from 'pixi.js';
2
+
3
+ const CONNECTOR_COLOR = 0x64748b;
4
+ const CONNECTOR_HOVER_COLOR = 0x3b82f6;
5
+ const CONNECTOR_WIDTH = 2;
6
+ const CONNECTOR_HOVER_WIDTH = 3;
7
+ function createConnectorGraphics(connector, getElements, onClick) {
8
+ const graphics = new PIXI.Graphics();
9
+ graphics.eventMode = 'static';
10
+ graphics.cursor = 'pointer';
11
+ graphics.hitArea = new PIXI.Rectangle(0, 0, 0, 0);
12
+ const connectorGraphics = {
13
+ id: connector.id,
14
+ graphics,
15
+ connector,
16
+ getElements,
17
+ isHovered: false,
18
+ };
19
+ drawConnector(graphics, connector, getElements(), false);
20
+ graphics.on('click', () => {
21
+ onClick(connector.id);
22
+ });
23
+ graphics.on('pointerover', () => {
24
+ connectorGraphics.isHovered = true;
25
+ drawConnector(graphics, connector, connectorGraphics.getElements(), true);
26
+ });
27
+ graphics.on('pointerout', () => {
28
+ connectorGraphics.isHovered = false;
29
+ drawConnector(graphics, connector, connectorGraphics.getElements(), false);
30
+ });
31
+ return connectorGraphics;
32
+ }
33
+ function drawConnector(graphics, connector, elements, isHovered) {
34
+ const fromElement = elements.get(connector.from.elementId);
35
+ const toElement = elements.get(connector.to.elementId);
36
+ if (!fromElement || !toElement) {
37
+ graphics.clear();
38
+ return;
39
+ }
40
+ const fromPoint = getEdgePosition(fromElement, connector.from.side);
41
+ const toPoint = getEdgePosition(toElement, connector.to.side);
42
+ graphics.clear();
43
+ const controlPointOffset = Math.abs(toPoint.x - fromPoint.x) / 3;
44
+ let cp1x, cp1y, cp2x, cp2y;
45
+ if (connector.from.side === 'right' && connector.to.side === 'left') {
46
+ cp1x = fromPoint.x + controlPointOffset;
47
+ cp1y = fromPoint.y;
48
+ cp2x = toPoint.x - controlPointOffset;
49
+ cp2y = toPoint.y;
50
+ }
51
+ else if (connector.from.side === 'bottom' && connector.to.side === 'top') {
52
+ cp1x = fromPoint.x;
53
+ cp1y = fromPoint.y + controlPointOffset;
54
+ cp2x = toPoint.x;
55
+ cp2y = toPoint.y - controlPointOffset;
56
+ }
57
+ else {
58
+ switch (connector.from.side) {
59
+ case 'right':
60
+ cp1x = fromPoint.x + controlPointOffset;
61
+ cp1y = fromPoint.y;
62
+ break;
63
+ case 'left':
64
+ cp1x = fromPoint.x - controlPointOffset;
65
+ cp1y = fromPoint.y;
66
+ break;
67
+ case 'bottom':
68
+ cp1x = fromPoint.x;
69
+ cp1y = fromPoint.y + controlPointOffset;
70
+ break;
71
+ case 'top':
72
+ default:
73
+ cp1x = fromPoint.x;
74
+ cp1y = fromPoint.y - controlPointOffset;
75
+ break;
76
+ }
77
+ switch (connector.to.side) {
78
+ case 'left':
79
+ cp2x = toPoint.x - controlPointOffset;
80
+ cp2y = toPoint.y;
81
+ break;
82
+ case 'right':
83
+ cp2x = toPoint.x + controlPointOffset;
84
+ cp2y = toPoint.y;
85
+ break;
86
+ case 'top':
87
+ cp2x = toPoint.x;
88
+ cp2y = toPoint.y - controlPointOffset;
89
+ break;
90
+ case 'bottom':
91
+ default:
92
+ cp2x = toPoint.x;
93
+ cp2y = toPoint.y + controlPointOffset;
94
+ break;
95
+ }
96
+ }
97
+ graphics.moveTo(fromPoint.x, fromPoint.y);
98
+ graphics.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, toPoint.x, toPoint.y);
99
+ graphics.stroke({
100
+ color: isHovered ? CONNECTOR_HOVER_COLOR : CONNECTOR_COLOR,
101
+ width: isHovered ? CONNECTOR_HOVER_WIDTH : CONNECTOR_WIDTH,
102
+ });
103
+ drawArrowhead(graphics, fromPoint.x, fromPoint.y, cp1x, cp1y, cp2x, cp2y, toPoint.x, toPoint.y, isHovered);
104
+ const minX = Math.min(fromPoint.x, toPoint.x) - 10;
105
+ const minY = Math.min(fromPoint.y, toPoint.y) - 10;
106
+ const maxX = Math.max(fromPoint.x, toPoint.x) + 10;
107
+ const maxY = Math.max(fromPoint.y, toPoint.y) + 10;
108
+ graphics.hitArea = new PIXI.Rectangle(minX, minY, maxX - minX, maxY - minY);
109
+ }
110
+ function drawArrowhead(graphics, startX, startY, cp1x, cp1y, cp2x, cp2y, endX, endY, isHovered) {
111
+ const arrowSize = 10;
112
+ const dx = 3 * (endX - cp2x);
113
+ const dy = 3 * (endY - cp2y);
114
+ const length = Math.sqrt(dx * dx + dy * dy);
115
+ if (length === 0)
116
+ return;
117
+ const unitX = dx / length;
118
+ const unitY = dy / length;
119
+ const perpX = -unitY;
120
+ const perpY = unitX;
121
+ const backX = endX - unitX * arrowSize;
122
+ const backY = endY - unitY * arrowSize;
123
+ const left = { x: backX + perpX * (arrowSize / 2), y: backY + perpY * (arrowSize / 2) };
124
+ const right = { x: backX - perpX * (arrowSize / 2), y: backY - perpY * (arrowSize / 2) };
125
+ graphics.poly([
126
+ endX, endY,
127
+ left.x, left.y,
128
+ right.x, right.y,
129
+ endX, endY
130
+ ]);
131
+ graphics.fill({ color: isHovered ? CONNECTOR_HOVER_COLOR : CONNECTOR_COLOR });
132
+ }
133
+ function getEdgePosition(element, side) {
134
+ const { position, size } = element;
135
+ switch (side) {
136
+ case 'top':
137
+ return { x: position.x + size.width / 2, y: position.y };
138
+ case 'right':
139
+ return { x: position.x + size.width, y: position.y + size.height / 2 };
140
+ case 'bottom':
141
+ return { x: position.x + size.width / 2, y: position.y + size.height };
142
+ case 'left':
143
+ return { x: position.x, y: position.y + size.height / 2 };
144
+ }
145
+ }
146
+ function updateConnectorGraphics(connectorGraphics, elements) {
147
+ drawConnector(connectorGraphics.graphics, connectorGraphics.connector, elements, connectorGraphics.isHovered);
148
+ }
149
+
150
+ export { createConnectorGraphics, updateConnectorGraphics };
151
+ //# sourceMappingURL=connectorGraphics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connectorGraphics.js","sources":["../../../../EventModeling/engine/connectorGraphics.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport * as PIXI from 'pixi.js';\nimport { Connector, ElementData, EdgeSide } from '../types';\n\nexport interface ConnectorGraphics {\n id: string;\n graphics: PIXI.Graphics;\n connector: Connector;\n getElements: () => Map<string, ElementData>;\n isHovered: boolean;\n}\n\nconst CONNECTOR_COLOR = 0x64748b;\nconst CONNECTOR_HOVER_COLOR = 0x3b82f6;\nconst CONNECTOR_WIDTH = 2;\nconst CONNECTOR_HOVER_WIDTH = 3;\n\nexport function createConnectorGraphics(\n connector: Connector,\n getElements: () => Map<string, ElementData>,\n onClick: (id: string) => void\n): ConnectorGraphics {\n const graphics = new PIXI.Graphics();\n graphics.eventMode = 'static';\n graphics.cursor = 'pointer';\n graphics.hitArea = new PIXI.Rectangle(0, 0, 0, 0); // Will be updated\n\n const connectorGraphics: ConnectorGraphics = {\n id: connector.id,\n graphics,\n connector,\n getElements,\n isHovered: false,\n };\n\n drawConnector(graphics, connector, getElements(), false);\n\n graphics.on('click', () => {\n onClick(connector.id);\n });\n\n graphics.on('pointerover', () => {\n connectorGraphics.isHovered = true;\n // Use fresh element data from getter\n drawConnector(graphics, connector, connectorGraphics.getElements(), true);\n });\n\n graphics.on('pointerout', () => {\n connectorGraphics.isHovered = false;\n // Use fresh element data from getter\n drawConnector(graphics, connector, connectorGraphics.getElements(), false);\n });\n\n return connectorGraphics;\n}\n\nfunction drawConnector(\n graphics: PIXI.Graphics,\n connector: Connector,\n elements: Map<string, ElementData>,\n isHovered: boolean\n): void {\n const fromElement = elements.get(connector.from.elementId);\n const toElement = elements.get(connector.to.elementId);\n\n if (!fromElement || !toElement) {\n graphics.clear();\n return;\n }\n\n const fromPoint = getEdgePosition(fromElement, connector.from.side);\n const toPoint = getEdgePosition(toElement, connector.to.side);\n\n graphics.clear();\n\n // Create a curved path using cubic Bezier\n const controlPointOffset = Math.abs(toPoint.x - fromPoint.x) / 3;\n \n let cp1x: number, cp1y: number, cp2x: number, cp2y: number;\n\n // Adjust control points based on connection direction\n if (connector.from.side === 'right' && connector.to.side === 'left') {\n // Horizontal connection\n cp1x = fromPoint.x + controlPointOffset;\n cp1y = fromPoint.y;\n cp2x = toPoint.x - controlPointOffset;\n cp2y = toPoint.y;\n } else if (connector.from.side === 'bottom' && connector.to.side === 'top') {\n // Vertical connection\n cp1x = fromPoint.x;\n cp1y = fromPoint.y + controlPointOffset;\n cp2x = toPoint.x;\n cp2y = toPoint.y - controlPointOffset;\n } else {\n // Mixed or diagonal connections\n switch (connector.from.side) {\n case 'right':\n cp1x = fromPoint.x + controlPointOffset;\n cp1y = fromPoint.y;\n break;\n case 'left':\n cp1x = fromPoint.x - controlPointOffset;\n cp1y = fromPoint.y;\n break;\n case 'bottom':\n cp1x = fromPoint.x;\n cp1y = fromPoint.y + controlPointOffset;\n break;\n case 'top':\n default:\n cp1x = fromPoint.x;\n cp1y = fromPoint.y - controlPointOffset;\n break;\n }\n\n switch (connector.to.side) {\n case 'left':\n cp2x = toPoint.x - controlPointOffset;\n cp2y = toPoint.y;\n break;\n case 'right':\n cp2x = toPoint.x + controlPointOffset;\n cp2y = toPoint.y;\n break;\n case 'top':\n cp2x = toPoint.x;\n cp2y = toPoint.y - controlPointOffset;\n break;\n case 'bottom':\n default:\n cp2x = toPoint.x;\n cp2y = toPoint.y + controlPointOffset;\n break;\n }\n }\n\n // Draw the curved line\n graphics.moveTo(fromPoint.x, fromPoint.y);\n graphics.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, toPoint.x, toPoint.y);\n graphics.stroke({\n color: isHovered ? CONNECTOR_HOVER_COLOR : CONNECTOR_COLOR,\n width: isHovered ? CONNECTOR_HOVER_WIDTH : CONNECTOR_WIDTH,\n });\n\n // Draw arrowhead at the end - pass all curve points for accurate tangent calculation\n drawArrowhead(graphics, fromPoint.x, fromPoint.y, cp1x, cp1y, cp2x, cp2y, toPoint.x, toPoint.y, isHovered);\n\n // Update hit area for better click detection\n const minX = Math.min(fromPoint.x, toPoint.x) - 10;\n const minY = Math.min(fromPoint.y, toPoint.y) - 10;\n const maxX = Math.max(fromPoint.x, toPoint.x) + 10;\n const maxY = Math.max(fromPoint.y, toPoint.y) + 10;\n graphics.hitArea = new PIXI.Rectangle(minX, minY, maxX - minX, maxY - minY);\n}\n\nfunction drawArrowhead(\n graphics: PIXI.Graphics,\n startX: number,\n startY: number,\n cp1x: number,\n cp1y: number,\n cp2x: number,\n cp2y: number,\n endX: number,\n endY: number,\n isHovered: boolean\n): void {\n const arrowSize = 10;\n \n // Calculate the tangent at the end of the Bezier curve (t = 1)\n // For cubic Bezier: B'(t) = 3(1-t)²(P1-P0) + 6(1-t)t(P2-P1) + 3t²(P3-P2)\n // At t = 1: B'(1) = 3(P3 - P2)\n // This gives us the direction the curve is heading at the endpoint\n const dx = 3 * (endX - cp2x);\n const dy = 3 * (endY - cp2y);\n const length = Math.sqrt(dx * dx + dy * dy);\n \n if (length === 0) return;\n\n const unitX = dx / length;\n const unitY = dy / length;\n\n // Calculate perpendicular\n const perpX = -unitY;\n const perpY = unitX;\n\n // Calculate arrowhead points\n const backX = endX - unitX * arrowSize;\n const backY = endY - unitY * arrowSize;\n const left = { x: backX + perpX * (arrowSize / 2), y: backY + perpY * (arrowSize / 2) };\n const right = { x: backX - perpX * (arrowSize / 2), y: backY - perpY * (arrowSize / 2) };\n\n // Draw filled arrowhead\n graphics.poly([\n endX, endY,\n left.x, left.y,\n right.x, right.y,\n endX, endY\n ]);\n graphics.fill({ color: isHovered ? CONNECTOR_HOVER_COLOR : CONNECTOR_COLOR });\n}\n\nfunction getEdgePosition(element: ElementData, side: EdgeSide): { x: number; y: number } {\n const { position, size } = element;\n \n switch (side) {\n case 'top':\n return { x: position.x + size.width / 2, y: position.y };\n case 'right':\n return { x: position.x + size.width, y: position.y + size.height / 2 };\n case 'bottom':\n return { x: position.x + size.width / 2, y: position.y + size.height };\n case 'left':\n return { x: position.x, y: position.y + size.height / 2 };\n }\n}\n\nexport function updateConnectorGraphics(\n connectorGraphics: ConnectorGraphics,\n elements: Map<string, ElementData>\n): void {\n // Preserve hover state when updating\n drawConnector(connectorGraphics.graphics, connectorGraphics.connector, elements, connectorGraphics.isHovered);\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import * as PIXI from 'pixi.js';
2
+ import { ElementData, EdgeSide } from '../types';
3
+ export interface ElementSprite {
4
+ id: string;
5
+ container: PIXI.Container;
6
+ graphics: PIXI.Graphics;
7
+ selectionBorder?: PIXI.Graphics;
8
+ labelText: PIXI.Text;
9
+ descriptionText?: PIXI.Text;
10
+ edgePoints: Map<EdgeSide, PIXI.Graphics>;
11
+ data: ElementData;
12
+ isDragging: boolean;
13
+ dragOffset?: {
14
+ x: number;
15
+ y: number;
16
+ };
17
+ }
18
+ export declare function createElementSprite(data: ElementData, onElementClick: (id: string) => void, onElementDragStart: (id: string, x: number, y: number) => void, onElementDragMove: (id: string, x: number, y: number) => void, onElementDragEnd: (id: string) => void, onEdgeClick: (elementId: string, side: EdgeSide) => void): ElementSprite;
19
+ export declare function updateElementSprite(sprite: ElementSprite, data: ElementData): void;
20
+ export declare function showEdgePoints(sprite: ElementSprite): void;
21
+ export declare function hideEdgePoints(sprite: ElementSprite): void;
22
+ export declare function setElementSelected(sprite: ElementSprite, selected: boolean): void;
23
+ //# sourceMappingURL=elementSprites.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elementSprites.d.ts","sourceRoot":"","sources":["../../../../EventModeling/engine/elementSprites.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,WAAW,EAAkB,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEjE,MAAM,WAAW,aAAa;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC;IAC1B,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC;IACxB,eAAe,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC;IAChC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC;IACrB,eAAe,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC;IAC5B,UAAU,EAAE,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzC,IAAI,EAAE,WAAW,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACzC;AAMD,wBAAgB,mBAAmB,CAC/B,IAAI,EAAE,WAAW,EACjB,cAAc,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,EACpC,kBAAkB,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,EAC9D,iBAAiB,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,EAC7D,gBAAgB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,EACtC,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,KAAK,IAAI,GACzD,aAAa,CA4Hf;AA8GD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,CAwClF;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAI1D;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAI1D;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CASjF"}
@@ -0,0 +1,276 @@
1
+ import * as PIXI from 'pixi.js';
2
+ import { ELEMENT_COLORS } from '../types.js';
3
+
4
+ const EDGE_POINT_RADIUS = 6;
5
+ const BORDER_RADIUS = 8;
6
+ const PADDING = 16;
7
+ function createElementSprite(data, onElementClick, onElementDragStart, onElementDragMove, onElementDragEnd, onEdgeClick) {
8
+ const container = new PIXI.Container();
9
+ container.position.set(data.position.x, data.position.y);
10
+ container.eventMode = 'static';
11
+ container.cursor = 'move';
12
+ container.hitArea = new PIXI.Rectangle(0, 0, data.size.width, data.size.height);
13
+ const shadowGraphics = new PIXI.Graphics();
14
+ shadowGraphics.alpha = 0.15;
15
+ container.addChild(shadowGraphics);
16
+ const graphics = new PIXI.Graphics();
17
+ const edgePoints = new Map();
18
+ const selectionBorder = new PIXI.Graphics();
19
+ selectionBorder.alpha = 0;
20
+ container.addChild(selectionBorder);
21
+ const elementColors = ELEMENT_COLORS[data.type];
22
+ const backgroundColor = 'background' in elementColors ? elementColors.background : elementColors.fill;
23
+ if (data.type === 'process') {
24
+ const centerX = data.size.width / 2;
25
+ const centerY = data.size.height / 2;
26
+ const radius = Math.min(data.size.width, data.size.height) / 2;
27
+ for (let i = 0; i < 3; i++) {
28
+ shadowGraphics.circle(centerX, centerY + 2 + i, radius + i);
29
+ shadowGraphics.fill({ color: 0x000000, alpha: 0.06 });
30
+ }
31
+ }
32
+ else {
33
+ for (let i = 0; i < 4; i++) {
34
+ shadowGraphics.roundRect(i, 2 + i, data.size.width, data.size.height, BORDER_RADIUS);
35
+ shadowGraphics.fill({ color: 0x000000, alpha: 0.06 });
36
+ }
37
+ }
38
+ if (data.type === 'process') {
39
+ const centerX = data.size.width / 2;
40
+ const centerY = data.size.height / 2;
41
+ const radius = Math.min(data.size.width, data.size.height) / 2;
42
+ graphics.circle(centerX, centerY, radius);
43
+ graphics.fill({ color: backgroundColor });
44
+ if ('stroke' in elementColors) {
45
+ graphics.stroke({ color: elementColors.stroke, width: 2 });
46
+ }
47
+ }
48
+ else {
49
+ graphics.roundRect(0, 0, data.size.width, data.size.height, BORDER_RADIUS);
50
+ graphics.fill({ color: backgroundColor });
51
+ }
52
+ container.addChild(graphics);
53
+ const textColor = 'text' in elementColors ? elementColors.text : 0xffffff;
54
+ const labelText = new PIXI.Text({
55
+ text: data.label,
56
+ style: {
57
+ fontSize: 14,
58
+ fill: textColor,
59
+ fontWeight: '600',
60
+ wordWrap: true,
61
+ wordWrapWidth: data.size.width - PADDING * 2,
62
+ },
63
+ });
64
+ labelText.position.set(PADDING, PADDING);
65
+ container.addChild(labelText);
66
+ let descriptionText;
67
+ if (data.description && data.type !== 'process') {
68
+ descriptionText = new PIXI.Text({
69
+ text: data.description,
70
+ style: new PIXI.TextStyle({
71
+ fontSize: 12,
72
+ fill: textColor,
73
+ fontWeight: '400',
74
+ wordWrap: true,
75
+ wordWrapWidth: data.size.width - PADDING * 2,
76
+ }),
77
+ });
78
+ descriptionText.alpha = 0.9;
79
+ descriptionText.position.set(PADDING, PADDING + 24);
80
+ container.addChild(descriptionText);
81
+ }
82
+ if (data.type !== 'process') {
83
+ const sides = ['top', 'right', 'bottom', 'left'];
84
+ sides.forEach(side => {
85
+ const edgePoint = createEdgePoint(data, side, () => onEdgeClick(data.id, side));
86
+ edgePoints.set(side, edgePoint);
87
+ container.addChild(edgePoint);
88
+ });
89
+ }
90
+ container.on('pointerdown', (event) => {
91
+ if (!container.parent)
92
+ return;
93
+ const localPos = event.getLocalPosition(container.parent);
94
+ onElementDragStart(data.id, localPos.x - data.position.x, localPos.y - data.position.y);
95
+ });
96
+ container.on('click', () => {
97
+ onElementClick(data.id);
98
+ });
99
+ return {
100
+ id: data.id,
101
+ container,
102
+ graphics,
103
+ selectionBorder,
104
+ labelText,
105
+ descriptionText,
106
+ edgePoints,
107
+ data,
108
+ isDragging: false,
109
+ };
110
+ }
111
+ function drawBoxElement(graphics, data) {
112
+ const colors = ELEMENT_COLORS[data.type];
113
+ if (!('background' in colors)) {
114
+ return;
115
+ }
116
+ graphics.clear();
117
+ graphics.roundRect(0, 0, data.size.width, data.size.height, BORDER_RADIUS);
118
+ graphics.fill({ color: colors.background });
119
+ graphics.visible = true;
120
+ graphics.alpha = 1;
121
+ }
122
+ function drawProcessElement(graphics, data) {
123
+ const colors = ELEMENT_COLORS.process;
124
+ const centerX = data.size.width / 2;
125
+ const centerY = data.size.height / 2;
126
+ const radius = Math.min(data.size.width, data.size.height) / 2;
127
+ graphics.clear();
128
+ graphics.circle(centerX, centerY, radius);
129
+ graphics.fill({ color: colors.fill });
130
+ graphics.stroke({ color: colors.stroke, width: 2 });
131
+ const teeth = 8;
132
+ const toothLength = radius * 0.2;
133
+ const innerRadius = radius * 0.6;
134
+ for (let i = 0; i < teeth; i++) {
135
+ const angle = (i / teeth) * Math.PI * 2;
136
+ const nextAngle = ((i + 0.4) / teeth) * Math.PI * 2;
137
+ const x1 = centerX + Math.cos(angle) * radius;
138
+ const y1 = centerY + Math.sin(angle) * radius;
139
+ const x2 = centerX + Math.cos(angle) * (radius + toothLength);
140
+ const y2 = centerY + Math.sin(angle) * (radius + toothLength);
141
+ const x3 = centerX + Math.cos(nextAngle) * (radius + toothLength);
142
+ const y3 = centerY + Math.sin(nextAngle) * (radius + toothLength);
143
+ const x4 = centerX + Math.cos(nextAngle) * radius;
144
+ const y4 = centerY + Math.sin(nextAngle) * radius;
145
+ graphics.moveTo(x1, y1);
146
+ graphics.lineTo(x2, y2);
147
+ graphics.lineTo(x3, y3);
148
+ graphics.lineTo(x4, y4);
149
+ graphics.fill({ color: colors.fill });
150
+ }
151
+ graphics.circle(centerX, centerY, innerRadius);
152
+ graphics.fill({ color: 0xffffff });
153
+ graphics.stroke({ color: colors.stroke, width: 2 });
154
+ }
155
+ function createEdgePoint(data, side, onClick) {
156
+ const edgePoint = new PIXI.Graphics();
157
+ edgePoint.eventMode = 'static';
158
+ edgePoint.cursor = 'crosshair';
159
+ const hitSize = EDGE_POINT_RADIUS * 2;
160
+ edgePoint.hitArea = new PIXI.Circle(0, 0, hitSize);
161
+ let x = 0, y = 0;
162
+ switch (side) {
163
+ case 'top':
164
+ x = data.size.width / 2;
165
+ y = 0;
166
+ break;
167
+ case 'right':
168
+ x = data.size.width;
169
+ y = data.size.height / 2;
170
+ break;
171
+ case 'bottom':
172
+ x = data.size.width / 2;
173
+ y = data.size.height;
174
+ break;
175
+ case 'left':
176
+ x = 0;
177
+ y = data.size.height / 2;
178
+ break;
179
+ }
180
+ edgePoint.position.set(x, y);
181
+ const colors = ELEMENT_COLORS[data.type];
182
+ edgePoint.circle(0, 0, EDGE_POINT_RADIUS);
183
+ edgePoint.fill({ color: 0xffffff });
184
+ edgePoint.stroke({ color: 'background' in colors ? colors.background : 0x6b7280, width: 2 });
185
+ edgePoint.alpha = 0;
186
+ edgePoint.on('click', (e) => {
187
+ e.stopPropagation();
188
+ onClick();
189
+ });
190
+ return edgePoint;
191
+ }
192
+ function updateElementSprite(sprite, data) {
193
+ sprite.data = data;
194
+ sprite.container.position.set(data.position.x, data.position.y);
195
+ if (data.type === 'process') {
196
+ drawProcessElement(sprite.graphics, data);
197
+ }
198
+ else {
199
+ drawBoxElement(sprite.graphics, data);
200
+ }
201
+ sprite.labelText.text = data.label;
202
+ if (sprite.descriptionText && data.description) {
203
+ sprite.descriptionText.text = data.description;
204
+ }
205
+ sprite.edgePoints.forEach((edgePoint, side) => {
206
+ let x = 0, y = 0;
207
+ switch (side) {
208
+ case 'top':
209
+ x = data.size.width / 2;
210
+ y = 0;
211
+ break;
212
+ case 'right':
213
+ x = data.size.width;
214
+ y = data.size.height / 2;
215
+ break;
216
+ case 'bottom':
217
+ x = data.size.width / 2;
218
+ y = data.size.height;
219
+ break;
220
+ case 'left':
221
+ x = 0;
222
+ y = data.size.height / 2;
223
+ break;
224
+ }
225
+ edgePoint.position.set(x, y);
226
+ });
227
+ }
228
+ function showEdgePoints(sprite) {
229
+ sprite.edgePoints.forEach(edgePoint => {
230
+ edgePoint.alpha = 1;
231
+ });
232
+ }
233
+ function hideEdgePoints(sprite) {
234
+ sprite.edgePoints.forEach(edgePoint => {
235
+ edgePoint.alpha = 0;
236
+ });
237
+ }
238
+ function setElementSelected(sprite, selected) {
239
+ if (!sprite.selectionBorder)
240
+ return;
241
+ if (selected) {
242
+ updateSelectionBorder(sprite);
243
+ sprite.selectionBorder.alpha = 1;
244
+ }
245
+ else {
246
+ sprite.selectionBorder.alpha = 0;
247
+ }
248
+ }
249
+ function updateSelectionBorder(sprite) {
250
+ if (!sprite.selectionBorder)
251
+ return;
252
+ const selectionBorder = sprite.selectionBorder;
253
+ selectionBorder.clear();
254
+ const borderWidth = 3;
255
+ const offset = -borderWidth;
256
+ const primaryColor = getComputedPrimaryColor();
257
+ if (sprite.data.type === 'process') {
258
+ const centerX = sprite.data.size.width / 2;
259
+ const centerY = sprite.data.size.height / 2;
260
+ const radius = Math.min(sprite.data.size.width, sprite.data.size.height) / 2 + borderWidth;
261
+ selectionBorder.circle(centerX, centerY, radius);
262
+ selectionBorder.stroke({ color: primaryColor, width: borderWidth });
263
+ }
264
+ else {
265
+ selectionBorder.roundRect(offset, offset, sprite.data.size.width + borderWidth * 2, sprite.data.size.height + borderWidth * 2, BORDER_RADIUS + borderWidth);
266
+ selectionBorder.stroke({ color: primaryColor, width: borderWidth });
267
+ }
268
+ }
269
+ function getComputedPrimaryColor() {
270
+ const style = getComputedStyle(document.documentElement);
271
+ const primaryColorStr = style.getPropertyValue('--primary-color').trim() || '#3B82F6';
272
+ return parseInt(primaryColorStr.replace('#', ''), 16);
273
+ }
274
+
275
+ export { createElementSprite, hideEdgePoints, setElementSelected, showEdgePoints, updateElementSprite };
276
+ //# sourceMappingURL=elementSprites.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elementSprites.js","sources":["../../../../EventModeling/engine/elementSprites.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport * as PIXI from 'pixi.js';\nimport { ElementData, ELEMENT_COLORS, EdgeSide } from '../types';\n\nexport interface ElementSprite {\n id: string;\n container: PIXI.Container;\n graphics: PIXI.Graphics;\n selectionBorder?: PIXI.Graphics;\n labelText: PIXI.Text;\n descriptionText?: PIXI.Text;\n edgePoints: Map<EdgeSide, PIXI.Graphics>;\n data: ElementData;\n isDragging: boolean;\n dragOffset?: { x: number; y: number };\n}\n\nconst EDGE_POINT_RADIUS = 6;\nconst BORDER_RADIUS = 8;\nconst PADDING = 16;\n\nexport function createElementSprite(\n data: ElementData,\n onElementClick: (id: string) => void,\n onElementDragStart: (id: string, x: number, y: number) => void,\n onElementDragMove: (id: string, x: number, y: number) => void,\n onElementDragEnd: (id: string) => void,\n onEdgeClick: (elementId: string, side: EdgeSide) => void\n): ElementSprite {\n const container = new PIXI.Container();\n container.position.set(data.position.x, data.position.y);\n container.eventMode = 'static';\n container.cursor = 'move';\n // Set explicit hit area for interaction\n container.hitArea = new PIXI.Rectangle(0, 0, data.size.width, data.size.height);\n\n // Create shadow layer\n const shadowGraphics = new PIXI.Graphics();\n shadowGraphics.alpha = 0.15;\n container.addChild(shadowGraphics);\n\n const graphics = new PIXI.Graphics();\n const edgePoints = new Map<EdgeSide, PIXI.Graphics>();\n\n // Create selection border (initially hidden)\n const selectionBorder = new PIXI.Graphics();\n selectionBorder.alpha = 0;\n container.addChild(selectionBorder);\n\n // Get colors based on element type\n const elementColors = ELEMENT_COLORS[data.type];\n const backgroundColor = 'background' in elementColors ? elementColors.background : elementColors.fill;\n \n // Draw shadow\n if (data.type === 'process') {\n const centerX = data.size.width / 2;\n const centerY = data.size.height / 2;\n const radius = Math.min(data.size.width, data.size.height) / 2;\n for (let i = 0; i < 3; i++) {\n shadowGraphics.circle(centerX, centerY + 2 + i, radius + i);\n shadowGraphics.fill({ color: 0x000000, alpha: 0.06 });\n }\n } else {\n for (let i = 0; i < 4; i++) {\n shadowGraphics.roundRect(i, 2 + i, data.size.width, data.size.height, BORDER_RADIUS);\n shadowGraphics.fill({ color: 0x000000, alpha: 0.06 });\n }\n }\n \n // Draw with proper shapes (PIXI v8 requires fill with object format)\n if (data.type === 'process') {\n const centerX = data.size.width / 2;\n const centerY = data.size.height / 2;\n const radius = Math.min(data.size.width, data.size.height) / 2;\n graphics.circle(centerX, centerY, radius);\n graphics.fill({ color: backgroundColor });\n if ('stroke' in elementColors) {\n graphics.stroke({ color: elementColors.stroke, width: 2 });\n }\n } else {\n // Use roundRect for proper appearance\n graphics.roundRect(0, 0, data.size.width, data.size.height, BORDER_RADIUS);\n graphics.fill({ color: backgroundColor });\n }\n\n container.addChild(graphics);\n\n // Create label text\n const textColor = 'text' in elementColors ? elementColors.text : 0xffffff;\n const labelText = new PIXI.Text({\n text: data.label,\n style: {\n fontSize: 14,\n fill: textColor,\n fontWeight: '600',\n wordWrap: true,\n wordWrapWidth: data.size.width - PADDING * 2,\n } as PIXI.TextStyle,\n });\n labelText.position.set(PADDING, PADDING);\n container.addChild(labelText);\n\n // Create description text if exists\n let descriptionText: PIXI.Text | undefined;\n if (data.description && data.type !== 'process') {\n descriptionText = new PIXI.Text({\n text: data.description,\n style: new PIXI.TextStyle({\n fontSize: 12,\n fill: textColor,\n fontWeight: '400',\n wordWrap: true,\n wordWrapWidth: data.size.width - PADDING * 2,\n }),\n });\n descriptionText.alpha = 0.9;\n descriptionText.position.set(PADDING, PADDING + 24);\n container.addChild(descriptionText);\n }\n\n // Create edge points for connections\n if (data.type !== 'process') {\n const sides: EdgeSide[] = ['top', 'right', 'bottom', 'left'];\n sides.forEach(side => {\n const edgePoint = createEdgePoint(data, side, () => onEdgeClick(data.id, side));\n edgePoints.set(side, edgePoint);\n container.addChild(edgePoint);\n });\n }\n\n // Set up interaction\n container.on('pointerdown', (event: PIXI.FederatedPointerEvent) => {\n if (!container.parent) return;\n const localPos = event.getLocalPosition(container.parent);\n onElementDragStart(data.id, localPos.x - data.position.x, localPos.y - data.position.y);\n });\n\n container.on('click', () => {\n onElementClick(data.id);\n });\n\n return {\n id: data.id,\n container,\n graphics,\n selectionBorder,\n labelText,\n descriptionText,\n edgePoints,\n data,\n isDragging: false,\n };\n}\n\nfunction drawBoxElement(graphics: PIXI.Graphics, data: ElementData): void {\n const colors = ELEMENT_COLORS[data.type];\n if (!('background' in colors)) {\n return;\n }\n \n graphics.clear();\n \n // Draw the rounded rectangle with solid fill (PIXI v8 - use object format)\n graphics.roundRect(0, 0, data.size.width, data.size.height, BORDER_RADIUS);\n graphics.fill({ color: colors.background });\n \n // Force visibility\n graphics.visible = true;\n graphics.alpha = 1;\n}\n\nfunction drawProcessElement(graphics: PIXI.Graphics, data: ElementData): void {\n const colors = ELEMENT_COLORS.process;\n const centerX = data.size.width / 2;\n const centerY = data.size.height / 2;\n const radius = Math.min(data.size.width, data.size.height) / 2;\n\n graphics.clear();\n \n // Draw outer circle\n graphics.circle(centerX, centerY, radius);\n graphics.fill({ color: colors.fill });\n graphics.stroke({ color: colors.stroke, width: 2 });\n\n // Draw cogwheel teeth\n const teeth = 8;\n const toothLength = radius * 0.2;\n const innerRadius = radius * 0.6;\n \n for (let i = 0; i < teeth; i++) {\n const angle = (i / teeth) * Math.PI * 2;\n const nextAngle = ((i + 0.4) / teeth) * Math.PI * 2;\n \n const x1 = centerX + Math.cos(angle) * radius;\n const y1 = centerY + Math.sin(angle) * radius;\n const x2 = centerX + Math.cos(angle) * (radius + toothLength);\n const y2 = centerY + Math.sin(angle) * (radius + toothLength);\n const x3 = centerX + Math.cos(nextAngle) * (radius + toothLength);\n const y3 = centerY + Math.sin(nextAngle) * (radius + toothLength);\n const x4 = centerX + Math.cos(nextAngle) * radius;\n const y4 = centerY + Math.sin(nextAngle) * radius;\n \n graphics.moveTo(x1, y1);\n graphics.lineTo(x2, y2);\n graphics.lineTo(x3, y3);\n graphics.lineTo(x4, y4);\n graphics.fill({ color: colors.fill });\n }\n\n // Draw inner circle\n graphics.circle(centerX, centerY, innerRadius);\n graphics.fill({ color: 0xffffff });\n graphics.stroke({ color: colors.stroke, width: 2 });\n}\n\nfunction createEdgePoint(data: ElementData, side: EdgeSide, onClick: () => void): PIXI.Graphics {\n const edgePoint = new PIXI.Graphics();\n edgePoint.eventMode = 'static';\n edgePoint.cursor = 'crosshair';\n \n // Set explicit hit area for better interaction\n const hitSize = EDGE_POINT_RADIUS * 2;\n edgePoint.hitArea = new PIXI.Circle(0, 0, hitSize);\n \n // Position based on side\n let x = 0, y = 0;\n switch (side) {\n case 'top':\n x = data.size.width / 2;\n y = 0;\n break;\n case 'right':\n x = data.size.width;\n y = data.size.height / 2;\n break;\n case 'bottom':\n x = data.size.width / 2;\n y = data.size.height;\n break;\n case 'left':\n x = 0;\n y = data.size.height / 2;\n break;\n }\n\n edgePoint.position.set(x, y);\n \n // Draw edge point (initially hidden)\n const colors = ELEMENT_COLORS[data.type];\n edgePoint.circle(0, 0, EDGE_POINT_RADIUS);\n edgePoint.fill({ color: 0xffffff });\n edgePoint.stroke({ color: 'background' in colors ? colors.background : 0x6b7280, width: 2 });\n edgePoint.alpha = 0;\n\n edgePoint.on('click', (e: PIXI.FederatedPointerEvent) => {\n e.stopPropagation();\n onClick();\n });\n\n return edgePoint;\n}\n\nexport function updateElementSprite(sprite: ElementSprite, data: ElementData): void {\n sprite.data = data;\n sprite.container.position.set(data.position.x, data.position.y);\n \n // Update graphics\n if (data.type === 'process') {\n drawProcessElement(sprite.graphics, data);\n } else {\n drawBoxElement(sprite.graphics, data);\n }\n\n // Update text\n sprite.labelText.text = data.label;\n if (sprite.descriptionText && data.description) {\n sprite.descriptionText.text = data.description;\n }\n\n // Update edge points positions\n sprite.edgePoints.forEach((edgePoint, side) => {\n let x = 0, y = 0;\n switch (side) {\n case 'top':\n x = data.size.width / 2;\n y = 0;\n break;\n case 'right':\n x = data.size.width;\n y = data.size.height / 2;\n break;\n case 'bottom':\n x = data.size.width / 2;\n y = data.size.height;\n break;\n case 'left':\n x = 0;\n y = data.size.height / 2;\n break;\n }\n edgePoint.position.set(x, y);\n });\n}\n\nexport function showEdgePoints(sprite: ElementSprite): void {\n sprite.edgePoints.forEach(edgePoint => {\n edgePoint.alpha = 1;\n });\n}\n\nexport function hideEdgePoints(sprite: ElementSprite): void {\n sprite.edgePoints.forEach(edgePoint => {\n edgePoint.alpha = 0;\n });\n}\n\nexport function setElementSelected(sprite: ElementSprite, selected: boolean): void {\n if (!sprite.selectionBorder) return;\n \n if (selected) {\n updateSelectionBorder(sprite);\n sprite.selectionBorder.alpha = 1;\n } else {\n sprite.selectionBorder.alpha = 0;\n }\n}\n\nfunction updateSelectionBorder(sprite: ElementSprite): void {\n if (!sprite.selectionBorder) return;\n \n const selectionBorder = sprite.selectionBorder;\n selectionBorder.clear();\n \n const borderWidth = 3;\n const offset = -borderWidth;\n \n // Get primary color from CSS variable with fallback\n const primaryColor = getComputedPrimaryColor();\n \n if (sprite.data.type === 'process') {\n const centerX = sprite.data.size.width / 2;\n const centerY = sprite.data.size.height / 2;\n const radius = Math.min(sprite.data.size.width, sprite.data.size.height) / 2 + borderWidth;\n \n selectionBorder.circle(centerX, centerY, radius);\n selectionBorder.stroke({ color: primaryColor, width: borderWidth });\n } else {\n selectionBorder.roundRect(\n offset, \n offset, \n sprite.data.size.width + borderWidth * 2, \n sprite.data.size.height + borderWidth * 2, \n BORDER_RADIUS + borderWidth\n );\n selectionBorder.stroke({ color: primaryColor, width: borderWidth });\n }\n}\n\nfunction getComputedPrimaryColor(): number {\n // Get the primary color from CSS custom properties\n const style = getComputedStyle(document.documentElement);\n const primaryColorStr = style.getPropertyValue('--primary-color').trim() || '#3B82F6';\n \n // Convert hex color string to number\n return parseInt(primaryColorStr.replace('#', ''), 16);\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from './EventModeling';
2
+ export * from './types';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../EventModeling/index.ts"],"names":[],"mappings":"AAGA,cAAc,iBAAiB,CAAC;AAChC,cAAc,SAAS,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { EventModeling } from './EventModeling.js';
2
+ export { DEFAULT_ELEMENT_SIZE, ELEMENT_COLORS, calculateOptimalEdges } from './types.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1,79 @@
1
+ export type ElementType = 'command' | 'event' | 'readmodel' | 'process';
2
+ export interface Position {
3
+ x: number;
4
+ y: number;
5
+ }
6
+ export interface Size {
7
+ width: number;
8
+ height: number;
9
+ }
10
+ export interface ElementData {
11
+ id: string;
12
+ type: ElementType;
13
+ position: Position;
14
+ size: Size;
15
+ label: string;
16
+ description?: string;
17
+ }
18
+ export type EdgeSide = 'top' | 'right' | 'bottom' | 'left';
19
+ export interface EdgePoint {
20
+ elementId: string;
21
+ side: EdgeSide;
22
+ }
23
+ export interface Connector {
24
+ id: string;
25
+ from: EdgePoint;
26
+ to: EdgePoint;
27
+ }
28
+ export interface EventModelingState {
29
+ elements: ElementData[];
30
+ connectors: Connector[];
31
+ selectedElementId?: string;
32
+ selectedConnectorId?: string;
33
+ }
34
+ export interface CanvasTransform {
35
+ x: number;
36
+ y: number;
37
+ scale: number;
38
+ }
39
+ export declare const ELEMENT_COLORS: {
40
+ readonly command: {
41
+ readonly background: 3900150;
42
+ readonly text: 16777215;
43
+ };
44
+ readonly event: {
45
+ readonly background: 16096779;
46
+ readonly text: 16777215;
47
+ };
48
+ readonly readmodel: {
49
+ readonly background: 1096065;
50
+ readonly text: 16777215;
51
+ };
52
+ readonly process: {
53
+ readonly fill: 7041664;
54
+ readonly stroke: 3621201;
55
+ };
56
+ };
57
+ export declare const DEFAULT_ELEMENT_SIZE: {
58
+ readonly command: {
59
+ readonly width: 200;
60
+ readonly height: 100;
61
+ };
62
+ readonly event: {
63
+ readonly width: 200;
64
+ readonly height: 100;
65
+ };
66
+ readonly readmodel: {
67
+ readonly width: 200;
68
+ readonly height: 100;
69
+ };
70
+ readonly process: {
71
+ readonly width: 80;
72
+ readonly height: 80;
73
+ };
74
+ };
75
+ export declare function calculateOptimalEdges(fromElement: ElementData, toElement: ElementData): {
76
+ fromSide: EdgeSide;
77
+ toSide: EdgeSide;
78
+ };
79
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../EventModeling/types.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,GAAG,SAAS,CAAC;AAExE,MAAM,WAAW,QAAQ;IACrB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,IAAI;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE3D,MAAM,WAAW,SAAS;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,QAAQ,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,SAAS,CAAC;IAChB,EAAE,EAAE,SAAS,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IAC/B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,eAAe;IAC5B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;CAiBjB,CAAC;AAEX,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;CAKvB,CAAC;AAMX,wBAAgB,qBAAqB,CACjC,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,WAAW,GACvB;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,QAAQ,CAAA;CAAE,CAqC1C"}