Positioner
Headless Positioner; covers CSS absolute positioning, visual viewport, collision flipping.
|
|
| Package |
@vizejs/ui/positioner |
| Maturity |
stable |
| Own the source |
vize lib pull positioner |
| Requires |
context |
| Aliases |
floating, anchor position, collision, arrow, size, safe area |
| Covers |
CSS absolute positioning, visual viewport, collision flipping, safe-area environment insets |
Usage
import { Positioner, PositionerArrow } from "@vizejs/ui/positioner";
Or copy the source into your project with vize lib pull positioner (see Source Distribution).
API
Positioner
Source: src/families/overlays/positioner/positioner.vue
Props
| Prop |
Type |
Default |
Description |
reference |
PositionerElement | null |
null |
Reference element or virtual box the floating content is placed against. |
placement |
Placement |
"bottom" |
Preferred placement before collision handling. |
strategy |
PositionerStrategy |
"fixed" |
CSS positioning mode published on the floating host. |
offset |
number |
0 |
Gap on the main axis between reference and floating. |
collisionPadding |
number |
0 |
Viewport padding the floating element should not cross. |
arrowPadding |
number |
0 |
Inset kept between the arrow and floating edges. |
direction |
"ltr" | "rtl" |
"ltr" |
Writing direction used to resolve start/end alignment. |
flip |
boolean |
true |
Flip to the opposite side when the preferred side overflows more. |
shift |
boolean |
true |
Shift the floating box back into the viewport after flip. |
size |
boolean |
false |
Constrain the host to the available space with max-width/max-height and publish --vize-ui-positioner-available-width and --vize-ui-positioner-available-height custom properties. |
safeArea |
boolean |
false |
Inset the active viewport by env(safe-area-inset-*) before collision handling, keeping floating content clear of notches and rounded corners. |
hide |
boolean |
true |
Hide when the reference no longer intersects the viewport. |
updateOnScroll |
boolean |
true |
Recalculate while ancestors scroll. |
updateOnResize |
boolean |
true |
Recalculate when the document or visual viewport resizes. |
viewport |
Rect |
undefined |
Viewport used for flip, shift, and hide. Defaults to the visual viewport. |
Slots
| Slot |
Slot props |
Description |
default |
{ readonly placement: Placement; readonly ready: boolean } |
Floating contents. Receives resolved placement for styling hooks. |
Exposed
| Member |
Type |
Description |
arrowStyle |
— |
|
availableHeight |
— |
|
availableWidth |
— |
|
element |
Readonly<ShallowRef<HTMLElement | null>> |
Template ref to the rendered root element. |
hidden |
— |
|
ready |
— |
|
resolvedPlacement |
— |
|
style |
— |
|
update |
— |
|
x |
— |
|
y |
— |
|
PositionerArrow
Source: src/families/overlays/positioner/positioner-arrow.vue
Slots
| Slot |
Slot props |
Description |
default |
{ readonly x: number | null; readonly y: number | null } |
Decorative arrow contents. Receives coordinates for optional custom drawing. |
Exposed
| Member |
Type |
Description |
element |
Readonly<ShallowRef<HTMLElement | null>> |
Template ref to the rendered root element. |
x |
— |
|
y |
— |
|
Behavior
Normative state × input → outcome table for positioner.vue and
positioner-arrow.vue (@vizejs/ui/positioner). Every row is proven by the
named test in src/families/overlays/positioner/positioner.test.ts,
src/families/overlays/positioner/positioner-geometry.test.ts,
src/families/overlays/positioner/positioner-size.test.ts,
src/families/overlays/positioner/positioner-viewport.test.ts, or
src/families/overlays/positioner/positioner-ssr.test.ts; compile-only
assertions live in src/families/overlays/positioner/positioner.types.test-d.ts.
| # |
State |
Input |
Outcome |
Proven by |
| P1 |
unmeasured |
render without a reference |
host stays at origin with ready=false |
renders a fixed host before the first measure |
| P2 |
unmeasured |
virtual reference after mount |
coordinates move to the preferred placement |
places below a virtual reference |
| P3 |
overflowing side |
flip |
opposite side is chosen when it overflows less |
geometry flip test |
| P4 |
overflowing edge |
shift |
floating box is clamped inside the viewport |
geometry shift test |
| P5 |
off-screen ref |
hide |
hidden is true when the reference leaves view |
geometry hide test |
| P6 |
rtl |
top-start |
start alignment mirrors to the inline-end edge |
geometry rtl test |
| P7 |
measured |
arrow child |
arrow is clamped along the facing edge |
clamps the arrow along the facing edge |
| P8 |
any |
missing Positioner provider |
arrow setup throws a missing-context diagnostic |
rejects an arrow outside Positioner |
| P9 |
present |
render |
exposed element is the rendered node |
exposes the rendered element for composition |
| P10 |
SSR |
default render |
byte-identical origin markup, no viewport reads |
SSR test |
| P11 |
public types |
invalid placement or mutating readonly refs |
compilation rejects misuse |
src/families/overlays/positioner/positioner.types.test-d.ts |
| P12 |
measured |
any side |
available space stops at the reference edge |
measures available space on every side |
| P13 |
measured |
size |
host publishes max size and custom properties |
constrains the host to the available space when size is enabled |
| P14 |
measured |
default size |
host style stays byte-identical without opt-in |
leaves the host style untouched when size is off |
| P15 |
keyboard open |
visual viewport shrinks |
floating box stays inside the visible viewport |
keeps the floating box inside the keyboard-shrunk visual viewport |
| P16 |
notched display |
safeArea |
collision handling respects env(safe-area-inset-*) |
applies safe-area insets to collision handling |
| P17 |
any |
viewport insets |
inset math clamps at an empty box |
insets the viewport by per-edge insets |