Saltar al contenido
SuperScheduler

Planificación de recursos para Reactv0.1.0

Cada recurso.Cada minuto.Tu producto.

SuperScheduler es una librería React para planificación interactiva de recursos: una línea de tiempo rápida y accesible donde tus usuarios arrastran, redimensionan, hacen zoom y deshacen, adaptada a tu negocio y no al revés.

  • React 18 y 19
  • Tipos TypeScript incluidos
  • Sin dependencias en tiempo de ejecución
  • Lite en npm · Pro por tarball privado
Framehouse
PlatósPlató A · CicloramaPlató B · Set de cocinaPosproducciónEdición 1Edición 2Sala de etalonajeSala de mezclaEquiposUnidad de cámara 1Unidad de cámara 2Campaña de primavera · Montaje offlineDocumental del puerto · Montaje offlineCampaña de primavera · EtalonajeSpot de cocina · EtalonajeCampaña de primavera · MezclaSpot de cocina · RodajeSpot de cocina · RodajeInstalaciones · Mantenimiento de riggingSpot de cocina · Convocatoria de equipoSpot de cocina · Convocatoria de equipoSpot de cocina · Montaje offlineDocumental del puerto · RodajeDocumental del puerto · Convocatoria de equipomartes, 13 de octubremiércoles, 14 de octubrejueves, 15 de octubreviernes, 16 de octubre08:0012:0016:0008:0012:0016:0008:0012:0016:0008:0012:0016:00

Carga SuperScheduler Pro solo cuando lo pides.

Un motor, tu vocabulario

¿Qué estás organizando?

La misma superficie, tres negocios. Cambian los recursos, la escala, los textos y las acciones; el motor que hay debajo es el mismo.

Abrir el ejemplo de agencia
DiseñoInés G.Marc D.Yuki T.RedacciónLena F.Omar S.MotionSara N.Teo R.Sistema de marcaKey visual del lanzamientoMaquetas del lanzamientoKit para tiendasMoodboard de tiendasSet de iconosGuion del lanzamientoTextos del lanzamientoClaims para tiendasPieza audiovisualAnimación del logoBucles para tiendas12 oct19 octlun 12mar 13mié 14jue 15vie 16sáb 17dom 18lun 19mar 20mié 21jue 22vie 23sáb 24dom 25

Carga SuperScheduler Pro solo cuando lo pides.

Explorar el tiempo

Del trimestre al cuarto de hora.

Haz zoom continuo con un pellizco, Ctrl/⌘ y la rueda o los botones de abajo. Cabeceras, etiquetas y nivel de detalle se adaptan a la escala, y el minimapa mantiene toda la temporada a la vista.

  1. 01Una única escala de tiempo por píxel: el zoom nunca vuelve a renderizar React.
  2. 02Niveles de zoom definidos por ti, cada uno con sus cabeceras.
  3. 03El minimapa dibuja la carga que calcule tu aplicación.
Saltar a una escalaTrimestre · Mes · Semana · Día · Horas · 15 min
Pabellón norteSala ASala BSala CPabellón surEstudio 1Estudio 2TerrazaMontajeExposiciónAcreditacionesPonencia inauguralPausa caféMesa redondaComidaMesa redondaMontajeExposiciónMontajeExposiciónCongresoMontajeExposiciónMontajeExposiciónTallerMontajeExposiciónCongresoMontajeExposiciónCongresoCongresoCongresoCongresoTallerCongresoCongresoSesión paralelaSesión paralelaTallerCongresoTallerCongresoCongresoCongresoCongresoTallerCongresoTallerCongresoSesión paralelaSesión paralelaSesión paralelaCongresoCongresoCongresoTallerCongresoTallerTallerCongresoMontajeExposiciónCongresoTallerMontajeExposiciónTallerMontajeCongresoCongresoCongresoTallerCongresoCongresoComidaTallerCongresoCongresoCongresoCongreso1 oct5 oct12 oct19 oct26 oct2 nov1234567891011121314151617181920212223242526272829303112345

Carga SuperScheduler Pro solo cuando lo pides.

Pellizca o usa Ctrl/⌘ + rueda sobre la línea de tiempo para hacer zoom alrededor del puntero.

