Block Schema & Field Types
All field types, configuration options, repeaters, conditional fields, and field groups.
Last updated: March 20, 2026
All Field Types
| Type | Description | Default Value Type |
|---|---|---|
singleLine | Single-line text input | string |
multiLine | Multi-line textarea | string |
richText | WYSIWYG editor (Tiptap) | string (HTML) |
numeric | Number input | number |
boolean | Toggle switch | boolean |
date | Date picker | string (ISO) |
color | Color picker | string (hex) |
slider | Range slider | number |
media | Image/video upload | string (URL) |
link | Internal/external URL | string |
select | Dropdown (single) | string |
multiselect | Multiple choice | string[] |
repeater | Array of objects | Array<object> |
pageSelector | Select workspace pages | PageRef[] |
form | Select workspace form | string |
emailTemplate | Email template picker | string |
emailConfiguration | Email config picker | string |
Field Configuration
Every field supports these base options:
{
type: "singleLine",
label: "Heading",
required?: true,
defaultValue?: "Welcome",
placeholder?: "Enter text",
helpText?: "Main heading",
group?: "Content",
showWhen?: { field: "showTitle", equals: true },
validation?: {
minLength: 3, maxLength: 100,
pattern: "url", // Built-in: "email", "url", "phone", "slug"
message: "Must be valid"
}
}
Select & Multiselect
schema: {
layout: {
type: "select",
label: "Layout",
options: [
{ value: "grid", label: "Grid" },
{ value: "list", label: "List" },
{ value: "carousel", label: "Carousel" }
],
defaultValue: "grid"
},
tags: {
type: "multiselect",
label: "Tags",
options: [
{ value: "featured", label: "Featured" },
{ value: "new", label: "New" }
]
}
}
Repeater (Arrays)
schema: {
features: {
type: "repeater",
label: "Features",
maxItems: 6,
schema: {
icon: { type: "singleLine", label: "Icon Name", defaultValue: "Star" },
title: { type: "singleLine", label: "Title", required: true },
description: { type: "multiLine", label: "Description" }
}
}
}
In your component:
export default function Features({ content }) {
return (
<div className="grid grid-cols-3 gap-6">
{(content.features ?? []).map((f, i) => (
<div key={i}><h3>{f.title}</h3><p>{f.description}</p></div>
))}
</div>
);
}
Conditional Fields (showWhen)
schema: {
showButton: { type: "boolean", label: "Show CTA", defaultValue: true },
buttonText: {
type: "singleLine",
label: "Button Text",
defaultValue: "Learn More",
showWhen: { field: "showButton", equals: true }
},
buttonUrl: {
type: "link",
label: "Button URL",
showWhen: { field: "showButton", equals: true }
}
}
Conditions: equals, notEquals, notEmpty, isEmpty.
Field Groups
Organize fields into collapsible sections:
schema: {
heading: { type: "singleLine", label: "Heading", group: "Content" },
description: { type: "multiLine", label: "Description", group: "Content" },
backgroundColor: { type: "color", label: "Background", group: "Styling" },
padding: { type: "slider", label: "Padding", min: 0, max: 100, group: "Styling" }
}