Learn about the specific components you can use in the app builder here
The Text Input component is the standard single-line form field used for capturing strings, numbers, or simple text data. It is deeply integrated with the App Builder's state management system, allowing for dynamic default values and real-time data binding.
{{system.user.email}}) or URL parameters.pageData object using the configured field_key.hidden to pass context or default values to a form submission without user interaction. In the App Builder, hidden inputs remain visible as placeholders for easier editing.| Prop | Type | Description |
|---|---|---|
field_key | string | Required. The unique key in pageData where this input's value will be stored (e.g., user.first_name). |
inputValue | string | The default value configuration. Supports static text or dynamic expressions like {{system.date.today}}. |
label | string | The visual label displayed above the input. |
placeholder | string | Ghost text shown when the input is empty. |
is_required | boolean | If true, adds an asterisk to the label and enforces validation. |
hidden | boolean | If true, the input is not rendered in the runtime UI but still registers its value in state. |
This component uses Seeding Strategy A. When the component mounts:
pageData[field_key] is currently undefined or null.inputValue expression (e.g., {{params.id}} -> 123).pageData atom.The Rich Text Input component provides a full WYSIWYG (What You See Is What You Get) editing experience using Markdown. It is ideal for long-form content, descriptions, or notes where formatting (bold, lists, headers) is required.
prose container for beautiful typography out of the box.| Prop | Type | Description |
|---|---|---|
field_key | string | Required. The key in pageData to store the markdown string. |
inputValue | string | Initial markdown content. Can include dynamic variables (e.g., # Report for {{record.id}}). |
label | string | Label displayed above the editor area. |
editor_container_class_name | string | CSS classes to control the editor's height, border, and background. |
{ markdown: "..." }) gracefully, ensuring backward compatibility.MdxEditor for a lightweight editing experience that doesn't bloat the bundle size.The Upload File component serves a dual purpose: it can act as a standalone utility for immediate file uploads (with redirection) or as a form input that attaches uploaded file records to the current page's data context. It handles file selection, drag-and-drop, video compression options, and API communication seamlessly.
field_key is set).pageData state, allowing them to be submitted as part of a larger form.| Prop | Type | Description |
|---|---|---|
field_key | string | Optional. If set, switches the component to Input Mode. The uploaded file records (array) will be saved to this key in pageData (e.g., uploaded_files). If omitted, the component defaults to Utility Mode (redirects after upload). |
onUploadComplete | function | Custom callback function triggered after a successful upload. Receives the array of uploaded file objects. |
default_to_public | boolean | Sets the initial state of the "Public File" toggle. Default is false (Private). |
ask_if_public | boolean | If true, shows the toggle allowing users to choose between Public/Private. If false, the toggle is hidden and uses the default. |
attach_only | boolean | Future feature: Restricts uploads to specific file types or attachment modes. |
class_name | string | CSS classes for the outer container. Defaults to a dashed border style. |
useApiHook to POST FormData to the v1/files endpoint.field_key is present, successful uploads trigger an Immer producer that appends the new file records to the existing array at pageData[field_key]. It does not overwrite existing data, allowing users to upload multiple batches of files into the same field.Maps(...)) is suppressed to ensure the user remains on the form to complete their submission.file.type.startsWith('video/')) to dynamically reveal compression options only when relevant.The Button component is the primary mechanism for triggering logic and data operations within an application. While it visually appears simple, it houses a powerful execution engine capable of interacting with system APIs, triggering automations, and handling complex data payloads dynamically.
GET /v1/users) rather than manually typing URL paths.{{pageData}} values into a JSON request body or use {{record.id}} in a URL path parameter.jsonSafe: true). This ensures that dynamic variables resolve correctly within a JSON structure (e.g., resolving undefined variables to null instead of empty strings to prevent syntax errors).| Prop | Type | Description |
|---|---|---|
text | string | The visible label text on the button (e.g., "Submit", "Delete"). |
action_type | string | Determines the execution logic. Currently supports "Valstorm API Request" (triggers system endpoints). Future support planned for "Automation" and "External API". |
valstorm_api_config | object | A configuration object containing the selected method, path, dynamic params map, and the JSON body template. |
class_name | string | CSS classes for styling the button (colors, padding, rounded corners). |
/users/{id}). It looks for dynamic parameters defined in the settings. If a parameter matches a path segment (like {id}), it replaces it. If it does not match a path segment, it is automatically appended as a Query Parameter (e.g., ?search=...).body string is processed by the Expression Parser.JSON.stringify'd automatically.undefined become null.The Phone Input component is a specialized form field designed to capture structured phone number data. It manages three distinct pieces of data—Country Code, Friendly Number (for display), and Extension—and combines them into a single unified object for storage.
country_code, friendly_number, and extension.(555) 123-4567 for better readability.phone_number string (e.g., +15551234567) optimized for backend storage and searching.| Prop | Type | Description |
|---|---|---|
field_key | string | Required. The key in pageData where the phone object will be stored. |
inputValue | string | The default value (e.g., +18005551234). The component parses string defaults into the structured object automatically on mount. |
label | string | The label displayed above the input group. |
is_required | boolean | If true, adds an asterisk to the label. |
hidden | boolean | If true, hides the input group but preserves the data in state. |
This component uses a composite state object stored in pageData:
{ "country_code": "+1", "friendly_number": "(555) 123-4567", "extension": "101", "phone_number": "+15551234567", "data": { "valid": true, "carrier": "..." } }
The Boolean Input component provides a simple toggle switch for binary (True/False) data. It is ideal for "Yes/No" options, settings, or any field that requires a boolean state.
pageData via the Field Key.| Prop | Type | Description |
|---|---|---|
field_key | string | Required. The unique key in pageData where the boolean is stored. |
inputValue | boolean | The default state (true/false). |
label | string | The text displayed next to the switch. |
is_required | boolean | If true, ensures the field is not undefined. |
hidden | boolean | Hides the input while maintaining its state. |
helper_text | string | Additional descriptive text shown below the label. |
The Number Input component is used for capturing numeric data, such as quantities, prices, or counts. It includes built-in browser validation for numeric formats.
type="number".pageData as a numeric type.| Prop | Type | Description |
|---|---|---|
field_key | string | Required. The key in pageData where the number is stored. |
inputValue | string | The default number (as a string or expression). |
label | string | The text displayed above the input. |
placeholder | string | Hint text shown when the input is empty. |
is_required | boolean | Marks the field as mandatory. |
helper_text | string | Extra context shown below the input. |
The Text Area component is designed for multi-line text entry, making it perfect for descriptions, notes, or long-form feedback.
rows property.pageData.| Prop | Type | Description |
|---|---|---|
field_key | string | Required. The key in pageData for the text content. |
rows | number | The number of text lines visible by default (default is 4). |
label | string | The text displayed above the text area. |
placeholder | string | Hint text for the user. |
inputValue | string | Default text to pre-fill the area. |
is_required | boolean | Marks the field as mandatory. |
The Date Input component allows users to select a date using a native browser-based date picker.
pageData.| Prop | Type | Description |
|---|---|---|
field_key | string | Required. The key in pageData for the selected date. |
label | string | The text displayed above the date picker. |
inputValue | string | The starting date value (YYYY-MM-DD). |
is_required | boolean | Ensures a date must be selected. |
helper_text | string | Extra context shown below the input. |
The DateTime Input component provides a field for selecting both a date and a specific time in a single control.
type="datetime-local" for optimized system pickers.pageData with the combined timestamp string.| Prop | Type | Description |
|---|---|---|
field_key | string | Required. The key in pageData for the timestamp. |
label | string | The text displayed above the picker. |
inputValue | string | The starting date and time string. |
is_required | boolean | Ensures the field is completed. |
The Time Input component allows users to select a specific time of day using a native browser-based time picker.
| Prop | Type | Description |
|---|---|---|
field_key | string | Required. The key in pageData for the selected time. |
label | string | The text displayed above the input. |
inputValue | string | The starting time (e.g., "09:00"). |
is_required | boolean | Marks the field as mandatory. |
The Currency Input component is a specialized numeric field for capturing monetary values. It includes a configurable currency symbol prefix.
$, €) to clarify the unit.pageData.| Prop | Type | Description |
|---|---|---|
field_key | string | Required. The key in pageData where the number is stored. |
currency_symbol | string | The prefix shown inside the input (default is $). |
label | string | The text displayed above the input. |
placeholder | string | Hint text shown when the input is empty. |
inputValue | string | The default numeric amount. |
is_required | boolean | Marks the field as mandatory. |
The Percentage Input component is used for capturing percentage values. It automatically includes a % suffix for clarity.
% sign to the input container.15 for 15%) with pageData.| Prop | Type | Description |
|---|---|---|
field_key | string | Required. The key in pageData for the percentage value. |
label | string | The text displayed above the input. |
placeholder | string | Hint text shown when the input is empty. |
inputValue | string | The default percentage amount. |
is_required | boolean | Ensures a value is provided. |
The JSON Input component provides a specialized text area for entering and editing structured JSON data. It includes real-time validation to ensure the data is correctly formatted.
pageData.| Prop | Type | Description |
|---|---|---|
field_key | string | Required. The key in pageData where the parsed object is saved. |
rows | number | The vertical height of the editor area (default is 6). |
label | string | The text displayed above the editor. |
inputValue | string | A starting JSON string (e.g., {}). |
is_required | boolean | Marks the field as mandatory. |
The Color Input component allows users to select a color using both a visual color picker and a manual Hex code entry field.
#9333ea) in pageData.| Prop | Type | Description |
|---|---|---|
field_key | string | Required. The key in pageData for the color string. |
label | string | The text displayed above the picker. |
inputValue | string | The starting color in Hex format (default is #000000). |
is_required | boolean | Ensures a color is selected. |
The Address Input component provides a comprehensive grid of fields for capturing a full mailing address, including city, state, and postal code, in a single structured object.
pageData.| Prop | Type | Description |
|---|---|---|
field_key | string | Required. The key in pageData where the address object is stored. |
label | string | The header text shown above the address section. |
hidden | boolean | Hides the address group from the UI. |
This component manages a structured object in state:
{ "line1": "", "line2": "", "city": "", "state": "", "postal_code": "", "country": "", "additional_info": "" }