A trust page that answers the review before it is sent: an inverted hero floating a live uptime record, the hosting and retention facts in plain rows, a full security questionnaire with partial answers marked as partial, a public ask-and-answer panel, a booking panel for the engineer who wrote it, and a minimal footer.
Composed from 7 blocks. Installing this page installs all of them, plus the pieces and primitives they use.
Built in the Sirius collection.
A trust page that answers the review before it is sent: an inverted hero floating a live uptime record, the hosting and retention facts in plain rows, a full security questionnaire with partial answers marked as partial, a public ask-and-answer panel, a booking panel for the engineer who wrote it, and a minimal footer. Seven blocks, one install.
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.
npx shadcn add "https://ui.beste.co/page/r/security1?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the page to components/beste/page/security1.tsx and everything behind it: the seven blocks it composes (navbar72, hero160, about72, faq90, faq91, cta86, footer121), the five components they use (indicator14, location8, card31, button21, badge23) and the shadcn/ui input, textarea and button primitives. Thirteen files.
The installed file exports security1Demo alongside the page: the exact props behind the preview above. Spread it to get a working page in one line.
import { Security1, security1Demo } from "@/components/beste/page/security1";
export default function Page() {
return <Security1 {...security1Demo} />;
}Each section is a separate prop, so the usual next step is to keep the demo and replace one section at a time. On this page the facts are what change.
import { Security1, security1Demo } from "@/components/beste/page/security1";
export default function Page() {
return (
<Security1
{...security1Demo}
facts={{
label: "The facts",
heading: "Where your data lives, and for how long.",
facts: [
{ term: "Hosting", detail: "Frankfurt and Dublin, both in the EU." },
{ term: "Retention", detail: "Deleted records are gone from backups within 30 days." },
{ term: "Sub-processors", detail: "Four, listed with what each one sees." },
],
}}
/>
);
}Every prop is the full prop object of the block that renders that section, so anything the block accepts is accepted here.
| Prop | Type | Default | Description |
|---|---|---|---|
navbar | ComponentProps<typeof Navbar72> | – | Product navbar |
hero | ComponentProps<typeof Hero160> | – | Inverted hero floating an uptime record |
facts | ComponentProps<typeof About72> | – | Hosting and retention, in plain rows |
controls | ComponentProps<typeof Faq90> | – | Security questionnaire, grouped |
questions | ComponentProps<typeof Faq91> | – | Public ask-and-answer panel |
cta | ComponentProps<typeof Cta86> | – | Booking panel for the engineer who wrote it |
footer | ComponentProps<typeof Footer121> | – | Minimal footer |
className | string | – | Extra classes for the page's outer wrapper |
| Section | Block | Notes |
|---|---|---|
| Navbar | navbar72 | Sticky for the whole document |
| Hero | hero160 | Dark inside the block already, with a live uptime record floating in it |
| Facts | about72 | Given bg-muted/40; term and detail rows, no prose |
| Controls | faq90 | The questionnaire, in a two-column grid of groups |
| Questions | faq91 | Also given bg-muted/40; carries the ask-a-question fields, hence the input and textarea dependencies |
| Booking | cta86 | Links to a booking page; no form of its own |
| Footer | footer121 | Minimal, so the page ends on the booking panel |
questions removes that section entirely rather than rendering an empty one.dark wrapper on this page even though it opens dark: hero160 is already inverted inside the block, so wrapping it would invert an inversion and hand back a light hero.sticky top-0 z-50 by the page, which works because the block carries its own opaque band.className="bg-muted/40" on both the facts and questions sections after spreading their props, so a className passed inside those props is overridden.faq90 lays its groups out in a two-column grid, so an odd number of control groups leaves one cell empty on the last row. Three groups is the count that shows it most.faq91), which is where the input and textarea dependencies come from. The booking panel below it is links, not a form.Wiring the form up
The ask-a-question panel ships as markup, not as a wired form. For validation and submission, see React Hook Form, TanStack Form, and Formisch.
navbar72
A minimal navbar with a lowercase wordmark, absolutely centered uppercase text links, an accent call to action, and a collapsing mobile menu.
hero160
A hero built as one dark panel: a light display heading, two actions, and a hairline table of service commitments beside a bordered image column that floats a live uptime strip.
about72
An about section on a soft surface that opens on a light statement, then lays out eight company facts as a two-column hairline definition list beside an image tile floating a live locations card.
faq90
A procurement FAQ grouping security controls into hairline rows that pair each question with a tone-coded yes, partial, or not-yet chip and the detail behind it, closing on a security pack request.
faq91
An open question FAQ pairing a soft panel that sticks while you scroll, holding a working question and email form, with the questions others sent recently answered as linked hairline entries.