Skip to main content
Complete technical reference for the Template Builder component.

Component props

Required props

None - the component works with zero configuration.

Optional props

document
object
Document loading configuration
fields
object
Field configuration
menu
object
Field insertion menu configuration
list
object
Field list sidebar configuration
toolbar
boolean | string | object
Document editing toolbar. Can be:
  • boolean - show/hide default toolbar
  • string - space-separated tool names
  • object - full toolbar configuration
onReady
() => void
Called when the document is loaded and ready
onTrigger
(event: TriggerEvent) => void
Called when the trigger pattern is typed
onFieldInsert
(field: TemplateField) => void
Called when a field is inserted
onFieldUpdate
(field: TemplateField) => void
Called when a field is modified
onFieldDelete
(fieldId: string | number) => void
Called when a field is removed
onFieldsChange
(fields: TemplateField[]) => void
Called whenever the complete field list changes
onFieldSelect
(field: TemplateField | null) => void
Called when a field is selected/deselected in the document
onFieldCreate
(field: FieldDefinition) => void | Promise<FieldDefinition | void>
Called when user creates a new field (requires fields.allowCreate = true)

Types

FieldDefinition

Available fields that users can insert:
interface FieldDefinition {
  id: string;                          // Unique identifier
  label: string;                       // Display name
  defaultValue?: string;               // Default value for new instances
  metadata?: Record<string, any>;      // Custom metadata
  group?: string;                      // Category/group name
}

TemplateField

Fields that exist in the template document:
interface TemplateField {
  id: string | number;                 // Unique instance ID
  alias: string;                       // Field name/label
  tag?: string;                        // JSON metadata string
  position?: number;                   // Position in document
  mode?: 'inline' | 'block';          // Rendering mode
  group?: string;                      // Group ID for related fields
}

TriggerEvent

Information about trigger detection:
interface TriggerEvent {
  query: string;                       // Text after trigger pattern
  position: {                          // Cursor position
    top: number;
    left: number;
  };
  mode: 'inline' | 'block';           // Context mode
}
Props passed to custom menu components:
interface MenuProps {
  fields: FieldDefinition[];           // Available fields
  onInsert: (field: FieldDefinition) => void;  // Insert handler
  onClose: () => void;                 // Close menu handler
  position: { top: number; left: number };     // Menu position
  query: string;                       // Current search query
  mode: 'inline' | 'block';           // Insertion mode
}

ListProps

Props passed to custom list components:
interface ListProps {
  fields: TemplateField[];             // Fields in template
  selectedField: TemplateField | null; // Currently selected field
  onFieldSelect: (field: TemplateField) => void;  // Selection handler
  onFieldDelete: (fieldId: string | number) => void;  // Delete handler
}

ExportConfig

Configuration for template export:
interface ExportConfig {
  fileName?: string;                   // Download filename
  triggerDownload?: boolean;           // Auto-download file
}

Ref methods

Access these methods via a ref:
const builderRef = useRef<SuperDocTemplateBuilderHandle>(null);

insertField()

Insert a field at the current cursor position:
builderRef.current?.insertField({
  alias: 'customer_name',
  mode: 'inline'
});
Returns boolean - true if inserted successfully.

insertBlockField()

Insert a block-level field:
builderRef.current?.insertBlockField({
  alias: 'terms_section',
  mode: 'block'
});
Returns boolean - true if inserted successfully.

updateField()

Update an existing field:
builderRef.current?.updateField('field-id', {
  alias: 'new_name',
  tag: JSON.stringify({ groupId: '123' })
});
Returns boolean - true if updated successfully.

deleteField()

Remove a field from the template:
builderRef.current?.deleteField('field-id');
Returns boolean - true if deleted successfully.

selectField()

Programmatically select a field:
builderRef.current?.selectField('field-id');

nextField()

Navigate to the next field (equivalent to Tab key):
builderRef.current?.nextField();

previousField()

Navigate to the previous field (equivalent to Shift+Tab):
builderRef.current?.previousField();

getFields()

Get all fields in the template:
const fields = builderRef.current?.getFields();
// Returns: TemplateField[]

exportTemplate()

Export the template as a .docx file:
// Trigger download
await builderRef.current?.exportTemplate({
  fileName: 'my-template.docx',
  triggerDownload: true
});

// Get Blob without downloading
const blob = await builderRef.current?.exportTemplate({
  triggerDownload: false
});

// Use blob for API upload or database storage
await uploadToServer(blob);
Returns Promise<void | Blob> depending on triggerDownload setting.

getSuperDoc()

Access the underlying SuperDoc editor instance:
const superdoc = builderRef.current?.getSuperDoc();

// Use SuperDoc API directly
if (superdoc) {
  const editor = superdoc.getEditor();
  // Full access to SuperDoc/SuperEditor APIs
}
Returns SuperDoc | null.

Default components

The package exports default UI components you can use as a starting point:
import {
  DefaultFieldMenu,
  DefaultFieldList
} from '@superdoc-dev/template-builder/defaults';

// Use as-is or extend
function MyCustomMenu(props: MenuProps) {
  return (
    <div>
      <DefaultFieldMenu {...props} />
      <button onClick={props.onClose}>Cancel</button>
    </div>
  );
}

CSS classes

Target these classes for custom styling:
ClassElement
.superdoc-template-builderRoot container
.superdoc-field-menuField insertion popup
.superdoc-field-menu-itemIndividual menu item
.superdoc-field-listSidebar container
.superdoc-field-list-itemIndividual field in list
.superdoc-field-list-groupGrouped fields container
.superdoc-field-tagField in document
.superdoc-field-tag--selectedSelected field
.superdoc-field-tag--inlineInline field mode
.superdoc-field-tag--blockBlock field mode

Import types

All TypeScript types are exported for use in your code:
import type {
  SuperDocTemplateBuilderProps,
  SuperDocTemplateBuilderHandle,
  FieldDefinition,
  TemplateField,
  TriggerEvent,
  MenuProps,
  ListProps,
  ExportConfig
} from '@superdoc-dev/template-builder';

Keyboard shortcuts

Built-in keyboard navigation:
ShortcutAction
TabJump to next field
Shift + TabJump to previous field
{{ (default)Open field menu
EscClose field menu
EnterInsert selected field from menu
/ Navigate menu items
The trigger pattern is configurable via the menu.trigger prop.