Toast
Confirmation without interruption. Toasts report outcomes — broadcast, settled, failed — and never ask questions. Five tones, one stack; loading toasts refuse dismissal until the work resolves, and everything else can be flung away.
All tones — full stack, pinned open
The real component rendered statically inline (placement=static, duration 0 — no timers, no portal). Neutral, info, loading, success, error. The loading toast is non-dismissible, so it has no close affordance.
Watch-only wallet added
Main Vault (xpub…9wPd) is now tracked without keys.
Fee estimate updated
Standard is now 6 sat/vB (~30 minutes).
Broadcasting transaction
Relaying through Tor — a few seconds.
Transaction broadcast
0.245 000 00 BTC to bc1q…8p3w · 924 sats fee.
Broadcast failed
Fee below relay minimum. Nothing left your wallet.
import { AnimatedToastStack, useAnimatedToastStack } from "@coldharbor/ui";
const { toasts, showToast, dismissToast } = useAnimatedToastStack();
showToast({
status: "success",
title: "Transaction broadcast",
description: "0.245 000 00 BTC to bc1q…8p3w · 924 sats fee.",
});
<AnimatedToastStack toasts={toasts} onDismiss={dismissToast} position="bottom-right" fixed />--ch-surface--ch-border--ch-fg--ch-fg-muted--ch-primary--ch-success--ch-danger
Variants
An action slot for follow-ups, a persistent loading toast that cannot be dismissed, and placement=absolute anchoring the stack inside a panel instead of the viewport.
Swap complete
0.08 BTC → 28.301 XMR settled to your primary account.
Restoring wallet
Scanning 84,120 blocks for silent-payment outputs.
Address copied
showToast({
status: "success",
title: "Swap complete",
action: { label: "View swap", onClick: openSwapDetail },
});
showToast({ status: "loading", title: "Restoring wallet", dismissible: false, duration: 0 });--ch-surface--ch-border--ch-fg--ch-fg-muted--ch-primary--ch-success--ch-danger
Live stack
Spawn real toasts: entrance spring, 4.2s auto-dismiss, at most four visible, drag sideways to fling one away. Every third broadcast fails, so both outcome tones appear.
const { toasts, showToast, dismissToast } = useAnimatedToastStack({ limit: 4 });--ch-surface--ch-border--ch-fg--ch-fg-muted--ch-primary--ch-success--ch-danger
Themes
The success toast under all three layers.
Transaction broadcast
0.245 000 00 BTC to bc1q…8p3w.
--ch-surface--ch-border--ch-fg--ch-fg-muted--ch-primary--ch-success--ch-danger