Loading page…
Loading page…
Human-in-the-loop approval for tools and treasury actions. The beUI card owns status, disclosure, busy feedback, and decisions; ApprovalToast adds a persistent compact summary that morphs in place into the same full review.
Press Review — the shell grows on width and height together, while the approval content fades in. The toast has duration 0, dismissible false, no drag dismissal, and no close affordance. Approve, reject, or cancel are the only exits.
Action queue
Review opens immediately. The gate has no timeout, swipe, or close button.
The compact and expanded surfaces share one Motion layout identity.
<ApprovalToast
tool="treasury.request_disbursement"
summaryTitle="Treasury approval required"
summaryDescription="A-118 / Payroll / 1.10 BTC"
parameters={parameters}
onApprove={approveRequest}
onDeny={rejectRequest}
onCancel={cancelRequest}
/>--ch-surface--ch-canvas-raised--ch-border--ch-primary--ch-warning--ch-success--ch-dangerCompact preserves the familiar toast scan. Expanded reveals the full approval surface in the same location without sliding content from another direction.
Compact summary
Expanded review
Pending, approved, rejected, error, disabled, and code-parameter states use one public ToolApproval contract. Approving and running add aria-busy with a reduced-motion-aware loader.
triton reconcile --account operations --dry-run<ToolApproval
tool="treasury.request_disbursement"
status="pending"
parameters={parameters}
onApprove={approve}
onDeny={reject}
onCancel={cancel}
/>ApprovalCard composes ToolApproval around the existing treasury Approval fixture. AmountDisplay, AddressField, quorum, requester, and execution state remain domain components rather than a second approval schema.
<ApprovalCard approval={approval} />Under prefers-reduced-motion, the shared-layout morph becomes an immediate opacity swap, disclosure movement is removed, numeric content settles immediately, and busy status still remains legible in text. The action and persistence contract does not change.
// Built in: ToolApproval and ApprovalToast call useReducedMotion().
// No consumer prop or alternate component is required.