Create a brick
Create a custom brick
Create your first custom brick and register it in React Bricks.
What you'll build
In this how-to, you'll create your first custom brick.
We'll start with a very simple example: a TextImage brick that, for now, just renders "Hello world".
The goal is to understand the minimum required structure of a brick:
- a React component
- the
types.Bricktype - the
schemaproperty - registration in the exported bricks list
In the next how-to, we'll make this brick visually editable.
Create the folders
Inside your /bricks folder, create a folder for your custom theme (let's call it acme).
For example:
bricks/
acme/Inside that folder, create a folder for the new brick:
bricks/
acme/
TextImage/Inside TextImage, create a TextImage.tsx file:
bricks/
acme/
TextImage/
TextImage.tsxStart from a simple React component
Let's begin with a plain React component:
const TextImage = () => {
return <h1 className="text-3xl font-extrabold">Hello world</h1>
}
export default TextImageThis is just a standard React component. To turn it into a brick, we only need two small changes.
👉 This example uses Tailwind CSS, but React Bricks works with any CSS framework.
Turn it into a brick
First, change its type to types.Brick.
Then add a schema property with at least:
name: the unique name of the bricklabel: the name shown in the visual editor
import { types } from 'react-bricks/rsc'
const TextImage: types.Brick = () => {
return <h2 className="text-3xl font-extrabold">Hello world</h2>
}
TextImage.schema = {
name: 'text-image',
label: 'Text Image',
}
export default TextImageAt this point, TextImage is a valid brick.
👉 This example uses Next.js with the App Router, so we import from react-bricks/rsc. If you're using Astro, import from react-bricks/astro instead.
Register the brick
Now add the brick to your exported bricks list.
In the starter projects, you can find an index file at bricks/index.ts that exports all bricks.
Let's add our new brick inside a new Acme theme:
import { types } from 'react-bricks/rsc'
import HeroUnit from './custom/MyHeroUnit'
import Pokemon from './custom/Pokemon'
import reactBricksUITheme from './react-bricks-ui'
import TextImage from './acme/TextImage/TextImage'
const bricks: types.Theme[] = [
{
themeName: 'Acme',
categories: [
{
categoryName: 'Content',
bricks: [TextImage],
},
],
},
reactBricksUITheme, // React Bricks UI
{
themeName: 'Default',
categories: [
{
categoryName: 'Custom bricks',
bricks: [HeroUnit, Pokemon], // Custom bricks
},
],
},
]
export default bricksUse it in the editor
Once the brick is registered, it becomes available in the visual editor.
To test it:
- create a new page (e.g. "Test")
- click the "+" button to add a new brick
- select the Acme theme
- select the Text Image brick
You should see the brick render Hello world.
You can add multiple instances, but you won't be able to edit the content yet.
That's expected. For now, the brick has no editable props or fields.
What's next
You now have a working custom brick.
In the next how-to, we'll make it visually editable by adding props and schema fields, so editors can change the content directly in the React Bricks editor.