Purpose-built input controls for OTP codes, rich text, ratings, sliders, currency amounts, and handwritten signatures — each with unique behavior and gotchas.


Pin Input Block (OTP)
The Pin Input block collects a fixed-length code — 4 or 6 digits — one cell per character, the classic OTP (one-time password) entry pattern. Five visual variants change how each cell looks: Box, Underline, Circle, Solid Circle, and Check Circle. The last two never show the typed character. A new block is a 6-digit unmasked Box.
Content properties
| Property | Type | Default | Description |
length | 4 | 6 | 6 | How many digit cells the code has. Only 4 and 6 are offered. |
variant | box | underline | circle | solid-circle | check-circle | box | Visual style of each cell. Solid Circle and Check Circle permanently hide the typed character — no masking option needed or available. |
masked | boolean | false | Replaces typed digits with a masking character. Appears only when variant is Box, Underline, or Circle. |
maskingCharacter | ● | ∗ | - | ? | ● (dot) | Symbol shown in place of each digit when masked is on. |
placeholder | string (1 char) | — | Single character shown in every empty cell. Only the first character is used; it repeats across all cells. Appears when variant shows digits. |
Events, Methods & State
| Name | Type | Description |
| On Change | event | Fires on every character typed or removed. Payload: value (the whole code so far). |
| resetPinInput | method | Clears the entered code. resetToDefault param has no effect since there is no default value. |
{{ id.value }} | string | The code entered so far as a plain string — unmasked even when masking is on. |
Note: There is no "complete" event. On Change fires on every character with the full code so far; nothing fires when the last cell is filled. To auto-submit when all digits are entered, add your verify action to the Pin Input's On Change event and set its Only run when condition to {{ pinInput1.value.length }} equals 6 (use 4 for a 4-digit pin).
OTP Form Field
The OTP form field renders the same Pin Input widget inside a Form block. The field type is labeled "Pin Input" in the builder. A key difference from other fields: it has no Default Value and its "Is Optional" toggle is always hidden (the field is treated as optional; use validity conditions to enforce completeness).
Key properties unique to OTP
| Property | Type | Default | Where | Description |
Length | 4 | 6 | 6 | Content → Pin Input options | How many digit boxes. Only 4 and 6 supported. |
Variant | box | underline | circle | solid-circle | check-circle | box | Appearance | Cell style. Solid Circle / Check Circle hide the digit. |
Masked | boolean | false | Appearance | Replace digit with masking character (only for digit-visible variants). |
Warning: No Default Value and no Is Optional toggle. The OTP field always starts empty. To enforce that all digits are filled, add a Validity Condition with a Minimum Length operator set to the code length (4 or 6). This is checked on submit and cannot be replaced with the Is Optional switch.
Rich Text Block
The Rich Text block is a standalone WYSIWYG editor for authoring and displaying formatted content — headings, bold, lists, links, tables, images, colors, and highlights. Its value is an HTML string exposed as {{ id.value }}. Inside a Form, use the Rich Text form field to include it in the submit payload.
Key properties
Property | Type | Default | Description |
|---|---|---|---|
|
| — | Initial content authored in a mini rich-text editor. When bound to a dynamic value, the content re-applies when that value changes — this replaces what the user is typing. |
|
| Enter your text here | Hint text shown while the editor is empty. |
|
| 3 | Minimum editor height in lines before it grows with content. Not shown when Toolbar Variant is Slashed and Variant is Ghost. |
|
| 5 | Maximum height in lines; content scrolls beyond this. If max < min, the cap is silently ignored. Not shown when Toolbar Variant is Slashed and Variant is Ghost. |
| Standard or Slashed | Standard | Shown as Toolbar Variant. Standard shows a fixed formatting bar. Slashed hides it; block commands are typed inline with /. |
| Outlined, Solid or Ghost | Outlined | Visual frame. Ghost is only available with the Slashed toolbar; switching to Standard resets Ghost to Outlined. |
|
| All on | Controls which formatting capabilities (bold, italic, table, link, image, etc.) are available. Turning a tool off removes it from both the toolbar and the editor's keyboard shortcuts. |
|
| — | Makes the content non-editable while it stays visible. There is no separate read-only mode. |
Events, Methods & State
| Name | Type | Description |
| On Change | event | Fires on every edit as the user types or applies formatting — no debounce. Payload: value (current HTML). |
| setValue | method | Replaces all content with value and optionally focuses the editor (autofocus param, on by default). |
| insertValueAtCursor | method | Inserts value at the current cursor position. |
| resetValue | method | With resetToDefault on, restores the configured default. With it off, clears the editor. |
{{ id.value }} | string (HTML) | Current content as an HTML string. Anything that reads this and does not render HTML will see raw tags. |
Warning: Binding Default value to the block's own value causes cursor jumps. If Default value is bound to an expression that echoes {{ richText1.value }}, every keystroke re-applies the content and the cursor drops to the end. Bind Default value to a different source; read what the user typed from {{ id.value }}.
Rating Block
The Rating block shows a row of icons (stars by default) that users click to pick a score from 1 up to a configurable maximum. Decimal values from bound data render as partially filled icons. Setting Editable to false makes it a read-only display widget.
Properties
| Property | Type | Default | Description |
maxRating | number | 5 | How many icons the scale has. This is the highest score the user can give. |
defaultValue | string (bindable) | 2 | Score on first render. Dynamic value keeps updating the block. Non-numeric text is silently ignored. A dynamic default overwrites the user's rating without firing On Value Change. |
editable | boolean | condition | true | When false, clicks and hover are disabled — the block shows the score as a read-only display. |
icon | icon selection | star | The icon set used for the scale (filled, half-filled, and unfilled variants chosen together). |
ratedColor / unratedColor | color | amber / light grey | Fill colors for selected and unselected portions of the scale. |
Events, Methods & State
| Name | Type | Description |
| On Value Change | event | Fires when the user clicks an icon. Payload: value (number). |
| setValue | method | Sets the score. Empty or non-numeric value clears the rating (resolves to 0). |
{{ id.value }} | number | Current score. A value above maxRating shows capped (all icons filled) but state holds the real number. |
Note: Users can only click whole numbers and cannot click below 1. To offer a "clear rating" affordance, add a button that calls setValue with an empty value.
Rating Form Field
The RATING form field provides the same icon-row picker inside a Form block. Unlike the standalone block, Maximum Rating lives in the Validation section, and the field can be made required via Is Optional.
Property | Section | Default | Description |
|---|---|---|---|
| Content | — | How many icons start filled. Dynamic default re-applies when bound value changes. |
| Validation | 5 | How many icons are shown. Note: in Validation, not Appearance. |
| Validation | true | Turn off to require a rating before submit. |
| Appearance | star | The icon used for each step. Accepts conditional values, so the icon can change based on another value. |
| Appearance | warning / gray | Fill colors for the selected and unselected icons. Both accept conditions, so the fill color can change based on another value, such as the score. |
In a mapped form, Rating offers no extra formatting properties — icon, colors, and max rating cannot come from the data source.
Slider Form Field
The SLIDER form field is a draggable track for picking a number between a minimum and maximum. A Range variant lets the user select a start–end pair together. The Type property formats the displayed value as a number, percent, currency amount, duration, or physical unit.
Properties
Property | Section | Default | Description |
|---|---|---|---|
| Content → Slider options | single | Single — one handle; value is a bare number. Range — two handles; value is an object |
| Content → Slider options | NUMBER | How the selected value is displayed and formatted: Number, Percent, Currency, Duration, or Unit. Each choice exposes its own formatting options (e.g. Unit Type picker for Unit mode). |
| Validation | 0 | Left end of the track. Track bounds live in Validation, not Appearance. |
| Validation | 100 | Right end of the track. |
| Validation | 1 | Increment the handle snaps to. |
| Appearance | true | Shows a text box next to the track so users can type an exact value. Turning it off makes dragging the only entry method. |
| Appearance | false | Shows a label with the selected value. |
| Appearance | Bottom | Where the min and max values appear on the slider: Off, Bottom (under the track) or Sides (at each end). |
Warning: Range variant submits an object, not a number. Reading {{ form.data.sliderKey }} on a Range slider gives { start: ..., end: ... }. Read the ends as {{ form.data.sliderKey.start }} and {{ form.data.sliderKey.end }}. A Single slider returns a bare number.
Note: The default slider min is 0 and max is 100. A slider meant for 0–10 still shows 0–100 until you change Min value and Max value in Validation.
Currency Input Form Field
The CURRENCY_INPUT form field collects a monetary amount together with its currency code in one field. Its value is an object — not a plain number — holding both the currency code and the amount.
Properties
| Property | Default | Description |
Allow currency change | true | Lets users pick a different currency. When off, the selector is display-only. |
Decimal places | — | Maximum digits after the decimal. Amount is rounded to this on commit (when the user leaves the field). |
Pad decimal places | false | Includes trailing zeros to always show the configured number of decimal places. |
Show Comma Separator | false | Displays the amount with comma grouping. INR, BDT, NPR, BTN, and MVR use Indian grouping (10,00,000); all others use Western (1,000,000). |
Dropdown Value Type | Mapped | Where the currency list comes from: Manual (static entries) or Mapped (lookup from the built-in currency list). Default is Mapped, which lists all currencies; switch to Manual to supply your own list. |
Default value | — | Object with currencyCode and optionally amount. Example: {"currencyCode":"USD","amount":1000}. |
Value shape & events
Warning: The value is an object, not a number. {{ form.data.fieldKey }} returns the whole { currencyCode, amount } object. To get just the number, read {{ form.data.fieldKey.amount }}. To get the currency, read {{ form.data.fieldKey.currencyCode }}.
On Change fires when the amount is committed (user leaves the field) or the currency is changed. The form data does not update while the user is typing — mid-type values always see the previous committed amount. On Focus and On Blur also fire on the amount input.
If text that can't parse as a number is left in the field, it is silently replaced with 0 on commit. Clearing the field entirely stores an empty amount but preserves the currencyCode.
Signature Block
The Signature block gives users a drawing pad to sign with a finger, stylus, or mouse. Drawing updates a live preview in state; calling Capture Signature uploads the drawing as an image file. The block has no Content section — everything lives in the Appearance panel.
Appearance properties
| Property | Default | Description |
signatureColor | inverse primary | Ink color of the drawn stroke. |
strokeWidth | 2 | Thickness of the drawn stroke in pixels. |
styles | bg quaternary, 200px height, 100% width | Background color fills the drawing pad. Width, height, min/max, margin, padding, radius all available. |
Events, Methods & State
| Name | Type | Description |
| On Signature Capture | event | Fires after captureSignature finishes uploading. Not fired if the pad is blank or upload fails. |
| captureSignature | method | Uploads the current drawing as an image, stores details in {{ id.uploadedSignature }}, then fires On Signature Capture. Silent no-op if the pad is empty. |
| clearSignature | method | Wipes the pad and clears both signaturePreview and uploadedSignature from state. |
{{ id.signaturePreview }} | string | In-progress drawing as inline image data — updates live while drawing. |
{{ id.uploadedSignature }} | object | Uploaded file details (name, url, type…) — set only after captureSignature completes. |
{{ id.isEmpty }} | boolean | Whether the pad is blank. Starts true. |
Warning: Drawing alone uploads nothing. While the user draws, only signaturePreview and isEmpty update. No file exists until the Capture Signature method runs. Wire it in this order:
Add a button, for example Confirm. In its On Click event, add Trigger Component Method and call the Signature block's Capture Signature method.
The block uploads the drawing, stores the file details in
{{ signature1.uploadedSignature }}, then fires On Signature Capture.Put your save action in the Signature block's On Signature Capture event, not in the button's On Click, so it runs only after the upload completes.
Note: File format differs by platform. Web apps upload the signature as JPEG; native mobile apps upload PNG. Downstream systems that validate file type must accept both.