Agrupar porEquipo
MarcaAna P.DiseñoJonas K.MotionMei L.DiseñoRafa D.ProducciónProductoNoor H.IngenieríaLuca B.IngenieríaIris V.DiseñoTom S.ProducciónEstudioEva M.MotionKofi A.MotionLia R.DiseñoMax W.IngenieríaRelanzamiento AtlasCampaña NimbusRelanzamiento AtlasRelanzamiento AtlasApp HarborCampaña NimbusApp HarborCampaña NimbusRelanzamiento AtlasApp HarborCampaña NimbusCampaña NimbusApp HarborRelanzamiento AtlasCampaña NimbusRelanzamiento AtlasApp HarborCampaña NimbusRelanzamiento AtlasApp HarborApp HarborCampaña NimbusRelanzamiento AtlasApp HarborRelanzamiento AtlasCampaña NimbusApp Harbor12 oct19 oct26 oct12131415161718192021222324252627282930311

Carga SuperScheduler Pro solo cuando lo pides.

Trabajar con recursos

Equipos, salas y máquinas, ordenados como tú los piensas.

Los recursos pueden ser una lista plana, un árbol de varios niveles o una tabla con columnas. Reagrupa a las mismas personas por equipo o por especialidad, filtra mientras escribes y la línea de tiempo sigue alineada.

  1. 1Filas en árbolLos padres se pliegan y despliegan; los hijos conservan sus eventos.
  2. 2Columnas en la cabeceraColumnas redimensionables que leen tus datos de recursos.
  3. 3FiltrosFilas y eventos se filtran mediante callbacks que escribes tú.

Actuar con confianza

Muévelo. Lee el callback. Deshazlo.

Cada gesto llega a tu código como un callback tipado mientras ocurre y cuando termina. Rechaza un movimiento con un motivo, confírmalo con tu servidor o déjalo pasar. El historial está a un import de distancia.

Cerrado por mantenimiento acústico: Estudio 4
Estudio 1Estudio 2Estudio 3Estudio 4Estudio 5Estudio 6Night FerryCopper BloomLumen ChoirNight FerryHalcyonCopper BloomLumen ChoirHalcyonStatic OrchardStatic OrchardHalcyon12 oct19 octlun 12mar 13mié 14jue 15vie 16sáb 17dom 18lun 19mar 20mié 21jue 22vie 23sáb 24dom 25

Carga SuperScheduler Pro solo cuando lo pides.

  1. 1Arrastra una reserva a otra sala u otro día.
  2. 2Intenta soltar una en la sala en mantenimiento.
  3. 3Pulsa Deshacer, o Ctrl/⌘ + Z dentro del tablero.
Handler: act-handlers.ts
act-handlers.tsts
/**
 * Booking-board handlers of the "act with confidence" demo. This file is shown on the page as
 * the code that runs: the library proposes, these handlers decide, React state persists.
 */
import { type SuperScheduler } from 'super-scheduler'
import type { SchedulerProps } from 'super-scheduler'
import { hitsMaintenance } from '../data/bookings'
import type { CallbackRecord } from '../callback-log'

type Log = (record: Omit<CallbackRecord, 'seq'>) => void

export function createBookingHandlers(log: Log, refusal: string): Partial<SchedulerProps> {
  return {
    // Visual and enforced: the library refuses drops on disabled cells.
    onBeforeCellRender: (args) => {
      const { resource, start, end } = args.cell
      if (hitsMaintenance(String(resource), start.value, end.value))
        args.cell.properties.disabled = true
    },

    // While dragging: explain the refusal next to the pointer.
    onEventMoving: (args) => {
      if (hitsMaintenance(String(args.resource), args.start.value, args.end.value)) {
        args.allowed = false
        args.message = refusal
      }
    },

    // Before the commit: the last word, e.g. after asking a server.
    onEventMove: (args) => {
      const refused = hitsMaintenance(
        String(args.newResource),
        args.newStart.value,
        args.newEnd.value,
      )
      if (refused) args.preventDefault()
      log({
        name: 'onEventMove',
        args: {
          'e.id()': String(args.e.id()),
          'e.text()': args.e.text(),
          newResource: String(args.newResource),
          newStart: args.newStart.value,
          newEnd: args.newEnd.value,
        },
        ...(refused ? { refused: refusal } : {}),
      })
    },

    onEventMoved: (args) =>
      log({
        name: 'onEventMoved',
        args: {
          'e.id()': String(args.e.id()),
          newResource: String(args.newResource),
          newStart: args.newStart.value,
          newEnd: args.newEnd.value,
        },
      }),

    onEventResized: (args) =>
      log({
        name: 'onEventResized',
        args: {
          'e.id()': String(args.e.id()),
          what: args.what,
          newStart: args.newStart.value,
          newEnd: args.newEnd.value,
        },
      }),
  }
}

