Skip to content
wdj

Toolbar

Implemented Action

Compact grouped controls with shared borders, composed filters and keyboard arrow navigation.

Kumo reference: kumo-ui.com/components/toolbar/

Presentation commands show demo feedback. Read the interaction guide to connect real actions.

Filter toolbar

Show template
{% load wdj %}
{% wdj_component "wdj/components/toolbar.html" aria_label="DNS records" class="w-full max-w-md" %}
{% wdj_component "wdj/components/toolbar_item.html" grow=True %}
  {% include "wdj/components/input_group.html" with id="toolbar_filter_toolbar" name="q" aria_label="Search DNS records" placeholder="Search DNS records" prefix_icon="search" only %}
{% endwdj_component %}
{% wdj_component "wdj/components/toolbar_item.html" shape="square" %}
  {% include "wdj/components/button.html" with variant="ghost" label="" icon="list-filter" shape="square" aria_label="Filter" only %}
{% endwdj_component %}
{% wdj_component "wdj/components/toolbar_item.html" shape="square" %}
  {% include "wdj/components/button.html" with variant="ghost" label="" icon="settings" shape="square" aria_label="Settings" only %}
{% endwdj_component %}
{% endwdj_component %}

Select

Show template
{% load wdj %}
{% wdj_component "wdj/components/toolbar.html" aria_label="Sort records"  %}
{% wdj_component "wdj/components/toolbar_item.html" %}
  {% include "wdj/components/button.html" with variant="ghost" label="Filter" icon="list-filter" only %}
{% endwdj_component %}
{% wdj_component "wdj/components/toolbar_item.html" %}
  {% include "wdj/components/select.html" with id="toolbar-sort" name="sort" aria_label="Sort records" options=toolbar_sort_options selected="name" only %}
{% endwdj_component %}
{% wdj_component "wdj/components/toolbar_item.html" shape="square" %}
  {% include "wdj/components/button.html" with variant="ghost" label="" icon="settings" shape="square" aria_label="View settings" only %}
{% endwdj_component %}
{% endwdj_component %}

Combobox

Show template
{% load wdj %}
{% wdj_component "wdj/components/toolbar.html" aria_label="Status filter" class="w-full max-w-md" %}
{% wdj_component "wdj/components/toolbar_item.html" %}
  {% include "wdj/components/button.html" with variant="ghost" label="Status" icon="list-filter" only %}
{% endwdj_component %}
{% wdj_component "wdj/components/toolbar_item.html" grow=True %}
  {% include "wdj/components/combobox.html" with id="toolbar-status" name="status" placeholder="Filter status…" options=toolbar_status_options labels=toolbar_combo_labels attrs=toolbar_combo_attrs only %}
{% endwdj_component %}
{% endwdj_component %}

Input shorthand

Show template
{% load wdj %}
{% wdj_component "wdj/components/toolbar.html" aria_label="Search DNS records" class="w-full max-w-md" %}
{% wdj_component "wdj/components/toolbar_item.html" grow=True %}
  {% include "wdj/components/input.html" with id="toolbar-shorthand" aria_label="Search DNS records" placeholder="Search DNS records" only %}
{% endwdj_component %}
{% wdj_component "wdj/components/toolbar_item.html" shape="square" %}
  {% include "wdj/components/button.html" with variant="ghost" label="" icon="list-filter" shape="square" aria_label="Filter" only %}
{% endwdj_component %}
{% wdj_component "wdj/components/toolbar_item.html" shape="square" %}
  {% include "wdj/components/button.html" with variant="ghost" label="" icon="settings" shape="square" aria_label="Settings" only %}
{% endwdj_component %}
{% endwdj_component %}

Input group

Show template
{% load wdj %}
{% wdj_component "wdj/components/toolbar.html" aria_label="Worker address" class="w-full max-w-lg" %}
{% wdj_component "wdj/components/toolbar_item.html" grow=True %}
  {% include "wdj/components/input_group.html" with id="toolbar-worker" name="worker" aria_label="Worker subdomain" placeholder="my-worker" suffix=".workers.dev" only %}
{% endwdj_component %}
{% wdj_component "wdj/components/toolbar_item.html" %}
  {% include "wdj/components/button.html" with variant="ghost" label="Visit" only %}
{% endwdj_component %}
{% endwdj_component %}

Deprecated sizing

xs
sm
base
lg
Show template
{% load wdj %}
<div class="grid w-full max-w-sm gap-3">
{% for size in audit_sizes %}
<div class="flex min-w-0 items-center gap-3"><span class="w-10 shrink-0 text-base text-kumo-subtle">{{ size }}</span>
{% wdj_component "wdj/components/toolbar.html" aria_label="Search size" size=size class="min-w-0 flex-1" %}
{% wdj_component "wdj/components/toolbar_item.html" grow=True %}
  {% include "wdj/components/input.html" with id="toolbar-size-"|add:size aria_label=size|add:" search" placeholder="Search..." only %}
{% endwdj_component %}
{% wdj_component "wdj/components/toolbar_item.html" %}
  {% include "wdj/components/button.html" with variant="ghost" label="Apply" only %}
{% endwdj_component %}
{% endwdj_component %}
</div>
{% endfor %}
</div>

