Pages extension API reference

This page is the canonical reference for the Pages extension's options, commands, and storage. For task-focused walkthroughs, see Page format, Page header and footer, Page gap, Page break node, and Zoom.

Options interface

import type { Extensions, JSONContent } from '@tiptap/core'

type PagesHeaderFooter = string | JSONContent

type BuiltInPageFormat = 'A4' | 'A3' | 'A5' | 'Letter' | 'Legal' | 'Tabloid'

interface CustomPageFormat {
  id: string
  width: number // pixels
  height: number // pixels
  margins: {
    top: number
    right: number
    bottom: number
    left: number
  }
}

type PageFormat = BuiltInPageFormat | CustomPageFormat

interface PagesOptions {
  /** Built-in format name or custom page format object. Default: 'A4'. */
  pageFormat: PageFormat

  /** Initial zoom level. Clamped to [0.25, 4]. Default: 1. */
  zoom?: number

  /** Default header content. Accepts a plain string, an HTML string, or Tiptap JSONContent.
   *  Supports `{page}` and `{total}` placeholders. Default: ''. */
  header: string | JSONContent

  /** Default footer content. Same shape as `header`. Default: ''. */
  footer: string | JSONContent

  /** Distance from the page top to where the header content starts (pixels).
   *  Defaults to 50% of the page top margin. */
  headerTopMargin?: number

  /** Distance from the footer content bottom to the page bottom (pixels).
   *  Defaults to 50% of the page bottom margin. */
  footerBottomMargin?: number

  /** Visual gap between pages (pixels). Default: 50. */
  pageGap?: number

  /** CSS color shown in the area between pages. Default: '#ffffff'. */
  pageGapBackground?: string

  /** Accent color applied to both header and footer editor overlays. Default: '#6366f1'. */
  accentColor?: string

  /** Accent color for the header overlay only. Defaults to the `accentColor` value. */
  headerAccentColor?: string

  /** Accent color for the footer overlay only. Defaults to the `accentColor` value. */
  footerAccentColor?: string

  /** Enable a different header and footer for the first page (Word's "Different First Page").
   *  Default: false. */
  differentFirstPage?: boolean

  /** First-page header content. Default: ''. */
  headerFirstPage?: PagesHeaderFooter

  /** First-page footer content. Default: ''. */
  footerFirstPage?: PagesHeaderFooter

  /** Enable different headers and footers on odd vs. even pages (Word's "Different Odd & Even Pages").
   *  Default: false. */
  differentOddEven?: boolean

  /** Odd-pages header content. Default: ''. */
  headerOdd?: PagesHeaderFooter

  /** Even-pages header content. Default: ''. */
  headerEven?: PagesHeaderFooter

  /** Odd-pages footer content. Default: ''. */
  footerOdd?: PagesHeaderFooter

  /** Even-pages footer content. Default: ''. */
  footerEven?: PagesHeaderFooter

  /** Whether double-clicking the header opens the inline editor overlay.
   *  When false, the overlay cannot be opened by users or by `openHeaderEditor`.
   *  Default: true. */
  editableHeader?: boolean

  /** Whether double-clicking the footer opens the inline editor overlay.
   *  When false, the overlay cannot be opened by users or by `openFooterEditor`.
   *  Default: true. */
  editableFooter?: boolean

  /** Enable a different first-page footer independently of `differentFirstPage`.
   *  Set automatically when `setDifferentFirstPage(true)` is called. */
  differentFirstPageFooter?: boolean

  /** Enable different odd/even footers independently of `differentOddEven`.
   *  Set automatically when `setDifferentOddEven(true)` is called. */
  differentOddEvenFooter?: boolean

  /** Extensions registered on the inner header/footer editors.
   *  Defaults to StarterKit; mirror your main editor's stack to keep schemas aligned. */
  headerFooterExtensions?: Extensions

  /** Called when `setPageFormat()` succeeds, or when configure() applies a new format. */
  onPageFormatChange?: (pageFormat: PageFormat) => void

  /** Called when `setZoom()` changes the zoom level. */
  onZoomChange?: (zoom: number) => void

  /** Optional — return true to keep the active header or footer editor open when the user
   *  double-clicks outside it. Applies to both. */
  onDblClickHeaderFooterPreventClose?: (event: MouseEvent) => boolean

  /** Like `onDblClickHeaderFooterPreventClose`, but only for the header overlay.
   *  Takes priority over the fallback when both are set. */
  onDblClickHeaderPreventClose?: (event: MouseEvent) => boolean

  /** Like `onDblClickHeaderFooterPreventClose`, but only for the footer overlay.
   *  Takes priority over the fallback when both are set. */
  onDblClickFooterPreventClose?: (event: MouseEvent) => boolean

  /** Rename the built-in `{page}` / `{total}` placeholder tokens, or pass
   *  `false` to disable substitution entirely. Default: undefined (use built-ins as-is). */
  placeholders?: false | { page?: string; total?: string }
}

