Catalog of SDK builtin command ids, keybindings, and slot ids hosts contribute against.
Generated from packages/sdk/src/registry/builtins/commands.tsx. Regenerate when adding or removing commands.
This catalog enumerates every command the SDK ships with at boot — id, title, default keybinding (if any), menu locations where it appears in builtin menus, and the when predicate that gates visibility. Hosts can layer additional commands, override existing run bodies, or unregister builtins entirely; see host-configuration.md → Extending the editor for the recipes.
Columns:
ph.*; hosts should use their own prefix (acme.*, myapp.*).titleOverride, that wins for that location only.mod+x syntax (mod = ⌘ on macOS, Ctrl on Win/Linux). "—" = no default chord.Stubbed commands (run body is a no-op console.warn) are flagged with (stub). The keybinding dispatcher skips preventDefault() for stubs so existing inline handlers (if any) keep owning the chord during incremental migration. See STILL_STUB_IDS for the current set + per-id TODO notes.
ph.editor.* — editor lifecycle| Id | Title | Keybinding | Menus | When |
|---|---|---|---|---|
ph.editor.insert | Insert | — | topbar | always |
ph.editor.undo | Undo | mod+z | topbar | enablement: canUndo, when: !tiptap.active |
ph.editor.redo | Redo | mod+y, shift+mod+z | topbar | enablement: canRedo, when: !tiptap.active |
ph.editor.save | Save | mod+s | topbar | features.saveButton !== false && !tiptap.active |
ph.editor.togglePreview | Toggle preview | — | topbar | always |
ph.editor.exitPreview | Exit preview | escape | (keybinding only) | mode === "preview" |
ph.editor.clearSelection | Clear selection | escape | (keybinding only) | selection.id != null && !tiptap.active && mode !== "preview" |
ph.editor.openMore | More | — | topbar | always |
ph.editor.openCommandPalette | Command palette | mod+k | (keybinding only; paletteHide) | !isInsideTextEditingSurface |
ph.editor.openBlocksPanel | Browse blocks | — | sidebar/tabs | features.blocksPanel.enabled !== false |
ph.editor.openComponentsPanel | Components | — | sidebar/tabs | always |
ph.editor.openComponentsTab | Open components tab | — | — | always |
ph.editor.closeSidebar | Close sidebar | — | — | when: sidebar open |
ph.canvas.* — viewport / device / zoom| Id | Title | Keybinding | Menus | When |
|---|---|---|---|---|
ph.canvas.setView | Set view | — | — | always |
ph.canvas.toggleDevice | Toggle device | — | — | always |
ph.canvas.toggleResponsive | Toggle responsive | — | — | features.responsivePreview !== false |
ph.canvas.toggleViewMode | Toggle view mode | — | topbar | always |
ph.canvas.toggleGridLines | Toggle grid lines | shift+mod+g | navmenu/view | !tiptap.active |
ph.canvas.toggleBreakpointMarkers | Toggle breakpoint lines | — | navmenu/view | always |
ph.canvas.toggleDeviceGuides | Toggle device guides | — | navmenu/view | always |
ph.canvas.toggleHidden | Toggle hidden | shift+mod+h | navmenu/view | !tiptap.active |
ph.canvas.zoomIn | Zoom in | mod++, mod+= | — | always |
ph.canvas.zoomOut | Zoom out | mod+- | — | always |
ph.canvas.zoomReset | Reset zoom | mod+0 | — | always |
ph.site.* / ph.theme.* / ph.media.* / ph.layers.* / ph.modifiers.* / ph.importExport.*| Id | Title | Keybinding | Menus | When |
|---|---|---|---|---|
ph.site.selectBackground | Select background | — | navmenu/settings | features.directSave === true |
ph.theme.open | Theme | — | navmenu/settings | always |
ph.media.open | Media library | shift+mod+m | navmenu/settings | !tiptap.active |
ph.media.selectAll (stub) | Select all media | mod+a | — | media.modalOpen && !media.selectionMode |
ph.media.deleteSelected (stub) | Delete selected media | backspace, delete | — | media.modalOpen && media.selectedCount > 0 |
ph.layers.popOut | Pop out layers | shift+mod+l | navmenu/view | !tiptap.active |
ph.layers.toggleDock | Toggle layers dock | — | navmenu/view | always |
ph.modifiers.open | Modifiers | shift+mod+o | navmenu/tools | !tiptap.active |
ph.importExport.open | Import / Export | shift+mod+e | navmenu/tools | features.importExport !== false && !tiptap.active |
ph.ui.* — preferences| Id | Title | Keybinding | Menus | When |
|---|---|---|---|---|
ph.ui.toggleSidebarSide | Toggle sidebar side | — | navmenu/preferences | always |
ph.ui.toggleDarkMode | Toggle dark mode | — | navmenu/preferences | features.darkModeSwitcher !== false |
ph.sidebar.* / ph.ai.*| Id | Title | Keybinding | Menus | When |
|---|---|---|---|---|
ph.sidebar.search (stub) | Search sidebar | mod+f | — | `mouseOver === "sidebar" |
ph.ai.openAssistant | AI assistant | — | — | isAiEnabled |
ph.ai.includeTextInChat | Include text in AI chat | — | tiptap/inline/context-menu | tiptap.active && isAiEnabled |
ph.node.* — node-scoped actions| Id | Title | Keybinding | Menus | When |
|---|---|---|---|---|
ph.node.delete | Delete | backspace, delete | canvas/context | selection.id && selection.id !== ROOT && selection.canDelete && !tiptap.active |
ph.node.duplicate | Duplicate | mod+d | canvas/context | selection.id && selection.canDelete (proxy for has-parent) |
ph.node.copy | Copy | mod+c | canvas/context | selection.id && !ROOT |
ph.node.paste | Paste | mod+v | canvas/context | clipboard.hasNode && selection.id |
ph.node.copyClasses | Copy classes | — | canvas/context | selection.id |
ph.node.pasteClasses | Paste classes | — | canvas/context | clipboard.hasClasses && selection.id |
ph.node.selectParent | Select parent | — | canvas/context | parent.id |
ph.node.selectPage | Select page | — | — | hasPageIsolation |
ph.node.selectAncestor | Select ancestor | — | node/breadcrumb (data-driven rows) | breadcrumbLength > 1 |
ph.node.deselect | Deselect | — | canvas/context | selection.id != null |
ph.node.moveUp | Move up | — | canvas/context | selection.id && parent.id && siblingMove.canMoveUp |
ph.node.moveDown | Move down | — | canvas/context | selection.id && parent.id && siblingMove.canMoveDown |
ph.node.isolate | Isolate component | — | canvas/chip | selection.type === "component" && !disableIsolate |
ph.node.renameDisplayName | Rename | — | node/breadcrumb (rename trigger) | selection.id |
ph.node.addBlockAbove | Add block above | — | canvas/context | selection.id |
ph.node.addBlockBelow | Add block below | — | canvas/context | selection.id |
ph.node.addEmptySection | Add empty section | — | canvas/context | selection.id |
ph.node.addContainer | Add container | — | canvas/context | selection.id |
ph.node.insertComponent | Insert component | — | canvas/context | selection.id |
ph.node.convertToComponent | Convert to component | — | canvas/context | selection.id, enablement: canMakeSavedComponent |
ph.node.aiContext | Include node in AI chat | — | canvas/context | selection.id && !ROOT && isAiEnabled |
ph.node.cycleNextSibling | Next sibling | tab | (keybinding only) | selection.id && !tiptap.active |
ph.node.cyclePrevSibling | Previous sibling | shift+tab | (keybinding only) | selection.id && !tiptap.active |
ph.text.* — rich-text marks, blocks, panels| Id | Title | Keybinding | Menus | When |
|---|---|---|---|---|
ph.text.bold | Bold | (Tiptap-owned) | tiptap/inline | tiptap.active |
ph.text.italic | Italic | (Tiptap-owned) | tiptap/inline | tiptap.active |
ph.text.underline | Underline | (Tiptap-owned) | tiptap/inline | tiptap.active |
ph.text.toggleStrike | Strikethrough | — | tiptap/inline/more-panel | tiptap.active && richTextMode === "full" |
ph.text.toggleSuperscript | Superscript | — | tiptap/inline/more-panel | tiptap.active && richTextMode === "full" |
ph.text.toggleSubscript | Subscript | — | tiptap/inline/more-panel | tiptap.active && richTextMode === "full" |
ph.text.setBlockType | Set block type | — | — | tiptap.active && richTextMode === "full" |
ph.text.setFontFamily | Set font family | — | — | tiptap.active |
ph.text.setFontSize | Set font size | — | — | tiptap.active |
ph.text.applyTypographyPreset | Apply typography preset | — | — | tiptap.active |
ph.text.setAlign | Align text | — | tiptap/inline/more-panel (left/center/right) | tiptap.active && richTextMode === "full" |
ph.text.toggleBulletList | Bullet list | — | tiptap/inline/more-panel | tiptap.active && richTextMode === "full" |
ph.text.toggleOrderedList | Numbered list | — | tiptap/inline/more-panel | tiptap.active && richTextMode === "full" |
ph.text.indentListItem | Indent list item | — | tiptap/inline/more-panel | tiptap.active && in-list |
ph.text.outdentListItem | Outdent list item | — | tiptap/inline/more-panel | tiptap.active && in-list |
ph.text.openLinkPanel | Open link panel | — | tiptap/inline | tiptap.active |
ph.text.setLink | Set link | — | — | tiptap.active |
ph.text.unsetLink | Unset link | — | — | tiptap.active && isActive("link") |
ph.text.openFontPanel | Open font panel | — | tiptap/inline | tiptap.active |
ph.text.openTextColorPanel | Open text color panel | — | tiptap/inline | tiptap.active |
ph.text.openHighlightPanel | Open highlight panel | — | tiptap/inline | tiptap.active |
ph.text.openMorePanel | Open more panel | — | tiptap/inline | tiptap.active && richTextMode === "full" |
ph.text.setColor | Set text color | — | — | tiptap.active |
ph.text.unsetColor | Unset text color | — | — | tiptap.active |
ph.text.setHighlight | Set highlight | — | — | tiptap.active |
ph.text.unsetHighlight | Unset highlight | — | — | tiptap.active && isActive("highlight") |
ph.text.insertImage | Insert image | — | tiptap/inline/more-panel | tiptap.active && richTextMode === "full" |
ph.text.insertHorizontalRule | Insert horizontal rule | — | tiptap/inline/more-panel | tiptap.active && richTextMode === "full" |
ph.text.clearFormatting | Clear formatting | — | tiptap/inline/more-panel | tiptap.active |
ph.text.openVariablePicker | Insert variable | — | tiptap/inline/context-menu | tiptap.active |
ph.text.insertVariable | Insert variable (parameterized) | — | — | tiptap.active |
ph.text.closeActivePanel | Close active panel | — | — | tiptap.activePanel != null |
| Id | Title | Keybinding | Menus | When |
|---|---|---|---|---|
ph.overlay.dismissTop (stub) | Close | escape | — | overlay.stackDepth > 0 |
ph.annotation.delete (stub) | Delete annotation | backspace, delete | — | annotation.selectedId && !annotation.editingId && !tiptap.active |
ph.sections.toggleQuickLook (stub) | Toggle section quick look | space | — | sections.modalOpen && sections.hoveredBlock != null |
ph.component.createReusable | Save as reusable component | — | — | always |