Internal trigger
Basic modal with title, description, and close control.
Component showcase
A single static page to verify every Plain Elements primitive and its configuration options. Styled with shadcn-inspired tokens. Custom events appear in the log at the bottom.
Orientation, activation mode, loop, disabled triggers, indicator, and
data-tabs-value.
Default — horizontal, automatic activation, loop enabled, indicator
data-tabs-orientation="vertical",
data-tabs-activation="manual",
data-tabs-loop="false"
data-tabs-loop is false.
Disabled trigger — roving focus skips the middle tab
Native <details>, managed items, single/multiple open, disabled,
hidden-until-found, and programmatic API.
Native single-open — shared name on <details>
Standard shipping arrives within three to five business days.
Unused items can be returned within 30 days.
Native multiple open — no name, plus
data-accordion-disabled
Multiple items can stay open because these details have no name.
Unused items can be returned within 30 days.
Warranty information.
Managed — data-accordion-single,
data-accordion-hidden-until-found, height animation
Programmatic API — open(), value = []
Both details share a name, so native HTML keeps this example single-open.
Standard shipping takes three to five business days.
Unused items can be returned within 30 days.
Default, animated height, data-collapsible-open,
data-collapsible-disabled, and hidden-until-found.
Basic disclosure
Plain Elements provides accessible, unstyled UI primitives.
Height animation — --collapsible-panel-height CSS variable
alien-bean-pasta
wild-irish-burrito
horse-battery-staple
Initially open — data-collapsible-open
Next invoice: April 1 — $49.00
Disabled — data-collapsible-disabled
This section cannot be toggled.
Find-in-page — data-collapsible-hidden-until-found
Try find-in-page for "quarterly review".
Internal/external triggers, backdrop dismiss, alert dialog, nested dialogs, and
data-dialog-dismiss.
Basic modal with title, description, and close control.
data-dialog-trigger="settings-dialog" targets host by id.
data-dialog-dismiss on <dialog>
role="alertdialog" with method="dialog" form
Child pe-dialog inside parent surface; Esc closes child first.
Sides, align, delay, close-delay, delay group, external triggers, and arrow.
Internal trigger with arrow
External triggers — shared tooltip,
data-tooltip-align="start",
data-tooltip-delay,
data-tooltip-close-delay
All sides with arrow — data-tooltip-side,
data-tooltip-arrow
Delay group —
data-tooltip-delay-group,
data-tooltip-skip-delay
Offset, sides, align, external trigger, nested popovers, arrow, and close control.
Internal trigger — data-popover-offset, arrow, title, description
Manage your current session.
External trigger —
data-popover-side="top",
data-popover-align="end"
Opened by an external trigger button.
All sides with arrow — data-popover-side,
data-popover-arrow
Popover above the trigger.
Popover to the right.
Popover below the trigger.
Popover to the left.
Nested popover —
data-popover-side="right",
data-popover-align="start"
Open another popover without closing this one.
Escape or outside press closes this child first.
Custom events from all components above.