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.
- package/CHANGELOG.md +21 -0
- package/LICENSE +21 -0
- package/README.md +130 -0
- package/dist/Aniview.d.ts +63 -0
- package/dist/Aniview.d.ts.map +1 -0
- package/dist/Aniview.js +831 -0
- package/dist/Aniview.js.map +1 -0
- package/dist/AniviewPanel.d.ts +33 -0
- package/dist/AniviewPanel.d.ts.map +1 -0
- package/dist/AniviewPanel.js +66 -0
- package/dist/AniviewPanel.js.map +1 -0
- package/dist/GestureStressTest.d.ts +3 -0
- package/dist/GestureStressTest.d.ts.map +1 -0
- package/dist/GestureStressTest.js +125 -0
- package/dist/GestureStressTest.js.map +1 -0
- package/dist/aniviewConfig.d.ts +175 -0
- package/dist/aniviewConfig.d.ts.map +1 -0
- package/dist/aniviewConfig.js +568 -0
- package/dist/aniviewConfig.js.map +1 -0
- package/dist/aniviewProvider.d.ts +93 -0
- package/dist/aniviewProvider.d.ts.map +1 -0
- package/dist/aniviewProvider.js +229 -0
- package/dist/aniviewProvider.js.map +1 -0
- package/dist/core/AniviewLock.d.ts +16 -0
- package/dist/core/AniviewLock.d.ts.map +1 -0
- package/dist/core/AniviewLock.js +18 -0
- package/dist/core/AniviewLock.js.map +1 -0
- package/dist/core/AniviewMath.d.ts +41 -0
- package/dist/core/AniviewMath.d.ts.map +1 -0
- package/dist/core/AniviewMath.js +69 -0
- package/dist/core/AniviewMath.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/useAniview.d.ts +39 -0
- package/dist/useAniview.d.ts.map +1 -0
- package/dist/useAniview.js +32 -0
- package/dist/useAniview.js.map +1 -0
- package/dist/useAniviewContext.d.ts +156 -0
- package/dist/useAniviewContext.d.ts.map +1 -0
- package/dist/useAniviewContext.js +3 -0
- package/dist/useAniviewContext.js.map +1 -0
- package/dist/useAniviewLock.d.ts +20 -0
- package/dist/useAniviewLock.d.ts.map +1 -0
- package/dist/useAniviewLock.js +32 -0
- package/dist/useAniviewLock.js.map +1 -0
- package/package.json +60 -0
- package/src/Aniview.tsx +868 -0
- package/src/AniviewPanel.tsx +141 -0
- package/src/GestureStressTest.tsx +144 -0
- package/src/__tests__/AniviewLock.test.ts +58 -0
- package/src/__tests__/AniviewMath.test.ts +211 -0
- package/src/__tests__/AniviewSnapshot.test.tsx +85 -0
- package/src/__tests__/__snapshots__/AniviewSnapshot.test.tsx.snap +7 -0
- package/src/__tests__/aniviewConfig.test.ts +70 -0
- package/src/aniviewConfig.tsx +688 -0
- package/src/aniviewProvider.tsx +307 -0
- package/src/core/AniviewLock.ts +23 -0
- package/src/core/AniviewMath.ts +107 -0
- package/src/index.ts +6 -0
- package/src/useAniview.tsx +75 -0
- package/src/useAniviewContext.tsx +170 -0
- package/src/useAniviewLock.tsx +37 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { SharedValue, WithSpringConfig } from 'react-native-reanimated';
|
|
3
|
+
import { AniviewContextType, AniviewHandle } from "./useAniviewContext";
|
|
4
|
+
import { AniviewConfig } from './aniviewConfig';
|
|
5
|
+
export interface AniviewProviderProps {
|
|
6
|
+
children: React.ReactNode;
|
|
7
|
+
/** Explicitly provide a config instance (Advanced) */
|
|
8
|
+
config?: AniviewConfig;
|
|
9
|
+
/** The grid layout matrix (e.g., [[1, 1, 1, 1]]) - Simple setup */
|
|
10
|
+
layout?: number[][];
|
|
11
|
+
/** The source-of-truth origin page */
|
|
12
|
+
defaultPage?: number;
|
|
13
|
+
/** Explicitly override page size. Defaults to container size. */
|
|
14
|
+
pageSize?: {
|
|
15
|
+
width: number;
|
|
16
|
+
height: number;
|
|
17
|
+
};
|
|
18
|
+
/** Callback when page changes */
|
|
19
|
+
onPageChange?: (pageId: number | string) => void;
|
|
20
|
+
/** Imperative active page control (Legacy) - prefer ref.snapToPage */
|
|
21
|
+
activePage?: number | string;
|
|
22
|
+
/** Map of semantic names to numeric page IDs */
|
|
23
|
+
pageMap?: Record<string, number>;
|
|
24
|
+
/** External ref for the internal PanGesture (for coordination) */
|
|
25
|
+
gestureRef?: React.RefObject<any>;
|
|
26
|
+
/** Custom spring physics */
|
|
27
|
+
springConfig?: WithSpringConfig;
|
|
28
|
+
/** External events to drive animations */
|
|
29
|
+
events?: Record<string, SharedValue<number>>;
|
|
30
|
+
/** Explicit dimensions override */
|
|
31
|
+
dimensions?: Partial<AniviewContextType['dimensions']>;
|
|
32
|
+
/** External lockMask for gesture coordination */
|
|
33
|
+
externalLockMask?: SharedValue<number>;
|
|
34
|
+
/** External gesture enabled control (simple on/off) */
|
|
35
|
+
gestureEnabled?: SharedValue<boolean>;
|
|
36
|
+
/** Simultaneous gesture handlers for coordination */
|
|
37
|
+
simultaneousHandlers?: any;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* **AniviewProvider** — World Coordinate System & Gesture Controller
|
|
41
|
+
*
|
|
42
|
+
* The root provider that establishes the virtual 2D world in which all
|
|
43
|
+
* child `Aniview` components live. It manages:
|
|
44
|
+
*
|
|
45
|
+
* - **The Camera** (`events.x`, `events.y` SharedValues) — the current
|
|
46
|
+
* viewport position in world coordinates, driven by gestures or
|
|
47
|
+
* programmatic `snapToPage` calls.
|
|
48
|
+
* - **Pan Gesture** — a RNGH Pan gesture that translates finger movement
|
|
49
|
+
* into camera position updates, with axis locking, edge resistance,
|
|
50
|
+
* velocity-based snapping, and bitmask-based directional locks.
|
|
51
|
+
* - **Virtualization** — tracks which pages are "near" the camera and
|
|
52
|
+
* provides a `visiblePages` set for child components.
|
|
53
|
+
* - **Custom Events** — user-supplied SharedValues (e.g., scroll position,
|
|
54
|
+
* slider value) that drive event-based keyframe animations.
|
|
55
|
+
*
|
|
56
|
+
* ### Sizing behavior
|
|
57
|
+
*
|
|
58
|
+
* By default, the provider measures its own container via `onLayout`
|
|
59
|
+
* and uses that as the page size. Override with `pageSize` or
|
|
60
|
+
* `dimensions` if you need explicit control (e.g., for offscreen pages
|
|
61
|
+
* that are larger than the visible container).
|
|
62
|
+
*
|
|
63
|
+
* ### Imperative API
|
|
64
|
+
*
|
|
65
|
+
* Attach a `ref` to access `snapToPage(pageId)`, `getCurrentPage()`,
|
|
66
|
+
* and `lock(mask)` for programmatic navigation.
|
|
67
|
+
*
|
|
68
|
+
* @param props.config - Pre-built `AniviewConfig` instance (advanced). Mutually exclusive with `layout`.
|
|
69
|
+
* @param props.layout - Grid matrix (e.g., `[[1, 1, 1]]` for 3 horizontal pages). Creates an `AniviewConfig` internally.
|
|
70
|
+
* @param props.defaultPage - The initial page ID (default: `0`).
|
|
71
|
+
* @param props.pageMap - Semantic name → numeric ID mapping (e.g., `{ HOME: 0, SETTINGS: 1 }`).
|
|
72
|
+
* @param props.pageSize - Explicit page dimensions. If omitted, inferred from container layout.
|
|
73
|
+
* @param props.onPageChange - Fires when the camera snaps to a new page.
|
|
74
|
+
* @param props.springConfig - Custom spring physics for snap animations.
|
|
75
|
+
* @param props.events - Additional SharedValues that drive event-based keyframes.
|
|
76
|
+
* @param props.externalLockMask - Externally controlled bitmask SharedValue for gesture locking. See {@link useAniviewLock}.
|
|
77
|
+
* @param props.gestureEnabled - SharedValue to globally enable/disable the pan gesture.
|
|
78
|
+
* @param props.simultaneousHandlers - RNGH refs for gesture coordination with parent/sibling handlers.
|
|
79
|
+
* @param props.activePage - (Legacy) Declarative page control. Prefer `ref.snapToPage()`.
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```tsx
|
|
83
|
+
* const config = new AniviewConfig([[1, 1, 1]], 0, { HOME: 0, FEED: 1, PROFILE: 2 });
|
|
84
|
+
* const scrollY = useSharedValue(0);
|
|
85
|
+
*
|
|
86
|
+
* <AniviewProvider ref={aniviewRef} config={config} events={{ scrollY }} onPageChange={setPage}>
|
|
87
|
+
* <Aniview pageId="HOME">...</Aniview>
|
|
88
|
+
* <Aniview pageId="FEED">...</Aniview>
|
|
89
|
+
* </AniviewProvider>
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
export declare const AniviewProvider: React.ForwardRefExoticComponent<AniviewProviderProps & React.RefAttributes<AniviewHandle>>;
|
|
93
|
+
//# sourceMappingURL=aniviewProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aniviewProvider.d.ts","sourceRoot":"","sources":["../src/aniviewProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgF,MAAM,OAAO,CAAC;AAErG,OAAiB,EAA2C,WAAW,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3H,OAAO,EAAkB,kBAAkB,EAAE,aAAa,EAAyD,MAAM,qBAAqB,CAAC;AAC/I,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIhD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,sDAAsD;IACtD,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;IACpB,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,iCAAiC;IACjC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;IACjD,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,kEAAkE;IAClE,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAClC,4BAA4B;IAC5B,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7C,mCAAmC;IACnC,UAAU,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC;IACvD,iDAAiD;IACjD,gBAAgB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACvC,uDAAuD;IACvD,cAAc,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IACtC,qDAAqD;IACrD,oBAAoB,CAAC,EAAE,GAAG,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDG;AACH,eAAO,MAAM,eAAe,4FAqN1B,CAAC"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import React, { useMemo, useEffect, useRef, useState, useImperativeHandle, forwardRef } from 'react';
|
|
2
|
+
import Animated, { useSharedValue, withSpring, makeMutable } from 'react-native-reanimated';
|
|
3
|
+
import { AniviewContext } from "./useAniviewContext";
|
|
4
|
+
import { AniviewConfig } from './aniviewConfig';
|
|
5
|
+
import { GestureDetector } from 'react-native-gesture-handler';
|
|
6
|
+
import * as AniviewMath from './core/AniviewMath';
|
|
7
|
+
/**
|
|
8
|
+
* **AniviewProvider** — World Coordinate System & Gesture Controller
|
|
9
|
+
*
|
|
10
|
+
* The root provider that establishes the virtual 2D world in which all
|
|
11
|
+
* child `Aniview` components live. It manages:
|
|
12
|
+
*
|
|
13
|
+
* - **The Camera** (`events.x`, `events.y` SharedValues) — the current
|
|
14
|
+
* viewport position in world coordinates, driven by gestures or
|
|
15
|
+
* programmatic `snapToPage` calls.
|
|
16
|
+
* - **Pan Gesture** — a RNGH Pan gesture that translates finger movement
|
|
17
|
+
* into camera position updates, with axis locking, edge resistance,
|
|
18
|
+
* velocity-based snapping, and bitmask-based directional locks.
|
|
19
|
+
* - **Virtualization** — tracks which pages are "near" the camera and
|
|
20
|
+
* provides a `visiblePages` set for child components.
|
|
21
|
+
* - **Custom Events** — user-supplied SharedValues (e.g., scroll position,
|
|
22
|
+
* slider value) that drive event-based keyframe animations.
|
|
23
|
+
*
|
|
24
|
+
* ### Sizing behavior
|
|
25
|
+
*
|
|
26
|
+
* By default, the provider measures its own container via `onLayout`
|
|
27
|
+
* and uses that as the page size. Override with `pageSize` or
|
|
28
|
+
* `dimensions` if you need explicit control (e.g., for offscreen pages
|
|
29
|
+
* that are larger than the visible container).
|
|
30
|
+
*
|
|
31
|
+
* ### Imperative API
|
|
32
|
+
*
|
|
33
|
+
* Attach a `ref` to access `snapToPage(pageId)`, `getCurrentPage()`,
|
|
34
|
+
* and `lock(mask)` for programmatic navigation.
|
|
35
|
+
*
|
|
36
|
+
* @param props.config - Pre-built `AniviewConfig` instance (advanced). Mutually exclusive with `layout`.
|
|
37
|
+
* @param props.layout - Grid matrix (e.g., `[[1, 1, 1]]` for 3 horizontal pages). Creates an `AniviewConfig` internally.
|
|
38
|
+
* @param props.defaultPage - The initial page ID (default: `0`).
|
|
39
|
+
* @param props.pageMap - Semantic name → numeric ID mapping (e.g., `{ HOME: 0, SETTINGS: 1 }`).
|
|
40
|
+
* @param props.pageSize - Explicit page dimensions. If omitted, inferred from container layout.
|
|
41
|
+
* @param props.onPageChange - Fires when the camera snaps to a new page.
|
|
42
|
+
* @param props.springConfig - Custom spring physics for snap animations.
|
|
43
|
+
* @param props.events - Additional SharedValues that drive event-based keyframes.
|
|
44
|
+
* @param props.externalLockMask - Externally controlled bitmask SharedValue for gesture locking. See {@link useAniviewLock}.
|
|
45
|
+
* @param props.gestureEnabled - SharedValue to globally enable/disable the pan gesture.
|
|
46
|
+
* @param props.simultaneousHandlers - RNGH refs for gesture coordination with parent/sibling handlers.
|
|
47
|
+
* @param props.activePage - (Legacy) Declarative page control. Prefer `ref.snapToPage()`.
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```tsx
|
|
51
|
+
* const config = new AniviewConfig([[1, 1, 1]], 0, { HOME: 0, FEED: 1, PROFILE: 2 });
|
|
52
|
+
* const scrollY = useSharedValue(0);
|
|
53
|
+
*
|
|
54
|
+
* <AniviewProvider ref={aniviewRef} config={config} events={{ scrollY }} onPageChange={setPage}>
|
|
55
|
+
* <Aniview pageId="HOME">...</Aniview>
|
|
56
|
+
* <Aniview pageId="FEED">...</Aniview>
|
|
57
|
+
* </AniviewProvider>
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
export const AniviewProvider = forwardRef(({ children, config: providedConfig, layout, defaultPage = 0, pageSize, onPageChange, activePage, gestureRef, springConfig, events: externalEvents, pageMap = {}, dimensions: providedDims, externalLockMask, gestureEnabled: externalGestureEnabled, simultaneousHandlers }, ref) => {
|
|
61
|
+
// --- CONFIG MANAGEMENT ---
|
|
62
|
+
const config = useMemo(() => {
|
|
63
|
+
if (providedConfig)
|
|
64
|
+
return providedConfig;
|
|
65
|
+
if (layout)
|
|
66
|
+
return new AniviewConfig(layout, defaultPage, pageMap, {}, {}, {});
|
|
67
|
+
return new AniviewConfig([[1]], 0, pageMap, {}, {}, {}); // Fallback
|
|
68
|
+
}, [providedConfig, layout, defaultPage, pageMap]);
|
|
69
|
+
// --- STATE & PHYSICS ---
|
|
70
|
+
const x = useSharedValue(0);
|
|
71
|
+
const y = useSharedValue(0);
|
|
72
|
+
// Use external lockMask if provided, otherwise create internal one
|
|
73
|
+
const internalLockMask = useSharedValue(0);
|
|
74
|
+
const lockMask = externalLockMask || internalLockMask;
|
|
75
|
+
// Use external gestureEnabled if provided, otherwise create internal one
|
|
76
|
+
const internalGestureEnabled = useSharedValue(true);
|
|
77
|
+
const gestureEnabled = externalGestureEnabled || internalGestureEnabled;
|
|
78
|
+
const lastTargetId = useSharedValue(config.defaultPage);
|
|
79
|
+
const isMoving = useSharedValue(false);
|
|
80
|
+
const [dimensions, setDimensions] = useState({
|
|
81
|
+
width: providedDims?.width ?? pageSize?.width ?? 0,
|
|
82
|
+
height: providedDims?.height ?? pageSize?.height ?? 0,
|
|
83
|
+
offsetX: providedDims?.offsetX ?? 0,
|
|
84
|
+
offsetY: providedDims?.offsetY ?? 0
|
|
85
|
+
});
|
|
86
|
+
// --- VIRTUALIZATION STATE ---
|
|
87
|
+
// Tracks which pages are near the "viewport" on the JS thread
|
|
88
|
+
// We use a ref and a forced refresh ONLY when absolutely needed to prevent
|
|
89
|
+
// every Aniview component from re-rendering on every page traversal.
|
|
90
|
+
const visiblePagesRef = useRef(new Set([config.resolvePageId(defaultPage)]));
|
|
91
|
+
const updateVisibility = (centerPage) => {
|
|
92
|
+
const visible = new Set();
|
|
93
|
+
const pages = config.getPages();
|
|
94
|
+
const resolvedCenter = config.resolvePageId(centerPage);
|
|
95
|
+
const centerPos = AniviewMath.pageIdToMatrixPos(resolvedCenter, config.layout);
|
|
96
|
+
pages.forEach((p) => {
|
|
97
|
+
const pPos = AniviewMath.pageIdToMatrixPos(p, config.layout);
|
|
98
|
+
const rowDist = Math.abs(pPos.r - centerPos.r);
|
|
99
|
+
const colDist = Math.abs(pPos.c - centerPos.c);
|
|
100
|
+
if (rowDist <= 1 && colDist <= 1)
|
|
101
|
+
visible.add(p);
|
|
102
|
+
});
|
|
103
|
+
const current = visiblePagesRef.current;
|
|
104
|
+
if (current.size !== visible.size || ![...visible].every(v => current.has(v))) {
|
|
105
|
+
visiblePagesRef.current = visible;
|
|
106
|
+
// Optimization: NO BROADCAST.
|
|
107
|
+
// We rely on the native proxy for virtualization checks within worklets.
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
// Sync the SharedValue target into the config engine for virtualization worklets
|
|
111
|
+
useEffect(() => {
|
|
112
|
+
if (config._setCurrentPageSV) {
|
|
113
|
+
config._setCurrentPageSV(lastTargetId);
|
|
114
|
+
}
|
|
115
|
+
}, [config, lastTargetId]);
|
|
116
|
+
// --- IMPERATIVE API ---
|
|
117
|
+
useImperativeHandle(ref, () => ({
|
|
118
|
+
snapToPage: (pageId) => {
|
|
119
|
+
const offset = config.getPageOffset(pageId, dimensions);
|
|
120
|
+
const springConfig = config.getSpringConfig();
|
|
121
|
+
isMoving.value = true;
|
|
122
|
+
x.value = withSpring(offset.x, springConfig, (finished) => {
|
|
123
|
+
if (finished)
|
|
124
|
+
isMoving.value = false;
|
|
125
|
+
});
|
|
126
|
+
y.value = withSpring(offset.y, springConfig);
|
|
127
|
+
lastTargetId.value = pageId;
|
|
128
|
+
updateVisibility(pageId);
|
|
129
|
+
if (onPageChange)
|
|
130
|
+
onPageChange(pageId);
|
|
131
|
+
},
|
|
132
|
+
getCurrentPage: () => lastTargetId.value,
|
|
133
|
+
lock: (mask) => { lockMask.value = mask; }
|
|
134
|
+
}));
|
|
135
|
+
// --- DYNAMIC UPDATES ---
|
|
136
|
+
useEffect(() => {
|
|
137
|
+
if (springConfig)
|
|
138
|
+
config.updateSpringConfig(springConfig);
|
|
139
|
+
}, [springConfig, config]);
|
|
140
|
+
useEffect(() => {
|
|
141
|
+
config.updateDimensions(dimensions);
|
|
142
|
+
}, [dimensions, config]);
|
|
143
|
+
// --- ONLAYOUT AUTO-SIZING ---
|
|
144
|
+
const onLayout = (e) => {
|
|
145
|
+
const { width, height, x: layoutX, y: layoutY } = e.nativeEvent.layout;
|
|
146
|
+
// Only update if dimensions drastically changed (debounce/diff)
|
|
147
|
+
if (Math.abs(width - dimensions.width) > 1 ||
|
|
148
|
+
Math.abs(height - dimensions.height) > 1 ||
|
|
149
|
+
Math.abs(layoutX - dimensions.offsetX) > 1 ||
|
|
150
|
+
Math.abs(layoutY - dimensions.offsetY) > 1) {
|
|
151
|
+
setDimensions(prev => ({
|
|
152
|
+
...prev,
|
|
153
|
+
width: providedDims?.width ?? (pageSize?.width || width),
|
|
154
|
+
height: providedDims?.height ?? (pageSize?.height || height),
|
|
155
|
+
offsetX: layoutX,
|
|
156
|
+
offsetY: layoutY
|
|
157
|
+
}));
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
// --- VIRTUALIZATION ---
|
|
161
|
+
const activationMap = useMemo(() => {
|
|
162
|
+
const map = {};
|
|
163
|
+
config.getPages().forEach(id => {
|
|
164
|
+
map[id] = makeMutable(1);
|
|
165
|
+
});
|
|
166
|
+
return map;
|
|
167
|
+
}, [config]);
|
|
168
|
+
// --- BOOTSTRAPPING ---
|
|
169
|
+
useEffect(() => {
|
|
170
|
+
if (config) {
|
|
171
|
+
const offset = config.getPageOffset(config.defaultPage, dimensions);
|
|
172
|
+
x.value = offset.x;
|
|
173
|
+
y.value = offset.y;
|
|
174
|
+
lastTargetId.value = config.defaultPage;
|
|
175
|
+
}
|
|
176
|
+
}, [config]);
|
|
177
|
+
// --- LEGACY TAB SYNC ---
|
|
178
|
+
useEffect(() => {
|
|
179
|
+
if (config && activePage !== undefined) {
|
|
180
|
+
if (lastTargetId.value === activePage)
|
|
181
|
+
return;
|
|
182
|
+
const offset = config.getPageOffset(activePage, dimensions);
|
|
183
|
+
const isMoved = Math.abs(x.value - offset.x) > 1 || Math.abs(y.value - offset.y) > 1;
|
|
184
|
+
if (isMoved) {
|
|
185
|
+
const physics = config.getSpringConfig();
|
|
186
|
+
isMoving.value = true;
|
|
187
|
+
x.value = withSpring(offset.x, physics, (finished) => {
|
|
188
|
+
if (finished)
|
|
189
|
+
isMoving.value = false;
|
|
190
|
+
});
|
|
191
|
+
y.value = withSpring(offset.y, physics);
|
|
192
|
+
lastTargetId.value = activePage;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}, [activePage, config]);
|
|
196
|
+
// --- GESTURE ---
|
|
197
|
+
// We recreate the gesture when key dependencies change.
|
|
198
|
+
// Ideally this should be stable, but config.generateGesture needs latest dims logic if re-run.
|
|
199
|
+
const panGesture = useMemo(() => {
|
|
200
|
+
return config.generateGesture(x, y, (pageId) => {
|
|
201
|
+
lastTargetId.value = pageId;
|
|
202
|
+
updateVisibility(pageId);
|
|
203
|
+
if (onPageChange)
|
|
204
|
+
onPageChange(pageId);
|
|
205
|
+
}, lockMask, simultaneousHandlers, gestureEnabled, dimensions, isMoving, lastTargetId);
|
|
206
|
+
}, [config, x, y, lockMask, onPageChange, dimensions, isMoving]); // Force rebuild when dimensions hit bitumen
|
|
207
|
+
if (gestureRef) {
|
|
208
|
+
panGesture.ref = gestureRef;
|
|
209
|
+
}
|
|
210
|
+
const contextValue = useMemo(() => ({
|
|
211
|
+
dimensions,
|
|
212
|
+
events: { x, y, ...(externalEvents || {}) },
|
|
213
|
+
activationMap,
|
|
214
|
+
panGesture,
|
|
215
|
+
config,
|
|
216
|
+
lock: (mask) => { lockMask.value = mask; },
|
|
217
|
+
visiblePages: visiblePagesRef.current,
|
|
218
|
+
isMoving
|
|
219
|
+
}), [dimensions, x, y, externalEvents, activationMap, config, panGesture, lockMask]);
|
|
220
|
+
return (<AniviewContext.Provider value={contextValue}>
|
|
221
|
+
<GestureDetector gesture={panGesture}>
|
|
222
|
+
{/* The Stage */}
|
|
223
|
+
<Animated.View style={{ flex: 1 }} onLayout={onLayout}>
|
|
224
|
+
{children}
|
|
225
|
+
</Animated.View>
|
|
226
|
+
</GestureDetector>
|
|
227
|
+
</AniviewContext.Provider>);
|
|
228
|
+
});
|
|
229
|
+
//# sourceMappingURL=aniviewProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aniviewProvider.js","sourceRoot":"","sources":["../src/aniviewProvider.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Valid directions for locking Aniview gestures.
|
|
3
|
+
*/
|
|
4
|
+
export type AniviewAxisLock = {
|
|
5
|
+
left?: boolean;
|
|
6
|
+
right?: boolean;
|
|
7
|
+
up?: boolean;
|
|
8
|
+
down?: boolean;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Utility to generate Aniview lock bitmasks.
|
|
12
|
+
*/
|
|
13
|
+
export declare const AniviewLock: {
|
|
14
|
+
mask: (directions: AniviewAxisLock) => number;
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=AniviewLock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AniviewLock.d.ts","sourceRoot":"","sources":["../../src/core/AniviewLock.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;CAClB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,WAAW;uBACD,eAAe;CAQrC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility to generate Aniview lock bitmasks.
|
|
3
|
+
*/
|
|
4
|
+
export const AniviewLock = {
|
|
5
|
+
mask: (directions) => {
|
|
6
|
+
let mask = 0;
|
|
7
|
+
if (directions.left)
|
|
8
|
+
mask |= 1;
|
|
9
|
+
if (directions.right)
|
|
10
|
+
mask |= 2;
|
|
11
|
+
if (directions.up)
|
|
12
|
+
mask |= 4;
|
|
13
|
+
if (directions.down)
|
|
14
|
+
mask |= 8;
|
|
15
|
+
return mask;
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=AniviewLock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AniviewLock.js","sourceRoot":"","sources":["../../src/core/AniviewLock.ts"],"names":[],"mappings":"AAUA;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACvB,IAAI,EAAE,CAAC,UAA2B,EAAE,EAAE;QAClC,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,IAAI,UAAU,CAAC,IAAI;YAAE,IAAI,IAAI,CAAC,CAAC;QAC/B,IAAI,UAAU,CAAC,KAAK;YAAE,IAAI,IAAI,CAAC,CAAC;QAChC,IAAI,UAAU,CAAC,EAAE;YAAE,IAAI,IAAI,CAAC,CAAC;QAC7B,IAAI,UAAU,CAAC,IAAI;YAAE,IAAI,IAAI,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ANIVIEW MATH CORE
|
|
3
|
+
*
|
|
4
|
+
* Pure functional implementation of Aniview's spatial logic.
|
|
5
|
+
*/
|
|
6
|
+
export interface MatrixPos {
|
|
7
|
+
r: number;
|
|
8
|
+
c: number;
|
|
9
|
+
}
|
|
10
|
+
export interface WorldBounds {
|
|
11
|
+
minX: number;
|
|
12
|
+
maxX: number;
|
|
13
|
+
minY: number;
|
|
14
|
+
maxY: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Converts a linear PageID to a (Row, Column) matrix position.
|
|
18
|
+
*/
|
|
19
|
+
export declare function pageIdToMatrixPos(pageId: number, layout: number[][]): MatrixPos;
|
|
20
|
+
/**
|
|
21
|
+
* Calculates the displacement between two indices on an axis, accounting for overlaps.
|
|
22
|
+
*/
|
|
23
|
+
export declare function calculateAxisOffset(from: number, to: number, size: number, overlaps: number[]): number;
|
|
24
|
+
/**
|
|
25
|
+
* Calculates the (x, y) coordinates of a page relative to a default origin page.
|
|
26
|
+
*/
|
|
27
|
+
export declare function getPageOffset(pageId: number, layout: number[][], contextDims: {
|
|
28
|
+
width: number;
|
|
29
|
+
height: number;
|
|
30
|
+
}, defaultPage: number, rowOverlaps: number[], colOverlaps: number[]): {
|
|
31
|
+
x: number;
|
|
32
|
+
y: number;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Calculates the absolute boundaries of the virtual world.
|
|
36
|
+
*/
|
|
37
|
+
export declare function getWorldBounds(pages: number[], layout: number[][], contextDims: {
|
|
38
|
+
width: number;
|
|
39
|
+
height: number;
|
|
40
|
+
}, defaultPage: number, rowOverlaps: number[], colOverlaps: number[]): WorldBounds;
|
|
41
|
+
//# sourceMappingURL=AniviewMath.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AniviewMath.d.ts","sourceRoot":"","sources":["../../src/core/AniviewMath.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,SAAS;IACxB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,GAAG,SAAS,CAc/E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAAE,GACjB,MAAM,CAYR;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EAAE,EAAE,EAClB,WAAW,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAC9C,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EAAE,EACrB,WAAW,EAAE,MAAM,EAAE,GACpB;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAS1B;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EAAE,EACf,MAAM,EAAE,MAAM,EAAE,EAAE,EAClB,WAAW,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAC9C,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EAAE,EACrB,WAAW,EAAE,MAAM,EAAE,GACpB,WAAW,CAgBb"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ANIVIEW MATH CORE
|
|
3
|
+
*
|
|
4
|
+
* Pure functional implementation of Aniview's spatial logic.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Converts a linear PageID to a (Row, Column) matrix position.
|
|
8
|
+
*/
|
|
9
|
+
export function pageIdToMatrixPos(pageId, layout) {
|
|
10
|
+
'worklet';
|
|
11
|
+
const rowLength = Math.max(1, layout[0]?.length || 0);
|
|
12
|
+
const numRows = layout.length;
|
|
13
|
+
const maxPage = numRows * rowLength - 1;
|
|
14
|
+
if (pageId < 0 || pageId > maxPage) {
|
|
15
|
+
return { r: 9999, c: 9999 };
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
r: Math.floor(pageId / rowLength),
|
|
19
|
+
c: pageId % rowLength
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Calculates the displacement between two indices on an axis, accounting for overlaps.
|
|
24
|
+
*/
|
|
25
|
+
export function calculateAxisOffset(from, to, size, overlaps) {
|
|
26
|
+
'worklet';
|
|
27
|
+
if (from === to)
|
|
28
|
+
return 0;
|
|
29
|
+
const direction = to > from ? 1 : -1;
|
|
30
|
+
let totalOffset = 0;
|
|
31
|
+
const start = Math.min(from, to);
|
|
32
|
+
const end = Math.max(from, to);
|
|
33
|
+
for (let i = start; i < end; i++) {
|
|
34
|
+
const overlapRatio = overlaps[i] || 0;
|
|
35
|
+
totalOffset += size * (1 - overlapRatio);
|
|
36
|
+
}
|
|
37
|
+
return totalOffset * direction;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Calculates the (x, y) coordinates of a page relative to a default origin page.
|
|
41
|
+
*/
|
|
42
|
+
export function getPageOffset(pageId, layout, contextDims, defaultPage, rowOverlaps, colOverlaps) {
|
|
43
|
+
'worklet';
|
|
44
|
+
const target = pageIdToMatrixPos(pageId, layout);
|
|
45
|
+
const origin = pageIdToMatrixPos(defaultPage, layout);
|
|
46
|
+
return {
|
|
47
|
+
x: calculateAxisOffset(origin.c, target.c, contextDims.width, colOverlaps),
|
|
48
|
+
y: calculateAxisOffset(origin.r, target.r, contextDims.height, rowOverlaps)
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Calculates the absolute boundaries of the virtual world.
|
|
53
|
+
*/
|
|
54
|
+
export function getWorldBounds(pages, layout, contextDims, defaultPage, rowOverlaps, colOverlaps) {
|
|
55
|
+
'worklet';
|
|
56
|
+
if (pages.length === 0)
|
|
57
|
+
return { minX: 0, maxX: 0, minY: 0, maxY: 0 };
|
|
58
|
+
const firstOffset = getPageOffset(pages[0], layout, contextDims, defaultPage, rowOverlaps, colOverlaps);
|
|
59
|
+
let minX = firstOffset.x, maxX = firstOffset.x, minY = firstOffset.y, maxY = firstOffset.y;
|
|
60
|
+
for (let i = 1; i < pages.length; i++) {
|
|
61
|
+
const offset = getPageOffset(pages[i], layout, contextDims, defaultPage, rowOverlaps, colOverlaps);
|
|
62
|
+
minX = Math.min(minX, offset.x);
|
|
63
|
+
maxX = Math.max(maxX, offset.x);
|
|
64
|
+
minY = Math.min(minY, offset.y);
|
|
65
|
+
maxY = Math.max(maxY, offset.y);
|
|
66
|
+
}
|
|
67
|
+
return { minX, maxX, minY, maxY };
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=AniviewMath.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AniviewMath.js","sourceRoot":"","sources":["../../src/core/AniviewMath.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { default as Aniview } from './Aniview';
|
|
2
|
+
export { AniviewProvider } from './aniviewProvider';
|
|
3
|
+
export { AniviewConfig } from './aniviewConfig';
|
|
4
|
+
export { useAniview } from './useAniview';
|
|
5
|
+
export { useAniviewLock, AniviewLock } from './useAniviewLock';
|
|
6
|
+
export * from './useAniviewContext';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/D,cAAc,qBAAqB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { default as Aniview } from './Aniview';
|
|
2
|
+
export { AniviewProvider } from './aniviewProvider';
|
|
3
|
+
export { AniviewConfig } from './aniviewConfig';
|
|
4
|
+
export { useAniview } from './useAniview';
|
|
5
|
+
export { useAniviewLock, AniviewLock } from './useAniviewLock';
|
|
6
|
+
export * from './useAniviewContext';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/D,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { AniviewProps, AniviewLogic, AniviewContextType } from "./useAniviewContext";
|
|
2
|
+
/**
|
|
3
|
+
* **useAniview** — Access the Aniview world context
|
|
4
|
+
*
|
|
5
|
+
* This hook has two overloads:
|
|
6
|
+
*
|
|
7
|
+
* **1. Context-only** (`useAniview()`) — Returns the raw {@link AniviewContextType}
|
|
8
|
+
* containing the camera SharedValues, config, dimensions, and gesture state.
|
|
9
|
+
* Use this when you need to read the camera position or react to page changes
|
|
10
|
+
* without being an animated component yourself.
|
|
11
|
+
*
|
|
12
|
+
* **2. Per-component** (`useAniview(props)`) — Used internally by `Aniview`
|
|
13
|
+
* components. Registers the component's `pageId` with the config engine and
|
|
14
|
+
* returns an {@link AniviewLogic} object containing the resolved registration,
|
|
15
|
+
* activation value, and keyframes. You rarely need this overload directly.
|
|
16
|
+
*
|
|
17
|
+
* @returns When called without arguments: `{ dimensions, events, config, activationMap, panGesture, visiblePages, isMoving }`
|
|
18
|
+
* @returns When called with props: `AniviewLogic` with additional `registration`, `activationValue`, and `keyframes`
|
|
19
|
+
*
|
|
20
|
+
* @throws Error if called outside of an `<AniviewProvider />`
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```tsx
|
|
24
|
+
* // Read camera position from any child
|
|
25
|
+
* function CameraDebug() {
|
|
26
|
+
* const { events } = useAniview();
|
|
27
|
+
* // events.x.value, events.y.value are the camera world coordinates
|
|
28
|
+
* }
|
|
29
|
+
*
|
|
30
|
+
* // React to custom events
|
|
31
|
+
* function ScrollReactor() {
|
|
32
|
+
* const { events } = useAniview();
|
|
33
|
+
* // events.scrollY?.value (if parent passed events={{ scrollY }})
|
|
34
|
+
* }
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare function useAniview(): AniviewContextType;
|
|
38
|
+
export declare function useAniview(props: AniviewProps): AniviewLogic;
|
|
39
|
+
//# sourceMappingURL=useAniview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAniview.d.ts","sourceRoot":"","sources":["../src/useAniview.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAkB,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAErG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,UAAU,IAAI,kBAAkB,CAAC;AACjD,wBAAgB,UAAU,CAAC,KAAK,EAAE,YAAY,GAAG,YAAY,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { useContext } from 'react';
|
|
2
|
+
import { AniviewContext } from "./useAniviewContext";
|
|
3
|
+
export function useAniview(props) {
|
|
4
|
+
const context = useContext(AniviewContext);
|
|
5
|
+
if (!context) {
|
|
6
|
+
throw new Error('Aniview components must be wrapped in an <AniviewProvider />');
|
|
7
|
+
}
|
|
8
|
+
// If no props provided, just return the raw context
|
|
9
|
+
if (!props || typeof props !== 'object')
|
|
10
|
+
return context;
|
|
11
|
+
const pageId = props.pageId;
|
|
12
|
+
const registration = context.config ? context.config.registerPage(pageId, context.dimensions) : {
|
|
13
|
+
offset: { x: 0, y: 0 },
|
|
14
|
+
dimensions: context.dimensions
|
|
15
|
+
};
|
|
16
|
+
const activationValue = (context.activationMap && pageId !== undefined) ? context.activationMap[pageId] : null;
|
|
17
|
+
const logic = {
|
|
18
|
+
dimensions: context.dimensions,
|
|
19
|
+
events: context.events,
|
|
20
|
+
activationMap: context.activationMap,
|
|
21
|
+
panGesture: context.panGesture,
|
|
22
|
+
config: context.config,
|
|
23
|
+
registration: registration,
|
|
24
|
+
activationValue: activationValue,
|
|
25
|
+
keyframes: props.frames,
|
|
26
|
+
lock: context.lock,
|
|
27
|
+
visiblePages: context.visiblePages,
|
|
28
|
+
isMoving: context.isMoving,
|
|
29
|
+
};
|
|
30
|
+
return logic;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=useAniview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAniview.js","sourceRoot":"","sources":["../src/useAniview.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACnC,OAAO,EAAE,cAAc,EAAkD,MAAM,qBAAqB,CAAC;AAuCrG,MAAM,UAAU,UAAU,CAAC,KAAoB;IAC7C,MAAM,OAAO,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAClF,CAAC;IAED,oDAAoD;IACpD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAExD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAE5B,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC9F,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;QACtB,UAAU,EAAE,OAAO,CAAC,UAAU;KAC/B,CAAC;IAEF,MAAM,eAAe,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAE,OAAO,CAAC,aAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAExH,MAAM,KAAK,GAAiB;QAC1B,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,YAAY,EAAE,YAAmB;QACjC,eAAe,EAAE,eAAsB;QACvC,SAAS,EAAE,KAAK,CAAC,MAAa;QAC9B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,QAAQ,EAAE,OAAO,CAAC,QAAQ;KAC3B,CAAC;IAEF,OAAO,KAAK,CAAC;AACf,CAAC"}
|