Skip to content
SuperScheduler

ReferenceApplies toLite and Pro

API reference

This page lists the public API that SuperScheduler 0.1.0 implements: the React components, every option with its type and default grouped by area, the callbacks with their arguments and cancel or async support, the control's methods, the Pro subpath modules and the Lite API. Members that are typed but not implemented are listed separately under Reserved APIs: they warn in development builds and do nothing.

Verified against v0.1.0 · reviewed October 7, 2026.md

This reference covers the API used throughout these guides, as implemented in version 0.1.0. Everything except the Lite API section belongs to SuperScheduler Pro (super-scheduler). Defaults are the values the control uses when you omit an option; "none" means the option has no value until you set one. The guides explain how to combine these pieces; the examples show them in working applications.

A few conventions hold everywhere:

  • DateInput is SuperScheduler.Date | string. Strings are civil ISO 8601 values with seconds ('2026-10-01T14:00:00') or dates ('2026-10-01'). Event ends are exclusive.
  • Resource, event and link ids are string | number and compared strictly: 1 and '1' are different.
  • Options are props of SuperSchedulerComponent, keys of control.update(options) and live properties of the control.
  • Handlers run with this set to the control. Their return values are ignored, and an async handler is not awaited: use the async and loaded() protocol where it exists.

Entry points

ImportEditionExportsGuide
super-schedulerProSuperSchedulerComponent, useSchedulerControl, the SuperScheduler namespace, SchedulerDate, SchedulerEvent, version and the public typesReact integration
super-scheduler/styles.cssProThe stylesheet (one @layer super-scheduler)Theming
super-scheduler/react-renderProSuperSchedulerComponent with React render propsReact render slots
super-scheduler/historyProcreateHistoryUndo and redo
super-scheduler/minimapProcreateMinimap, SchedulerMinimap, eventDensityMinimap
super-scheduler/panesProSchedulerPanes, linkPanesPanes and saved views
super-scheduler/zoom-uiProcreateZoomHud, createZoomSlider, createLodBadgeTime scales and zoom
super-scheduler/viewsProgetViewState, applyViewStatePanes and saved views
super-scheduler/rangesProcreateRangeLoaderRange loading
super-scheduler/hooksProuseScheduler, useSchedulerState, subscribeScheduler, getSchedulerSnapshotControlled state
super-scheduler/tailwindProTailwind CSS v3 preset (export =)Theming
super-scheduler/datasetsProgenerateDataset, generateScenario, toSuperSchedulerData, SCENARIOS, PrngPerformance
super-scheduler/coreProDOM-free dates, durations, timelines, indexes and layout helpers
super-scheduler-liteLiteSuperSchedulerComponent, the SuperScheduler namespace, SchedulerDate, versionQuick start with Lite
super-scheduler-lite/styles.cssLiteThe Lite stylesheetQuick start with Lite

Every entry ships ESM, CommonJS and type declarations. React 18.2 or later, or 19, is a peer dependency (React DOM too for Pro); there are no runtime dependencies. All modules can be imported on a server without a DOM.

Components

SuperSchedulerComponent

SuperSchedulerComponent hosts one control. Its props (SchedulerProps) are all options and handlers below plus controlRef. It renders an unstyled <div>, has no className, style or id props, and forwards to control.update() only the props whose identity changed since the last render; a prop that disappears goes back to its default.

MemberTypeNotes
ref.current.controlSuperScheduler.SchedulerAssigned on mount; after unmount it is the disposed control
controlRefMutableRefObject<Scheduler | null> or (control) => voidRef objects are set on mount and cleared on unmount; functions are called with the control on mount only
useSchedulerControl(){ controlRef, control }control is React state: null until mount, then the control, null after unmount

The component from super-scheduler/react-render accepts the same props plus renderEvent, renderCell, renderRowHeader, renderTimeHeader, renderArea, renderCorner, eventHover, the onBefore*DomAdd and onBefore*DomRemove handlers, and renderOptions (see react-render).

src/control-access.tsxtsx
import { useEffect, useRef } from 'react'
import { SuperScheduler, SuperSchedulerComponent, useSchedulerControl } from 'super-scheduler'
import { useScheduler } from 'super-scheduler/hooks'

const CONFIG = {
  startDate: '2026-10-01',
  days: 31,
  scale: 'Day',
} satisfies SuperScheduler.SchedulerConfig

// 1. A class ref: `ref.current.control` exists after mount.
export function WithRef() {
  const ref = useRef<SuperSchedulerComponent>(null)
  useEffect(() => ref.current?.control.scrollTo('2026-10-15', true, 'middle'), [])
  return <SuperSchedulerComponent ref={ref} {...CONFIG} />
}

// 2. The control as React state: null until mount, then the live control.
export function WithHook() {
  const { controlRef, control } = useSchedulerControl()
  useEffect(() => control?.scrollTo(SuperScheduler.Date.today()), [control])
  return <SuperSchedulerComponent controlRef={controlRef} {...CONFIG} />
}

