SuperScheduler est une bibliothèque React de planification interactive de ressources : une frise rapide et accessible où vos utilisateurs glissent, redimensionnent, zooment et annulent, pensée pour votre métier et non l’inverse.
SuperScheduler Pro n’est chargé que lorsque vous le demandez.
Un moteur, votre vocabulaire
Qu’organisez-vous ?
La même surface, trois métiers. Les ressources, l’échelle de temps, les libellés et les actions changent avec l’activité ; le moteur, lui, reste le même.
DesignInés G.Marc D.Yuki T.RédactionLena F.Omar S.MotionSara N.Teo R.Système de marqueVisuel clé du lancementMaquettes du lancementKit magasinsMoodboard magasinsJeu d’icônesScript du lancementTextes du lancementAccroches magasinsFilm de lancementAnimation du logoBoucles magasins12 oct.19 oct.lun. 12mar. 13mer. 14jeu. 15ven. 16sam. 17dim. 18lun. 19mar. 20mer. 21jeu. 22ven. 23sam. 24dim. 25
SuperScheduler Pro n’est chargé que lorsque vous le demandez.
Explorer le temps
Du trimestre au quart d’heure.
Zoomez en continu d’un pincement, avec Ctrl/⌘ et la molette, ou avec les boutons ci-dessous. En-têtes, libellés et niveau de détail s’adaptent à l’échelle, et la minimap garde toute la saison en vue.
01Une seule échelle temps-par-pixel : zoomer ne provoque jamais de nouveau rendu React.
02Des niveaux de zoom que vous définissez, chacun avec ses propres en-têtes.
03La minimap dessine n’importe quelle charge calculée par votre application.
Aller à une échelleTrimestre · Mois · Semaine · Jour · Heures · 15 min
SuperScheduler Pro n’est chargé que lorsque vous le demandez.
Travailler avec les ressources
Équipes, salles et machines, organisées comme vous les pensez.
Les ressources peuvent former une liste plate, une arborescence à plusieurs niveaux ou un tableau à colonnes. Regroupez les mêmes personnes par équipe ou par compétence, filtrez à la frappe, et la frise reste alignée.
1Lignes en arborescenceLes parents se replient et se déplient ; les enfants gardent leurs propres événements.
2Colonnes d’en-têteDes colonnes redimensionnables qui lisent vos données de ressources.
3FiltresLignes et événements sont filtrés par des callbacks que vous écrivez.
Agir en confiance
Déplacez. Lisez le callback. Annulez.
Chaque geste parvient à votre code sous forme de callback typé, pendant qu’il se produit et une fois terminé. Refusez un déplacement en donnant un motif, confirmez-le auprès de votre serveur ou laissez-le passer. L’historique ne tient qu’à un import.
SuperScheduler Pro n’est chargé que lorsque vous le demandez.
1Faites glisser une réservation vers une autre salle ou un autre jour.
2Essayez d’en déposer une sur la salle en maintenance.
3Appuyez sur Annuler, ou sur Ctrl/⌘ + Z dans le planning.
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'}
Il s’intègre à votre produit
Vos données et vos règles, sur une frise que vous n’avez pas à construire.
Un composant, des props typées et des callbacks. La bibliothèque gère le rendu, les gestes, la virtualisation et l’accessibilité ; votre application gère les données, la validation et la persistance.
SuperScheduler
Affiche ressources et événements, virtualisés dans les deux directions.
Votre application
Fournit les données et choisit la fenêtre de temps.
Signale les modifications proposées et applique celles qui sont acceptées.
Votre application
Conserve l’état, valide, enregistre sur le serveur.
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
Monte du contenu React dans les événements et les en-têtes, conservé et traité par lots.
Votre application
Décide de l’apparence d’une réservation ou d’une ligne.
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
Expose les tokens --super-scheduler-* et suit votre mode sombre.
Votre application
Choisit les couleurs, les arrondis et la densité.
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));}
Aux couleurs de votre produit
Vrais tokens, vrai contraste, CSS à copier.
Ces réglages modifient les propriétés personnalisées --super-scheduler-* que lit la bibliothèque. La vérification du contraste utilise les ratios WCAG 2 ; le CSS ci-dessous est celui que vous collez dans votre feuille de style.
Commencez par une frise en lecture seule. Évoluez vers un produit de planification.
Les deux éditions partagent le modèle de données, la gestion des dates civiles, la virtualisation et la prise en charge du clavier. Pro ajoute tout ce qui modifie le planning.
Lite
Gratuit sur npm
Pour les tableaux de disponibilité, les vues d’occupation et les écrans de planification en lecture seule.
Frise quotidienne de ressources à plat
Événements colorés et empilement des chevauchements
Callbacks de clic sur les événements et les cellules
Navigation au clavier et virtualisation 2D
Aucune limite de ressources ni d’événements
npm install super-scheduler-lite
Pro
499 € par an
Pour les produits où l’on déplace, redimensionne et décide directement sur la frise.
Glisser-déposer, redimensionnement, validation et signalement des conflits
Heures, minutes et zoom continu
Arborescences de ressources, colonnes, lignes figées et scindées
Dépendances, sélection multiple, annuler et rétablir
Minimap, volets, vues enregistrées, chargement par plages, slots de rendu React
Les questions que posent les équipes avant de l’adopter
Est-ce un composant React ou un moteur indépendant du framework ?+
Les deux. SuperSchedulerComponent est le wrapper React pour React 18 et 19 ; en dessous, un moteur DOM gère le défilement, le zoom et les gestes sans aucun rendu React. Vous pouvez aussi le monter de façon impérative avec new SuperScheduler.Scheduler(element, options).
Les déclarations sont livrées avec le paquet. Options, callbacks et méthodes de contrôle sont typés, et les données d’événement sont génériques : EventData<YourFields> garde vos propres champs typés dans les handlers et les hooks de rendu.
Oui. Couleurs, arrondis, densité et mode sombre passent par des propriétés personnalisées CSS documentées ; classNames et styles atteignent chaque élément ; les slots de rendu React remplacent le contenu des événements, des lignes et des en-têtes.
Qui stocke les données, et qui empêche les conflits ?+
Votre application. Le planning affiche et modifie ce que vous lui fournissez et signale chaque changement par des callbacks. La persistance, les permissions et le dernier mot sur les conflits reviennent à votre backend ; la bibliothèque aide avec la prévention des chevauchements, les cellules bloquées et les refus motivés.
Sous forme de .tgz privé et versionné via HTTPS, que npm installe comme n’importe quelle dépendance par URL. La clé de téléchargement apparaît dans votre manifeste et votre lockfile : traitez-la comme un secret. Lite est un paquet npm public classique.
Peut-on l’utiliser au clavier et avec un lecteur d’écran ?+
Pro dispose d’un mode clavier complet : les flèches déplacent le focus, Entrée active, Alt+flèches déplace les événements, et les changements sont annoncés aux technologies d’assistance en français, anglais, espagnol, allemand et cinq autres langues. Lite prend aussi en charge la navigation au clavier.
Gère-t-il les heures et les minutes, ou seulement les jours ?+
Pro va des mois jusqu’aux cellules de 5 minutes, masque les nuits ou les week-ends si vous le demandez, et change d’échelle en continu. Lite est une frise quotidienne.
Et les fuseaux horaires et les événements récurrents ?+
Les dates sont des valeurs civiles, telles qu’on les lit sur une horloge, volontairement sans fuseau horaire. Convertissez les instants avec fuseau et développez les récurrences dans votre application avant de transmettre les événements au planning.