export function isBookingEvent(
  event: SuperScheduler.EventData,
): event is SuperScheduler.EventData<{ client: string }> {
  return 'client' in event && typeof event.client === 'string'
}

Encaja en tu producto

Tus datos y tus reglas, sobre una línea de tiempo que no tienes que construir.

Un componente, props tipadas y callbacks. La librería se ocupa del render, los gestos, la virtualización y la accesibilidad; tu aplicación, de los datos, la validación y la persistencia.

SuperScheduler
Pinta recursos y eventos, virtualizados en ambas direcciones.
Tu aplicación
Aporta los datos y decide la ventana de tiempo.
src/Planning.tsxtsx
import { SuperSchedulerComponent } from 'super-scheduler'
import type { SuperScheduler } from 'super-scheduler'
import 'super-scheduler/styles.css'

const rooms: SuperScheduler.ResourceData[] = [
  { id: 'studio-a', name: 'Studio A' },
  { id: 'studio-b', name: 'Studio B' },
]

const bookings: SuperScheduler.EventData[] = [
  {
    id: 'shoot-01',
    resource: 'studio-a',
    text: 'Product shoot',
    start: '2026-10-02',
    end: '2026-10-04',
  },
  {
    id: 'edit-01',
    resource: 'studio-b',
    text: 'Edit',
    start: '2026-10-04T09:00:00',
    end: '2026-10-04T17:00:00',
  },
]

export function Planning() {
  return (
    <div style={{ height: 480 }}>
      <SuperSchedulerComponent
        startDate="2026-10-01"
        days={14}
        scale="Day"
        cellWidth={56}
        timeHeaders={[{ groupBy: 'Month' }, { groupBy: 'Day', format: 'd' }]}
        height="100%"
        resources={rooms}
        events={bookings}
      />
    </div>
  )
}

Vístelo como tu producto

Tokens reales, contraste real, copia el CSS.

Estos controles cambian las propiedades --super-scheduler-* que lee la librería. La comprobación de contraste usa los ratios de WCAG 2; el CSS de abajo es el que pegas en tu hoja de estilos.

Acento
Superficie
Radio de los eventos7 px
Estilo de evento
Densidad
Vista previa
Contraste del texto del evento8,5:1Cumple AA para texto normal
Estudio 1Estudio 2Estudio 3Estudio 4Estudio 5Night FerryCopper BloomLumen ChoirNight FerryHalcyonCopper BloomLumen ChoirHalcyonStatic Orchard12 oct19 octlun 12mar 13mié 14jue 15vie 16sáb 17dom 18lun 19mar 20mié 21

Carga SuperScheduler Pro solo cuando lo pides.

Tu tema.css
/* SuperScheduler theme (light). Put the class on the element that wraps the scheduler, */
/* and pass density="comfortable" to SuperSchedulerComponent. */
.my-planning {
  --super-scheduler-accent-rgb: 25 97 68;
  --super-scheduler-surface: #fcfaf6;
  --super-scheduler-surface-raised: #f6f3ee;
  --super-scheduler-text: #161b22;
  --super-scheduler-text-muted: #4a5058;
  --super-scheduler-border: #ddd8d2;
  --super-scheduler-row-line: #ddd8d2;
  --super-scheduler-grid-line: #e9e6e0;
  --super-scheduler-selection: rgb(25 97 68 / 0.12);
  --super-scheduler-selection-border: rgb(25 97 68 / 0.75);
  --super-scheduler-focus-ring: rgb(25 97 68 / 0.5);
  --super-scheduler-today-bg: rgb(25 97 68 / 0.06);
  --super-scheduler-weekend-bg: rgb(0 0 0 / 0.025);
  --super-scheduler-hover-cell: rgb(25 97 68 / 0.06);
  --super-scheduler-hover-row: rgb(25 97 68 / 0.03);
  --super-scheduler-event-radius: 7px;
  --super-scheduler-event-bg: #dee6df;
  --super-scheduler-event-border: #b3c9bd;
  --super-scheduler-event-text: #124631;
  --super-scheduler-event-bar: #196144;
}

