A legal section publishing every subprocessor as a scrollable hairline table with purpose, region, and start date, closing on an image tile that floats a live data residency card beside a subscribe-to-changes panel.
A legal section publishing every subprocessor as a scrollable hairline table with purpose, region and start date, closing on an image tile that floats a live data residency card beside a subscribe-to-changes panel.
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/legal54?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/legal54?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/legal54.tsx, the location8 residency piece it floats on the tile (installed to components/beste/piece/location8.tsx), and the badge23 and button21 components it uses for the eyebrow and the action.
The installed file exports legal54Demo alongside the block: the exact props behind the preview above. Spread it to get a working register in one line.
import { Legal54, legal54Demo } from "@/components/beste/block/legal54";
export default function SubprocessorsPage() {
return <Legal54 {...legal54Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Legal54 } from "@/components/beste/block/legal54";
import { Location8 } from "@/components/beste/piece/location8";
export default function SubprocessorsPage() {
return (
<Legal54
badge={{ label: "Subprocessors" }}
heading="Everyone who touches your data, and why"
description="We publish changes here thirty days before they take effect."
updatedLabel="Last updated 12 May 2026"
columns={["Provider", "Purpose", "Region", "In use since"]}
rows={[
{
name: "Aurora Cloud",
purpose: "Application hosting and database storage",
region: "London, United Kingdom",
since: "March 2023",
},
{
name: "Northline Payments",
purpose: "Card processing and settlement",
region: "Frankfurt, Germany",
since: "August 2023",
},
]}
media={
<Location8
title="Where your records live"
region="Primary region"
sites={[{ name: "Application data", meta: "London, UK", value: "Primary" }]}
total="0"
totalLabel="records replicated outside the region you choose"
/>
}
image={{ src: "/backdrops/green.jpg", alt: "Deep green gradient backdrop" }}
noticeTitle="Be told before anything changes"
noticeBody="Subscribe and we will email you thirty days ahead of any addition."
button={{ label: "Subscribe to changes", href: "/subprocessors/subscribe" }}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
badge | { label: string } | – | Eyebrow at the top left, rendered through Badge23 |
heading | string | – | Section heading in the left column of the header |
description | string | – | Supporting paragraph, right-aligned from md up |
updatedLabel | string | – | Last-updated line, opposite the eyebrow |
columns | string[] | [] | Table column headings |
rows | Subprocessor[] | [] | The register itself |
media | ReactNode | – | Live asset on the tile, location8 in the demo |
image | { src: string; alt: string } | – | Backdrop behind the media tile |
noticeTitle | string | – | Heading in the subscribe panel |
noticeBody | string | – | Paragraph in the subscribe panel |
button | { label: string; href: string } | – | Subscribe action |
className | string | – | Extra classes for the outer section |
type ActionLink = {
label: string;
href: string;
};
type Subprocessor = {
name: string;
purpose: string;
region: string;
since: string;
};table rather than a grid of divs, which is right for a register: it prints correctly, it can be copied into a spreadsheet, and screen readers announce the column headers with each cell.th with scope="row", so each row is announced with its provider rather than as four loose cells. It carries an explicit font-medium, since a th inherits bold from the browser default and Tailwind's Preflight does not reset it.min-w-[44rem] inside an overflow-x-auto wrapper, so it scrolls horizontally on small screens rather than compressing four columns into an unreadable width.align-top, so a long purpose does not push the provider name down its cell.updatedLabel sits opposite the eyebrow at the top rather than in the body, which is the convention this set uses for legal pages: the date is metadata about the document, not part of it.legal35
Displays trademark, patent, and copyright ownership information with registration details and usage restrictions. Suitable for product pages and legal sections.
legal57
An interactive cookie notice with four hairline categories on live switches, a locked required group, save and reject-all actions, and a scrollable table naming every cookie, its purpose, and its retention.
legal52
A readable policy page with a last-updated line, a sticky hairline table of contents that scrolls smoothly to each anchored section, prose sections with accent-bulleted lists, and a soft contact panel at the end.
legal5
Shows DPA details with controller/processor parties, dates, and processing purposes. Perfect for displaying B2B data processing contracts with status badges.