@ankhorage/studio 0.10.9 → 0.11.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 (63) hide show
  1. package/README.md +1 -1
  2. package/dist/host/layout/layoutGenerator.d.ts.map +1 -1
  3. package/dist/host/layout/layoutGenerator.js +10 -2
  4. package/dist/host/layout/layoutGenerator.js.map +1 -1
  5. package/dist/host/layout/templates/rootLayout.d.ts.map +1 -1
  6. package/dist/host/layout/templates/rootLayout.js +68 -106
  7. package/dist/host/layout/templates/rootLayout.js.map +1 -1
  8. package/dist/host/orchestrator/expoSdk54AnimationCompatibility.d.ts +7 -0
  9. package/dist/host/orchestrator/expoSdk54AnimationCompatibility.d.ts.map +1 -0
  10. package/dist/host/orchestrator/expoSdk54AnimationCompatibility.js +7 -0
  11. package/dist/host/orchestrator/expoSdk54AnimationCompatibility.js.map +1 -0
  12. package/dist/host/orchestrator/generatedAppFiles.d.ts +4 -0
  13. package/dist/host/orchestrator/generatedAppFiles.d.ts.map +1 -1
  14. package/dist/host/orchestrator/generatedAppFiles.js +16 -1
  15. package/dist/host/orchestrator/generatedAppFiles.js.map +1 -1
  16. package/dist/host/orchestrator/templates.d.ts +2 -2
  17. package/dist/host/orchestrator/templates.d.ts.map +1 -1
  18. package/dist/host/orchestrator/templates.js +5 -4
  19. package/dist/host/orchestrator/templates.js.map +1 -1
  20. package/dist/host/zoraExtensions/index.d.ts +1 -0
  21. package/dist/host/zoraExtensions/index.d.ts.map +1 -1
  22. package/dist/host/zoraExtensions/index.js.map +1 -1
  23. package/dist/runtime/appExtensionRegistry.d.ts +6 -0
  24. package/dist/runtime/appExtensionRegistry.d.ts.map +1 -1
  25. package/dist/runtime/appExtensionRegistry.js +6 -0
  26. package/dist/runtime/appExtensionRegistry.js.map +1 -1
  27. package/dist/runtime/index.d.ts +4 -0
  28. package/dist/runtime/index.d.ts.map +1 -1
  29. package/dist/runtime/index.js +4 -0
  30. package/dist/runtime/index.js.map +1 -1
  31. package/dist/runtime/indicatorRefreshCoordinator.d.ts +11 -0
  32. package/dist/runtime/indicatorRefreshCoordinator.d.ts.map +1 -0
  33. package/dist/runtime/indicatorRefreshCoordinator.js +26 -0
  34. package/dist/runtime/indicatorRefreshCoordinator.js.map +1 -0
  35. package/dist/runtime/indicatorSettleCoordinator.d.ts +20 -0
  36. package/dist/runtime/indicatorSettleCoordinator.d.ts.map +1 -0
  37. package/dist/runtime/indicatorSettleCoordinator.js +78 -0
  38. package/dist/runtime/indicatorSettleCoordinator.js.map +1 -0
  39. package/dist/runtime/interactionPolicy.d.ts +10 -0
  40. package/dist/runtime/interactionPolicy.d.ts.map +1 -0
  41. package/dist/runtime/interactionPolicy.js +15 -0
  42. package/dist/runtime/interactionPolicy.js.map +1 -0
  43. package/dist/runtime/interactionPolicyCore.d.ts +27 -0
  44. package/dist/runtime/interactionPolicyCore.d.ts.map +1 -0
  45. package/dist/runtime/interactionPolicyCore.js +46 -0
  46. package/dist/runtime/interactionPolicyCore.js.map +1 -0
  47. package/dist/runtime/previewRuntimeConfig.d.ts +3 -0
  48. package/dist/runtime/previewRuntimeConfig.d.ts.map +1 -1
  49. package/dist/runtime/previewRuntimeConfig.js +6 -0
  50. package/dist/runtime/previewRuntimeConfig.js.map +1 -1
  51. package/dist/runtime/stationarySelection.d.ts +27 -0
  52. package/dist/runtime/stationarySelection.d.ts.map +1 -0
  53. package/dist/runtime/stationarySelection.js +470 -0
  54. package/dist/runtime/stationarySelection.js.map +1 -0
  55. package/dist/runtime/stationarySelectionCoordinator.d.ts +21 -0
  56. package/dist/runtime/stationarySelectionCoordinator.d.ts.map +1 -0
  57. package/dist/runtime/stationarySelectionCoordinator.js +84 -0
  58. package/dist/runtime/stationarySelectionCoordinator.js.map +1 -0
  59. package/dist/runtime/stationarySelectionInputState.d.ts +26 -0
  60. package/dist/runtime/stationarySelectionInputState.d.ts.map +1 -0
  61. package/dist/runtime/stationarySelectionInputState.js +56 -0
  62. package/dist/runtime/stationarySelectionInputState.js.map +1 -0
  63. package/package.json +4 -3
