RichTextExt
The RichTextExt component is an extensible version of the RichText component.
Unlike the normal RichTextExt, it uses a plugins system: it allows you to replace any part of a default plugin (not just the render function, but also the button icon, label, shortkey etc.) and to add a completely new plugin.
Note: for most use cases you should use the normal
RichText, which is easier to use.
Properties
Here's the Typescript interface for the props of the RichTextExt component:
interface RichTextProps {
  renderBlock: (props: RenderElementProps) => JSX.Element
  propName: string
  placeholder: string
  multiline?: boolean
  plugins?: types.RichTextPlugin[]
}
Properties definition
| Property | Definition | 
|---|---|
| renderBlock | A React functional component used to render each paragraph of text. | 
| propName | The prop of the Brick component corresponding to this text. | 
| placeholder | The placeholder to show when the text is empty. | 
| multiline | Default: true. If set tofalseit prevents multiline text. | 
| plugins | An array of plugins extending the rich text functionality. | 
Change or create a plugin
The RichTextExt component allows you to change any part of an existing RichText plugin or provide your own plugins.
Let's see the interface of a RichText plugin:
interface RichTextPlugin {
  type: 'Mark' | 'Block' | 'List'
  name: string
  isInline?: boolean
  itemName?: string
  label: string
  hotKey?: string
  renderElement?: (props: RenderElementProps) => JSX.Element
  renderItemElement?: (props: RenderElementProps) => JSX.Element
  renderLeaf?: (props: RenderLeafProps) => JSX.Element
  toggle: (editor: Editor, plugins: RichTextPlugin[]) => void
  button?: {
    icon: React.ReactElement
    isActive: (editor: Editor) => boolean
  }
  enhanceEditor?: (editor: Editor) => Editor
}
React Bricks underneath uses Slate as a rich text editor.
The RenderElementProps and RenderLeafProps are types from Slate. See Slate rendering docs
Plugin properties
| Plugin | Definition | 
|---|---|
| type | A plugin can be of type "Mark" (a style like bold), "Block" (for example an heading) or "List" (for a list of items, like UL). | 
| name | Name of the plugin. | 
| isInline? | Is the element inline? For example for links. | 
| itemName? | Name of the items element in case of a list | 
| label | Displayed when you hover the button | 
| hotKey? | Hot key (shortcut) to apply this marker or block type | 
| renderElement? | The render function for a block plugin. The main arguments to be aware of are children(the actual text content),attributes(that must be spread on the top-level DOM element) andelementwhich is an object whosetypeis the name of the plugin | 
| renderItemElement? | The render function for a single item of a list (think of a lielement). | 
| renderLeaf? | The render function for a mark plugin (like bold or italic). The argument are children,attributes(see above) andleaf. Leaf is an object with truthy keys for applied markers (if (leaf.bold) {...}) | 
| toggle | Function to toggle the marker or block on the editor | 
| button | Customize the default button for a plugin or configure the button for a new plugin, providing the icon(aReactElement) and aisActivefunction | 
| enhanceEditor | Function to enhance the Slate editor. You return an enhanced editor. Please, refer to Slate documentation. This is a very powerful option to customize the React Bricks RichText behavior. | 
Usage example
import { RichTextExt as RichText, plugins } from 'react-bricks/frontend'
const { bold, italic, unorderedList, link, quote } = plugins
return (
  <RichText
    renderBlock={(props: any) => (
      <p
        className={classNames(
          'text-lg sm:text-xl text-center leading-7 sm:leading-8',
          textColor
        )}
        {...props.attributes}
      >
        {props.children}
      </p>
    )}
    placeholder="Type a text..."
    propName="text"
    plugins={[
      bold,
      italic,
      unorderedList,
      link,
      {
        ...quote,
        renderElement: ({ children }) => (
          <div className="border-l-4 pl-4 border-pink-500 text-pink-500 text-xl">
            {children}
          </div>
        ),
        hotKey: 'mod+opt+q',
      },
    ]}
  />
)
Plugins helpers
For typical mark (bold, italic, highlight...) or block (heading, quote, etc.) plugins, React Bricks provides helpers that allow you to create a new plugin very quickly.