// 3. Control plus tracked state topics, published after changes settle.
export function WithState() {
  const { controlRef, state } = useScheduler({ track: ['zoom', 'viewport'] })
  return (
    <>
      <p>
        {state.viewport === undefined
          ? ''
          : `${state.viewport.start.toString('d MMM')} to ${state.viewport.end.toString('d MMM')}`}
      </p>
      <SuperSchedulerComponent controlRef={controlRef} {...CONFIG} />
    </>
  )
}

// 4. Imperative, without React: init() before use, dispose() on teardown.
export function mount(host: HTMLElement): () => void {
  const control = new SuperScheduler.Scheduler(host, CONFIG)
  control.init()
  return () => control.dispose()
}

Types

TypeMeaning
SchedulerPropsProps of SuperSchedulerComponent
SchedulerConfigOptions accepted by new SuperScheduler.Scheduler() and control.update()
SchedulerOptions, SchedulerEventHandlersThe option and handler halves of the configuration
SchedulerApiThe control's interface (same shape as SuperScheduler.Scheduler)
Scheduler...ArgsOne interface per handler, for example SchedulerEventMoveArgs, SchedulerEventsChangeArgs
SuperScheduler.EventData<T>, SuperScheduler.ResourceData<T>Data shapes, generic over your extra fields
SchedulerCustomPropsAugmentable with declare module 'super-scheduler' for your own props

Data shapes

Events

SuperScheduler.EventData<T> has no index signature: declare extra fields through the type parameter, for example EventData<{ guest: string }>.

FieldsTypeMeaning
id, start, end, textEventId, DateInput, DateInput, stringRequired. end is exclusive unless eventEndSpec: 'Date'
resourceResourceIdRow of the event
backColor, fontColor, borderColor, barColor, barBackColorstringColors
cssClass, padding, borderRadius, heightstring, string | number, string | number, numberPresentation
html, htmlLeft, htmlRightstringTrusted HTML, never escaped; escape user text with SuperScheduler.Util.escapeHtml
toolTip, bubbleHtml, areas, contextMenustring, string, AreaData[], MenuTooltip, bubble content, clickable areas, menu
moveDisabled, resizeDisabled, moveHDisabled, moveVDisabledbooleanLocks: any move, resizing, horizontal moves, row changes
clickDisabled, doubleClickDisabled, rightClickDisabled, deleteDisabled, moveSkipNonBusinessDisabledbooleanPer-event opt-outs
hidden, barHiddenbooleanHide the event or its duration bar
completenumberPercentage for durationBarMode: 'PercentComplete'
line, minLine, sort'dedicated' | number, number, string[]Stacking control
tagsunknownFree data

Resources

SuperScheduler.ResourceData<T> accepts extra fields.

FieldsTypeMeaning
id, nameResourceId, stringRow id and label
children, expandedResourceData[], booleanTree rows (need treeEnabled); parents are collapsed unless expanded: true
frozen'top' | 'bottom'Row pinned above or below the scrolling rows
splitResourceData[]Several rows under one header cell
columnsResourceColumnData[]Cells for rowHeaderColumns, by index
cellsDisabledbooleanEvery cell of the row is disabled: hatched, no drops, no selection
preventUsagebooleanNo events or selection on the row
cellsAutoUpdatedbooleanRe-run onBeforeCellRender for this row when its events change
minHeight, eventHeight, marginTop, marginBottom, maxLines, emptyHeightnumberRow geometry
backColor, fontColor, cssClass, html, toolTip, bubbleHtml, ariaLabel, areas, contextMenu, tagsvariousHeader presentation and data

Links, headers, zoom levels and separators

TypeFields
LinkDatafrom, to (event ids), id, type ('FinishToStart' default, 'FinishToFinish', 'StartToStart', 'StartToFinish'), color, width, style ('solid' | 'dotted' | 'dashed'), cssClass, layer, text, textAlignment, bubbleHtml, contextMenu
TimeHeaderDatagroupBy ('Minute' | 'Hour' | 'Day' | 'Week' | 'Month' | 'Quarter' | 'Year' | 'Cell' | 'None' | 'Default'), format, height
ZoomLevelid, properties (option values, each optionally a function of { date, level })
SeparatorDatalocation, color, layer ('AboveEvents' | 'BelowEvents'), opacity, width, cssClass, toolTip
TimelineDatastart, end, width (cells for scale: 'Manual')

Options

Time axis

