shadcn.io is not affiliated with official shadcn/ui
Invoice Email Delivery Billing Block for Vue
Who got an invoice: three recipients with delivered, bounced or ready-to-resend status in words, a status filter, an in-place Fix address field, an Add recipient field that refuses duplicates, and one button that resends to everyone who is missing it.
Installation
Overview
Answer "did the invoice reach everyone?" in one panel, with this invoice delivery for Vue with Ark UI. A header names the invoice and the day it was sent. Inside a hairline frame with a plus mark on each corner, a Segment Group filters the recipients to All, Delivered or Bounced, each with its count, and a list of four equal rows shows each recipient's role, their address and what happened in words with a dot: "Delivered 3 Oct" or "Bounced: mailbox full". A bounced row has a Fix address Button that turns the address into an Input in the same row, with Save and Cancel; an Add recipient field checks the shape of an address, refuses one already on the list and stops at four recipients. The only Shine Button says how many it will resend to ("Resend to 2 recipients") and resends to everyone who hasn't got the invoice. The bands are ruled by Guides and the foot is pinned on a phone. It's built from Segment Group, Input, Button, Shine Button and Guides, with a CSS entrance only. For billing settings and invoicing apps.
FAQ
How do I fill it from my email provider?
Edit START: each recipient has an id, a role, an address, a state of delivered, bounced or queued, the date of the last delivery in on and the bounce reason your provider returned. Map your provider's delivery events to those states. Replace resend with a call to your server that re-sends the invoice and returns each recipient's new status.
What stays local?
Everything. Resending changes the rows and says so ("Resent in this demo."), and no email leaves the page: a recipient whose address was fixed or added becomes delivered, and one whose mailbox is still full bounces again and says "Bounced again", so fixing the address is the way out. No address is ever shown as a mail link; show it as text, or add a copy button, so a stray click doesn't open a mail window.
Does the filter change the height?
No. The list always holds four rows. A filter that hides some leaves the space, with a short line ("No bounced recipients.") when nothing matches, and the first free row says how many more recipients can be added. Adding one past the first three fills a free row instead of growing the panel.
How does Fix address work with a keyboard?
Pressing Fix address moves focus to the field in the same row; Save and Cancel are next in the tab order, and either returns focus to that row's Fix address button. Save checks the shape of the address and refuses one that another recipient already has, answering in the status line. The Enter key in the field does not submit anything else.
Is it accessible?
Status is words first (delivered, bounced, ready to send) with a coloured dot only beside them. The row buttons say which recipient they act on for a screen reader, the fields have names, and one polite status line announces every result. The resend button stays in the page and answers when there's nothing to resend.