Skip to content
wdj

Table

Implemented Data

Server-driven table: sort, filter, select and paginate the full dataset.

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

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

Basic

Recent messages
Subject From Date
wdj v0.1 released Project team 5 seconds ago
New job offer Example company 10 minutes ago
Daily email digest Example company 1 hour ago
Show template
{% load wdj %}
<div class="w-160 max-w-full">
  {% include "wdj/components/table.html" with rows=audit_email_basic_rows columns=audit_email_columns caption="Recent messages" only %}
</div>

Sticky column

The actions column stays pinned to the right during horizontal scrolling. Its opaque background follows each row, with a gradient along the inner edge.

Messages with pinned actions
Subject From Date Tags Actions
wdj v0.1 released Project team 5 seconds ago —
New job offer Example company 10 minutes ago —
Daily email digest Example company 1 hour ago —
New comment Rob Knecht 1 day ago —
Out of office Johnnie Lappen 3 days ago —
Show template
{% load wdj %}
<div class="w-[450px] max-w-full">
  {% include "wdj/components/table.html" with rows=audit_email_rows columns=audit_email_sticky_columns caption="Messages with pinned actions" only %}
</div>

Sticky columns on both sides

Messages with pinned subject and actions
Subject From Date Tags Actions
wdj v0.1 released Project team 5 seconds ago —
New job offer Example company 10 minutes ago —
Daily email digest Example company 1 hour ago —
New comment Rob Knecht 1 day ago —
Out of office Johnnie Lappen 3 days ago —
Show template
{% load wdj %}
<div class="w-[450px] max-w-full">
  {% include "wdj/components/table.html" with rows=audit_email_rows columns=audit_email_both_sticky_columns caption="Messages with pinned subject and actions" only %}
</div>

Selection

Project Status Region Requests
marketing-site Active us-east-1 1,204,388
docs Active eu-west-1 88,412
staging-api Paused us-east-1 12,004
legacy-app Error ap-southeast-1 340
Show template
{% load wdj %}
{% include "wdj/components/table.html" with rows=rows columns=columns selectable=True only %}

Empty

Project Status Region Requests

No results

Try adjusting your filters.

Show template
{% load wdj %}
{% include "wdj/components/table.html" with columns=columns rows=empty_rows only %}

Sortable

Project Status Region Requests
marketing-site Active us-east-1 1,204,388
docs Active eu-west-1 88,412
staging-api Paused us-east-1 12,004
legacy-app Error ap-southeast-1 340
Show template
{% load wdj %}
{% include "wdj/components/table.html" with rows=rows columns=columns base_url="/resources/" sort="name" only %}

Responsive

Scroll horizontally on small screens.
Project Status Region Requests
marketing-site Active us-east-1 1,204,388
docs Active eu-west-1 88,412
staging-api Paused us-east-1 12,004
legacy-app Error ap-southeast-1 340
Show template
{% load wdj %}
{% include "wdj/components/table.html" with rows=rows columns=columns caption="Scroll horizontally on small screens." only %}

Loading

Show template
{% load wdj %}
<div class="grid w-full max-w-lg gap-4">
{% include "wdj/components/skeleton.html" with height="2rem" only %}
{% include "wdj/components/skeleton.html" with height="2rem" only %}
{% include "wdj/components/skeleton.html" with height="2rem" only %}
{% include "wdj/components/skeleton.html" with height="2rem" only %}
</div>

Live server table

Loading resource table…

Show template
{% load wdj %}
<div id="showcase-live-table" class="w-full" hx-get="/resources/table/" hx-trigger="load" hx-swap="innerHTML"><p class="text-base text-kumo-subtle">Loading resource table…</p></div>

Column alignment

Request counts aligned to the right
Project Status Region Requests
marketing-site Active us-east-1 1,204,388
docs Active eu-west-1 88,412
staging-api Paused us-east-1 12,004
legacy-app Error ap-southeast-1 340
Show template
{% load wdj %}
{% include "wdj/components/table.html" with rows=rows columns=columns caption="Request counts aligned to the right" only %}