Options reference

Layout

OptionTypeDefaultNotes
pageFormatPageFormat'A4'See Page format for built-ins.
zoomnumber1Clamped to [0.25, 4]. See Zoom.
pageGapnumber50Pixels. Visual only — does not affect export.
pageGapBackgroundstring'#ffffff'Any CSS color value.

Headers and footers

The full reference for header/footer options lives on Page header and footer. The table below summarises the surface; for first-page, odd/even, content types, and editor-overlay behaviour, follow the link.

OptionTypeDefaultDescription
headerPagesHeaderFooter''Default header content
footerPagesHeaderFooter''Default footer content
headerTopMarginnumber50% of top marginDistance from page top to header content (px)
footerBottomMarginnumber50% of bottom marginDistance from footer content to page bottom (px)
differentFirstPagebooleanfalseFirst-page header and footer differ from the rest
headerFirstPagePagesHeaderFooter''First-page header content
footerFirstPagePagesHeaderFooter''First-page footer content
differentOddEvenbooleanfalseOdd/even pages have different headers and footers
headerOddPagesHeaderFooter''Odd-pages header content
headerEvenPagesHeaderFooter''Even-pages header content
footerOddPagesHeaderFooter''Odd-pages footer content
footerEvenPagesHeaderFooter''Even-pages footer content
editableHeaderbooleantrueAllow opening the header overlay on double-click
editableFooterbooleantrueAllow opening the footer overlay on double-click
headerFooterExtensionsExtensionsStarterKitExtensions for the inner header/footer editors
onDblClickHeaderFooterPreventClose(event: MouseEvent) => booleanundefinedPrevent closing on double-click outside (header + footer)
onDblClickHeaderPreventClose(event: MouseEvent) => booleanundefinedPrevent closing on double-click outside (header only)
onDblClickFooterPreventClose(event: MouseEvent) => booleanundefinedPrevent closing on double-click outside (footer only)
accentColorstring'#6366f1'Accent color for both overlays
headerAccentColorstringaccentColor valueAccent color for the header overlay only
footerAccentColorstringaccentColor valueAccent color for the footer overlay only
placeholdersfalse | { page?, total? }undefinedRename {page} / {total} tokens, or false to disable

Callbacks

OptionTypeDescription
onPageFormatChange(format: PageFormat) => voidFired when the page format changes via configure or setPageFormat.
onZoomChange(zoom: number) => voidFired when the zoom level changes via setZoom.

Commands reference

For deep treatment of each command, see the linked core-concepts page.

Layout commands

CommandParametersDescription
setPageFormatpageFormat: PageFormatChange the page format. Fires onPageFormatChange.
setZoomzoom: numberSet zoom (clamped to [0.25, 4]). Fires onZoomChange.
setPageGappageGap: numberSet the gap between pages (px). Must be positive.
setPageGapBackgroundcolor: stringSet the page-gap background color (any CSS color value).

The full reference also lives on Page header and footer.

CommandParametersDescription
setHeaderheader: PagesHeaderFooterSet the default header content
setFooterfooter: PagesHeaderFooterSet the default footer content
setHeaderTopMarginmargin: numberSet header top margin (px)
setFooterBottomMarginmargin: numberSet footer bottom margin (px)
setDifferentFirstPageenabled: booleanToggle different first-page header and footer
setDifferentFirstPageFooterenabled: booleanToggle different first-page footer independently
setHeaderFirstPageheader: PagesHeaderFooterSet first-page header content
setFooterFirstPagefooter: PagesHeaderFooterSet first-page footer content
setDifferentOddEvenenabled: booleanToggle different odd/even headers and footers
setDifferentOddEvenFooterenabled: booleanToggle different odd/even footers independently
setHeaderOddheader: PagesHeaderFooterSet odd-pages header content
setHeaderEvenheader: PagesHeaderFooterSet even-pages header content
setFooterOddfooter: PagesHeaderFooterSet odd-pages footer content
setFooterEvenfooter: PagesHeaderFooterSet even-pages footer content
setHeaderEditableenabled: booleanLock or unlock the header overlay (controls editableHeader).
setFooterEditableenabled: booleanLock or unlock the footer overlay (controls editableFooter).
openHeaderEditor{ pageNumber: number }Open header editor for a specific page (1-indexed).
openFooterEditor{ pageNumber: number }Open footer editor for a specific page (1-indexed).
closeHeaderFooterEditorsnoneClose whichever header/footer editor is open
closeHeaderEditornoneClose the header editor if open
closeFooterEditornoneClose the footer editor if open
setAccentColorcolor: stringSet accent color for both editor overlays
setHeaderAccentColorcolor: stringSet accent color for the header overlay only
setFooterAccentColorcolor: stringSet accent color for the footer overlay only

Storage reference

Read these from editor.storage.pages. Properties marked read-only should not be written directly — use the matching command.

