Plugins
Quill Next is built with a plugin system that allows you to extend the editor's functionality.
You can place the plugins as the children of the QuillEditor
component.
<QuillEditor> {/* Your plugins */}</QuillEditor>
For example, you can use the NotionToolbarPlugin
to add a toolbar to the editor.
Quill Next provides a suite of utilities to help you create your own plugins, and also offers a set of
built-in plugins for learning and understanding the hooks. These built-in plugins are styled after Notion and
are located under the quill-next-react/notion-like
namespace.
You are free to ignore them and build your plugins entirely from scratch.
How to create a plugin
The principle of the plugin system is to leverage the power of React.
A plugin is a React component as the children of the QuillEditor
component.
The plugin can render elements, or only provide some hooks to extend the editor's behavior.
const MyPlugin = () => { return <div>My Plugin</div>}
<QuillEditor> <MyPlugin /></QuillEditor>
Use hooks to extend the editor's behavior
You can use the hooks provided by the quill-next-react
package to extend the editor's behavior.
Example: Notion-like Toolbar
The implementation of the Notion-like toolbar is very simple.
It uses the ToolbarPlugin
and the NotionToolbar
component.
In the implementation of the NotionToolbar
component, we can easily
access the quill instance with the useQuill
hook.
When the style button is clicked, we can use the quill.format
method to
format the text.
interface INotionToolbarProps { formats: Record<string, unknown>; // receive the formats of the selected text}
const DISABLE_FORMATS: string[] = [ "code-block",];
function NotionToolbar(props: INotionToolbarProps) { const quill = useQuill(); // Access the quill instance const { formats } = props;
const disableSet = useMemo(() => { return new Set(DISABLE_FORMATS); }, [DISABLE_FORMATS]);
const isDisabled = Object.keys(formats).some((format) => disableSet.has(format)); if (isDisabled) { return null; }
return ( <div className="qn-notion-toolbar-container" css={notionToolbarContainer}> <NotionToolbarButton onClick={() => quill.format("bold", !formats["bold"])} active={!!formats["bold"]} svg={BoldSvg} /> <NotionToolbarButton onClick={() => quill.format("italic", !formats["italic"])} active={!!formats["italic"]} svg={ItalicSvg} /> <NotionToolbarButton onClick={() => quill.format("underline", !formats["underline"])} active={!!formats["underline"]} svg={UnderlineSvg} /> <NotionToolbarButton onClick={() => quill.format("strike", !formats["strike"])} active={!!formats["strike"]} svg={StrikeSvg} /> </div> )}
function NotionToolbarPlugin(props: INotionToolbarPluginProps) { return <ToolbarPlugin {...props} render={({ formats }) => ( <NotionToolbar formats={formats} /> )} />;}
Demo
Try to select some text and see the toolbar.