<div class="lui-action_bar"> <div class="lui-breadcrumb_list"> <div class="lui-breadcrumb_list__breadcrumb-container"> <a class="lui-breadcrumb_list__breadcrumb" data-turbo-action="advance" href="#">Breadcrumbs link</a> <span class="lui-breadcrumb_list__breadcrumb-separator">/</span> </div> <div class="lui-breadcrumb_list__breadcrumb-container"> <a class="lui-breadcrumb_list__breadcrumb" data-turbo-action="advance" href="#">Breadcrumbs link</a> <span class="lui-breadcrumb_list__breadcrumb-separator">/</span> </div> <div class="lui-breadcrumb_list__breadcrumb-container"> <a class="lui-breadcrumb_list__breadcrumb" data-turbo-action="advance" href="#">Breadcrumbs link</a> </div> </div> <div class="lui-action_buttons"> <div class="lui-action_buttons__button-group"> <button class="lui-button lui-button--neutral--primary lui-button--size-tiny w-fit w-fit relative" data-controller="lui--button"> <div class="lui-tooltip hidden" data-controller="tooltips" data-tooltips-tippy-target-id-value="" data-tooltips-position-value="top" data-tooltips-interactive-value="false" > <div class="lui-tooltip__title"> Primary action </div> </div> <div class="opacity-100 inline-flex" data-lui--button-target="leadingIcon"> <div class="flex items-center justify-center" style="width: 12px; height: 12px;"><i class="lui-button__icon lui-button__icon--tiny fa-regular fa-plus-large" data-lui--button-target="leadingIcon"></i></div> </div> <span class="lui-button__text opacity-100 inline-flex" data-lui--button-target="text"> Text </span> <div class="absolute w-full flex items-center justify-center opacity-0" data-lui--button-target="loadingIcon"> <i class="lui-m_icon animate-spin material-symbols-outlined" style="--lui-micon-size: 12px;"> progress_activity </i> </div> </button> <button class="lui-button lui-button--neutral--secondary lui-button--size-tiny w-fit w-fit relative" data-controller="lui--button"> <div class="lui-tooltip hidden" data-controller="tooltips" data-tooltips-tippy-target-id-value="" data-tooltips-position-value="top" data-tooltips-interactive-value="false" > <div class="lui-tooltip__title"> Secondary action </div> </div> <div class="opacity-100 inline-flex" data-lui--button-target="leadingIcon"> <div class="flex items-center justify-center" style="width: 12px; height: 12px;"><i class="lui-button__icon lui-button__icon--tiny fa-regular fa-plus-large" data-lui--button-target="leadingIcon"></i></div> </div> <span class="lui-button__text opacity-100 inline-flex" data-lui--button-target="text"> Text </span> <div class="absolute w-full flex items-center justify-center opacity-0" data-lui--button-target="loadingIcon"> <i class="lui-m_icon animate-spin material-symbols-outlined" style="--lui-micon-size: 12px;"> progress_activity </i> </div> </button> <button class="lui-button lui-button--neutral--secondary lui-button--size-tiny w-fit w-fit relative" data-controller="lui--button"> <div class="lui-tooltip hidden" data-controller="tooltips" data-tooltips-tippy-target-id-value="" data-tooltips-position-value="top" data-tooltips-interactive-value="false" > <div class="lui-tooltip__title"> Secondary action </div> </div> <div class="opacity-100 inline-flex" data-lui--button-target="leadingIcon"> <div class="flex items-center justify-center" style="width: 12px; height: 12px;"><i class="lui-button__icon lui-button__icon--tiny fa-regular fa-plus-large" data-lui--button-target="leadingIcon"></i></div> </div> <span class="lui-button__text opacity-100 inline-flex" data-lui--button-target="text"> Text </span> <div class="absolute w-full flex items-center justify-center opacity-0" data-lui--button-target="loadingIcon"> <i class="lui-m_icon animate-spin material-symbols-outlined" style="--lui-micon-size: 12px;"> progress_activity </i> </div> </button> </div> <div class="lui-action_buttons__button-group"> <button class="lui-button lui-button--icon-only lui-button--neutral--secondary lui-button--size-tiny w-fit w-fit relative" data-controller="lui--button"> <div class="lui-tooltip hidden" data-controller="tooltips" data-tooltips-tippy-target-id-value="" data-tooltips-position-value="top" data-tooltips-interactive-value="false" > <div class="lui-tooltip__title"> Pause item </div> </div> <div class="opacity-100 inline-flex" data-lui--button-target="leadingIcon"> <div class="flex items-center justify-center" style="width: 12px; height: 12px;"><i class="lui-button__icon lui-button__icon--tiny fa-regular fa-play-pause" data-lui--button-target="leadingIcon"></i></div> </div> <div class="absolute w-full flex items-center justify-center opacity-0" data-lui--button-target="loadingIcon"> <i class="lui-m_icon animate-spin material-symbols-outlined" style="--lui-micon-size: 12px;"> progress_activity </i> </div> </button> <button class="lui-button lui-button--icon-only lui-button--neutral--secondary lui-button--size-tiny w-fit w-fit relative" data-controller="lui--button"> <div class="lui-tooltip hidden" data-controller="tooltips" data-tooltips-tippy-target-id-value="" data-tooltips-position-value="top" data-tooltips-interactive-value="false" > <div class="lui-tooltip__title"> Favorite item </div> </div> <div class="opacity-100 inline-flex" data-lui--button-target="leadingIcon"> <div class="flex items-center justify-center" style="width: 12px; height: 12px;"><i class="lui-button__icon lui-button__icon--tiny fa-regular fa-heart" data-lui--button-target="leadingIcon"></i></div> </div> <div class="absolute w-full flex items-center justify-center opacity-0" data-lui--button-target="loadingIcon"> <i class="lui-m_icon animate-spin material-symbols-outlined" style="--lui-micon-size: 12px;"> progress_activity </i> </div> </button> <button class="lui-button lui-button--icon-only lui-button--neutral--secondary lui-button--size-tiny w-fit w-fit relative" data-controller="lui--button"> <div class="lui-tooltip hidden" data-controller="tooltips" data-tooltips-tippy-target-id-value="" data-tooltips-position-value="top" data-tooltips-interactive-value="false" > <div class="lui-tooltip__title"> Copy item </div> </div> <div class="opacity-100 inline-flex" data-lui--button-target="leadingIcon"> <div class="flex items-center justify-center" style="width: 12px; height: 12px;"><i class="lui-button__icon lui-button__icon--tiny fa-regular fa-copy" data-lui--button-target="leadingIcon"></i></div> </div> <div class="absolute w-full flex items-center justify-center opacity-0" data-lui--button-target="loadingIcon"> <i class="lui-m_icon animate-spin material-symbols-outlined" style="--lui-micon-size: 12px;"> progress_activity </i> </div> </button> <button class="lui-button lui-button--icon-only lui-button--neutral--secondary lui-button--size-tiny w-fit w-fit relative" data-controller="lui--button"> <div class="lui-tooltip hidden" data-controller="tooltips" data-tooltips-tippy-target-id-value="" data-tooltips-position-value="top" data-tooltips-interactive-value="false" > <div class="lui-tooltip__title"> Open settings </div> </div> <div class="opacity-100 inline-flex" data-lui--button-target="leadingIcon"> <div class="flex items-center justify-center" style="width: 12px; height: 12px;"><i class="lui-button__icon lui-button__icon--tiny fa-regular fa-gear" data-lui--button-target="leadingIcon"></i></div> </div> <div class="absolute w-full flex items-center justify-center opacity-0" data-lui--button-target="loadingIcon"> <i class="lui-m_icon animate-spin material-symbols-outlined" style="--lui-micon-size: 12px;"> progress_activity </i> </div> </button> <button class="lui-button lui-button--icon-only lui-button--neutral--secondary lui-button--size-tiny w-fit w-fit relative" data-controller="lui--button"> <div class="lui-tooltip hidden" data-controller="tooltips" data-tooltips-tippy-target-id-value="" data-tooltips-position-value="top" data-tooltips-interactive-value="false" > <div class="lui-tooltip__title"> Delete item </div> </div> <div class="opacity-100 inline-flex" data-lui--button-target="leadingIcon"> <div class="flex items-center justify-center" style="width: 12px; height: 12px;"><i class="lui-button__icon lui-button__icon--tiny fa-regular fa-trash" data-lui--button-target="leadingIcon"></i></div> </div> <div class="absolute w-full flex items-center justify-center opacity-0" data-lui--button-target="loadingIcon"> <i class="lui-m_icon animate-spin material-symbols-outlined" style="--lui-micon-size: 12px;"> progress_activity </i> </div> </button> </div> </div></div><div class="border-1 border-general-global-gray-300 rounded-md p-2 mt-20"> <p>❗Use only <span class="font-bold bg-general-global-gray-100 px-1 py-0.5 rounded-sm border border-general-global-gray-300">size="tiny"</span> buttons in the Action Bar</p> <p>❗<span class="underline">Always</span> add a tooltip to every Action Bar button. Build tooltips using the pattern Action + Entity. Examples: <span class="bg-general-global-gray-100 px-1 py-0.5 rounded-sm border border-general-global-gray-300 italic">New User</span>, <span class="bg-general-global-gray-100 px-1 py-0.5 rounded-sm border border-general-global-gray-300 italic">Import Email Template</span>, <span class="bg-general-global-gray-100 px-1 py-0.5 rounded-sm border border-general-global-gray-300 italic">Duplicate Protocol</span> </p></div>Action Bar
The ActionBar component is a combination of a list of breadcrumbs, and a group of action buttons.
Related components
-
Usage rules
✅ Do
- ❗Use only
size="tiny"buttons in the Action Bar - Label buttons with clear action verbs Examples: New, Import, Duplicate.
- Follow left-to-right button hierarchy:
- Primary action
- Secondary actions
- Icon-only actions
- Back button
- ❗Always add a tooltip to every Action Bar button. Build tooltips using the pattern Action + Entity. Examples: New User, Import Email Template, Duplicate Protocol.
- ❗Use only
❌ Don't
- Don’t use button sizes other than tiny in the Action Bar.
- Don’t break the button hierarchy order (e.g. placing secondary actions before the primary one).
- Don’t mix different hierarchy levels randomly within the Action Bar.
- Don’t omit tooltips, even for icon-only buttons.
<%= render LooposUi::ActionBar.new do |ab| %> <% ab.with_breadcrumbs_list do |breadcrumbs| %> <%= breadcrumbs.with_breadcrumb(href: "#") { "Breadcrumbs link"} %> <%= breadcrumbs.with_breadcrumb(href: "#") { "Breadcrumbs link"} %> <%= breadcrumbs.with_breadcrumb(href: "#") { "Breadcrumbs link"} %> <% end %> <% attrs = {size: :default, type: :secondary, kind: :neutral } %> <% ab.with_action_buttons do |buttons| %> <% buttons.with_button_group do |g| %> <% g.with_button(leading_icon: "fa-regular fa-plus-large", text: "Text", **attrs, type: :primary, size: :tiny, tooltip_text: "Primary action") %> <% g.with_button(leading_icon: "fa-regular fa-plus-large", text: "Text", **attrs, size: :tiny, tooltip_text: "Secondary action") %> <% g.with_button(leading_icon: "fa-regular fa-plus-large", text: "Text", **attrs, size: :tiny, tooltip_text: "Secondary action") %> <% end %> <% buttons.with_button_group do |g| %> <% g.with_button(leading_icon: "fa-regular fa-play-pause", **attrs, size: :tiny, tooltip_text: "Pause item") %> <% g.with_button(leading_icon: "fa-regular fa-heart", **attrs, size: :tiny, tooltip_text: "Favorite item") %> <% g.with_button(leading_icon: "fa-regular fa-copy", **attrs, size: :tiny, tooltip_text: "Copy item") %> <% g.with_button(leading_icon: "fa-regular fa-gear", **attrs, size: :tiny, tooltip_text: "Open settings") %> <% g.with_button(leading_icon: "fa-regular fa-trash", **attrs, size: :tiny, tooltip_text: "Delete item") %> <% end %> <% end %><% end %><div class="border-1 border-general-global-gray-300 rounded-md p-2 mt-20"> <p>❗Use only <span class="font-bold bg-general-global-gray-100 px-1 py-0.5 rounded-sm border border-general-global-gray-300">size="tiny"</span> buttons in the Action Bar</p> <p>❗<span class="underline">Always</span> add a tooltip to every Action Bar button. Build tooltips using the pattern Action + Entity. Examples: <span class="bg-general-global-gray-100 px-1 py-0.5 rounded-sm border border-general-global-gray-300 italic">New User</span>, <span class="bg-general-global-gray-100 px-1 py-0.5 rounded-sm border border-general-global-gray-300 italic">Import Email Template</span>, <span class="bg-general-global-gray-100 px-1 py-0.5 rounded-sm border border-general-global-gray-300 italic">Duplicate Protocol</span> </p></div>No notes provided.
No params configured.
Description
The ActionBar component is a flexible container that provides a consistent layout for page-level navigation and actions. It combines breadcrumbs, item navigation controls, optional issue cards, and action buttons in a single, cohesive interface.
The ActionBar is typically used at the top of content pages to provide:
- Navigation context through breadcrumbs
- Item-level navigation for moving between related items
- Important alerts through issue cards
- Primary actions through action buttons
Properties
| Name | Type | Default | Description |
|---|---|---|---|
current_action |
String/Symbol | nil |
The name of the current action. Used to set the current action when infering from the request action name is not suitable (render ShowLayout from another controller, for example) |
Slots
The ActionBar component accepts four slots:
| Slot Name | Type | Description |
|---|---|---|
action_buttons |
LooposUi::ActionButtons |
Container for action buttons and button groups |
breadcrumbs_list |
LooposUi::BreadcrumbList |
Navigation breadcrumbs showing the current page hierarchy |
item_navigation |
LooposUi::ActionBar::ItemNavigation |
Navigation controls for moving between items (previous/next) |
issue_card |
String or ViewComponent |
Optional card component for displaying issues or alerts |
Slot Details
action_buttons
The action_buttons slot accepts a LooposUi::ActionButtons component, which provides a structured way to organize action buttons. This slot is typically used for primary actions like "Save", "Edit", "Delete", etc.
Example:
<% action_bar.with_action_buttons do |buttons| %> <% buttons.with_button_group do |group| %> <% group.with_button(text: "Save", href: "/save") %> <% group.with_button(text: "Cancel", href: "/cancel", variant: :secondary) %> <% end %><% end %>breadcrumbs_list
The breadcrumbs_list slot accepts a LooposUi::BreadcrumbList component for displaying navigation breadcrumbs. This helps users understand their current location within the application hierarchy.
Example:
<% action_bar.with_breadcrumbs_list do |list| %> <% list.with_breadcrumb(href: "/") { "Home" } %> <% list.with_breadcrumb(href: "/products") { "Products" } %> <% list.with_breadcrumb(href: "/products/123") { "Product Details" } %><% end %>item_navigation
The item_navigation slot accepts a LooposUi::ActionBar::ItemNavigation component for navigating between related items. This is particularly useful in detail views where users need to move between items in a sequence.
Required Options:
title(String): The display title for the current itemnext_path(String): URL for the next itemprevious_path(String): URL for the previous item
Example:
<% action_bar.with_item_navigation( title: "Product 3 of 15", next_path: "/products/4", previous_path: "/products/2") %>issue_card
The issue_card slot accepts any content (string or ViewComponent) for displaying important alerts, warnings, or notifications. This slot is optional and will only render when content is provided.
Example:
<% action_bar.with_issue_card do %> <div class="alert alert-warning"> <strong>Warning:</strong> This product is out of stock. </div><% end %>Auto Breadcrumbs
The ActionBar component includes automatic breadcrumb generation when LooposUi.config.auto_breadcrumbs is enabled. This feature automatically generates breadcrumbs based on:
- Current action (index, show, etc.)
- Request path analysis
- Sidebar configuration from
LooposUi.config.sidebar.items