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,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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"}
@@ -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"}