UI Schema Widgets
UI Schema Widgets are specialized keywords embedded in your JSON Schema definitions. They instruct the dynamic form renderer in ui-components
to use custom Angular components instead of default HTML input elements.
This allows for rich, opinionated UI controls that go beyond standard form behavior, like sfo-enum-input
, sfo-radio-group
, sfo-date-input
, and more.
How it Works
When the form builder encounters a schema node with a @_ui_widget
(aliased in code as SchemaKeywords.UiWidget), it renders the corresponding Angular component. If no @_ui_widget
is specified, it falls back to traditional input types based on type, format, or enum.
Simplified Logic (Template)
if (schema[SchemaKeywords.UiWidget]) {
renderCustomComponent(schema[SchemaKeywords.UiWidget]);
} else {
renderBasedOnType(schema.type);
}
This lets you override default rendering behavior per field.
Examples
Example 1: Enum Input with Custom Widget
/**
* @title Page breaks
* @description Define the page break options used in the document.
* @_ui_widget sfo-enum-input
* @_nullable true
* @_multiple true
*/
pageBreak?: (PageBreakType | null)[];
This schema field will render using the <sfo-enum-input>
component, which supports multi-select, nullability, and tagging-style UX.
Example 2: Radio Group Selection
"placement": {
"title": "Placement",
"description": "Select where this content belongs in the document.",
"_ui_group": "Structure",
"_ui_widget": "sfo-radio-group",
"enum": ["back", "body", "cover", "front"],
"type": "string",
"examples": [
{ "label": "Cover", "value": "cover", "description": "The cover page, typically unnumbered." },
{ "label": "Front", "value": "front", "description": "Roman numerals, different styling." },
...
]
}
The field will be rendered using <sfo-radio-group-input>
, which formats the options into a clean radio-style UI based on the enum.
Supported UI Widgets
Keyword | Component | Description |
---|---|---|
sfo-enum-input |
<sfo-enum-input> |
Dropdown or tag-style multi-select |
sfo-radio-group |
<sfo-radio-group-input> |
Flat radio-style option picker |
sfo-date-input |
<sfo-date-input> |
Date input using Angular Material datepicker |
sfo-rich-text |
<sfo-rich-text-input> |
WYSIWYG-style rich text field |
sfo-textarea |
<sfo-textarea> |
Multiline text box |
sfo-code-editor |
<sfo-code-editor> |
Embedded code editor (e.g. Monaco) |
You can register and extend this list via a custom widget registry.
Tips for Schema Authors
• Use @_ui_widget
when you need richer interactions than default fields provide.
• Combine with other UI hints like @_ui_group
, @_ui_class
, or @_nullable
for layout and UX control.
• Provide @examples to give dropdowns or autocompletes rich data.