Popover
Displays rich content in a floating layer. Powered by Floating UI.
Dimensions
Set the dimensions for the layer.
package showcase
import (
"github.com/templui/templui/internal/components/button"
"github.com/templui/templui/internal/components/input"
"github.com/templui/templui/internal/components/label"
"github.com/templui/templui/internal/components/popover"
"github.com/templui/templui/internal/utils"
)
templ PopoverDefault() {
@popover.Trigger(popover.TriggerProps{
For: "default-popover",
}) {
@button.Button(button.Props{
Variant: button.VariantOutline,
}) {
Open Popover
}
}
@popover.Content(popover.ContentProps{
ID: "default-popover",
}) {
@PopoverContent()
}
}
templ PopoverContent() {
{{ var id = utils.RandomID() }}
<div class="p-4 space-y-4">
<div>
<h3 class="text-lg font-semibold">Dimensions</h3>
<p>Set the dimensions for the layer.</p>
</div>
<div class="flex flex-col gap-2 max-w-fit">
<div class="flex items-center gap-2">
@label.Label(label.Props{
For: "width" + id,
Class: "w-24",
}) {
Width
}
@input.Input(input.Props{
ID: "width" + id,
Placeholder: "Width",
Value: "100%",
Class: "flex-1",
})
</div>
<div class="flex items-center gap-2">
@label.Label(label.Props{
For: "height" + id,
Class: "w-24",
}) {
Height
}
@input.Input(input.Props{
ID: "height" + id,
Placeholder: "Height",
Value: "100%",
Class: "flex-1",
})
</div>
</div>
</div>
}
Installation
Install the component
templui add popoverAdd the JavaScript to your layout
@popover.Script()Call this template in your base layout file (e.g., in the <head> section).
Examples
Trigger & Closing
Dimensions
Set the dimensions for the layer.
Dimensions
Set the dimensions for the layer.
Dimensions
Set the dimensions for the layer.
Dimensions
Set the dimensions for the layer.
package showcase
import (
"github.com/templui/templui/internal/components/button"
"github.com/templui/templui/internal/components/popover"
)
templ PopoverTriggers() {
<div class="flex gap-2 flex-wrap">
@popover.Trigger(popover.TriggerProps{
For: "hover-popover",
TriggerType: popover.TriggerTypeHover,
}) {
@button.Button(button.Props{Variant: button.VariantOutline}) {
Hover
}
}
@popover.Content(popover.ContentProps{
ID: "hover-popover",
HoverDelay: 300,
HoverOutDelay: 500,
}) {
@PopoverContent()
}
@popover.Trigger(popover.TriggerProps{
For: "click-popover",
}) {
@button.Button(button.Props{Variant: button.VariantOutline}) {
Click
}
}
@popover.Content(popover.ContentProps{
ID: "click-popover",
}) {
@PopoverContent()
}
@popover.Trigger(popover.TriggerProps{
For: "no-clickaway-popover",
}) {
@button.Button(button.Props{Variant: button.VariantOutline}) {
No ClickAway
}
}
@popover.Content(popover.ContentProps{
ID: "no-clickaway-popover",
DisableClickAway: true,
}) {
@PopoverContent()
}
@popover.Trigger(popover.TriggerProps{
For: "no-clickaway-esc",
}) {
@button.Button(button.Props{Variant: button.VariantOutline}) {
No ClickAway-ESC
}
}
@popover.Content(popover.ContentProps{
ID: "no-clickaway-esc",
DisableClickAway: true,
DisableESC: true,
}) {
@PopoverContent()
}
</div>
}
Positions
Dimensions
Set the dimensions for the layer.
Dimensions
Set the dimensions for the layer.
Dimensions
Set the dimensions for the layer.
Dimensions
Set the dimensions for the layer.
Dimensions
Set the dimensions for the layer.
Dimensions
Set the dimensions for the layer.
Dimensions
Set the dimensions for the layer.
Dimensions
Set the dimensions for the layer.
Dimensions
Set the dimensions for the layer.
Dimensions
Set the dimensions for the layer.
Dimensions
Set the dimensions for the layer.
Dimensions
Set the dimensions for the layer.
package showcase
import (
"github.com/templui/templui/internal/components/button"
"github.com/templui/templui/internal/components/popover"
)
templ PopoverPositions() {
<div class="flex flex-col w-full max-w-md">
<div class="grid grid-cols-3 gap-2">
@popover.Trigger(popover.TriggerProps{
For: "top-start-popover",
TriggerType: popover.TriggerTypeHover,
}) {
@button.Button(button.Props{
Class: "w-full",
Variant: button.VariantOutline,
}) {
Top Start
}
}
@popover.Content(popover.ContentProps{
ID: "top-start-popover",
Placement: popover.PlacementTopStart,
ShowArrow: true,
}) {
@PopoverContent()
}
@popover.Trigger(popover.TriggerProps{
For: "top-popover",
TriggerType: popover.TriggerTypeHover,
}) {
@button.Button(button.Props{
Class: "w-full",
Variant: button.VariantOutline,
}) {
Top
}
}
@popover.Content(popover.ContentProps{
ID: "top-popover",
Placement: popover.PlacementTop,
ShowArrow: true,
}) {
@PopoverContent()
}
@popover.Trigger(popover.TriggerProps{
For: "top-end-popover",
TriggerType: popover.TriggerTypeHover,
}) {
@button.Button(button.Props{
Class: "w-full",
Variant: button.VariantOutline,
}) {
Top End
}
}
@popover.Content(popover.ContentProps{
ID: "top-end-popover",
Placement: popover.PlacementTopEnd,
ShowArrow: true,
}) {
@PopoverContent()
}
@popover.Trigger(popover.TriggerProps{
For: "right-start-popover",
TriggerType: popover.TriggerTypeHover,
}) {
@button.Button(button.Props{
Class: "w-full",
Variant: button.VariantOutline,
}) {
Right Start
}
}
@popover.Content(popover.ContentProps{
ID: "right-start-popover",
Placement: popover.PlacementRightStart,
ShowArrow: true,
}) {
@PopoverContent()
}
@popover.Trigger(popover.TriggerProps{
For: "right-popover",
TriggerType: popover.TriggerTypeHover,
}) {
@button.Button(button.Props{
Class: "w-full",
Variant: button.VariantOutline,
}) {
Right
}
}
@popover.Content(popover.ContentProps{
ID: "right-popover",
Placement: popover.PlacementRight,
ShowArrow: true,
}) {
@PopoverContent()
}
@popover.Trigger(popover.TriggerProps{
For: "right-end-popover",
TriggerType: popover.TriggerTypeHover,
}) {
@button.Button(button.Props{
Class: "w-full",
Variant: button.VariantOutline,
}) {
Right End
}
}
@popover.Content(popover.ContentProps{
ID: "right-end-popover",
Placement: popover.PlacementRightEnd,
ShowArrow: true,
}) {
@PopoverContent()
}
@popover.Trigger(popover.TriggerProps{
For: "bottom-start-popover",
TriggerType: popover.TriggerTypeHover,
}) {
@button.Button(button.Props{
Class: "w-full",
Variant: button.VariantOutline,
}) {
Bottom Start
}
}
@popover.Content(popover.ContentProps{
ID: "bottom-start-popover",
Placement: popover.PlacementBottomStart,
ShowArrow: true,
}) {
@PopoverContent()
}
@popover.Trigger(popover.TriggerProps{
For: "bottom-popover",
TriggerType: popover.TriggerTypeHover,
}) {
@button.Button(button.Props{
Class: "w-full",
Variant: button.VariantOutline,
}) {
Bottom
}
}
@popover.Content(popover.ContentProps{
ID: "bottom-popover",
Placement: popover.PlacementBottom,
ShowArrow: true,
}) {
@PopoverContent()
}
@popover.Trigger(popover.TriggerProps{
For: "bottom-end-popover",
TriggerType: popover.TriggerTypeHover,
}) {
@button.Button(button.Props{
Class: "w-full",
Variant: button.VariantOutline,
}) {
Bottom End
}
}
@popover.Content(popover.ContentProps{
ID: "bottom-end-popover",
Placement: popover.PlacementBottomEnd,
ShowArrow: true,
}) {
@PopoverContent()
}
@popover.Trigger(popover.TriggerProps{
For: "left-start-popover",
TriggerType: popover.TriggerTypeHover,
}) {
@button.Button(button.Props{
Class: "w-full",
Variant: button.VariantOutline,
}) {
Left Start
}
}
@popover.Content(popover.ContentProps{
ID: "left-start-popover",
Placement: popover.PlacementLeftStart,
ShowArrow: true,
}) {
@PopoverContent()
}
@popover.Trigger(popover.TriggerProps{
For: "left-popover",
TriggerType: popover.TriggerTypeHover,
}) {
@button.Button(button.Props{
Class: "w-full",
Variant: button.VariantOutline,
}) {
Left
}
}
@popover.Content(popover.ContentProps{
ID: "left-popover",
Placement: popover.PlacementLeft,
ShowArrow: true,
}) {
@PopoverContent()
}
@popover.Trigger(popover.TriggerProps{
For: "left-end-popover",
TriggerType: popover.TriggerTypeHover,
}) {
@button.Button(button.Props{
Class: "w-full",
Variant: button.VariantOutline,
}) {
Left End
}
}
@popover.Content(popover.ContentProps{
ID: "left-end-popover",
Placement: popover.PlacementLeftEnd,
ShowArrow: true,
}) {
@PopoverContent()
}
</div>
</div>
}
API Reference
Trigger
Element that triggers the popover when interacted with.
| Name | Type | Default |
|---|---|---|
Unique identifier for the trigger element. | | - |
Additional CSS classes to apply to the trigger. | | - |
Additional HTML attributes to apply to the trigger element. | | - |
ID of the popover content this trigger controls. | | - |
How the popover is triggered. Options: 'click', 'hover'. | | |
Content
Container for the popover content with positioning and behavior options.
| Name | Type | Default |
|---|---|---|
Unique identifier for the content element. | | - |
Additional CSS classes to apply to the content. | | - |
Additional HTML attributes to apply to the content element. | | - |
Position of the popover relative to trigger. Options: 'top', 'top-start', 'top-end', 'right', 'right-start', 'right-end', 'bottom', 'bottom-start', 'bottom-end', 'left', 'left-start', 'left-end'. | | |
Distance in pixels between the trigger and popover content. | | |
Prevents closing the popover when clicking outside. | | |
Prevents closing the popover with the ESC key. | | |
Whether to show an arrow pointing to the trigger element. | | |
Delay in milliseconds before showing on hover (for hover triggers). | | |
Delay in milliseconds before hiding on hover out (for hover triggers). | | |
Whether the popover should match the width of the trigger element. | | |
When true, opening this popover will close other exclusive popovers. | | |
JavaScript API
// Open a popover programmatically
window.tui.popover.open("popover-id");
// Close a popover
window.tui.popover.close("popover-id");
// Close all popovers (optionally except one)
window.tui.popover.closeAll(); // Closes all
window.tui.popover.closeAll("popover-id"); // Closes all except "popover-id"
// Toggle popover state
window.tui.popover.toggle("popover-id");
// Check if popover is open (returns true/false)
const isOpen = window.tui.popover.isOpen("popover-id");