Various button styles and sizes for actions and navigation.
Button Variants
Button Sizes
Theme Color Buttons
Theme Color Outline Buttons
Outline Buttons
Button States
Block Buttons
Button Groups - Basic
Horizontal (default)
Vertical
No-Wrap (prevents line breaks)
Button Groups - Gap Sizes
Semantic Gap Classes
gap-xs (4px)
gap-sm (8px)
gap-md (12px)
gap-base (16px)
gap-lg (24px)
gap-xl (32px)
Vertical Alignment
Use semantic gap classes (gap-sm, gap-md, gap-lg, gap-xl) to control vertical spacing between buttons.
Start gap-sm
Center gap-md
End gap-lg
Stretch gap-xl
Responsive Direction
Horizontal → Vertical at md (768px)
Resize window to see change
Vertical → Horizontal at lg (992px)
Starts vertical, becomes horizontal on large screens
Class Reference
--sm-vertical/--sm-horizontalat 576px--md-vertical/--md-horizontalat 768px--lg-vertical/--lg-horizontalat 992px--xl-vertical/--xl-horizontalat 1200px
Split Buttons
Primary action + dropdown toggle combined into a single control
Sizes
Upward Placement
Use data-placement="top-end" to open the menu upward. Floating UI will auto-flip if there's not enough space.
Custom Icons (no rotation)
The pa-btn-split__chevron span draws the masked --pa-icon-chevron (points down, rotates up on open). For a static toggle, omit it and drop any icon element into the toggle instead.
Items with Actions
Menu items can include inline action buttons for quick operations like delete.
Overflow Toolbar (.pa-overflow)
A .pa-overflow row auto-appends a dedicated [⋮] "more" trigger; when the row runs out of horizontal space, overflowing children collapse into that menu, and pop back out as room returns. A .pa-btn-split child collapses as an atomic labeled group — its primary action and its own menu items stay together, nothing foreign mixes in.
Drag the resize handle in the bottom-right of the box below to shrink the bar. Lowest data-pa-actions-priority (default 0) drops first; ties broken by DOM order. Pin "Publish" with data-pa-actions-priority="10", and keep the split button visible longest with data-pa-actions-priority="20". Drag all the way in and even the split button collapses into the [⋮] menu — it lands as an atomic RUN group (its primary plus its own options), not scattered loose.
Drop direction
Default data-pa-actions-overflow-from="end" collapses the rightmost child first. Set data-pa-actions-overflow-from="start" on the .pa-overflow container to collapse the leftmost child first instead.
In card headers
In a card header, use the card-flavored alias .pa-card__actions--overflow on the .pa-card__actions slot itself — the buttons and split button become its direct children (no inner wrapper). It auto-inits like a standalone .pa-overflow, appending its own [⋮] more-menu, and the header title yields before the actions collapse. Laid out three-up (pc-col-lg-1-3) so each card is already narrow — resize the browser window to watch each toolbar consume and spit out action buttons live, each collapsing at its own breakpoint.
Quarterly Performance & Customer Engagement Analytics Dashboard
Card body. The actions bar in the header carries the overflow behavior — narrow the window to watch Configure, Filter, and Refresh fold into the dedicated [⋮] more-menu in that order (lowest priority first; Export is pinned, and the Add-widget split button survives longest).
Database Migration Tasks — Production Environment Schema Updates
No pinning here — siblings collapse in default order (rightmost first: Rollback → Backup → Validate). The Deploy split button survives longest, dropping into the [⋮] more-menu as an atomic labeled group.
Team Members & Permissions Management — Enterprise Console
Six siblings here — Invite is pinned with priority 5, so it survives the first wave of collapses but still folds away before Add user. The title yields first (truncating to a min-width floor) so the action bar keeps its buttons; only when the header is genuinely tiny does the split button fold its own primary action into the [⋮] more-menu as a labeled group, leaving just the toggle.
How it works
.pa-overflowis the row; it providesmin-width: 0; overflow: hidden; flex-shrink: 1. Works standalone in any flex context; in a card header use the alias.pa-card__actions--overflowon the actions slot itself. Both auto-init — no JS wiring needed.overflow.jsappends a dedicated[⋮]"more" trigger and, on resize, walks the lowest-priority children (data-pa-actions-priority, default0) into that trigger's menu until the row fits; higher-priority children survive longer.- A
.pa-btn-splitchild collapses atomically — its primary action and its own menu items drop into the more-menu together under a section label, nothing foreign mixes in. Give it a high priority (e.g.20) so it stays visible longest. - Plain items get their class swapped to
pa-btn-split__itemwhile collapsed; the original classList is stashed on the element and restored on the way back out. - Drop direction is controlled by
data-pa-actions-overflow-fromon the container:"end"(default — rightmost first) or"start"(leftmost first). - Click handlers survive — the DOM node moves but is preserved.
Text Truncation
Give the button a fixed width (.wr-*) and put .text-truncate on an inner <span> to truncate long text with ellipsis
Buttons with Text Icons
Buttons with icons are automatically left-aligned with fixed-width icon container:
Icon Only Buttons
Icon-only button sizes (XS → XL):
Various colors - default size:
Compact (XS) - perfect for table actions:
With ripple and loading states (click to test):
Fixed Width Buttons
Use minwr-* + maxwr-* to constrain width. Add text-truncate on an inner span for ellipsis:
Different Widths (minwr-8 to minwr-20)
Button Text Alignment
Control text alignment within fixed-width buttons. Note the varied text lengths to show the effect:
Inline Start Aligned
Inline End Aligned
Center Aligned
Justified
Font Awesome Icons
Font Awesome icons with varied text lengths to show alignment:
Inline Start Aligned
Inline End Aligned
Center Aligned
Justified
Ripple Effect Buttons
Click buttons to see ripple animation effect:
Loading State Buttons
Click buttons to simulate loading states:
Usage Guide
Ripple Effect
Add pa-btn--ripple class and data-ripple attribute to any button for click animation feedback.
Loading States
Use pa-btn--loading class to show spinner. JavaScript can toggle this class during async operations.
Best Practices
- Fast Sites: Always show loading feedback, even for quick operations (200-500ms minimum)
- User Confidence: Ripple effects confirm button clicks were registered
- Prevent Double-clicks: Disable buttons during loading to prevent duplicate submissions
- Accessibility: Loading states are announced to screen readers
CSS Classes Reference
Button Base
pa-btn- Base button styling
Button Variants (Colors)
pa-btn--primary- Primary accent colorpa-btn--secondary- Secondary/neutral colorpa-btn--success- Success/green colorpa-btn--warning- Warning/yellow colorpa-btn--danger- Danger/red colorpa-btn--info- Info/blue colorpa-btn--light- Light backgroundpa-btn--dark- Dark background
Outline Variants
pa-btn--outline-primary- Outline primarypa-btn--outline-secondary- Outline secondarypa-btn--outline-success- Outline successpa-btn--outline-warning- Outline warningpa-btn--outline-danger- Outline dangerpa-btn--outline-info- Outline infopa-btn--color-{1-9}- Theme color slotspa-btn--outline-color-{1-9}- Outline theme color slots
Button Sizes
pa-btn--xs- Extra small buttonpa-btn--sm- Small buttonpa-btn--lg- Large buttonpa-btn--xl- Extra large button
Button States & Modifiers
pa-btn--loading- Loading state with spinnerpa-btn--ripple- Enable ripple click effectpa-btn--block- Full width block buttonpa-btn--icon-only- Square icon-only button
Content Alignment
Every button centers its content by default (one model for text-only, icon+label, and icon-only alike). These modifiers are the switch to change it:
pa-btn--align-start- Inline-start align content (RTL: right)pa-btn--align-end- Inline-end align content (RTL: left)pa-btn--align-center- Center-align content (the default; explicit)pa-btn--align-justify- Space-between content
Button Elements
pa-btn__icon- Icon container (natural width; spaced from the label by the button'sgap, so it sits at the padding edge like a text label)pa-btn__label- Text wrapper (used by--align-centerto flex-fill)pa-btn__spinner- Loading spinner element
Button Groups
pa-btn-group- Container for grouped buttonspa-btn-group--vertical- Vertical stackingpa-btn-group--nowrap- Prevent wrapping
Button Group Alignment (vertical only)
pa-btn-group--center- Center-align buttonspa-btn-group--end- End-align buttonspa-btn-group--stretch- Full width buttons
Responsive Button Groups
pa-btn-group--sm-vertical- Vertical at 576px+pa-btn-group--sm-horizontal- Horizontal at 576px+pa-btn-group--md-vertical- Vertical at 768px+pa-btn-group--md-horizontal- Horizontal at 768px+pa-btn-group--lg-vertical- Vertical at 992px+pa-btn-group--lg-horizontal- Horizontal at 992px+pa-btn-group--xl-vertical- Vertical at 1200px+pa-btn-group--xl-horizontal- Horizontal at 1200px+
Split Buttons
pa-btn-split- Container for split buttonpa-btn-split__toggle- Toggle button (fixed square width)pa-btn-split__chevron- Masked--pa-icon-chevronspan (points down, rotates to up on open); omit + drop in any icon for a static togglepa-btn-split__menu- Dropdown menu panel (outer, overflow hidden)pa-btn-split__menu-inner- Inner wrapper for menu items (padding, flex layout)pa-btn-split__menu--open- Show dropdown menupa-btn-split__item- Menu item buttonpa-btn-split__item--danger- Destructive action stylingpa-btn-split__item-icon- Leading icon inside a menu item (fixed column so labels align)pa-btn-split__item-row- Menu row wrapping an item + a trailing action button (e.g. delete)data-placement="top-end"- Open menu upward (on container)
Overflow Toolbar
pa-overflow- Progressive-collapse flex row; auto-appends a[⋮]"more" trigger and walks overflowing children into itpa-card__actions--overflow- Card-header alias ofpa-overflowon thepa-card__actionsslotpa-overflow__trigger- The auto-created[⋮]button (retheming hook; ships as a standardpa-btn--secondary)data-pa-overflow-trigger="ghost"- Make the trigger chromeless instead of bordered (on the container)data-pa-actions-priority- Drop order per child (default0; higher survives longer)data-pa-actions-overflow-from-end(default, rightmost first) orstart(leftmost first)data-pa-overflow-label- Override the section label for a collapsed split-button grouppa-btn-split--in-overflow/pa-btn-split__group-label- Applied byoverflow.jswhen a split button collapses as an atomic labeled group (not authored by hand)