layer a dedupe controller on top of sonner; sonner stays the renderer.
identical fires re-highlight one card with a climbing count + bounce
instead of stacking. the controller owns the dismiss timer (sonner
duration: infinity), so a re-fire refreshes it; the live window holds
the registry through the exit animation so a mid-dismiss re-fire
re-highlights the fading toast.
- three variants (single, title+body, action), status icon, count badge
from 2, action button in a bordered footer, close on every toast
- identity by explicit dedupeKey, else content hash
- aria-live region speaks re-fires (sonner won't re-announce an in-place
update); first fire stays sonner's job to avoid double-speak
- migrate all toast imports to #/components/ui/toast; string callers keep
their call shape
- run copy button now toasts "copied to clipboard"