UI Components
modal, modal_overlay, confirm_dialog, drawer, dropdown, code, fragment islands, tabs, badge, toast — Interactive elements.
Modal
Modal overlay (Alpine)
Div-based overlay using Alpine $store.modals — alternative when you avoid native <dialog>.
Overlay title
Overlay body — same UX pattern as modal, different implementation.
Confirm Dialog
Destructive actions. variant="danger" for red confirm button.
Drawer
side="left" or side="right". Native <dialog>.
Split Button
Primary action + dropdown. Use primary_submit=true inside a form.
Popover
Filters
Filter by status:
Floating panel for forms, actions. Same HTML as dropdown, different styling.
Dropdown
Dropdown menu (items API)
dropdown_menu(trigger, items=[…]) — Alpine-controlled; dispatches chirpui:dropdown-selected.
Dropdown Select
dropdown_select(label, items=[…]) — combobox/listbox anatomy for non-submit selections.
Code
Inline: use_chirp_ui(app)
and block with optional copy:
uv pip install -e ".[showcase]"
Keyboard Shortcuts
Separator
Aspect Ratio
Items and Scroll Area
Fragment island
Safe region for HTMX mutations (see /chrome for more context).
Tabs
Overview content. Tabs use htmx to swap this content without a full page reload.
Click tabs to swap content via htmx. No full page reload.
Badges
Accordion
How do I sign up?
How do I reset my password?
How do I update my profile?
Native <details> with name — only one open at a time.
Collapse
Click to expand
Hidden content. Single expand/collapse section.
Tooltip
Pure CSS tooltip. Uses title for accessibility.
Toast
Toast appears via htmx OOB swap. Check top-right after clicking.
Row Actions
Kebab/dots menu for table rows. Supports variant="danger" for destructive actions.
Status Indicator
Colored dot + label. Use pulse=true for live/active states.
Status with Hint
Status badge paired with a secondary hint line for extra context.
Empty State
With action button. Use for zero-result screens, onboarding, or blank slates.
Nothing here yet
Without action — just an icon and a title.
Reveal on Scroll
This content reveals when scrolled into view.
Fade/slide in on scroll using IntersectionObserver. Wrap any content.
Infinite Scroll
Loads the next page automatically when scrolled into view. Shows a loading indicator.