cx 26.0.14 → 26.1.1

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 (263) hide show
  1. package/build/ui/VDOM.d.ts +1 -20
  2. package/build/ui/VDOM.js +1 -3
  3. package/build/ui/Widget.d.ts +1 -1
  4. package/build/ui/Widget.js +0 -5
  5. package/build/ui/app/startAppLoop.js +2 -10
  6. package/build/util/Component.js +5 -0
  7. package/build/util/test/createTestRenderer.d.ts +3 -1
  8. package/build/util/test/createTestRenderer.js +8 -2
  9. package/build/widgets/form/Checkbox.d.ts +0 -1
  10. package/build/widgets/form/Checkbox.js +1 -0
  11. package/build/widgets/form/ColorField.d.ts +0 -1
  12. package/build/widgets/form/ColorField.js +2 -2
  13. package/build/widgets/form/DateTimeField.d.ts +0 -2
  14. package/build/widgets/form/DateTimeField.js +1 -0
  15. package/build/widgets/form/DateTimePicker.d.ts +0 -2
  16. package/build/widgets/form/DateTimePicker.js +1 -0
  17. package/build/widgets/form/Radio.d.ts +0 -1
  18. package/build/widgets/form/Slider.js +9 -1
  19. package/build/widgets/form/Switch.d.ts +0 -1
  20. package/build/widgets/form/Switch.js +1 -1
  21. package/build/widgets/form/Wheel.d.ts +0 -1
  22. package/build/widgets/grid/Grid.d.ts +0 -2
  23. package/build/widgets/grid/GridCellEditor.js +3 -1
  24. package/build/widgets/icons/calendar.js +4 -3
  25. package/build/widgets/icons/check.js +2 -2
  26. package/build/widgets/icons/clear.js +2 -2
  27. package/build/widgets/icons/close.js +2 -2
  28. package/build/widgets/icons/cx.js +2 -2
  29. package/build/widgets/icons/drop-down.js +2 -2
  30. package/build/widgets/icons/file.js +2 -2
  31. package/build/widgets/icons/folder-open.js +2 -2
  32. package/build/widgets/icons/folder.js +2 -2
  33. package/build/widgets/icons/forward.js +2 -2
  34. package/build/widgets/icons/loading.js +2 -2
  35. package/build/widgets/icons/menu.js +2 -2
  36. package/build/widgets/icons/pixel-picker.js +2 -2
  37. package/build/widgets/icons/search.js +2 -2
  38. package/build/widgets/icons/sort-asc.js +2 -2
  39. package/build/widgets/icons/square.js +2 -2
  40. package/build/widgets/overlay/Overlay.d.ts +3 -0
  41. package/build/widgets/overlay/Overlay.js +3 -2
  42. package/dist/manifest.js +867 -867
  43. package/dist/ui.js +4 -18
  44. package/dist/util.js +4 -0
  45. package/dist/widgets.js +395 -319
  46. package/package.json +11 -8
  47. package/src/charts/Chart.ts +108 -108
  48. package/src/core.d.ts +182 -182
  49. package/src/data/Expression.spec.ts +229 -229
  50. package/src/data/Expression.ts +233 -233
  51. package/src/data/Grouper.ts +158 -158
  52. package/src/data/Selector.ts +10 -10
  53. package/src/data/StringTemplate.spec.ts +132 -132
  54. package/src/data/StructuredSelector.ts +146 -146
  55. package/src/data/ZoomIntoPropertyView.spec.ts +64 -64
  56. package/src/data/comparer.ts +78 -78
  57. package/src/data/computable.spec.ts +87 -87
  58. package/src/data/createStructuredSelector.ts +62 -62
  59. package/src/data/getAccessor.spec.ts +11 -11
  60. package/src/data/getAccessor.ts +74 -74
  61. package/src/data/getSelector.spec.ts +43 -43
  62. package/src/data/getSelector.ts +66 -66
  63. package/src/data/ops/filter.spec.ts +35 -35
  64. package/src/data/ops/filter.ts +9 -9
  65. package/src/data/ops/merge.ts +13 -13
  66. package/src/data/ops/removeTreeNodes.spec.ts +37 -37
  67. package/src/data/ops/updateArray.spec.ts +69 -69
  68. package/src/data/ops/updateArray.ts +31 -31
  69. package/src/data/test-types.ts +7 -7
  70. package/src/hooks/invokeCallback.spec.tsx +4 -4
  71. package/src/hooks/resolveCallback.spec.tsx +4 -4
  72. package/src/hooks/store.spec.tsx +15 -15
  73. package/src/hooks/useTrigger.spec.tsx +16 -10
  74. package/src/hooks/useTrigger.ts +26 -26
  75. package/src/index.scss +6 -6
  76. package/src/jsx-runtime.ts +79 -79
  77. package/src/svg/BoundedObject.ts +101 -101
  78. package/src/svg/util/Rect.ts +105 -105
  79. package/src/ui/CSS.ts +87 -87
  80. package/src/ui/CSSHelper.ts +17 -17
  81. package/src/ui/ContentResolver.spec.tsx +31 -29
  82. package/src/ui/Controller.spec.tsx +47 -39
  83. package/src/ui/Culture.ts +159 -159
  84. package/src/ui/Cx.spec.tsx +10 -8
  85. package/src/ui/DataProxy.spec.tsx +18 -18
  86. package/src/ui/Instance.ts +866 -866
  87. package/src/ui/IsolatedScope.spec.tsx +16 -9
  88. package/src/ui/Prop.ts +140 -140
  89. package/src/ui/PureContainer.spec.tsx +20 -18
  90. package/src/ui/RenderingContext.ts +99 -99
  91. package/src/ui/Repeater.spec.tsx +8 -6
  92. package/src/ui/Rescope.spec.tsx +13 -13
  93. package/src/ui/Restate.spec.tsx +31 -27
  94. package/src/ui/StructuredInstanceDataAccessor.ts +32 -32
  95. package/src/ui/VDOM.ts +1 -34
  96. package/src/ui/Widget.tsx +0 -7
  97. package/src/ui/adapter/TreeAdapter.spec.ts +76 -76
  98. package/src/ui/adapter/TreeAdapter.ts +185 -185
  99. package/src/ui/app/History.ts +133 -133
  100. package/src/ui/app/Url.spec.ts +50 -50
  101. package/src/ui/app/startAppLoop.tsx +5 -9
  102. package/src/ui/app/startHotAppLoop.ts +41 -41
  103. package/src/ui/createFunctionalComponent.spec.tsx +20 -18
  104. package/src/ui/layout/ContentPlaceholder.spec.tsx +46 -34
  105. package/src/ui/layout/FirstVisibleChildLayout.spec.tsx +31 -19
  106. package/src/ui/layout/FirstVisibleChildLayout.ts +60 -60
  107. package/src/ui/selection/PropertySelection.ts +87 -87
  108. package/src/util/Component.spec.ts +30 -0
  109. package/src/util/Component.ts +301 -296
  110. package/src/util/Console.ts +13 -13
  111. package/src/util/DOM.ts +88 -88
  112. package/src/util/hasKey.ts +18 -18
  113. package/src/util/index.ts +55 -55
  114. package/src/util/isArray.ts +3 -3
  115. package/src/util/isDefined.ts +3 -3
  116. package/src/util/isString.ts +3 -3
  117. package/src/util/test/createTestRenderer.tsx +9 -2
  118. package/src/widgets/AccessorBindings.spec.tsx +4 -4
  119. package/src/widgets/DocumentTitle.ts +95 -95
  120. package/src/widgets/HtmlElement.spec.tsx +6 -6
  121. package/src/widgets/ReactElementWrapper.spec.tsx +37 -37
  122. package/src/widgets/autoFocus.ts +9 -9
  123. package/src/widgets/cx.ts +63 -63
  124. package/src/widgets/form/Checkbox.tsx +0 -1
  125. package/src/widgets/form/ColorField.tsx +15 -12
  126. package/src/widgets/form/DateTimeField.tsx +0 -2
  127. package/src/widgets/form/DateTimePicker.tsx +0 -2
  128. package/src/widgets/form/Radio.tsx +0 -1
  129. package/src/widgets/form/Slider.tsx +12 -4
  130. package/src/widgets/form/Switch.tsx +2 -3
  131. package/src/widgets/form/ValidationGroup.spec.tsx +12 -12
  132. package/src/widgets/form/Wheel.tsx +0 -1
  133. package/src/widgets/grid/Grid.tsx +0 -1
  134. package/src/widgets/grid/GridCellEditor.tsx +7 -1
  135. package/src/widgets/icons/calendar.tsx +20 -15
  136. package/src/widgets/icons/check.tsx +2 -1
  137. package/src/widgets/icons/clear.tsx +2 -1
  138. package/src/widgets/icons/close.tsx +2 -2
  139. package/src/widgets/icons/cx.tsx +2 -1
  140. package/src/widgets/icons/drop-down.tsx +2 -1
  141. package/src/widgets/icons/file.tsx +2 -1
  142. package/src/widgets/icons/folder-open.tsx +2 -1
  143. package/src/widgets/icons/folder.tsx +2 -1
  144. package/src/widgets/icons/forward.tsx +2 -1
  145. package/src/widgets/icons/loading.tsx +2 -1
  146. package/src/widgets/icons/menu.tsx +2 -1
  147. package/src/widgets/icons/pixel-picker.tsx +2 -2
  148. package/src/widgets/icons/search.tsx +2 -1
  149. package/src/widgets/icons/sort-asc.tsx +2 -1
  150. package/src/widgets/icons/square.tsx +2 -1
  151. package/src/widgets/nav/Route.spec.tsx +2 -2
  152. package/src/widgets/overlay/Overlay.tsx +5 -1
  153. package/src/widgets/overlay/captureMouse.ts +195 -195
  154. package/src/widgets/overlay/createHotPromiseWindowFactory.ts +71 -71
  155. package/src/widgets/overlay/index.d.ts +11 -11
  156. package/src/widgets/overlay/tooltip-ops.ts +173 -173
  157. package/build/data/ArrayElementView.spec.d.ts +0 -1
  158. package/build/data/ArrayElementView.spec.js +0 -81
  159. package/build/data/Binding.spec.d.ts +0 -1
  160. package/build/data/Binding.spec.js +0 -61
  161. package/build/data/Expression.spec.d.ts +0 -1
  162. package/build/data/Expression.spec.js +0 -196
  163. package/build/data/Grouper.spec.d.ts +0 -1
  164. package/build/data/Grouper.spec.js +0 -48
  165. package/build/data/Ref.spec.d.ts +0 -1
  166. package/build/data/Ref.spec.js +0 -72
  167. package/build/data/Store.spec.d.ts +0 -1
  168. package/build/data/Store.spec.js +0 -19
  169. package/build/data/StoreRef.spec.d.ts +0 -1
  170. package/build/data/StoreRef.spec.js +0 -22
  171. package/build/data/StringTemplate.spec.d.ts +0 -1
  172. package/build/data/StringTemplate.spec.js +0 -112
  173. package/build/data/StructuredSelector.spec.d.ts +0 -1
  174. package/build/data/StructuredSelector.spec.js +0 -102
  175. package/build/data/View.spec.d.ts +0 -1
  176. package/build/data/View.spec.js +0 -44
  177. package/build/data/ZoomIntoPropertyView.spec.d.ts +0 -1
  178. package/build/data/ZoomIntoPropertyView.spec.js +0 -54
  179. package/build/data/comparer.spec.d.ts +0 -1
  180. package/build/data/comparer.spec.js +0 -50
  181. package/build/data/computable.spec.d.ts +0 -1
  182. package/build/data/computable.spec.js +0 -56
  183. package/build/data/createAccessorModelProxy.spec.d.ts +0 -1
  184. package/build/data/createAccessorModelProxy.spec.js +0 -30
  185. package/build/data/createStructuredSelector.spec.d.ts +0 -1
  186. package/build/data/createStructuredSelector.spec.js +0 -42
  187. package/build/data/diff/diffs.spec.d.ts +0 -1
  188. package/build/data/diff/diffs.spec.js +0 -45
  189. package/build/data/getAccessor.spec.d.ts +0 -1
  190. package/build/data/getAccessor.spec.js +0 -10
  191. package/build/data/getSelector.spec.d.ts +0 -1
  192. package/build/data/getSelector.spec.js +0 -36
  193. package/build/data/ops/append.spec.d.ts +0 -1
  194. package/build/data/ops/append.spec.js +0 -24
  195. package/build/data/ops/filter.spec.d.ts +0 -1
  196. package/build/data/ops/filter.spec.js +0 -25
  197. package/build/data/ops/findTreeNode.spec.d.ts +0 -1
  198. package/build/data/ops/findTreeNode.spec.js +0 -20
  199. package/build/data/ops/merge.spec.d.ts +0 -1
  200. package/build/data/ops/merge.spec.js +0 -23
  201. package/build/data/ops/removeTreeNodes.spec.d.ts +0 -1
  202. package/build/data/ops/removeTreeNodes.spec.js +0 -35
  203. package/build/data/ops/updateArray.spec.d.ts +0 -1
  204. package/build/data/ops/updateArray.spec.js +0 -33
  205. package/build/data/ops/updateTree.spec.d.ts +0 -1
  206. package/build/data/ops/updateTree.spec.js +0 -44
  207. package/build/hooks/invokeCallback.spec.d.ts +0 -1
  208. package/build/hooks/invokeCallback.spec.js +0 -44
  209. package/build/hooks/resolveCallback.spec.d.ts +0 -1
  210. package/build/hooks/resolveCallback.spec.js +0 -35
  211. package/build/hooks/store.spec.d.ts +0 -1
  212. package/build/hooks/store.spec.js +0 -48
  213. package/build/hooks/useTrigger.spec.d.ts +0 -1
  214. package/build/hooks/useTrigger.spec.js +0 -59
  215. package/build/ui/Controller.spec.d.ts +0 -1
  216. package/build/ui/Controller.spec.js +0 -247
  217. package/build/ui/Cx.spec.d.ts +0 -1
  218. package/build/ui/Cx.spec.js +0 -153
  219. package/build/ui/DataProxy.spec.d.ts +0 -1
  220. package/build/ui/DataProxy.spec.js +0 -208
  221. package/build/ui/IsolatedScope.spec.d.ts +0 -1
  222. package/build/ui/IsolatedScope.spec.js +0 -42
  223. package/build/ui/PureContainer.spec.d.ts +0 -1
  224. package/build/ui/PureContainer.spec.js +0 -149
  225. package/build/ui/Repeater.spec.d.ts +0 -1
  226. package/build/ui/Repeater.spec.js +0 -109
  227. package/build/ui/Rescope.spec.d.ts +0 -1
  228. package/build/ui/Rescope.spec.js +0 -134
  229. package/build/ui/Restate.spec.d.ts +0 -1
  230. package/build/ui/Restate.spec.js +0 -257
  231. package/build/ui/adapter/ArrayAdapter.spec.d.ts +0 -1
  232. package/build/ui/adapter/ArrayAdapter.spec.js +0 -44
  233. package/build/ui/adapter/TreeAdapter.spec.d.ts +0 -1
  234. package/build/ui/adapter/TreeAdapter.spec.js +0 -71
  235. package/build/ui/app/Url.spec.d.ts +0 -1
  236. package/build/ui/app/Url.spec.js +0 -43
  237. package/build/ui/createFunctionalComponent.spec.d.ts +0 -1
  238. package/build/ui/createFunctionalComponent.spec.js +0 -272
  239. package/build/ui/layout/ContentPlaceholder.spec.d.ts +0 -1
  240. package/build/ui/layout/ContentPlaceholder.spec.js +0 -333
  241. package/build/ui/layout/FirstVisibleChildLayout.spec.d.ts +0 -1
  242. package/build/ui/layout/FirstVisibleChildLayout.spec.js +0 -101
  243. package/build/util/Format.spec.d.ts +0 -1
  244. package/build/util/Format.spec.js +0 -58
  245. package/build/util/TraversalStack.spec.d.ts +0 -1
  246. package/build/util/TraversalStack.spec.js +0 -43
  247. package/build/util/date/upperBoundCheck.spec.d.ts +0 -1
  248. package/build/util/date/upperBoundCheck.spec.js +0 -22
  249. package/build/util/getSearchQueryPredicate.spec.d.ts +0 -1
  250. package/build/util/getSearchQueryPredicate.spec.js +0 -33
  251. package/build/util/isValidIdentifierName.spec.d.ts +0 -1
  252. package/build/util/isValidIdentifierName.spec.js +0 -28
  253. package/build/util/routeAppend.spec.d.ts +0 -1
  254. package/build/util/routeAppend.spec.js +0 -14
  255. package/build/widgets/AccessorBindings.spec.d.ts +0 -1
  256. package/build/widgets/AccessorBindings.spec.js +0 -40
  257. package/build/widgets/HtmlElement.spec.d.ts +0 -1
  258. package/build/widgets/HtmlElement.spec.js +0 -38
  259. package/build/widgets/form/ValidationGroup.spec.d.ts +0 -1
  260. package/build/widgets/form/ValidationGroup.spec.js +0 -62
  261. package/build/widgets/nav/Route.spec.d.ts +0 -1
  262. package/build/widgets/nav/Route.spec.js +0 -15
  263. package/dist/manifest.d.ts +0 -1443
