Add copy button to chat messages (#6)
### TL;DR
Adds a copy-to-clipboard button that appears on hover/focus for each chat message.
### What changed?
- Added a `CopyButton` component that writes text to the clipboard using the Clipboard API. After copying, it briefly shows a checkmark icon for 1.5 seconds before reverting to the copy icon.
- Added a `ChatMessageActions` component that renders the `CopyButton` and is hidden by default, becoming visible when the message is hovered or focused.
- Updated `ChatMessage` to wrap the message bubble in a `Stack` with a `group` class, enabling the hover/focus visibility behavior for `ChatMessageActions`. Actions are only rendered when the message has content and is not in the typing state.
### How to test?
1. Open a chat and send or receive a message.
2. Hover over a message — a copy button should appear below it.
3. Click the copy button and verify the message text is copied to the clipboard.
4. Confirm the icon switches to a checkmark briefly before reverting back to the copy icon.
5. Verify the button does not appear while the assistant typing indicator is active.
### Why make this change?
Users need a convenient way to copy message content without manually selecting text, improving the overall usability of the chat interface.
authored by