Renders the expanded drawer view for a single support ticket, including the conversation timeline, metadata, and status-dependent actions (reply composer or reopen). Extracted from `ticket-row.tsx` to be shared across both the lib's `TicketRow` and the hub's `TicketCard` compositions. ## Key Components - **`TicketDetailDrawer`** — Root component. Renders the assigned agent row, optional linked ClickUp delivery card, conversation timeline, reply-failure banner, and status-gated action area (composer for open tickets, reopen button for closed). - **`TicketTimelinePanel`** — Internal component. Fetches and renders the chronological conversation feed via `useTicketEngagements`, with Slack-style auto-scroll (`useStickToBottom`). Suppresses duplicate "Original message" body turns when a matching customer engagement already exists. - **`TicketRef`** — Exported type. Identity bundle `{ id, external_id }` threaded through action callbacks. - **`TicketDetailDrawerProps`** — Exported interface. Full prop surface including `onSendMessage`, `onClose`, `onReopen`, `replyError`, and `onClearReplyError`. ## Usage Example ```typescript import { TicketDetailDrawer, type TicketRef, } from '@openframe-oss-lib/ticket-detail-drawer' { return await sendReply(ref.external_id, text, attachments) }} onClose={async (ref: TicketRef) => { return await closeTicket(ref.external_id) }} onReopen={async (ref: TicketRef) => { return await reopenTicket(ref.external_id) }} onActionCollapsed={() => setDrawerOpen(false)} replyError={replyError} onClearReplyError={() => clearReplyError(ticket.external_id)} /> ``` **Source:** [`ticket-detail-drawer.tsx`](https://github.com/flamingo-stack/openframe-oss-lib/blob/main/ticket-detail-drawer.tsx)