Pages are now available as full-screen example templates that showcase real-world use cases and best practices for composing interfaces with the aFP Design System.
<afp-popover>Since 1.0.0
stable
This component uses the light DOM, so its markup and styles are part of the regular document flow.
A popover that anchors to another element and can be triggered by click, hover, focus, or programmatic manuals.
When you click on a trigger element, a popover appears showing interactive content. Unlike simple tooltips, these can include things like links, buttons, or form fields. They show up without any background overlay and disappear if you click elsewhere or hit the Escape key. Only one popover remains visible at a time.
Lorem ipsum dolor sit amet, consectetur adipisicing elit.Show popover
<afp-popoverfor="popover-general"placement="right"><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</span></afp-popover><afp-buttonid="popover-general">Show popover</afp-button>
<afp-popover[for]="'popover-general'"[placement]="'right'"><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</span></afp-popover><afp-button[id]="'popover-general'">Show popover</afp-button>
<AfpPopoverfor="popover-general"placement="right"><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</span></AfpPopover><AfpButtonid="popover-general">Show popover</AfpButton>
<AfpPopover:for="'popover-general'":placement="'right'"><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</span></AfpPopover><AfpButton:id="'popover-general'">Show popover</AfpButton>
A popover appears when its trigger element is clicked. You can also manage its visibility through code by toggling the open property between true and false.
Lorem ipsum dolor sit amet, consectetur adipisicing elit.Show popover
<afp-popoverfor="popover-opening"placement="right"open><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</span></afp-popover><afp-buttonid="popover-opening">Show popover</afp-button>
<afp-popover[for]="'popover-opening'"[placement]="'right'"open><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</span></afp-popover><afp-button[id]="'popover-opening'">Show popover</afp-button>
<AfpPopoverfor="popover-opening"placement="right"open><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</span></AfpPopover><AfpButtonid="popover-opening">Show popover</AfpButton>
<AfpPopover:for="'popover-opening'":placement="'right'"open><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</span></AfpPopover><AfpButton:id="'popover-opening'">Show popover</AfpButton>
To make a button inside a popover close it automatically, add the attribute data-popover="close".
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ad blanditiis error facilis ipsam iure, maiores modi omnis perspiciatis quae similique sint ullam voluptatibus, voluptatum?
Close popover manual
Show popover
<afp-popoverfor="popover-closing"placement="top"><divclass="afp-stack popover-example">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ad blanditiis error facilis ipsam iure, maiores modi omnis perspiciatis quae similique sint ullam voluptatibus, voluptatum?
<afp-buttondata-popover="close"variant="brand">Close popover manual</afp-button></div></afp-popover><afp-buttonid="popover-closing">Show popover</afp-button>
<afp-popover[for]="'popover-closing'"[placement]="'top'"><divclass="afp-stack popover-example">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ad blanditiis error facilis ipsam iure, maiores modi omnis perspiciatis quae similique sint ullam voluptatibus, voluptatum?
<afp-button[data-popover]="'close'"[variant]="'brand'">Close popover manual</afp-button></div></afp-popover><afp-button[id]="'popover-closing'">Show popover</afp-button>
<AfpPopoverfor="popover-closing"placement="top"><divclass="afp-stack popover-example">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ad blanditiis error facilis ipsam iure, maiores modi omnis perspiciatis quae similique sint ullam voluptatibus, voluptatum?
<AfpButtondata-popover="close"variant="brand">Close popover manual</AfpButton></div></AfpPopover><AfpButtonid="popover-closing">Show popover</AfpButton>
<AfpPopover:for="'popover-closing'":placement="'top'"><divclass="afp-stack popover-example">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ad blanditiis error facilis ipsam iure, maiores modi omnis perspiciatis quae similique sint ullam voluptatibus, voluptatum?
<AfpButton:data-popover="'close'":variant="'brand'">Close popover manual</AfpButton></div></AfpPopover><AfpButton:id="'popover-closing'">Show popover</AfpButton>
You can specify where the popover appears relative to its trigger element using the placement property
Note that the actual placement may vary as needed to keep the panel inside of the viewport. If set to an empty array ([]), it enables auto placement. If containing more than two items, it is automatically restricted to the provided placements. You can also input a space-separated string.
<divclass="afp-cluster"><!-- Top --><afp-popoverfor="popover-placement-top"placement="top"><divclass="popover-example"style="width: auto">I'm on the top</div></afp-popover><afp-buttonid="popover-placement-top">Top</afp-button><!-- Bottom --><afp-popoverfor="popover-placement-bottom"placement="bottom"><divclass="popover-example"style="width: auto">I'm at the bottom</div></afp-popover><afp-buttonid="popover-placement-bottom">Bottom</afp-button><!-- Left --><afp-popoverfor="popover-placement-left"placement="left"><divclass="popover-example"style="width: auto">I'm on the left</div></afp-popover><afp-buttonid="popover-placement-left">Left</afp-button><!-- Right --><afp-popoverfor="popover-placement-right"placement="right"><divclass="popover-example"style="width: auto">I'm on the right</div></afp-popover><afp-buttonid="popover-placement-right">Right</afp-button></div>
<divclass="afp-cluster"><!-- Top --><afp-popover[for]="'popover-placement-top'"[placement]="'top'"><divclass="popover-example"style="width: auto">I'm on the top</div></afp-popover><afp-button[id]="'popover-placement-top'">Top</afp-button><!-- Bottom --><afp-popover[for]="'popover-placement-bottom'"[placement]="'bottom'"><divclass="popover-example"style="width: auto">I'm at the bottom</div></afp-popover><afp-button[id]="'popover-placement-bottom'">Bottom</afp-button><!-- Left --><afp-popover[for]="'popover-placement-left'"[placement]="'left'"><divclass="popover-example"style="width: auto">I'm on the left</div></afp-popover><afp-button[id]="'popover-placement-left'">Left</afp-button><!-- Right --><afp-popover[for]="'popover-placement-right'"[placement]="'right'"><divclass="popover-example"style="width: auto">I'm on the right</div></afp-popover><afp-button[id]="'popover-placement-right'">Right</afp-button></div>
<divclass="afp-cluster"><!-- Top --><AfpPopoverfor="popover-placement-top"placement="top"><divclass="popover-example"style="width: auto">I'm on the top</div></AfpPopover><AfpButtonid="popover-placement-top">Top</AfpButton><!-- Bottom --><AfpPopoverfor="popover-placement-bottom"placement="bottom"><divclass="popover-example"style="width: auto">I'm at the bottom</div></AfpPopover><AfpButtonid="popover-placement-bottom">Bottom</AfpButton><!-- Left --><AfpPopoverfor="popover-placement-left"placement="left"><divclass="popover-example"style="width: auto">I'm on the left</div></AfpPopover><AfpButtonid="popover-placement-left">Left</AfpButton><!-- Right --><AfpPopoverfor="popover-placement-right"placement="right"><divclass="popover-example"style="width: auto">I'm on the right</div></AfpPopover><AfpButtonid="popover-placement-right">Right</AfpButton></div>
<divclass="afp-cluster"><!-- Top --><AfpPopover:for="'popover-placement-top'":placement="'top'"><divclass="popover-example"style="width: auto">I'm on the top</div></AfpPopover><AfpButton:id="'popover-placement-top'">Top</AfpButton><!-- Bottom --><AfpPopover:for="'popover-placement-bottom'":placement="'bottom'"><divclass="popover-example"style="width: auto">I'm at the bottom</div></AfpPopover><AfpButton:id="'popover-placement-bottom'">Bottom</AfpButton><!-- Left --><AfpPopover:for="'popover-placement-left'":placement="'left'"><divclass="popover-example"style="width: auto">I'm on the left</div></AfpPopover><AfpButton:id="'popover-placement-left'">Left</AfpButton><!-- Right --><AfpPopover:for="'popover-placement-right'":placement="'right'"><divclass="popover-example"style="width: auto">I'm on the right</div></AfpPopover><AfpButton:id="'popover-placement-right'">Right</AfpButton></div>
You can adjust the duration for which the popover is visible/invisible (in milliseconds) using the duration property.
I will hide and show after 1 second
Show popover
<afp-popoverfor="popover-duration"placement="top"duration="1000"><divclass="popover-example"style="width: auto">I will hide and show after 1 second</div></afp-popover><afp-buttonid="popover-duration">Show popover</afp-button>
<afp-popover[for]="'popover-duration'"[placement]="'top'"[duration]=1000><divclass="popover-example"style="width: auto">I will hide and show after 1 second</div></afp-popover><afp-button[id]="'popover-duration'">Show popover</afp-button>
<AfpPopoverfor="popover-duration"placement="top"duration="1000"><divclass="popover-example"style="width: auto">I will hide and show after 1 second</div></AfpPopover><AfpButtonid="popover-duration">Show popover</AfpButton>
<AfpPopover:for="'popover-duration'":placement="'top'":duration=1000><divclass="popover-example"style="width: auto">I will hide and show after 1 second</div></AfpPopover><AfpButton:id="'popover-duration'">Show popover</AfpButton>
You can control how the popover is activated using the trigger property. Possible options include click, hover, focus, and manual. Multiple options can be passed by separating them with a space. When manual is used, the popover must be activated programmatically.
I'm triggered by click
Click
I'm triggered by hover
Hover
I'm triggered by focus
Focus
<divclass="afp-cluster"><!-- Click --><afp-popoverfor="popover-trigger-click"placement="top"trigger="click"><divclass="popover-example"style="width: auto">I'm triggered by <code>click</code></div></afp-popover><afp-buttonid="popover-trigger-click">Click</afp-button><!-- Hover --><afp-popoverfor="popover-trigger-hover"placement="top"trigger="hover"><divclass="popover-example"style="width: auto">I'm triggered by <code>hover</code></div></afp-popover><afp-buttonid="popover-trigger-hover">Hover</afp-button><!-- Focus --><afp-popoverfor="popover-trigger-focus"placement="top"trigger="focus"><divclass="popover-example"style="width: auto">I'm triggered by <code>focus</code></div></afp-popover><afp-buttonid="popover-trigger-focus">Focus</afp-button></div>
<divclass="afp-cluster"><!-- Click --><afp-popover[for]="'popover-trigger-click'"[placement]="'top'"[trigger]="'click'"><divclass="popover-example"style="width: auto">I'm triggered by <code>click</code></div></afp-popover><afp-button[id]="'popover-trigger-click'">Click</afp-button><!-- Hover --><afp-popover[for]="'popover-trigger-hover'"[placement]="'top'"[trigger]="'hover'"><divclass="popover-example"style="width: auto">I'm triggered by <code>hover</code></div></afp-popover><afp-button[id]="'popover-trigger-hover'">Hover</afp-button><!-- Focus --><afp-popover[for]="'popover-trigger-focus'"[placement]="'top'"[trigger]="'focus'"><divclass="popover-example"style="width: auto">I'm triggered by <code>focus</code></div></afp-popover><afp-button[id]="'popover-trigger-focus'">Focus</afp-button></div>
<divclass="afp-cluster"><!-- Click --><AfpPopoverfor="popover-trigger-click"placement="top"trigger="click"><divclass="popover-example"style="width: auto">I'm triggered by <code>click</code></div></AfpPopover><AfpButtonid="popover-trigger-click">Click</AfpButton><!-- Hover --><AfpPopoverfor="popover-trigger-hover"placement="top"trigger="hover"><divclass="popover-example"style="width: auto">I'm triggered by <code>hover</code></div></AfpPopover><AfpButtonid="popover-trigger-hover">Hover</AfpButton><!-- Focus --><AfpPopoverfor="popover-trigger-focus"placement="top"trigger="focus"><divclass="popover-example"style="width: auto">I'm triggered by <code>focus</code></div></AfpPopover><AfpButtonid="popover-trigger-focus">Focus</AfpButton></div>
<divclass="afp-cluster"><!-- Click --><AfpPopover:for="'popover-trigger-click'":placement="'top'":trigger="'click'"><divclass="popover-example"style="width: auto">I'm triggered by <code>click</code></div></AfpPopover><AfpButton:id="'popover-trigger-click'">Click</AfpButton><!-- Hover --><AfpPopover:for="'popover-trigger-hover'":placement="'top'":trigger="'hover'"><divclass="popover-example"style="width: auto">I'm triggered by <code>hover</code></div></AfpPopover><AfpButton:id="'popover-trigger-hover'">Hover</AfpButton><!-- Focus --><AfpPopover:for="'popover-trigger-focus'":placement="'top'":trigger="'focus'"><divclass="popover-example"style="width: auto">I'm triggered by <code>focus</code></div></AfpPopover><AfpButton:id="'popover-trigger-focus'">Focus</AfpButton></div>
When using the hover trigger, you can set a delay (in milliseconds) before the popover appears or disappears using the hoverDelay (hover-delay) property.
I will show after 500ms of hovering and hide after 500ms of unhovering
Hover me
<afp-popoverfor="popover-hover-delay"placement="top"trigger="hover"hover-delay="500"><divclass="popover-example">
I will show after <code>500ms</code> of hovering and hide after <code>500ms</code> of unhovering
</div></afp-popover><afp-buttonid="popover-hover-delay">Hover me</afp-button>
<afp-popover[for]="'popover-hover-delay'"[placement]="'top'"[trigger]="'hover'"[hover-delay]=500><divclass="popover-example">
I will show after <code>500ms</code> of hovering and hide after <code>500ms</code> of unhovering
</div></afp-popover><afp-button[id]="'popover-hover-delay'">Hover me</afp-button>
<AfpPopoverfor="popover-hover-delay"placement="top"trigger="hover"hover-delay="500"><divclass="popover-example">
I will show after <code>500ms</code> of hovering and hide after <code>500ms</code> of unhovering
</div></AfpPopover><AfpButtonid="popover-hover-delay">Hover me</AfpButton>
<AfpPopover:for="'popover-hover-delay'":placement="'top'":trigger="'hover'":hover-delay=500><divclass="popover-example">
I will show after <code>500ms</code> of hovering and hide after <code>500ms</code> of unhovering
</div></AfpPopover><AfpButton:id="'popover-hover-delay'">Hover me</AfpButton>
The id of the element the popover should anchor to.
Typestring
open
Whether the popover is currently open.
Typeboolean
Defaultfalse
noAutoFocus noautofocus
If true, the popover will not automatically focus the first focusable element when opened.
Typeboolean
Defaultfalse
trigger
Determines when the popover appears.
Multiple triggers can be combined: `click hover focus manual`.
When `manual` is included, the popover is fully programmatically controlled.
Type
AfpTrigger
Name
Description
HOVER
Hover trigger generated when the user hovers over an element.
FOCUS
Focus trigger generated when an element gains focus.
CLICK
Click trigger generated when an element is clicked.
The preferred placement of the popover. Note that the actual placement may vary as needed to keep the panel
inside of the viewport. If set to an empty array ([]), it enables auto placement. If containing more than two items,
it is automatically restricted to the provided placements. You can also input a space-separated string.