Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

Forms Nodes

Declarative forms with compiler-generated validation, progressive enhancement, and accessible markup. The compiler emits native <form> elements that work without JavaScript, then layers on client-side validation and enhanced submission handling.

FormNode

Top-level form declaration containing fields, validation, and submission configuration.

FieldTypeRequiredDescription
node_idstringyesUnique identifier
namestringnoHuman-readable name
fields[FormField]yesList of form fields
field_groups[FormFieldGroup]noLogical groupings of fields (rendered as fieldset)
cross_validations[CrossFieldValidation]noValidations spanning multiple fields
validation_modeValidationModenoOnSubmit, OnBlur, OnChange, OnBlurThenChange (default)
submissionFormSubmissionyesSubmission handling configuration
initial_values_node_idstringnoDataNode providing initial values (edit forms)
autosaveAutosaveConfignoDraft persistence configuration
semantic_node_idstringnoReference to a SemanticNode

ValidationMode Values

ValueDescription
OnSubmitValidate all fields on submit only
OnBlurValidate each field on blur
OnChangeValidate on every keystroke
OnBlurThenChangeValidate on blur, then on change after first error (default)
{
  "node_id": "contact-form",
  "name": "contact",
  "fields": [
    {
      "name": "email",
      "field_type": "Email",
      "label": "Email address",
      "autocomplete": "Email",
      "validations": [
        { "rule_type": "Required", "message": "Email is required" },
        { "rule_type": "Email", "message": "Enter a valid email" }
      ]
    },
    {
      "name": "message",
      "field_type": "Textarea",
      "label": "Message",
      "validations": [
        { "rule_type": "Required", "message": "Message is required" },
        { "rule_type": "MinLength", "value": "10", "message": "At least 10 characters" }
      ]
    }
  ],
  "validation_mode": "OnBlurThenChange",
  "submission": {
    "action_node_id": "submit-contact",
    "encoding": "Json",
    "progressive": true,
    "success_redirect": "/thank-you"
  }
}

FormField

Individual form field with type, label, validation, and accessibility attributes.

FieldTypeRequiredDescription
namestringyesField identifier (form submission key)
field_typeFormFieldTypenoText (default), Email, Password, Number, Tel, Url, Search, Select, MultiSelect, Checkbox, Radio, Textarea, File, Date, Time, DateTimeLocal, Hidden, Color, Range
labelstringyesVisible label (required for accessibility)
placeholderstringnoPlaceholder text
descriptionstringnoHelp text below the field (aria-describedby)
initial_valuestringnoDefault value
validations[ValidationRule]noClient-side validation rules
async_validations[AsyncValidation]noServer-side async validations
options[SelectOption]noOptions for Select and Radio fields
visible_whenstringnoConditional visibility expression
disabled_whenstringnoConditional disable expression
autocompleteAutocompleteHintnoBrowser autocomplete hint (default Off)
acceptstringnoAccepted MIME types for File fields
max_file_sizeuint32noMax file size in bytes for File fields
multipleboolnoAllow multiple files (default false)
stepfloat32noStep value for Number and Range fields
semantic_node_idstringnoReference to a SemanticNode

AutocompleteHint Values

Off, On, Name, GivenName, FamilyName, Email, Username, NewPassword, CurrentPassword, Tel, StreetAddress, City, State, PostalCode, Country, CreditCardNumber, CreditCardExp, CreditCardCsc

{
  "name": "password",
  "field_type": "Password",
  "label": "Password",
  "autocomplete": "NewPassword",
  "validations": [
    { "rule_type": "Required", "message": "Password is required" },
    { "rule_type": "MinLength", "value": "8", "message": "At least 8 characters" },
    { "rule_type": "Pattern", "value": "[A-Z]", "message": "Must contain an uppercase letter" }
  ]
}

ValidationRule

A single client-side validation constraint applied to a FormField.

FieldTypeRequiredDescription
rule_typeValidationTypenoRequired, MinLength, MaxLength, Pattern, Min, Max, Email, Url, Custom
valuestringnoParameter for the rule (e.g., “8” for MinLength)
messagestringyesError message displayed on validation failure
{ "rule_type": "MaxLength", "value": "500", "message": "Maximum 500 characters" }

FormSubmission

Configures how the form is submitted and what happens on success or failure.

FieldTypeRequiredDescription
action_node_idstringyesActionNode that handles submission
encodingFormEncodingnoUrlEncoded, Multipart, Json (default)
progressiveboolnoWorks without JS via native form action (default true)
success_eventstringnoStateMachine event to fire on success
success_state_machinestringnoTarget StateMachine for success event
success_redirectstringnoRoute to navigate to on success
error_displaystringno“field” (map to fields) or “summary” (error list)

FormFieldGroup

Logical grouping of fields, rendered as <fieldset> with <legend>.

FieldTypeRequiredDescription
labelstringyesGroup label (rendered as legend)
field_names[string]yesField names belonging to this group
descriptionstringnoGroup description

CrossFieldValidation

Validation spanning multiple fields (e.g., password confirmation).

FieldTypeRequiredDescription
field_names[string]yesFields involved in this validation
expressionstringyesExpression that must evaluate to true
messagestringyesError message on failure
target_fieldstringnoWhich field displays the error
{
  "field_names": ["password", "confirm_password"],
  "expression": "password == confirm_password",
  "message": "Passwords must match",
  "target_field": "confirm_password"
}