Planning — Créneaux libres
Le revers de tout le reste : au lieu de placer ce qui est pris, calculer ce qui reste. Les heures d'ouverture moins ce qui y est déjà, découpé à la longueur demandée — et une salle qui ne déclare rien ne propose rien.
SlotPicker — ce qui est libre
Les autres vues montrent ce qui est pris et le déplacent. Celle-ci calcule ce qui reste : les heures d'ouverture, moins ce qui y est déjà, découpé à la longueur demandée. Réserver n'est pas éditer — il n'y a encore rien à éditer, et toute la question est de trouver où le nouveau peut tenir.
Une salle
L'Auditorium ouvre de 9 h à 22 h et trois choses y sont déjà programmées le 12. Un mois à gauche, les créneaux du jour à droite — et c'est la largeur du composant qui décide s'ils se rangent côte à côte ou l'un sous l'autre, jamais celle de la fenêtre.
onChange → —
Le composant rapporte le créneau choisi et s'arrête là. La réservation appartient à l'application, comme la création d'un événement depuis le lot 6 : l'identité d'un nouvel objet vient du serveur, et une clé inventée est une collision inventée.
Ce qui est passé en busy est pris tel quel, et c'est là que le filtrage se fait : ici on retire les entrées annulées, et surtout les journées entières. Le programme porte une exposition qui court du 10 au 17 — journée entière, donc minuit à minuit — et livrée comme une occupation elle bloquerait chaque heure de chaque jour de cette semaine. Une exposition dans le hall n'empêche pas de réserver une salle à 14 h : savoir laquelle de vos entrées tient vraiment un créneau n'est pas de l'arithmétique.
Les samedis et dimanches sont barrés : l'Auditorium ne déclare ses horaires que du lundi au vendredi, et un jour sans rien de libre se voit avant qu'on clique dessus. C'est markEmptyDays, qui coûte un balayage du mois affiché — d'où la prop plutôt qu'un comportement d'office.
hidePast est éteint sur toute cette page, et c'est la seule raison pour laquelle elle montre quelque chose : le jeu de démo est daté d'août 2026, donc entièrement passé. Allumé — ce qui est le défaut, parce qu'un sélecteur qui propose hier est cassé — il ne resterait pas un créneau. Regarder une période révolue est légitime, et c'est exactement ce que cette prop permet.
duration, granularity, buffer
Trois réglages, trois questions différentes. duration est la longueur du rendez-vous. granularity est le pas entre deux départs proposés : plus fin que la durée, les candidats se chevauchent — c'est voulu, et c'est ce que font les vrais systèmes de réservation. buffer garde du temps libre de part et d'autre de ce qui est déjà pris.
calendar={ false } · 12/08/2026
Le battement gonfle ce qui est pris, il ne rogne pas les bornes d'ouverture : un quart d'heure de ménage après une réservation n'est pas un quart d'heure de ménage après l'ouverture des portes. Sans cette nuance, le premier créneau de la journée disparaîtrait sans raison.
Les grilles sans mois, ci-dessus et plus bas, ne l'ont pas oublié : c'est calendar={ false }, la prop pour un jour déjà choisi ailleurs. Elles montrent toutes le 12 août et ne diffèrent que d'un réglage — répéter un mois de six lignes entre chacune enterrerait justement la comparaison qu'elles servent à faire.
Par ressource
« La première salle libre à 14 h » est la forme ordinaire d'une réservation. Chaque salle est lue avec ses propres horaires : l'Atelier n'ouvre qu'à 14 h, alors sa rangée commence plus tard sans qu'on ait rien à déclarer. Le créneau choisi porte son resourceId.
La Réserve ne déclare aucun horaire : elle n'a donc aucun créneau. Le silence n'est pas une fermeture — le lot 8 l'a tranché pour le hachurage — mais proposer un rendez-vous demande une affirmation positive : sans elle, on offrirait 3 h du matin. Une rangée vide reste affichée, parce que « cette salle est complète » est une réponse.
+ Réserve · 12/08/2026
defaultAvailability dit « 9 h – 18 h » une fois pour toutes, pour ce qui est resté muet.
+ defaultAvailability 09:00 – 18:00 · 12/08/2026
Dans une fiche
La même chose dans une fenêtre qu'il faut refermer. Une coquille change le contrat : en ligne, un créneau choisi est rapporté tout de suite ; en modale, il n'y a rien d'autre à l'écran, donc le choix se valide. Une fenêtre qui réserverait au premier tap punirait une fausse manœuvre.
onConfirm → —
L'heure choisie est écrite dans le pied, là où le pouce la lit sans repartir chercher le bouton surligné trois rangées plus haut.