An integration map naming every system as a card, inverting the first-party one so it reads as the origin, then listing each crossing on a hairline row with what travels and how often.
An integration map naming every system as a card, inverting the first-party one so it reads as the origin, then listing each crossing on a hairline row with what travels and how often.
Upgrade to Pro
Pro blocks install through the shadcn CLI with your license key and ship their full source. Docs and live previews stay open to everyone, so you can read every block's details first.
Swap YOUR_EMAIL and YOUR_KEY for the email and license key on your account. Find your license key on your account page.
Radix flavor
npx shadcn add "https://ui.beste.co/r/workflow54?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/workflow54?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/workflow54.tsx plus the badge23 and button21 components it uses for the eyebrow and the closing action.
The installed file exports workflow54Demo alongside the block: the exact props behind the preview above. Spread it to get a working map in one line.
import { Workflow54, workflow54Demo } from "@/components/beste/block/workflow54";
export default function DataFlowPage() {
return <Workflow54 {...workflow54Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Workflow54 } from "@/components/beste/block/workflow54";
export default function DataFlowPage() {
return (
<Workflow54
badge={{ label: "What crosses where" }}
heading="The only four places your data goes, and what goes there"
description="Drawn out rather than described, because a data flow diagram is what governance asks for."
nodesTitle="The systems involved"
nodes={[
{ name: "Sirius", detail: "The workspace itself. Everything else is downstream of this." },
{
name: "Payment processor",
detail: "Card details go here directly and never touch our servers.",
external: true,
},
]}
flowsTitle="Every crossing"
columns={["From", "To", "What crosses", "How often"]}
flows={[
{
from: "Sirius",
to: "Payment processor",
payload: "Amount, reference, and a token. No card number.",
frequency: "Per payment",
},
]}
closing="No clinical record leaves the workspace on any of these paths."
button={{ label: "Get the architecture diagram", href: "/security/architecture" }}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
badge | { label: string } | – | Eyebrow above the hairline rule, rendered through Badge23 |
heading | string | – | Section heading in the left column of the header |
description | string | – | Supporting paragraph, right-aligned from md up |
nodesTitle | string | – | Heading above the system cards |
nodes | Node[] | [] | Every system involved, four across from lg |
flowsTitle | string | – | Heading above the crossings |
columns | string[] | [] | Column headings for the crossings table |
flows | Flow[] | [] | Every crossing between two systems |
closing | string | – | Closing claim beside the action |
button | { label: string; href: string } | – | Closing action |
className | string | – | Extra classes for the outer section |
type Node = {
name: string;
detail: string;
external?: boolean;
};
type Flow = {
from: string;
to: string;
payload: string;
frequency: string;
};
type ActionLink = {
label: string;
href: string;
};external inverts the relationship rather than adding a badge: the first-party node renders on bg-foreground with fixed background text tokens, and every external one on bg-muted. Nothing draws a border, so the distinction is surface alone.payload is the field the block exists for. Each crossing states exactly what travels, and the demo uses it to name what does not travel too.from and to are plain strings, so keeping the names consistent with the cards above is authoring work.lg, each hidden at the other breakpoint. That is how the row reads as a sentence on mobile and as a table on desktop.hidden lg:grid, and the rows container carries mt-4 lg:mt-0 so the spacing is right at both widths.workflow51
A workflow that scores each stage on how much of it runs unattended, drawing an accent bar per stage and naming what still needs a person, against a sticky column with one headline figure and a live stage tracker.
workflow26
Horizontal connected process steps with numbered nodes on a continuous rail.
workflow49
A workflow that states one trigger on an inverted full-width panel, then forks into two equally weighted condition branches whose outcomes sit in nested cards carrying the share of cases they account for.