# API reference

> The public API implemented in SuperScheduler 0.1.0: components, options with verified defaults, callbacks, control methods, subpath modules, Lite and reserved APIs.

Source: https://superscheduler.org/en/docs/api-reference/
Reviewed: 2026-10-07

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.

This reference covers the API used throughout these guides, as implemented in version 0.1.0. Everything except the [Lite API](#lite) 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](https://superscheduler.org/en/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
| Import | Edition | Exports | Guide |
|---|---|---|---|
| `super-scheduler` | Pro | `SuperSchedulerComponent`, `useSchedulerControl`, the `SuperScheduler` namespace, `SchedulerDate`, `SchedulerEvent`, `version` and the public types | [React integration](https://superscheduler.org/en/docs/react-integration/) |
| `super-scheduler/styles.css` | Pro | The stylesheet (one `@layer super-scheduler`) | [Theming](https://superscheduler.org/en/docs/theming/) |
| `super-scheduler/react-render` | Pro | `SuperSchedulerComponent` with React render props | [React render slots](https://superscheduler.org/en/docs/react-render-slots/) |
| `super-scheduler/history` | Pro | `createHistory` | [Undo and redo](https://superscheduler.org/en/docs/undo-redo/) |
| `super-scheduler/minimap` | Pro | `createMinimap`, `SchedulerMinimap`, `eventDensity` | [Minimap](https://superscheduler.org/en/docs/minimap-metrics/) |
| `super-scheduler/panes` | Pro | `SchedulerPanes`, `linkPanes` | [Panes and saved views](https://superscheduler.org/en/docs/panes-saved-views/) |
| `super-scheduler/zoom-ui` | Pro | `createZoomHud`, `createZoomSlider`, `createLodBadge` | [Time scales and zoom](https://superscheduler.org/en/docs/time-scales-zoom/) |
| `super-scheduler/views` | Pro | `getViewState`, `applyViewState` | [Panes and saved views](https://superscheduler.org/en/docs/panes-saved-views/) |
| `super-scheduler/ranges` | Pro | `createRangeLoader` | [Range loading](https://superscheduler.org/en/docs/range-loading/) |
| `super-scheduler/hooks` | Pro | `useScheduler`, `useSchedulerState`, `subscribeScheduler`, `getSchedulerSnapshot` | [Controlled state](https://superscheduler.org/en/docs/controlled-state/) |
| `super-scheduler/tailwind` | Pro | Tailwind CSS v3 preset (`export =`) | [Theming](https://superscheduler.org/en/docs/theming/) |
| `super-scheduler/datasets` | Pro | `generateDataset`, `generateScenario`, `toSuperSchedulerData`, `SCENARIOS`, `Prng` | [Performance](https://superscheduler.org/en/docs/performance-virtualization/#measuring) |
| `super-scheduler/core` | Pro | DOM-free dates, durations, timelines, indexes and layout helpers | |
| `super-scheduler-lite` | Lite | `SuperSchedulerComponent`, the `SuperScheduler` namespace, `SchedulerDate`, `version` | [Quick start with Lite](https://superscheduler.org/en/docs/quick-start-lite/) |
| `super-scheduler-lite/styles.css` | Lite | The Lite stylesheet | [Quick start with Lite](https://superscheduler.org/en/docs/quick-start-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.

| 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](#react-render)).

```tsx
// src/control-access.tsx
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
| Type | Meaning |
|---|---|
| `SchedulerProps` | Props of `SuperSchedulerComponent` |
| `SchedulerConfig` | Options accepted by `new SuperScheduler.Scheduler()` and `control.update()` |
| `SchedulerOptions`, `SchedulerEventHandlers` | The option and handler halves of the configuration |
| `SchedulerApi` | The control's interface (same shape as `SuperScheduler.Scheduler`) |
| `Scheduler...Args` | One interface per handler, for example `SchedulerEventMoveArgs`, `SchedulerEventsChangeArgs` |
| `SuperScheduler.EventData<T>`, `SuperScheduler.ResourceData<T>` | Data shapes, generic over your extra fields |
| `SchedulerCustomProps` | Augmentable 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 }>`.

| Fields | Type | Meaning |
|---|---|---|
| `id`, `start`, `end`, `text` | `EventId`, `DateInput`, `DateInput`, `string` | Required. `end` is exclusive unless `eventEndSpec: 'Date'` |
| `resource` | `ResourceId` | Row of the event |
| `backColor`, `fontColor`, `borderColor`, `barColor`, `barBackColor` | `string` | Colors |
| `cssClass`, `padding`, `borderRadius`, `height` | `string`, `string \| number`, `string \| number`, `number` | Presentation |
| `html`, `htmlLeft`, `htmlRight` | `string` | Trusted HTML, never escaped; escape user text with `SuperScheduler.Util.escapeHtml` |
| `toolTip`, `bubbleHtml`, `areas`, `contextMenu` | `string`, `string`, `AreaData[]`, `Menu` | Tooltip, bubble content, clickable areas, menu |
| `moveDisabled`, `resizeDisabled`, `moveHDisabled`, `moveVDisabled` | `boolean` | Locks: any move, resizing, horizontal moves, row changes |
| `clickDisabled`, `doubleClickDisabled`, `rightClickDisabled`, `deleteDisabled`, `moveSkipNonBusinessDisabled` | `boolean` | Per-event opt-outs |
| `hidden`, `barHidden` | `boolean` | Hide the event or its duration bar |
| `complete` | `number` | Percentage for `durationBarMode: 'PercentComplete'` |
| `line`, `minLine`, `sort` | `'dedicated' \| number`, `number`, `string[]` | Stacking control |
| `tags` | `unknown` | Free data |

### Resources
`SuperScheduler.ResourceData<T>` accepts extra fields.

| Fields | Type | Meaning |
|---|---|---|
| `id`, `name` | `ResourceId`, `string` | Row id and label |
| `children`, `expanded` | `ResourceData[]`, `boolean` | Tree rows (need `treeEnabled`); parents are collapsed unless `expanded: true` |
| `frozen` | `'top' \| 'bottom'` | Row pinned above or below the scrolling rows |
| `split` | `ResourceData[]` | Several rows under one header cell |
| `columns` | `ResourceColumnData[]` | Cells for `rowHeaderColumns`, by index |
| `cellsDisabled` | `boolean` | Every cell of the row is disabled: hatched, no drops, no selection |
| `preventUsage` | `boolean` | No events or selection on the row |
| `cellsAutoUpdated` | `boolean` | Re-run `onBeforeCellRender` for this row when its events change |
| `minHeight`, `eventHeight`, `marginTop`, `marginBottom`, `maxLines`, `emptyHeight` | `number` | Row geometry |
| `backColor`, `fontColor`, `cssClass`, `html`, `toolTip`, `bubbleHtml`, `ariaLabel`, `areas`, `contextMenu`, `tags` | various | Header presentation and data |

### Links, headers, zoom levels and separators
| Type | Fields |
|---|---|
| `LinkData` | `from`, `to` (event ids), `id`, `type` (`'FinishToStart'` default, `'FinishToFinish'`, `'StartToStart'`, `'StartToFinish'`), `color`, `width`, `style` (`'solid' \| 'dotted' \| 'dashed'`), `cssClass`, `layer`, `text`, `textAlignment`, `bubbleHtml`, `contextMenu` |
| `TimeHeaderData` | `groupBy` (`'Minute' \| 'Hour' \| 'Day' \| 'Week' \| 'Month' \| 'Quarter' \| 'Year' \| 'Cell' \| 'None' \| 'Default'`), `format`, `height` |
| `ZoomLevel` | `id`, `properties` (option values, each optionally a function of `{ date, level }`) |
| `SeparatorData` | `location`, `color`, `layer` (`'AboveEvents' \| 'BelowEvents'`), `opacity`, `width`, `cssClass`, `toolTip` |
| `TimelineData` | `start`, `end`, `width` (cells for `scale: 'Manual'`) |

## Options
### Time axis
| Option | Type | Default | Notes |
|---|---|---|---|
| `startDate` | `DateInput` | today | Truncated to midnight |
| `days` | `number` | `1` | Length of the timeline |
| `scale` | `'CellDuration' \| 'Minute' \| 'Hour' \| 'Day' \| 'Week' \| 'Month' \| 'Year' \| 'Manual'` | `'CellDuration'` | `'Manual'` uses `timeline` |
| `cellDuration` | `number` (minutes) | `60` | With `scale: 'CellDuration'` |
| `cellWidth` | `number` | `40` | Pixels per cell of the current scale |
| `cellWidthSpec` | `'Fixed' \| 'Auto'` | `'Fixed'` | `'Auto'` fits the timeline to the width |
| `cellWidthMin` | `number` | `1` | |
| `timeHeaders` | `TimeHeaderData[]` | `[{ groupBy: 'Default' }, { groupBy: 'Cell' }]` | `'Default'` follows `cellGroupBy` |
| `cellGroupBy` | `GroupBy` | `'Day'` | |
| `headerHeight` | `number` | `30` | Per header row |
| `timeFormat` | `'Auto' \| 'Clock12Hours' \| 'Clock24Hours'` | `'Auto'` | Default hour labels only |
| `locale` | `string \| 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 |
| `showNonBusiness` | `boolean` | `true` | `false` hides weekends (day scale) or non-business hours |
| `businessBeginsHour`, `businessEndsHour` | `number` | `9`, `18` | |
| `businessWeekends` | `boolean` | `false` | |
| `cellsMarkBusiness` | `boolean` | `true` | |
| `showCurrentTimeHeader` | `boolean` | `false` | |
| `separators` | `SeparatorData[]` | `[]` | Vertical date marks |
| `timeline` | `TimelineData[]` | none | With `scale: 'Manual'` |
| `infiniteScrollingEnabled` | `boolean` | `false` | `infiniteScrollingMargin` `50`, `infiniteScrollingStepDays` `30` |
| `floatingTimeHeaders` | `boolean` | `true` | Sticky header labels |
| `viewType` | `'Resources'` | `'Resources'` | `'Days'` and `'Gantt'` are reserved |
| `scrollX`, `scrollY` | `number` | none | Initial scroll in pixels |

### Rows
| Option | Type | Default | Notes |
|---|---|---|---|
| `resources` | `ResourceData[]` | `[]` | |
| `treeEnabled` | `boolean` | `false` | Required for `children` |
| `treeIndent` | `number` | `20` | |
| `treeAutoExpand` | `boolean` | `true` | |
| `treePreventParentUsage` | `boolean` | `false` | Parents take no events or selection |
| `rowHeaderWidth` | `number` | `80` | |
| `rowHeaderWidthAutoFit` | `boolean` | `true` | Grows to the names; `rowHeaderWidthMin` `20`, `rowHeaderWidthMarginRight` `0` |
| `rowHeaderColumns` | `RowHeaderColumnData[]` | none | One column showing `name` |
| `rowHeaderColumnsResizable` | `boolean` | `true` | `rowHeaderColumnDefaultWidth` `80`, `rowHeaderColumnsMergeParents` `true` |
| `rowHeaderColumnsReorderable` | `boolean` | `false` | Drag column titles |
| `rowMinHeight`, `rowEmptyHeight` | `number` | `0`, none | |
| `rowMarginTop`, `rowMarginBottom` | `number` | `0` | |
| `eventHeight` | `number` | `35` | One stacking line |
| `eventMarginBottom` | `number` | `0` | |
| `rowFilterParentsAlwaysVisible` | `boolean` | `true` | |
| `rowSortingMode` | `'LeavesOnly' \| 'ParentsOnly' \| 'All'` | `'LeavesOnly'` | Used by `rows.sort()` |
| `selectedRows` | `string[] \| number[]` | `[]` | |
| `cornerText`, `cornerHtml` | `string` | `''`, none | Top-left cell |

### Events and editing
| Option | Type | Default | Notes |
|---|---|---|---|
| `events` | `EventData[]` | `[]` | Controlled data; the array is adopted and spliced in place |
| `defaultEvents` | `EventData[]` | none | Uncontrolled initial data, read once |
| `eventMoveHandling`, `eventResizeHandling` | `'Update' \| 'Notify' \| 'Disabled'` | `'Update'` | `'Disabled'` prevents the gesture |
| `eventClickHandling` | `'Enabled' \| 'Select' \| 'ContextMenu' \| 'Bubble' \| 'Disabled'` | `'Enabled'` | `'Select'` toggles selection |
| `eventDoubleClickHandling` | same values | `'Disabled'` | A double-click handler delays single clicks by `doubleClickTimeout` (`300`) |
| `eventRightClickHandling` | same 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` |
| `allowEventOverlap` | `boolean` | `true` | `false` refuses moves, resizes and selections onto occupied time |
| `conflictHighlight` | `boolean` | `false` | Marks colliding events while dragging |
| `useEventBoxes` | `'Always' \| 'Never' \| 'ShortEventsOnly'` | `'Always'` | `'Always'` draws events over whole cells |
| `eventMoveByCell` | `boolean` | `false` | With `useEventBoxes: 'Never'` |
| `moveBy` | `'Full' \| 'Top' \| 'Left'` | `'Full'` | Drag handle area |
| `eventMoveMargin`, `eventResizeMargin` | `number` | `5` | |
| `eventMoveSkipNonBusiness`, `eventMoveToPosition` | `boolean` | `false` | |
| `snapToGrid` (and `...EventMoving`, `...EventResizing`, `...TimeRangeSelecting`, `...RectangleSelecting`) | `boolean` | `true` | |
| `dragCard` | `boolean \| DragCardOptions` | `true` | Card beside the pointer while dragging |
| `headerMarker`, `resizeHandles` | `boolean` | `true` | |
| `autoScroll` | `'Drag' \| 'Always' \| 'Disabled'` | `'Drag'` | `autoScrollSpeed` `50`, `autoScrollDelay` `100` |
| `dragOutAllowed` | `boolean` | `false` | Drag events to drop targets |
| `floatingEvents` | `boolean` | `true` | Sticky event labels |
| `eventMinWidth` | `number` | `1` | |
| `eventBorderRadius`, `eventPadding` | `string \| number` | none | |
| `eventTextWrappingEnabled` | `boolean` | `false` | |
| `eventHtmlLeftMargin`, `eventHtmlRightMargin` | `number` | `10` | |
| `durationBarVisible` | `boolean` | `true` | `durationBarMode` `'Duration'` or `'PercentComplete'`; `durationBarHeight` none |
| `eventStackingLineHeight` | `number` | `100` | |
| `showToolTip` | `boolean` | `true` | Native tooltips from `toolTip` |
| `eventMovingStartEndEnabled`, `eventResizingStartEndEnabled`, `timeRangeSelectingStartEndEnabled` | `boolean` | `false` | Labels beside the shadow, format `'MMMM d, yyyy'` |
| `crosshairType` | `'Header' \| 'Full' \| 'Disabled'` | `'Header'` | |
| `xssProtection` | `'Enabled' \| 'Disabled'` | `'Enabled'` | Escapes `text`; `html` is never escaped |

### Selection
| Option | Type | Default | Notes |
|---|---|---|---|
| `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`, `multiRangeMode` | `boolean`, `'CtrlOrMeta' \| 'Always'` | `false`, `'CtrlOrMeta'` | Several time ranges |
| `allowMultiSelect` | `boolean` | `true` | Several selected events |
| `eventMultiSelectRange` | `boolean` | `false` | Shift+click selects a block |
| `rectangleSelectHandling` | `'Disabled' \| 'Enabled' \| 'EventSelect'` | `'Disabled'` | |
| `rectangleSelectMode`, `rectangleSelectModifiers` | `'Free' \| 'Row'`, `boolean` | `'Free'`, `false` | |
| `allowMultiMove`, `allowMultiResize` | `boolean` | `false` | `multiMoveVerticalMode` `'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
| Option | Type | Default | Notes |
|---|---|---|---|
| `zoomLevels` | `ZoomLevel[]` | `[]` | |
| `zoom` | `number \| string` | none | Initial level: index or `id` |
| `zoomPosition` | `'left' \| 'middle' \| 'right'` | `'left'` | Kept in place on level changes |
| `zoomGesture` | `boolean \| ZoomGestureOptions` | `true` | Ctrl or Cmd + wheel, pinch; options `min`, `max` (`400`), `wheel` (`'ctrl'`), `pinch` (`true`), `sensitivity` (`1`), `scales` (`'zoomLevels'`), `link` |
| `lod` | `boolean \| LodOptions` | `true` | Adaptive level of detail |

### Size and layout
| Option | Type | Default | Notes |
|---|---|---|---|
| `height` | `number \| '100%'` | `600` | Total height, headers included |
| `heightSpec` | `'Max' \| 'Fixed' \| 'Auto' \| 'Parent100Pct' \| 'Max100Pct'` | `'Max'` | `'Max'`: content height up to `height` |
| `width` | `number` | none | Fills the host |
| `visible` | `boolean` | `true` | |

### Appearance
| Option | Type | Default | Notes |
|---|---|---|---|
| `colorScheme` | `'inherit' \| 'light' \| 'dark' \| 'auto'` | `'inherit'` | Only `'auto'` follows the OS preference |
| `density` | `'comfortable' \| 'compact' \| 'dense'` | none | |
| `classNames`, `styles` | per slot (`root`, `event`, `cell`, `rowHeader`, ...) | `{}` | Classes or inline styles |
| `cssClass` | `string` | none | Extra class on the root |
| `unstyled` | `boolean` | `false` | Structure only |
| `theme` | `string` | none | Adds `{theme}_*` classes |
| `nowLine` | `boolean \| { interval, label, cssClass }` | `false` | Interval `60000` ms |
| `emptyState`, `errorState` | `ReactNode \| Node` | none | A string is shown as text |
| `loading` | `boolean` | none | `loadingLabelText` `'Loading...'`, `loadingLabelVisible` `true` |
| `messageHideAfter`, `messageHideOnMouseOut`, `messageBarPosition` | `number`, `boolean`, `'Top' \| 'Bottom'` | `5000`, `true`, `'Top'` | For `control.message()` |

### Links
| Option | Type | Default | Notes |
|---|---|---|---|
| `links` | `LinkData[]` | `[]` | Drawn from data |
| `linkShape` | `'Curved' \| 'RightAngled'` | `'Curved'` | |
| `linkLayer` | `'Above' \| 'Below'` | `'Above'` | |
| `linkWidth` | `'Auto' \| number` | `'Auto'` | |
| `linkBottomMargin` | `number` | `17` | |

### Keyboard
| Option | Type | Default | Notes |
|---|---|---|---|
| `keyboardEnabled` | `boolean` | `false` | |
| `keyboardTarget` | `'document' \| 'component'` | `'document'` | |
| `keyboardMode` | `'SuperScheduler' \| 'Full'` | `'SuperScheduler'` | `'Full'` needs `keyboardEnabled` |
| `keyboardOptions` | `{ pageRows, contextMenuKey, bubbleOnFocus, selectAll, zoomKeys }` | none | `zoomKeys` defaults to `false` |

### Menus and bubbles
| Option | Type | Default |
|---|---|---|
| `contextMenu`, `contextMenuResource`, `contextMenuSelection`, `contextMenuLink` | `SuperScheduler.Menu` | none |
| `bubble` | `SuperScheduler.Bubble` | a bubble that shows `bubbleHtml` |
| `cellBubble`, `resourceBubble`, `linkBubble` | `SuperScheduler.Bubble` | none |
| `allowDefaultContextMenu` | `boolean` | `false` |

### Data, loading and extensions
| Option | Type | Default | Notes |
|---|---|---|---|
| `extensions` | `SchedulerExtension[]` | none | Range loaders, histories |
| `history` | history object | none | Shorthand for one history extension |
| `dynamicLoading` | `boolean` | `false` | With `onScroll` |
| `scrollDelayDynamic` | `number` | `500` | Quiet time before `onScroll` |

### React content
Only with `SuperSchedulerComponent` from `super-scheduler/react-render`:

| Prop | Arguments | Returns |
|---|---|---|
| `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
| Handler | Arguments | Cancel |
|---|---|---|
| `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 = false` | no |
| `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
| Handler | Arguments | Cancel 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 |
| `onEventMoved` | the same values, read-only; the store already holds the new times | no |
| `onEventResizing` | `{ e, start, end, what, row, allowed, allowOverlap, conflicts, message, ... }` | steer with `allowed` |
| `onEventResize` | `{ e, newStart, newEnd, what, multiresize, control, async, loaded() }` | `preventDefault()`, async |
| `onEventResized` | the same values, read-only | no |

### Time ranges and rectangles
| Handler | Arguments | Cancel |
|---|---|---|
| `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 range | first |
| `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
| Handler | Arguments | Cancel |
|---|---|---|
| `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
| Handler | Arguments | Change |
|---|---|---|
| `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`, `onDimensionsChanged` | | Lifecycle notifications |

### Other handlers
| Handler | Arguments |
|---|---|
| `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
| Member | Description |
|---|---|
| `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 |
| `levelOfDetail` | Current level-of-detail state |
| `history` | The attached history, or `null` |
| `moveRowHeaderColumn(from, to)` | Reorders row header columns |
| `nav` | The `top`, `scroll`, `corner`, `timeHeader`, `message` and `loading` elements (`null` before `init()`) |
| `v` | Version string |

### Scrolling and viewport
| Member | Description |
|---|---|
| `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
| Member | Description |
|---|---|
| `events.list` | The 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
| Member | Description |
|---|---|
| `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.sortParam` | Sorting (`{ field, order }`) |
| `rows.selection.add/remove/clear/get/isSelected` | Row selection |

### Selection
| Member | Description |
|---|---|
| `multiselect.add/remove/clear/get/events/isSelected/redraw` | Event 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
| Member | Description |
|---|---|
| `zoom.active` | Active 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.findAllByFromTo` | Links |
| `cells.all()`, `cells.find(start, resource)`, `cells.findXy(x, y)`, `cells.findByPixels(x, y)` | Mounted cells |
| `keyboard.focusCell`, `focusEvent`, `getFocus`, `move`, `clearFocus`, `resetFocus` | Keyboard focus |

### Static members
| Member | Description |
|---|---|
| `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
| Member | Description |
|---|---|
| `Date` | Civil 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()` |
| `Duration` | Millisecond span: `ofDays()`, `ofHours()`, `ofMinutes()`, `totalHours()`, `toString(pattern?)` |
| `Event` | Event wrapper (`data`, `id()`, `start()`, `end()`, `text()`, `resource()`, `duration()`) |
| `Locale` | `register(locale)`, `find(id)`, `new Locale(id, fields)` |
| `Menu`, `Bubble` | Context menus and hover bubbles (`show()`, `hide()`) |
| `Selection` | `new Selection(start, end, resource?)` |
| `Util` | `escapeHtml(text)`, `overlaps(start1, end1, start2, end2)` (half-open) |
| `ColorUtil` | `darker()`, `lighter()`, `contrasting()` |
| `Exception` | Thrown on API misuse |
| `guid()` | Random v4 UUID |
| `Row`, `RenderRow`, `Link` | Created 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](#options-react-render). 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.

| Option | Type | Default |
|---|---|---|
| `startDate` | `DateInput` | today |
| `days` | `number` (integer) | `31` |
| `scale` | `'Day'` | `'Day'` |
| `cellWidth` | `number` | `64` |
| `height` | `number` | `400` |
| `rowHeaderWidth` | `number` | `160` |
| `rowMinHeight` | `number` | `40` |
| `eventHeight` | `number` | `26` |
| `resources` | `{ id, name }[]` (flat) | `[]` |
| `events` | `{ id, resource, start, end, text, backColor?, fontColor?, cssClass?, toolTip?, tags? }[]` | `[]` |
| `locale` | `string` | `'en-us'` |
| `ariaLabel` | `string` | `'Resource schedule'` |
| `emptyState` | `string` | `'No resources'` |
| `onEventClick` | `({ control, e: { data }, originalEvent }) => void` | none |
| `onTimeRangeClick` | `({ control, start, end, resource, originalEvent }) => void`, any empty cell | none |
| `controlRef` | ref object or `(control \| null) => void` | none |

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](https://superscheduler.org/en/docs/migrate-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.

| Area | Reserved |
|---|---|
| Inline editing | `eventEditHandling`, `eventEditMinWidth`, `rowEditHandling`, `'Edit'` values of click handlings, `events.edit()`, `rows.edit()`, `Row.edit()`, `onEventEdit`, `onEventEdited`, `onEventEditKeyDown`, `onRowEdit`, `onRowEdited`, `onAfterEventEditRender` |
| Row creation and moving | `rowCreateHandling`, `rowCreateHeight`, `rowCreateHtml`, `rowCreateText`, `rowMoveHandling`, `rowMoveSameLevelOnly`, `rowDragHandleWidth`, `onRowCreate`, `onRowCreated`, `onRowMove`, `onRowMoved`, `onRowMoving`, `makeDraggableAsRow`, `registerRowDropTarget` |
| Interactive link creation | `linkCreateHandling`, `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 refresh | `autoRefreshEnabled`, `autoRefreshInterval`, `autoRefreshMaxCount`, `autoRefreshCommand`, `autoRefreshPause()`, `autoRefreshStart()`, `onAutoRefresh` |
| Export | `exportAs()`, `exceljs`, `onBeforeEventExport`, `onBeforeCellExport`, `onBeforeRowHeaderExport`, `onBeforeTimeHeaderExport`, `onBeforeCornerExport` |
| Event versions and grouping | `eventVersionsEnabled`, `eventVersionHeight`, `eventVersionMargin`, `eventVersionPosition`, `eventVersionsReserveSpace`, `groupConcurrentEvents`, `groupConcurrentEventsLimit`, `groupBubble`, `onBeforeGroupRender`, `row.groups` |
| Recurrence | `events.findRecurrent()` (returns `null`) |
| Views and layout | `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)`, `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`.
