Skip to content

The Rendering Engine

System that controls how each component type is rendered — the "bridge" between React/Vue components and presentation logic.

Renderer

Renderer System decides which wrapper to use for each component type:

What Renderers Are:

Renderer TypeFunctionUsed ForExample
fieldRenders form fieldsInputText, Select, etc.Binds to form adapter, passes props
buttonRenders buttonsSubmitButtonButton behavior
containerRenders form containersFormGroup, SectionOrganizes layout
contentRenders static contentTitles, labelsSimple display
menu-itemRenders menu itemsMenuLink, MenuButtonNavigation (when MenuFactory is used)
menu-containerRenders menu containersMenuContainerMenu hierarchy
addonRenders addonsAdd-on UISupplementary content

How They Work:

Component → Renderer → DOM

text
InputText Component → FieldRenderer → <input> + form binding + props

Renderer Adds:

  • Form adapter binding (e.g. value, onChange from Schepta form context)
  • Context injection (form values, external context)
  • Type-specific props transformation

Result: Components focus on UI, Renderers focus on presentation logic!

Renderer Types

Field Renderer - Form Fields:

ResponsibilityImplementationBenefit
Form integrationForm adapter (e.g. useScheptaFormAdapter in React)Value and onChange bound to form state
PropsReceives name, component, componentPropsConsistent field rendering
Custom renderersOverride via renderers.fieldUse with React Hook Form, Formik, etc.

Container Renderer - Layout and Organization:

ResponsibilityImplementationBenefit
Child orderingx-ui.order sortingAutomatic layout
Props filteringRemove container propsClean props
Section managementGroup related itemsVisual organization

Content and Button Renderers:

  • content: Static content (titles, text). Minimal processing.
  • button: Button components (e.g. SubmitButton). Type button in component spec.

How the System Works

Resolution Pipeline:

Schema JSON

Detect Type (component spec type: field, container, button, content, ...)

Choose Renderer (Default → ScheptaProvider renderers → Factory renderers)

Prepare Props (Merge + context)

Apply Middleware (e.g. template expressions)

Render (Renderer wraps component)

Final React/Vue Element

Resolution Hierarchy:

How the system chooses which renderer to use:

PrioritySourceWhen to UseExample
1st - DefaultFactory built-inDefault behaviorDefaultFieldRenderer for type field
2nd - GlobalScheptaProviderApplication default<ScheptaProvider renderers={{ field: AppFieldRenderer }} />
3rd - LocalFactory propsPer-factory override<FormFactory renderers={{ field: CustomField }} />

There is no separate "registerRenderer" API; renderers come from factory defaults, then Provider renderers, then factory renderers prop.

Why Renderers Exist

Separation of concerns:

  • Components define the UI (input, button, container).
  • Renderers wrap them with form binding, layout, or other behavior. The default field renderer uses the Schepta form adapter so fields work without a specific form library; you can replace it with a custom renderer that uses React Hook Form or Formik.

Renderers are the "engine" that connects other concepts: