Text Editor React Component

Text Editor React component represents Text Editor component.

Text Editor Components

There are following components included:

Text Editor Properties

PropTypeDefaultDescription
<TextEditor> properties
valuestring

Text editor initial html content value.

placeholderstringEditor placeholder content displayed when it is empty. By default it is not specified
resizablebooleanfalseMakes editor resizable (when its height will fit to its content)
modestringtoolbar

Text editor buttons mode. Can be:

  • toolbar - it will add toolbar with editor buttons in text editor container element
  • popover - it will show popover bubble with editor buttons on top of the selected text in editor
  • keyboard-toolbar - toolbar with editor buttons will appear on top of virtual keyboard when editor is in the focus. It is supported only in iOS, Android cordova apps and in Android Chrome. When not supported it will fallback to popover mode.
buttonsarray

Array with editor buttons, or array of arrays (groups) with editor buttons. By default all buttons enabled and its default value is:

[
  ['bold', 'italic', 'underline', 'strikeThrough'],
  ['orderedList', 'unorderedList'],
  ['link', 'image'],
  ['paragraph', 'h1', 'h2', 'h3'],
  ['alignLeft', 'alignCenter', 'alignRight', 'alignJustify'],
  ['subscript', 'superscript'],
  ['indent', 'outdent'],
]
dividersbooleantrueAdds visual divider between buttons group
imageUrlTextstringInsert image URLPrompt text that appears on image url request
linkUrlTextstringInsert link URLPrompt text that appears on link url request
clearFormattingOnPastebooleantrueWhen enabled it will clear any formatting on paste from clipboard
customButtonsobject

Object with custom buttons. Object property key is the button id that should be used in buttons to enable it.

For example to specify custom button that will add <hr> we can use following declaration:

<TextEditor
  customButtons={{
    // property key is the button id
    hr: {
      // button html content
      content: '&lt;hr&gt;',
      // button click handler
      onClick(event, buttonEl) {
        document.execCommand('insertHorizontalRule', false);
      }
    }
  }}
  {/* now we use custom button id "hr" to add it to buttons */}
  buttons={['bold', 'italic', 'hr']}
