A live session sign-up splitting a bordered container between the pitch, a hairline table of when and how long, and a checked takeaway list, beside a soft column holding a working registration card and the hosts.
A live session sign-up splitting a bordered container between the pitch, a hairline table of when and how long, and a checked takeaway list, beside a soft column holding a working registration card and the hosts.
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/event99?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/event99?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/event99.tsx, the form36 capture piece it holds in the tile (installed to components/beste/piece/form36.tsx), and the badge23 component it uses for the eyebrow.
The installed file exports event99Demo alongside the block: the exact props behind the preview above. Spread it to get a working registration page in one line.
import { Event99, event99Demo } from "@/components/beste/block/event99";
export default function WebinarPage() {
return <Event99 {...event99Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Event99 } from "@/components/beste/block/event99";
import { Form36 } from "@/components/beste/piece/form36";
export default function WebinarPage() {
return (
<Event99
badge={{ label: "Live session" }}
heading="Migrating eleven years of records, walked through on real data"
description="We open one practice's actual export on screen and go column by column."
whenLabel="When"
when="Thursday 12 June, 14:00 UK"
lengthLabel="Length"
length="45 minutes, plus questions until they run out"
takeawaysTitle="What you will leave with"
takeaways={[
"A list of the fields your own export is likely to mangle",
"The two places a migration usually loses a day",
]}
media={
<Form36
label="Save me a seat"
placeholder="you@practice.com"
submitLabel="Register"
finePrint="One reminder the day before, then the recording."
/>
}
image={{ src: "/backdrops/blue.jpg", alt: "Soft blue gradient backdrop" }}
hostsTitle="Run by"
hosts={[
{
name: "Priya Nandan",
role: "Migration engineer, 40+ practices moved",
avatar: { src: "/people/priya.jpg", alt: "Portrait of Priya Nandan" },
},
]}
note="Cannot make the time? Register anyway and the recording arrives the next morning."
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
badge | { label: string } | – | Eyebrow at the top of the pitch column |
heading | string | – | Session heading |
description | string | – | Supporting paragraph, capped at max-w-md |
whenLabel | string | – | Label for the date row |
when | string | – | Date and time, as free text |
lengthLabel | string | – | Label for the duration row |
length | string | – | How long it runs |
takeawaysTitle | string | – | Heading above the checked list |
takeaways | string[] | [] | What attendees leave with |
media | ReactNode | – | Registration card, form36 in the demo |
image | { src: string; alt: string } | – | Backdrop behind the media tile |
hostsTitle | string | – | Heading above the host list |
hosts | Host[] | [] | Who is running the session |
note | string | – | Recording note under the hosts |
className | string | – | Extra classes for the outer section |
type TileImage = {
src: string;
alt: string;
};
type Host = {
name: string;
role: string;
avatar: { src: string; alt: string };
};form36 piece. This block holds no form state and has no submit handler.flex flex-col justify-between, so the hosts and the note pin to the bottom while the registration card takes the space above them. The card is flex-1 with min-h-64, so it grows to fill whatever height the pitch column sets.lg, and the divider between them flips from lg:border-l to border-t when they stack, so the seam always runs across the join.min-w-0 with truncate on both lines, so a long role ellipsizes rather than pushing the portrait out of the row.note carries its own border-t, which separates the recording caveat from the hosts above it.Wiring the form up
The registration card is a presentational piece with no submit handling of its own. When you connect it to a real list, the patterns in React Hook Form, TanStack Form, and Formisch cover validation and submission for this shape of single-field form.
event94
An events section that opens with a split featured card pairing a photo with date, time, and format lines, then lists the rest of the schedule as rows separated by hairlines, each with a bordered date tile, host meta, seat count, and register action.
event66
Interactive workshop selector with capacity tracking, attendee info form, and pricing summary. Perfect for paid workshops and training session signups.
event26
Workshop cards with instructor profiles, skill levels, requirements, and live capacity tracking. Perfect for hands-on conference workshops and training sessions.
event16
Panel session card featuring moderator highlight, panelist grid, discussion topic, and scheduled time. Perfect for industry panels and expert roundtables.