mirror of
https://github.com/PrefectHQ/fastmcp.git
synced 2026-08-12 16:49:10 +02:00
* Apps Phase 1: docs, examples, app-only tool filtering, Rx() migration * Clarify architecture page is Prefab-specific * Fix component reference inaccuracies and DataTable search prop - Charts import: clarify they must come from prefab_ui.components.charts - DataTable: searchable→search (the actual prop name), remove nonexistent table-level sortable prop - Select: remove nonexistent options prop, show SelectOption children - Tabs: default_value→value - Fix search=True in inventory, patterns, datatable examples * Consistent Rx usage across all examples, fix imports * Address review: fix chart imports, Select import, docstring --stdio claims
599 lines
17 KiB
Text
599 lines
17 KiB
Text
---
|
|
title: Component Reference
|
|
sidebarTitle: Components
|
|
description: Quick reference for the most-used Prefab components.
|
|
icon: shapes
|
|
tag: NEW
|
|
---
|
|
|
|
import { VersionBadge } from '/snippets/version-badge.mdx'
|
|
|
|
<VersionBadge version="3.1.0" />
|
|
|
|
This page is a scannable reference for the Prefab components you'll use most often in MCP Apps. Each entry shows the component, what it does, a minimal code example, and the props that matter.
|
|
|
|
For the full component library — every prop, variant, and advanced pattern — see the [Prefab component reference](https://prefab.prefect.io/docs/components).
|
|
|
|
<Note>
|
|
All components below are imported from `prefab_ui.components` unless otherwise noted. Charts must be imported from `prefab_ui.components.charts`.
|
|
</Note>
|
|
|
|
## Layout
|
|
|
|
Layout components control how children are arranged. They all use Python's `with` statement to collect their children.
|
|
|
|
### Column
|
|
|
|
Stacks children vertically. The most common top-level container for an app view.
|
|
|
|
```python
|
|
from prefab_ui.components import Column, Text
|
|
|
|
with Column(gap=4, css_class="p-6") as view:
|
|
Text("First")
|
|
Text("Second")
|
|
```
|
|
|
|
| Prop | Type | Description |
|
|
|------|------|-------------|
|
|
| `gap` | `int` | Space between children (Tailwind units) |
|
|
| `align` | `str` | Cross-axis alignment: `"start"`, `"center"`, `"end"`, `"stretch"` |
|
|
| `justify` | `str` | Main-axis alignment: `"start"`, `"center"`, `"end"`, `"between"` |
|
|
| `css_class` | `str` | Tailwind CSS classes |
|
|
|
|
### Row
|
|
|
|
Arranges children horizontally.
|
|
|
|
```python
|
|
from prefab_ui.components import Row, Badge, Text
|
|
|
|
with Row(gap=2, align="center"):
|
|
Text("Status")
|
|
Badge("Online", variant="success")
|
|
```
|
|
|
|
| Prop | Type | Description |
|
|
|------|------|-------------|
|
|
| `gap` | `int` | Space between children |
|
|
| `align` | `str` | Cross-axis alignment |
|
|
| `justify` | `str` | Main-axis alignment |
|
|
| `wrap` | `bool` | Wrap children to next line |
|
|
|
|
### Grid
|
|
|
|
Lays out children in a CSS grid with a fixed number of columns.
|
|
|
|
```python
|
|
from prefab_ui.components import Grid, Card, CardContent, Text
|
|
|
|
with Grid(columns=3, gap=4):
|
|
for label in ["API", "Cache", "DB"]:
|
|
with Card():
|
|
with CardContent():
|
|
Text(label)
|
|
```
|
|
|
|
| Prop | Type | Description |
|
|
|------|------|-------------|
|
|
| `columns` | `int` | Number of grid columns |
|
|
| `gap` | `int` | Space between cells |
|
|
|
|
### Card / CardContent
|
|
|
|
A bordered container with padding. `Card` provides the outer border and shadow; `CardContent` adds standard inner padding. Cards are commonly used inside grids for dashboard-style layouts.
|
|
|
|
```python
|
|
from prefab_ui.components import Card, CardContent, Text, Badge
|
|
|
|
with Card():
|
|
with CardContent():
|
|
Text("API Gateway")
|
|
Badge("healthy", variant="success")
|
|
```
|
|
|
|
| Prop | Type | Description |
|
|
|------|------|-------------|
|
|
| `css_class` | `str` | Additional Tailwind classes |
|
|
|
|
### Separator
|
|
|
|
Renders a horizontal rule between sections. Takes no required props.
|
|
|
|
```python
|
|
from prefab_ui.components import Column, Heading, Separator, Text
|
|
|
|
with Column(gap=4):
|
|
Heading("Section A")
|
|
Separator()
|
|
Text("Content below the line")
|
|
```
|
|
|
|
## Typography
|
|
|
|
### Heading
|
|
|
|
Renders a heading element. Defaults to `level=2` (an `<h2>`).
|
|
|
|
```python
|
|
from prefab_ui.components import Heading
|
|
|
|
Heading("Dashboard")
|
|
Heading("Subsection", level=3)
|
|
```
|
|
|
|
| Prop | Type | Description |
|
|
|------|------|-------------|
|
|
| `level` | `int` | Heading level: `1`-`4` |
|
|
|
|
### Text
|
|
|
|
General-purpose text element. Accepts reactive expressions (`Rx`) as content so the text can update with state changes.
|
|
|
|
```python
|
|
from prefab_ui.components import Text
|
|
|
|
Text("Hello, world")
|
|
Text("Styled text", css_class="font-medium text-blue-500")
|
|
```
|
|
|
|
| Prop | Type | Description |
|
|
|------|------|-------------|
|
|
| `css_class` | `str` | Tailwind CSS classes |
|
|
|
|
### Muted
|
|
|
|
Renders text in a subdued color. Useful for secondary information like timestamps, metadata, or helper text.
|
|
|
|
```python
|
|
from prefab_ui.components import Muted
|
|
|
|
Muted("Last updated 5 minutes ago")
|
|
```
|
|
|
|
### Badge
|
|
|
|
A small label for status indicators, tags, or categories. Supports color variants to convey meaning at a glance.
|
|
|
|
```python
|
|
from prefab_ui.components import Badge
|
|
|
|
Badge("Active", variant="success")
|
|
Badge("Pending", variant="warning")
|
|
Badge("Failed", variant="destructive")
|
|
```
|
|
|
|
| Prop | Type | Description |
|
|
|------|------|-------------|
|
|
| `variant` | `str` | `"default"`, `"success"`, `"warning"`, `"destructive"`, `"outline"` |
|
|
|
|
## Data
|
|
|
|
### DataTable
|
|
|
|
A fully interactive table with client-side sorting, searching, and pagination. You define columns and pass row data as a list of dicts.
|
|
|
|
```python
|
|
from prefab_ui.components import DataTable, DataTableColumn
|
|
|
|
DataTable(
|
|
columns=[
|
|
DataTableColumn(key="name", header="Name", sortable=True),
|
|
DataTableColumn(key="role", header="Role"),
|
|
],
|
|
rows=[
|
|
{"name": "Alice", "role": "Engineer"},
|
|
{"name": "Bob", "role": "Designer"},
|
|
],
|
|
search=True,
|
|
paginated=True,
|
|
page_size=15,
|
|
)
|
|
```
|
|
|
|
| Prop | Type | Description |
|
|
|------|------|-------------|
|
|
| `columns` | `list[DataTableColumn]` | Column definitions |
|
|
| `rows` | `list[dict]` | Row data |
|
|
| `search` | `bool` | Enable full-text search |
|
|
| `paginated` | `bool` | Enable pagination |
|
|
| `page_size` | `int` | Rows per page (default `10`) |
|
|
|
|
`DataTableColumn` takes `key` (the dict key), `header` (display name), and `sortable` (enable sorting on that column).
|
|
|
|
### BarChart
|
|
|
|
Renders vertical or horizontal bar charts. Each `ChartSeries` maps a key from your data to a colored bar group. Multiple series produce grouped (or stacked) bars.
|
|
|
|
```python
|
|
from prefab_ui.components.charts import BarChart, ChartSeries
|
|
|
|
BarChart(
|
|
data=[
|
|
{"month": "Jan", "revenue": 4200},
|
|
{"month": "Feb", "revenue": 5100},
|
|
],
|
|
series=[ChartSeries(data_key="revenue", label="Revenue")],
|
|
x_axis="month",
|
|
show_legend=True,
|
|
)
|
|
```
|
|
|
|
| Prop | Type | Description |
|
|
|------|------|-------------|
|
|
| `data` | `list[dict]` | Chart data |
|
|
| `series` | `list[ChartSeries]` | Data series to plot |
|
|
| `x_axis` | `str` | Key for the x-axis labels |
|
|
| `stacked` | `bool` | Stack bars instead of grouping |
|
|
| `horizontal` | `bool` | Flip axes for horizontal bars |
|
|
| `show_legend` | `bool` | Display the legend |
|
|
| `height` | `int` | Chart height in pixels |
|
|
|
|
### PieChart
|
|
|
|
Displays proportional data as slices. Set `inner_radius` for a donut chart. Unlike bar/line charts, `PieChart` uses `data_key` for the numeric value and `name_key` for the label — it doesn't use `ChartSeries`.
|
|
|
|
```python
|
|
from prefab_ui.components.charts import PieChart
|
|
|
|
PieChart(
|
|
data=[
|
|
{"category": "Bug", "count": 23},
|
|
{"category": "Feature", "count": 15},
|
|
],
|
|
data_key="count",
|
|
name_key="category",
|
|
inner_radius=60,
|
|
show_legend=True,
|
|
)
|
|
```
|
|
|
|
| Prop | Type | Description |
|
|
|------|------|-------------|
|
|
| `data` | `list[dict]` | Chart data |
|
|
| `data_key` | `str` | Key for the numeric value |
|
|
| `name_key` | `str` | Key for the label |
|
|
| `inner_radius` | `int` | Inner radius for donut charts (0 = full pie) |
|
|
| `show_legend` | `bool` | Display the legend |
|
|
|
|
### LineChart
|
|
|
|
Plots data points connected by lines. Shares the same API as `BarChart` — use `series`, `x_axis`, and optionally `curve` to control interpolation.
|
|
|
|
```python
|
|
from prefab_ui.components.charts import LineChart, ChartSeries
|
|
|
|
LineChart(
|
|
data=[
|
|
{"day": "Mon", "requests": 120},
|
|
{"day": "Tue", "requests": 185},
|
|
],
|
|
series=[ChartSeries(data_key="requests", label="Requests")],
|
|
x_axis="day",
|
|
curve="smooth",
|
|
show_dots=True,
|
|
)
|
|
```
|
|
|
|
| Prop | Type | Description |
|
|
|------|------|-------------|
|
|
| `data` | `list[dict]` | Chart data |
|
|
| `series` | `list[ChartSeries]` | Data series to plot |
|
|
| `x_axis` | `str` | Key for x-axis labels |
|
|
| `curve` | `str` | `"linear"` or `"smooth"` |
|
|
| `show_dots` | `bool` | Show data point markers |
|
|
| `height` | `int` | Chart height in pixels |
|
|
|
|
## Forms
|
|
|
|
Form components collect user input. Each has a `name` prop that determines the key in the submitted data. When used inside a `Form`, their values are gathered automatically on submit.
|
|
|
|
### Input
|
|
|
|
A single-line text field. Set `input_type` to `"email"`, `"password"`, `"number"`, etc. for browser-native validation.
|
|
|
|
```python
|
|
from prefab_ui.components import Input
|
|
|
|
Input(name="email", label="Email", input_type="email", required=True)
|
|
Input(name="search", placeholder="Search...")
|
|
```
|
|
|
|
| Prop | Type | Description |
|
|
|------|------|-------------|
|
|
| `name` | `str` | State/form key |
|
|
| `label` | `str` | Label text |
|
|
| `placeholder` | `str` | Placeholder text |
|
|
| `input_type` | `str` | HTML input type |
|
|
| `required` | `bool` | Mark as required |
|
|
| `disabled` | `bool` | Disable input |
|
|
|
|
### Select
|
|
|
|
A dropdown for choosing from a list of options. Pass a flat list of strings, or structured `SelectOption` objects for custom labels.
|
|
|
|
```python
|
|
from prefab_ui.components import Select, SelectOption
|
|
|
|
with Select(name="priority", label="Priority"):
|
|
SelectOption("Low", value="low")
|
|
SelectOption("Medium", value="medium")
|
|
SelectOption("High", value="high")
|
|
```
|
|
|
|
Options are defined as `SelectOption` children, not as a prop.
|
|
|
|
| Prop | Type | Description |
|
|
|------|------|-------------|
|
|
| `name` | `str` | State/form key |
|
|
| `label` | `str` | Label text |
|
|
| `placeholder` | `str` | Placeholder text |
|
|
|
|
### Textarea
|
|
|
|
A multi-line text area. Works the same as `Input` but renders as a resizable text box.
|
|
|
|
```python
|
|
from prefab_ui.components import Textarea
|
|
|
|
Textarea(name="notes", label="Notes", placeholder="Add details...")
|
|
```
|
|
|
|
| Prop | Type | Description |
|
|
|------|------|-------------|
|
|
| `name` | `str` | State/form key |
|
|
| `label` | `str` | Label text |
|
|
| `placeholder` | `str` | Placeholder text |
|
|
| `rows` | `int` | Visible height in rows |
|
|
|
|
### Checkbox
|
|
|
|
A boolean toggle rendered as a checkbox. Binds to state as `True`/`False`.
|
|
|
|
```python
|
|
from prefab_ui.components import Checkbox
|
|
|
|
Checkbox(name="agree", label="I agree to the terms")
|
|
```
|
|
|
|
| Prop | Type | Description |
|
|
|------|------|-------------|
|
|
| `name` | `str` | State/form key |
|
|
| `label` | `str` | Label text |
|
|
|
|
### Switch
|
|
|
|
A toggle switch. Functionally identical to `Checkbox` but rendered as a sliding toggle, better suited for settings and feature flags.
|
|
|
|
```python
|
|
from prefab_ui.components import Switch
|
|
|
|
Switch(name="dark_mode", label="Dark Mode")
|
|
```
|
|
|
|
| Prop | Type | Description |
|
|
|------|------|-------------|
|
|
| `name` | `str` | State/form key |
|
|
| `label` | `str` | Label text |
|
|
|
|
### Slider
|
|
|
|
A range input for numeric values. The user drags a handle between `min` and `max`.
|
|
|
|
```python
|
|
from prefab_ui.components import Slider
|
|
|
|
Slider(name="volume", label="Volume", min=0, max=100, step=1)
|
|
```
|
|
|
|
| Prop | Type | Description |
|
|
|------|------|-------------|
|
|
| `name` | `str` | State/form key |
|
|
| `label` | `str` | Label text |
|
|
| `min` | `float` | Minimum value |
|
|
| `max` | `float` | Maximum value |
|
|
| `step` | `float` | Step increment |
|
|
|
|
### Form
|
|
|
|
Wraps input components and gathers their values on submit. Attach a `CallTool` action to `on_submit` to send the data to the server. Every named input inside the form becomes a key in the arguments dict.
|
|
|
|
```python
|
|
from prefab_ui.components import Form, Input, Button
|
|
from prefab_ui.actions.mcp import CallTool
|
|
|
|
with Form(on_submit=CallTool("save_contact")):
|
|
Input(name="name", label="Name", required=True)
|
|
Input(name="email", label="Email", required=True)
|
|
Button("Save")
|
|
```
|
|
|
|
| Prop | Type | Description |
|
|
|------|------|-------------|
|
|
| `on_submit` | `Action` | Action to run when the form is submitted |
|
|
|
|
### Button
|
|
|
|
A clickable button. Inside a `Form`, a button triggers form submission by default. Outside a form, attach actions to `on_click`.
|
|
|
|
```python
|
|
from prefab_ui.components import Button
|
|
from prefab_ui.actions import SetState
|
|
|
|
Button("Reset", on_click=SetState("count", 0))
|
|
```
|
|
|
|
| Prop | Type | Description |
|
|
|------|------|-------------|
|
|
| `variant` | `str` | `"default"`, `"outline"`, `"ghost"`, `"destructive"` |
|
|
| `on_click` | `Action` | Action to run on click |
|
|
| `disabled` | `bool` | Disable the button |
|
|
|
|
## Containers
|
|
|
|
### Tabs / Tab
|
|
|
|
Organizes content into switchable panels. Each `Tab` becomes a panel with a label in the tab bar. Switching tabs is instant — all panels are rendered, only one is visible.
|
|
|
|
```python
|
|
from prefab_ui.components import Tabs, Tab, Text
|
|
|
|
with Tabs():
|
|
with Tab("Overview"):
|
|
Text("Overview content here")
|
|
with Tab("Details"):
|
|
Text("Detail content here")
|
|
```
|
|
|
|
| Prop (Tabs) | Type | Description |
|
|
|-------------|------|-------------|
|
|
| `value` | `str` | Label of the initially active tab |
|
|
|
|
### Accordion / AccordionItem
|
|
|
|
Collapsible sections. Each `AccordionItem` has a title that toggles its content open and closed. By default, only one item is open at a time.
|
|
|
|
```python
|
|
from prefab_ui.components import Accordion, AccordionItem, Text
|
|
|
|
with Accordion(multiple=True):
|
|
with AccordionItem("Section A"):
|
|
Text("Content for section A")
|
|
with AccordionItem("Section B"):
|
|
Text("Content for section B")
|
|
```
|
|
|
|
| Prop (Accordion) | Type | Description |
|
|
|------------------|------|-------------|
|
|
| `multiple` | `bool` | Allow multiple items open simultaneously |
|
|
|
|
### Dialog
|
|
|
|
A modal overlay that appears above the page content. Pair it with a trigger (like a `Button`) to open and close it.
|
|
|
|
```python
|
|
from prefab_ui.components import Dialog, Column, Heading, Text
|
|
|
|
with Dialog(title="Confirm Delete"):
|
|
with Column(gap=2):
|
|
Text("Are you sure you want to delete this item?")
|
|
```
|
|
|
|
| Prop | Type | Description |
|
|
|------|------|-------------|
|
|
| `title` | `str` | Dialog title in the header |
|
|
| `description` | `str` | Subtitle below the title |
|
|
|
|
### Pages / Page
|
|
|
|
Multi-page navigation within a single app. `Pages` renders one `Page` at a time, controlled by state. Useful for multi-step workflows and wizards.
|
|
|
|
```python
|
|
from prefab_ui.app import set_initial_state
|
|
from prefab_ui.components import Pages, Page, Text, Button
|
|
from prefab_ui.actions import SetState
|
|
|
|
state = set_initial_state(page="welcome")
|
|
|
|
with Pages(active_page=state.page):
|
|
with Page("welcome"):
|
|
Text("Welcome!")
|
|
Button("Next", on_click=SetState("page", "setup"))
|
|
with Page("setup"):
|
|
Text("Configure your settings")
|
|
```
|
|
|
|
| Prop (Pages) | Type | Description |
|
|
|-------------|------|-------------|
|
|
| `active_page` | `str \| Rx` | The label of the currently visible page |
|
|
|
|
## Control Flow
|
|
|
|
Control flow components conditionally show or iterate over children based on reactive state. They evaluate in the browser, so changes are instant.
|
|
|
|
### If / Elif / Else
|
|
|
|
Conditionally render content based on state values. `If` evaluates an `Rx` expression; `Elif` and `Else` follow the same pattern as Python's branching.
|
|
|
|
```python
|
|
from prefab_ui.app import set_initial_state
|
|
from prefab_ui.components import If, Elif, Else, Text, Select
|
|
|
|
state = set_initial_state(role="viewer")
|
|
|
|
Select(name="role", options=["viewer", "editor", "admin"])
|
|
with If(state.role == "admin"):
|
|
Text("Full access")
|
|
with Elif(state.role == "editor"):
|
|
Text("Edit access")
|
|
with Else():
|
|
Text("Read-only access")
|
|
```
|
|
|
|
### ForEach
|
|
|
|
Iterates over a state array and renders children for each item. The loop variable is an `Rx` proxy scoped to the current item, so `item.name` resolves at render time.
|
|
|
|
```python
|
|
from prefab_ui.components import ForEach, Row, Text, Badge
|
|
|
|
with ForEach("users") as user:
|
|
with Row(gap=2):
|
|
Text(user.name)
|
|
Badge(user.role)
|
|
```
|
|
|
|
| Prop | Type | Description |
|
|
|------|------|-------------|
|
|
| first arg | `str` | The state key containing the array |
|
|
|
|
## Feedback
|
|
|
|
### Alert
|
|
|
|
A callout box for important messages. Supports variants to signal severity.
|
|
|
|
```python
|
|
from prefab_ui.components import Alert
|
|
|
|
Alert(title="Deployment complete", variant="success")
|
|
Alert(
|
|
title="Rate limit approaching",
|
|
description="Current usage is at 85% of your plan limit.",
|
|
variant="warning",
|
|
)
|
|
```
|
|
|
|
| Prop | Type | Description |
|
|
|------|------|-------------|
|
|
| `title` | `str` | Alert heading |
|
|
| `description` | `str` | Body text |
|
|
| `variant` | `str` | `"default"`, `"success"`, `"warning"`, `"destructive"` |
|
|
|
|
### Progress
|
|
|
|
A horizontal progress bar. Pass a `value` between 0 and 100. Supports reactive values so the bar updates as state changes.
|
|
|
|
```python
|
|
from prefab_ui.components import Progress
|
|
|
|
Progress(value=75)
|
|
```
|
|
|
|
| Prop | Type | Description |
|
|
|------|------|-------------|
|
|
| `value` | `int \| Rx` | Progress percentage (0-100) |
|
|
|
|
### Loader
|
|
|
|
A spinning indicator for loading states. Takes no required props — just drop it in and it spins.
|
|
|
|
```python
|
|
from prefab_ui.components import Loader
|
|
|
|
Loader()
|
|
```
|
|
|
|
---
|
|
|
|
For the complete API — including additional components like `Metric`, `Calendar`, `Markdown`, `Embed`, and advanced chart types — see the [Prefab component reference](https://prefab.prefect.io/docs/components).
|