Refactor chat composer into sticky floating card component (#11)
### TL;DR
Refactored the chat layout to use a sticky, absolutely-positioned composer that overlays the message list, and introduced a reusable `Card` component.
### What changed?
- Introduced a new `ChatComposer` component that wraps `ChatForm` inside a `Card`, positioned absolutely at the bottom of the chat view. `ChatForm` no longer accepts a `className` prop and has a more compact, borderless textarea style.
- Added a `Card` UI component with sub-components (`CardHeader`, `CardTitle`, `CardDescription`, `CardAction`, `CardContent`, `CardFooter`) supporting `default` and `sm` size variants.
- `ChatMessages` now wraps its content in a `Container` with bottom padding to prevent messages from being hidden behind the fixed composer.
- The `Chat` component and the chats index route now use `ChatComposer` instead of `ChatForm` directly, and the layout uses `relative`/`absolute` positioning to anchor the composer to the bottom.
- `Container` now renders as a flex column by default.
- The `SidebarInset` in the chats route layout no longer wraps content in a `Container`, allowing each route to manage its own layout and sizing. The inset height is set to `calc(100dvh - 1rem)`.
- The send button becomes full-width on mobile, and the controls row wraps to a column on smaller screens.
### How to test?
1. Open the chat list page (`/chats`) and verify the composer is pinned to the bottom with the heading and mascot centered above it.
2. Open an existing chat and confirm messages scroll independently while the composer remains fixed at the bottom.
3. Resize the browser to a mobile viewport and confirm the send button spans full width and the controls stack vertically.
4. Verify the `Card` component renders correctly with both `default` and `sm` sizes.
### Why make this change?
The previous layout pushed the chat form inline within the page flow, causing inconsistent spacing and scroll behavior. Pinning the composer absolutely at the bottom provides a more conventional chat UI where the input is always visible and the message list scrolls freely beneath it.
authored by