OptionTypeDefaultNotes
startDateDateInputtodayTruncated to midnight
daysnumber1Length of the timeline
scale'CellDuration' | 'Minute' | 'Hour' | 'Day' | 'Week' | 'Month' | 'Year' | 'Manual''CellDuration''Manual' uses timeline
cellDurationnumber (minutes)60With scale: 'CellDuration'
cellWidthnumber40Pixels per cell of the current scale
cellWidthSpec'Fixed' | 'Auto''Fixed''Auto' fits the timeline to the width
cellWidthMinnumber1
timeHeadersTimeHeaderData[][{ groupBy: 'Default' }, { groupBy: 'Cell' }]'Default' follows cellGroupBy
cellGroupByGroupBy'Day'
headerHeightnumber30Per header row
timeFormat'Auto' | 'Clock12Hours' | 'Clock24Hours''Auto'Default hour labels only
localestring | SuperScheduler.Locale'en-us'Any Intl locale id
weekStarts'Auto' | number'Auto'0 is Sunday
eventEndSpec'DateTime' | 'Date''DateTime''Date' makes date-only ends inclusive
showNonBusinessbooleantruefalse hides weekends (day scale) or non-business hours
businessBeginsHour, businessEndsHournumber9, 18
businessWeekendsbooleanfalse
cellsMarkBusinessbooleantrue
showCurrentTimeHeaderbooleanfalse
separatorsSeparatorData[][]Vertical date marks
timelineTimelineData[]noneWith scale: 'Manual'
infiniteScrollingEnabledbooleanfalseinfiniteScrollingMargin 50, infiniteScrollingStepDays 30
floatingTimeHeadersbooleantrueSticky header labels
viewType'Resources''Resources''Days' and 'Gantt' are reserved
scrollX, scrollYnumbernoneInitial scroll in pixels

Rows

OptionTypeDefaultNotes
resourcesResourceData[][]
treeEnabledbooleanfalseRequired for children
treeIndentnumber20
treeAutoExpandbooleantrue
treePreventParentUsagebooleanfalseParents take no events or selection
rowHeaderWidthnumber80
rowHeaderWidthAutoFitbooleantrueGrows to the names; rowHeaderWidthMin 20, rowHeaderWidthMarginRight 0
rowHeaderColumnsRowHeaderColumnData[]noneOne column showing name
rowHeaderColumnsResizablebooleantruerowHeaderColumnDefaultWidth 80, rowHeaderColumnsMergeParents true
rowHeaderColumnsReorderablebooleanfalseDrag column titles
rowMinHeight, rowEmptyHeightnumber0, none
rowMarginTop, rowMarginBottomnumber0
eventHeightnumber35One stacking line
eventMarginBottomnumber0
rowFilterParentsAlwaysVisiblebooleantrue
rowSortingMode'LeavesOnly' | 'ParentsOnly' | 'All''LeavesOnly'Used by rows.sort()
selectedRowsstring[] | number[][]
cornerText, cornerHtmlstring'', noneTop-left cell

Events and editing

OptionTypeDefaultNotes
eventsEventData[][]Controlled data; the array is adopted and spliced in place
defaultEventsEventData[]noneUncontrolled initial data, read once
eventMoveHandling, eventResizeHandling'Update' | 'Notify' | 'Disabled''Update''Disabled' prevents the gesture
eventClickHandling'Enabled' | 'Select' | 'ContextMenu' | 'Bubble' | 'Disabled''Enabled''Select' toggles selection
eventDoubleClickHandlingsame values'Disabled'A double-click handler delays single clicks by doubleClickTimeout (300)
eventRightClickHandlingsame values'ContextMenu'
eventSelectHandling'Update' | 'Disabled''Update'
eventDeleteHandling'Update' | 'Disabled''Disabled''Update' adds a delete button on hover
eventHoverHandling'Bubble' | 'Disabled''Bubble'Shows bubbleHtml
eventTapAndHoldHandling'Move' | 'ContextMenu' | 'Disabled''Move'Touch; tapAndHoldTimeout 300
allowEventOverlapbooleantruefalse refuses moves, resizes and selections onto occupied time
conflictHighlightbooleanfalseMarks colliding events while dragging
useEventBoxes'Always' | 'Never' | 'ShortEventsOnly''Always''Always' draws events over whole cells
eventMoveByCellbooleanfalseWith useEventBoxes: 'Never'
moveBy'Full' | 'Top' | 'Left''Full'Drag handle area
eventMoveMargin, eventResizeMarginnumber5
eventMoveSkipNonBusiness, eventMoveToPositionbooleanfalse
snapToGrid (and ...EventMoving, ...EventResizing, ...TimeRangeSelecting, ...RectangleSelecting)booleantrue
dragCardboolean | DragCardOptionstrueCard beside the pointer while dragging
headerMarker, resizeHandlesbooleantrue
autoScroll'Drag' | 'Always' | 'Disabled''Drag'autoScrollSpeed 50, autoScrollDelay 100
dragOutAllowedbooleanfalseDrag events to drop targets
floatingEventsbooleantrueSticky event labels
eventMinWidthnumber1
eventBorderRadius, eventPaddingstring | numbernone
eventTextWrappingEnabledbooleanfalse
eventHtmlLeftMargin, eventHtmlRightMarginnumber10
durationBarVisiblebooleantruedurationBarMode 'Duration' or 'PercentComplete'; durationBarHeight none
eventStackingLineHeightnumber100
showToolTipbooleantrueNative tooltips from toolTip
eventMovingStartEndEnabled, eventResizingStartEndEnabled, timeRangeSelectingStartEndEnabledbooleanfalseLabels beside the shadow, format 'MMMM d, yyyy'
crosshairType'Header' | 'Full' | 'Disabled''Header'
xssProtection'Enabled' | 'Disabled''Enabled'Escapes text; html is never escaped

