Skip to content

API Overview

SymbolPurposeExecution modeCommon gotcha
createPositioner()Lifecycle-owned floating positioningSyncCall start() after mount
computePosition()Low-level geometry computationSyncCaller owns CSS application
autoUpdate()Listen for geometry changesSyncCall returned cleanup
createReactivePositioner()Optional Ripple position readableSyncRequires @vielzeug/ripple
Middleware factoriesAdjust placement and sizeSyncOrder is explicit

Package Entry Points

ImportPurpose
@vielzeug/orbitPositioner, computation, updates, middleware, and types.
@vielzeug/orbit/reactiveOptional Ripple position adapter.
@vielzeug/orbit/presetsPreset placement and middleware options.
@vielzeug/orbit/devtoolsDevelopment overlay.

Core Functions

createPositioner()

ts
function createPositioner(
  reference: ReferenceElement,
  floating: HTMLElement,
  options?: PositionerOptions,
): Positioner;

Creates an unstarted positioner.

ParameterTypeDescription
referenceReferenceElementDOM or virtual anchor.
floatingHTMLElementPositioned element.
optionsPositionerOptionsStrategy, clipping, middleware, updates, and application callback.

Returns: Positioner.

ts
import { createPositioner } from '@vielzeug/orbit';

const positioner = createPositioner(trigger, tooltip);
positioner.start();
positioner.dispose();
MemberReturnContract
start()voidStarts positioning once.
update()voidRecomputes and applies position.
getPosition()ComputePositionResult | nullLatest result; null before first update.
dispose()voidStops updates and aborts disposal signal.

computePosition()

ts
function computePosition(
  reference: ReferenceElement,
  floating: HTMLElement,
  options?: ComputePositionOptions,
): ComputePositionResult;

Calculates position without applying DOM styles or creating listeners.

Returns: ComputePositionResult.

autoUpdate()

ts
function autoUpdate(
  reference: ReferenceElement,
  floating: HTMLElement,
  update: () => void,
  options?: AutoUpdateOptions,
): () => void;

Calls update immediately, then on relevant scroll, viewport, resize, and optional animation-frame changes.

Returns: cleanup callback.

Middleware

ts
type Middleware = (state: MiddlewareState) => MiddlewareResult | void;

Built-in factories: arrow, autoPlacement, flip, hide, inline, offset, shift, limitShift, and size.

ts
const middleware = [offset(8), flip(), shift({ padding: 6 }), size()];

middlewareData is Record<string, unknown>; narrow custom data at the consuming boundary.

Reactive Adapter

ts
function createReactivePositioner(
  reference: ReferenceElement,
  floating: HTMLElement,
  options?: Omit<PositionerOptions, 'apply'>,
): ReactivePositioner;

ReactivePositioner.position is Readable<ComputePositionResult | null>.

Types

ts
type PositionStrategy = 'absolute' | 'fixed';

type PositionerOptions = Omit<ComputePositionOptions, 'boundary' | 'containingBlock'> & {
  apply?: (result: ComputePositionResult) => void;
  autoUpdate?: AutoUpdateOptions | false;
  boundary?: Element | Rect | 'clippingAncestors';
  strategy?: PositionStrategy;
};

interface Positioner {
  readonly disposalSignal: AbortSignal;
  dispose(): void;
  readonly disposed: boolean;
  getPosition(): ComputePositionResult | null;
  start(): void;
  update(): void;
  [Symbol.dispose](): void;
}

See source declarations for complete geometry and middleware option types.

Errors

ErrorTriggerNotable properties
OrbitConfigErrorInvalid middleware reset configurationExtends OrbitError
OrbitErrorBase Orbit errorinstanceof OrbitError narrows Orbit errors