Button actions

Show template
{% load wdj %}
{% wdj_component "wdj/components/toolbar.html" aria_label="File actions"  %}
{% wdj_component "wdj/components/toolbar_item.html" %}
  {% include "wdj/components/button.html" with variant="ghost" label="Upload" icon="upload" only %}
{% endwdj_component %}
{% wdj_component "wdj/components/toolbar_item.html" %}
  {% include "wdj/components/button.html" with variant="ghost" label="Download" icon="download" only %}
{% endwdj_component %}
{% endwdj_component %}

Accessible labels

Show template
{% load wdj %}
{% wdj_component "wdj/components/toolbar.html" aria_label="Search records" class="w-full max-w-lg" %}
{% wdj_component "wdj/components/toolbar_item.html" grow=True %}
  {% include "wdj/components/input.html" with id="toolbar-accessible" aria_label="Search records" placeholder="Search" only %}
{% endwdj_component %}
{% wdj_component "wdj/components/toolbar_item.html" shape="square" %}
  {% include "wdj/components/button.html" with variant="ghost" label="" icon="search" shape="square" aria_label="Search" only %}
{% endwdj_component %}
{% endwdj_component %}

Vertical

Show template
{% load wdj %}
{% wdj_component "wdj/components/toolbar.html" aria_label="Vertical" orientation="vertical" class="w-40" %}
{% wdj_component "wdj/components/toolbar_item.html" %}
  {% include "wdj/components/button.html" with variant="ghost" label="Previous" only %}
{% endwdj_component %}
{% wdj_component "wdj/components/toolbar_item.html" %}
  {% include "wdj/components/button.html" with variant="ghost" label="Next" only %}
{% endwdj_component %}
{% endwdj_component %}

Without focus wrapping

Show template
{% load wdj %}
{% wdj_component "wdj/components/toolbar.html" aria_label="Without focus wrapping" loop_focus=False %}
{% wdj_component "wdj/components/toolbar_item.html" %}
  {% include "wdj/components/button.html" with variant="ghost" label="Previous" only %}
{% endwdj_component %}
{% wdj_component "wdj/components/toolbar_item.html" %}
  {% include "wdj/components/button.html" with variant="ghost" label="Next" only %}
{% endwdj_component %}
{% endwdj_component %}

Disabled action

Show template
{% load wdj %}
{% wdj_component "wdj/components/toolbar.html" aria_label="Disabled action"  %}
{% wdj_component "wdj/components/toolbar_item.html" %}
  {% include "wdj/components/button.html" with variant="ghost" label="Edit" disabled=True only %}
{% endwdj_component %}
{% wdj_component "wdj/components/toolbar_item.html" %}
  {% include "wdj/components/button.html" with variant="ghost" label="Download" icon="download" only %}
{% endwdj_component %}
{% endwdj_component %}

Working filters

4 records

No records match these filters.

Show template
{% load wdj %}
{{ toolbar_records|json_script:"toolbar-records-data" }}
<form class="w-full max-w-lg space-y-4" x-data="{ query: '', status: 'all', records: JSON.parse(document.getElementById('toolbar-records-data').textContent), get filtered() { return this.records.filter(row => (this.status === 'all' || row.status === this.status) &amp;&amp; row.name.toLowerCase().includes(this.query.toLowerCase())); } }"
      @submit.prevent @change="if ($event.target.name === 'status') status = $event.target.value" @reset="query = ''; status = 'all'">
  {% wdj_component "wdj/components/toolbar.html" aria_label="Filter DNS records" class="w-full" %}
    {% wdj_component "wdj/components/toolbar_item.html" grow=True %}
      {% include "wdj/components/input.html" with id="toolbar-working-query" name="q" aria_label="Search DNS names" placeholder="Search records" attrs=toolbar_query_attrs only %}
    {% endwdj_component %}
    {% wdj_component "wdj/components/toolbar_item.html" %}
      {% include "wdj/components/select.html" with id="toolbar-working-status" name="status" aria_label="Record status" options=toolbar_filter_options selected="all" only %}
    {% endwdj_component %}
    {% wdj_component "wdj/components/toolbar_item.html" shape="square" %}
      {% include "wdj/components/button.html" with type="reset" label="" aria_label="Reset filters" variant="ghost" shape="square" icon="rotate-ccw" only %}
    {% endwdj_component %}
  {% endwdj_component %}
  <p role="status" class="text-base text-kumo-subtle" x-text="filtered.length + ' records'">4 records</p>
  <ul class="divide-y divide-kumo-hairline">
    <template x-for="row in filtered" :key="row.name">
      <li class="flex flex-wrap items-center justify-between gap-2 py-2 text-base"><span class="break-all" x-text="row.name"></span><span class="text-kumo-subtle" x-text="row.status"></span></li>
    </template>
  </ul>
  <p x-cloak x-show="!filtered.length" class="text-base text-kumo-subtle">No records match these filters.</p>