Compact header

Compact project table
Project Status Region Requests
marketing-site Active us-east-1 1,204,388
docs Active eu-west-1 88,412
staging-api Paused us-east-1 12,004
legacy-app Error ap-southeast-1 340
Show template
{% load wdj %}
{% include "wdj/components/table.html" with columns=columns rows=rows compact_header=True caption="Compact project table" only %}

Fixed column widths

Fixed-width table
Project Region Requests
marketing-site us-east-1 1,204,388
docs eu-west-1 88,412
staging-api us-east-1 12,004
legacy-app ap-southeast-1 340
Show template
{% load wdj %}
{% include "wdj/components/table.html" with columns=audit_table_columns rows=rows fixed=True caption="Fixed-width table" only %}

Sticky first column

Sticky project column
Project Region Requests
marketing-site us-east-1 1,204,388
docs eu-west-1 88,412
staging-api us-east-1 12,004
legacy-app ap-southeast-1 340
Show template
{% load wdj %}
{% include "wdj/components/table.html" with columns=audit_table_columns rows=rows sticky_column=True caption="Sticky project column" only %}

Initially selected row

Selection state
Project Status Region Requests
Selected project eu-west 120
Other project us-east 80
Show template
{% load wdj %}
{% include "wdj/components/table.html" with columns=columns rows=audit_selected_rows selectable=True row_key="key" caption="Selection state" only %}

Compact and sticky

Compact sticky table
Subject From Date
wdj v0.1 released Project team 5 seconds ago
New job offer Example company 10 minutes ago
Daily email digest Example company 1 hour ago
New comment Rob Knecht 1 day ago
Out of office Johnnie Lappen 3 days ago
Show template
{% load wdj %}
<div class="w-[450px] max-w-full">
  {% include "wdj/components/table.html" with columns=audit_email_columns rows=audit_email_rows sticky_column=True sticky_header=True compact_header=True caption="Compact sticky table" class="max-h-48" only %}
</div>

Resizable columns

Resize columns using the keyboard or pointer
Project Region Requests
Selected project eu-west 120
Other project us-east 80
Show template
{% load wdj %}
{% include "wdj/components/table.html" with columns=audit_table_columns rows=audit_selected_rows resizable=True fixed=True caption="Resize columns using the keyboard or pointer" only %}

API Reference

Prop Type Default Description
list[dict] unset Flow: list of {nodes: [...]}; Table: key/label/width/align/sortable/mono/nowrap/hidden_label, optional sticky='left' or 'right'.
list[dict] unset Cell values are escaped scalars or dictionaries: text/badge/sub/href/mono, or actions plus an accessible label for the row menu.
string key Table row identity field, default key. Missing values use the row number; supply stable identifiers for application selection across sorting/pagination. Zero is retained.
bool False Selectable; pass the documented value shown in the examples.
string unset Caption; pass the documented value shown in the examples.
string unset Sort; pass the documented value shown in the examples.
string unset Dir; pass the documented value shown in the examples.
string unset Sort param; pass the documented value shown in the examples.
string unset Dir param; pass the documented value shown in the examples.
string unset Base url; pass the documented value shown in the examples.
string unset Base query; pass the documented value shown in the examples.
string unset Hx target; pass the documented value shown in the examples.
string unset Hx swap; pass the documented value shown in the examples.
bool False Fixed; pass the documented value shown in the examples.
bool False Legacy Table shortcut: pin the first column to the left. Prefer explicit column.sticky for left/right edges.
bool False Pin Table headers to the top of a constrained scroll container; pass a height class such as max-h-64.
bool False Compact header; pass the documented value shown in the examples.
bool False Resizable; pass the documented value shown in the examples.
string unset Empty title; pass the documented value shown in the examples.
string unset Empty description; pass the documented value shown in the examples.
string "" Class; pass the documented value shown in the examples.

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