Popover

Display additional information in a popover on click or hover

<dui-popover>
    <dui-popover-trigger as-child="true">
        <dui-button variant="ButtonVariant.Outline">
            <dui-icon name="sliders-horizontal" class="text-muted-foreground"/>
            Configure View
        </dui-button>
    </dui-popover-trigger>
    <dui-popover-content class="flex flex-col gap-3">
        <dui-field-set>
            <dui-field-legend variant="FieldLegendVariant.Label">Sort By</dui-field-legend>
            <dui-field-group data-slot="radio-group">
                <dui-field orientation="FieldOrientation.Horizontal">
                    <dui-input type="radio" name="sort-by" value="departure" id="sort-departure" checked/>
                    <dui-field-label for="sort-departure" class="font-normal">
                        Departure Date
                    </dui-field-label>
                </dui-field>
                <dui-field orientation="FieldOrientation.Horizontal">
                    <dui-input type="radio" name="sort-by" value="posted" id="sort-posted"/>
                    <dui-field-label for="sort-posted" class="font-normal">
                        Date Posted
                    </dui-field-label>
                </dui-field>
            </dui-field-group>
        </dui-field-set>
        <dui-separator orientation="SeparatorOrientation.Horizontal"/>
        <dui-field-set>
            <dui-field-legend variant="FieldLegendVariant.Label">View As</dui-field-legend>
            <dui-field-group data-slot="radio-group">
                <dui-field orientation="FieldOrientation.Horizontal">
                    <dui-input type="radio" name="view-as" value="departure" id="view-list" checked/>
                    <dui-field-label for="view-list" class="font-normal">
                        List
                    </dui-field-label>
                </dui-field>
                <dui-field orientation="FieldOrientation.Horizontal">
                    <dui-input type="radio" name="view-as" value="posted" id="view-gallery"/>
                    <dui-field-label for="view-gallery" class="font-normal">
                        Gallery
                    </dui-field-label>
                </dui-field>
            </dui-field-group>
        </dui-field-set>
    </dui-popover-content>
</dui-popover>

Usage

<dui-popover>
    <dui-popover-trigger>
        <!-- add the element that triggers the popover here -->
    </dui-popover-trigger>
    <dui-popover-content>
        <!-- add the popover content here -->
    </dui-popover-content>
</dui-popover>

Examples

Button as trigger

The dui-popover-trigger is rendered as a button. This creates issues when you want to add a button element inside the trigger as you cannot use nested button elements.

To work around this limitation, make sure you add the as-child Tag Helper attribute to dui-popover-trigger. This will merge the attributes and behavior of dui-popover-trigger with its child content and render a single button element.

<dui-popover>
    <dui-popover-trigger as-child="true">
        <dui-button variant="ButtonVariant.Outline">Use as-child with Button</dui-button>
    </dui-popover-trigger>
    <dui-popover-content>
        <dui-stack>
            <dui-skeleton class="h-4 w-[250px]"/>
            <dui-skeleton class="h-4 w-[250px]"/>
        </dui-stack>
    </dui-popover-content>
</dui-popover>

The as-child Tag Helper is very powerful but comes with some caveats. Please refer to the documentation for more information.

Hover

You can trigger the popover on hover using the open-on-hover attribute.

<dui-popover open-on-hover="true">
    <dui-popover-trigger class="cursor-pointer flex items-center gap-3">
        <dui-avatar src="https://api.dicebear.com/9.x/adventurer-neutral/svg?seed=Brooklynn"/>
        <span class="font-medium">Ibn Battuta</span>
    </dui-popover-trigger>
    <dui-popover-content class="flex flex-col gap-3">
        <dui-avatar src="https://api.dicebear.com/9.x/adventurer-neutral/svg?seed=Brooklynn"/>
        <div>
            <p class="font-medium">Ibn Battuta</p>
            <div class="flex items-center gap-2">
                <div>@@ibnbattuta</div>
                <dui-badge>Follows you</dui-badge>
            </div>
        </div>
        <div class="flex items-center gap-4">
            <p><span class="font-medium">655</span> following</p>
            <p><span class="font-medium">100.3k</span> followers</p>
        </div>
        <div class="flex gap-2">
            <dui-button variant="ButtonVariant.Secondary" class="flex-1">
                <dui-icon name="check"/>
                Following
            </dui-button>
            <dui-button class="flex-1">
                <dui-icon name="mail"/>
                Message
            </dui-button>
        </div>
    </dui-popover-content>