@@ -0,0 +1,470 @@
1
+ import { ZORA_COMPONENT_REGISTRY } from '@ankhorage/zora';
2
+ import React from 'react';
3
+ import { Platform, View, } from 'react-native';
4
+ import { Gesture, GestureDetector } from 'react-native-gesture-handler';
5
+ import { createIndicatorRefreshCoordinator, } from './indicatorRefreshCoordinator.js';
6
+ import { createIndicatorSettleCoordinator, } from './indicatorSettleCoordinator.js';
7
+ import { createStationarySelectionCoordinator } from './stationarySelectionCoordinator.js';
8
+ import { createStationarySelectionInputState, } from './stationarySelectionInputState.js';
9
+ const TrackerContext = React.createContext(null);
10
+ const NATIVE_SETTLE_INTERVAL_MS = 60;
11
+ const NATIVE_SETTLE_MAX_SAMPLES = 80;
12
+ const NATIVE_SETTLE_STABLE_SAMPLE_COUNT = 3;
13
+ const UnsupportedNodeMeasurementContext = React.createContext(null);
14
+ function isWebElementLike(value) {
15
+ return (typeof value === 'object' &&
16
+ value !== null &&
17
+ 'children' in value &&
18
+ 'getBoundingClientRect' in value &&
19
+ typeof value.getBoundingClientRect === 'function');
20
+ }
21
+ function getWebResizeTarget(value) {
22
+ return Platform.OS === 'web' && isWebElementLike(value) ? value : null;
23
+ }
24
+ function getWebDescendantResizeTargets(value) {
25
+ if (Platform.OS !== 'web' || !isWebElementLike(value)) {
26
+ return [];
27
+ }
28
+ return Array.from(value.children).flatMap((child) => [
29
+ child,
30
+ ...getWebDescendantResizeTargets(child),
31
+ ]);
32
+ }
33
+ function toMeasuredRect(rect) {
34
+ return {
35
+ x: rect.left,
36
+ y: rect.top,
37
+ width: rect.width,
38
+ height: rect.height,
39
+ };
40
+ }
41
+ function unionRects(rects) {
42
+ if (rects.length === 0) {
43
+ return null;
44
+ }
45
+ const left = Math.min(...rects.map((rect) => rect.x));
46
+ const top = Math.min(...rects.map((rect) => rect.y));
47
+ const right = Math.max(...rects.map((rect) => rect.x + rect.width));
48
+ const bottom = Math.max(...rects.map((rect) => rect.y + rect.height));
49
+ return {
50
+ x: left,
51
+ y: top,
52
+ width: right - left,
53
+ height: bottom - top,
54
+ };
55
+ }
56
+ function measureRenderedBoxes(element) {
57
+ const rect = toMeasuredRect(element.getBoundingClientRect());
58
+ if (rect.width > 0 && rect.height > 0) {
59
+ return [rect];
60
+ }
61
+ return Array.from(element.children).flatMap((child) => measureRenderedBoxes(child));
62
+ }
63
+ function measureNativeView(view) {
64
+ return new Promise((resolve) => {
65
+ view.measureInWindow((x, y, width, height) => {
66
+ resolve(width > 0 && height > 0 ? { x, y, width, height } : null);
67
+ });
68
+ });
69
+ }
70
+ function measureRootView(view) {
71
+ if (!view) {
72
+ return Promise.resolve(null);
73
+ }
74
+ if (Platform.OS === 'web' && isWebElementLike(view)) {
75
+ return Promise.resolve(toMeasuredRect(view.getBoundingClientRect()));
76
+ }
77
+ return measureNativeView(view);
78
+ }
79
+ function measureUnsupportedWebView(view) {
80
+ if (!view) {
81
+ return Promise.resolve(null);
82
+ }
83
+ if (isWebElementLike(view)) {
84
+ return Promise.resolve(unionRects(Array.from(view.children).flatMap((child) => measureRenderedBoxes(child))));
85
+ }
86
+ return Promise.resolve(null);
87
+ }
88
+ function areIndicatorRectsEqual(left, right) {
89
+ if (left.length !== right.length) {
90
+ return false;
91
+ }
92
+ return left.every((rect, index) => {
93
+ const candidate = right[index];
94
+ if (!candidate) {
95
+ return false;
96
+ }
97
+ return (rect.nodeId === candidate.nodeId &&
98
+ Math.abs(rect.x - candidate.x) < 0.5 &&
99
+ Math.abs(rect.y - candidate.y) < 0.5 &&
100
+ Math.abs(rect.width - candidate.width) < 0.5 &&
101
+ Math.abs(rect.height - candidate.height) < 0.5);
102
+ });
103
+ }
104
+ export function useStudioUnsupportedNodeMeasurement() {
105
+ const context = React.useContext(UnsupportedNodeMeasurementContext);
106
+ const unregisterRef = React.useRef(null);
107
+ const setViewRef = React.useCallback((view) => {
108
+ unregisterRef.current?.();
109
+ unregisterRef.current = view && context ? context.registerView(view) : null;
110
+ }, [context]);
111
+ React.useEffect(() => () => {
112
+ unregisterRef.current?.();
113
+ unregisterRef.current = null;
114
+ }, []);
115
+ const onLayout = React.useCallback((_event) => {
116
+ context?.requestRefresh();
117
+ }, [context]);
118
+ return React.useMemo(() => ({ onLayout, ref: setViewRef }), [onLayout, setViewRef]);
119
+ }
120
+ function StudioNodeTouchRecorder(props) {
121
+ const ctx = React.useContext(TrackerContext);
122
+ const nodeIdRef = React.useRef(props.nodeId);
123
+ const unregisterMeasurementRef = React.useRef(null);
124
+ nodeIdRef.current = props.nodeId;
125
+ function recordInteraction(input) {
126
+ if (!ctx) {
127
+ return;
128
+ }
129
+ const nodeId = nodeIdRef.current;
130
+ if (!nodeId) {
131
+ return;
132
+ }
133
+ ctx.recordNode(nodeId, input);
134
+ }
135
+ function handlePointerDown(event) {
136
+ recordInteraction({
137
+ kind: 'pointer',
138
+ button: event.nativeEvent.button,
139
+ interactionId: event.timeStamp,
140
+ isPrimary: event.nativeEvent.isPrimary,
141
+ pointerId: event.nativeEvent.pointerId,
142
+ pointerType: event.nativeEvent.pointerType,
143
+ });
144
+ }
145
+ function handleTouchStart(event) {
146
+ const [changedTouch] = event.nativeEvent.changedTouches;
147
+ recordInteraction({
148
+ kind: 'touch',
149
+ interactionId: event.nativeEvent.timestamp,
150
+ touchId: changedTouch?.identifier ?? event.nativeEvent.identifier,
151
+ });
152
+ }
153
+ function handleInteractionCompletion() {
154
+ ctx?.completePendingInteraction();
155
+ }
156
+ function handleLayout(_event) {
157
+ ctx?.requestIndicatorRefresh();
158
+ }
159
+ const setViewRef = React.useCallback((view) => {
160
+ unregisterMeasurementRef.current?.();
161
+ unregisterMeasurementRef.current = null;
162
+ if (Platform.OS === 'web' && view && ctx && props.nodeId && props.showUnsupportedIndicator) {
163
+ unregisterMeasurementRef.current = ctx.registerUnsupportedNode(props.nodeId, {
164
+ measure: () => measureUnsupportedWebView(view),
165
+ resizeTargets: getWebDescendantResizeTargets(view),
166
+ });
167
+ }
168
+ }, [ctx, props.nodeId, props.showUnsupportedIndicator]);
169
+ const nativeMeasurementContext = React.useMemo(() => {
170
+ const { nodeId } = props;
171
+ if (Platform.OS === 'web' || !ctx || !nodeId || !props.showUnsupportedIndicator) {
172
+ return null;
173
+ }
174
+ return {
175
+ registerView: (view) => ctx.registerUnsupportedNode(nodeId, {
176
+ measure: () => measureNativeView(view),
177
+ resizeTargets: [],
178
+ }),
179
+ requestRefresh: ctx.requestIndicatorRefresh,
180
+ };
181
+ }, [ctx, props.nodeId, props.showUnsupportedIndicator]);
182
+ return React.createElement(UnsupportedNodeMeasurementContext.Provider, { value: nativeMeasurementContext }, React.createElement(View, {
183
+ ref: setViewRef,
184
+ nativeID: Platform.OS === 'web' && props.nodeId
185
+ ? `studio-runtime-node-${encodeURIComponent(props.nodeId)}`
186
+ : undefined,
187
+ testID: Platform.OS === 'web' && props.nodeId && props.showUnsupportedIndicator
188
+ ? `studio-unsupported-recorder-${props.nodeId}`
189
+ : undefined,
190
+ style: { display: 'contents' },
191
+ onLayout: handleLayout,
192
+ onPointerCancel: handleInteractionCompletion,
193
+ onPointerDown: handlePointerDown,
194
+ onPointerUp: handleInteractionCompletion,
195
+ onTouchCancel: handleInteractionCompletion,
196
+ onTouchEnd: handleInteractionCompletion,
197
+ onTouchStart: handleTouchStart,
198
+ }, props.children));
199
+ }
200
+ export function createStudioStationarySelectionWrapNode(options) {
201
+ const { previewMode, thirdPartySupport } = options ?? {};
202
+ const isEditMode = previewMode !== true;
203
+ return function wrapNode(args) {
204
+ if (args.isRoot || !args.node.id) {
205
+ return args.rendered;
206
+ }
207
+ const isSupported = Object.prototype.hasOwnProperty.call(ZORA_COMPONENT_REGISTRY, args.node.type) ||
208
+ (thirdPartySupport != null &&
209
+ Object.prototype.hasOwnProperty.call(thirdPartySupport, args.node.type) &&
210
+ thirdPartySupport[args.node.type] === true);
211
+ return React.createElement(StudioNodeTouchRecorder, {
212
+ nodeId: args.node.id,
213
+ showUnsupportedIndicator: isEditMode && !isSupported,
214
+ children: args.rendered,
215
+ });
216
+ };
217
+ }
218
+ function StationaryTapSelector(props) {
219
+ const coordinatorRef = React.useRef(null);
220
+ const rootViewRef = React.useRef(null);
221
+ const unsupportedNodesRef = React.useRef(new Map());
222
+ const resizeObserverRef = React.useRef(null);
223
+ const [indicatorRects, setIndicatorRects] = React.useState([]);
224
+ const latestIndicatorRectsRef = React.useRef([]);
225
+ coordinatorRef.current ??= createStationarySelectionCoordinator();
226
+ const coordinator = coordinatorRef.current;
227
+ const isEditModeRef = React.useRef(props.isEditMode);
228
+ const selectedNodeIdRef = React.useRef(props.selectedNodeId);
229
+ const selectNodeRef = React.useRef(props.selectNode);
230
+ const selectionCommitCountRef = React.useRef(0);
231
+ const generationRef = React.useRef(0);
232
+ const inputStateRef = React.useRef(null);
233
+ const refreshCoordinatorRef = React.useRef(null);
234
+ const settleCoordinatorRef = React.useRef(null);
235
+ const refreshIndicatorRectsRef = React.useRef(() => Promise.resolve(null));
236
+ const geometryRevisionRef = React.useRef(0);
237
+ const mountedRef = React.useRef(true);
238
+ isEditModeRef.current = props.isEditMode;
239
+ selectedNodeIdRef.current = props.selectedNodeId;
240
+ selectNodeRef.current = props.selectNode;
241
+ inputStateRef.current ??= createStationarySelectionInputState({
242
+ hasActiveTransaction: () => generationRef.current !== 0,
243
+ recordActiveNode: (nodeId) => {
244
+ coordinator.recordNode(nodeId, generationRef.current);
245
+ },
246
+ });
247
+ const inputState = inputStateRef.current;
248
+ const requestIndicatorRefresh = React.useCallback(() => {
249
+ refreshCoordinatorRef.current ??= createIndicatorRefreshCoordinator(() => {
250
+ void refreshIndicatorRectsRef.current();
251
+ }, {
252
+ request: (callback) => requestAnimationFrame(callback),
253
+ cancel: (frameId) => cancelAnimationFrame(frameId),
254
+ });
255
+ refreshCoordinatorRef.current.requestRefresh();
256
+ }, []);
257
+ const requestScrollIndicatorRefresh = React.useCallback(() => {
258
+ requestIndicatorRefresh();
259
+ if (Platform.OS === 'web' || !isEditModeRef.current || unsupportedNodesRef.current.size === 0) {
260
+ return;
261
+ }
262
+ settleCoordinatorRef.current ??= createIndicatorSettleCoordinator({
263
+ areEqual: areIndicatorRectsEqual,
264
+ intervalMs: NATIVE_SETTLE_INTERVAL_MS,
265
+ maxSamples: NATIVE_SETTLE_MAX_SAMPLES,
266
+ sample: () => refreshIndicatorRectsRef.current(),
267
+ scheduler: {
268
+ cancel: (handle) => clearTimeout(handle),
269
+ schedule: (callback, delayMs) => setTimeout(callback, delayMs),
270
+ },
271
+ stableSampleCount: NATIVE_SETTLE_STABLE_SAMPLE_COUNT,
272
+ });
273
+ settleCoordinatorRef.current.trigger();
274
+ }, [requestIndicatorRefresh]);
275
+ const registerUnsupportedNode = React.useCallback((nodeId, measurement) => {
276
+ const measurements = unsupportedNodesRef.current.get(nodeId) ?? new Set();
277
+ measurements.add(measurement);
278
+ unsupportedNodesRef.current.set(nodeId, measurements);
279
+ for (const resizeTarget of measurement.resizeTargets) {
280
+ resizeObserverRef.current?.observe(resizeTarget);
281
+ }
282
+ requestIndicatorRefresh();
283
+ return () => {
284
+ const registeredMeasurements = unsupportedNodesRef.current.get(nodeId);
285
+ if (!registeredMeasurements?.delete(measurement)) {
286
+ return;
287
+ }
288
+ for (const resizeTarget of measurement.resizeTargets) {
289
+ resizeObserverRef.current?.unobserve(resizeTarget);
290
+ }
291
+ if (registeredMeasurements.size === 0) {
292
+ unsupportedNodesRef.current.delete(nodeId);
293
+ }
294
+ if (unsupportedNodesRef.current.size === 0) {
295
+ settleCoordinatorRef.current?.cancel();
296
+ }
297
+ requestIndicatorRefresh();
298
+ };
299
+ }, [requestIndicatorRefresh]);
300
+ const contextValue = React.useMemo(() => ({
301
+ completePendingInteraction: () => inputState.completePendingInteraction(),
302
+ recordNode: (nodeId, input) => {
303
+ inputState.recordNode(nodeId, input);
304
+ },
305
+ registerUnsupportedNode,
306
+ requestIndicatorRefresh,
307
+ requestScrollIndicatorRefresh,
308
+ }), [inputState, registerUnsupportedNode, requestIndicatorRefresh, requestScrollIndicatorRefresh]);
309
+ const refreshIndicatorRects = React.useCallback(async () => {
310
+ const geometryRevision = ++geometryRevisionRef.current;
311
+ if (!isEditModeRef.current || unsupportedNodesRef.current.size === 0) {
312
+ latestIndicatorRectsRef.current = [];
313
+ setIndicatorRects((current) => (current.length === 0 ? current : []));
314
+ return null;
315
+ }
316
+ const rootRect = await measureRootView(rootViewRef.current);
317
+ if (!rootRect) {
318
+ return latestIndicatorRectsRef.current;
319
+ }
320
+ const measurements = await Promise.all([...unsupportedNodesRef.current.entries()].map(async ([nodeId, nodeMeasurements]) => {
321
+ const rects = await Promise.all([...nodeMeasurements].map((measurement) => measurement.measure()));
322
+ return {
323
+ nodeId,
324
+ rect: unionRects(rects.filter((rect) => rect !== null)),
325
+ };
326
+ }));
327
+ const nextRects = measurements
328
+ .flatMap(({ nodeId, rect }) => rect
329
+ ? [
330
+ {
331
+ nodeId,
332
+ x: rect.x - rootRect.x,
333
+ y: rect.y - rootRect.y,
334
+ width: rect.width,
335
+ height: rect.height,
336
+ },
337
+ ]
338
+ : [])
339
+ .sort((left, right) => left.nodeId.localeCompare(right.nodeId));
340
+ if (!mountedRef.current || geometryRevision !== geometryRevisionRef.current) {
341
+ return mountedRef.current ? latestIndicatorRectsRef.current : null;
342
+ }
343
+ latestIndicatorRectsRef.current = nextRects;
344
+ setIndicatorRects((current) => areIndicatorRectsEqual(current, nextRects) ? current : nextRects);
345
+ return nextRects;
346
+ }, []);
347
+ refreshIndicatorRectsRef.current = refreshIndicatorRects;
348
+ React.useEffect(() => {
349
+ if (!props.isEditMode) {
350
+ settleCoordinatorRef.current?.cancel();
351
+ }
352
+ requestIndicatorRefresh();
353
+ }, [props.isEditMode, requestIndicatorRefresh]);
354
+ React.useEffect(() => {
355
+ mountedRef.current = true;
356
+ return () => {
357
+ mountedRef.current = false;
358
+ geometryRevisionRef.current += 1;
359
+ refreshCoordinatorRef.current?.cancelPendingRefresh();
360
+ settleCoordinatorRef.current?.cancel();
361
+ };
362
+ }, []);
363
+ React.useEffect(() => {
364
+ if (Platform.OS !== 'web') {
365
+ return;
366
+ }
367
+ const observer = typeof ResizeObserver === 'function'
368
+ ? new ResizeObserver(() => requestIndicatorRefresh())
369
+ : null;
370
+ resizeObserverRef.current = observer;
371
+ const rootResizeTarget = getWebResizeTarget(rootViewRef.current);
372
+ if (rootResizeTarget) {
373
+ observer?.observe(rootResizeTarget);
374
+ }
375
+ for (const measurements of unsupportedNodesRef.current.values()) {
376
+ for (const measurement of measurements) {
377
+ for (const resizeTarget of measurement.resizeTargets) {
378
+ observer?.observe(resizeTarget);
379
+ }
380
+ }
381
+ }
382
+ const handleScroll = () => requestIndicatorRefresh();
383
+ const handleResize = () => requestIndicatorRefresh();
384
+ window.addEventListener('scroll', handleScroll, true);
385
+ window.addEventListener('resize', handleResize);
386
+ return () => {
387
+ window.removeEventListener('scroll', handleScroll, true);
388
+ window.removeEventListener('resize', handleResize);
389
+ observer?.disconnect();
390
+ if (resizeObserverRef.current === observer) {
391
+ resizeObserverRef.current = null;
392
+ }
393
+ };
394
+ }, [requestIndicatorRefresh]);
395
+ const setRootViewRef = React.useCallback((view) => {
396
+ const previousResizeTarget = getWebResizeTarget(rootViewRef.current);
397
+ if (previousResizeTarget) {
398
+ resizeObserverRef.current?.unobserve(previousResizeTarget);
399
+ }
400
+ rootViewRef.current = view;
401
+ const nextResizeTarget = getWebResizeTarget(view);
402
+ if (nextResizeTarget) {
403
+ resizeObserverRef.current?.observe(nextResizeTarget);
404
+ }
405
+ requestIndicatorRefresh();
406
+ }, [requestIndicatorRefresh]);
407
+ const tapGesture = React.useMemo(() => {
408
+ return Gesture.Tap()
409
+ .maxDeltaX(5)
410
+ .maxDeltaY(5)
411
+ .maxDuration(500)
412
+ .runOnJS(true)
413
+ .onBegin(() => {
414
+ generationRef.current = coordinator.beginTransaction();
415
+ inputState.beginTransaction((nodeId) => {
416
+ coordinator.recordNode(nodeId, generationRef.current);
417
+ });
418
+ })
419
+ .onEnd((_event, success) => {
420
+ if (!success) {
421
+ return;
422
+ }
423
+ coordinator.commitSelection(isEditModeRef.current, selectedNodeIdRef.current, (nodeId) => {
424
+ selectionCommitCountRef.current += 1;
425
+ selectNodeRef.current(nodeId);
426
+ }, generationRef.current);
427
+ })
428
+ .onFinalize(() => {
429
+ coordinator.clearTransaction(generationRef.current);
430
+ generationRef.current = 0;
431
+ inputState.clear();
432
+ });
433
+ }, [coordinator, inputState]);
434
+ React.useEffect(() => {
435
+ coordinator.clearTransaction();
436
+ generationRef.current = 0;
437
+ inputState.clear();
438
+ }, [props.isEditMode, coordinator, inputState]);
439
+ const selectionStateId = [
440
+ 'studio-stationary-selection-root',
441
+ props.isEditMode ? 'edit' : 'preview',
442
+ encodeURIComponent(props.selectedNodeId ?? 'none'),
443
+ String(selectionCommitCountRef.current),
444
+ ].join(':');
445
+ return React.createElement(TrackerContext.Provider, { value: contextValue }, React.createElement(GestureDetector, { gesture: tapGesture }, React.createElement(View, {
446
+ ref: setRootViewRef,
447
+ nativeID: selectionStateId,
448
+ onLayout: requestIndicatorRefresh,
449
+ onTouchMove: requestScrollIndicatorRefresh,
450
+ testID: 'studio-stationary-selection-root',
451
+ style: { flex: 1, position: 'relative' },
452
+ }, props.children, ...(props.isEditMode ? indicatorRects : []).map((rect) => React.createElement(View, {
453
+ key: rect.nodeId,
454
+ nativeID: `studio-unsupported-indicator-${encodeURIComponent(rect.nodeId)}`,
455
+ testID: `studio-unsupported-indicator-${rect.nodeId}`,
456
+ pointerEvents: 'none',
457
+ style: {
458
+ position: 'absolute',
459
+ left: rect.x,
460
+ top: rect.y,
461
+ width: rect.width,
462
+ height: rect.height,
463
+ borderWidth: 1,
464
+ borderColor: '#ef4444',
465
+ borderStyle: 'dashed',
466
+ },
467
+ })))));
468
+ }
469
+ export { StationaryTapSelector };
470
+ //# sourceMappingURL=stationarySelection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stationarySelection.js","sourceRoot":"","sources":["../../src/runtime/stationarySelection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export type CommitSelectionResult = 'committed' | 'already-selected' | 'preview' | 'moved' | 'empty' | 'stale' | 'already-finalized';
2
+ export interface TransactionState {
3
+ readonly transactionId: number;
4
+ readonly path: string[];
5
+ moved: boolean;
6
+ finalized: boolean;
7
+ }
8
+ export interface StationarySelectionCoordinator {
9
+ readonly trackerRef: {
10
+ current: TransactionState | null;
11
+ };
12
+ beginTransaction(): number;
13
+ recordNode(nodeId: string, generation: number): void;
14
+ commitSelection(isEditMode: boolean, selectedNodeId: string | null, selectNode: (id: string | null) => void, generation: number): CommitSelectionResult;
15
+ clearTransaction(): void;
16
+ clearTransaction(generation: number): void;
17
+ markMoved(generation: number): void;
18
+ getTransaction(): TransactionState | null;
19
+ }
20
+ export declare function createStationarySelectionCoordinator(): StationarySelectionCoordinator;
21
+ //# sourceMappingURL=stationarySelectionCoordinator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stationarySelectionCoordinator.d.ts","sourceRoot":"","sources":["../../src/runtime/stationarySelectionCoordinator.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAC/B,WAAW,GAAG,kBAAkB,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,mBAAmB,CAAC;AAEnG,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,UAAU,EAAE;QAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAA;KAAE,CAAC;IAC1D,gBAAgB,IAAI,MAAM,CAAC;IAC3B,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACrD,eAAe,CACb,UAAU,EAAE,OAAO,EACnB,cAAc,EAAE,MAAM,GAAG,IAAI,EAC7B,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,EACvC,UAAU,EAAE,MAAM,GACjB,qBAAqB,CAAC;IACzB,gBAAgB,IAAI,IAAI,CAAC;IACzB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,cAAc,IAAI,gBAAgB,GAAG,IAAI,CAAC;CAC3C;AAED,wBAAgB,oCAAoC,IAAI,8BAA8B,CAkHrF"}
@@ -0,0 +1,84 @@
1
+ export function createStationarySelectionCoordinator() {
2
+ let nextTransactionId = 1;
3
+ const trackerRef = { current: null };
4
+ function beginTransaction() {
5
+ const tx = {
6
+ transactionId: nextTransactionId++,
7
+ path: [],
8
+ moved: false,
9
+ finalized: false,
10
+ };
11
+ trackerRef.current = tx;
12
+ return tx.transactionId;
13
+ }
14
+ function recordNode(nodeId, generation) {
15
+ const tx = trackerRef.current;
16
+ if (!tx || tx.finalized || tx.transactionId !== generation) {
17
+ return;
18
+ }
19
+ if (!tx.path.includes(nodeId)) {
20
+ tx.path.push(nodeId);
21
+ }
22
+ }
23
+ function commitSelection(isEditMode, selectedNodeId, selectNode, generation) {
24
+ if (!isEditMode) {
25
+ return 'preview';
26
+ }
27
+ const tx = trackerRef.current;
28
+ if (!tx) {
29
+ return 'empty';
30
+ }
31
+ if (tx.transactionId !== generation) {
32
+ return 'stale';
33
+ }
34
+ if (tx.finalized) {
35
+ return 'already-finalized';
36
+ }
37
+ if (tx.moved) {
38
+ return 'moved';
39
+ }
40
+ if (tx.path.length === 0) {
41
+ return 'empty';
42
+ }
43
+ const [deepestNodeId] = tx.path;
44
+ if (deepestNodeId != null && deepestNodeId === selectedNodeId) {
45
+ return 'already-selected';
46
+ }
47
+ if (deepestNodeId != null && deepestNodeId !== selectedNodeId) {
48
+ selectNode(deepestNodeId);
49
+ }
50
+ tx.finalized = true;
51
+ return 'committed';
52
+ }
53
+ function clearTransaction(generation) {
54
+ if (generation === undefined) {
55
+ trackerRef.current = null;
56
+ return;
57
+ }
58
+ const tx = trackerRef.current;
59
+ if (tx?.transactionId !== generation) {
60
+ return;
61
+ }
62
+ trackerRef.current = null;
63
+ }
64
+ function markMoved(generation) {
65
+ const tx = trackerRef.current;
66
+ if (tx?.transactionId !== generation) {
67
+ return;
68
+ }
69
+ tx.moved = true;
70
+ }
71
+ function getTransaction() {
72
+ return trackerRef.current;
73
+ }
74
+ return {
75
+ trackerRef,
76
+ beginTransaction,
77
+ recordNode,
78
+ commitSelection,
79
+ clearTransaction,
80
+ markMoved,
81
+ getTransaction,
82
+ };
83
+ }
84
+ //# sourceMappingURL=stationarySelectionCoordinator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stationarySelectionCoordinator.js","sourceRoot":"","sources":["../../src/runtime/stationarySelectionCoordinator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export interface StationaryPointerInput {
2
+ readonly kind: 'pointer';
3
+ readonly button: number;
4
+ readonly interactionId: number;
5
+ readonly isPrimary: boolean;
6
+ readonly pointerId: number;
7
+ readonly pointerType: string;
8
+ }
9
+ export interface StationaryTouchInput {
10
+ readonly kind: 'touch';
11
+ readonly interactionId: number;
12
+ readonly touchId: string;
13
+ }
14
+ export type StationarySelectionInput = StationaryPointerInput | StationaryTouchInput;
15
+ export interface StationarySelectionInputState {
16
+ recordNode(nodeId: string, input: StationarySelectionInput): boolean;
17
+ beginTransaction(recordNode: (nodeId: string) => void): void;
18
+ completePendingInteraction(): void;
19
+ clear(): void;
20
+ getPendingPath(): readonly string[];
21
+ }
22
+ export declare function createStationarySelectionInputState(args: {
23
+ readonly hasActiveTransaction: () => boolean;
24
+ readonly recordActiveNode: (nodeId: string) => void;
25
+ }): StationarySelectionInputState;
26
+ //# sourceMappingURL=stationarySelectionInputState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stationarySelectionInputState.d.ts","sourceRoot":"","sources":["../../src/runtime/stationarySelectionInputState.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,wBAAwB,GAAG,sBAAsB,GAAG,oBAAoB,CAAC;AAErF,MAAM,WAAW,6BAA6B;IAC5C,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC;IACrE,gBAAgB,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAC7D,0BAA0B,IAAI,IAAI,CAAC;IACnC,KAAK,IAAI,IAAI,CAAC;IACd,cAAc,IAAI,SAAS,MAAM,EAAE,CAAC;CACrC;AAgBD,wBAAgB,mCAAmC,CAAC,IAAI,EAAE;IACxD,QAAQ,CAAC,oBAAoB,EAAE,MAAM,OAAO,CAAC;IAC7C,QAAQ,CAAC,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACrD,GAAG,6BAA6B,CAmDhC"}