Renders an inline, collapsible approval section within a board ticket card, allowing users to approve or reject pending requests without navigating away from the board. ## Key Components ### `BoardTicketApproval` Main exported component that displays a collapsed-by-default approval panel. Renders two visual variants based on `approvalType`: - **`ADMIN`** — Yellow shield icon (`ShieldCheckIcon`), label "Technician approval required" - **`CLIENT`** (default) — Animated dots icon (`DotsLoaderIcon`), label "Pending client approval" When expanded, renders the shared `ApprovalBatchMessage` component to handle approve/reject interactions. ### `BoardTicketApprovalProps` | Prop | Type | Description | |---|---|---| | `pendingApproval` | `BoardTicketPendingApproval` | Approval metadata (id, type, tool calls) | | `onApprove` | `(requestId?: string) => void \| Promise` | Callback fired on approval | | `onReject` | `(requestId?: string) => void \| Promise` | Callback fired on rejection | ### Supporting hooks/utilities - **`useCollapsible`** — Manages animated expand/collapse height via `containerStyle` and `innerRef` - **`cn`** — Utility for conditional class merging ## Usage Example ```typescript import { BoardTicketApproval } from './board-ticket-approval' const pendingApproval = { id: 'req_abc123', approvalType: 'ADMIN', toolCalls: [{ name: 'restart_service', args: { service: 'nginx' } }], } console.log('Approved:', requestId)} onReject={(requestId) => console.log('Rejected:', requestId)} /> ``` **Source:** [`board-ticket-approval.tsx`](https://github.com/flamingo-stack/openframe-oss-lib/blob/main/board-ticket-approval.tsx)