Skip to main content

Designing the UI schema

This page explains how to design the UI Schema used to control layout, grouping, labels, and behaviors of forms in nullplatform. It works together with your JSON Schema, which defines the data structure and validation rules.

đź’ˇ The UI schema controls how forms look and how users interact with them.

Where the UI Schema fits​

Add a uiSchema object under your specification’s attributes.schema to control layout and behavior.

{
"attributes": {
"schema": {
"type": "object",
"properties": {
"name": { "type": "string" }
},
"uiSchema": {
"type": "VerticalLayout",
"elements": [
{ "type": "Control", "scope": "#/properties/name" }
]
}
}
}
}

UI Schema building blocks​

UI schemas are built from layout and control elements. They don't change your data model. They only affect how fields render in the UI.

TypePurposeExamples
LayoutsStructure and position fieldsVerticalLayout, HorizontalLayout, Group, Categorization
ControlsBind UI elements to JSON Schema fieldsControl, ListWithDetail
DisplayRead-only presentationLabel, chip
RulesDynamic behaviorSHOW, HIDE, APPLY, DISABLE

Scope patterns (JSON Pointer quick reference)​

Use JSON Pointers to bind controls to schema fields.

  • Root property → #/properties/name → data.name
  • Nested → #/properties/address/properties/street → data.address.street
  • Array (inside an item editor) → #/properties/name → data.items[i].name

Example:

{ "type": "Control", "scope": "#/properties/address/properties/zipCode" }

Layout elements​

Use layouts to organize the form. Layouts don't bind data; they arrange other elements.

VerticalLayout​

Stack children vertically.

{ "type": "VerticalLayout", "elements": [ { "type": "Control", "scope": "#/properties/name" } ] }

HorizontalLayout​

Place children in a row (auto‑wraps on small screens).

{ "type": "HorizontalLayout", "elements": [
{ "type": "Control", "scope": "#/properties/firstName" },
{ "type": "Control", "scope": "#/properties/lastName" }
]}

Group​

Group related fields with an optional card and title.

{ "type": "Group", "label": "Credentials", "elements": [
{ "type": "Control", "scope": "#/properties/username" },
{ "type": "Control", "scope": "#/properties/password", "options": { "format": "password" } }
]}

Categorization and Category​

Render content as tabs or as a stepper.

{
"type": "Categorization",
"options": { "variant": "stepper", "showNavButtons": true },
"elements": [
{ "type": "Category", "label": "General", "elements": [
{ "type": "Control", "scope": "#/properties/name" }
]},
{ "type": "Category", "label": "Advanced", "elements": [
{ "type": "Control", "scope": "#/properties/toggles" }
]}
]
}

Controls (bind to schema properties)​

Controls display/edit values defined in your JSON Schema.

Control​

Generic control for any property. Common options: label, focus, trim, hideRequiredAsterisk, showUnfocusedDescription.

{ "type": "Control", "scope": "#/properties/email", "label": "Email" }

String controls​

Text (single/multi‑line)

{ "type": "Control", "scope": "#/properties/description", "options": { "multi": true } }

Password

{ "type": "Control", "scope": "#/properties/secret", "options": { "format": "password" } }

Enum (select / autocomplete)

{ "type": "Control", "scope": "#/properties/country", "options": { "autocomplete": true, "placeholder": "Select a country" } }

Radio group (inline/stacked)

{ "type": "Control", "scope": "#/properties/plan", "options": { "format": "radio", "direction": "vertical" } }

Radio cards

{ "type": "Control", "scope": "#/properties/plan", "options": { "format": "radio-cards" } }

Chip display for values (mapping supported)

{ "type": "Control", "scope": "#/properties/status", "options": {
"format": "chip",
"mapping": {
"active": { "label": "Active", "color": "success", "icon": "ic:outline-check" },
"pending": { "label": "Pending", "color": "warning" }
}
}}

Number / Integer controls​

Numeric input / slider

{ "type": "Control", "scope": "#/properties/threshold" }
{ "type": "Control", "scope": "#/properties/volume", "options": { "valueLabelDisplay": "on" } }

Boolean controls​

Checkbox / Toggle

{ "type": "Control", "scope": "#/properties/maintenanceMode" }
{ "type": "Control", "scope": "#/properties/notifications", "options": { "toggle": true } }

Date / Time controls​

{ "type": "Control", "scope": "#/properties/birthDate", "options": { "dateFormat": "YYYY-MM-DD" } }
{ "type": "Control", "scope": "#/properties/appointmentTime", "options": { "ampm": true } }
{ "type": "Control", "scope": "#/properties/eventDateTime", "options": { "dateTimeFormat": "YYYY-MM-DD HH:mm" } }

anyOf / oneOf controls (select/autocomplete/radio)​

{ "type": "Control", "scope": "#/properties/animal", "options": { "autocomplete": true } }

Arrays and tables​

Arrays can be rendered in different patterns depending on your UX needs.

Array layout (accordion with per‑item editors)​

{ "type": "Control", "scope": "#/properties/contacts", "options": {
"elementLabelProp": "name",
"showArrayLayoutSortButtons": true
}}

Table​

{ "type": "Control", "scope": "#/properties/products", "options": {
"showArrayTableSortButtons": true
}}

List with detail (master‑detail)​

{ "type": "ListWithDetail", "scope": "#/properties/contacts", "options": { "elementLabelProp": "name" } }

Display (read‑only) patterns​

Use display elements to show values without inputs.

{ "type": "Control", "scope": "#/properties/apiKey", "options": { "direction": "row", "icon": "key" } }

Supported displays: text, link (URL), number, boolean, array/object summaries, and oneOf read‑only labels.


Rules (conditional UI)​

Rules let you show/hide or enable/disable elements. With the extended APPLY effect, you can patch labels/options dynamically.

{
"type": "Control",
"scope": "#/properties/ssn",
"rule": {
"effect": "SHOW",
"condition": { "scope": "#/properties/country", "schema": { "const": "USA" } }
}
}

👉 For complex behavior, see Advanced UI Schema.


Common options (quick table)​

OptionTypeUse
showUnfocusedDescriptionbooleanAlways show the description (not only on focus)
hideRequiredAsteriskbooleanHide the * on required labels
trimbooleanFixed width (e.g., text size by maxLength)
focusbooleanAutofocus this element on mount
elementLabelPropstringProperty used as item label in arrays
disableAdd / disableRemovebooleanDisable add/remove in arrays
showArrayLayoutSortButtonsbooleanSorting arrows for array layout
showArrayTableSortButtonsbooleanSorting arrows for array table
variantstringstepper for Categorization; filled/outlined for chips
ampm, views, dateFormat, timeFormatvariousDate/time formats and views