# Referencia de la API

> La API pública de SuperScheduler 0.1.0: componentes, opciones con valores por defecto verificados, callbacks, métodos del control, módulos, Lite y APIs reservadas.

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

Esta página enumera la API pública que implementa SuperScheduler 0.1.0: los componentes React, todas las opciones con su tipo y su valor por defecto agrupadas por área, los callbacks con sus argumentos y su soporte de cancelación o asincronía, los métodos del control, los módulos por subpath de Pro y la API de Lite. Los miembros que tienen tipos pero no están implementados aparecen aparte, en APIs reservadas: avisan en los builds de desarrollo y no hacen nada.

Esta referencia cubre la API que se usa en estas guías, tal como está implementada en la versión 0.1.0. Todo, salvo la sección [API de Lite](#lite), pertenece a SuperScheduler Pro (`super-scheduler`). Los valores por defecto son los que usa el control cuando omites una opción; «ninguno» significa que la opción no tiene valor hasta que le das uno. Las guías explican cómo combinar estas piezas; los [ejemplos](https://superscheduler.org/es/examples/) las muestran en aplicaciones que funcionan.

Algunas convenciones se cumplen en todas partes:

- `DateInput` es `SuperScheduler.Date | string`. Las cadenas son valores civiles ISO 8601 con segundos (`'2026-10-01T14:00:00'`) o fechas (`'2026-10-01'`). El final de los eventos es exclusivo.
- Los ids de recursos, eventos y vínculos son `string | number` y se comparan de forma estricta: `1` y `'1'` son distintos.
- Las opciones son props de `SuperSchedulerComponent`, claves de `control.update(options)` y propiedades vivas del control.
- Los handlers se ejecutan con `this` apuntando al control. Sus valores de retorno se ignoran, y un handler `async` no se espera: usa el protocolo `async` y `loaded()` donde exista.

## Puntos de entrada
| Import | Edición | Exporta | Guía |
|---|---|---|---|
| `super-scheduler` | Pro | `SuperSchedulerComponent`, `useSchedulerControl`, el namespace `SuperScheduler`, `SchedulerDate`, `SchedulerEvent`, `version` y los tipos públicos | [Integración con React](https://superscheduler.org/es/docs/react-integration/) |
| `super-scheduler/styles.css` | Pro | La hoja de estilos (una sola `@layer super-scheduler`) | [Temas](https://superscheduler.org/es/docs/theming/) |
| `super-scheduler/react-render` | Pro | `SuperSchedulerComponent` con props de render React | [Slots de renderizado React](https://superscheduler.org/es/docs/react-render-slots/) |
| `super-scheduler/history` | Pro | `createHistory` | [Deshacer y rehacer](https://superscheduler.org/es/docs/undo-redo/) |
| `super-scheduler/minimap` | Pro | `createMinimap`, `SchedulerMinimap`, `eventDensity` | [Minimapa](https://superscheduler.org/es/docs/minimap-metrics/) |
| `super-scheduler/panes` | Pro | `SchedulerPanes`, `linkPanes` | [Paneles y vistas guardadas](https://superscheduler.org/es/docs/panes-saved-views/) |
| `super-scheduler/zoom-ui` | Pro | `createZoomHud`, `createZoomSlider`, `createLodBadge` | [Escalas de tiempo y zoom](https://superscheduler.org/es/docs/time-scales-zoom/) |
| `super-scheduler/views` | Pro | `getViewState`, `applyViewState` | [Paneles y vistas guardadas](https://superscheduler.org/es/docs/panes-saved-views/) |
| `super-scheduler/ranges` | Pro | `createRangeLoader` | [Carga por rangos](https://superscheduler.org/es/docs/range-loading/) |
| `super-scheduler/hooks` | Pro | `useScheduler`, `useSchedulerState`, `subscribeScheduler`, `getSchedulerSnapshot` | [Estado controlado](https://superscheduler.org/es/docs/controlled-state/) |
| `super-scheduler/tailwind` | Pro | Preset de Tailwind CSS v3 (`export =`) | [Temas](https://superscheduler.org/es/docs/theming/) |
| `super-scheduler/datasets` | Pro | `generateDataset`, `generateScenario`, `toSuperSchedulerData`, `SCENARIOS`, `Prng` | [Rendimiento](https://superscheduler.org/es/docs/performance-virtualization/#measuring) |
| `super-scheduler/core` | Pro | Fechas, duraciones, líneas de tiempo, índices y utilidades de layout sin DOM | |
| `super-scheduler-lite` | Lite | `SuperSchedulerComponent`, el namespace `SuperScheduler`, `SchedulerDate`, `version` | [Inicio rápido con Lite](https://superscheduler.org/es/docs/quick-start-lite/) |
| `super-scheduler-lite/styles.css` | Lite | La hoja de estilos de Lite | [Inicio rápido con Lite](https://superscheduler.org/es/docs/quick-start-lite/) |

Todos los puntos de entrada incluyen ESM, CommonJS y declaraciones de tipos. React 18.2 o posterior, o 19, es una dependencia peer (también React DOM en Pro); no hay dependencias en tiempo de ejecución. Todos los módulos se pueden importar en un servidor sin DOM.

## Componentes
### SuperSchedulerComponent
`SuperSchedulerComponent` aloja un control. Sus props (`SchedulerProps`) son todas las opciones y handlers de abajo, más `controlRef`. Renderiza un `<div>` sin estilos, no tiene props `className`, `style` ni `id`, y solo reenvía a `control.update()` las props cuya identidad ha cambiado desde el último render; una prop que desaparece vuelve a su valor por defecto.

| Miembro | Tipo | Notas |
|---|---|---|
| `ref.current.control` | `SuperScheduler.Scheduler` | Se asigna al montar; después de desmontar, es el control liberado |
| `controlRef` | `MutableRefObject<Scheduler \| null>` o `(control) => void` | Los objetos ref se asignan al montar y se vacían al desmontar; las funciones solo se llaman con el control al montar |
| `useSchedulerControl()` | `{ controlRef, control }` | `control` es estado de React: `null` hasta el montaje, después el control, y `null` tras desmontar |

El componente de `super-scheduler/react-render` acepta las mismas props, más `renderEvent`, `renderCell`, `renderRowHeader`, `renderTimeHeader`, `renderArea`, `renderCorner`, `eventHover`, los handlers `onBefore*DomAdd` y `onBefore*DomRemove`, y `renderOptions` (consulta [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()
}
```
### Tipos
| Tipo | Significado |
|---|---|
| `SchedulerProps` | Props de `SuperSchedulerComponent` |
| `SchedulerConfig` | Opciones que aceptan `new SuperScheduler.Scheduler()` y `control.update()` |
| `SchedulerOptions`, `SchedulerEventHandlers` | Las dos mitades de la configuración: opciones y handlers |
| `SchedulerApi` | La interfaz del control (con la misma forma que `SuperScheduler.Scheduler`) |
| `Scheduler...Args` | Una interfaz por handler, por ejemplo `SchedulerEventMoveArgs`, `SchedulerEventsChangeArgs` |
| `SuperScheduler.EventData<T>`, `SuperScheduler.ResourceData<T>` | Formas de los datos, genéricas sobre tus campos adicionales |
| `SchedulerCustomProps` | Ampliable con `declare module 'super-scheduler'` para tus propias props |

## Formas de los datos
### Eventos
`SuperScheduler.EventData<T>` no tiene firma de índice: declara los campos adicionales mediante el parámetro de tipo, por ejemplo `EventData<{ guest: string }>`.

| Campos | Tipo | Significado |
|---|---|---|
| `id`, `start`, `end`, `text` | `EventId`, `DateInput`, `DateInput`, `string` | Obligatorios. `end` es exclusivo salvo con `eventEndSpec: 'Date'` |
| `resource` | `ResourceId` | Fila del evento |
| `backColor`, `fontColor`, `borderColor`, `barColor`, `barBackColor` | `string` | Colores |
| `cssClass`, `padding`, `borderRadius`, `height` | `string`, `string \| number`, `string \| number`, `number` | Presentación |
| `html`, `htmlLeft`, `htmlRight` | `string` | HTML de confianza, nunca se escapa; escapa el texto del usuario con `SuperScheduler.Util.escapeHtml` |
| `toolTip`, `bubbleHtml`, `areas`, `contextMenu` | `string`, `string`, `AreaData[]`, `Menu` | Tooltip, contenido de la burbuja, áreas clicables, menú |
| `moveDisabled`, `resizeDisabled`, `moveHDisabled`, `moveVDisabled` | `boolean` | Bloqueos: cualquier movimiento, el cambio de tamaño, los movimientos horizontales, los cambios de fila |
| `clickDisabled`, `doubleClickDisabled`, `rightClickDisabled`, `deleteDisabled`, `moveSkipNonBusinessDisabled` | `boolean` | Exclusiones por evento |
| `hidden`, `barHidden` | `boolean` | Ocultan el evento o su barra de duración |
| `complete` | `number` | Porcentaje para `durationBarMode: 'PercentComplete'` |
| `line`, `minLine`, `sort` | `'dedicated' \| number`, `number`, `string[]` | Control del apilado |
| `tags` | `unknown` | Datos libres |

### Recursos
`SuperScheduler.ResourceData<T>` acepta campos adicionales.

| Campos | Tipo | Significado |
|---|---|---|
| `id`, `name` | `ResourceId`, `string` | Id y etiqueta de la fila |
| `children`, `expanded` | `ResourceData[]`, `boolean` | Filas de árbol (necesitan `treeEnabled`); los padres están plegados salvo con `expanded: true` |
| `frozen` | `'top' \| 'bottom'` | Fila fijada por encima o por debajo de las filas con scroll |
| `split` | `ResourceData[]` | Varias filas bajo una misma celda de cabecera |
| `columns` | `ResourceColumnData[]` | Celdas para `rowHeaderColumns`, por índice |
| `cellsDisabled` | `boolean` | Todas las celdas de la fila están deshabilitadas: rayadas, sin soltar, sin selección |
| `preventUsage` | `boolean` | Ni eventos ni selección en la fila |
| `cellsAutoUpdated` | `boolean` | Vuelve a ejecutar `onBeforeCellRender` para esta fila cuando cambian sus eventos |
| `minHeight`, `eventHeight`, `marginTop`, `marginBottom`, `maxLines`, `emptyHeight` | `number` | Geometría de la fila |
| `backColor`, `fontColor`, `cssClass`, `html`, `toolTip`, `bubbleHtml`, `ariaLabel`, `areas`, `contextMenu`, `tags` | varios | Presentación de la cabecera y datos |

### Vínculos, cabeceras, niveles de zoom y separadores
| Tipo | Campos |
|---|---|
| `LinkData` | `from`, `to` (ids de eventos), `id`, `type` (`'FinishToStart'` por defecto, `'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` (valores de opciones; cada uno puede ser una función de `{ date, level }`) |
| `SeparatorData` | `location`, `color`, `layer` (`'AboveEvents' \| 'BelowEvents'`), `opacity`, `width`, `cssClass`, `toolTip` |
| `TimelineData` | `start`, `end`, `width` (celdas para `scale: 'Manual'`) |

## Opciones
### Eje de tiempo
| Opción | Tipo | Por defecto | Notas |
|---|---|---|---|
| `startDate` | `DateInput` | hoy | Se trunca a medianoche |
| `days` | `number` | `1` | Longitud de la línea de tiempo |
| `scale` | `'CellDuration' \| 'Minute' \| 'Hour' \| 'Day' \| 'Week' \| 'Month' \| 'Year' \| 'Manual'` | `'CellDuration'` | `'Manual'` usa `timeline` |
| `cellDuration` | `number` (minutos) | `60` | Con `scale: 'CellDuration'` |
| `cellWidth` | `number` | `40` | Píxeles por celda de la escala actual |
| `cellWidthSpec` | `'Fixed' \| 'Auto'` | `'Fixed'` | `'Auto'` ajusta la línea de tiempo al ancho |
| `cellWidthMin` | `number` | `1` | |
| `timeHeaders` | `TimeHeaderData[]` | `[{ groupBy: 'Default' }, { groupBy: 'Cell' }]` | `'Default'` sigue a `cellGroupBy` |
| `cellGroupBy` | `GroupBy` | `'Day'` | |
| `headerHeight` | `number` | `30` | Por fila de cabecera |
| `timeFormat` | `'Auto' \| 'Clock12Hours' \| 'Clock24Hours'` | `'Auto'` | Solo las etiquetas de hora por defecto |
| `locale` | `string \| SuperScheduler.Locale` | `'en-us'` | Cualquier id de locale de `Intl` |
| `weekStarts` | `'Auto' \| number` | `'Auto'` | `0` es domingo |
| `eventEndSpec` | `'DateTime' \| 'Date'` | `'DateTime'` | `'Date'` hace inclusivos los finales que son solo fecha |
| `showNonBusiness` | `boolean` | `true` | `false` oculta los fines de semana (escala de días) o las horas no laborables |
| `businessBeginsHour`, `businessEndsHour` | `number` | `9`, `18` | |
| `businessWeekends` | `boolean` | `false` | |
| `cellsMarkBusiness` | `boolean` | `true` | |
| `showCurrentTimeHeader` | `boolean` | `false` | |
| `separators` | `SeparatorData[]` | `[]` | Marcas verticales de fecha |
| `timeline` | `TimelineData[]` | ninguno | Con `scale: 'Manual'` |
| `infiniteScrollingEnabled` | `boolean` | `false` | `infiniteScrollingMargin` `50`, `infiniteScrollingStepDays` `30` |
| `floatingTimeHeaders` | `boolean` | `true` | Etiquetas de cabecera fijas al desplazarse |
| `viewType` | `'Resources'` | `'Resources'` | `'Days'` y `'Gantt'` están reservados |
| `scrollX`, `scrollY` | `number` | ninguno | Scroll inicial en píxeles |

### Filas
| Opción | Tipo | Por defecto | Notas |
|---|---|---|---|
| `resources` | `ResourceData[]` | `[]` | |
| `treeEnabled` | `boolean` | `false` | Necesario para `children` |
| `treeIndent` | `number` | `20` | |
| `treeAutoExpand` | `boolean` | `true` | |
| `treePreventParentUsage` | `boolean` | `false` | Los padres no admiten eventos ni selección |
| `rowHeaderWidth` | `number` | `80` | |
| `rowHeaderWidthAutoFit` | `boolean` | `true` | Se ensancha hasta que caben los nombres; `rowHeaderWidthMin` `20`, `rowHeaderWidthMarginRight` `0` |
| `rowHeaderColumns` | `RowHeaderColumnData[]` | ninguno | Una columna que muestra `name` |
| `rowHeaderColumnsResizable` | `boolean` | `true` | `rowHeaderColumnDefaultWidth` `80`, `rowHeaderColumnsMergeParents` `true` |
| `rowHeaderColumnsReorderable` | `boolean` | `false` | Arrastrar los títulos de columna |
| `rowMinHeight`, `rowEmptyHeight` | `number` | `0`, ninguno | |
| `rowMarginTop`, `rowMarginBottom` | `number` | `0` | |
| `eventHeight` | `number` | `35` | Una línea de apilado |
| `eventMarginBottom` | `number` | `0` | |
| `rowFilterParentsAlwaysVisible` | `boolean` | `true` | |
| `rowSortingMode` | `'LeavesOnly' \| 'ParentsOnly' \| 'All'` | `'LeavesOnly'` | Lo usa `rows.sort()` |
| `selectedRows` | `string[] \| number[]` | `[]` | |
| `cornerText`, `cornerHtml` | `string` | `''`, ninguno | Celda superior izquierda |

### Eventos y edición
| Opción | Tipo | Por defecto | Notas |
|---|---|---|---|
| `events` | `EventData[]` | `[]` | Datos controlados; el control adopta el array y lo modifica en el sitio con splice |
| `defaultEvents` | `EventData[]` | ninguno | Datos iniciales no controlados, se leen una vez |
| `eventMoveHandling`, `eventResizeHandling` | `'Update' \| 'Notify' \| 'Disabled'` | `'Update'` | `'Disabled'` impide el gesto |
| `eventClickHandling` | `'Enabled' \| 'Select' \| 'ContextMenu' \| 'Bubble' \| 'Disabled'` | `'Enabled'` | `'Select'` alterna la selección |
| `eventDoubleClickHandling` | los mismos valores | `'Disabled'` | Un handler de doble clic retrasa los clics simples `doubleClickTimeout` (`300`) |
| `eventRightClickHandling` | los mismos valores | `'ContextMenu'` | |
| `eventSelectHandling` | `'Update' \| 'Disabled'` | `'Update'` | |
| `eventDeleteHandling` | `'Update' \| 'Disabled'` | `'Disabled'` | `'Update'` añade un botón de eliminar al pasar el puntero |
| `eventHoverHandling` | `'Bubble' \| 'Disabled'` | `'Bubble'` | Muestra `bubbleHtml` |
| `eventTapAndHoldHandling` | `'Move' \| 'ContextMenu' \| 'Disabled'` | `'Move'` | Táctil; `tapAndHoldTimeout` `300` |
| `allowEventOverlap` | `boolean` | `true` | `false` rechaza movimientos, cambios de tamaño y selecciones sobre tiempo ocupado |
| `conflictHighlight` | `boolean` | `false` | Marca los eventos que colisionan durante el arrastre |
| `useEventBoxes` | `'Always' \| 'Never' \| 'ShortEventsOnly'` | `'Always'` | `'Always'` dibuja los eventos sobre celdas completas |
| `eventMoveByCell` | `boolean` | `false` | Con `useEventBoxes: 'Never'` |
| `moveBy` | `'Full' \| 'Top' \| 'Left'` | `'Full'` | Zona desde la que se arrastra |
| `eventMoveMargin`, `eventResizeMargin` | `number` | `5` | |
| `eventMoveSkipNonBusiness`, `eventMoveToPosition` | `boolean` | `false` | |
| `snapToGrid` (y `...EventMoving`, `...EventResizing`, `...TimeRangeSelecting`, `...RectangleSelecting`) | `boolean` | `true` | |
| `dragCard` | `boolean \| DragCardOptions` | `true` | Tarjeta junto al puntero durante el arrastre |
| `headerMarker`, `resizeHandles` | `boolean` | `true` | |
| `autoScroll` | `'Drag' \| 'Always' \| 'Disabled'` | `'Drag'` | `autoScrollSpeed` `50`, `autoScrollDelay` `100` |
| `dragOutAllowed` | `boolean` | `false` | Arrastrar eventos a destinos externos |
| `floatingEvents` | `boolean` | `true` | Etiquetas de evento fijas al desplazarse |
| `eventMinWidth` | `number` | `1` | |
| `eventBorderRadius`, `eventPadding` | `string \| number` | ninguno | |
| `eventTextWrappingEnabled` | `boolean` | `false` | |
| `eventHtmlLeftMargin`, `eventHtmlRightMargin` | `number` | `10` | |
| `durationBarVisible` | `boolean` | `true` | `durationBarMode` `'Duration'` o `'PercentComplete'`; `durationBarHeight` ninguno |
| `eventStackingLineHeight` | `number` | `100` | |
| `showToolTip` | `boolean` | `true` | Tooltips nativos a partir de `toolTip` |
| `eventMovingStartEndEnabled`, `eventResizingStartEndEnabled`, `timeRangeSelectingStartEndEnabled` | `boolean` | `false` | Etiquetas junto a la sombra, con formato `'MMMM d, yyyy'` |
| `crosshairType` | `'Header' \| 'Full' \| 'Disabled'` | `'Header'` | |
| `xssProtection` | `'Enabled' \| 'Disabled'` | `'Enabled'` | Escapa `text`; `html` nunca se escapa |

### Selección
| Opción | Tipo | Por defecto | Notas |
|---|---|---|---|
| `timeRangeSelectedHandling` | `'Enabled' \| 'Hold' \| 'HoldForever' \| 'Disabled'` | `'Enabled'` | Clics y arrastres en celdas vacías; `'HoldForever'` mantiene la selección cuando el usuario hace clic en otro sitio |
| `timeRangeClickHandling` | `'Enabled' \| 'Disabled'` | `'Enabled'` | Clics en un rango seleccionado |
| `timeRangeDoubleClickHandling` | `'Enabled' \| 'Disabled'` | `'Disabled'` | |
| `timeRangeRightClickHandling` | `'ContextMenu' \| 'Enabled' \| 'Disabled'` | `'ContextMenu'` | |
| `allowMultiRange`, `multiRangeMode` | `boolean`, `'CtrlOrMeta' \| 'Always'` | `false`, `'CtrlOrMeta'` | Varios rangos de tiempo |
| `allowMultiSelect` | `boolean` | `true` | Varios eventos seleccionados |
| `eventMultiSelectRange` | `boolean` | `false` | Mayús+clic selecciona un bloque |
| `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 y nivel de detalle
| Opción | Tipo | Por defecto | Notas |
|---|---|---|---|
| `zoomLevels` | `ZoomLevel[]` | `[]` | |
| `zoom` | `number \| string` | ninguno | Nivel inicial: índice o `id` |
| `zoomPosition` | `'left' \| 'middle' \| 'right'` | `'left'` | Lo que se mantiene fijo al cambiar de nivel |
| `zoomGesture` | `boolean \| ZoomGestureOptions` | `true` | Ctrl o Cmd + rueda, pellizco; opciones `min`, `max` (`400`), `wheel` (`'ctrl'`), `pinch` (`true`), `sensitivity` (`1`), `scales` (`'zoomLevels'`), `link` |
| `lod` | `boolean \| LodOptions` | `true` | Nivel de detalle adaptativo |

### Tamaño y disposición
| Opción | Tipo | Por defecto | Notas |
|---|---|---|---|
| `height` | `number \| '100%'` | `600` | Altura total, cabeceras incluidas |
| `heightSpec` | `'Max' \| 'Fixed' \| 'Auto' \| 'Parent100Pct' \| 'Max100Pct'` | `'Max'` | `'Max'`: la altura del contenido, hasta `height` |
| `width` | `number` | ninguno | Llena el elemento anfitrión |
| `visible` | `boolean` | `true` | |

### Apariencia
| Opción | Tipo | Por defecto | Notas |
|---|---|---|---|
| `colorScheme` | `'inherit' \| 'light' \| 'dark' \| 'auto'` | `'inherit'` | Solo `'auto'` sigue la preferencia del sistema operativo |
| `density` | `'comfortable' \| 'compact' \| 'dense'` | ninguno | |
| `classNames`, `styles` | por slot (`root`, `event`, `cell`, `rowHeader`, ...) | `{}` | Clases o estilos en línea |
| `cssClass` | `string` | ninguno | Clase adicional en la raíz |
| `unstyled` | `boolean` | `false` | Solo la estructura |
| `theme` | `string` | ninguno | Añade clases `{theme}_*` |
| `nowLine` | `boolean \| { interval, label, cssClass }` | `false` | Intervalo de `60000` ms |
| `emptyState`, `errorState` | `ReactNode \| Node` | ninguno | Una cadena se muestra como texto |
| `loading` | `boolean` | ninguno | `loadingLabelText` `'Loading...'`, `loadingLabelVisible` `true` |
| `messageHideAfter`, `messageHideOnMouseOut`, `messageBarPosition` | `number`, `boolean`, `'Top' \| 'Bottom'` | `5000`, `true`, `'Top'` | Para `control.message()` |

### Vínculos
| Opción | Tipo | Por defecto | Notas |
|---|---|---|---|
| `links` | `LinkData[]` | `[]` | Se dibujan a partir de los datos |
| `linkShape` | `'Curved' \| 'RightAngled'` | `'Curved'` | |
| `linkLayer` | `'Above' \| 'Below'` | `'Above'` | |
| `linkWidth` | `'Auto' \| number` | `'Auto'` | |
| `linkBottomMargin` | `number` | `17` | |

### Teclado
| Opción | Tipo | Por defecto | Notas |
|---|---|---|---|
| `keyboardEnabled` | `boolean` | `false` | |
| `keyboardTarget` | `'document' \| 'component'` | `'document'` | |
| `keyboardMode` | `'SuperScheduler' \| 'Full'` | `'SuperScheduler'` | `'Full'` necesita `keyboardEnabled` |
| `keyboardOptions` | `{ pageRows, contextMenuKey, bubbleOnFocus, selectAll, zoomKeys }` | ninguno | `zoomKeys` vale `false` por defecto |

### Menús y burbujas
| Opción | Tipo | Por defecto |
|---|---|---|
| `contextMenu`, `contextMenuResource`, `contextMenuSelection`, `contextMenuLink` | `SuperScheduler.Menu` | ninguno |
| `bubble` | `SuperScheduler.Bubble` | una burbuja que muestra `bubbleHtml` |
| `cellBubble`, `resourceBubble`, `linkBubble` | `SuperScheduler.Bubble` | ninguno |
| `allowDefaultContextMenu` | `boolean` | `false` |

### Datos, carga y extensiones
| Opción | Tipo | Por defecto | Notas |
|---|---|---|---|
| `extensions` | `SchedulerExtension[]` | ninguno | Cargadores por rangos, historiales |
| `history` | objeto de historial | ninguno | Atajo para una extensión de historial |
| `dynamicLoading` | `boolean` | `false` | Con `onScroll` |
| `scrollDelayDynamic` | `number` | `500` | Tiempo sin scroll antes de `onScroll` |

### Contenido React
Solo con el `SuperSchedulerComponent` de `super-scheduler/react-render`:

| Prop | Argumentos | Devuelve |
|---|---|---|
| `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 }` (áreas con `render: true`) | `ReactNode` |
| `renderCorner` | `{ control }` | `ReactNode` |
| `eventHover` | `{ render, delay (350), leaveGrace (180), placement ('auto'), pin (false), glide (true) }` | |
| `renderOptions` | `{ retain, sliceMs (8) }` | |

## Callbacks
### Convenciones
- **Antes y después.** `onEventMove` se ejecuta antes de un cambio y puede cancelarlo; `onEventMoved` se ejecuta después. La mayoría de las parejas siguen este patrón.
- **Cancelación.** Los handlers cuyos argumentos tienen `preventDefault()` pueden cancelar: la familia de los clics, `onEventSelect`, `onEventDelete`, `onEventMove`, `onEventResize`, `onTimeRangeSelect`, `onTimeRangeClick` y sus variantes de doble clic y clic derecho, `onRectangleSelect`, `onRowClick` y sus variantes, `onRowSelect`, `onResourceExpand`, `onResourceCollapse`, `onTimeHeaderClick`, `onTimeHeaderRightClick`, `onGridMouseDown`, `onKeyDown`, `onKeyboardFocusChange` y `onLinkClick`. Cancelar un clic también omite su handler terminado en «-ed» y la acción posterior.
- **Confirmación asíncrona.** `onEventMove` y `onEventResize` admiten `args.async = true` y una llamada posterior a `args.loaded()`; `preventDefault()` antes de `loaded()` cancela, y los `newStart`, `newEnd` y `newResource` asignados antes de `loaded()` se aplican.
- **Guiado.** `onEventMoving`, `onEventResizing`, `onTimeRangeSelecting` y `onRectangleSelecting` se ejecutan en cada cambio de la sombra; asigna `args.allowed`, `args.start`, `args.end`, `args.cssClass` o `args.html`.

### Eventos
| Handler | Argumentos | Cancelación |
|---|---|---|
| `onEventClick`, `onEventClicked` | `{ e, div, control, originalEvent, ctrl, shift, meta }` | el primero |
| `onEventDoubleClick`, `onEventDoubleClicked` | `{ e, originalEvent }` | el primero |
| `onEventRightClick`, `onEventRightClicked` | `{ e, div, originalEvent }` | el primero |
| `onEventSelect`, `onEventSelected` | `{ e, selected, ctrl, meta }` | el primero |
| `onEventDelete`, `onEventDeleted` | `{ e, control }` | el primero |
| `onEventMouseEnter`, `onEventMouseLeave` | `{ e, div }` | no |
| `onEventFilter` | `{ e, filterParam, visible }`; asigna `visible = false` | no |
| `onEventsChange` | `{ events, changed, removed, reason }`, con `reason` igual a `'move'`, `'resize'`, `'create'`, `'remove'`, `'update'`, `'api'`, `'history'` o `'load'` | no |

`e` es un `SuperScheduler.Event`: `e.data` es el objeto de datos, y `e.id()`, `e.start()`, `e.end()`, `e.text()`, `e.resource()` y `e.duration()` lo leen.

### Arrastrar y redimensionar
| Handler | Argumentos | Cancelación y asincronía |
|---|---|---|
| `onEventMoving` | `{ e, start, end, duration, resource, row, allowed, allowOverlap, conflicts, message, cssClass, html, external, multimove, left, right, ctrl, shift, alt, meta }` | se guía con `allowed` |
| `onEventMove` | `{ e, newStart, newEnd, newResource, external, multimove, control, position, async, loaded() }` | `preventDefault()`, asíncrono |
| `onEventMoved` | los mismos valores, de solo lectura; el almacén ya contiene las nuevas horas | no |
| `onEventResizing` | `{ e, start, end, what, row, allowed, allowOverlap, conflicts, message, ... }` | se guía con `allowed` |
| `onEventResize` | `{ e, newStart, newEnd, what, multiresize, control, async, loaded() }` | `preventDefault()`, asíncrono |
| `onEventResized` | los mismos valores, de solo lectura | no |

### Rangos de tiempo y rectángulos
| Handler | Argumentos | Cancelación |
|---|---|---|
| `onTimeRangeSelecting` | `{ start, end, anchor, duration, resource, row, allowed, overlapping, ignoreDisabledCells, html, cssClass, button }` | se guía con `allowed` |
| `onTimeRangeSelect`, `onTimeRangeSelected` | `{ start, end, resource, control, origin, multirange }`, con `origin` igual a `'click'`, `'drag'`, `'keyboard'` o `'api'` | el primero |
| `onTimeRangeClick`, `onTimeRangeDoubleClick`, `onTimeRangeRightClick` (y sus «-ed») | `{ start, end, resource }`, sobre un rango ya seleccionado | el primero |
| `onRectangleSelecting` | `{ events, start, end, resources, visible }` | se guía con `visible` |
| `onRectangleSelect` | `{ events, start, end, resources, append }` | sí |
| `onRectangleSelected` | `{ events }` | no |
| `onGridMouseDown` | `{ action, originalEvent, button, ctrl, shift, meta }`; asigna `action = 'None'` | sí |

### Filas y cabeceras
| Handler | Argumentos | Cancelación |
|---|---|---|
| `onRowClick`, `onRowDoubleClick`, `onRowRightClick` (y sus «-ed») | `{ row, x, originalEvent, ctrl, shift, meta }` | el primero |
| `onRowSelect`, `onRowSelected` | `{ row, selected, ctrl, shift, meta }` | el primero |
| `onRowFilter` | `{ row, filterParam, visible, control }` | no |
| `onRowMouseOver`, `onRowMouseOut` | `{ row, div }` | no |
| `onResourceExpand`, `onResourceCollapse` | `{ resource }` | sí |
| `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 }` | el primero |
| `onTimeHeaderRightClick`, `onTimeHeaderRightClicked` | `{ header }` | el primero |
| `onCellMouseEnter`, `onCellMouseLeave` | `{ cell }` | no |

### Hooks de render
| Handler | Argumentos | Qué se cambia |
|---|---|---|
| `onBeforeEventRender` | `{ control, data }` | `data.backColor`, `fontColor`, `cssClass`, `html`, `areas`, `toolTip`, `height`, `hidden`... (una copia; `start` y `end` son `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 }` | Una copia del recurso, campos de layout incluidos |
| `onBeforeRowHeaderColumnRender` | `{ column }` | `html` del título de la columna, `cssClass`, `areas` |
| `onBeforeTimeHeaderRender` | `{ control, header }` | `header.html`, `text`, `cssClass`, `backColor`, `toolTip`, `areas` |
| `onBeforeCornerRender` | `{ control, html, areas }` | Contenido de la esquina |
| `onBeforeLinkRender` | `{ data, from, to }` | Color, grosor y estilo del vínculo, `cssClass` |
| `onIncludeTimeCell` | `{ cell: { start, end, visible, width } }` | Ocultar o redimensionar celdas de la línea de tiempo |
| `onAfterEventRender`, `onAfterCellRender` | `{ e, div }`, `{ cell, div }` | El nodo pintado |
| `onAfterRender`, `onAfterUpdate`, `onDimensionsChanged` | | Notificaciones del ciclo de vida |

### Otros handlers
| Handler | Argumentos |
|---|---|
| `onZoom` | `{ control, cellWidth, scale, cellDuration, phase, origin, anchor, viewportStart, level, lod }`, en cada fotograma del gesto |
| `onHistoryChange` | `{ canUndo, canRedo, undoLabel, redoLabel, cause }` |
| `onScroll` | `{ viewport, async, events, remove, clearEvents, loaded() }`, con `dynamicLoading` |
| `onKeyDown` | `{ originalEvent }`, cancelable |
| `onKeyboardFocusChange`, `onKeyboardFocusChanged` | `{ previous, focus }` |
| `onLinkClick`, `onLinkClicked` | `{ link, originalEvent }`, `{ link }` |

## API del control
El control es `ref.current.control`, el valor de `controlRef`, `args.control` en la mayoría de los handlers, o `new SuperScheduler.Scheduler(element, options)` seguido de `init()`.

### Ciclo de vida y visualización
| Miembro | Descripción |
|---|---|
| `init()` | Obligatorio una vez en los controles imperativos; `update()` antes de `init()` lanza una excepción |
| `update(options?)` | Aplica opciones y vuelve a pintar de forma síncrona; sin argumentos, hace un refresco completo |
| `dispose()`, `disposed()` | Liberación y su estado |
| `show()`, `hide()`, `setHeight(px)` | Visibilidad; `setHeight` cambia a `heightSpec: 'Fixed'` |
| `message(text, delayOrOptions?)` | Barra de mensajes dentro del control |
| `loadingStart(options?)`, `loadingStop()` | Etiqueta de carga |
| `clearSelection()` | Borra la selección de rango de tiempo |
| `dragInProgress()` | `true` durante un gesto |
| `levelOfDetail` | Estado actual del nivel de detalle |
| `history` | El historial conectado, o `null` |
| `moveRowHeaderColumn(from, to)` | Reordena las columnas de la cabecera de fila |
| `nav` | Los elementos `top`, `scroll`, `corner`, `timeHeader`, `message` y `loading` (`null` antes de `init()`) |
| `v` | Cadena de versión |

### Scroll y área visible
| Miembro | Descripción |
|---|---|
| `scrollTo(date \| px, animated?, position?)` | `animated`: `boolean`, ms, `'fast'`, `'normal'`, `'slow'` o `'linear'`; `position`: `'left'`, `'middle'`, `'right'` |
| `scrollToResource(id \| row)` | |
| `setScroll(x, y)`, `setScrollX(x)`, `setScrollY(y)`, `getScrollX()`, `getScrollY()` | Scroll en píxeles |
| `getViewPort()` | `{ start, end, resources, rows(), events() }` del área visible |
| `visibleStart()`, `visibleEnd()` | Inicio y final de la línea de tiempo, no del área visible |
| `getDate(px, precise?, isEnd?)`, `getCoords()` | Correspondencia con píxeles y con el puntero |
| `infinite.scrollTo(date)`, `infinite.shiftStart(days)` | Scroll infinito |

### Eventos
| Miembro | Descripción |
|---|---|
| `events.list` | El array de datos, por referencia |
| `events.add(event)` | Lanza una excepción si el id está duplicado |
| `events.update(event)` | Sustituye un evento cargado; no hace nada con un id desconocido |
| `events.remove(event \| id)` | |
| `events.find(id \| predicate)`, `events.findAll(predicate \| example)` | Búsquedas que devuelven `SuperScheduler.Event` |
| `events.all()`, `events.forRange(start?, end?)` | Todos los eventos, o los que se solapan con un rango (por defecto, el rango visible) |
| `events.filter(param)` | Ejecuta `onEventFilter` |
| `events.scrollIntoView(event)` | |

### Filas
| Miembro | Descripción |
|---|---|
| `rows.add(data)`, `rows.addChild(parent, data)`, `rows.update(row \| data)`, `rows.remove(row \| id)` | Cambios de filas |
| `rows.find(id \| predicate)`, `rows.all()`, `rows.visible()`, `rows.each(fn)` | Búsquedas que devuelven `SuperScheduler.Row` |
| `rows.expand(level?)`, `rows.expandAll()`, `rows.collapseAll()` | Estado del árbol |
| `rows.filter(param)` | Ejecuta `onRowFilter` |
| `rows.sort(spec?)`, `rows.sortParam` | Ordenación (`{ field, order }`) |
| `rows.selection.add/remove/clear/get/isSelected` | Selección de filas |

### Selección
| Miembro | Descripción |
|---|---|
| `multiselect.add/remove/clear/get/events/isSelected/redraw` | Selección de eventos |
| `multiselect.selectAll({ scope, filter })` | `scope` `'view'` (por defecto) o `'all'` |
| `multiselect.startRectangle()` | Prepara la selección por rectángulo |
| `multirange.add(selection)`, `multirange.get()`, `multirange.clear()` | Rangos de tiempo (`new SuperScheduler.Selection(start, end, resource)`) |
| `selectTimeRange(start, end, resource, dontFireEvent?)` | Selecciona un rango |

### Zoom, vínculos, celdas y teclado
| Miembro | Descripción |
|---|---|
| `zoom.active` | Índice del nivel activo (`-1` antes de que haya alguno) |
| `zoom.setActive(level, position?, anchorDate?)` | Aplica un nivel de inmediato |
| `zoom.animateTo({ level } \| { cellWidth }, { duration (300), position, anchorDate })` | Con animación; devuelve una promesa |
| `zoom.step(delta, options?)` | Un nivel, o un factor de 1,6 si no hay niveles |
| `links.list`, `links.add`, `links.update`, `links.remove`, `links.find`, `links.findByFromTo`, `links.findAllByFromTo` | Vínculos |
| `cells.all()`, `cells.find(start, resource)`, `cells.findXy(x, y)`, `cells.findByPixels(x, y)` | Celdas montadas |
| `keyboard.focusCell`, `focusEvent`, `getFocus`, `move`, `clearFocus`, `resetFocus` | Foco del teclado |

### Miembros estáticos
| Miembro | Descripción |
|---|---|
| `SuperScheduler.Scheduler.makeDraggable({ element, data, duration, ... })` | Arrastrar elementos DOM a la cuadrícula como eventos nuevos |
| `SuperScheduler.Scheduler.registerDropTarget({ element, onDrop, ... })` | Soltar eventos fuera de la cuadrícula (con `dragOutAllowed`) |
| `SuperScheduler.Scheduler.startDragging(options)`, `stopDragging()` | Arrastre externo programático |

## El namespace SuperScheduler
| Miembro | Descripción |
|---|---|
| `Date` | Fecha y hora civil: `today()`, `now()`, `parse(text, pattern, locale?)`, `fromYearMonthDay()`, `add*()`, `firstDayOf*()`, `getDatePart()`, `getDay()` (día del mes), `getDayOfWeek()`, `dayOfWeekISO()`, `weekNumberISO()`, `toString(pattern?, locale?)`, `toDate()`, `toDateLocal()`, `value`, `ticks`, `equals()` |
| `Duration` | Intervalo en milisegundos: `ofDays()`, `ofHours()`, `ofMinutes()`, `totalHours()`, `toString(pattern?)` |
| `Event` | Envoltorio de evento (`data`, `id()`, `start()`, `end()`, `text()`, `resource()`, `duration()`) |
| `Locale` | `register(locale)`, `find(id)`, `new Locale(id, fields)` |
| `Menu`, `Bubble` | Menús contextuales y burbujas al pasar el puntero (`show()`, `hide()`) |
| `Selection` | `new Selection(start, end, resource?)` |
| `Util` | `escapeHtml(text)`, `overlaps(start1, end1, start2, end2)` (semiabierto) |
| `ColorUtil` | `darker()`, `lighter()`, `contrasting()` |
| `Exception` | Se lanza cuando la API se usa mal |
| `guid()` | UUID v4 aleatorio |
| `Row`, `RenderRow`, `Link` | Los crea el control; léelos en los handlers |

## Módulos por subpath
### history
`createHistory(options?)` devuelve un historial que se pasa como `history={history}` o en `extensions`. Opciones: `limit` (`50`), `record` (`['move', 'resize']`), `keys` (`'root'`, `'document'` o `false`; por defecto `'root'`), `equals`, `fields`, `apply` (`'control'` o una función para eventos controlados) y `labels`. Métodos: `undo()`, `redo()`, `clear()`, `push({ label, undo, redo })`, `record({ ops, control })`, `batch(label, run)`, `revert(eventId)`, `subscribe(listener)`; propiedades `canUndo`, `canRedo`, `undoLabel`, `redoLabel`. Las cargas y los cambios rechazados no se registran.

### minimap
`createMinimap(control, container, options?)` y el componente React `<SchedulerMinimap control={control} />`. Opciones: `series` (por defecto `eventDensity(control)`), `height` (`28`), `peak` (`'relative'` o `'absolute'` con `max`), `tone`, `marks` (`today`, `months`, `past`, todos `true`), `range` y `labels`. El widget tiene `update()`, `refresh()` y `dispose()`.

### panes
`<SchedulerPanes>` recibe las props del scheduler, más `panes` (`{ id, resources or rowFilter, size, minSize (48), hidden, props }`), un `height` numérico obligatorio, `timeHeader` (`'first'`), `scrollbar` (`'last'`), `splitter` (`true`), `crossPaneMove` (`true`), `component`, `onPaneResize` y `panesRef`. `linkPanes(controls, { zoom, rowHeaderWidth })` vincula controles existentes y devuelve `{ dispose() }`.

### zoom-ui
`createZoomHud(control, { format, apiMs (700) })`, `createZoomSlider(control, container, { min, max, detents, scale ('log'), label })` y `createLodBadge(control, container, labels?)`. Cada uno devuelve `{ element, dispose() }`.

### views
`getViewState(control, include?)` devuelve un estado apto para JSON (`zoom`, `scroll`, `density`, `collapsed`, `columns`); `applyViewState(control, state, { animate, when, timeout })` (`when` es `'now'` o `'rows'`) devuelve una promesa de `boolean`.

### ranges
`createRangeLoader({ load, chunkDays (7), prefetch (1), cacheChunks (26), skeleton (true), onError })` devuelve un cargador con `reload(range?)`, `clear()` y `loading`. `load({ start, end, signal })` devuelve los eventos que se solapan con `[start, end)`.

### hooks
`useScheduler({ track })` devuelve `{ controlRef, control, state }` para los temas `'events'`, `'selection'`, `'zoom'`, `'viewport'` e `'history'`. `useSchedulerState(control, topic)`, `subscribeScheduler(control, topic, listener)` (devuelve una función para cancelar la suscripción) y `getSchedulerSnapshot(control, topic)` dan el mismo estado fuera del hook. El estado del área visible se publica cuando el scroll se detiene.

### react-render
`SuperSchedulerComponent` con las [props de contenido React](#options-react-render). Primero se pinta el HTML o el texto de respaldo; el contenido React lo sustituye cuando termina la interacción. `renderOptions.retain` vale por defecto el menor entre 2.000 y el doble de los elementos montados; `sliceMs`, `8`.

### tailwind
Un preset de Tailwind CSS v3: `presets: [require('super-scheduler/tailwind')]`. Añade colores, radios, sombras y transiciones `super-scheduler` asociados a los tokens CSS.

### datasets
`generateDataset(options)` y `generateScenario(id, overrides?)` crean datos deterministas de tipo hotel (`rows` y `days` obligatorios, `seed`, `start` en ticks, `density`, `events`, `times`). `toSuperSchedulerData(dataset)` devuelve `{ resources, events }`. Escenarios: `S1` (120 filas, 730 días), `S2` (1.000 filas, 730 días), `S3` (5.000 filas, 1.500 días) y sus variantes densas. Por defecto, los datos empiezan el 1 de enero de 2026.

### core
Utilidades sin DOM que comparte el motor: `SchedulerDate`, `Duration`, `registerLocale`, `resolveLocale`, `formatTicks`, `parseTicks`, `ticksFromParts(year, month, day, ...)`, `partsOf`, `formatIso`, `parseIso`, `todayTicks`, `nowTicks`, las constantes `MS_PER_*` y utilidades de líneas de tiempo, índices y layout. Úsalo para gráficos y herramientas que acompañan al scheduler.

## API de Lite
`super-scheduler-lite` es una línea de tiempo diaria de solo lectura. Las opciones que no implementa lanzan `SuperScheduler Lite: unsupported option "..."` en todos los builds.

| Opción | Tipo | Por defecto |
|---|---|---|
| `startDate` | `DateInput` | hoy |
| `days` | `number` (entero) | `31` |
| `scale` | `'Day'` | `'Day'` |
| `cellWidth` | `number` | `64` |
| `height` | `number` | `400` |
| `rowHeaderWidth` | `number` | `160` |
| `rowMinHeight` | `number` | `40` |
| `eventHeight` | `number` | `26` |
| `resources` | `{ id, name }[]` (plana) | `[]` |
| `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` | ninguno |
| `onTimeRangeClick` | `({ control, start, end, resource, originalEvent }) => void`, en cualquier celda vacía | ninguno |
| `controlRef` | objeto ref o `(control \| null) => void` | ninguno |

El control (`ref.current.control`) tiene `init()`, `update(options)`, `dispose()`, `disposed()`, `scrollTo(date)`, `scrollToResource(id)`, `visibleStart()` y `visibleEnd()`. El namespace tiene `SuperScheduler.Date` y `SuperScheduler.Scheduler`. Los `children`, `frozen`, `split` y `columns` de los recursos se rechazan. Tokens de tema en `.super-scheduler-lite`: `--super-scheduler-background`, `-text`, `-border`, `-header`, `-event` y `-focus`. Consulta [Migrar de Lite a Pro](https://superscheduler.org/es/docs/migrate-lite-to-pro/).

## APIs reservadas
Estos miembros tienen tipos para que el código existente compile, pero no están implementados en 0.1.0. No hacen nada, devuelven valores vacíos y muestran `super-scheduler: <feature> is not supported yet` una vez en los builds de desarrollo.

| Área | Reservado |
|---|---|
| Edición en línea | `eventEditHandling`, `eventEditMinWidth`, `rowEditHandling`, los valores `'Edit'` de las opciones de gestión de clics, `events.edit()`, `rows.edit()`, `Row.edit()`, `onEventEdit`, `onEventEdited`, `onEventEditKeyDown`, `onRowEdit`, `onRowEdited`, `onAfterEventEditRender` |
| Creación y movimiento de filas | `rowCreateHandling`, `rowCreateHeight`, `rowCreateHtml`, `rowCreateText`, `rowMoveHandling`, `rowMoveSameLevelOnly`, `rowDragHandleWidth`, `onRowCreate`, `onRowCreated`, `onRowMove`, `onRowMoved`, `onRowMoving`, `makeDraggableAsRow`, `registerRowDropTarget` |
| Creación interactiva de vínculos | `linkCreateHandling`, `linkDotSize`, `linkPointSize`, `onLinkCreate`, `onLinkCreated` (los vínculos se dibujan a partir de los datos de `links`) |
| Ida y vuelta al servidor y carga HTTP | Los valores de gestión `'CallBack'` y `'PostBack'` y las acciones de menú equivalentes, `backendUrl`, `eventsLoadMethod`, `rowsLoadMethod`, `linksLoadMethod`, `events.load()`, `rows.load()`, `links.load()`, `blockOnCallBack`, `notifyCommit`, `clientState`, `onCallBackStart`, `onCallBackEnd`, `onLoadNode` |
| Refresco automático | `autoRefreshEnabled`, `autoRefreshInterval`, `autoRefreshMaxCount`, `autoRefreshCommand`, `autoRefreshPause()`, `autoRefreshStart()`, `onAutoRefresh` |
| Exportación | `exportAs()`, `exceljs`, `onBeforeEventExport`, `onBeforeCellExport`, `onBeforeRowHeaderExport`, `onBeforeTimeHeaderExport`, `onBeforeCornerExport` |
| Versiones y agrupación de eventos | `eventVersionsEnabled`, `eventVersionHeight`, `eventVersionMargin`, `eventVersionPosition`, `eventVersionsReserveSpace`, `groupConcurrentEvents`, `groupConcurrentEventsLimit`, `groupBubble`, `onBeforeGroupRender`, `row.groups` |
| Recurrencia | `events.findRecurrent()` (devuelve `null`) |
| Vistas y layout | `viewType: 'Days'` y `'Gantt'` (se renderizan como `'Resources'`), `layout`, `rowHeaderScrolling`, `rowHeaderColumnsMode`, `rowHeaderHideIconEnabled`, `rows.headerHide()`, `rows.headerShow()`, `rows.headerToggle()`, `timeHeaderTextWrappingEnabled`, `sortDirections`, `syncResourceTree` |
| Otros | `api`, `eventBubbleShowForMargins`, `hideBorderFor100PctHeight`, `hideUntilInit`, `initEventEnabled`, `jointEventsMove`, `jointEventsResize`, `navigatorBackSync`, `overrideWheelScrolling`, `scrollStep`, `watchWidthChanges`, `range` y `range.all()` (usa `multirange`), `events.focus()`, `uiBlock()`, `uiUnblock()`, `onBeforeGridLineRender`, `onResourceHeaderClick`, `onResourceHeaderClicked`, `SuperScheduler.Navigator`, `Row.column(i).html(value)`, `onDomAdd` y `onDomRemove` de `Bubble` |

Implementado en parte:

- `treeAnimation` se acepta, pero la animación de despliegue nunca se reproduce.
- `eventClusters` y `onClusterClick` se aceptan y todavía no tienen ningún efecto visible.
- Los handlers `onBefore*DomAdd` y `onBefore*DomRemove`, las props `render*` y `eventHover` solo funcionan con el componente de `super-scheduler/react-render`; el componente raíz avisa y los ignora.

Indicaciones de ajuste que se aceptan pero se ignoran, porque la virtualización siempre está activada y se ajusta sola: `beforeCellRenderCaching`, `cellSweeping`, `cellSweepingCacheSize`, `drawBlankCells`, `dynamicEventRendering` y sus opciones de margen y caché, `eventUpdateInplaceOptimization`, `progressiveRowRendering`, `progressiveRowRenderingPreload` y las opciones `scrollDelay*` distintas de `scrollDelayDynamic`.
