Skip to the demo
Demos

flow-ui component kit

Twenty shadcn-style components, imported from @zerotal/flow-ui and themed by token-backed CSS variables. They're Flow components underneath — server actions, two-way binds and client expressions all pass through. Own the code: bun zt flow:add button copies one into your app.

Buttons

<Button>Default</Button>
<Button variant="secondary">Secondary</Button>
<Button variant="destructive">Delete</Button>
<Button variant="outline">Outline</Button>
<Button variant="ghost">Ghost</Button>
<Button size="sm">Small</Button>
<Button size="lg">Large</Button>
<Button disabled>Disabled</Button>

Badges

DefaultSecondaryDestructiveOutline
<Badge>Default</Badge>
<Badge variant="secondary">Secondary</Badge>
<Badge variant="destructive">Overdue</Badge>
<Badge variant="outline">Draft</Badge>

Card

Project Aurora

A surface container with header, content and footer.

Cards compose from parts, so you lay out exactly what you need.

<Card>
  <CardHeader>
    <CardTitle>Project Aurora</CardTitle>
    <CardDescription>A surface container…</CardDescription>
  </CardHeader>
  <CardContent></CardContent>
  <CardFooter><Button size="sm">View</Button></CardFooter>
</Card>

Form controls

<Label>Email</Label>
<Input value={this.email} placeholder="you@example.com" />
<Textarea placeholder="Say something…" />
<Switch bind={this.notifications} />
<Checkbox bind={this.terms} />

Select

<Select
  bind={this.country}
  placeholder="Choose a country"
  options={countries}   // { label, value }[]
/>

Radio group

<RadioGroup bind={this.plan} options={plans} />

Avatar, separator & skeleton

AdaATGH
<Avatar src={url} alt="Ada" />
<Avatar fallback="AT" />
<Separator />
<Skeleton class="h-4 w-3/4" />

Alerts

Heads up
Your trial ends in three days.
<Alert>
  <AlertTitle>Heads up</AlertTitle>
  <AlertDescription>Your trial ends in three days.</AlertDescription>
</Alert>
<Alert variant="destructive" dismissible></Alert>

Tabs

Manage your account details and preferences.

Change your password and security settings.

Invite teammates and manage roles.

<Tabs items={[
  { label: "Account",  content: <p></p> },
  { label: "Password", content: <p></p> },
  { label: "Team",     content: <p></p> },
]} />

Overlays & menu

Copy link to clipboard
<Button onClick={() => this.dialogOpen = true}>Open dialog</Button>
<Button onClick={() => this.sheetOpen = true}>Open sheet</Button>

<DropdownMenu label="Menu">
  <DropdownMenuLabel>My account</DropdownMenuLabel>
  <DropdownMenuItem>Profile</DropdownMenuItem>
  <DropdownMenuSeparator />
  <DropdownMenuItem>Sign out</DropdownMenuItem>
</DropdownMenu>

<Tooltip content="Copy link"><Button size="icon">🔗</Button></Tooltip>

<Dialog show={this.dialogOpen} title="Invite a teammate"></Dialog>
<Sheet show={this.sheetOpen} side="right" title="Filters"></Sheet>

Table

NameRoleStatus
Ada LovelaceOwnerActive
Alan TuringAdminActive
Grace HopperEditorInvited
<Table
  columns={[
    { key: "name", label: "Name" },
    { key: "role", label: "Role" },
    { key: "status", label: "Status",
      render: (row) => <Badge>{row.status}</Badge> },
  ]}
  rows={this.members}
  rowKey="name"
  hover
/>