October 2026 payroll
Ready to submitAll 248 payslips are checked. Submitting sends the payment file to Northwind's bank and locks this run.
- Employees
- 248
- Gross pay
- €1,284,560.00
- Pay date
- 31 October 2026
success-confirmation.tsx
"use client";
import { useState } from "react";
import { LuCircleCheck, LuSend } from "react-icons/lu";
import { Badge, Button, EmptyState, Modal } from "@nexera-ui/react";
const TOTALS = [
["Employees", "248"],
["Gross pay", "€1,284,560.00"],
["Pay date", "31 October 2026"],
] as const;
/** Success confirmation: a modal that confirms the payroll run was submitted and offers the next step. */
export default function SuccessConfirmation() {
const [isOpen, setOpen] = useState(false);
const [submitted, setSubmitted] = useState(false);
const submit = () => {
setSubmitted(true); // replace with your submit request
setOpen(true);
};
return (
<div className="@container bg-page px-4 py-8 @3xl:px-8">
<section
aria-labelledby="success-run-title"
className="mx-auto grid max-w-2xl gap-5 rounded-xl border border-default bg-surface p-6 shadow-sm"
>
<div className="flex flex-wrap items-center gap-2">
<h2 id="success-run-title" className="text-heading-h3 text-primary">
October 2026 payroll
</h2>
<Badge
tone={submitted ? "success" : "warning"}
label={submitted ? "Submitted" : "Ready to submit"}
/>
</div>
<p className="text-body-default text-secondary">
All 248 payslips are checked. Submitting sends the payment file to Northwind's bank
and locks this run.
</p>
<dl className="grid gap-3 rounded-lg bg-sunken p-4 @3xl:grid-cols-3">
{TOTALS.map(([term, value]) => (
<div key={term} className="grid gap-0.5">
<dt className="text-body-small text-secondary">{term}</dt>
<dd className="text-body-strong text-primary">{value}</dd>
</div>
))}
</dl>
<div className="flex flex-wrap justify-end gap-2">
<Button variant="secondary" size="md">
Review payslips
</Button>
<Button
size="md"
leadingIcon={submitted ? <LuCircleCheck /> : <LuSend />}
onPress={submit}
>
{submitted ? "View confirmation" : "Submit payroll"}
</Button>
</div>
</section>
<Modal
title="Payroll submitted"
isOpen={isOpen}
onOpenChange={setOpen}
isDismissable
primaryAction={
<Button size="md" slot="close">
Done
</Button>
}
secondaryAction={
<Button size="md" variant="secondary" slot="close">
View payslips
</Button>
}
>
<EmptyState
size="md"
headingLevel={3}
icon={<LuCircleCheck />}
title="€1,284,560.00 is on its way"
description="248 people will be paid on 31 October. We emailed the payment summary to finance@northwind.io, and payslips go out on the pay date."
/>
</Modal>
</div>
);
}
More states and system messages blocks
- Empty statesFirst use, no results and all done.
- Loading skeletonsPage and panel placeholders while data loads.
- Error pagesNot found, no access and something went wrong.
- ToastsShort confirmations with undo.
- Confirm a destructive actionName what will be deleted before deleting it.
- Maintenance and offlineTell people about downtime or lost connection.
- Long-running jobProgress for exports, imports and uploads.