A controlled floating-surface primitive for contextual actions and small overlays.
Quickstart
Use open as the source of truth, and set x/y from the trigger event.
<rtgl-button id="open-popover">Open Popover</rtgl-button>
<rtgl-popover id="popover" place="bs">
<rtgl-view slot="content" d="v" g="sm">
<rtgl-text s="h5">Popover</rtgl-text>
<rtgl-text c="mu">Contextual content goes here.</rtgl-text>
<rtgl-button v="ol" id="close-popover">Close</rtgl-button>
</rtgl-view>
</rtgl-popover>
<script>
const popover = document.getElementById("popover");
document.getElementById("open-popover").addEventListener("click", (e) => {
popover.setAttribute("open", "");
popover.setAttribute("x", String(e.clientX));
popover.setAttribute("y", String(e.clientY));
});
document.getElementById("close-popover").addEventListener("click", () => {
popover.removeAttribute("open");
});
popover.addEventListener("close", () => {
popover.removeAttribute("open");
});
</script>
Attributes
| Name | Attribute | Type | Default |
|---|---|---|---|
| Open | open |
boolean | - |
| Position X | x |
number (viewport px) | 0 |
| Position Y | y |
number (viewport px) | 0 |
| Place | place |
t, ts, te, r, rs, re, b, bs, be, l, ls, le |
bs |
| No Overlay | no-overlay |
boolean | - |
| Content Scroll | content-sv |
boolean | - |
| Content Scrollbar Visibility | content-sbv |
touch, always |
- |
Events
| Event | Description |
|---|---|
close |
Close request event on Escape, and on overlay/backdrop close intent when overlay mode is enabled. |
Open State
rtgl-popover is controlled by the open attribute.
Behavior & precedence
- Add
opento show. - Remove
opento hide. closeis a close request; visibility still followsopen.- Overlay/backdrop close intent applies in default overlay mode.
<rtgl-popover open x="120" y="120">
<rtgl-view slot="content">
<rtgl-text>Open popover</rtgl-text>
</rtgl-view>
</rtgl-popover>
Position
Use x and y to anchor the popover at viewport coordinates.
Behavior & precedence
xandyare read as numbers.- Omitted coordinates resolve to
0. - Position updates when
x,y, orplacechanges while open.
<rtgl-button id="at-cursor">Open At Cursor</rtgl-button>
<rtgl-popover id="cursor-popover">
<rtgl-view slot="content">
<rtgl-text>Anchored to click position</rtgl-text>
</rtgl-view>
</rtgl-popover>
<script>
const pop = document.getElementById("cursor-popover");
document.getElementById("at-cursor").addEventListener("click", (e) => {
pop.setAttribute("x", String(e.clientX));
pop.setAttribute("y", String(e.clientY));
pop.setAttribute("open", "");
});
</script>
Place
Choose where the surface appears relative to the x/y anchor.
t,ts,ter,rs,reb,bs,bel,ls,le
<rtgl-view d="h" g="md">
<rtgl-popover open x="120" y="120" place="t">
<rtgl-view slot="content"><rtgl-text>Top</rtgl-text></rtgl-view>
</rtgl-popover>
<rtgl-popover open x="260" y="120" place="rs">
<rtgl-view slot="content"><rtgl-text>Right Start</rtgl-text></rtgl-view>
</rtgl-popover>
</rtgl-view>
No Overlay
Use no-overlay for non-modal floating surfaces.
Behavior & precedence
no-overlayremoves modal backdrop behavior.- Outside-click close is not automatic in this mode.
- Keep close behavior controlled by your own logic and
openupdates.
<rtgl-popover open no-overlay x="160" y="180">
<rtgl-view slot="content">
<rtgl-text>Overlay disabled</rtgl-text>
</rtgl-view>
</rtgl-popover>
Content Slot
Render popover body via slot="content", or use default (unslotted) children.
Caller-owned children stay directly under rtgl-popover when it opens, updates,
and closes. This lets reactive renderers add, remove, and reorder content safely.
The styled scrolling surface lives in the popover's shadow DOM; slot="floating"
continues to render in a separate layer above it.
Use popover.content to access the scrolling surface (for example,
popover.content.scrollTop). Query caller content with
popover.querySelector(...), since slotted children are not descendants of the
internal surface.
<rtgl-popover open x="120" y="140">
<rtgl-view slot="content" d="v" g="sm">
<rtgl-text s="h5">Actions</rtgl-text>
<rtgl-button v="gh">Rename</rtgl-button>
<rtgl-button v="de">Delete</rtgl-button>
</rtgl-view>
</rtgl-popover>