Selection

OptionTypeDefaultNotes
timeRangeSelectedHandling'Enabled' | 'Hold' | 'HoldForever' | 'Disabled''Enabled'Clicks and drags on empty cells; 'HoldForever' keeps the selection when the user clicks elsewhere
timeRangeClickHandling'Enabled' | 'Disabled''Enabled'Clicks on a selected range
timeRangeDoubleClickHandling'Enabled' | 'Disabled''Disabled'
timeRangeRightClickHandling'ContextMenu' | 'Enabled' | 'Disabled''ContextMenu'
allowMultiRange, multiRangeModeboolean, 'CtrlOrMeta' | 'Always'false, 'CtrlOrMeta'Several time ranges
allowMultiSelectbooleantrueSeveral selected events
eventMultiSelectRangebooleanfalseShift+click selects a block
rectangleSelectHandling'Disabled' | 'Enabled' | 'EventSelect''Disabled'
rectangleSelectMode, rectangleSelectModifiers'Free' | 'Row', boolean'Free', false
allowMultiMove, allowMultiResizebooleanfalsemultiMoveVerticalMode 'Disabled'
rowClickHandling'Enabled' | 'Select' | 'Disabled''Enabled'
rowDoubleClickHandling'Enabled' | 'Select' | 'Disabled''Disabled'
rowRightClickHandling'ContextMenu' | 'Enabled' | 'Disabled''ContextMenu'
rowSelectHandling'Update' | 'Notify''Update'
timeHeaderClickHandling'Enabled' | 'Disabled''Enabled'
resourceExpandHandling, resourceCollapseHandling'Enabled''Enabled'

Zoom and level of detail

OptionTypeDefaultNotes
zoomLevelsZoomLevel[][]
zoomnumber | stringnoneInitial level: index or id
zoomPosition'left' | 'middle' | 'right''left'Kept in place on level changes
zoomGestureboolean | ZoomGestureOptionstrueCtrl or Cmd + wheel, pinch; options min, max (400), wheel ('ctrl'), pinch (true), sensitivity (1), scales ('zoomLevels'), link
lodboolean | LodOptionstrueAdaptive level of detail

Size and layout

OptionTypeDefaultNotes
heightnumber | '100%'600Total height, headers included
heightSpec'Max' | 'Fixed' | 'Auto' | 'Parent100Pct' | 'Max100Pct''Max''Max': content height up to height
widthnumbernoneFills the host
visiblebooleantrue

Appearance

OptionTypeDefaultNotes
colorScheme'inherit' | 'light' | 'dark' | 'auto''inherit'Only 'auto' follows the OS preference
density'comfortable' | 'compact' | 'dense'none
classNames, stylesper slot (root, event, cell, rowHeader, ...){}Classes or inline styles
cssClassstringnoneExtra class on the root
unstyledbooleanfalseStructure only
themestringnoneAdds {theme}_* classes
nowLineboolean | { interval, label, cssClass }falseInterval 60000 ms
emptyState, errorStateReactNode | NodenoneA string is shown as text
loadingbooleannoneloadingLabelText 'Loading...', loadingLabelVisible true
messageHideAfter, messageHideOnMouseOut, messageBarPositionnumber, boolean, 'Top' | 'Bottom'5000, true, 'Top'For control.message()
OptionTypeDefaultNotes
linksLinkData[][]Drawn from data
linkShape'Curved' | 'RightAngled''Curved'
linkLayer'Above' | 'Below''Above'
linkWidth'Auto' | number'Auto'
linkBottomMarginnumber17

Keyboard

OptionTypeDefaultNotes
keyboardEnabledbooleanfalse
keyboardTarget'document' | 'component''document'
keyboardMode'SuperScheduler' | 'Full''SuperScheduler''Full' needs keyboardEnabled
keyboardOptions{ pageRows, contextMenuKey, bubbleOnFocus, selectAll, zoomKeys }nonezoomKeys defaults to false

Menus and bubbles

OptionTypeDefault
contextMenu, contextMenuResource, contextMenuSelection, contextMenuLinkSuperScheduler.Menunone
bubbleSuperScheduler.Bubblea bubble that shows bubbleHtml
cellBubble, resourceBubble, linkBubbleSuperScheduler.Bubblenone
allowDefaultContextMenubooleanfalse

Data, loading and extensions

OptionTypeDefaultNotes
extensionsSchedulerExtension[]noneRange loaders, histories
historyhistory objectnoneShorthand for one history extension
dynamicLoadingbooleanfalseWith onScroll
scrollDelayDynamicnumber500Quiet time before onScroll

React content

