Documentation Index
Fetch the complete documentation index at: https://docs.superdoc.dev/llms.txt
Use this file to discover all available pages before exploring further.
useSuperDocCommand(id) subscribes one button to one command. The component re-renders when that command flips active or disabled, never on every editor change. ui.commands.get(id)?.execute(payload?) runs the command.
A single button
A row of buttons
Build a static config and map. Each<ToolbarButton> subscribes to its own command, so unrelated state changes don’t re-render the row.
Commands with payloads
Some commands take a value. Pass it toexecute().
What the hook returns
| Field | Type | Meaning |
|---|---|---|
active | boolean | The command is “on” for the current selection (cursor is inside bold text). |
disabled | boolean | The command can’t run right now (no selection, wrong document mode). |
value | unknown | The command’s current value when applicable (font name, size, color). |
source | 'built-in' | 'custom' | Where the command came from. |
useSuperDocCommand returns a fallback { active: false, disabled: true, source: 'built-in' } while the editor is initializing, so your buttons render disabled with no flicker.
Built-in command ids
Common ids you’ll wire to buttons:| Group | Ids |
|---|---|
| Text | bold, italic, underline, strikethrough |
| Inline | link, font-family, font-size, text-color, highlight-color |
| Layout | text-align, line-height, indent-increase, indent-decrease |
| Lists | bullet-list, numbered-list |
| Style | linked-style, clear-formatting, copy-format |
| History | undo, redo |
| Tracked changes | track-changes-accept-selection, track-changes-reject-selection |
| View | ruler, zoom, document-mode |
| Tables | table-insert, table-add-row-before, table-add-row-after, table-delete-row, table-add-column-before, table-add-column-after, table-delete-column, table-merge-cells, table-split-cell, table-delete |
| Insert | image |
PublicToolbarItemId in superdoc/ui is the source of truth. Anything you can pass to createHeadlessToolbar({ commands }) works as a useSuperDocCommand id.
Aggregate snapshots
Need every command in one render pass (e.g. you generate the toolbar from the active context)? Subscribe to the whole toolbar slice.useSuperDocCommand per button when you can. useSuperDocToolbar re-renders on any command change.
Trade-offs
- The hook subscribes per-id. Reusing a button component with different ids is fine: the subscription resets when
idchanges. - Built-in command state is derived from the active editor. If your provider sits above multiple editors, the ids you pass are scoped to whichever editor reported ready last.
- Custom commands you registered with
ui.commands.registerwork with the same hook.