Layout

PropertyTypeDescription
pageFormatPageFormatCurrent page format
zoomnumberCurrent zoom level (read-only — use setZoom)
getZoom() => numberConvenience getter for the current zoom
pageGapnumberCurrent gap between pages (px)
pageGapBackgroundstringCurrent page-gap background color
getCurrentPage() => number | nullThe 1-indexed page number where the cursor sits
getDistanceToNextPagebreak(pos: number) => number | nullPixel distance from pos to the next page break
getDistanceToPrevPagebreak(pos: number) => number | nullPixel distance from pos to the previous page break

Headers and footers (rendered HTML and JSON)

After a user edits a header or footer through its overlay, both the rendered HTML and the underlying Tiptap JSON are exposed on storage. Use the JSON forms when serialising for DOCX export. The HTML properties are always strings (defaulting to '' before any edit). The JSON properties are null until the user first edits the corresponding header or footer through its overlay.

PropertyTypeDescription
headerHTMLstringDefault header rendered HTML
headerJSONRecord<string, any> | nullDefault header as Tiptap JSON
headerFirstPageHTMLstringFirst-page header rendered HTML
headerFirstPageJSONRecord<string, any> | nullFirst-page header as Tiptap JSON
headerOddHTMLstringOdd-pages header rendered HTML
headerOddJSONRecord<string, any> | nullOdd-pages header as Tiptap JSON
headerEvenHTMLstringEven-pages header rendered HTML
headerEvenJSONRecord<string, any> | nullEven-pages header as Tiptap JSON
footerHTMLstringDefault footer rendered HTML
footerJSONRecord<string, any> | nullDefault footer as Tiptap JSON
footerFirstPageHTMLstringFirst-page footer rendered HTML
footerFirstPageJSONRecord<string, any> | nullFirst-page footer as Tiptap JSON
footerOddHTMLstringOdd-pages footer rendered HTML
footerOddJSONRecord<string, any> | nullOdd-pages footer as Tiptap JSON
footerEvenHTMLstringEven-pages footer rendered HTML
footerEvenJSONRecord<string, any> | nullEven-pages footer as Tiptap JSON
differentFirstPagebooleanWhether the first page differs
differentOddEvenbooleanWhether odd/even pages differ
differentFirstPageFooterbooleanFirst-page footer differs (independent flag)
differentOddEvenFooterbooleanOdd/even footers differ (independent flag)
editableHeaderbooleanWhether the header overlay can be opened (read-only — use setHeaderEditable)
editableFooterbooleanWhether the footer overlay can be opened (read-only — use setFooterEditable)
accentColorstringCurrent accent color (both)
headerAccentColorstringCurrent header accent color
footerAccentColorstringCurrent footer accent color

Active inner-editor state

When a header or footer overlay is open, these properties reflect which one is active. Useful for building toolbars that follow the focused editor — see Page header and footer for a complete toolbar example.

PropertyTypeDescription
activeEditorEditor | nullThe active header/footer editor instance, or null
activeEditorType'header' | 'footer' | nullWhich kind of overlay is active
activePageNumbernumber | nullPage number being edited
headerEditorOnEditor['on'] | nullPre-bound subscriber for events on the header overlay's inner editor
headerEditorOffEditor['off'] | nullPre-bound unsubscriber for the header overlay's inner editor
footerEditorOnEditor['on'] | nullPre-bound subscriber for events on the footer overlay's inner editor
footerEditorOffEditor['off'] | nullPre-bound unsubscriber for the footer overlay's inner editor

Example usage

Built-in format

import { Editor } from '@tiptap/core'
import { ConvertKit } from '@tiptap-pro/extension-convert-kit'
import { TableKit } from '@tiptap-pro/extension-pages-tablekit'
import { Pages } from '@tiptap-pro/extension-pages'

const editor = new Editor({
  extensions: [
    ConvertKit.configure({ table: false }),
    TableKit,
    Pages.configure({
      pageFormat: 'A4',
      pageGap: 40,
      header: 'My Project',
      footer: 'Page {page} of {total}',
      pageGapBackground: '#f8f8f8',
    }),
  ],
})

Custom format and a runtime change

import { cmToPixels } from '@tiptap-pro/extension-pages'

Pages.configure({
  pageFormat: {
    id: 'custom-page-format',
    width: cmToPixels(22.94),
    height: cmToPixels(35.18),
    margins: {
      top: cmToPixels(2.54),
      right: cmToPixels(2.54),
      bottom: cmToPixels(2.54),
      left: cmToPixels(2.54),
    },
  },
  onPageFormatChange: (pageFormat) => {
    console.log('Page format changed:', pageFormat.id)
  },
})

// Switch later
editor.commands.setPageFormat('Letter')

Header and footer template tokens

Both header and footer accept the tokens {page} (current 1-indexed page) and {total} (total page count). They are substituted at render time and work in plain strings, HTML strings, and JSONContent.