Version v2.0.3 Size 4.2 KB gzip Dependencies Zero dependencies
Why Orbit?
Floating UI needs one owner for CSS coordinates, clipping boundaries, updates, and cleanup. Orbit provides a lifecycle positioner for normal UI and a pure computation API for advanced integrations.
ts
// Before
const { x, y } = computeSomehow(trigger, panel);
panel.style.left = `${x}px`;
panel.style.top = `${y}px`;
// After
const positioner = createPositioner(trigger, panel);
positioner.start();| Feature | Manual DOM positioning | Orbit |
|---|---|---|
| Bundle size | 0 B | 4.2 KB |
| Root dependencies | Application-defined | |
| Clipping boundary | Manual geometry | clippingAncestors default |
| Coordinate strategy | Consumer logic | fixed / absolute |
| Cleanup | Manual listeners | dispose() |
Use Orbit when floating UI needs robust placement, collision handling, or reactive updates.
Consider direct CSS when placement is static and never depends on element geometry.
Installation
sh
pnpm add @vielzeug/orbitsh
npm install @vielzeug/orbitsh
yarn add @vielzeug/orbitQuick Start
Start a positioner only after its reference and floating elements mount.
ts
import { createPositioner, flip, offset, shift } from '@vielzeug/orbit';
const positioner = createPositioner(trigger, tooltip, {
middleware: [offset(8), flip(), shift({ padding: 6 })],
placement: 'top',
});
positioner.start();
positioner.dispose();Features
createPositioner()— Lifecycle-owned floating positioningcomputePosition()— Low-level calculation for advanced integrationsautoUpdate()— Scroll, viewport, resize, and animation-frame updates- Middleware — Offset, flip, shift, size, hide, arrow, inline, auto-placement
strategy— Explicitfixedorabsolutecoordinate behavior/reactive— Optional Ripple position readable