Aller au contenu
SuperScheduler

Planification de ressources pour Reactv0.1.0

Chaque ressource.Chaque instant.Votre produit.

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.

  • React 18 et 19
  • Types TypeScript inclus
  • Zéro dépendance à l’exécution
  • Lite sur npm · Pro en tarball privé
Framehouse
PlateauxPlateau A · CycloPlateau B · Décor cuisinePost-productionMontage 1Montage 2Salle d’étalonnageAuditorium de mixageÉquipesUnité caméra 1Unité caméra 2Campagne de printemps · Montage offlineDocumentaire du port · Montage offlineCampagne de printemps · ÉtalonnageSpot cuisine · ÉtalonnageCampagne de printemps · MixageSpot cuisine · TournageSpot cuisine · TournageStudio · Maintenance du grillSpot cuisine · Convocation équipeSpot cuisine · Convocation équipeSpot cuisine · Montage offlineDocumentaire du port · TournageDocumentaire du port · Convocation équipemardi 13 octobremercredi 14 octobrejeudi 15 octobrevendredi 16 octobre08:0012:0016:0008:0012:0016:0008:0012:0016:0008:0012:0016:00

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.

Ouvrir l’exemple d’agence
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.

  1. 01Une seule échelle temps-par-pixel : zoomer ne provoque jamais de nouveau rendu React.
  2. 02Des niveaux de zoom que vous définissez, chacun avec ses propres en-têtes.
  3. 03La minimap dessine n’importe quelle charge calculée par votre application.
Aller à une échelleTrimestre · Mois · Semaine · Jour · Heures · 15 min
Hall nordSalle ASalle BSalle CPavillon sudStudio 1Studio 2TerrasseMontageExpositionAccueilPlénièrePause caféTable rondeDéjeunerTable rondeMontageExpositionMontageExpositionConférenceMontageExpositionMontageExpositionAtelierMontageExpositionConférenceMontageExpositionConférenceConférenceConférenceConférenceAtelierConférenceConférenceSession parallèleSession parallèleAtelierConférenceAtelierConférenceConférenceConférenceConférenceAtelierConférenceAtelierConférenceSession parallèleSession parallèleSession parallèleConférenceConférenceConférenceAtelierConférenceAtelierAtelierConférenceMontageExpositionConférenceAtelierMontageExpositionAtelierMontageConférenceConférenceConférenceAtelierConférenceConférenceDéjeunerAtelierConférenceConférenceConférenceConférence1 oct.5 oct.12 oct.19 oct.26 oct.2 nov.1234567891011121314151617181920212223242526272829303112345

SuperScheduler Pro n’est chargé que lorsque vous le demandez.

Pincez ou utilisez Ctrl/⌘ + molette sur la frise pour zoomer autour du pointeur.

Grouper parÉquipe
MarqueAna P.DesignJonas K.MotionMei L.DesignRafa D.ProductionProduitNoor H.DéveloppementLuca B.DéveloppementIris V.DesignTom S.ProductionStudioEva M.MotionKofi A.MotionLia R.DesignMax W.DéveloppementRelance AtlasCampagne NimbusRelance AtlasRelance AtlasAppli HarborCampagne NimbusAppli HarborCampagne NimbusRelance AtlasAppli HarborCampagne NimbusCampagne NimbusAppli HarborRelance AtlasCampagne NimbusRelance AtlasAppli HarborCampagne NimbusRelance AtlasAppli HarborAppli HarborCampagne NimbusRelance AtlasAppli HarborRelance AtlasCampagne NimbusAppli Harbor12 oct.19 oct.26 oct.12131415161718192021222324252627282930311

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.

  1. 1Lignes en arborescenceLes parents se replient et se déplient ; les enfants gardent leurs propres événements.
  2. 2Colonnes d’en-têteDes colonnes redimensionnables qui lisent vos données de ressources.
  3. 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.

Fermé pour maintenance acoustique: Studio 4
Studio 1Studio 2Studio 3Studio 4Studio 5Studio 6Night FerryCopper BloomLumen ChoirNight FerryHalcyonCopper BloomLumen ChoirHalcyonStatic OrchardStatic OrchardHalcyon12 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.

  1. 1Faites glisser une réservation vers une autre salle ou un autre jour.
  2. 2Essayez d’en déposer une sur la salle en maintenance.
  3. 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'
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'
}

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.
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>
  )
}

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.

Accent
Surface
Arrondi des événements7 px
Style des événements
Densité
Aperçu
Contraste du texte des événements8,5:1Conforme AA pour le texte normal
Studio 1Studio 2Studio 3Studio 4Studio 5Night FerryCopper BloomLumen ChoirNight FerryHalcyonCopper BloomLumen ChoirHalcyonStatic Orchard12 oct.19 oct.lun. 12mar. 13mer. 14jeu. 15ven. 16sam. 17dim. 18lun. 19mar. 20mer. 21

SuperScheduler Pro n’est chargé que lorsque vous le demandez.

Votre thème.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;
}

Exemples

Chaque exemple a son propre modèle de données, ses règles, sa mission et son code source. Six pour commencer :

Voir les douze exemples

Lite et Pro

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

Tarball privé et versionné via HTTPS

Comparer les éditions en détail

Avant de vous décider

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).

Intégration React →
Que valent les types TypeScript ?

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.

Ressources, événements et intervalles →
Peut-il ressembler au reste de notre produit ?

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.

Guide des thèmes →
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.

Événements contrôlés et callbacks →
Comment Pro est-il distribué ?

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.

Installer Pro →
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.

Clavier et accessibilité →
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.

Heures, minutes, jours et zoom →
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.

Langues, dates et fuseaux horaires →