Skip to main content

API Reference

This page documents the public API exported from src/index.ts.

import {
Aniview,
AniviewProvider,
AniviewConfig,
useAniview,
useAniviewLock,
AniviewLock,
} from "aniview";

AniviewProvider

Root provider for the Aniview world. It owns the camera shared values, provider dimensions, gesture handler, page config, custom event shared values, and imperative navigation API.

<AniviewProvider layout={[[1, 1]]} pageMap={{ HOME: 0, DETAILS: 1 }}>
{/* Aniview children */}
</AniviewProvider>

Props

PropTypeRequiredDefaultNotes
childrenReact.ReactNodeYes-Rendered inside the gesture detector and provider context.
configAniviewConfigNointernal [[1]] configUse this for advanced layouts, overlaps, or custom adjacency.
layoutnumber[][]No[[1]]Convenience alternative to config. 1 means active page, 0 means empty cell.
defaultPagenumber | stringNo0Initial page ID. Semantic strings are resolved through pageMap.
pageMapRecord<string, number>No{}Maps names such as HOME to numeric page IDs.
pageSize{ width: number; height: number }Nomeasured provider sizeExplicit page size.
dimensionsPartial<{ width; height; offsetX; offsetY }>Nomeasured provider sizeLow-level dimension override.
onPageChange(pageId: number | string) => voidNo-Called when a snap target changes.
activePagenumber | stringNo-Legacy declarative page control. Prefer the ref API for new code.
springConfigWithSpringConfigNoconfig defaultOverrides snap spring physics.
eventsRecord<string, SharedValue<number>>No{}Custom Reanimated shared values used by event frames.
gestureRefReact.RefObject<any>Nointernal refExternal ref for the provider pan gesture.
externalLockMaskSharedValue<number>Nointernal maskAdvanced gesture lock mask. See Gesture Control.
gestureEnabledSharedValue<boolean>Nointernal trueGlobally enables/disables the provider pan gesture.
simultaneousHandlersRefObject<GestureType> | RefObject<GestureType>[]No-RNGH gestures that may run simultaneously with Aniview's pan gesture.

Ref API

Attach a ref to call the imperative navigation methods.

interface AniviewHandle {
snapToPage: (pageId: number | string) => void;
getCurrentPage: () => number | string;
lock: (mask: number) => void;
}
const ref = useRef<AniviewHandle>(null);

<AniviewProvider ref={ref} layout={[[1, 1]]}>
{/* children */}
</AniviewProvider>

ref.current?.snapToPage(1);

Aniview

Animated world-positioned view. Each Aniview has a home page and optional frames.

Props

PropTypeRequiredDefaultNotes
pageIdnumber | stringYes-Home page for this component.
framesRecord<string, AniviewFrame> | AniviewFrame[]No{}Spatial and/or event frame definitions.
styleViewStyle | ViewStyle[]No{}Base style at the home page.
childrenReact.ReactNodeNo-Rendered inside the animated view.
pointerEvents"box-none" | "none" | "box-only" | "auto"NoReact Native defaultPassed to the rendered view.
persistentbooleanNofalseKeeps the component mounted when far offscreen. Useful for GL/canvas/video/local state.
other ViewPropsAnimatedProps<ViewProps>No-Forwarded to the animated view.

Frames

interface AniviewFrame {
page?: number | string;
event?: string;
value?: number;
style?: ViewStyle | ViewStyle[];
eventPersistent?: boolean;
persistent?: boolean; // deprecated alias for eventPersistent
opacity?: number;
scale?: number;
rotate?: number;
springConfig?: any;
}

Spatial frames use page:

<Aniview
pageId="HOME"
style={{ opacity: 1 }}
frames={{
hiddenOnProfile: {
page: "PROFILE",
style: { opacity: 0 },
},
}}
/>

Event frames use event and value. The event name must exist in AniviewProvider events.

const scrollY = useSharedValue(0);

<AniviewProvider layout={[[1]]} events={{ scrollY }}>
<Aniview
pageId={0}
frames={{
collapsed: {
event: "scrollY",
value: 120,
style: { opacity: 0, transform: [{ translateY: -40 }] },
},
}}
/>
</AniviewProvider>