@@ -1,195 +1,195 @@
1
- import { batchUpdates } from "../../ui/batchUpdates";
2
- import { getParentFrameBoundingClientRect } from "../../util/getParentFrameBoundingClientRect";
3
-
4
- /** Cursor position with client coordinates */
5
- export interface CursorPosition {
6
- clientX: number;
7
- clientY: number;
8
- }
9
-
10
- /**
11
- * Configuration options for mouse capture
12
- */
13
- interface CaptureMouseOptions {
14
- /** Callback function called on mouse move events */
15
- onMouseMove?: (e: MouseEvent, captureData?: any) => void;
16
- /** Callback function called on mouse up events */
17
- onMouseUp?: (e: MouseEvent, captureData?: any) => void;
18
- /** Callback function called on double click events */
19
- onDblClick?: (e: MouseEvent) => void;
20
- /** Additional data passed to callbacks */
21
- captureData?: any;
22
- /** CSS cursor style for the capture surface */
23
- cursor?: string;
24
- }
25
-
26
- /**
27
- * Captures mouse events globally by creating a transparent overlay
28
- * @param e - The initial mouse event that triggered the capture
29
- * @param options - Configuration options for the capture behavior
30
- */
31
- export function captureMouse2(
32
- e: React.MouseEvent | React.TouchEvent | MouseEvent | TouchEvent,
33
- options: CaptureMouseOptions,
34
- ): void {
35
- let surface = document.createElement("div");
36
- surface.className = "cxb-mousecapture";
37
- surface.style.cursor = options.cursor || getComputedStyle(e.currentTarget as Element).cursor;
38
-
39
- document.body.appendChild(surface);
40
-
41
- // In case when the event originates from an iframe,
42
- // we use that document as events do not bubble up.
43
- let parentDocument = (e.target as Element)?.ownerDocument;
44
- let eventOptions = { capture: true };
45
-
46
- let active = true;
47
- parentDocument.addEventListener("mousemove", move, eventOptions);
48
- parentDocument.addEventListener("mouseup", end, eventOptions);
49
- if (options.onDblClick) parentDocument.addEventListener("dblclick", doubleClick, eventOptions);
50
-
51
- function tear() {
52
- if (surface == null) return;
53
- parentDocument.removeEventListener("mousemove", move, eventOptions);
54
- parentDocument.removeEventListener("mouseup", end, eventOptions);
55
- if (options.onDblClick) parentDocument.removeEventListener("dblclick", doubleClick, eventOptions);
56
- document.body.removeChild(surface);
57
- surface = null as any;
58
- }
59
-
60
- function doubleClick(e: Event) {
61
- try {
62
- options.onDblClick && options.onDblClick(e as MouseEvent);
63
- } finally {
64
- tear();
65
- }
66
- }
67
-
68
- e.stopPropagation();
69
-
70
- function move(e: Event) {
71
- if (!active) {
72
- tear();
73
- return;
74
- }
75
-
76
- //if mouse moves double clicking is off
77
- options.onDblClick = undefined;
78
-
79
- batchUpdates(() => {
80
- if (options.onMouseMove) options.onMouseMove(e as MouseEvent, options.captureData);
81
- e.stopPropagation();
82
- e.preventDefault(); //disable text selection
83
- });
84
- }
85
-
86
- function end(e: Event) {
87
- active = false;
88
- batchUpdates(() => {
89
- // if (surface.releaseCapture)
90
- // surface.releaseCapture();
91
-
92
- if (!options.onDblClick) surface.style.display = "none";
93
- try {
94
- if (options.onMouseUp) options.onMouseUp(e as MouseEvent, options.captureData);
95
- } finally {
96
- if (options.onDblClick) {
97
- //keep the surface a little longer to detect double clicks
98
- setTimeout(tear, 1500);
99
- } else tear();
100
- }
101
- });
102
- }
103
- }
104
-
105
- /**
106
- * Captures mouse or touch events, automatically detecting the event type
107
- * @param e - The initial mouse or touch event that triggered the capture
108
- * @param options - Configuration options for the capture behavior
109
- */
110
- export function captureMouseOrTouch2(
111
- e: React.MouseEvent | React.TouchEvent | MouseEvent | TouchEvent,
112
- options: CaptureMouseOptions,
113
- ): void {
114
- if (e.type.indexOf("touch") == 0) {
115
- let el = e.currentTarget as HTMLElement;
116
-
117
- let move = (e: TouchEvent) => {
118
- batchUpdates(() => {
119
- if (options.onMouseMove) options.onMouseMove(e as any, options.captureData);
120
- e.preventDefault();
121
- });
122
- };
123
-
124
- let end = (e: TouchEvent) => {
125
- batchUpdates(() => {
126
- el.removeEventListener("touchmove", move);
127
- el.removeEventListener("touchend", end);
128
-
129
- if (options.onMouseUp) options.onMouseUp(e as any);
130
-
131
- e.preventDefault();
132
- });
133
- };
134
-
135
- el.addEventListener("touchmove", move);
136
- el.addEventListener("touchend", end);
137
-
138
- e.stopPropagation();
139
- } else captureMouse2(e, options);
140
- }
141
-
142
- /**
143
- * Legacy function for capturing mouse events with individual parameters
144
- * @param e - The initial mouse event that triggered the capture
145
- * @param onMouseMove - Callback function called on mouse move events
146
- * @param onMouseUp - Callback function called on mouse up events
147
- * @param captureData - Additional data passed to callbacks
148
- * @param cursor - CSS cursor style for the capture surface
149
- */
150
- export function captureMouse(
151
- e: React.MouseEvent,
152
- onMouseMove?: (e: MouseEvent | TouchEvent, captureData?: any) => void,
153
- onMouseUp?: (e: MouseEvent | TouchEvent, captureData?: any) => void,
154
- captureData?: any,
155
- cursor?: string,
156
- ): void {
157
- captureMouse2(e, {
158
- onMouseMove,
159
- onMouseUp,
160
- captureData,
161
- cursor,
162
- });
163
- }
164
-
165
- /**
166
- * Legacy function for capturing mouse or touch events with individual parameters
167
- * @param e - The initial mouse or touch event that triggered the capture
168
- * @param onMouseMove - Callback function called on mouse/touch move events
169
- * @param onMouseUp - Callback function called on mouse/touch up events
170
- * @param captureData - Additional data passed to callbacks
171
- * @param cursor - CSS cursor style for the capture surface
172
- */
173
- export function captureMouseOrTouch(
174
- e: React.MouseEvent | React.TouchEvent | MouseEvent | TouchEvent,
175
- onMouseMove?: (e: MouseEvent, captureData?: any) => void,
176
- onMouseUp?: (e: MouseEvent, captureData?: any) => void,
177
- captureData?: any,
178
- cursor?: string,
179
- ): void {
180
- captureMouseOrTouch2(e, { onMouseMove, onMouseUp, captureData, cursor });
181
- }
182
-
183
- /**
184
- * Gets the cursor position relative to the parent frame
185
- * @param e - Mouse or touch event (React or native)
186
- * @returns Object with clientX and clientY coordinates adjusted for parent frame offset
187
- */
188
- export function getCursorPos(e: React.MouseEvent | React.TouchEvent | MouseEvent | TouchEvent): CursorPosition {
189
- let p = (e as TouchEvent).touches?.[0] || (e as MouseEvent);
190
- let offset = getParentFrameBoundingClientRect(e.target as Element);
191
- return {
192
- clientX: p.clientX + offset.left,
193
- clientY: p.clientY + offset.top,
194
- };
195
- }
1
+ import { batchUpdates } from "../../ui/batchUpdates";
2
+ import { getParentFrameBoundingClientRect } from "../../util/getParentFrameBoundingClientRect";
3
+
4
+ /** Cursor position with client coordinates */
5
+ export interface CursorPosition {
6
+ clientX: number;
7
+ clientY: number;
8
+ }
9
+
10
+ /**
11
+ * Configuration options for mouse capture
12
+ */
13
+ interface CaptureMouseOptions {
14
+ /** Callback function called on mouse move events */
15
+ onMouseMove?: (e: MouseEvent, captureData?: any) => void;
16
+ /** Callback function called on mouse up events */
17
+ onMouseUp?: (e: MouseEvent, captureData?: any) => void;
18
+ /** Callback function called on double click events */
19
+ onDblClick?: (e: MouseEvent) => void;
20
+ /** Additional data passed to callbacks */
21
+ captureData?: any;
22
+ /** CSS cursor style for the capture surface */
23
+ cursor?: string;
24
+ }
25
+
26
+ /**
27
+ * Captures mouse events globally by creating a transparent overlay
28
+ * @param e - The initial mouse event that triggered the capture
29
+ * @param options - Configuration options for the capture behavior
30
+ */
31
+ export function captureMouse2(
32
+ e: React.MouseEvent | React.TouchEvent | MouseEvent | TouchEvent,
33
+ options: CaptureMouseOptions,
34
+ ): void {
35
+ let surface = document.createElement("div");
36
+ surface.className = "cxb-mousecapture";
37
+ surface.style.cursor = options.cursor || getComputedStyle(e.currentTarget as Element).cursor;
38
+
39
+ document.body.appendChild(surface);
40
+
41
+ // In case when the event originates from an iframe,
42
+ // we use that document as events do not bubble up.
43
+ let parentDocument = (e.target as Element)?.ownerDocument;
44
+ let eventOptions = { capture: true };
45
+
46
+ let active = true;
47
+ parentDocument.addEventListener("mousemove", move, eventOptions);
48
+ parentDocument.addEventListener("mouseup", end, eventOptions);
49
+ if (options.onDblClick) parentDocument.addEventListener("dblclick", doubleClick, eventOptions);
50
+
51
+ function tear() {
52
+ if (surface == null) return;
53
+ parentDocument.removeEventListener("mousemove", move, eventOptions);
54
+ parentDocument.removeEventListener("mouseup", end, eventOptions);
55
+ if (options.onDblClick) parentDocument.removeEventListener("dblclick", doubleClick, eventOptions);
56
+ document.body.removeChild(surface);
57
+ surface = null as any;
58
+ }
59
+
60
+ function doubleClick(e: Event) {
61
+ try {
62
+ options.onDblClick && options.onDblClick(e as MouseEvent);
63
+ } finally {
64
+ tear();
65
+ }
66
+ }
67
+
68
+ e.stopPropagation();
69
+
70
+ function move(e: Event) {
71
+ if (!active) {
72
+ tear();
73
+ return;
74
+ }
75
+
76
+ //if mouse moves double clicking is off
77
+ options.onDblClick = undefined;
78
+
79
+ batchUpdates(() => {
80
+ if (options.onMouseMove) options.onMouseMove(e as MouseEvent, options.captureData);
81
+ e.stopPropagation();
82
+ e.preventDefault(); //disable text selection
83
+ });
84
+ }
85
+
86
+ function end(e: Event) {
87
+ active = false;
88
+ batchUpdates(() => {
89
+ // if (surface.releaseCapture)
90
+ // surface.releaseCapture();
91
+
92
+ if (!options.onDblClick) surface.style.display = "none";
93
+ try {
94
+ if (options.onMouseUp) options.onMouseUp(e as MouseEvent, options.captureData);
95
+ } finally {
96
+ if (options.onDblClick) {
97
+ //keep the surface a little longer to detect double clicks
98
+ setTimeout(tear, 1500);
99
+ } else tear();
100
+ }
101
+ });
102
+ }
103
+ }
104
+
105
+ /**
106
+ * Captures mouse or touch events, automatically detecting the event type
107
+ * @param e - The initial mouse or touch event that triggered the capture
108
+ * @param options - Configuration options for the capture behavior
109
+ */
110
+ export function captureMouseOrTouch2(
111
+ e: React.MouseEvent | React.TouchEvent | MouseEvent | TouchEvent,
112
+ options: CaptureMouseOptions,
113
+ ): void {
114
+ if (e.type.indexOf("touch") == 0) {
115
+ let el = e.currentTarget as HTMLElement;
116
+
117
+ let move = (e: TouchEvent) => {
118
+ batchUpdates(() => {
119
+ if (options.onMouseMove) options.onMouseMove(e as any, options.captureData);
120
+ e.preventDefault();
121
+ });
122
+ };
123
+
124
+ let end = (e: TouchEvent) => {
125
+ batchUpdates(() => {
126
+ el.removeEventListener("touchmove", move);
127
+ el.removeEventListener("touchend", end);
128
+
129
+ if (options.onMouseUp) options.onMouseUp(e as any);
130
+
131
+ e.preventDefault();
132
+ });
133
+ };
134
+
135
+ el.addEventListener("touchmove", move);
136
+ el.addEventListener("touchend", end);
137
+
138
+ e.stopPropagation();
139
+ } else captureMouse2(e, options);
140
+ }
141
+
142
+ /**
143
+ * Legacy function for capturing mouse events with individual parameters
144
+ * @param e - The initial mouse event that triggered the capture
145
+ * @param onMouseMove - Callback function called on mouse move events
146
+ * @param onMouseUp - Callback function called on mouse up events
147
+ * @param captureData - Additional data passed to callbacks
148
+ * @param cursor - CSS cursor style for the capture surface
149
+ */
150
+ export function captureMouse(
151
+ e: React.MouseEvent,
152
+ onMouseMove?: (e: MouseEvent | TouchEvent, captureData?: any) => void,
153
+ onMouseUp?: (e: MouseEvent | TouchEvent, captureData?: any) => void,
154
+ captureData?: any,
155
+ cursor?: string,
156
+ ): void {
157
+ captureMouse2(e, {
158
+ onMouseMove,
159
+ onMouseUp,
160
+ captureData,
161
+ cursor,
162
+ });
163
+ }
164
+
165
+ /**
166
+ * Legacy function for capturing mouse or touch events with individual parameters
167
+ * @param e - The initial mouse or touch event that triggered the capture
168
+ * @param onMouseMove - Callback function called on mouse/touch move events
169
+ * @param onMouseUp - Callback function called on mouse/touch up events
170
+ * @param captureData - Additional data passed to callbacks
171
+ * @param cursor - CSS cursor style for the capture surface
172
+ */
173
+ export function captureMouseOrTouch(
174
+ e: React.MouseEvent | React.TouchEvent | MouseEvent | TouchEvent,
175
+ onMouseMove?: (e: MouseEvent, captureData?: any) => void,
176
+ onMouseUp?: (e: MouseEvent, captureData?: any) => void,
177
+ captureData?: any,
178
+ cursor?: string,
179
+ ): void {
180
+ captureMouseOrTouch2(e, { onMouseMove, onMouseUp, captureData, cursor });
181
+ }
182
+
183
+ /**
184
+ * Gets the cursor position relative to the parent frame
185
+ * @param e - Mouse or touch event (React or native)
186
+ * @returns Object with clientX and clientY coordinates adjusted for parent frame offset
187
+ */
188
+ export function getCursorPos(e: React.MouseEvent | React.TouchEvent | MouseEvent | TouchEvent): CursorPosition {
189
+ let p = (e as TouchEvent).touches?.[0] || (e as MouseEvent);
190
+ let offset = getParentFrameBoundingClientRect(e.target as Element);
191
+ return {
192
+ clientX: p.clientX + offset.left,
193
+ clientY: p.clientY + offset.top,
194
+ };
195
+ }
@@ -1,71 +1,71 @@
1
- import { Store } from "../../data/Store";
2
- import { HotModule } from "../../ui/app/startHotAppLoop";
3
- import { SubscriberList } from "../../util/SubscriberList";
4
- import { Window } from "./Window";
5
- import { View } from "../../data/View";
6
- import { Instance } from "../../ui/Instance";
7
- import { Overlay } from "./Overlay";
8
-
9
- export interface HotPromiseWindowFactoryOptions {
10
- parent?: Instance;
11
- store?: View;
12
- }
13
-
14
- export function createHotPromiseWindowFactoryWithProps<Props, R = any>(
15
- module: HotModule,
16
- factory: (props: Props) => (resolve: (value: R | PromiseLike<R>) => void, reject: (reason?: any) => void) => Overlay,
17
- ): (props: Props, options?: HotPromiseWindowFactoryOptions) => Promise<R> {
18
- let subscriberList: SubscriberList | undefined;
19
- if (module.hot) {
20
- if (module.hot.data?.subscriberList) subscriberList = module.hot.data.subscriberList;
21
- if (!subscriberList) subscriberList = new SubscriberList();
22
-
23
- module.hot.dispose((data: any) => {
24
- data.subscriberList = subscriberList;
25
- });
26
-
27
- module.hot.accept();
28
-
29
- if (!subscriberList.isEmpty()) subscriberList.notify(factory);
30
-
31
- subscriberList.subscribe((updatedFactory) => {
32
- factory = updatedFactory;
33
- });
34
- }
35
-
36
- return (props: Props, options?: HotPromiseWindowFactoryOptions): Promise<R> => {
37
- let store = options?.parent ?? options?.store ?? new Store();
38
- let reloading = false;
39
- return new Promise<R>((resolve, reject) => {
40
- let dismiss: (() => void) | undefined;
41
- let unsubscribe: (() => void) | undefined;
42
- function rerun() {
43
- dismiss?.();
44
- let window = Window.create(factory(props)(resolve, reject) as any) as any;
45
- window.overlayWillDismiss = () => {
46
- if (!reloading && unsubscribe) unsubscribe();
47
- };
48
- dismiss = window.open(store);
49
- }
50
- unsubscribe = subscriberList?.subscribe((updatedFactory: any) => {
51
- factory = updatedFactory;
52
- setTimeout(() => {
53
- // timeout is required for proper module initialization
54
- // sometimes elements are defined in the lower part of the module and if the function is run immediately, it will fail
55
- reloading = true;
56
- rerun();
57
- reloading = false;
58
- }, 10);
59
- });
60
- rerun();
61
- });
62
- };
63
- }
64
-
65
- export function createHotPromiseWindowFactory<R = any>(
66
- module: HotModule,
67
- factory: (resolve: (value: R | PromiseLike<R>) => void, reject: (reason?: any) => void) => Overlay,
68
- ): (options?: HotPromiseWindowFactoryOptions) => Promise<R> {
69
- let result = createHotPromiseWindowFactoryWithProps(module, () => factory);
70
- return (options?: HotPromiseWindowFactoryOptions) => result(null, options);
71
- }
1
+ import { Store } from "../../data/Store";
2
+ import { HotModule } from "../../ui/app/startHotAppLoop";
3
+ import { SubscriberList } from "../../util/SubscriberList";
4
+ import { Window } from "./Window";
5
+ import { View } from "../../data/View";
6
+ import { Instance } from "../../ui/Instance";
7
+ import { Overlay } from "./Overlay";
8
+
9
+ export interface HotPromiseWindowFactoryOptions {
10
+ parent?: Instance;
11
+ store?: View;
12
+ }
13
+
14
+ export function createHotPromiseWindowFactoryWithProps<Props, R = any>(
15
+ module: HotModule,
16
+ factory: (props: Props) => (resolve: (value: R | PromiseLike<R>) => void, reject: (reason?: any) => void) => Overlay,
17
+ ): (props: Props, options?: HotPromiseWindowFactoryOptions) => Promise<R> {
18
+ let subscriberList: SubscriberList | undefined;
19
+ if (module.hot) {
20
+ if (module.hot.data?.subscriberList) subscriberList = module.hot.data.subscriberList;
21
+ if (!subscriberList) subscriberList = new SubscriberList();
22
+
23
+ module.hot.dispose((data: any) => {
24
+ data.subscriberList = subscriberList;
25
+ });
26
+
27
+ module.hot.accept();
28
+
29
+ if (!subscriberList.isEmpty()) subscriberList.notify(factory);
30
+
31
+ subscriberList.subscribe((updatedFactory) => {
32
+ factory = updatedFactory;
33
+ });
34
+ }
35
+
36
+ return (props: Props, options?: HotPromiseWindowFactoryOptions): Promise<R> => {
37
+ let store = options?.parent ?? options?.store ?? new Store();
38
+ let reloading = false;
39
+ return new Promise<R>((resolve, reject) => {
40
+ let dismiss: (() => void) | undefined;
41
+ let unsubscribe: (() => void) | undefined;
42
+ function rerun() {
43
+ dismiss?.();
44
+ let window = Window.create(factory(props)(resolve, reject) as any) as any;
45
+ window.overlayWillDismiss = () => {
46
+ if (!reloading && unsubscribe) unsubscribe();
47
+ };
48
+ dismiss = window.open(store);
49
+ }
50
+ unsubscribe = subscriberList?.subscribe((updatedFactory: any) => {
51
+ factory = updatedFactory;
52
+ setTimeout(() => {
53
+ // timeout is required for proper module initialization
54
+ // sometimes elements are defined in the lower part of the module and if the function is run immediately, it will fail
55
+ reloading = true;
56
+ rerun();
57
+ reloading = false;
58
+ }, 10);
59
+ });
60
+ rerun();
61
+ });
62
+ };
63
+ }
64
+
65
+ export function createHotPromiseWindowFactory<R = any>(
66
+ module: HotModule,
67
+ factory: (resolve: (value: R | PromiseLike<R>) => void, reject: (reason?: any) => void) => Overlay,
68
+ ): (options?: HotPromiseWindowFactoryOptions) => Promise<R> {
69
+ let result = createHotPromiseWindowFactoryWithProps(module, () => factory);
70
+ return (options?: HotPromiseWindowFactoryOptions) => result(null, options);
71
+ }
@@ -1,11 +1,11 @@
1
- export * from "./Overlay";
2
- export * from "./Dropdown";
3
- export * from "./tooltip-ops";
4
- export * from "./Tooltip";
5
- export * from "./Window";
6
- export * from "./MsgBox";
7
- export * from "./Toast";
8
- export * from "./captureMouse";
9
- export * from "./ContextMenu";
10
- export * from "./FlyweightTooltipTracker";
11
- export * from "./createHotPromiseWindowFactory";
1
+ export * from "./Overlay";
2
+ export * from "./Dropdown";
3
+ export * from "./tooltip-ops";
4
+ export * from "./Tooltip";
5
+ export * from "./Window";
6
+ export * from "./MsgBox";
7
+ export * from "./Toast";
8
+ export * from "./captureMouse";
9
+ export * from "./ContextMenu";
10
+ export * from "./FlyweightTooltipTracker";
11
+ export * from "./createHotPromiseWindowFactory";