Preparation
Installation
Let’s install the chameleon core and the react integration package:
npm i @chamaeleon/core @chamaeleon/react-editorAs well as plugins for undo redo operations and persistent state:
npm i @chamaeleon/plugin-history @chamaeleon/plugin-persistCreating an Editor instance
Let’s create an editor instance in the demo.tsx file, and wrap our application in EditorProvider
import { Editor } from '@chamaeleon/core';import { History } from '@chamaeleon/plugin-history';import { Persist } from '@chamaeleon/plugin-persist';import { EditorProvider } from '@chamaeleon/react-editor';
import { SurveyFormPage } from './pages/survey-form/survey-form-page';
const editor = new Editor({  plugins: [Persist(), History()],});
export const Demo = () => {  return (    <EditorProvider value={editor}>      <SurveyFormPage />    </EditorProvider>  );};As you can see, during creation we can expand the capabilities of our editor using plugins, as we did with persist and history
Let’s create a toolbar for undo redo operations and change the editor mode
export function SurveyFormPage() {  const [isViewMode, editor] = useEditorSelector(    ({ editor }) => editor.mode === 'view',  );
  return (    <Container maxWidth="md" sx={{ py: 4 }}>      <Stack spacing={4}>        <Paper sx={{ p: 4 }}>          <Stack direction="row" justifyContent="space-between">            <Typography variant="h5">Survey form</Typography>
            <Box display="flex">              <FormControlLabel                control={                  <Switch                    value={isViewMode}                    onChange={(_, checked) => {                      editor.changeMode(checked ? 'view' : 'editor');                    }}                  />                }                label={isViewMode ? 'View mode' : 'Editor mode'}              />
              <ButtonGroup variant="outlined">                <Button onClick={editor.commands.undo}>                  <UndoIcon />                </Button>
                <Button onClick={editor.commands.redo}>                  <RedoIcon />                </Button>              </ButtonGroup>            </Box>          </Stack>        </Paper>
        <SurveyForm />      </Stack>    </Container>  );}Next we will need to develop our own plugins that will include the building blocks for the editor; we will consider the decomposition of these blocks in the next article