Ejemplos

Cada ejemplo tiene su modelo de datos, sus reglas, su misión y su código fuente. Seis para empezar:

Ver los doce ejemplos

Lite y Pro

Empieza con una línea de tiempo de solo lectura. Crece hasta un producto de planificación.

Ambas ediciones comparten el modelo de datos, el manejo de fechas civiles, la virtualización y el teclado. Pro añade todo lo que cambia el plan.

Lite

Gratis en npm

Para tableros de disponibilidad, vistas de ocupación y pantallas de planificación de solo lectura.

  • Línea de tiempo diaria con recursos planos
  • Eventos con colores y apilado de solapes
  • Callbacks de clic en eventos y celdas
  • Navegación por teclado y virtualización en 2D
  • Sin límite de recursos ni de eventos

npm install super-scheduler-lite

Pro

499 € al año

Para productos donde las personas mueven, redimensionan y deciden sobre la propia línea de tiempo.

  • Arrastrar, redimensionar, validar y avisar de conflictos
  • Horas, minutos y zoom continuo
  • Árboles de recursos, columnas, filas fijas y divididas
  • Dependencias, multiselección, deshacer y rehacer
  • Minimapa, paneles, vistas guardadas, carga por rangos, slots de renderizado React

Tarball privado y versionado por HTTPS

Comparar las ediciones en detalle

Antes de decidir

Lo que preguntan los equipos antes de adoptarlo

¿Es un componente React o un motor independiente del framework?

Las dos cosas. SuperSchedulerComponent es el envoltorio React para React 18 y 19; debajo, un motor DOM gestiona el scroll, el zoom y los gestos sin renders de React. También puedes montarlo de forma imperativa con new SuperScheduler.Scheduler(elemento, opciones).

Integración con React →
¿Qué tal son los tipos de TypeScript?

Las declaraciones vienen con el paquete. Opciones, callbacks y métodos del control están tipados, y los datos de evento son genéricos: EventData<TusCampos> mantiene tipados tus propios campos en handlers y hooks de render.

Recursos, eventos e intervalos →
¿Puede parecerse al resto de nuestro producto?

Sí. Colores, radios, densidad y modo oscuro salen de propiedades CSS documentadas; classNames y styles llegan a cada parte; los slots de renderizado React sustituyen el contenido de eventos, filas y cabeceras.

Guía de temas →
¿Quién guarda los datos y quién evita los conflictos?

Tu aplicación. El scheduler muestra y edita lo que le das e informa de cada cambio mediante callbacks. La persistencia, los permisos y la última palabra sobre los conflictos son de tu backend; la librería ayuda con la prevención de solapes, las celdas bloqueadas y los rechazos con motivo.

Eventos controlados y callbacks →
¿Cómo se distribuye Pro?

Como un .tgz privado y versionado por HTTPS que npm instala como cualquier dependencia por URL. La clave de descarga aparece en tu manifiesto y en el lockfile, así que trátala como un secreto. Lite es un paquete público normal de npm.

Instalar Pro →
¿Se puede usar con teclado y lectores de pantalla?

Pro tiene un modo de teclado completo: las flechas mueven el foco, Intro activa, Alt+flechas mueve eventos y los cambios se anuncian a las tecnologías de apoyo en español, inglés, francés, alemán y cinco idiomas más. Lite también admite navegación por teclado.

Teclado y accesibilidad →
¿Maneja horas y minutos o solo días?

Pro va de meses a celdas de 5 minutos, oculta noches o fines de semana cuando se lo pides y cambia de escala de forma continua. Lite es una línea de tiempo diaria.

Horas, minutos, días y zoom →
¿Y las zonas horarias y los eventos recurrentes?

Las fechas son valores civiles de reloj de pared, sin zona horaria a propósito. Convierte los instantes con zona y expande las recurrencias en tu aplicación antes de pasar los eventos al scheduler.

Idiomas, fechas y zonas horarias →