Layout

container, grid, stack, block, surface, callout, hero, overlay, filter_bar, filter_chips, label_overline, segmented_control — Tetris-inspired layouts and backgrounds.

Breadcrumbs

Navigation trail. Last item is current page (no href).

Surface

surface(variant="default") — primary surface

surface(variant="muted") — subtle background

surface(variant="elevated") — with shadow

surface(variant="accent") — accent tint

Glass variants (blur over content):

glass — subtle blur

frosted — stronger blur

smoke — dark tint

surface(variant="default|muted|elevated|accent|glass|frosted|smoke", full_width=false, padding=true)

Callout

callout(variant="info|success|warning|error|neutral", title=none, icon=none)

Hero

Welcome to chirp-ui

HTML over the wire. CSS without apology.

hero(title=none, subtitle=none, background="solid|muted|gradient|mesh|animated-gradient")

Hero — Mesh Background

Mesh gradient

Multi-point radial gradient backdrop.

background="mesh" — radial gradient mesh pattern.

Hero — Animated Gradient

Animated gradient

Smooth shifting gradient. Respects prefers-reduced-motion.

background="animated-gradient" — CSS keyframe animation on the background.

Overlay

Place overlay as sibling to image inside a position: relative parent.

dark
gradient-bottom
gradient-top

overlay(variant="dark|gradient-bottom|gradient-top")

Divider

Content above
Content below

Dotted

Fade

divider(), divider("OR"), divider(variant="dotted"), divider(variant="fade"), divider("OR", variant="accent")

List

  • First item — use list_item() for custom content
  • Second item
  • Third item

list_group(items=[...]) for simple lists; list_group(bordered=true) with list_item() for custom rows.

Link

chirp-ui docs · Layout

Styled links with underline. Or use class="chirpui-link" on any anchor.

Stack — vertical flow with gap

Stacks arrange content vertically. Use gap="sm", default, or gap="lg".

Feature list
Responsive grid New

Auto-fit columns with minmax. Resize to see it adapt.

Container queries CSS

@container for component-level breakpoints.

Direction-aware RTL

padding-inline, margin-inline for i18n.

Profile card
Alex Chen Active

Engineer · San Francisco

Stacks nest naturally. This card body is a stack of avatar+info, then a caption.

Step list
1
Research — Gather requirements and constraints.
2
Design — Draft the layout and components.
3
Build — Implement with stack, grid, block.

Grid — responsive columns

Grids use cols=2, cols=3, or cols=4. Blocks can span=2 or more.

Grid (cols=2)

12.4k

+1.2k this month

98%

Last 30 days

Grid (cols=3) with span

Compact

Single column block.

Wide block

This block spans two columns. On narrow viewports it collapses to one.

Grid (cols=4)

Layout
Forms
Data
UI

Resize demo — @container

Resize me → inner grid reflows with container-type: inline-size.

1
2
3
4
5

RTL toggle

RTL — padding-inline and margin-inline flip with direction.

  • First item
  • Second item
  • Third item

Click LTR or RTL to swap the block. Uses dir, padding-inline, margin-inline.

Gap comparison

gap=sm

A
B
C

default

A
B
C

gap=lg

A
B
C

Stack + Grid combined

Main content

Stacks and grids compose. Put a grid inside a block, or stack cards in a grid.

Resize the viewport to see @container queries collapse spans and reflow columns.

Layout affinity shell prototype

Natural shell content

Frame resolves rail/content/nav intent, while stack and cluster resolve small pressure decisions without app-local layout classes.

docs responsive Read RFC

Split Panel

Resizable split layout with a draggable handle. Requires Alpine.js.

Sidebar
  • Nav item 1
  • Nav item 2
  • Nav item 3
Main Content

Drag the handle to resize the panels.

split_panel(direction="horizontal|vertical", default_split=50, min_split=10, max_split=90)

Entity Header

Title + meta + contextual actions for entity detail pages.

Project Alpha

Created 3 days ago

Simple Header

No icon, no actions

entity_header(title, meta=none, icon=none) — use

Search Header

Header with a prominent search strip for discovery and list pages.

Components

Browse the full library

search_header(title, form_action, query="", subtitle=none, search_placeholder="Search...")

Filter Bar

Filter-first action container for list and table controls.

filter_bar(action, method="get") — wraps action_strip inside a form.

Filter chips

Faceted pill rows (not the same as filter_bar). Pairs with register_colors for named theme colors. See docs/COMPONENT-OPTIONS.md.

filter_group + filter_chip — use href for navigation or HTMX attributes for partial swaps.

Label overline

Small caps label for cards and dense panels.

Inventory

Card body under an overline heading.

label_overline(text, section=true, tag="h3"|"span")

Segmented control

Mutually exclusive mode switcher (radiogroup).

segmented_control(items=[...], name="…", size="sm"|"lg")

Action Strip

Container for search, filter, and action rows on list pages.

action_strip(surface_variant="muted", density="sm|md", wrap="wrap|scroll|collapse", sticky=false)

Action Bar

Horizontal row of icon buttons for social actions (like, share, etc.).

action_bar() wraps action_bar_item(icon, label, count=none, href=none, active=false)

Media Object

Classic media + body layout primitive for lists and cards.

Media Object Title

Description text for the media object. Uses the classic OOCSS pattern.

media_object(align="start") with media_object_media, media_object_body, media_object_actions helpers.

Tray

Slide-out panel triggered by a button. Requires Alpine.js.

tray_trigger(id, label, icon=none) + tray(id, title, position="right")

Selection Bar

Bulk-action container shown when list or table rows are selected.

selection_bar(count=0, label="selected") — renders nothing when count is 0.

Tabbed Page Layout

Contract-aware tabbed page layout with route tabs, header, toolbar, and content slots.

tabbed_page_layout(tabs=[...], current_path="/layout") with slot page_header, slot page_toolbar, slot page_content.