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.
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.
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.
Member
Type
Notes
ref.current.control
SuperScheduler.Scheduler
Assigned on mount; after unmount it is the disposed control
controlRef
MutableRefObject<Scheduler | null> or (control) => void
Ref 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'constCONFIG= { startDate:'2026-10-01', days:31, scale:'Day',} satisfiesSuperScheduler.SchedulerConfig// 1. A class ref: `ref.current.control` exists after mount.exportfunctionWithRef() {constref=useRef<SuperSchedulerComponent>(null)useEffect(() =>ref.current?.control.scrollTo('2026-10-15',true,'middle'), [])return <SuperSchedulerComponentref={ref} {...CONFIG} />}// 2. The control as React state: null until mount, then the live control.exportfunctionWithHook() {const { controlRef,control } =useSchedulerControl()useEffect(() =>control?.scrollTo(SuperScheduler.Date.today()), [control])return <SuperSchedulerComponentcontrolRef={controlRef} {...CONFIG} />}// 3. Control plus tracked state topics, published after changes settle.exportfunctionWithState() {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> <SuperSchedulerComponentcontrolRef={controlRef} {...CONFIG} /> </> )}// 4. Imperative, without React: init() before use, dispose() on teardown.exportfunctionmount(host:HTMLElement): () =>void {constcontrol=newSuperScheduler.Scheduler(host,CONFIG)control.init()return () =>control.dispose()}
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.
The control is ref.current.control, the value of controlRef, args.control in most handlers, or new SuperScheduler.Scheduler(element, options) followed by init().
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.
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().
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.
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.
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.
A Tailwind CSS v3 preset: presets: [require('super-scheduler/tailwind')]. It adds super-scheduler colors, radii, shadows and transitions mapped to the CSS tokens.
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.
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.
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.
viewType: 'Days' and 'Gantt' (render as 'Resources'), layout, rowHeaderScrolling, rowHeaderColumnsMode, rowHeaderHideIconEnabled, rows.headerHide(), rows.headerShow(), rows.headerToggle(), timeHeaderTextWrappingEnabled, sortDirections, syncResourceTree
Other
api, 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), BubbleonDomAdd 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.