The Popover component is a floating panel that appears when triggered by a user action. It's commonly used for displaying additional content, forms, or actions without navigating away from the current page.
import { Popover } from '@dashflowx/core'export default function PopoverExample() {return (<PopoverpopoverTrigger={<button>Open Popover</button>}popoverContent={<div>This is popover content</div>}/>)}
Preview:
| Prop | Type | Default | Description |
|---|---|---|---|
popoverTrigger | JSX.Element | - | The element that triggers the popover |
popoverContent | JSX.Element | - | The content to display in the popover |
triggerClassName | string | '' | Additional CSS classes for the trigger |
contentClassName | string | '' | Additional CSS classes for the content |
align | string | 'center' | The alignment of the popover |
sideOffset | number | 4 | The offset from the trigger element |
<PopoverpopoverTrigger={<button>Open Popover</button>}popoverContent={<div>Basic popover content</div>}/>
Preview:
<PopoverpopoverTrigger={<button>User Menu</button>}popoverContent={<div className="space-y-2"><h3 className="font-semibold">User Options</h3><button className="block w-full text-left px-2 py-1 hover:bg-gray-100">Profile</button><button className="block w-full text-left px-2 py-1 hover:bg-gray-100">Settings</button><button className="block w-full text-left px-2 py-1 hover:bg-gray-100">Logout</button></div>}/>
Preview:
<PopoverpopoverTrigger={<button className="bg-green-500 hover:bg-green-600">Custom Style</button>}popoverContent={<div className="bg-green-50 border border-green-200"><p className="text-green-800">Custom styled popover content</p></div>}contentClassName="bg-green-50 border-green-200"/>
Preview:
<PopoverpopoverTrigger={<button>Quick Add</button>}popoverContent={<form className="space-y-3"><div><label className="block text-sm font-medium">Name</label><input type="text" className="w-full border rounded px-2 py-1" /></div><div><label className="block text-sm font-medium">Email</label><input type="email" className="w-full border rounded px-2 py-1" /></div><div className="flex space-x-2"><button className="px-3 py-1 bg-blue-500 text-white rounded">Save</button><button className="px-3 py-1 bg-gray-300 rounded">Cancel</button></div></form>}/>
Preview:
<PopoverpopoverTrigger={<div className="flex items-center space-x-2 cursor-pointer"><div className="w-8 h-8 bg-blue-500 rounded-full flex items-center justify-center text-white">JD</div><span>John Doe</span></div>}popoverContent={<div className="space-y-1"><button className="block w-full text-left px-3 py-2 hover:bg-gray-100 rounded">View Profile</button><button className="block w-full text-left px-3 py-2 hover:bg-gray-100 rounded">Account Settings</button><button className="block w-full text-left px-3 py-2 hover:bg-gray-100 rounded">Billing</button><hr className="my-1" /><button className="block w-full text-left px-3 py-2 hover:bg-gray-100 rounded text-red-600">Sign Out</button></div>}/>
<PopoverpopoverTrigger={<button>Filter</button>}popoverContent={<div className="space-y-3"><h3 className="font-semibold">Filter Options</h3><div><label className="block text-sm font-medium mb-1">Category</label><select className="w-full border rounded px-2 py-1"><option>All Categories</option><option>Technology</option><option>Design</option><option>Business</option></select></div><div><label className="block text-sm font-medium mb-1">Date Range</label><input type="date" className="w-full border rounded px-2 py-1" /></div><div className="flex space-x-2"><button className="px-3 py-1 bg-blue-500 text-white rounded">Apply</button><button className="px-3 py-1 bg-gray-300 rounded">Clear</button></div></div>}/>
<PopoverpopoverTrigger={<button>Actions</button>}popoverContent={<div className="space-y-1"><button className="flex items-center space-x-2 w-full text-left px-3 py-2 hover:bg-gray-100 rounded"><span>📝</span><span>Edit</span></button><button className="flex items-center space-x-2 w-full text-left px-3 py-2 hover:bg-gray-100 rounded"><span>📋</span><span>Duplicate</span></button><button className="flex items-center space-x-2 w-full text-left px-3 py-2 hover:bg-gray-100 rounded"><span>🔗</span><span>Share</span></button><hr className="my-1" /><button className="flex items-center space-x-2 w-full text-left px-3 py-2 hover:bg-gray-100 rounded text-red-600"><span>🗑️</span><span>Delete</span></button></div>}/>
<PopoverpopoverTrigger={<span className="text-blue-500 cursor-help">ℹ️</span>}popoverContent={<div className="max-w-sm"><h3 className="font-semibold mb-2">Feature Information</h3><p className="text-sm text-gray-600 mb-3">This feature allows you to manage your content more efficiently.</p><div className="text-xs text-gray-500"><p>• Available in all plans</p><p>• No setup required</p><p>• 24/7 support included</p></div></div>}/>
Use clear and intuitive trigger elements.
// ✅ Good - Clear trigger<PopoverpopoverTrigger={<button>User Menu</button>}popoverContent={userMenuContent}/>// ✅ Good - Icon with label<PopoverpopoverTrigger={<div className="flex items-center space-x-1"><span>⚙️</span><span>Settings</span></div>}popoverContent={settingsContent}/>
Keep popover content appropriately sized.
// ✅ Good - Appropriate size<PopoverpopoverContent={<div className="w-64"><h3>Menu Title</h3><p>Menu content</p></div>}/>// ❌ Avoid - Too large<PopoverpopoverContent={<div className="w-96 h-96">{/* Very large content */}</div>}/>
Use consistent styling throughout your application.
// ✅ Good - Consistent styling<PopoverpopoverTrigger={<button className="btn-primary">Action</button>}popoverContent={<div className="popover-content">{/* Content */}</div>}/>
Ensure popovers are accessible to all users.
// ✅ Good - Accessible popover<PopoverpopoverTrigger={<button aria-expanded="false" aria-haspopup="true">Menu</button>}popoverContent={<div role="menu">{/* Menu items */}</div>}/>
Organize popover content logically.
// ✅ Good - Logical organization<PopoverpopoverContent={<div className="space-y-3"><h3 className="font-semibold">Settings</h3><div className="space-y-2"><div>Setting 1</div><div>Setting 2</div></div><div className="pt-2 border-t"><button>Save Changes</button></div></div>}/>
You can customize the popover appearance using CSS classes:
<PopoverpopoverTrigger={<button>Custom</button>}popoverContent={<div>Custom content</div>}contentClassName="bg-purple-50 border-purple-200 rounded-xl"/>
Use different sizes for different content types:
// Small popover<PopoverpopoverContent={<div>Small content</div>}contentClassName="w-48"/>// Large popover<PopoverpopoverContent={<div>Large content</div>}contentClassName="w-96"/>
Use custom positioning for specific layouts:
<PopoverpopoverContent={<div>Content</div>}align="start"sideOffset={8}/>
Create controlled popovers with state management:
const [isOpen, setIsOpen] = useState(false);return (<PopoverpopoverTrigger={<button onClick={() => setIsOpen(!isOpen)}>Toggle Popover</button>}popoverContent={<div><p>Controlled popover content</p><button onClick={() => setIsOpen(false)}>Close</button></div>}/>);
Use dynamic content in popovers:
<PopoverpopoverTrigger={<button>Dynamic Content</button>}popoverContent={<div><h3>Current Time</h3><p>{new Date().toLocaleString()}</p></div>}/>
Use multiple popovers in a single component:
<div className="flex space-x-4"><PopoverpopoverTrigger={<button>Menu 1</button>}popoverContent={<div>Menu 1 content</div>}/><PopoverpopoverTrigger={<button>Menu 2</button>}popoverContent={<div>Menu 2 content</div>}/></div>
- Tooltip: For simple hover information
- Modal: For full-screen overlays
- Dropdown: For select menus
- Menu: For navigation menus
- Dialog: For modal dialogs
For the complete API reference and advanced usage patterns, see the Popover API documentation.
