Files
tiptap/docs/src/docPages/guide/toolbar.md
2020-12-04 13:41:05 +01:00

73 lines
3.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Create a toolbar
## toc
## Introduction
tiptap comes very raw, but thats a good thing. You have full control (and when we say full, we mean full) about the appearance of it. That also means you have to build the editor toolbar on your own. Dont worry though, you can start with a few buttons and we help you with everything else.
## Commands
Lets assume youve got the editor running already and you want to add your first button. Youll need a `<button>` HTML tag, and add a click handler. Depending on your setup, that can look like the following Vue.js example:
```html
<button @click="editor.chain().toggleBold().focus().run()">
Bold
</button>
```
Oh, thats a long command, right? Actually, its a [chain of commands](/api/commands#chain-commands), so lets go through this one by one:
```js
editor.chain().toggleBold().focus().run()
```
1. `editor` should be a tiptap instance,
2. `chain()` is used to tell the editor you want to execute multiple commands,
3. `toggleBold()` marks selected text bold, or removes the bold mark from the text selection if its already applied,
4. `focus()` sets the focus back to the editor and
5. `run()` will execute the chain.
In other words: This will be the typical **Bold** button for your text editor.
Which commands are available depends on what extensions youve registered with the editor. Most of the extensions come with a `set…()`, `unset…()` and `toggle…()` command. Read the extension documentation to see whats actually available or just surf through your code editors autocomplete.
## Keep the focus
Youve seen the `focus()` command in the above example already. When you click on the button, the browser focuses that DOM element and the editor loses focus. Its likely you want to add `focus()` to all your toolbar buttons, so the writing flow of your users isnt interrupted.
## The active state
The editor provides an `isActive()` method to check if something is applied to the selected text already. In Vue.js you can toggle a CSS class with help of that function like that:
```html
<button :class="{ 'is-active': editor.isActive('bold') }" @click="editor.chain().toggleBold().focus().run()">
Bold
</button>
```
This toggles the `.is-active` class accordingly. This works for nodes, and marks. You can even check for specific attributes, here is an example with the [`Highlight`](/api/marks/highlight) mark, that ignores different attributes:
```js
editor.isActive('highlight')
```
And an example that compares the given attribute(s):
```js
editor.isActive('highlight', { color: '#ffa8a8' })
```
You can even ignore nodes and marks, but check for the attributes only. Here is an example with the [`TextAlign`](/api/extensions/text-align) extension:
```js
editor.isActive({ textAlign: 'right' })
```
If your selection spans multiple nodes or marks, or only part of the selection has a mark, `isActive()` will return `false` and indicate nothing is active. That is how it is supposed to be, because it allows people to apply a new node or mark to that selection right-away.
## Icons
Most editor toolbars use icons for their buttons. In some of our demos, we use the open source icon set [Remix Icon](https://remixicon.com/), thats free to use. But its totally up to you what you use. Here are a few icon sets you can consider:
* [Remix Icon](https://remixicon.com/#editor)
* [Font Awesome](https://fontawesome.com/icons?c=editors)
* [UI icons](https://www.ibm.com/design/language/iconography/ui-icons/library/)
Also, were working on providing a configurable interface for tiptap. If you think thats a great idea, [become a sponsor](/sponsor) to show us your support. 💖