Panel
Panel is a grouping component providing with content toggle feature.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Usage#
import { Panel } from '@primereact/ui/panel';<Panel.Root>
<Panel.Header>
<Panel.Title>Title</Panel.Title>
<Panel.Trigger>Toggle</Panel.Trigger>
</Panel.Header>
<Panel.Content>Content</Panel.Content>
</Panel.Root>Examples#
Toggleable#
Panel can be made toggleable by using the Panel.Trigger component in the header. The defaultOpen prop sets the initial open state. Content visibility is animated automatically with the built-in collapsible behavior.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
import { ChevronDown } from '@primeicons/react/chevron-down';
import { Panel } from '@primereact/ui/panel';
export default function ToggleableDemo() {
return (
<Panel.Root defaultOpen>
<Panel.Header>
<Panel.Title>Header</Panel.Title>
<Panel.Trigger>
<ChevronDown className="transition-transform duration-200 [[data-open]_&]:rotate-180" />
</Panel.Trigger>
</Panel.Header>
<Panel.Content>
<p className="m-0">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt
in culpa qui officia deserunt mollit anim id est laborum.
</p>
</Panel.Content>
</Panel.Root>
);
}
Controlled#
Panel can be controlled externally using the open and onOpenChange props. This allows full control over the panel's open state from the parent component.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
'use client';
import { ChevronDown } from '@primeicons/react/chevron-down';
import type { usePanelOpenChangeEvent } from '@primereact/types/shared/panel';
import { Button } from '@primereact/ui/button';
import { Panel } from '@primereact/ui/panel';
import { useState } from 'react';
export default function ControlledDemo() {
const [open, setOpen] = useState(true);
return (
<div className="space-y-4">
<div className="flex gap-2 justify-center">
<Button onClick={() => setOpen(true)} severity={open ? 'primary' : 'secondary'}>
Open
</Button>
<Button onClick={() => setOpen(false)} severity={!open ? 'primary' : 'secondary'}>
Close
</Button>
</div>
<Panel.Root open={open} onOpenChange={(e: usePanelOpenChangeEvent) => setOpen(e.value ?? false)}>
<Panel.Header>
<Panel.Title>Controlled Panel</Panel.Title>
<Panel.Trigger>
<ChevronDown className="transition-transform duration-200 [[data-open]_&]:rotate-180" />
</Panel.Trigger>
</Panel.Header>
<Panel.Content>
<p className="m-0">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</p>
</Panel.Content>
</Panel.Root>
</div>
);
}
Template#
The header section can be customized with custom content like avatars, action buttons, and more alongside the Panel.Trigger for toggling.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
import { Bookmark } from '@primeicons/react/bookmark';
import { ChevronDown } from '@primeicons/react/chevron-down';
import { Cog } from '@primeicons/react/cog';
import { User } from '@primeicons/react/user';
import { Avatar } from '@primereact/ui/avatar';
import { Button } from '@primereact/ui/button';
import { Panel } from '@primereact/ui/panel';
export default function TemplateDemo() {
return (
<Panel.Root defaultOpen>
<Panel.Header>
<Panel.Title>
<div className="flex items-center gap-2">
<Avatar.Root shape="circle">
<Avatar.Image src="https://primefaces.org/cdn/primevue/images/avatar/amyelsner.png" />
<Avatar.Fallback>A</Avatar.Fallback>
</Avatar.Root>
<span className="font-bold">Amy Elsner</span>
</div>
</Panel.Title>
<div className="flex items-center gap-1">
<Button severity="secondary" rounded variant="text" iconOnly>
<Cog />
</Button>
<Panel.Trigger>
<ChevronDown className="transition-transform duration-200 [[data-open]_&]:rotate-180" />
</Panel.Trigger>
</div>
</Panel.Header>
<Panel.Content>
<p className="m-0">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt
in culpa qui officia deserunt mollit anim id est laborum.
</p>
<div className="flex flex-wrap items-center justify-between gap-4 mt-4">
<div className="flex items-center gap-2">
<Button iconOnly rounded variant="text">
<User />
</Button>
<Button severity="secondary" iconOnly rounded variant="text">
<Bookmark />
</Button>
</div>
<span className="text-surface-500 dark:text-surface-400">Updated 2 hours ago</span>
</div>
</Panel.Content>
</Panel.Root>
);
}
Accessibility#
Screen Reader#
Toggleable panels use a content toggle button at the header that has aria-controls to define the id of the content section along with aria-expanded for the visibility state. The value to read the button defaults to the value can be customized by defining an aria-label or aria-labelledby property.
Keyboard Support#
| Key | Function |
|---|---|
| tab | Moves focus to the next the focusable element in the page tab sequence. |
| shift + tab | Moves focus to the previous the focusable element in the page tab sequence. |
| enter | Toggles the visibility of the content. |
| space | Toggles the visibility of the content. |