Portal Community

When to Build a Custom Player

ScenarioSolution
Standard data entry formUse FormRenderer — don't build a custom player
One card per section layoutCustom player — CardSectionPlayer pattern
Single-column mobile layoutCustom player — MobilePlayer
Multi-step chat-style formCustom player — ChatPlayer (one field at a time)
Form embedded in a sidebar panelCustom player — CompactPlayer (minimal chrome)
React Native appCustom player using native controls + FormEngine directly

The Three Building Blocks

FormStateProvider

Context provider that owns the FormEngine instance. All hooks and ControlRenderer must be within this provider.

ControlRenderer

Renders a single control by dispatching to the registered component for its type. Takes a FormControl object as its prop.

useAtlasForm

Hook that provides access to values, errors, setFieldValue, submitForm, and the raw FormEngine instance.

Custom Player vs FormRenderer Comparison

FeatureFormRendererCustom Player
Layout controlFixed 12-column gridFully custom
Section renderingAutomatic (from schema)Explicit (you decide which sections appear where)
ValidationBuilt-inMust call submitForm() from the hook — validation runs automatically
Draft auto-saveBuilt-inMust implement manually using StorageManager and useAtlasForm
Theme supportBuilt-inPass ThemeProvider above FormStateProvider
Studio selectableAlways availableRegister with registerFormPlayer()