Style Support

Aniview bakes and interpolates common numeric, color, and transform values from flattened React Native styles.

  • Numeric examples: width, height, left, top, opacity, borderRadius, margins, padding, shadowOpacity, shadowRadius, elevation
  • Color examples: backgroundColor, borderColor, shadowColor, color, and other keys containing color
  • Transform examples: translateX, translateY, scale, scaleX, scaleY, rotate, rotateX, rotateY, rotateZ, skewX, skewY

Unsupported or non-interpolated style values are carried through as static style data when possible.

AniviewConfig

Configuration engine for page layout, page ID resolution, page offsets, overlap math, layout cache, and gesture generation.

Constructor

new AniviewConfig(
layout: number[][],
defaultPage?: number | string | null,
pageMap?: Record<string, number>,
initialDims?: Partial<Dimensions>,
overlaps?: { cols?: number[]; rows?: number[] },
providedGraph?: AdjacencyMap | null
)
ParameterTypeDefaultNotes
layoutnumber[][][[1]]Grid matrix. Active page IDs are computed as rowIndex * columnCount + columnIndex.
defaultPagenumber | string | null0Initial page and world origin.
pageMapRecord<string, number>{}Semantic name to numeric page ID map.
initialDimsPartial<Dimensions>{}Initial dimensions before provider measurement.
overlaps{ cols?: number[]; rows?: number[] }{}Adjacent page overlap ratios.
providedGraphAdjacencyMap | nullnullReserved custom adjacency map.

Common Methods

MethodReturnsNotes
resolvePageId(pageId)numberResolves a numeric or semantic page ID. Unknown strings parse as numbers or fall back to 0.
getPages()number[]Active page IDs from the layout matrix.
getPageOffset(pageId, dims){ x: number; y: number }World coordinate offset for a page.
getPagesMap(dims)Record<number, { x; y }>Offset map for all active pages.
getWorldBounds(dims)WorldBoundsMin/max camera bounds for gesture clamping.
updateDimensions(dims)voidUpdates config dimension state.
updateSpringConfig(config)voidMerges spring physics overrides.
getSpringConfig()WithSpringConfigReturns current snap spring config.
registerLayout(componentId, layout)voidCaches measured component layout for remounts.
getLayout(componentId)layout or undefinedReads cached component layout.

Hooks

useAniview()

Returns the provider context. Throws if called outside AniviewProvider.

const {
dimensions,
events,
config,
panGesture,
visiblePages,
isMoving,
parentGestureRef,
currentPageSV,
} = useAniview();
FieldTypeNotes
dimensions{ width; height; offsetX; offsetY }Current provider dimensions.
events{ x; y; [eventName]: SharedValue<number> }Camera shared values plus custom events.
activationMapRecord<number, SharedValue<number>>Internal page activation map.
panGestureanyProvider pan gesture.
configIAniviewConfigActive config instance.
lock(mask: number) => voidLow-level gesture lock setter.
visiblePagesSet<number>Current near-page set.
isMovingSharedValue<boolean>Whether snapping/gesture movement is in progress.
parentGestureRefReact.RefObject<any>Ref for child gesture coordination.
currentPageSVSharedValue<number | string>Last snapped target page.

useAniview(props) is an internal overload used by Aniview itself to register a component. Most apps should use useAniview() without arguments.

useAniviewLock()

Directional gesture-lock helper built on the nearest provider context.

const { lockDirections, unlock, isMoving } = useAniviewLock();

lockDirections({ left: true, right: true });
unlock();
type AniviewAxisLock = {
left?: boolean;
right?: boolean;
up?: boolean;
down?: boolean;
};

AniviewLock.mask(directions) returns the numeric mask for a direction object. Prefer this helper over hand-coded masks in app code.

Types

interface Dimensions {
width: number;
height: number;
offsetX: number;
offsetY: number;
}

interface WorldBounds {
minX: number;
maxX: number;
minY: number;
maxY: number;
}

type AdjacencyMap = Record<number, Record<number, number>>;

Next Steps