UI / Server-rendered components
Buttons that disable themselves while submitting. Modals that trap focus. Tables that sort without a JS framework.
djust components are written in Python, render on the server, and inherit your active theme pack automatically. The hot path for every shipped component is Rust under the hood — sub-millisecond render, but you write a normal Python class.
The widgets every form needs, with djust's reactive primitives wired in by default — pending states, validation hooks, focus management.
Variants, loading state, focus ring.
Five variants (primary, secondary, ghost, destructive, link), an auto-disabled state during @action handlers, and a focus ring that picks up --ring from the active pack.
Type-ahead with server-side options.
Renders the picker; you supply the option list (synchronous or via a @server_function). Keyboard nav, ARIA roles, and the empty-state are wired correctly.
The classics, themed.
data-dj-inline="true" gives radio fields a horizontal layout in v0.7.2+. Range and Textarea inherit border + focus tokens from the active pack.
Containers and arrangement primitives. Sortable tables, navigation trees, breadcrumbs — all server-rendered, all keyboard-accessible.
Sortable, filterable, row-clickable tables.
Pass a queryset, get a table. Row-level navigation (row_url, row_click_event) ships in v0.9.0+ with full keyboard activation, ARIA, and CSP-strict friendliness — no inline onclick.
Page furniture without the bloat.
Four primitives that show up on every dashboard. Each renders as semantic HTML with theme-token borders and spacing — no opinionated chrome you have to fight.
Read the guide →Top nav with mobile drawer behavior built in.
Drop-in masthead that handles the desktop bar, the mobile hamburger, and the focus trap when the drawer opens. Pairs with the {% theme_panel %} dropdown.
Dialogs, toasts, tooltips, popovers — the things that need to win the focus trap and the close affordance.
Native <dialog> with djust wiring.
The Modal component renders an HTML <dialog> so the backdrop, focus-trap, and Escape handling are browser-native. The dj-dialog="open" / dj-dialog="close" attributes let any template open or close it without an event handler.
Flash messages that fade themselves.
Pairs with self.flash(level, message) in any handler. The toast renders, the timer runs client-side, and the element fades out via dj-remove without a round trip.
Hover help, click-to-reveal panels.
Both render server-side, attach via aria-describedby for screen readers, and pick up the active pack's --popover / --popover-foreground tokens.
Every routed components page — overview, API, best practices, examples, performance, design philosophy, LiveComponent architecture, Rust internals, and the migration guide.