/>
`

Text Editor Events

EventArgumentsDescription
<TextEditor> events
textEditorChange(value)Event will be triggered when editor value has been changed
textEditorInputEvent will be triggered on editor's content "input" event
textEditorFocusEvent will be triggered on editor's content focus
textEditorBlurEvent will be triggered on editor's content blur
textEditorButtonClick(buttonId)Event will be triggered on editor button click
textEditorKeyboardOpenEvent will be triggered when editor keyboard toolbar appears
textEditorKeyboardCloseEvent will be triggered when editor keyboard toolbar disappears
textEditorPopoverOpenEvent will be triggered on editor popover open
textEditorPopoverCloseEvent will be triggered on editor popover close
textEditorBeforeDestroyEvent will be triggered right before Text Editor instance will be destroyed

Examples

text-editor.jsx
import React, { useState } from 'react';
import {
  Page,
  Navbar,
  BlockTitle,
  BlockHeader,
  Block,
  TextEditor,
  List,
  ListInput,
} from 'framework7-react';

export default () => {
  const customButtons = {
    hr: {
      content: '<hr>',
      onClick() {
        document.execCommand('insertHorizontalRule', false);
      },
    },
  };

  const [customValue, setCustomValue] =
    useState(`<p>Lorem, ipsum dolor sit amet consectetur adipisicing elit. Consequatur sunt, sapiente quis eligendi consectetur hic asperiores assumenda quidem dolore quasi iusto tenetur commodi qui ullam sint sed alias! Consequatur, dolor!</p>
  <p>Provident reiciendis exercitationem reprehenderit amet repellat laborum, sequi id quam quis quo quos facere veniam ad libero dolorum animi. Nobis, illum culpa explicabo dolorem vitae ut dolor at reprehenderit magnam?</p>
  <p>Qui, animi. Dolores dicta, nobis aut expedita enim eum assumenda modi, blanditiis voluptatibus excepturi non pariatur. Facilis fugit facere sequi molestias nemo in, suscipit inventore consequuntur, repellat perferendis, voluptas odit.</p>
  <p>Tempora voluptates, doloribus architecto eligendi numquam facilis perspiciatis autem quam voluptas maxime ratione harum laudantium cum deleniti. In, alias deserunt voluptatibus eligendi libero nobis est unde et perspiciatis cumque voluptatum.</p>
  <p>Quam error doloribus qui laboriosam eligendi. Aspernatur quam pariatur perspiciatis reprehenderit atque dicta culpa, aut rem? Assumenda, quibusdam? Reprehenderit necessitatibus facere nemo iure maiores porro voluptates accusamus quibusdam. Nesciunt, assumenda?</p>`);

  const [listEditorValue, setListEditorValue] = useState('');

  return (
    <Page>
      <Navbar title="Text Editor"></Navbar>

      <Block>
        <p>
          Framework7 comes with a touch-friendly Rich Text Editor component. It is based on modern
          "contenteditable" API so it should work everywhere as is.
        </p>
        <p>
          It comes with the basic set of formatting features. But its functionality can be easily
          extended and customized to fit any requirements.
        </p>
      </Block>

      <BlockTitle>Default Setup</BlockTitle>
      <TextEditor />

      <BlockTitle>With Placeholder</BlockTitle>
      <TextEditor placeholder="Enter text..." />

      <BlockTitle>With Default Value</BlockTitle>
      <TextEditor
        placeholder="Enter text..."
        value={customValue}
        onTextEditorChange={(value) => setCustomValue(value)}
      />

      <BlockTitle>Specific Buttons</BlockTitle>
      <BlockHeader>It is possible to customize which buttons (commands) to show.</BlockHeader>
      <TextEditor
        placeholder="Enter text..."
        buttons={[
          ['bold', 'italic', 'underline', 'strikeThrough'],
          ['orderedList', 'unorderedList'],
        ]}
      />

      <BlockTitle>Custom Button</BlockTitle>
      <BlockHeader>
        It is possible to create custom editor buttons. Here is the custom "hr" button that adds
        horizontal rule:
      </BlockHeader>
      <TextEditor
        placeholder="Enter text..."
        customButtons={customButtons}
        buttons={[['bold', 'italic', 'underline', 'strikeThrough'], 'hr']}
      />

      <BlockTitle>Resizable</BlockTitle>
      <BlockHeader>Editor will be resized based on its content.</BlockHeader>
      <TextEditor
        placeholder="Enter text..."
        resizable
        buttons={['bold', 'italic', 'underline', 'strikeThrough']}
      />

      <BlockTitle>Popover Mode</BlockTitle>
      <BlockHeader>
        In this mode, there is no toolbar with buttons, but they appear as popover when you select
        any text in editor.
      </BlockHeader>
      <TextEditor
        placeholder="Enter text..."
        mode="popover"
        buttons={['bold', 'italic', 'underline', 'strikeThrough']}
        style={{ '--f7-text-editor-height': '150px' }}
      />

      <BlockTitle>Keyboard Toolbar Mode</BlockTitle>
      <BlockHeader>
        In this mode, toolbar with buttons will appear on top of virtual keyboard when editor is in
        the focus. It is supported only in iOS, Android cordova apps and in Android Chrome. When not
        supported it will fallback to "popover" mode.
      </BlockHeader>
      <TextEditor
        placeholder="Enter text..."
        mode="keyboard-toolbar"
        style={{ '--f7-text-editor-height': '150px' }}
      />

      <BlockTitle>As List Input</BlockTitle>
      <BlockHeader>
        Text editor can be used in list with other inputs. In this example it is enabled with
        "keyboard-toolbar"/"popover" type for "About" field.
      </BlockHeader>
      <List strongIos dividersIos outlineIos>
        <ListInput type="text" label="Name" placeholder="Your name" />
        <ListInput
          type="texteditor"
          label="About"
          placeholder="About"
          resizable
          textEditorParams={{
            mode: 'popover',
            buttons: ['bold', 'italic', 'underline', 'strikeThrough'],
          }}
          value={listEditorValue}
          onTextEditorChange={(value) => setListEditorValue(value)}
        />
      </List>
    </Page>
  );
};