Only with SuperSchedulerComponent from super-scheduler/react-render:

PropArgumentsReturns
renderEvent{ control, e, data, row, width, lod }ReactNode
renderCell{ control, cell }ReactNode
renderRowHeader{ control, row, column }ReactNode
renderTimeHeader{ control, header }ReactNode
renderArea{ control, area, source } (areas with render: true)ReactNode
renderCorner{ control }ReactNode
eventHover{ render, delay (350), leaveGrace (180), placement ('auto'), pin (false), glide (true) }
renderOptions{ retain, sliceMs (8) }

Callbacks

Conventions

  • Before and after. onEventMove runs before a change and can cancel it; onEventMoved runs after it. Most pairs follow this pattern.
  • Cancel. Handlers whose arguments have preventDefault() can cancel: the click family, onEventSelect, onEventDelete, onEventMove, onEventResize, onTimeRangeSelect, onTimeRangeClick and its double and right variants, onRectangleSelect, onRowClick and variants, onRowSelect, onResourceExpand, onResourceCollapse, onTimeHeaderClick, onTimeHeaderRightClick, onGridMouseDown, onKeyDown, onKeyboardFocusChange and onLinkClick. Cancelling a click also skips its "-ed" handler and the follow-up action.
  • Async confirmation. onEventMove and onEventResize support args.async = true and a later args.loaded(); preventDefault() before loaded() cancels, and newStart, newEnd and newResource set before loaded() are applied.
  • Steering. onEventMoving, onEventResizing, onTimeRangeSelecting and onRectangleSelecting run on every shadow change; assign args.allowed, args.start, args.end, args.cssClass or args.html.

Events

HandlerArgumentsCancel
onEventClick, onEventClicked{ e, div, control, originalEvent, ctrl, shift, meta }first
onEventDoubleClick, onEventDoubleClicked{ e, originalEvent }first
onEventRightClick, onEventRightClicked{ e, div, originalEvent }first
onEventSelect, onEventSelected{ e, selected, ctrl, meta }first
onEventDelete, onEventDeleted{ e, control }first
onEventMouseEnter, onEventMouseLeave{ e, div }no
onEventFilter{ e, filterParam, visible }; set visible = falseno
onEventsChange{ events, changed, removed, reason }, reason one of 'move', 'resize', 'create', 'remove', 'update', 'api', 'history', 'load'no

e is a SuperScheduler.Event: e.data is the data object, and e.id(), e.start(), e.end(), e.text(), e.resource() and e.duration() read it.

Drag and resize

HandlerArgumentsCancel and async
onEventMoving{ e, start, end, duration, resource, row, allowed, allowOverlap, conflicts, message, cssClass, html, external, multimove, left, right, ctrl, shift, alt, meta }steer with allowed
onEventMove{ e, newStart, newEnd, newResource, external, multimove, control, position, async, loaded() }preventDefault(), async
onEventMovedthe same values, read-only; the store already holds the new timesno
onEventResizing{ e, start, end, what, row, allowed, allowOverlap, conflicts, message, ... }steer with allowed
onEventResize{ e, newStart, newEnd, what, multiresize, control, async, loaded() }preventDefault(), async
onEventResizedthe same values, read-onlyno

Time ranges and rectangles

HandlerArgumentsCancel
onTimeRangeSelecting{ start, end, anchor, duration, resource, row, allowed, overlapping, ignoreDisabledCells, html, cssClass, button }steer with allowed
onTimeRangeSelect, onTimeRangeSelected{ start, end, resource, control, origin, multirange }, origin one of 'click', 'drag', 'keyboard', 'api'first
onTimeRangeClick, onTimeRangeDoubleClick, onTimeRangeRightClick (and "-ed"){ start, end, resource }, on an already selected rangefirst
onRectangleSelecting{ events, start, end, resources, visible }steer with visible
onRectangleSelect{ events, start, end, resources, append }yes
onRectangleSelected{ events }no
onGridMouseDown{ action, originalEvent, button, ctrl, shift, meta }; set action = 'None'yes

Rows and headers

HandlerArgumentsCancel
onRowClick, onRowDoubleClick, onRowRightClick (and "-ed"){ row, x, originalEvent, ctrl, shift, meta }first
onRowSelect, onRowSelected{ row, selected, ctrl, shift, meta }first
onRowFilter{ row, filterParam, visible, control }no
onRowMouseOver, onRowMouseOut{ row, div }no
onResourceExpand, onResourceCollapse{ resource }yes
onRowHeaderResized, onRowHeaderColumnResized{}, { column }no
onRowHeaderColumnsChange{ control, columns, order, widths, reason }no
onRowSorted{ oldSortParam }no
onTimeHeaderClick, onTimeHeaderClicked{ header: { start, end, level }, control, originalEvent, ctrl, shift, meta }first
onTimeHeaderRightClick, onTimeHeaderRightClicked{ header }first
onCellMouseEnter, onCellMouseLeave{ cell }no

Rendering hooks

