SuperScheduler ist eine React-Bibliothek für interaktive Ressourcenplanung: eine schnelle, barrierefreie Zeitleiste, auf der Ihre Nutzer ziehen, die Dauer ändern, zoomen und rückgängig machen – zugeschnitten auf Ihr Geschäft, nicht umgekehrt.
SuperScheduler Pro wird erst geladen, wenn Sie es anfordern.
Eine Engine, Ihr Vokabular
Was organisieren Sie?
Dieselbe Oberfläche, drei Branchen. Ressourcen, Zeitskala, Beschriftungen und Aktionen richten sich nach der Aufgabe; die Engine darunter bleibt dieselbe.
SuperScheduler Pro wird erst geladen, wenn Sie es anfordern.
Zeit erkunden
Vom Quartal zur Viertelstunde.
Zoomen Sie stufenlos per Pinch-Geste, mit Ctrl/⌘ und Mausrad oder über die Schaltflächen unten. Kopfzeilen, Beschriftungen und Detailgrad passen sich der Skala an, und die Minimap behält die ganze Saison im Blick.
01Eine einzige Zeit-pro-Pixel-Skala: Zoomen löst nie ein React-Rendering aus.
02Zoomstufen, die Sie selbst definieren, jede mit eigenen Kopfzeilen.
03Die Minimap zeichnet jede Auslastung, die Ihre Anwendung berechnet.
Zur Skala springenQuartal · Monat · Woche · Tag · Stunden · 15 Min.
SuperScheduler Pro wird erst geladen, wenn Sie es anfordern.
Mit Ressourcen arbeiten
Teams, Räume und Maschinen – so geordnet, wie Sie sie im Kopf haben.
Ressourcen können eine flache Liste, ein mehrstufiger Baum oder eine Tabelle mit Spalten sein. Gruppieren Sie dieselben Personen nach Team oder Kompetenz, filtern Sie schon beim Tippen – die Zeitleiste bleibt dabei ausgerichtet.
1BaumzeilenElternzeilen klappen auf und zu; Kindzeilen behalten ihre eigenen Ereignisse.
2Spalten im ZeilenkopfSpalten mit anpassbarer Breite, gespeist aus Ihren Ressourcendaten.
3FilterZeilen und Ereignisse werden über Callbacks gefiltert, die Sie selbst schreiben.
Sicher handeln
Verschieben. Callback lesen. Rückgängig machen.
Jede Geste erreicht Ihren Code als typisierter Callback – während sie passiert und nachdem sie abgeschlossen ist. Lehnen Sie eine Verschiebung mit Begründung ab, bestätigen Sie sie mit Ihrem Server oder lassen Sie sie zu. Der Verlauf ist nur einen Import entfernt.
SuperScheduler Pro wird erst geladen, wenn Sie es anfordern.
1Ziehen Sie eine Buchung in einen anderen Raum oder auf einen anderen Tag.
2Versuchen Sie, eine Buchung in den Raum zu ziehen, der gerade gewartet wird.
3Klicken Sie auf Rückgängig oder drücken Sie Ctrl/⌘ + Z im Scheduler.
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'importtype { SchedulerProps } from'super-scheduler'import { hitsMaintenance } from'../data/bookings'importtype { CallbackRecord } from'../callback-log'typeLog= (record:Omit<CallbackRecord,'seq'>) =>voidexportfunctioncreateBookingHandlers(log:Log, refusal:string):Partial<SchedulerProps> {return {// Visual and enforced: the library refuses drops on disabled cells.onBeforeCellRender: (args) => {const { resource,start,end } =args.cellif (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 =falseargs.message = refusal } },// Before the commit: the last word, e.g. after asking a server.onEventMove: (args) => {constrefused=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, }, }), }}exportfunctionisBookingEvent( event:SuperScheduler.EventData,): event isSuperScheduler.EventData<{ client:string }> {return'client'in event &&typeofevent.client ==='string'}
Passt in Ihr Produkt
Ihre Daten und Ihre Regeln – auf einer Zeitleiste, die Sie nicht selbst bauen müssen.
Eine Komponente, typisierte Props und Callbacks. Die Bibliothek übernimmt Rendering, Gesten, Virtualisierung und Barrierefreiheit; Ihre Anwendung verantwortet Daten, Validierung und Persistenz.
SuperScheduler
Rendert Ressourcen und Ereignisse, in beide Richtungen virtualisiert.
Meldet vorgeschlagene Änderungen und übernimmt die akzeptierten.
Ihre Anwendung
Hält den Zustand, validiert und speichert auf dem Server.
src/BookingBoard.tsxtsx
import { useMemo, useState } from'react'import { SuperSchedulerComponent } from'super-scheduler'importtype { SchedulerEventsChangeArgs, SuperScheduler } from'super-scheduler'typeBooking=SuperScheduler.EventData<{ locked?:boolean }>exportfunctionBookingBoard({ rooms, initial,}: { rooms:SuperScheduler.ResourceData[] initial:Booking[]}) {// Your state is the source of truth; the scheduler gets a copy it may mutate.const [bookings,setBookings] =useState(initial)constevents=useMemo(() =>bookings.slice(), [bookings])return ( <SuperSchedulerComponentstartDate="2026-10-01"days={31}scale="Day"resources={rooms}events={events}allowEventOverlap={false}// While dragging: explain why a drop is not allowed.onEventMoving={(args) => {if ('locked'inargs.e.data &&args.e.data.locked ===true) {args.allowed =falseargs.message ='This booking is confirmed and locked.' } }}// Before the commit: ask your server, then accept or cancel.onEventMove={(args) => {args.async =truesaveBooking({ id:String(args.e.id()), resource:String(args.newResource), start:args.newStart.value, end:args.newEnd.value, }).then( () =>args.loaded(), () => {args.preventDefault()args.loaded() }, ) }}onEventsChange={({ events: next }:SchedulerEventsChangeArgs) =>setBookings([...next])} /> )}
SuperScheduler
Bindet React-Inhalte in Ereignisse und Kopfzeilen ein – beibehalten und gebündelt.
Ihre Anwendung
Entscheidet, wie eine Buchung oder eine Zeile aussieht.
src/RichPlanning.tsxtsx
import { SuperSchedulerComponent } from'super-scheduler/react-render'importtype { SuperScheduler } from'super-scheduler'import'super-scheduler/styles.css'interfaceStay { guest:string nights:number paid:boolean}/** Event data comes back untyped from the engine: read your fields explicitly. */functionreadStay(data:object):Stay|null {if (!('guest'in data) ||!('nights'in data) ||!('paid'in data)) returnnullconst { guest,nights,paid } = datareturntypeof guest ==='string'&&typeof nights ==='number'&&typeof paid ==='boolean'? { guest, nights, paid }:null}exportfunctionRichPlanning({ rooms, stays,}: { rooms:SuperScheduler.ResourceData[] stays:SuperScheduler.EventData<Stay>[]}) {return ( <SuperSchedulerComponentstartDate="2026-10-01"days={30}scale="Day"resources={rooms}events={stays}// React content inside each event; width is quantized, so it re-renders rarely.renderEvent={({ e, width }) => {conststay=readStay(e.data)if (stay ===null) returne.text()return ( <spanclassName="stay"> <strong>{stay.guest}</strong> {width >=120? <small>{stay.nights} nights</small> :null} {stay.paid ?null: <spanclassName="stay__due">Due</span>} </span> ) }}eventHover={{ pin:'click',render: ({ e, close }) => {conststay=readStay(e.data)return stay ===null?null: <StayCardstay={stay} onClose={close} /> }, }} /> )}functionStayCard({ stay, onClose }: { stay:Stay; onClose: () =>void }) {return ( <sectionaria-label={stay.guest}> <h3>{stay.guest}</h3> <p> {stay.nights} nights · {stay.paid ?'Paid':'Payment due'} </p> <buttontype="button"onClick={onClose}> Close </button> </section> )}
SuperScheduler
Stellt die Tokens --super-scheduler-* bereit und folgt Ihrem Dark Mode.
Ihre Anwendung
Wählt Farben, Eckenradien und Dichte.
theme.csscss
/* planning.css: the scheduler follows your tokens and your dark mode. */.planning { --super-scheduler-accent-rgb:25 97 68; --super-scheduler-surface:#fcfaf6; --super-scheduler-border:#ddd8d2; --super-scheduler-event-radius:7px; --super-scheduler-today-bg:rgb(25 97 68 / 0.06); --super-scheduler-selection:rgb(25 97 68 / 0.12);font-family:'Geist', system-ui, sans-serif;}[data-theme='dark'] .planning { --super-scheduler-accent-rgb:110 214 166; --super-scheduler-surface:#16181c; --super-scheduler-border:#2e3134;}.planning.super-scheduler__event[data-selected='true'] {outline:2px solid rgb(var(--super-scheduler-accent-rgb));}
Im Look Ihres Produkts
Echte Tokens, echter Kontrast, CSS zum Kopieren.
Diese Einstellungen ändern die CSS Custom Properties --super-scheduler-*, die von der Bibliothek ausgelesen werden. Die Kontrastprüfung nutzt die Kontrastverhältnisse nach WCAG 2; das CSS unten ist genau das, was Sie in Ihr Stylesheet einfügen.
Ist es eine React-Komponente oder eine Framework-unabhängige Engine?+
Beides. SuperSchedulerComponent ist der React-Wrapper für React 18 und 19; darunter übernimmt eine DOM-Engine Scrollen, Zoom und Gesten ganz ohne React-Renderings. Sie können den Scheduler auch imperativ mit new SuperScheduler.Scheduler(element, options) einbinden.
Die Deklarationen werden mit dem Paket ausgeliefert. Optionen, Callbacks und Steuerungsmethoden sind typisiert, und Ereignisdaten sind generisch: EventData<YourFields> hält Ihre eigenen Felder in Handlern und Render-Hooks typisiert.
Ja. Farben, Eckenradien, Dichte und Dark Mode kommen aus dokumentierten CSS Custom Properties; classNames und styles erreichen einzelne Bestandteile; React-Render-Slots ersetzen den Inhalt von Ereignissen, Zeilen und Kopfzeilen.
Wer speichert die Daten, und wer verhindert Konflikte?+
Ihre Anwendung. Der Scheduler zeigt und bearbeitet, was Sie ihm übergeben, und meldet jede Änderung über Callbacks. Persistenz, Berechtigungen und das letzte Wort bei Konflikten liegen bei Ihrem Backend; die Bibliothek hilft mit Überlappungsschutz, gesperrten Zellen und begründeten Ablehnungen.
Als privates, versioniertes .tgz über HTTPS, das npm wie jede URL-Abhängigkeit installiert. Der Download-Schlüssel steht in Ihrem Manifest und Lockfile, behandeln Sie ihn also als Geheimnis. Lite ist ein ganz normales öffentliches npm-Paket.
Lässt er sich mit Tastatur und Screenreader bedienen?+
Pro hat einen vollständigen Tastaturmodus: Pfeiltasten bewegen den Fokus, Eingabe aktiviert, Alt+Pfeiltasten verschieben Ereignisse, und Änderungen werden assistiven Technologien angesagt – auf Deutsch, Englisch, Spanisch, Französisch und in fünf weiteren Sprachen. Auch Lite unterstützt Tastaturnavigation.
Pro reicht von Monaten bis hinunter zu 5-Minuten-Zellen, blendet auf Wunsch Nächte oder Wochenenden aus und wechselt die Skala stufenlos. Lite ist eine Tageszeitleiste.
Was ist mit Zeitzonen und wiederkehrenden Ereignissen?+
Datumswerte sind Kalenderdaten mit Uhrzeit, wie sie auf der Wanduhr stehen – bewusst ohne Zeitzone. Rechnen Sie zonierte Zeitpunkte um und expandieren Sie Wiederholungen in Ihrer Anwendung, bevor Sie die Ereignisse an den Scheduler übergeben.