chirp-ui 0.10.0

A server-driven data grid, typeahead/date-picker/context-menu input primitives, a mobile nav drawer and route-context rail, and loud Alpine self-checks.

uv add chirp-ui==0.10.0

Install

pip install chirp-ui==0.10.0
# or
uv add chirp-ui==0.10.0

With Chirp:

pip install "bengal-chirp[ui]"

What's New

Server-driven data grid

The headline addition is data_grid — a citable interactive-grid composite backed by a new typed, Chirp-agnostic Python helper, chirp_ui.grid_state (Column / GridSort / ColumnSort / SelectionState plus parse_sort, sort_columns, selection_state, column_aria_sort, and sort_query). The helper projects each column'saria-sort and toggle URL so the server ORDER BY and the rendered headers cannot drift. Sorting is a real<button>, selection is a single idempotentchirpuiGridSelectionAlpine factory with page-scoped select-all, the first column can pin sticky, and rows load more via HTMX. Proven end-to-end bytests/browser/test_data_grid_gauntlet.py.

table() gained additive selectable / select_name / selection / row_id/ sticky_first_col parameters (the legacy sortable= / sort_url=path is byte-identical), anddata_tablewas demoted stable → experimental, superseded bydata_grid.

New interactive input primitives

  • combobox — a WAI-ARIA typeahead autocomplete input, with a token-pill multi-select mode.
  • context_menu — a right-click / keyboard context-menu primitive.
  • date_picker — a client-rendered date and range picker.
  • Command palette arrow-key result navigation witharia-activedescendant.

These ship experimental with keyboard / a11y browser gauntlets and degrade gracefully without JavaScript.

Application shell

  • Mobile nav drawer — opt intoapp_shell(nav_drawer=true)for an accessible off-canvas slide-over below 48rem (focus trap, ESC, scrim, scroll lock, focus return). The controller is vanilla JS inshell_runtime_script()and repositions the same<aside> regions, so aria-currentand OOB swaps keep working.
  • Route-context rail — a route-aware secondary rail region with a content-swap protocol.
  • The two shell entry points (macro and layout) were reconciled and hardened: a canonicalmatch-driven syncNav, a non-anchor topbar_leadingslot for back/menu affordances, andshell_actions_bar(id_suffix=…)to namespace ids when the bar renders twice.

Alpine reliability

Chirp UI now emits a loud self-check when Alpine fails to load, and check_alpine_runtimedetects both a missing Alpine core and the CDN-URL footgun that silently ships a non-browser build.

Layout and control primitives

Eight new stable primitives round out the low-level toolkit:aspect_ratio (fixed-ratio media frame),item(reusable row anatomy for lists, menus, and command results),kbd (inline keyboard-key hint), ui_label(standalone label for custom controls),scroll_area (contained overflow region), separator (semantic or decorative divider),slider(native range-input wrapper), and toggle_group(grouped single- or multiple-selection toggle buttons).

Docs, theme, and contributor proof

  • Learning Tracks, a notebook content type, an on-site component index generated from the manifest, and a steward network for cross-surface review.
  • A liveexamples/component-showcaseChirp app deployed to Railway replaces the hand-maintained static gallery.
  • A browser a11y gate, layout relationship contracts, and a maturity-honesty rule that blocks any thin composition wrapper from shippingstablewithout proof.
  • Broad visual taste-floor passes across content media, data loading, headers, navigation disclosure, small controls, and special form controls.

See the CHANGELOG for the complete list of 53 entries.

Changed

  • The static component showcase is replaced by the live Railway-deployed examples/component-showcase app, reachable from the /showcase/docs route.
  • data_table is now experimental (use data_gridfor sortable / selectable grids);workspace_shellis experimental pending recipe-first promotion.
  • Direct-shell view transitions, docs-nav folder disclosure, and a canonical shell active-sync land alongside the visual taste-floor passes.

Fixed

  • The form-field border no longer leaks onto the segmented-control pill (height regression).
  • The data-grid load-more button refreshes / removes via an OOB sentinel.
  • The changelog / releases timelines now sort chronologically and the authors profile renders a real authored-post feed instead of a self-referential card.
  • Unique nav landmark names, reduced-motion back-to-top scroll, absolute SEO origins, and JSON-LD / RSS structured-data corrections.

Upgrade Notes

This is a minor release: it adds new components and shell capabilities and contains no breaking changes to existing public macros.

  • New primitives (combobox, context_menu, date_picker) ship experimental — opt in deliberately and pin against churn.
  • Preferdata_grid over data_tablefor any sortable or selectable table; data_tableis now experimental.
  • The mobile nav drawer and route-context rail are opt-in and additive — unset, the shell keeps its existing fallback behavior.
  • Behavior change: match-less sidebar / navbar links are now server-authoritative for active state. If your shell relied on automatic client active-link highlighting across boosted navigation, set match="prefix" (or match="exact") on those links to restore it (#197).
  • Contributors: changelog fragments must use the flat, towncrier-discoverable formchangelog.d/+<slug>.<type>.md. Fragments placed in a changelog.d/<type>/subdirectory are silently ignored by the build and are now rejected by the changelog gate.

Verification

Release prep passed:

  • uv run poe ci
  • uv run poe test-browser-chrome
  • make release-preflight