Components are the fundamental building blocks of the UI in Flash. They represent reusable visual elements such as Button, Text, Image, Card, etc., which are used to construct layouts and interactive screens.
To use components in Flash, they must go through specific steps: making them configurable (Flash compliant) and then registering them. This process ensures the components can respond to server-driven configuration for styling, data, and behaviour.
A component refers to a standard React (or React Native) component that is static in nature it uses hardcoded props and styles and behaves the same way every time it is rendered.
A configured component is a wrapper around such a component that makes it Flash compatible It can:
Dynamically apply styles from config
Render data passed from config
Attach configurable events and actions
This transformation allows the component to be controlled remotely through the server.
Example:
A configured component is capable of consuming server driven configuration, but it is not yet known to the Flash system until it is explicitly registered.
A registered component is a configured component that has been linked to a unique componentName using the registerComponent() method. Once registered, it becomes available for use in templates created on the Flash dashboard.
In short:
A configured component can read and apply config
A registered component is a configured component that the Flash system can recognize and render dynamically
To create a Flash template in realtime from backend, we need basic building blocks. It is not always possible to create complex templates with only building blocks which has complex ui or stateful logic. So, along with basic building blocks, we also need project specific prebaked components whose ui and logic is written in codebase. Similar to basic building blocks, we register prebaked components and make them available in the dashboard during template creation in realtime.
BaseComponent
Stateless components with no children.
Text
, Image
, Toast
BaseComponentWithChildren
Stateless, layout-like components that support children.
View
, Pressable
PreBakedComponent
Project-specific, complex components with custom logic, no children.
CardComponent
, TeamCard
PreBakedComponentWithChildren
Complex project components that also support nesting/children.
Accordion
, TabLayout
, Modal
These types allow balancing flexibility (basic blocks) with performance and logic encapsulation (prebaked).
Every UI element that is rendered in your app via Flash is described using a JSON object. This schema defines the structure, style, behavior, and children of a component — all of which are interpreted by the Flash renderer on the client side.
Let’s break down each field:
name
string
This must match the registered name of a component (via registerComponent
). Example: "FooterButtonFlash"
components
Component[]
Nested or child components, used by layout-type components like View
, ScrollView
, etc.
styles
Style
Styling config like margin, padding, color, etc., applied to the root of the component.
overrides
Overrides
Style or prop overrides targeted via nativeID
inside the component.
data
PropData
Dynamic props to control content and behavior (text, image source, backend data etc.).
dataId
string
(optional)
Can be used for fetching external data via binding systems.
Render the component registered as FooterButtonFlash
Pass data.text
to it
Style the outer wrapper with padding and background color
Override styles for inner FlashText
using nativeID="footer-button-title"
This is a union of style objects similar to React Native's StyleSheet
.
It supports keys like:
margin
, padding
, flexDirection
→ from ViewStyle
color
, fontSize
, fontWeight
→ from TextStyle
resizeMode
, tintColor
→ from ImageStyle
These styles are applied to the root of the component, unless used in overrides
.
This is the data prop passed to the component.
It's fully dynamic and recursive — it can contain primitives, objects, or arrays.
Used to drive:
Text or image content
Test IDs, flags, booleans, etc.
Props inside data
are typically used inside the component like:
Overrides allow the server to reach deep inside a component and override:
Its props
Its styles
This is possible only if that inner component uses nativeID
.
nativeID
is a identifier that says: “You can target this element with overrides.”
Example Use Case
Imagine a card component that has a title and a subtitle. You want to override the color of the subtitle only in one use case without changing the entire card component.
You can assign nativeID="card-subtitle"
and override it like:
⚠️ If
nativeID
is missing, overrides will have no effect.
To make the component configurable, the component should take configProps
. configProps
is passed as props to the component and has flash data.