</dui-popover>

Position

Control the position of the popover relative to the trigger element using the popup-side and popup-align attributes.

<dui-popover popup-side="PopupSide.Top" popup-align="PopupAlign.Start">
    <dui-popover-trigger as-child="true">
        <dui-button variant="ButtonVariant.Outline" class="w-full">Top Start</dui-button>
    </dui-popover-trigger>
    <dui-popover-content class="w-[230px]">
        <dui-stack>
            <dui-skeleton class="h-4 w-[200px]"/>
            <dui-skeleton class="h-4 w-[200px]"/>
        </dui-stack>
    </dui-popover-content>
</dui-popover>
<dui-popover popup-side="PopupSide.Right" popup-align="PopupAlign.Center">
    <dui-popover-trigger as-child="true">
        <dui-button variant="ButtonVariant.Outline" class="w-full">Right Center</dui-button>
    </dui-popover-trigger>
    <dui-popover-content class="w-[230px]">
        <dui-stack>
            <dui-skeleton class="h-4 w-[200px]"/>
            <dui-skeleton class="h-4 w-[200px]"/>
        </dui-stack>
    </dui-popover-content>
</dui-popover>
<dui-popover popup-side="PopupSide.Left" popup-align="PopupAlign.End">
    <dui-popover-trigger as-child="true">
        <dui-button variant="ButtonVariant.Outline" class="w-full">Left End</dui-button>
    </dui-popover-trigger>
    <dui-popover-content class="w-[230px]">
        <dui-stack>
            <dui-skeleton class="h-4 w-[200px]"/>
            <dui-skeleton class="h-4 w-[200px]"/>
        </dui-stack>
    </dui-popover-content>
</dui-popover>
<dui-popover popup-side="PopupSide.Bottom" popup-align="PopupAlign.End">
    <dui-popover-trigger as-child="true">
        <dui-button variant="ButtonVariant.Outline" class="w-full">Bottom End</dui-button>
    </dui-popover-trigger>
    <dui-popover-content class="w-[230px]">
        <dui-stack>
            <dui-skeleton class="h-4 w-[200px]"/>
            <dui-skeleton class="h-4 w-[200px]"/>
        </dui-stack>
    </dui-popover-content>
</dui-popover>

Offset

Control the offset of the popover from the trigger element using the popup-offset attribute.

<dui-popover popup-offset="20">
    <dui-popover-trigger as-child="true">
        <dui-button variant="ButtonVariant.Outline">Offset</dui-button>
    </dui-popover-trigger>
    <dui-popover-content>
        <dui-stack>
            <dui-skeleton class="h-4 w-[250px]"/>
            <dui-skeleton class="h-4 w-[250px]"/>
        </dui-stack>
    </dui-popover-content>
</dui-popover>

Open by default

Open a popover by default using the default-open attribute.

<dui-popover default-open="true">
    <dui-popover-trigger as-child="true">
        <dui-button variant="ButtonVariant.Outline">Open by default</dui-button>
    </dui-popover-trigger>
    <dui-popover-content>
        <dui-stack>
            <dui-skeleton class="h-4 w-[250px]"/>
            <dui-skeleton class="h-4 w-[250px]"/>
        </dui-stack>
    </dui-popover-content>
</dui-popover>

Teleport

Use the teleport attribute of dui-popover-content to teleport your popup content to another part of the DOM. This is helpful to break out of the z-index of the current container.

<dui-popover>
    <dui-popover-trigger as-child="true">
        <dui-button variant="ButtonVariant.Outline">Teleport</dui-button>
    </dui-popover-trigger>
    <dui-popover-content teleport="body">
        <p>This popup is a child element of the &lt;body&gt; element.</p>
    </dui-popover-content>
</dui-popover>