aniview 1.0.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 (64) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/LICENSE +21 -0
  3. package/README.md +130 -0
  4. package/dist/Aniview.d.ts +63 -0
  5. package/dist/Aniview.d.ts.map +1 -0
  6. package/dist/Aniview.js +831 -0
  7. package/dist/Aniview.js.map +1 -0
  8. package/dist/AniviewPanel.d.ts +33 -0
  9. package/dist/AniviewPanel.d.ts.map +1 -0
  10. package/dist/AniviewPanel.js +66 -0
  11. package/dist/AniviewPanel.js.map +1 -0
  12. package/dist/GestureStressTest.d.ts +3 -0
  13. package/dist/GestureStressTest.d.ts.map +1 -0
  14. package/dist/GestureStressTest.js +125 -0
  15. package/dist/GestureStressTest.js.map +1 -0
  16. package/dist/aniviewConfig.d.ts +175 -0
  17. package/dist/aniviewConfig.d.ts.map +1 -0
  18. package/dist/aniviewConfig.js +568 -0
  19. package/dist/aniviewConfig.js.map +1 -0
  20. package/dist/aniviewProvider.d.ts +93 -0
  21. package/dist/aniviewProvider.d.ts.map +1 -0
  22. package/dist/aniviewProvider.js +229 -0
  23. package/dist/aniviewProvider.js.map +1 -0
  24. package/dist/core/AniviewLock.d.ts +16 -0
  25. package/dist/core/AniviewLock.d.ts.map +1 -0
  26. package/dist/core/AniviewLock.js +18 -0
  27. package/dist/core/AniviewLock.js.map +1 -0
  28. package/dist/core/AniviewMath.d.ts +41 -0
  29. package/dist/core/AniviewMath.d.ts.map +1 -0
  30. package/dist/core/AniviewMath.js +69 -0
  31. package/dist/core/AniviewMath.js.map +1 -0
  32. package/dist/index.d.ts +7 -0
  33. package/dist/index.d.ts.map +1 -0
  34. package/dist/index.js +7 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/useAniview.d.ts +39 -0
  37. package/dist/useAniview.d.ts.map +1 -0
  38. package/dist/useAniview.js +32 -0
  39. package/dist/useAniview.js.map +1 -0
  40. package/dist/useAniviewContext.d.ts +156 -0
  41. package/dist/useAniviewContext.d.ts.map +1 -0
  42. package/dist/useAniviewContext.js +3 -0
  43. package/dist/useAniviewContext.js.map +1 -0
  44. package/dist/useAniviewLock.d.ts +20 -0
  45. package/dist/useAniviewLock.d.ts.map +1 -0
  46. package/dist/useAniviewLock.js +32 -0
  47. package/dist/useAniviewLock.js.map +1 -0
  48. package/package.json +60 -0
  49. package/src/Aniview.tsx +868 -0
  50. package/src/AniviewPanel.tsx +141 -0
  51. package/src/GestureStressTest.tsx +144 -0
  52. package/src/__tests__/AniviewLock.test.ts +58 -0
  53. package/src/__tests__/AniviewMath.test.ts +211 -0
  54. package/src/__tests__/AniviewSnapshot.test.tsx +85 -0
  55. package/src/__tests__/__snapshots__/AniviewSnapshot.test.tsx.snap +7 -0
  56. package/src/__tests__/aniviewConfig.test.ts +70 -0
  57. package/src/aniviewConfig.tsx +688 -0
  58. package/src/aniviewProvider.tsx +307 -0
  59. package/src/core/AniviewLock.ts +23 -0
  60. package/src/core/AniviewMath.ts +107 -0
  61. package/src/index.ts +6 -0
  62. package/src/useAniview.tsx +75 -0
  63. package/src/useAniviewContext.tsx +170 -0
  64. package/src/useAniviewLock.tsx +37 -0
