## card (`poetry_card`)

A container that groups related content and actions.

Class: Poetry::Ui::Card::Component - BEM block `poetry-ui-card`.
- `content_class:` (string) - Extra classes merged into the body cell (caller classes win). A chat-in-a-card layout passes min-h-0 flex-1 p-0 so the transcript can flex and scroll.
- `header_class:` (string) - Extra classes merged into the header row - border-b rules the title off from the body.
- `title_tag:` (symbol) - one of h1|h2|h3|h4|h5|h6, default "h3" - The heading element for the title - pick it to fit the page outline.
Slots: title (The heading line, rendered as a real heading element (title_tag:).), description (Muted one-liner under the title.), action (The header's trailing corner control (a button, menu, or link).), footer (The bottom row (actions/meta). class: merges into the footer div (a border-t divider is the canonical use); every other option (id:, data:, ...) rides onto the footer div verbatim.; with_footer yields NOTHING to the block - no |param|, write content directly).
- PART `card` - Root container - the vertical flex stack
- PART `card-header` - The title row grid - gains a trailing auto column when card-action is present
- PART `card-title` - The heading (title_tag, h3 by default)
- PART `card-description` - Muted one-liner under the title
- PART `card-action` - The header's trailing corner control
- PART `card-content` - The body - the content block renders here
- PART `card-footer` - The bottom row (actions/meta)
In blocks: `app-shell`, `section-card`, `stepper` - for a screen, start from the block (MCP compose/describe_block, or `bin/rails g poetry:block`), not from scratch.
- RULE: Compose with the slots (title/description/action/footer) - never rebuild the header grid by hand.
- RULE: The card body is the content block; use CardAction for the header-corner control.
- RULE: The title renders as a real heading (h3 default) - set title_tag: to fit the page outline.