HandlerArgumentsChange
onBeforeEventRender{ control, data }data.backColor, fontColor, cssClass, html, areas, toolTip, height, hidden... (a copy; start and end are SuperScheduler.Date)
onBeforeCellRender{ control, cell, getPixels(date) }cell.properties.backColor, cssClass, html, text, disabled, areas, bubbleHtml
onBeforeRowHeaderRender{ row }row.html, text, cssClass, backColor, areas, columns[i].html
onBeforeResHeaderRender{ resource }A copy of the resource, layout fields included
onBeforeRowHeaderColumnRender{ column }Column title html, cssClass, areas
onBeforeTimeHeaderRender{ control, header }header.html, text, cssClass, backColor, toolTip, areas
onBeforeCornerRender{ control, html, areas }Corner content
onBeforeLinkRender{ data, from, to }Link color, width, style, cssClass
onIncludeTimeCell{ cell: { start, end, visible, width } }Hide or resize timeline cells
onAfterEventRender, onAfterCellRender{ e, div }, { cell, div }The painted node
onAfterRender, onAfterUpdate, onDimensionsChangedLifecycle notifications

Other handlers

HandlerArguments
onZoom{ control, cellWidth, scale, cellDuration, phase, origin, anchor, viewportStart, level, lod }, on every gesture frame
onHistoryChange{ canUndo, canRedo, undoLabel, redoLabel, cause }
onScroll{ viewport, async, events, remove, clearEvents, loaded() }, with dynamicLoading
onKeyDown{ originalEvent }, cancelable
onKeyboardFocusChange, onKeyboardFocusChanged{ previous, focus }
onLinkClick, onLinkClicked{ link, originalEvent }, { link }

Control API

The control is ref.current.control, the value of controlRef, args.control in most handlers, or new SuperScheduler.Scheduler(element, options) followed by init().

Lifecycle and display

MemberDescription
init()Required once for imperative controls; update() before init() throws
update(options?)Applies options and repaints synchronously; without arguments, a full refresh
dispose(), disposed()Teardown and its state
show(), hide(), setHeight(px)Visibility; setHeight switches to heightSpec: 'Fixed'
message(text, delayOrOptions?)Message bar inside the control
loadingStart(options?), loadingStop()Loading label
clearSelection()Clears the time-range selection
dragInProgress()true during a gesture
levelOfDetailCurrent level-of-detail state
historyThe attached history, or null
moveRowHeaderColumn(from, to)Reorders row header columns
navThe top, scroll, corner, timeHeader, message and loading elements (null before init())
vVersion string

Scrolling and viewport

MemberDescription
scrollTo(date | px, animated?, position?)animated: boolean, ms, 'fast', 'normal', 'slow' or 'linear'; position: 'left', 'middle', 'right'
scrollToResource(id | row)
setScroll(x, y), setScrollX(x), setScrollY(y), getScrollX(), getScrollY()Pixel scroll
getViewPort(){ start, end, resources, rows(), events() } of the visible area
visibleStart(), visibleEnd()Start and end of the timeline, not of the viewport
getDate(px, precise?, isEnd?), getCoords()Pixel and pointer mapping
infinite.scrollTo(date), infinite.shiftStart(days)Infinite scrolling

Events

MemberDescription
events.listThe data array, by reference
events.add(event)Throws on a duplicate id
events.update(event)Replaces a loaded event; no-op for an unknown id
events.remove(event | id)
events.find(id | predicate), events.findAll(predicate | example)Lookups returning SuperScheduler.Event
events.all(), events.forRange(start?, end?)All events, or those overlapping a range (default the visible range)
events.filter(param)Runs onEventFilter
events.scrollIntoView(event)

Rows

MemberDescription
rows.add(data), rows.addChild(parent, data), rows.update(row | data), rows.remove(row | id)Row changes
rows.find(id | predicate), rows.all(), rows.visible(), rows.each(fn)Lookups returning SuperScheduler.Row
rows.expand(level?), rows.expandAll(), rows.collapseAll()Tree state
rows.filter(param)Runs onRowFilter
rows.sort(spec?), rows.sortParamSorting ({ field, order })
rows.selection.add/remove/clear/get/isSelectedRow selection

Selection

MemberDescription
multiselect.add/remove/clear/get/events/isSelected/redrawEvent selection
multiselect.selectAll({ scope, filter })scope 'view' (default) or 'all'
multiselect.startRectangle()Arms rectangle selection
multirange.add(selection), multirange.get(), multirange.clear()Time ranges (new SuperScheduler.Selection(start, end, resource))
selectTimeRange(start, end, resource, dontFireEvent?)Selects one range

Zoom, links, cells and keyboard