@@ -0,0 +1,568 @@
1
+ import { Gesture } from "react-native-gesture-handler";
2
+ import { withSpring, makeMutable, runOnJS } from "react-native-reanimated";
3
+ import * as AniviewMath from './core/AniviewMath';
4
+ /**
5
+ * **AniviewConfig** — Layout Engine & Gesture Orchestrator
6
+ *
7
+ * Holds the page grid definition, overlap ratios, spring physics, and
8
+ * adjacency rules. It provides two critical pipelines:
9
+ *
10
+ * ### 1. Coordinate Mapping (`getPageOffset`, `register`)
11
+ * Converts a `pageId` into (x, y) world coordinates by walking the layout
12
+ * matrix and accumulating page widths/heights minus overlap ratios. The
13
+ * `register()` method is called during the Aniview bake phase to pre-compute
14
+ * keyframe target positions in world space.
15
+ *
16
+ * ### 2. Gesture Generation (`generateGesture`)
17
+ * Produces a RNGH Pan gesture with:
18
+ * - Axis locking (first-movement direction wins)
19
+ * - Bitmask-based directional locks (1=left, 2=right, 4=up, 8=down)
20
+ * - Edge resistance at world boundaries
21
+ * - Velocity-sensitive neighbor snapping with configurable thresholds
22
+ * - Spring-based snap animation with boundary dampening
23
+ *
24
+ * ### Overlaps
25
+ * The `overlaps` parameter reduces the gap between adjacent pages by a
26
+ * fraction of the viewport size. `{ cols: [0.5] }` means the first and
27
+ * second columns share 50% of the screen width, creating a drawer effect.
28
+ * Each element in the array corresponds to the gap between adjacent
29
+ * rows/columns (so `cols` needs `numCols - 1` values).
30
+ *
31
+ * ### Layout Cache
32
+ * Components can unmount and remount without losing their measured position
33
+ * thanks to `registerLayout()`/`getLayout()`. This enables true virtualization.
34
+ *
35
+ * @example
36
+ * ```tsx
37
+ * // 3 horizontal pages with the middle one as default
38
+ * const config = new AniviewConfig(
39
+ * [[1, 1, 1]],
40
+ * 1,
41
+ * { LEFT: 0, CENTER: 1, RIGHT: 2 },
42
+ * {},
43
+ * { cols: [0, 0] }, // no overlap
44
+ * );
45
+ * ```
46
+ *
47
+ * @see {@link AniviewProvider} which consumes this config
48
+ */
49
+ export class AniviewConfig {
50
+ /**
51
+ * @param layout - Grid matrix defining page positions (e.g., `[[1, 1]]` for 2 horizontal pages)
52
+ * @param defaultPage - Initial page (numeric ID or semantic name). Defaults to `0`.
53
+ * @param pageMap - Semantic name → numeric ID mapping
54
+ * @param initialDims - Initial viewport dimensions (usually set later via `onLayout`)
55
+ * @param overlaps - Ratio-based overlaps between adjacent pages: `{ cols?: number[], rows?: number[] }`
56
+ * @param providedGraph - Custom adjacency graph for non-grid snapping behavior
57
+ */
58
+ constructor(layout, defaultPage = null, pageMap = {}, initialDims = {}, overlaps = {}, providedGraph = null) {
59
+ /** Standard physics for snapping animations */
60
+ this.springConfig = {
61
+ damping: 30,
62
+ stiffness: 150,
63
+ mass: 0.5,
64
+ overshootClamping: true,
65
+ restDisplacementThreshold: 0.01,
66
+ restSpeedThreshold: 2
67
+ };
68
+ /**
69
+ * CACHE: Stores measured positions of components.
70
+ * This is critical for TRUE VIRTUALIZATION (unmounting).
71
+ * Key: pageId_componentIndex (or similar unique key)
72
+ */
73
+ this.layoutCache = {};
74
+ // To be injected by generateGesture/Provider
75
+ this._currentPageSV = makeMutable(0);
76
+ this.pageMap = pageMap || {};
77
+ this.layout = layout || [[1]];
78
+ this._contextDims = {
79
+ width: initialDims.width || 0,
80
+ height: initialDims.height || 0,
81
+ offsetX: initialDims.offsetX || 0,
82
+ offsetY: initialDims.offsetY || 0
83
+ };
84
+ // Resolve semantic default page
85
+ this.defaultPage = this.resolvePageId(defaultPage ?? 0);
86
+ this.adjacencyGraph = providedGraph || {};
87
+ const numRows = this.layout.length;
88
+ const numCols = this.layout[0]?.length || 0;
89
+ this.rowOverlaps = new Array(Math.max(0, numRows - 1)).fill(0);
90
+ if (overlaps.rows)
91
+ overlaps.rows.forEach((v, i) => { if (i < this.rowOverlaps.length)
92
+ this.rowOverlaps[i] = v; });
93
+ this.colOverlaps = new Array(Math.max(0, numCols - 1)).fill(0);
94
+ if (overlaps.cols)
95
+ overlaps.cols.forEach((v, i) => { if (i < this.colOverlaps.length)
96
+ this.colOverlaps[i] = v; });
97
+ }
98
+ registerLayout(componentId, layout) {
99
+ this.layoutCache[componentId] = layout;
100
+ }
101
+ getLayout(componentId) {
102
+ return this.layoutCache[componentId];
103
+ }
104
+ get contextDims() {
105
+ return this._contextDims;
106
+ }
107
+ updateDimensions(dims) {
108
+ this._contextDims = dims;
109
+ }
110
+ updateSpringConfig(config) {
111
+ this.springConfig = { ...this.springConfig, ...config };
112
+ }
113
+ /**
114
+ * Returns the shared physics configuration for snap animations.
115
+ */
116
+ getSpringConfig() {
117
+ return this.springConfig;
118
+ }
119
+ /** Gets the global (x, y) offset for a specific page relative to origin. */
120
+ getPageOffset(pageId, dims) {
121
+ const resolvedId = this.resolvePageId(pageId);
122
+ return AniviewMath.getPageOffset(resolvedId, this.layout, dims, this.defaultPage, this.rowOverlaps, this.colOverlaps);
123
+ }
124
+ resolvePageId(pageId) {
125
+ if (typeof pageId === 'number')
126
+ return pageId;
127
+ if (this.pageMap[pageId] !== undefined)
128
+ return this.pageMap[pageId];
129
+ // Fallback: If it's a string but NOT in the map, try to parse as number
130
+ const parsed = parseInt(pageId, 10);
131
+ return isNaN(parsed) ? 0 : parsed;
132
+ }
133
+ getCurrentPage() {
134
+ return this._currentPageSV;
135
+ }
136
+ _setCurrentPageSV(sv) {
137
+ this._currentPageSV = sv;
138
+ }
139
+ /**
140
+ * Pre-calculates absolute coordinates for a component's keyframes.
141
+ * Segregates Spatial (X/Y) frames from Event-based (1D) frames.
142
+ */
143
+ register(pageId, dims, keyframes, localLayout) {
144
+ const resolvedHomeId = this.resolvePageId(pageId);
145
+ const homeOffset = this.getPageOffset(resolvedHomeId, dims);
146
+ const localX = localLayout?.x || 0;
147
+ const localY = localLayout?.y || 0;
148
+ const bakedFrames = {};
149
+ const eventLanes = {};
150
+ if (keyframes) {
151
+ const entries = Array.isArray(keyframes)
152
+ ? keyframes.map((f, i) => ({ key: `f_${i}`, frame: f }))
153
+ : Object.entries(keyframes).map(([k, f]) => ({ key: k, frame: f }));
154
+ entries.forEach(({ key, frame }) => {
155
+ // Spatial Frame Logic (uses 'page')
156
+ if (frame.page !== undefined || frame.event === undefined) {
157
+ const targetPageId = frame.page !== undefined ? this.resolvePageId(frame.page) : resolvedHomeId;
158
+ const targetOffset = this.getPageOffset(targetPageId, dims);
159
+ bakedFrames[key] = {
160
+ ...frame,
161
+ worldX: targetOffset.x - homeOffset.x,
162
+ worldY: targetOffset.y - homeOffset.y,
163
+ };
164
+ }
165
+ // Event Frame Logic (uses 'event' and 'value')
166
+ if (frame.event) {
167
+ if (!eventLanes[frame.event])
168
+ eventLanes[frame.event] = [];
169
+ eventLanes[frame.event].push({
170
+ ...frame,
171
+ worldX: 0,
172
+ worldY: 0,
173
+ value: frame.value ?? 0
174
+ });
175
+ }
176
+ });
177
+ }
178
+ // Sort event frames by value for 1D interpolation
179
+ Object.keys(eventLanes).forEach(k => {
180
+ eventLanes[k].sort((a, b) => (a.value || 0) - (b.value || 0));
181
+ });
182
+ return {
183
+ homeOffset,
184
+ bakedFrames,
185
+ eventLanes,
186
+ localLayout: { x: localX, y: localY }
187
+ };
188
+ }
189
+ /** Minimal offset context for direct page references */
190
+ registerPage(pageId, dims) {
191
+ return {
192
+ offset: this.getPageOffset(pageId, dims),
193
+ dimensions: {
194
+ width: dims.width,
195
+ height: dims.height
196
+ }
197
+ };
198
+ }
199
+ /** Returns all valid page IDs defined in the layout matrix */
200
+ getPages() {
201
+ const pages = [];
202
+ const rows = this.layout.length;
203
+ if (rows === 0)
204
+ return [0];
205
+ const cols = this.layout[0].length;
206
+ for (let rowIndex = 0; rowIndex < rows; rowIndex++) {
207
+ for (let colIndex = 0; colIndex < cols; colIndex++) {
208
+ if (this.layout[rowIndex][colIndex] === 1) {
209
+ pages.push(rowIndex * cols + colIndex);
210
+ }
211
+ }
212
+ }
213
+ return pages;
214
+ }
215
+ /** Map of PageID -> (x, y) coordinates */
216
+ getPagesMap(dims) {
217
+ const map = {};
218
+ const pages = this.getPages();
219
+ for (let index = 0; index < pages.length; index++) {
220
+ const pageId = pages[index];
221
+ map[pageId] = this.getPageOffset(pageId, dims);
222
+ }
223
+ return map;
224
+ }
225
+ /** Returns calculated min/max world boundaries for gesture clamping */
226
+ getWorldBounds(dims) {
227
+ return AniviewMath.getWorldBounds(this.getPages(), this.layout, dims, this.defaultPage, this.rowOverlaps, this.colOverlaps);
228
+ }
229
+ /**
230
+ * Generates the core Pan Gesture logic.
231
+ * Uses local closures to ensure UI-thread safety and prevent context loss.
232
+ */
233
+ generateGesture(x, y, onPageChange, lockMask, simultaneousHandlers, gestureEnabled, dims, isSnapping, lastTargetId) {
234
+ // Persistent constants Captured for the UI thread
235
+ const layout = this.layout;
236
+ const contextDims = dims || this._contextDims;
237
+ const defaultPage = this.defaultPage;
238
+ const rowOverlaps = this.rowOverlaps;
239
+ const colOverlaps = this.colOverlaps;
240
+ const pages = this.getPages();
241
+ const bounds = AniviewMath.getWorldBounds(pages, layout, contextDims, defaultPage, rowOverlaps, colOverlaps);
242
+ const pageMap = this.pageMap;
243
+ /** Edge resistance strength (0.0 = hard wall, 1.0 = no resistance) */
244
+ const RESISTANCE = 0.08;
245
+ const SPRING_CONFIG = this.springConfig;
246
+ const isSingleRow = layout.length <= 1;
247
+ const screenWidth = contextDims.width;
248
+ const screenHeight = contextDims.height;
249
+ const rowLength = Math.max(1, layout[0]?.length || 0);
250
+ // Helper to resolve ID on UI thread
251
+ const resolveId = (pid) => {
252
+ 'worklet';
253
+ if (typeof pid === 'number')
254
+ return pid;
255
+ if (pageMap && pageMap[pid] !== undefined)
256
+ return pageMap[pid];
257
+ return 0; // Fallback
258
+ };
259
+ // Pre-calculate snap points to keep onUpdate/onEnd fast
260
+ const snapPointsProcessed = pages.map(pageId => {
261
+ const offset = AniviewMath.getPageOffset(pageId, layout, contextDims, defaultPage, rowOverlaps, colOverlaps);
262
+ return {
263
+ id: pageId,
264
+ x: offset.x,
265
+ y: offset.y,
266
+ row: Math.floor(pageId / rowLength),
267
+ col: pageId % rowLength
268
+ };
269
+ });
270
+ const triggerPageChange = (pageId) => {
271
+ 'worklet';
272
+ if (onPageChange) {
273
+ runOnJS(onPageChange)(pageId);
274
+ }
275
+ };
276
+ const startX = makeMutable(0);
277
+ const startY = makeMutable(0);
278
+ const internalIsSnapping = makeMutable(false);
279
+ const isSnappingVal = isSnapping || internalIsSnapping;
280
+ const activeAxis = makeMutable(0); // 0: none, 1: horizontal, 2: vertical
281
+ const wasDisabled = makeMutable(false);
282
+ let pan = Gesture.Pan();
283
+ if (simultaneousHandlers) {
284
+ pan = pan.simultaneousWithExternalGesture(simultaneousHandlers);
285
+ }
286
+ return pan
287
+ .minDistance(10)
288
+ .onBegin(() => {
289
+ 'worklet';
290
+ isSnappingVal.value = false;
291
+ activeAxis.value = 0;
292
+ wasDisabled.value = false;
293
+ if (isNaN(x.value))
294
+ x.value = 0;
295
+ if (isNaN(y.value))
296
+ y.value = 0;
297
+ startX.value = x.value;
298
+ startY.value = y.value;
299
+ })
300
+ .onUpdate((gestureEvent) => {
301
+ 'worklet';
302
+ // Continuous sync to prevent 'jumps' when taking over from children
303
+ const currentResyncX = x.value + gestureEvent.translationX;
304
+ const currentResyncY = y.value + gestureEvent.translationY;
305
+ if (gestureEnabled && gestureEnabled.value === false) {
306
+ startX.value = currentResyncX;
307
+ startY.value = currentResyncY;
308
+ wasDisabled.value = true;
309
+ return;
310
+ }
311
+ // Catch transition from disabled to enabled
312
+ if (wasDisabled.value) {
313
+ startX.value = currentResyncX;
314
+ startY.value = currentResyncY;
315
+ wasDisabled.value = false;
316
+ }
317
+ isSnappingVal.value = true;
318
+ const dx = Math.abs(gestureEvent.translationX);
319
+ const dy = Math.abs(gestureEvent.translationY);
320
+ const TRANSLATION_THRESHOLD = 3;
321
+ const isHBlocked = lockMask && (lockMask.value & 1);
322
+ const isVBlocked = lockMask && (lockMask.value & 2);
323
+ // Lock to an axis after a small movement
324
+ if (activeAxis.value === 0 && (dx > TRANSLATION_THRESHOLD || dy > TRANSLATION_THRESHOLD)) {
325
+ activeAxis.value = dx > dy ? 1 : 2;
326
+ }
327
+ let newX = startX.value;
328
+ let newY = startY.value;
329
+ // Apply movement only to the active axis AND if not blocked
330
+ if (activeAxis.value === 1 || activeAxis.value === 0) {
331
+ if (isHBlocked) {
332
+ startX.value = x.value + gestureEvent.translationX;
333
+ }
334
+ else {
335
+ newX = startX.value - gestureEvent.translationX;
336
+ }
337
+ }
338
+ if (!isSingleRow && (activeAxis.value === 2 || activeAxis.value === 0)) {
339
+ if (isVBlocked) {
340
+ startY.value = y.value + gestureEvent.translationY;
341
+ }
342
+ else {
343
+ newY = startY.value - gestureEvent.translationY;
344
+ }
345
+ }
346
+ // ALIGNMENT ENFORCEMENT for Vertical Swiping
347
+ if (activeAxis.value === 2) {
348
+ newX = startX.value; // Force horizontal to be centered
349
+ }
350
+ // ALIGNMENT ENFORCEMENT for Horizontal Swiping
351
+ if (activeAxis.value === 1) {
352
+ newY = startY.value; // Force vertical to be centered
353
+ }
354
+ // NaN Protection
355
+ if (isNaN(newX))
356
+ newX = startX.value;
357
+ if (isNaN(newY))
358
+ newY = startY.value;
359
+ // CLAMP: Prevent skipping multiple pages on fast swipes
360
+ // Limit movement to 1.2 pages max in either direction from start position
361
+ const maxSwipeDistance = screenWidth * 1.2;
362
+ const deltaX = newX - startX.value;
363
+ if (Math.abs(deltaX) > maxSwipeDistance) {
364
+ newX = startX.value + (deltaX > 0 ? maxSwipeDistance : -maxSwipeDistance);
365
+ }
366
+ // Overscroll limits before resistance triggers
367
+ const localLimitX = screenWidth * 1.5;
368
+ const localLimitY = screenHeight * 1.5;
369
+ const lowX = startX.value - localLimitX;
370
+ const highX = startX.value + localLimitX;
371
+ // World Bounds Resistance
372
+ if (newX < bounds.minX)
373
+ newX = bounds.minX + (newX - bounds.minX) * RESISTANCE;
374
+ else if (newX > bounds.maxX)
375
+ newX = bounds.maxX + (newX - bounds.maxX) * RESISTANCE;
376
+ // Local Velocity Protection
377
+ if (newX < lowX)
378
+ newX = lowX + (newX - lowX) * RESISTANCE;
379
+ else if (newX > highX)
380
+ newX = highX + (newX - highX) * RESISTANCE;
381
+ if (!isSingleRow) {
382
+ const lowY = startY.value - localLimitY;
383
+ const highY = startY.value + localLimitY;
384
+ if (newY < bounds.minY)
385
+ newY = bounds.minY + (newY - bounds.minY) * RESISTANCE;
386
+ else if (newY > bounds.maxY)
387
+ newY = bounds.maxY + (newY - bounds.maxY) * RESISTANCE;
388
+ if (newY < lowY)
389
+ newY = lowY + (newY - lowY) * RESISTANCE;
390
+ else if (newY > highY)
391
+ newY = highY + (newY - highY) * RESISTANCE;
392
+ }
393
+ x.value = newX;
394
+ y.value = newY;
395
+ })
396
+ .onEnd((gestureEvent) => {
397
+ 'worklet';
398
+ if (gestureEnabled && gestureEnabled.value === false)
399
+ return;
400
+ if (snapPointsProcessed.length === 0)
401
+ return;
402
+ const VELOCITY_THRESHOLD = 200; // Lowered from 500 for high sensitivity
403
+ const distanceThresholdX = screenWidth * 0.08; // Lowered from 0.15 (8% of screen)
404
+ const distanceThresholdY = screenHeight * 0.08; // Lowered from 0.15 (8% of screen)
405
+ const stageStartX = startX.value;
406
+ const stageStartY = startY.value;
407
+ // Identify "Anchor Page" for directional snapping (closest point when gesture began)
408
+ let anchorRow = 0, anchorCol = 0, anchorId = -1;
409
+ let minStartDist = Infinity;
410
+ for (let index = 0; index < snapPointsProcessed.length; index++) {
411
+ const snapPoint = snapPointsProcessed[index];
412
+ const dist = Math.sqrt(Math.pow(stageStartX - snapPoint.x, 2) + Math.pow(stageStartY - snapPoint.y, 2));
413
+ if (dist < minStartDist) {
414
+ minStartDist = dist;
415
+ anchorRow = snapPoint.row;
416
+ anchorCol = snapPoint.col;
417
+ anchorId = snapPoint.id;
418
+ }
419
+ }
420
+ // STRICT: Only treat as "founded start" if within 30% of screen width from page center
421
+ // This prevents edge swipes from being misattributed to the neighboring page
422
+ const startFound = minStartDist < screenWidth * 0.3;
423
+ let targetX = -1;
424
+ let targetY = -1;
425
+ let targetId = -1;
426
+ const intentRight = gestureEvent.velocityX < -VELOCITY_THRESHOLD || gestureEvent.translationX < -distanceThresholdX;
427
+ const intentLeft = gestureEvent.velocityX > VELOCITY_THRESHOLD || gestureEvent.translationX > distanceThresholdX;
428
+ const intentDown = gestureEvent.velocityY < -VELOCITY_THRESHOLD || gestureEvent.translationY < -distanceThresholdY;
429
+ const intentUp = gestureEvent.velocityY > VELOCITY_THRESHOLD || gestureEvent.translationY > distanceThresholdY;
430
+ // Neighbor Snapping
431
+ if (startFound && (intentRight || intentLeft || (!isSingleRow && (intentDown || intentUp)))) {
432
+ let targetRow = anchorRow;
433
+ let targetCol = anchorCol;
434
+ // Only allow snapping on the current active axis
435
+ if (activeAxis.value === 1) {
436
+ if (intentRight)
437
+ targetCol = anchorCol + 1;
438
+ else if (intentLeft)
439
+ targetCol = anchorCol - 1;
440
+ }
441
+ else if (activeAxis.value === 2 && !isSingleRow) {
442
+ if (intentDown)
443
+ targetRow = anchorRow + 1;
444
+ else if (intentUp)
445
+ targetRow = anchorRow - 1;
446
+ }
447
+ for (let index = 0; index < snapPointsProcessed.length; index++) {
448
+ const snapPoint = snapPointsProcessed[index];
449
+ if (snapPoint.row === targetRow && snapPoint.col === targetCol) {
450
+ targetX = snapPoint.x;
451
+ targetY = snapPoint.y;
452
+ targetId = snapPoint.id;
453
+ break;
454
+ }
455
+ }
456
+ }
457
+ // Distance-based Fallback (constrained by active axis)
458
+ if (targetX === -1) {
459
+ let minDistance = Infinity;
460
+ for (let index = 0; index < snapPointsProcessed.length; index++) {
461
+ const snapPoint = snapPointsProcessed[index];
462
+ // STAY ON AXIS: If we are swiping vertically, only consider pages in this column.
463
+ // If swiping horizontally, only consider pages in this row.
464
+ if (activeAxis.value === 1 && snapPoint.row !== anchorRow)
465
+ continue;
466
+ if (activeAxis.value === 2 && snapPoint.col !== anchorCol)
467
+ continue;
468
+ const dist = Math.sqrt(Math.pow(x.value - snapPoint.x, 2) + Math.pow(y.value - snapPoint.y, 2));
469
+ if (dist < minDistance) {
470
+ minDistance = dist;
471
+ targetX = snapPoint.x;
472
+ targetY = snapPoint.y;
473
+ targetId = snapPoint.id;
474
+ }
475
+ }
476
+ }
477
+ // Final safety: if for some reason we still have no target, stay at start
478
+ if (targetId === -1) {
479
+ targetId = anchorId;
480
+ const snapPoint = snapPointsProcessed.find(p => p.id === anchorId);
481
+ if (snapPoint) {
482
+ targetX = snapPoint.x;
483
+ targetY = snapPoint.y;
484
+ }
485
+ }
486
+ if (targetId !== -1 && targetId !== anchorId) {
487
+ triggerPageChange(targetId);
488
+ }
489
+ // --- EDGE SNAP HARDENING ---
490
+ // If we are snapping to a boundary, dampen the velocity to prevent "flick bounce".
491
+ const isBoundaryX = targetX <= bounds.minX || targetX >= bounds.maxX;
492
+ const isBoundaryY = targetY <= bounds.minY || targetY >= bounds.maxY;
493
+ const velocityDamping = 0.5;
494
+ x.value = withSpring(targetX, {
495
+ ...SPRING_CONFIG,
496
+ velocity: isBoundaryX ? -gestureEvent.velocityX * velocityDamping : -gestureEvent.velocityX
497
+ }, (finished) => {
498
+ if (finished)
499
+ isSnappingVal.value = false;
500
+ });
501
+ if (!isSingleRow) {
502
+ y.value = withSpring(targetY, {
503
+ ...SPRING_CONFIG,
504
+ velocity: isBoundaryY ? -gestureEvent.velocityY * velocityDamping : -gestureEvent.velocityY
505
+ });
506
+ }
507
+ else {
508
+ y.value = withSpring(targetY, SPRING_CONFIG);
509
+ }
510
+ isSnappingVal.value = true;
511
+ })
512
+ .onFinalize((event, success) => {
513
+ 'worklet';
514
+ // If gesture was cancelled/failed (button press) OR didn't move enough to lock axis (tap), do nothing.
515
+ if (!success || activeAxis.value === 0)
516
+ return;
517
+ if (gestureEnabled && gestureEnabled.value === false)
518
+ return;
519
+ if (isSnappingVal.value)
520
+ return;
521
+ let minDistance = Infinity;
522
+ let targetX = x.value;
523
+ let targetY = y.value;
524
+ let targetId = -1;
525
+ const snapPointsCount = snapPointsProcessed.length;
526
+ for (let index = 0; index < snapPointsCount; index++) {
527
+ const snapPoint = snapPointsProcessed[index];
528
+ const dist = Math.sqrt(Math.pow(x.value - snapPoint.x, 2) + Math.pow(y.value - snapPoint.y, 2));
529
+ if (dist < minDistance) {
530
+ minDistance = dist;
531
+ targetX = snapPoint.x;
532
+ targetY = snapPoint.y;
533
+ targetId = snapPoint.id;
534
+ }
535
+ }
536
+ // --- CONFLICT RESOLUTION ---
537
+ // If the gesture resolution (Snap to targetId) conflicts with a pending programmatic move (lastTargetId),
538
+ // and the gesture was essentially stationary (snapped back to anchor), we yield to the external command.
539
+ if (lastTargetId) {
540
+ const currentProgrammaticId = resolveId(lastTargetId.value);
541
+ const stageStartX = startX.value;
542
+ const stageStartY = startY.value;
543
+ // Re-calculate start anchor for comparison
544
+ let anchorId = -1;
545
+ let minStartDist = Infinity;
546
+ for (let index = 0; index < snapPointsCount; index++) {
547
+ const snapPoint = snapPointsProcessed[index];
548
+ const dist = Math.sqrt(Math.pow(stageStartX - snapPoint.x, 2) + Math.pow(stageStartY - snapPoint.y, 2));
549
+ if (dist < minStartDist) {
550
+ minStartDist = dist;
551
+ anchorId = snapPoint.id;
552
+ }
553
+ }
554
+ // If gesture is staying put (target == anchor) BUT the program wants to be elsewhere -> Yield
555
+ if (targetId === anchorId && anchorId !== currentProgrammaticId) {
556
+ return;
557
+ }
558
+ }
559
+ // Always force snap to resolve any mid-swipe "catch"
560
+ x.value = withSpring(targetX, SPRING_CONFIG, (finished) => {
561
+ if (finished)
562
+ isSnappingVal.value = false;
563
+ });
564
+ y.value = withSpring(targetY, SPRING_CONFIG);
565
+ });
566
+ }
567
+ }
568
+ //# sourceMappingURL=aniviewConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aniviewConfig.js","sourceRoot":"","sources":["../src/aniviewConfig.tsx"],"names":[],"mappings":"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"}