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 with
aria-activedescendant.
These ship experimental with keyboard / a11y browser gauntlets and degrade gracefully without JavaScript.
Application shell
- Mobile nav drawer — opt into
app_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, soaria-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
canonical
match-drivensyncNav, a non-anchortopbar_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 live
examples/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 shipping
stablewithout 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-showcaseapp, reachable from the/showcase/docs route. data_tableis now experimental (usedata_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. - Prefer
data_gridoverdata_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"(ormatch="exact") on those links to restore it (#197). - Contributors: changelog fragments must use the flat, towncrier-discoverable
form
changelog.d/+<slug>.<type>.md. Fragments placed in achangelog.d/<type>/subdirectory are silently ignored by the build and are now rejected by the changelog gate.
Verification
Release prep passed:
uv run poe ciuv run poe test-browser-chromemake release-preflight