MemberDescription
zoom.activeActive level index (-1 before any)
zoom.setActive(level, position?, anchorDate?)Applies a level at once
zoom.animateTo({ level } | { cellWidth }, { duration (300), position, anchorDate })Animated; returns a promise
zoom.step(delta, options?)One level, or a factor of 1.6 without levels
links.list, links.add, links.update, links.remove, links.find, links.findByFromTo, links.findAllByFromToLinks
cells.all(), cells.find(start, resource), cells.findXy(x, y), cells.findByPixels(x, y)Mounted cells
keyboard.focusCell, focusEvent, getFocus, move, clearFocus, resetFocusKeyboard focus

Static members

MemberDescription
SuperScheduler.Scheduler.makeDraggable({ element, data, duration, ... })Drag DOM elements into the grid as new events
SuperScheduler.Scheduler.registerDropTarget({ element, onDrop, ... })Drop events outside the grid (with dragOutAllowed)
SuperScheduler.Scheduler.startDragging(options), stopDragging()Programmatic external drag

The SuperScheduler namespace

MemberDescription
DateCivil date-time: today(), now(), parse(text, pattern, locale?), fromYearMonthDay(), add*(), firstDayOf*(), getDatePart(), getDay() (day of month), getDayOfWeek(), dayOfWeekISO(), weekNumberISO(), toString(pattern?, locale?), toDate(), toDateLocal(), value, ticks, equals()
DurationMillisecond span: ofDays(), ofHours(), ofMinutes(), totalHours(), toString(pattern?)
EventEvent wrapper (data, id(), start(), end(), text(), resource(), duration())
Localeregister(locale), find(id), new Locale(id, fields)
Menu, BubbleContext menus and hover bubbles (show(), hide())
Selectionnew Selection(start, end, resource?)
UtilescapeHtml(text), overlaps(start1, end1, start2, end2) (half-open)
ColorUtildarker(), lighter(), contrasting()
ExceptionThrown on API misuse
guid()Random v4 UUID
Row, RenderRow, LinkCreated by the control; read them in handlers

Subpath modules

history

createHistory(options?) returns a history to pass as history={history} or in extensions. Options: limit (50), record (['move', 'resize']), keys ('root', 'document' or false; default 'root'), equals, fields, apply ('control' or a function for controlled events) and labels. Methods: undo(), redo(), clear(), push({ label, undo, redo }), record({ ops, control }), batch(label, run), revert(eventId), subscribe(listener); properties canUndo, canRedo, undoLabel, redoLabel. Loads and rejected changes are not recorded.

minimap

createMinimap(control, container, options?) and the React component <SchedulerMinimap control={control} />. Options: series (default eventDensity(control)), height (28), peak ('relative' or 'absolute' with max), tone, marks (today, months, past, all true), range and labels. The widget has update(), refresh() and dispose().

panes

<SchedulerPanes> takes the scheduler props plus panes ({ id, resources or rowFilter, size, minSize (48), hidden, props }), a required numeric height, timeHeader ('first'), scrollbar ('last'), splitter (true), crossPaneMove (true), component, onPaneResize and panesRef. linkPanes(controls, { zoom, rowHeaderWidth }) links existing controls and returns { dispose() }.

zoom-ui

createZoomHud(control, { format, apiMs (700) }), createZoomSlider(control, container, { min, max, detents, scale ('log'), label }) and createLodBadge(control, container, labels?). Each returns { element, dispose() }.

views

getViewState(control, include?) returns a JSON-safe state (zoom, scroll, density, collapsed, columns); applyViewState(control, state, { animate, when, timeout }) (when is 'now' or 'rows') returns a promise of boolean.

ranges

createRangeLoader({ load, chunkDays (7), prefetch (1), cacheChunks (26), skeleton (true), onError }) returns a loader with reload(range?), clear() and loading. load({ start, end, signal }) returns the events overlapping [start, end).

hooks

useScheduler({ track }) returns { controlRef, control, state } for the topics 'events', 'selection', 'zoom', 'viewport' and 'history'. useSchedulerState(control, topic), subscribeScheduler(control, topic, listener) (returns an unsubscribe function) and getSchedulerSnapshot(control, topic) give the same state outside the hook. Viewport state publishes after scrolling settles.

react-render

SuperSchedulerComponent with the React content props. HTML or text fallback paints first; React content replaces it after the interaction ends. renderOptions.retain defaults to the smaller of 2,000 or twice the mounted items; sliceMs to 8.

tailwind

A Tailwind CSS v3 preset: presets: [require('super-scheduler/tailwind')]. It adds super-scheduler colors, radii, shadows and transitions mapped to the CSS tokens.

datasets

generateDataset(options) and generateScenario(id, overrides?) create deterministic hotel-style data (rows and days required, seed, start in ticks, density, events, times). toSuperSchedulerData(dataset) returns { resources, events }. Scenarios: S1 (120 rows, 730 days), S2 (1,000 rows, 730 days), S3 (5,000 rows, 1,500 days) and their dense variants. Data starts on 2026-01-01 by default.

core

DOM-free helpers shared by the engine: SchedulerDate, Duration, registerLocale, resolveLocale, formatTicks, parseTicks, ticksFromParts(year, month, day, ...), partsOf, formatIso, parseIso, todayTicks, nowTicks, the MS_PER_* constants, and timeline, index and layout utilities. Use it for charts and tools next to the scheduler.