</form>

API Reference

Prop Type Default Description
string unset Aria label; pass the documented value shown in the examples.
string base Compatibility sizing for all explicit toolbar items: xs=20, sm=26, base=36, lg=40px. Prefer the default base size.
string horizontal horizontal or the wdj vertical extension; arrow navigation follows orientation and RTL direction.
bool True Loop focus; pass the documented value shown in the examples.
string / HTML slot unset Wrap each Button/link, Input, InputGroup, Select or Combobox in toolbar_item.html to join its borders and keyboard focus order.
dict {} Dictionary of escaped native, HTMX or Alpine attributes. Literal Tailwind classes only.
string "" Class; pass the documented value shown in the examples.
bool False toolbar_item.html: let an input or combobox fill the remaining toolbar width.
string base toolbar_item.html: square for an icon-only cell. Give the child Button an empty label and a meaningful aria_label.
HTML slot unset toolbar_item.html: one existing control, retaining its form name, options, HTMX and Alpine attributes.
string "" Additional literal classes on the toolbar item wrapper.

Accessibility notes

Every interactive component keeps real semantics and keyboard support: native controls where possible, ARIA only where necessary, and a visible focus ring. See the Accessibility page for the shared contract.

Read the accessibility contract

Components

Components overview
AutocompleteFree-form input with local or HTMX-filtered suggestions.
BadgeSolid, tinted, outline and dot status labels.
BannerInline message bar with variants and optional action.
BreadcrumbsTrail navigation in two sizes.
ButtonVariants, sizes, shapes, icons and loading state.
ButtonGroupJoins a small set of tightly-coupled buttons into a single control (split buttons).
CheckboxSingle checkbox and indeterminate state.
ClipboardTextRead-only text field with a one-click copy-to-clipboard button.
Code / CodeHighlightedEscaped Pygments grammar highlighting, multiline tokens, line numbers, highlighted lines and localized copying.
CollapsibleComposable disclosure component for showing and hiding content.
Combobox / AutocompleteKumo-styled input/button triggers, search inside the popup, grouped local choices and debounced HTMX search.
CommandPaletteAccessible spotlight search overlay with Cmd+K keyboard shortcut.
DatePickerKumo-styled date and datetime popups; inline single, multiple and range calendars with bounds/presets.
DateRangePickerStyled popup or inline range calendar with bounds, presets and separately named form values.
DialogNative <dialog> modal with focus management.
DrawerEdge-anchored modal panel. LayerDialog has its own layered component.
DropdownMenuNative details menu with delegated keyboard navigation and dismissal.
EmptyEmpty-state placeholder with icon and action.
FieldLabel + description + error wrapper. Built into each control.
FlowDirected diagrams with branches, SVG connectors, custom anchors and responsive local scrolling.
GridResponsive CSS grid layout container with preset column configurations.
InlineCopyTextCompact borderless copy control for IDs and short values.
InputText field with label, description, leading/trailing icons.
InputAreaMulti-line textarea with auto-resize option.
InputGroupInput field with seamless prefix, suffix, and addon attachments.
LabelForm field label, optional marker and tooltip.
LayerCardCompound surface card with distinct primary and secondary layers.
LayerDialogLayered native modal with actions, forms, nested dialogs and pending states.
LinkInline, current and plain text links.
LoaderAnimated spinner in three sizes.
MenuBarCompact view selector using native radio semantics.
MeterProgress bar showing a measured value within a known range.
PaginationA page navigation component for navigating through paginated content.
PopoverAnchored popup with interactive content.
RadioRadio group, vertical and horizontal.
SelectKumo-styled Alpine dropdown with groups, rich options and multiple selection; native form values and fallback.
SensitiveInputPassword/secret input with reveal toggle and copy button.
SeparatorHorizontal / vertical rules with optional label.
SidebarRecursive navigation groups, account/zone views, search, loading, resize and full-screen mobile breadcrumbs.
SkeletonShimmer placeholder.
SliderInset single/range selection with vertical grips, value badges, endpoint labels and native keyboard/form behavior.
SurfaceBordered surface panel with header slot.
SwitchOn/off toggle in three sizes.
TableServer-driven table: sort, filter, select and paginate the full dataset.
Table of contentsPage section navigation tree with active link indicator.
TabsSegmented and underline tabs with a sliding indicator, responsive overflow and local Alpine or URL/HTMX state.
TagInputMulti-value badge input for tags and recipients.
TextHeading, body, secondary, success, error and mono text.
ToastyExpandable notification stack with variants, paused expiry and a live region.
ToolbarCompact grouped controls with shared borders, composed filters and keyboard arrow navigation.
TooltipHover and focus tooltip with grouped delays, Escape dismissal and viewport bounds.
↑ ↓ Navigate ↵ Select