Lite API

super-scheduler-lite is a read-only daily timeline. Options it does not implement throw SuperScheduler Lite: unsupported option "...", in every build.

OptionTypeDefault
startDateDateInputtoday
daysnumber (integer)31
scale'Day''Day'
cellWidthnumber64
heightnumber400
rowHeaderWidthnumber160
rowMinHeightnumber40
eventHeightnumber26
resources{ id, name }[] (flat)[]
events{ id, resource, start, end, text, backColor?, fontColor?, cssClass?, toolTip?, tags? }[][]
localestring'en-us'
ariaLabelstring'Resource schedule'
emptyStatestring'No resources'
onEventClick({ control, e: { data }, originalEvent }) => voidnone
onTimeRangeClick({ control, start, end, resource, originalEvent }) => void, any empty cellnone
controlRefref object or (control | null) => voidnone

The control (ref.current.control) has init(), update(options), dispose(), disposed(), scrollTo(date), scrollToResource(id), visibleStart() and visibleEnd(). The namespace has SuperScheduler.Date and SuperScheduler.Scheduler. Resource children, frozen, split and columns are rejected. Theme tokens on .super-scheduler-lite: --super-scheduler-background, -text, -border, -header, -event and -focus. See Migrating from Lite to Pro.

Reserved APIs

These members are typed so that existing code compiles, but they are not implemented in 0.1.0. They do nothing, return empty values, and print super-scheduler: <feature> is not supported yet once in development builds.

AreaReserved
Inline editingeventEditHandling, eventEditMinWidth, rowEditHandling, 'Edit' values of click handlings, events.edit(), rows.edit(), Row.edit(), onEventEdit, onEventEdited, onEventEditKeyDown, onRowEdit, onRowEdited, onAfterEventEditRender
Row creation and movingrowCreateHandling, rowCreateHeight, rowCreateHtml, rowCreateText, rowMoveHandling, rowMoveSameLevelOnly, rowDragHandleWidth, onRowCreate, onRowCreated, onRowMove, onRowMoved, onRowMoving, makeDraggableAsRow, registerRowDropTarget
Interactive link creationlinkCreateHandling, linkDotSize, linkPointSize, onLinkCreate, onLinkCreated (links are drawn from links data)
Server round trips and HTTP loading'CallBack' and 'PostBack' handling values and menu actions, backendUrl, eventsLoadMethod, rowsLoadMethod, linksLoadMethod, events.load(), rows.load(), links.load(), blockOnCallBack, notifyCommit, clientState, onCallBackStart, onCallBackEnd, onLoadNode
Automatic refreshautoRefreshEnabled, autoRefreshInterval, autoRefreshMaxCount, autoRefreshCommand, autoRefreshPause(), autoRefreshStart(), onAutoRefresh
ExportexportAs(), exceljs, onBeforeEventExport, onBeforeCellExport, onBeforeRowHeaderExport, onBeforeTimeHeaderExport, onBeforeCornerExport
Event versions and groupingeventVersionsEnabled, eventVersionHeight, eventVersionMargin, eventVersionPosition, eventVersionsReserveSpace, groupConcurrentEvents, groupConcurrentEventsLimit, groupBubble, onBeforeGroupRender, row.groups
Recurrenceevents.findRecurrent() (returns null)
Views and layoutviewType: 'Days' and 'Gantt' (render as 'Resources'), layout, rowHeaderScrolling, rowHeaderColumnsMode, rowHeaderHideIconEnabled, rows.headerHide(), rows.headerShow(), rows.headerToggle(), timeHeaderTextWrappingEnabled, sortDirections, syncResourceTree
Otherapi, eventBubbleShowForMargins, hideBorderFor100PctHeight, hideUntilInit, initEventEnabled, jointEventsMove, jointEventsResize, navigatorBackSync, overrideWheelScrolling, scrollStep, watchWidthChanges, range and range.all() (use multirange), events.focus(), uiBlock(), uiUnblock(), onBeforeGridLineRender, onResourceHeaderClick, onResourceHeaderClicked, SuperScheduler.Navigator, Row.column(i).html(value), Bubble onDomAdd and onDomRemove

Partially implemented:

  • treeAnimation is accepted, but the expand animation is never played.
  • eventClusters and onClusterClick are accepted and have no visible effect yet.
  • The onBefore*DomAdd and onBefore*DomRemove handlers, the render* props and eventHover work only with the component from super-scheduler/react-render; the root component warns and ignores them.

Accepted tuning hints, ignored because virtualization is always on and tunes itself: beforeCellRenderCaching, cellSweeping, cellSweepingCacheSize, drawBlankCells, dynamicEventRendering and its margin and cache options, eventUpdateInplaceOptimization, progressiveRowRendering, progressiveRowRenderingPreload and the scrollDelay* options other than scrollDelayDynamic.