diff --git a/GUIDE-USAGE.md b/GUIDE-USAGE.md index 2bebcff..eec4a1a 100644 --- a/GUIDE-USAGE.md +++ b/GUIDE-USAGE.md @@ -7,11 +7,13 @@ soirée ; il ne suppose rien de la façon dont le logiciel est écrit. Les écrans montrés ici se reproduisent. Le parcours crée un événement nommé « Soirée d’essai », y importe le fichier `exemples/participants_cas_limites.csv` -livré avec le logiciel, pose deux tables, désigne un animateur et génère avec la -graine 4242 et un compte d’arrêt de 300, les autres réglages de génération -gardant leur valeur par défaut ; les étapes où la taille compte chargent la -« Grande démonstration » depuis le premier écran. Suivez les mêmes gestes, avec -les mêmes réglages, et vous verrez les mêmes écrans. +livré avec le logiciel, donne une étiquette à une personne, pose deux tables et +leurs objectifs, importe `exemples/objectifs_cas_limites.csv`, désigne un +animateur, règle l’ordre des priorités et génère avec la graine 4242 et un +compte d’arrêt de 300, les autres réglages de génération gardant leur valeur +par défaut ; les étapes où la taille compte chargent la « Grande +démonstration » depuis le premier écran. Suivez les mêmes gestes, avec les +mêmes réglages, et vous verrez les mêmes écrans. Les étapes sont **un ordre de lecture, pas un assistant** : le logiciel n’enchaîne rien et ne vous oblige jamais à revenir au début. Une faute de @@ -138,6 +140,22 @@ l’ouvre peut prendre pour une formule une cellule qui commence par « = », « + », « - » ou « @ ». Si une valeur commence ainsi, ouvrez le fichier par la commande d’import de texte du tableur, colonnes en texte. +Chaque personne peut porter des **étiquettes** — « finance », « bénévole », +« Montréal » —, que les objectifs des tables attendent (étape 4). Une colonne +« Étiquettes » du fichier les importe ; la fiche d’une personne, ouverte par +« Fiche » dans la grille, les montre et les modifie. Elles ne sont exigées +nulle part. + +![La fiche d’une personne : ses étiquettes, le champ d’ajout, une orthographe reçue sous celle de l’événement](doc/captures/04a-etiquettes.png) + +*Chaque étiquette est une pastille grise, suivie de sa commande « Retirer ». +Tapez une ou plusieurs étiquettes séparées par une virgule, puis « Ajouter » +ou Entrée. Ici, « FINANCE » s’enregistre sous « Finance », l’orthographe que +l’événement porte déjà, et le logiciel le dit sous le champ : une même +étiquette ne s’écrit jamais de deux façons. La légende, au-dessus de la +grille et hors de cette image, compte les personnes qui portent chaque +étiquette.* + ## Étape 4 — Préparer les tables Dans la section « Tables et tours », fixez d’abord les **places par défaut**, @@ -150,6 +168,35 @@ porte son propre nombre de places : on dit alors qu’elle est surchargée. l’autre est « Surchargée » : seule la première suivra un changement du défaut. « Réaligner » ramène une table surchargée au défaut.* +Une table peut aussi porter un **objectif** : les étiquettes des personnes +qu’elle attend, sous la règle « au moins une » (OU) ou « toutes » (ET). Un +objectif vaut pour la soirée, ou pour un tour désigné, dont l’objectif +remplace alors celui de la soirée. Il ne fixe personne : il oriente la +recherche. + +![Deux objectifs : la soirée de la table 1 suit la règle par défaut, le tour 1 de la table 2 porte la sienne](doc/captures/05a-objectifs-tables.png) + +*La table 1 attend « Finance » toute la soirée, sous la règle par défaut, +que son choix nomme : « selon le réglage général (au moins une) ». Au tour 1, +la table 2 attend les personnes qui portent « Montréal » **et** « bénévole » : +« Règle propre » le dit. Aucune personne présente ne porte les deux, et le +logiciel le signale sous l’objectif. La règle par défaut se règle avec les +places par défaut et le nombre de tours ; la changer ne touche pas une règle +propre. « Retirer l’objectif » ne demande pas de confirmation : « Défaire » le +rend.* + +Les objectifs s’importent aussi d’un fichier CSV, par le même aperçu que les +participants : cochez « Objectifs de table » avant de choisir le fichier. + +![L’aperçu d’un fichier d’objectifs : les lignes refusées et leur motif, les orthographes fondues](doc/captures/05b-import-objectifs.png) + +*Chaque ligne refusée dit pourquoi : une table que la soirée n’a pas, un tour +au-delà du nombre de tours, une règle inconnue, un objectif déjà donné plus +haut pour la même table et le même tour. Les orthographes d’une même étiquette +sont fondues sous celle que l’événement porte déjà. « Mettre à jour » remplace +les objectifs que le fichier nomme et garde les autres ; « Remplacer » les +retire tous d’abord, et l’annonce.* + Changer le défaut ne s’applique pas tout de suite : le logiciel annonce d’abord la conséquence, chiffrée. @@ -268,7 +315,9 @@ place les autres personnes autour. Les propositions montrées ci-dessous, et les écrans qui en découlent aux étapes 10 et 11, viennent d’une génération faite avec la graine 4242 et un -compte d’arrêt de 300 ; les autres réglages gardent leur valeur par défaut. +compte d’arrêt de 300, sous les objectifs de l’étape 4 et l’ordre des +priorités montré ci-dessous ; les autres réglages gardent leur valeur par +défaut. Le compte d’arrêt par défaut, bien plus grand, cherche plus longtemps et donne d’autres propositions : écrivez ces deux valeurs pour retrouver les mêmes. @@ -282,14 +331,36 @@ Chaque génération **ajoute** ses propositions aux précédentes, et un seul classement les ordonne toutes. Le logiciel marque dans l’historique l’instant qui précède chaque génération, pour y revenir. -![Les propositions classées, l’ordre du classement écrit au-dessus](doc/captures/11-propositions.png) +Au même endroit, l’**ordre des priorités** dit ce que la recherche poursuit +d’abord et ce que le classement compare. Par défaut, chaque critère est seul à +son palier. Les boutons d’un critère le montent ou le descendent d’un palier, +ou le joignent au palier du dessus, où chacun reçoit un poids ; « Rétablir +l’ordre par défaut » revient au départ. Un critère que ses cases ne cochent +pas garde son rang, mais ne compte nulle part. -*Le tableau range les propositions selon l’ordre écrit au-dessus de lui : -d’abord l’écart au plafond a priori, puis l’excédent de collisions, et ainsi -de suite, chaque critère au plus faible d’abord. Les colonnes donnent, pour -chacune, le moins de personnes distinctes rencontrées, les collisions entre -personnes d’une même appartenance, les rencontres répétées et la diversité des -appartenances rencontrées.* +![L’ordre des priorités : un palier de deux critères et leurs poids, les animateurs décochés](doc/captures/10a-ordre-priorites.png) + +*Ici, l’excédent de collisions et les tours hors objectif partagent le +palier 2, aux poids 1 et 3 : le classement y compare l’excédent plus trois +fois les tours hors objectif. « Animateurs non rencontrés » est marqué +« décoché » : la case « Rencontrer le plus d’animateurs différents » ne l’est +pas. Au-dessus de la liste, hors de l’image, le choix « Objectifs des +tables : chercher d’abord » reste à son défaut, « le plus de places +servies ».* + +![Les propositions classées, l’ordre du classement écrit au-dessus, le tableau défilé jusqu’aux colonnes des objectifs](doc/captures/11-propositions.png) + +*Le tableau range les propositions selon l’ordre écrit au-dessus de lui, +celui des priorités réglé plus haut : d’abord l’écart au plafond a priori, +puis, ensemble, l’excédent de collisions et les tours hors objectif avec +leurs poids, et ainsi de suite, chaque critère au plus faible d’abord. Plus +large que l’écran, le tableau défile de côté ; il est montré ici défilé vers +la droite : la diversité des appartenances rencontrées, le manque et le +plafond a priori, puis, en dernier groupe, les objectifs des tables — les +tours hors objectif et le moins de tours servis selon l’objectif. À sa +gauche, hors de l’image, viennent le rang, la proposition, les personnes +distinctes rencontrées, les collisions entre personnes d’une même +appartenance et les rencontres répétées.* ## Étape 10 — Comparer, et retenir diff --git a/doc/captures/04a-etiquettes.png b/doc/captures/04a-etiquettes.png new file mode 100644 index 0000000..fc7e9eb Binary files /dev/null and b/doc/captures/04a-etiquettes.png differ diff --git a/doc/captures/05a-objectifs-tables.png b/doc/captures/05a-objectifs-tables.png new file mode 100644 index 0000000..1179de0 Binary files /dev/null and b/doc/captures/05a-objectifs-tables.png differ diff --git a/doc/captures/05b-import-objectifs.png b/doc/captures/05b-import-objectifs.png new file mode 100644 index 0000000..a6adc82 Binary files /dev/null and b/doc/captures/05b-import-objectifs.png differ diff --git a/doc/captures/07b-nombre-de-tours.png b/doc/captures/07b-nombre-de-tours.png index c21357b..6ec51c0 100644 Binary files a/doc/captures/07b-nombre-de-tours.png and b/doc/captures/07b-nombre-de-tours.png differ diff --git a/doc/captures/10a-ordre-priorites.png b/doc/captures/10a-ordre-priorites.png new file mode 100644 index 0000000..c3f9fa1 Binary files /dev/null and b/doc/captures/10a-ordre-priorites.png differ diff --git a/doc/captures/11-propositions.png b/doc/captures/11-propositions.png index e437b52..2b2ec05 100644 Binary files a/doc/captures/11-propositions.png and b/doc/captures/11-propositions.png differ diff --git a/doc/captures/22-plan-brouillon.png b/doc/captures/22-plan-brouillon.png index c328523..a9da93b 100644 Binary files a/doc/captures/22-plan-brouillon.png and b/doc/captures/22-plan-brouillon.png differ diff --git a/doc/captures/manifeste.json b/doc/captures/manifeste.json index e007719..67b3249 100644 --- a/doc/captures/manifeste.json +++ b/doc/captures/manifeste.json @@ -1,26 +1,30 @@ {"captures":[ {"cadre":{"hauteur":700,"largeur":1366},"empreinte":"7e808e7f0a91b7a3793af43ac59537756b3fe7255fef9ec15e01b87c1bc55bf6","etape":"1","etat":null,"facteurEchelle":1,"fichier":"01-premier-ecran","graine":null,"image":{"hauteur":700,"largeur":1366,"sha256":"6aaf906f36f8d1703168e8d02a7f7fd8da1071f69718bc330e3f88ac1a56ca44"},"instant":"2026-10-06T19:00:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":14.82,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.57,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":12.07,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":7.21,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Clair","Sombre","À propos","Liste des événements","version","construction de documentation","Importer un événement depuis un fichier…","Créer un événement","Le dossier de l'exécutable n'est pas connu : les événements se rangent dans les Documents.","Créer un événement","Nom de l’événement","Date, facultative (AAAA-MM-JJ)","Créer l’événement","Dossier de travail","C:\\Users\\Exemple\\Documents\\Gestion table tournante Libre","Ouvrir dans l’explorateur","Démonstrations","Chacune se charge comme un nouvel événement, numéroté et ouvert en lecture ; aucun autre événement n’est touché.","Grande démonstration","Grande démonstration sans exception","Petite démonstration","Petite démonstration, conflit inévitable"],"theme":"clair","versionReelle":"2026.10.05.01"}, {"cadre":{"hauteur":700,"largeur":1366},"empreinte":"b1cb20af86a4b974a88b224fe819ff472f1441fe32c83810844fc63fdc14b9b7","etape":"1b","etat":"ab468ad775d39cda60057d23f67ba34d787dda85b66c87b5500b41bff1b2b630","facteurEchelle":1,"fichier":"01b-passer-en-ecriture","graine":null,"image":{"hauteur":700,"largeur":1366,"sha256":"f8eefcf7d3a4bf9c7b031e1197581fd7228a9e8da8ec01fbe24a591724bd9a15"},"instant":"2026-10-06T19:00:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":13.78,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5},{"jeton":"--couleur-refus","ratio":8.34,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":11.07,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5},{"jeton":"--couleur-refus","ratio":8.14,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Lecture","Liste des événements","Clair","Sombre","À propos","Lecture","Rien ne change ; « Modifier » passe en écriture.","Modifier","Lecture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Soirée d’essai","0 participant","0 table · 0 siège","4 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Produire","Badges","Tables et tours","Places par défaut","Nombre de tours","Règle par défaut des objectifs","au moins une (OU)","toutes (ET)","Tables","0 table · 0 siège","Ajouter une table ronde","L'événement est ouvert en lecture : « Modifier » permet de le changer.","Modifier","Ajouter une table carrée","Exporter les objectifs","Aucune table : ajoutez-en une, ronde ou carrée."],"theme":"clair","versionReelle":"2026.10.05.01"}, -{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"449987da2e98b09834cdc7c9c6e430a9ecbb929c326ddb96b6f6e17ff5383283","etape":"2","etat":"4acf3230b0733a35d33c6baf84b7d4f312e98a5b799147dcea6b3bb5d4f082d5","facteurEchelle":1,"fichier":"02-import-apercu","graine":null,"image":{"hauteur":700,"largeur":1366,"sha256":"63691d27a86d871da56922524ff42eca058c1d3f39e55aa1b959e063590bd5b3"},"instant":"2026-10-06T19:00:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":14.16,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":11.07,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Soirée d’essai","0 participant","1 table · 8 sièges","4 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Produire","Badges","Import","Choisissez un fichier CSV ou déposez-le sur la fenêtre ; une plage collée dans la grille des participants arrive ici. Rien ne s'importe avant l'aperçu.","Choisir un fichier CSV…","Contenu du fichier","Participants","Objectifs de table","Aperçu","Mode de l'import","Ajouter","Mettre à jour","Remplacer","Fichier","participants_cas_limites.csv","Encodage","UTF-8 avec marque","Séparateur","point-virgule","Colonnes","En-tête","Devient","Nom","nom","Prénom","prénom","Organisation","appartenance","Courriel","courriel","Rôle","titre pressenti","Exclu","exclu","Notes","notes","Étiquettes","étiquettes","Téléphone","non reconnue : ignorée","13","lignes valides","Ligne","nom","prénom","appartenance","courriel","titre pressenti","exclu","notes","étiquettes","2","Lanterneau","Basile","Chœur de l’Anse","basile.lanterneau@exemple.test","animation","Finance","Montréal","3","Pommerel","Capucine","Société des Hérons","capucine.pommerel@exemple.test","bénévole","ressources humaines","4","Marbrelle","Gaspard","Cercle des Saules","animation","Finance","5","Sablonnet","Ysaline","Chœur de l’Anse","6","Givrecœur","Anselme","anselme.givrecoeur@exemple.test","7","Tourterel","Héloïse","Cercle des Saules","oui","S’est désistée la veille","8","Fenouillet","Côme","Société des Hérons","végétarien; sans noix, ni arachides","9","Coudraie","Apolline","Chœur de l’Anse","Arrive après le premier tour repart avant le dessert","10","Lanterneau","Basile","Chœur de l’Anse","11","Brunœil","Cercle des Saules","brunoeil@exemple.test","12","Ormelin","Faustine","Société des Hérons","14","Ardoisier","Edgar","Société des Hérons","15","Cressonnier","Bertille","Cercle des Saules","Refus","Lignes refusées","Ligne","Motif","13","Le nom manque.","Information","Orthographes fondues en une appartenance","affichée :","Société des Hérons","Société des Hérons","3","lignes","Societe des herons","1","ligne","Information","Orthographes fondues en une étiquette","retenue :","Finance","orthographes :","Finance","finance","1","ligne réécrite","Avis","Doublons signalés, jamais fusionnés","lignes","2","10","Importer","Enregistrer les lignes refusées","Fermer l'aperçu"],"theme":"clair","versionReelle":"2026.10.05.01"}, -{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"3627114c306d2fd47bff249468aec410a48c644245ecb1f85bb60826c5b80acf","etape":"2","etat":"4acf3230b0733a35d33c6baf84b7d4f312e98a5b799147dcea6b3bb5d4f082d5","facteurEchelle":1,"fichier":"02b-import-cp1252","graine":null,"image":{"hauteur":700,"largeur":1366,"sha256":"173368cf8cf2bf154e6ddba1fd46d7ae149dd6e436e2bd000a2e7630042112c5"},"instant":"2026-10-06T19:00:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":14.16,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":11.07,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Soirée d’essai","0 participant","1 table · 8 sièges","4 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Produire","Badges","Import","Choisissez un fichier CSV ou déposez-le sur la fenêtre ; une plage collée dans la grille des participants arrive ici. Rien ne s'importe avant l'aperçu.","Choisir un fichier CSV…","Contenu du fichier","Participants","Objectifs de table","Aperçu","Mode de l'import","Ajouter","Mettre à jour","Remplacer","Fichier","participants_cas_limites_cp1252.csv","Encodage","windows-1252","Séparateur","virgule","Colonnes","En-tête","Devient","Nom","nom","Prénom","prénom","Organisation","appartenance","Courriel","courriel","Rôle","titre pressenti","Exclu","exclu","Notes","notes","Étiquettes","étiquettes","Téléphone","non reconnue : ignorée","13","lignes valides","Ligne","nom","prénom","appartenance","courriel","titre pressenti","exclu","notes","étiquettes","2","Lanterneau","Basile","Chœur de l’Anse","basile.lanterneau@exemple.test","animation","Finance","Montréal","3","Pommerel","Capucine","Société des Hérons","capucine.pommerel@exemple.test","bénévole","ressources humaines","4","Marbrelle","Gaspard","Cercle des Saules","animation","Finance","5","Sablonnet","Ysaline","Chœur de l’Anse","6","Givrecœur","Anselme","anselme.givrecoeur@exemple.test","7","Tourterel","Héloïse","Cercle des Saules","oui","S’est désistée la veille","8","Fenouillet","Côme","Société des Hérons","végétarien; sans noix, ni arachides","9","Coudraie","Apolline","Chœur de l’Anse","Arrive après le premier tour repart avant le dessert","10","Lanterneau","Basile","Chœur de l’Anse","11","Brunœil","Cercle des Saules","brunoeil@exemple.test","12","Ormelin","Faustine","Société des Hérons","14","Ardoisier","Edgar","Société des Hérons","15","Cressonnier","Bertille","Cercle des Saules","Refus","Lignes refusées","Ligne","Motif","13","Le nom manque.","Information","Orthographes fondues en une appartenance","affichée :","Société des Hérons","Société des Hérons","3","lignes","Societe des herons","1","ligne","Information","Orthographes fondues en une étiquette","retenue :","Finance","orthographes :","Finance","finance","1","ligne réécrite","Avis","Doublons signalés, jamais fusionnés","lignes","2","10","Importer","Enregistrer les lignes refusées","Fermer l'aperçu"],"theme":"clair","versionReelle":"2026.10.05.01"}, -{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"58a56b83f56dd4bf4a6de25f864e4bad702837640873a1bca11c9293f5dd4992","etape":"2","etat":"bb0e3ac780cce888c1e69ea95d1a96a7b77bbd49e2ce6e815ddbcb8e4bdfc65f","facteurEchelle":1,"fichier":"03-import-rapport","graine":null,"image":{"hauteur":700,"largeur":1366,"sha256":"59a799f28e555e3571f62ea55379902f62f225c5ed8c9ef926d6a05611fc0698"},"instant":"2026-10-06T19:00:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-avis","ratio":6.58,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":14.16,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-avis","ratio":8.93,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":11.07,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Soirée d’essai","13 participants","1 table · 8 sièges","4 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Produire","Badges","Il manque 4 places à chaque tour pour asseoir toutes les personnes : ajouter des tables ou des sièges, ou exclure des personnes, rend la génération possible.","Ouvrir les tables","Import","Choisissez un fichier CSV ou déposez-le sur la fenêtre ; une plage collée dans la grille des participants arrive ici. Rien ne s'importe avant l'aperçu.","Choisir un fichier CSV…","Contenu du fichier","Participants","Objectifs de table","Rapport d'import","13","personnes ajoutées","0","personne mise à jour","0","personne inchangée","0","personne retirée","0","réservation retirée","Fichier","participants_cas_limites.csv","Encodage","UTF-8 avec marque","Séparateur","point-virgule","Colonnes","En-tête","Devient","Nom","nom","Prénom","prénom","Organisation","appartenance","Courriel","courriel","Rôle","titre pressenti","Exclu","exclu","Notes","notes","Étiquettes","étiquettes","Téléphone","non reconnue : ignorée","13","lignes valides","Ligne","nom","prénom","appartenance","courriel","titre pressenti","exclu","notes","étiquettes","2","Lanterneau","Basile","Chœur de l’Anse","basile.lanterneau@exemple.test","animation","Finance","Montréal","3","Pommerel","Capucine","Société des Hérons","capucine.pommerel@exemple.test","bénévole","ressources humaines","4","Marbrelle","Gaspard","Cercle des Saules","animation","Finance","5","Sablonnet","Ysaline","Chœur de l’Anse","6","Givrecœur","Anselme","anselme.givrecoeur@exemple.test","7","Tourterel","Héloïse","Cercle des Saules","oui","S’est désistée la veille","8","Fenouillet","Côme","Société des Hérons","végétarien; sans noix, ni arachides","9","Coudraie","Apolline","Chœur de l’Anse","Arrive après le premier tour repart avant le dessert","10","Lanterneau","Basile","Chœur de l’Anse","11","Brunœil","Cercle des Saules","brunoeil@exemple.test","12","Ormelin","Faustine","Société des Hérons","14","Ardoisier","Edgar","Société des Hérons","15","Cressonnier","Bertille","Cercle des Saules","Refus","Lignes refusées","Ligne","Motif","13","Le nom manque.","Information","Orthographes fondues en une appartenance","affichée :","Société des Hérons","Société des Hérons","3","lignes","Societe des herons","1","ligne","Information","Orthographes fondues en une étiquette","retenue :","Finance","orthographes :","Finance","finance","1","ligne réécrite","Avis","Doublons signalés, jamais fusionnés","lignes","2","10","Enregistrer les lignes refusées","Fermer le rapport"],"theme":"clair","versionReelle":"2026.10.05.01"}, +{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"067b81cc599ee2735a536fe71c8d9bcdce3e93292f30003592eb08323481a763","etape":"2","etat":"4acf3230b0733a35d33c6baf84b7d4f312e98a5b799147dcea6b3bb5d4f082d5","facteurEchelle":1,"fichier":"02-import-apercu","graine":null,"image":{"hauteur":700,"largeur":1366,"sha256":"63691d27a86d871da56922524ff42eca058c1d3f39e55aa1b959e063590bd5b3"},"instant":"2026-10-06T19:00:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":14.16,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":11.07,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Soirée d’essai","0 participant","1 table · 8 sièges","4 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Produire","Badges","Import","Choisissez un fichier CSV ou déposez-le sur la fenêtre ; une plage collée dans la grille des participants arrive ici. Rien ne s'importe avant l'aperçu.","Choisir un fichier CSV…","Contenu du fichier","Participants","Objectifs de table","Aperçu","Mode de l'import","Ajouter","Mettre à jour","Remplacer","Fichier","participants_cas_limites.csv","Encodage","UTF-8 avec marque","Séparateur","point-virgule","Colonnes","En-tête","Devient","Nom","nom","Prénom","prénom","Organisation","appartenance","Courriel","courriel","Rôle","titre pressenti","Exclu","exclu","Notes","notes","Étiquettes","étiquettes","Téléphone","non reconnue : ignorée","13","lignes valides","Ligne","nom","prénom","appartenance","courriel","titre pressenti","exclu","notes","étiquettes","2","Lanterneau","Basile","Chœur de l’Anse","basile.lanterneau@exemple.test","animation","Finance","Montréal","3","Pommerel","Capucine","Société des Hérons","capucine.pommerel@exemple.test","bénévole","ressources humaines","4","Marbrelle","Gaspard","Cercle des Saules","animation","Finance","5","Sablonnet","Ysaline","Chœur de l’Anse","6","Givrecœur","Anselme","anselme.givrecoeur@exemple.test","7","Tourterel","Héloïse","Cercle des Saules","oui","S’est désistée la veille","8","Fenouillet","Côme","Société des Hérons","végétarien; sans noix, ni arachides","9","Coudraie","Apolline","Chœur de l’Anse","Arrive après le premier tour repart avant le dessert","10","Lanterneau","Basile","Chœur de l’Anse","11","Brunœil","Cercle des Saules","brunoeil@exemple.test","12","Ormelin","Faustine","Société des Hérons","14","Ardoisier","Edgar","Société des Hérons","15","Cressonnier","Bertille","Cercle des Saules","Refus","Lignes refusées","Ligne","Motif","13","Le nom manque.","Information","Orthographes fondues en une appartenance","affichée :","Société des Hérons","Société des Hérons","3","lignes","Societe des herons","1","ligne","Information","Orthographes fondues en une étiquette","retenue :","Finance","orthographes :","Finance",",","finance","—","1","ligne réécrite","Avis","Doublons signalés, jamais fusionnés","lignes","2","10","Importer","Enregistrer les lignes refusées","Fermer l'aperçu"],"theme":"clair","versionReelle":"2026.10.05.01"}, +{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"8d1cd5dd73bd16239e76e7a38c6a227c1a283c5377a6b02ee72a2f28f5f42b9c","etape":"2","etat":"4acf3230b0733a35d33c6baf84b7d4f312e98a5b799147dcea6b3bb5d4f082d5","facteurEchelle":1,"fichier":"02b-import-cp1252","graine":null,"image":{"hauteur":700,"largeur":1366,"sha256":"173368cf8cf2bf154e6ddba1fd46d7ae149dd6e436e2bd000a2e7630042112c5"},"instant":"2026-10-06T19:00:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":14.16,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":11.07,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Soirée d’essai","0 participant","1 table · 8 sièges","4 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Produire","Badges","Import","Choisissez un fichier CSV ou déposez-le sur la fenêtre ; une plage collée dans la grille des participants arrive ici. Rien ne s'importe avant l'aperçu.","Choisir un fichier CSV…","Contenu du fichier","Participants","Objectifs de table","Aperçu","Mode de l'import","Ajouter","Mettre à jour","Remplacer","Fichier","participants_cas_limites_cp1252.csv","Encodage","windows-1252","Séparateur","virgule","Colonnes","En-tête","Devient","Nom","nom","Prénom","prénom","Organisation","appartenance","Courriel","courriel","Rôle","titre pressenti","Exclu","exclu","Notes","notes","Étiquettes","étiquettes","Téléphone","non reconnue : ignorée","13","lignes valides","Ligne","nom","prénom","appartenance","courriel","titre pressenti","exclu","notes","étiquettes","2","Lanterneau","Basile","Chœur de l’Anse","basile.lanterneau@exemple.test","animation","Finance","Montréal","3","Pommerel","Capucine","Société des Hérons","capucine.pommerel@exemple.test","bénévole","ressources humaines","4","Marbrelle","Gaspard","Cercle des Saules","animation","Finance","5","Sablonnet","Ysaline","Chœur de l’Anse","6","Givrecœur","Anselme","anselme.givrecoeur@exemple.test","7","Tourterel","Héloïse","Cercle des Saules","oui","S’est désistée la veille","8","Fenouillet","Côme","Société des Hérons","végétarien; sans noix, ni arachides","9","Coudraie","Apolline","Chœur de l’Anse","Arrive après le premier tour repart avant le dessert","10","Lanterneau","Basile","Chœur de l’Anse","11","Brunœil","Cercle des Saules","brunoeil@exemple.test","12","Ormelin","Faustine","Société des Hérons","14","Ardoisier","Edgar","Société des Hérons","15","Cressonnier","Bertille","Cercle des Saules","Refus","Lignes refusées","Ligne","Motif","13","Le nom manque.","Information","Orthographes fondues en une appartenance","affichée :","Société des Hérons","Société des Hérons","3","lignes","Societe des herons","1","ligne","Information","Orthographes fondues en une étiquette","retenue :","Finance","orthographes :","Finance",",","finance","—","1","ligne réécrite","Avis","Doublons signalés, jamais fusionnés","lignes","2","10","Importer","Enregistrer les lignes refusées","Fermer l'aperçu"],"theme":"clair","versionReelle":"2026.10.05.01"}, +{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"9a4259c93a4224fa2a394b4d3a4b748eae52bc126689428d8b8aca8b7e4ef8de","etape":"2","etat":"bb0e3ac780cce888c1e69ea95d1a96a7b77bbd49e2ce6e815ddbcb8e4bdfc65f","facteurEchelle":1,"fichier":"03-import-rapport","graine":null,"image":{"hauteur":700,"largeur":1366,"sha256":"59a799f28e555e3571f62ea55379902f62f225c5ed8c9ef926d6a05611fc0698"},"instant":"2026-10-06T19:00:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-avis","ratio":6.58,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":14.16,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-avis","ratio":8.93,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":11.07,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Soirée d’essai","13 participants","1 table · 8 sièges","4 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Produire","Badges","Il manque 4 places à chaque tour pour asseoir toutes les personnes : ajouter des tables ou des sièges, ou exclure des personnes, rend la génération possible.","Ouvrir les tables","Import","Choisissez un fichier CSV ou déposez-le sur la fenêtre ; une plage collée dans la grille des participants arrive ici. Rien ne s'importe avant l'aperçu.","Choisir un fichier CSV…","Contenu du fichier","Participants","Objectifs de table","Rapport d'import","13","personnes ajoutées","0","personne mise à jour","0","personne inchangée","0","personne retirée","0","réservation retirée","Fichier","participants_cas_limites.csv","Encodage","UTF-8 avec marque","Séparateur","point-virgule","Colonnes","En-tête","Devient","Nom","nom","Prénom","prénom","Organisation","appartenance","Courriel","courriel","Rôle","titre pressenti","Exclu","exclu","Notes","notes","Étiquettes","étiquettes","Téléphone","non reconnue : ignorée","13","lignes valides","Ligne","nom","prénom","appartenance","courriel","titre pressenti","exclu","notes","étiquettes","2","Lanterneau","Basile","Chœur de l’Anse","basile.lanterneau@exemple.test","animation","Finance","Montréal","3","Pommerel","Capucine","Société des Hérons","capucine.pommerel@exemple.test","bénévole","ressources humaines","4","Marbrelle","Gaspard","Cercle des Saules","animation","Finance","5","Sablonnet","Ysaline","Chœur de l’Anse","6","Givrecœur","Anselme","anselme.givrecoeur@exemple.test","7","Tourterel","Héloïse","Cercle des Saules","oui","S’est désistée la veille","8","Fenouillet","Côme","Société des Hérons","végétarien; sans noix, ni arachides","9","Coudraie","Apolline","Chœur de l’Anse","Arrive après le premier tour repart avant le dessert","10","Lanterneau","Basile","Chœur de l’Anse","11","Brunœil","Cercle des Saules","brunoeil@exemple.test","12","Ormelin","Faustine","Société des Hérons","14","Ardoisier","Edgar","Société des Hérons","15","Cressonnier","Bertille","Cercle des Saules","Refus","Lignes refusées","Ligne","Motif","13","Le nom manque.","Information","Orthographes fondues en une appartenance","affichée :","Société des Hérons","Société des Hérons","3","lignes","Societe des herons","1","ligne","Information","Orthographes fondues en une étiquette","retenue :","Finance","orthographes :","Finance",",","finance","—","1","ligne réécrite","Avis","Doublons signalés, jamais fusionnés","lignes","2","10","Enregistrer les lignes refusées","Fermer le rapport"],"theme":"clair","versionReelle":"2026.10.05.01"}, {"cadre":{"hauteur":700,"largeur":1366},"empreinte":"2bd426f6ae2820694168b8af62ef8241d6d81e72859318e004ddbfb828d4ff18","etape":"3","etat":"c7c7f05d94c8fcfe6d779172d546d5c73cb2077e9d94ef1348542678c9383c6d","facteurEchelle":1,"fichier":"04-grille-participants","graine":null,"image":{"hauteur":700,"largeur":1366,"sha256":"374cf28f7d60cb013b481367d079fd67511696aa5d1f42eb3929134144664b79"},"instant":"2026-10-06T19:00:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-avis","ratio":6.58,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":13.81,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-avis","ratio":8.93,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":11.07,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Soirée d’essai","13 participants","1 table · 8 sièges","4 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Produire","Badges","Il manque 4 places à chaque tour pour asseoir toutes les personnes : ajouter des tables ou des sièges, ou exclure des personnes, rend la génération possible.","Ouvrir les tables","Participants","13 personnes · 12 à placer · 1 exclue · 3 appartenances","Exporter la liste","Ajouter une personne","Nom","Prénom","Appartenance","Courriel","Titre pressenti","Notes","Ajouter","Filtrer","Grouper par","Aucun groupement","Nom","Prénom","Appartenance","Courriel","Titre pressenti","Exclusion","Notes","Statut","13 participants","Cercle des Saules · 4","Chœur de l’Anse · 4","Société des Hérons · 4","bénévole · 1","Finance · 2","Montréal · 1","ressources humaines · 1","Nom","(décroissant)","Prénom","Appartenance","Courriel","Titre pressenti","Exclusion","Notes","Actions","Tourterel","Héloïse","Cercle des Saules","exclue","S’est désistée la veille","Fiche","Voir sur le plan","Réintégrer","Supprimer","Sablonnet","Ysaline","Chœur de l’Anse","présente","Fiche","Voir sur le plan","Exclure","Supprimer","Pommerel","Capucine","Société des Hérons","capucine.pommerel@exemple.test","présente","Fiche","Voir sur le plan","Exclure","Supprimer","Ormelin","Faustine","Société des Hérons","présente","Fiche","Voir sur le plan","Exclure","Supprimer","Marbrelle","Gaspard","Cercle des Saules","ondine@exemple.test","animation","présente","Fiche","Voir sur le plan","Exclure","Supprimer","Lanterneau","Basile","Chœur de l’Anse","basile.lanterneau@exemple.test","animation","présente","Fiche","Voir sur le plan","Exclure","Supprimer","Lanterneau","Basile","Chœur de l’Anse","présente","Fiche","Voir sur le plan","Exclure","Supprimer","Givrecœur","Anselme","anselme.givrecoeur@exemple.test","présente","Fiche","Voir sur le plan","Exclure","Supprimer","Fenouillet","Côme","Société des Hérons","présente","végétarien; sans noix, ni arachides","Fiche","Voir sur le plan","Exclure","Supprimer","Cressonnier","Bertille","Cercle des Saules","présente","Fiche","Voir sur le plan","Exclure","Supprimer","Coudraie","Apolline","Chœur de l’Anse","présente","Arrive après le premier tour repart avant le dessert","Fiche","Voir sur le plan","Exclure","Supprimer","Brunœil","Cercle des Saules","brunoeil@exemple.test","présente","Fiche","Voir sur le plan","Exclure","Supprimer","Ardoisier","Edgar","Société des Hérons","présente","Fiche","Voir sur le plan","Exclure","Supprimer"],"theme":"clair","versionReelle":"2026.10.05.01"}, -{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"f8c9b8b09a2bca26dd825b461ed7ae2a13b38320371b10a67d10bbf4b2ca3d03","etape":"4","etat":"4a66e742567978c38f82db56344c20c5659f23c321c9353722f0fb25a7b8d019","facteurEchelle":1,"fichier":"05-tables-etat","graine":null,"image":{"hauteur":700,"largeur":1366,"sha256":"b5e53613327467ae7600cdb222ac18078ece3d70f01f189973cba1fa385693a0"},"instant":"2026-10-06T19:00:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":14.1,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":11.07,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Soirée d’essai","13 participants","2 tables · 16 sièges","4 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Produire","Badges","Tables et tours","Places par défaut","Nombre de tours","Règle par défaut des objectifs","au moins une (OU)","toutes (ET)","Tables","2 tables · 16 sièges","Ajouter une table ronde","Ajouter une table carrée","Exporter les objectifs","Table","1","Ronde","Suit le défaut","Places","Supprimer","Objectif de la soirée","Règle de l'objectif","selon le réglage général (au moins une)","au moins une (OU)","toutes (ET)","Objectifs par tour","Table","2","Ronde","Surchargée","Places","Réaligner","Supprimer","Objectif de la soirée","Règle de l'objectif","selon le réglage général (au moins une)","au moins une (OU)","toutes (ET)","Objectifs par tour"],"theme":"clair","versionReelle":"2026.10.05.01"}, -{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"87d1b702e30c34fc6c6e5a4430289cdb290e8d24a4a80e2b19b4de60d0e7bbce","etape":"4","etat":"4a66e742567978c38f82db56344c20c5659f23c321c9353722f0fb25a7b8d019","facteurEchelle":1,"fichier":"06-defaut-consequence","graine":null,"image":{"hauteur":700,"largeur":1366,"sha256":"40a75346ff6ced3c263d9eb04f1e84d80153eb468fa6149e5ca77565f2171970"},"instant":"2026-10-06T19:00:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":14.16,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":11.07,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Soirée d’essai","13 participants","2 tables · 16 sièges","4 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Produire","Badges","Tables et tours","Places par défaut","1 table suit le défaut et passe de 8 à 10 places ; 1 table surchargée (8) ne change pas.","Total : 16 → 18 sièges pour 12 participants.","Appliquer","Appliquer et réaligner la surchargée","Garder le défaut actuel","Nombre de tours","Règle par défaut des objectifs","au moins une (OU)","toutes (ET)","Tables","2 tables · 16 sièges","Ajouter une table ronde","Ajouter une table carrée","Exporter les objectifs","Table","1","Ronde","Suit le défaut","Places","Supprimer","Objectif de la soirée","Règle de l'objectif","selon le réglage général (au moins une)","au moins une (OU)","toutes (ET)","Objectifs par tour","Table","2","Ronde","Surchargée","Places","Réaligner","Supprimer","Objectif de la soirée","Règle de l'objectif","selon le réglage général (au moins une)","au moins une (OU)","toutes (ET)","Objectifs par tour"],"theme":"clair","versionReelle":"2026.10.05.01"}, -{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"95bbe395796491c7520c0580800ef9811860d0ab98d8f80d4b79e401bb129cec","etape":"4","etat":"7896d20e0476f9a43ce249f3bee865b627a32343863633b9849f7e8c78543678","facteurEchelle":1,"fichier":"07-plan-tables","graine":null,"image":{"hauteur":700,"largeur":1366,"sha256":"db32ec95a7fd7ba6abf12bcfaa410216457c7657f7b3dc63c897694bb18fe130"},"instant":"2026-10-06T19:00:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-chaise-trait","ratio":7.44,"role":"marque","seuil":3},{"jeton":"--couleur-echelle","ratio":14.82,"role":"marque","seuil":3},{"jeton":"--couleur-liste-texte","ratio":14.82,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":13.81,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5},{"jeton":"--couleur-poignee","ratio":7.44,"role":"marque","seuil":3},{"jeton":"--couleur-table-trait","ratio":7.44,"role":"marque","seuil":3}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-chaise-trait","ratio":8.89,"role":"marque","seuil":3},{"jeton":"--couleur-echelle","ratio":14.62,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":11.07,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5},{"jeton":"--couleur-poignee","ratio":11.32,"role":"marque","seuil":3},{"jeton":"--couleur-table-trait","ratio":5.59,"role":"marque","seuil":3}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Soirée d’essai","13 participants","2 tables · 18 sièges","3 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Produire","Badges","Plan","Réservations","Tour affiché","1","2","3","Zoom +","Zoom −","Ajuster","Listes de noms","Légende","Plein écran","1. (libre)","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","9. (libre)","10. (libre)","1. (libre)","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","1","m","disposition relative — l'encombrement dans la salle n'est pas vérifié","Diagnostic","Chœur de l’Anse","4 personnes : au moins 6 collisions cumulées sur les 3 tours, portées par au moins 2 paires distinctes","Société des Hérons","4 personnes : au moins 6 collisions cumulées sur les 3 tours, portées par au moins 2 paires distinctes","Cercle des Saules","3 personnes : au moins 3 collisions cumulées sur les 3 tours, portées par au moins 1 paire distincte","Tout l'événement","au moins 8 appartenances recroisées par personne","plafond a priori 11 rencontres pour 12 mobiles","Listes de travail","Titres de place non pourvus","Aucun.","Titres pressentis sans réservation","Basile Lanterneau","— titre pressenti","animation","Gaspard Marbrelle","— titre pressenti","animation","Réserve","Personnes en attente au tour 1","Basile Lanterneau","Capucine Pommerel","Gaspard Marbrelle","Ysaline Sablonnet","Anselme Givrecœur","Côme Fenouillet","Apolline Coudraie","Basile Lanterneau","Brunœil","Faustine Ormelin","Edgar Ardoisier","Bertille Cressonnier"],"theme":"clair","versionReelle":"2026.10.05.01"}, +{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"f76f0fa068e802fcefb04ba014493d6749be4d527ac530a56985d298889a9868","etape":"3","etat":"dcbae0e085e28a315ba04e33f0c0bac0d9ca860235827a034a184eddad032f1c","facteurEchelle":1,"fichier":"04a-etiquettes","graine":null,"image":{"hauteur":700,"largeur":1366,"sha256":"205a66717913e4e97c4917d22b2f8b782beb0a15741b50cdfa2e6b72bd29c2a8"},"instant":"2026-10-06T19:00:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-avis","ratio":6.58,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":14.16,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-avis","ratio":8.93,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":11.07,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Soirée d’essai","13 participants","1 table · 8 sièges","4 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Produire","Badges","« FINANCE » est enregistrée sous l'orthographe que l'événement porte déjà : « Finance ».","Participants","13 personnes · 12 à placer · 1 exclue · 3 appartenances","Exporter la liste","Ajouter une personne","Nom","Prénom","Appartenance","Courriel","Titre pressenti","Notes","Ajouter","Filtrer","Grouper par","Aucun groupement","Nom","Prénom","Appartenance","Courriel","Titre pressenti","Exclusion","Notes","Statut","13 participants","Cercle des Saules · 4","Chœur de l’Anse · 4","Société des Hérons · 4","bénévole · 1","Finance · 3","Montréal · 1","ressources humaines · 1","Nom","(décroissant)","Prénom","Appartenance","Courriel","Titre pressenti","Exclusion","Notes","Actions","Tourterel","Héloïse","Cercle des Saules","exclue","S’est désistée la veille","Fiche","Voir sur le plan","Réintégrer","Supprimer","Sablonnet","Ysaline","Chœur de l’Anse","présente","Fiche","Voir sur le plan","Exclure","Supprimer","Pommerel","Capucine","Société des Hérons","capucine.pommerel@exemple.test","présente","Fiche","Voir sur le plan","Exclure","Supprimer","Ormelin","Faustine","Société des Hérons","présente","Fiche","Voir sur le plan","Exclure","Supprimer","Marbrelle","Gaspard","Cercle des Saules","ondine@exemple.test","animation","présente","Fiche","Voir sur le plan","Exclure","Supprimer","Lanterneau","Basile","Chœur de l’Anse","basile.lanterneau@exemple.test","animation","présente","Fiche","Voir sur le plan","Exclure","Supprimer","Lanterneau","Basile","Chœur de l’Anse","présente","Fiche","Voir sur le plan","Exclure","Supprimer","Givrecœur","Anselme","anselme.givrecoeur@exemple.test","présente","Fiche","Voir sur le plan","Exclure","Supprimer","Fenouillet","Côme","Société des Hérons","présente","végétarien; sans noix, ni arachides","Fiche","Voir sur le plan","Exclure","Supprimer","Cressonnier","Bertille","Cercle des Saules","présente","Fiche","Voir sur le plan","Exclure","Supprimer","Coudraie","Apolline","Chœur de l’Anse","présente","Arrive après le premier tour repart avant le dessert","Fiche","Voir sur le plan","Exclure","Supprimer","Brunœil","Cercle des Saules","brunoeil@exemple.test","présente","Fiche","Voir sur le plan","Exclure","Supprimer","Ardoisier","Edgar","Société des Hérons","présente","Fiche","Voir sur le plan","Exclure","Supprimer","Capucine Pommerel","Fermer la fiche","Nom","Pommerel","Prénom","Capucine","Appartenance","Société des Hérons","Courriel","capucine.pommerel@exemple.test","Titre pressenti","—","Notes","—","Statut","mobile","Étiquettes","Finance","Retirer « Finance »","bénévole","Retirer « bénévole »","ressources humaines","Retirer « ressources humaines »","Ajouter des étiquettes, séparées par une virgule","Ajouter","« FINANCE » est enregistrée sous l'orthographe que l'événement porte déjà : « Finance ».","Réservations","Aucune réservation.","Aucun placement retenu ne la nomme."],"theme":"clair","versionReelle":"2026.10.05.01"}, +{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"68a9cd24e436c634c0b1eaa36cac48b353489149f23eabe85771d6df3c0ffbb3","etape":"4","etat":"9066550bdb9c9829148a7a50e177a784cd907a0ad7c8b18460a8c911589c71d8","facteurEchelle":1,"fichier":"05-tables-etat","graine":null,"image":{"hauteur":700,"largeur":1366,"sha256":"b5e53613327467ae7600cdb222ac18078ece3d70f01f189973cba1fa385693a0"},"instant":"2026-10-06T19:00:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":14.1,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":11.07,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Soirée d’essai","13 participants","2 tables · 16 sièges","4 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Produire","Badges","Tables et tours","Places par défaut","Nombre de tours","Règle par défaut des objectifs","au moins une (OU)","toutes (ET)","Tables","2 tables · 16 sièges","Ajouter une table ronde","Ajouter une table carrée","Exporter les objectifs","Table","1","Ronde","Suit le défaut","Places","Supprimer","Objectif de la soirée","Règle de l'objectif","selon le réglage général (au moins une)","au moins une (OU)","toutes (ET)","Objectifs par tour","Table","2","Ronde","Surchargée","Places","Réaligner","Supprimer","Objectif de la soirée","Règle de l'objectif","selon le réglage général (au moins une)","au moins une (OU)","toutes (ET)","Objectifs par tour"],"theme":"clair","versionReelle":"2026.10.05.01"}, +{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"9bc27323c549026db9d7d4f8b45518bd265146e236b38b32f8f08120c2f38d9f","etape":"4","etat":"aec49e481eef9af563b3ed2e8772b1f03cb81ccc36d1633a6591fb8da44017de","facteurEchelle":1,"fichier":"05a-objectifs-tables","graine":null,"image":{"hauteur":700,"largeur":1366,"sha256":"020580868339aff7d7df7eed96e81dd5ff33d0b45c3db9ab4edc485b026b09d6"},"instant":"2026-10-06T19:00:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-avis","ratio":6.58,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":14.1,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-avis","ratio":8.93,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":11.07,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Soirée d’essai","13 participants","2 tables · 16 sièges","4 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Produire","Badges","Aucune personne présente ne correspond à l'objectif au tour 1 : la table ne servira personne à ce titre.","Tables et tours","Places par défaut","Nombre de tours","Règle par défaut des objectifs","au moins une (OU)","toutes (ET)","Tables","2 tables · 16 sièges","Ajouter une table ronde","Ajouter une table carrée","Exporter les objectifs","Table","1","Ronde","Suit le défaut","Places","Supprimer","Objectif de la soirée","Règle de l'objectif","selon le réglage général (au moins une)","au moins une (OU)","toutes (ET)","Suit la règle par défaut","Retirer l'objectif","Objectifs par tour","Table","2","Ronde","Surchargée","Places","Réaligner","Supprimer","Objectif de la soirée","Règle de l'objectif","selon le réglage général (au moins une)","au moins une (OU)","toutes (ET)","Objectifs par tour (1)","Objectif du tour 1","Règle de l'objectif","selon le réglage général (au moins une)","au moins une (OU)","toutes (ET)","Règle propre","Retirer l'objectif","Aucune personne présente ne correspond à l'objectif au tour 1 : la table ne servira personne à ce titre.","Objectif du tour 2","Règle de l'objectif","selon le réglage général (au moins une)","au moins une (OU)","toutes (ET)","Objectif du tour 3","Règle de l'objectif","selon le réglage général (au moins une)","au moins une (OU)","toutes (ET)","Objectif du tour 4","Règle de l'objectif","selon le réglage général (au moins une)","au moins une (OU)","toutes (ET)"],"theme":"clair","versionReelle":"2026.10.05.01"}, +{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"b95dd5be1eebff8135cb65f4ebbb40fb235dfdc69cf1f656955b9556932f4121","etape":"4","etat":"aec49e481eef9af563b3ed2e8772b1f03cb81ccc36d1633a6591fb8da44017de","facteurEchelle":1,"fichier":"05b-import-objectifs","graine":null,"image":{"hauteur":700,"largeur":1366,"sha256":"ee69807c700d5ec6cd211f8fc299290a0f35ca98964d68668a20d0cffbe6f724"},"instant":"2026-10-06T19:00:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-avis","ratio":6.58,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":14.1,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-avis","ratio":8.93,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":11.07,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Soirée d’essai","13 participants","2 tables · 16 sièges","4 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Produire","Badges","Aucune personne présente ne correspond à l'objectif au tour 1 : la table ne servira personne à ce titre.","Import","Choisissez un fichier CSV ou déposez-le sur la fenêtre ; une plage collée dans la grille des participants arrive ici. Rien ne s'importe avant l'aperçu.","Choisir un fichier CSV…","Contenu du fichier","Participants","Objectifs de table","Aperçu","Mode de l'import","Mettre à jour","Remplacer","Fichier","objectifs_cas_limites.csv","Encodage","UTF-8 avec marque","Séparateur","point-virgule","Colonnes","En-tête","Devient","Table","table","Tour","tour","Objectif","objectif","Règle","règle","3","lignes valides","Ligne","table","tour","objectif","règle","2","1","soirée","Finance","bénévole","règle par défaut","3","1","2","Montréal","toutes","4","2","soirée","Finance","au moins une","Refus","Lignes refusées","Ligne","Motif","5","Aucune table ne porte le numéro 9.","6","La soirée compte 4 tours : le tour 9 n'en est pas un.","7","La règle « peut-être » n'est pas reconnue : ou, une, au moins une ; et, toutes ; vide pour suivre la règle par défaut.","8","La ligne 3 donne déjà l'objectif de la table 1 au tour 2 : rien n'est fusionné.","Information","Orthographes fondues en une étiquette","retenue :","Finance","orthographes :","FINANCE",",","Finance",",","finance","—","2","lignes réécrites","Importer","Enregistrer les lignes refusées","Fermer l'aperçu"],"theme":"clair","versionReelle":"2026.10.05.01"}, +{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"96b5169619262ef45b1b0ce432dd577c521c1ec1f44b2cc806db187b8fbef4cc","etape":"4","etat":"ba79b5f0e020a77cfe6aca2677a3d89d633d9b8c79d540bcf3b5bebb27888df4","facteurEchelle":1,"fichier":"06-defaut-consequence","graine":null,"image":{"hauteur":700,"largeur":1366,"sha256":"40a75346ff6ced3c263d9eb04f1e84d80153eb468fa6149e5ca77565f2171970"},"instant":"2026-10-06T19:00:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":14.16,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":11.07,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Soirée d’essai","13 participants","2 tables · 16 sièges","4 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Produire","Badges","Tables et tours","Places par défaut","1 table suit le défaut et passe de 8 à 10 places ; 1 table surchargée (8) ne change pas.","Total : 16 → 18 sièges pour 12 participants.","Appliquer","Appliquer et réaligner la surchargée","Garder le défaut actuel","Nombre de tours","Règle par défaut des objectifs","au moins une (OU)","toutes (ET)","Tables","2 tables · 16 sièges","Ajouter une table ronde","Ajouter une table carrée","Exporter les objectifs","Table","1","Ronde","Suit le défaut","Places","Supprimer","Objectif de la soirée","Règle de l'objectif","selon le réglage général (au moins une)","au moins une (OU)","toutes (ET)","Suit la règle par défaut","Retirer l'objectif","Objectifs par tour (1)","Table","2","Ronde","Surchargée","Places","Réaligner","Supprimer","Objectif de la soirée","Règle de l'objectif","selon le réglage général (au moins une)","au moins une (OU)","toutes (ET)","Règle propre","Retirer l'objectif","Objectifs par tour (1)"],"theme":"clair","versionReelle":"2026.10.05.01"}, +{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"7c1c99545cf6057f3b946d7703908140233a9bf428916538a62123c89195b9b7","etape":"4","etat":"48fce697fc68662593f0c7d1dcc38f33df29261c4a8e6ed6ba7d248cd5ef0372","facteurEchelle":1,"fichier":"07-plan-tables","graine":null,"image":{"hauteur":700,"largeur":1366,"sha256":"db32ec95a7fd7ba6abf12bcfaa410216457c7657f7b3dc63c897694bb18fe130"},"instant":"2026-10-06T19:00:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-chaise-trait","ratio":7.44,"role":"marque","seuil":3},{"jeton":"--couleur-echelle","ratio":14.82,"role":"marque","seuil":3},{"jeton":"--couleur-liste-texte","ratio":14.82,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":13.81,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5},{"jeton":"--couleur-poignee","ratio":7.44,"role":"marque","seuil":3},{"jeton":"--couleur-table-trait","ratio":7.44,"role":"marque","seuil":3}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-chaise-trait","ratio":8.89,"role":"marque","seuil":3},{"jeton":"--couleur-echelle","ratio":14.62,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":11.07,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5},{"jeton":"--couleur-poignee","ratio":11.32,"role":"marque","seuil":3},{"jeton":"--couleur-table-trait","ratio":5.59,"role":"marque","seuil":3}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Soirée d’essai","13 participants","2 tables · 18 sièges","3 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Produire","Badges","Plan","Réservations","Tour affiché","1","2","3","Zoom +","Zoom −","Ajuster","Listes de noms","Légende","Plein écran","1. (libre)","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","9. (libre)","10. (libre)","1. (libre)","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","1","m","disposition relative — l'encombrement dans la salle n'est pas vérifié","Diagnostic","Chœur de l’Anse","4 personnes : au moins 6 collisions cumulées sur les 3 tours, portées par au moins 2 paires distinctes","Société des Hérons","4 personnes : au moins 6 collisions cumulées sur les 3 tours, portées par au moins 2 paires distinctes","Cercle des Saules","3 personnes : au moins 3 collisions cumulées sur les 3 tours, portées par au moins 1 paire distincte","Tout l'événement","au moins 8 appartenances recroisées par personne","plafond a priori 11 rencontres pour 12 mobiles","Listes de travail","Titres de place non pourvus","Aucun.","Titres pressentis sans réservation","Basile Lanterneau","— titre pressenti","animation","Gaspard Marbrelle","— titre pressenti","animation","Réserve","Personnes en attente au tour 1","Basile Lanterneau","Capucine Pommerel","Gaspard Marbrelle","Ysaline Sablonnet","Anselme Givrecœur","Côme Fenouillet","Apolline Coudraie","Basile Lanterneau","Brunœil","Faustine Ormelin","Edgar Ardoisier","Bertille Cressonnier"],"theme":"clair","versionReelle":"2026.10.05.01"}, {"cadre":{"hauteur":700,"largeur":1366},"empreinte":"a812871e8e4d6b0df2c271c1a6a116aef45c1721657758efdb8ce617af109a6e","etape":"4","etat":"4d37d30748068354162752743c26aa7e0ab00d6e9b2aa1996b6f9fb410848280","facteurEchelle":1,"fichier":"07a-cibles-sieges","graine":null,"image":{"hauteur":700,"largeur":1366,"sha256":"1f903bcd51222f7dc45f26fdd85602fc79cf85430ea940856e9d27d8baf471bd"},"instant":"2026-10-06T19:00:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-chaise-pleine","ratio":15.09,"role":"marque","seuil":3},{"jeton":"--couleur-chaise-trait","ratio":7.44,"role":"marque","seuil":3},{"jeton":"--couleur-echelle","ratio":14.82,"role":"marque","seuil":3},{"jeton":"--couleur-liste-texte","ratio":14.82,"role":"texte","seuil":4.5},{"jeton":"--couleur-marque","ratio":3.63,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":13.78,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5},{"jeton":"--couleur-poignee","ratio":7.44,"role":"marque","seuil":3},{"jeton":"--couleur-table-trait","ratio":7.44,"role":"marque","seuil":3}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-chaise-pleine","ratio":14.94,"role":"marque","seuil":3},{"jeton":"--couleur-chaise-trait","ratio":8.89,"role":"marque","seuil":3},{"jeton":"--couleur-echelle","ratio":14.62,"role":"marque","seuil":3},{"jeton":"--couleur-marque","ratio":3.5,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":11.07,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5},{"jeton":"--couleur-poignee","ratio":11.32,"role":"marque","seuil":3},{"jeton":"--couleur-table-trait","ratio":5.59,"role":"marque","seuil":3}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Lecture","Liste des événements","Clair","Sombre","À propos","Lecture","Rien ne change ; « Modifier » passe en écriture.","Modifier","Lecture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Grande démonstration 1","260 participants","33 tables · 260 sièges","4 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Produire","Badges","Plan","Réservations","Tour affiché","1","2","3","4","Zoom +","Zoom −","Ajuster","Listes de noms","Légende","Plein écran","1. (réservée, tous les tours)","Manon Urvançon","—","animation","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","1. (réservée, tous les tours)","Guillaume Luski…","—","animation","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","1. (réservée, tous les tours)","Fatima Korvouze","—","animation","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","1. (réservée, tous les tours)","Antoine Bralmault","—","animation","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","1. (réservée, tous les tours)","Manon Tolveron","—","animation","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","1. (réservée, tous les tours)","Philippe Voskeval","—","animation","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","1. (réservée, tous les tours)","Félix Voskande","—","animation","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","1. (réservée, tous les tours)","Michel Korveron","—","animation","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","1. (réservée, tous les tours)","Gabriel Ivreval","—","animation","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","1. (réservée, tous les tours)","Marc Vandergro…","—","animation","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","1. (réservée, tous les tours)","Étienne Tolvançon","—","animation","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","1. (réservée, tous les tours)","Sophie Pruvotte","—","animation","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","1. (réservée, tous les tours)","Fatima Abrevan…","—","animation","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","1. (réservée, tous les tours)","Marie Urvard","—","animation","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","1. (réservée, tous les tours)","Catherine Hulver…","—","animation","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","1. (réservée, tous les tours)","Camille Neskard","—","animation","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","1. (réservée, tous les tours)","Youssef Neskière","—","animation","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","1. (réservée, tous les tours)","Guillaume Dulvi…","—","animation","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","1. (réservée, tous les tours)","Philippe Ivroubre","—","animation","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","1. (réservée, tous les tours)","Claire Jusvivet","—","animation","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","1. (réservée, tous les tours)","Youssef Jusvard","—","animation","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","1. (réservée, tous les tours)","Louise Neskichon","—","animation","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","1. (réservée, tous les tours)","Hugo Bralmouze","—","animation","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","1. (réservée, tous les tours)","Gabriel Abrevault","—","animation","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","1. (réservée, tous les tours)","Louis Selvivet","—","animation","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","1. (réservée, tous les tours)","Jean Fralvumet","—","animation","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","1. (réservée, tous les tours)","Marie Bralmesson","—","animation","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","1. (réservée, tous les tours)","Thomas Selvignac","—","animation","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","1. (réservée, tous les tours)","Émilie Abrevière","—","animation","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","1. (réservée, tous les tours)","Geneviève Dulv…","—","animation","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","1. (réservée, tous les tours)","François Obrouze","—","animation","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","1. (réservée, tous les tours)","François Ivrivet","—","animation","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","1. (réservée, tous les tours)","Samuel Bralmeux","—","animation","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","1","m","disposition relative — l'encombrement dans la salle n'est pas vérifié","Diagnostic","Tout l'événement","écart d'itinéraire maximal : plancher 1, au moins 24 mobiles finissent sous leur plafond a priori","plafond a priori 24 rencontres pour 4 ancrés","plafond a priori 28 rencontres pour 29 ancrés et 227 mobiles","99 retours imposés par 33 ancrages","Listes de travail","Titres de place non pourvus","Aucun.","Titres pressentis sans réservation","Aucun.","Réserve","Personnes en attente au tour 1","Isabelle Mirvault","Félix Abrevande","Hugo Fralvançon","Manon Fralveux","Catherine Luskotte","Zoé WAMMERWOLM-MAWWEMMEL","Catherine Urvesson","Karim Hulvivet","Caroline Selveron","Catherine Korvault","Caroline Fralvotte","Geneviève Jusvesson","Paul Abrevumet","Léa Fralvault","Fatima Obrivet","Zoé Dulveval","Paul Korveux","Julie Luskière","Émilie Clovande","Paul Hulvande","Hugo Fralvesson","Isabelle Urvière","Thomas Rozvotte","Isabelle Bralmumet","Catherine Dulvouze","Marc Voskichon","Simon Mirvivet","Louise Clovault","Lucie Voskeux","Amina Eskignac","Luc Selvoubre","Étienne Fralvichon","Philippe Voskivet","Louise Quilmançon","Sophie Luskande","Pierre Abreveron","Philippe Neskeux","Amina Neskançon","Léa Tolvande","Antoine Quilmeron","Guillaume Clovumet","Michel Eskeux","Louise Hulvault","Samuel Eskumet","Claire Fralvivet","Léa Mirveux","Karim Gorzesson","Sylvie Quilmande","François Gorzichon","Amina Pruvesson","Lucie Quilmière","Fatima Korvesson","Nicolas Selvesson","Louise Neskesson","Lucie Tolvesson","Olivier Quilmesson","Guillaume Luskivet","Gabriel Neskault","Antoine Urvumet","Olivier Jusvançon","Simon Dulvançon","Chloé Gorzard","Gabriel Pruveux","Manon Clovière","Karim Tolveval","Hugo Bérêçàuvïlle-Dœûmôntëÿ","Claire Gorzeron","Hélène Luskumet","Louis Fralvande","Émilie Selvault","Léa Neskumet","Isabelle Korvichon","Michel Obrande","Isabelle Luskeval","Fatima Tolvoubre","Zoé Gorzière","Sylvie Korvignac","Antoine Obreval","Camille Tolvumet","Marie Dulvesson","Guillaume Tolvignac","Gabriel Mirvotte","Paul Neskignac","Raphaël Ivrotte","Marc Luskouze","Sylvie Jusvotte","Véronique Bralmoubre","Pierre Selvard","Marie Hulveux","Karim Fralveval","Philippe Gorzignac","Étienne Selvouze","Louis Hulvichon","Sylvie Urvoubre","Pierre Pruveval","Guillaume Hulvotte","Geneviève Abrevignac","Amina Bralmignac","Olivier Bralmançon","Marc Luskoubre","Geneviève Abrevoubre","Raphaël Korvoubre","Pierre Mirvard","Camille Jusvumet","Samuel Cloveval","Antoine Selvière","Véronique Jusvouze","Paul Neskivet","Samuel Dulvande","Lucie Selveval","Olivier Tolvichon","Fatima Hulvard","Alexandre Ivreux","Félix Korveval","Karim Urvichon","Émilie Dulvichon","Luc Tolvouze","Amina Quilmault","François Ivrouze","Hélène Gorzumet","Sophie Ivrault","Louise Bralmière","Nicolas Korvande","Geneviève Ivrumet","Geneviève Obresson","Guillaume Obrançon","Fatima Urvignac","Claire Bralmotte","Félix Hulvignac","François Clovotte","Philippe Dulvoubre","Samuel Rozveron","Pierre Hulvoubre","Émilie Urvouze","Félix Korvançon","Émilie Neskande","Chantal Mirvumet","Alexandre Korvotte","Zoé Eskeval","Nathalie Voskoubre","Sophie Pruvière","Paul Obrichon","Nathalie Eskière","Caroline Ivreron","Véronique Neskoubre","Anne Urvivet","Olivier Hulvançon","Karim Clovançon","Zoé Quilmotte","Félix Eskouze","Amina Rozvichon","Simon Fralvière","Pierre Hulvière","Raphaël Jusvault","Pierre Fralvoubre","Hélène Selveux","Caroline Rozvançon","Olivier Korvière","Nicolas Ivrichon","Félix Korvumet","Guillaume Selvumet","Michel Urvotte","Émilie Eskault","Hélène Bralmeval","Guillaume Hulvesson","Caroline Jusvoubre","Félix Luskeux","Antoine Pruvouze","Julie Quilmignac","Hugo Voskumet","Manon Quilmumet","Marc Voskouze","Samuel Abrevard","Manon Clovesson","Simon Hulvumet","Lucie Voskeron","Jean Neskeron","Manon Pruvivet","Sophie Clovard","Étienne Gorzeval","Gabriel Luskault","Émilie Korvard","Thomas Quilmichon","Alexandre Eskançon","Émilie Luskançon","Marc Dulvault","Hélène Rozveval","Julie Pruvançon","Louis Mirveron","François Eskard","Louis Ivrançon","Karim Clovivet","Léa Rozvande","Amina Hulvouze","Étienne Eskesson","Philippe Abreveval","Émilie Quilmeux","Simon Voskotte","Chantal Obrignac","Guillaume Eskotte","Léa Obrard","Guillaume Gorzivet","Geneviève Mirvançon","Julie Selvotte","Amina Mirvesson","Isabelle Luskignac","Chloé Obrumet","Anne Abrevesson","Fatima Rozvumet","Guillaume Mirvoubre","Véronique Rozvoubre","Claire Gorzotte","Antoine Ivrière","Isabelle Selvichon","Isabelle Urvault","Julie Voskesson","Chantal Abrevotte","Amina Neskotte","Étienne Voskançon","Zoé Fralveron","Marc Rozvouze","Sylvie Abreveux","Karim Pruvignac","Zoé Mirveval","Philippe Fralvignac","Gabriel Gorzeux","Jean Urveval"],"theme":"clair","versionReelle":"2026.10.05.01"}, {"cadre":{"hauteur":700,"largeur":1366},"empreinte":"cd2473a9bc973139dea77c6b87e7ce6a5966be9a91c97f342702be4ebb93b152","etape":"4","etat":"4d37d30748068354162752743c26aa7e0ab00d6e9b2aa1996b6f9fb410848280","facteurEchelle":1,"fichier":"07a-cibles-tables","graine":null,"image":{"hauteur":700,"largeur":1366,"sha256":"a89c2da06737ee2076d76a87707ca71b5fde2b8a6540ad8254317bf60140e894"},"instant":"2026-10-06T19:00:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-chaise-trait","ratio":7.44,"role":"marque","seuil":3},{"jeton":"--couleur-echelle","ratio":14.82,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":13.78,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5},{"jeton":"--couleur-poignee","ratio":7.44,"role":"marque","seuil":3},{"jeton":"--couleur-table-trait","ratio":8.13,"role":"marque","seuil":3}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-chaise-trait","ratio":8.89,"role":"marque","seuil":3},{"jeton":"--couleur-echelle","ratio":14.62,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":11.07,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5},{"jeton":"--couleur-poignee","ratio":11.32,"role":"marque","seuil":3},{"jeton":"--couleur-table-trait","ratio":5.59,"role":"marque","seuil":3}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Lecture","Liste des événements","Clair","Sombre","À propos","Lecture","Rien ne change ; « Modifier » passe en écriture.","Modifier","Lecture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Grande démonstration 1","260 participants","33 tables · 260 sièges","4 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Produire","Badges","Plan","Réservations","Tour affiché","1","2","3","4","Zoom +","Zoom −","Ajuster","Listes de noms","Légende","Plein écran","5","m","disposition relative — l'encombrement dans la salle n'est pas vérifié","Diagnostic","Tout l'événement","écart d'itinéraire maximal : plancher 1, au moins 24 mobiles finissent sous leur plafond a priori","plafond a priori 24 rencontres pour 4 ancrés","plafond a priori 28 rencontres pour 29 ancrés et 227 mobiles","99 retours imposés par 33 ancrages","Listes de travail","Titres de place non pourvus","Aucun.","Titres pressentis sans réservation","Aucun.","Réserve","Personnes en attente au tour 1","Isabelle Mirvault","Félix Abrevande","Hugo Fralvançon","Manon Fralveux","Catherine Luskotte","Zoé WAMMERWOLM-MAWWEMMEL","Catherine Urvesson","Karim Hulvivet","Caroline Selveron","Catherine Korvault","Caroline Fralvotte","Geneviève Jusvesson","Paul Abrevumet","Léa Fralvault","Fatima Obrivet","Zoé Dulveval","Paul Korveux","Julie Luskière","Émilie Clovande","Paul Hulvande","Hugo Fralvesson","Isabelle Urvière","Thomas Rozvotte","Isabelle Bralmumet","Catherine Dulvouze","Marc Voskichon","Simon Mirvivet","Louise Clovault","Lucie Voskeux","Amina Eskignac","Luc Selvoubre","Étienne Fralvichon","Philippe Voskivet","Louise Quilmançon","Sophie Luskande","Pierre Abreveron","Philippe Neskeux","Amina Neskançon","Léa Tolvande","Antoine Quilmeron","Guillaume Clovumet","Michel Eskeux","Louise Hulvault","Samuel Eskumet","Claire Fralvivet","Léa Mirveux","Karim Gorzesson","Sylvie Quilmande","François Gorzichon","Amina Pruvesson","Lucie Quilmière","Fatima Korvesson","Nicolas Selvesson","Louise Neskesson","Lucie Tolvesson","Olivier Quilmesson","Guillaume Luskivet","Gabriel Neskault","Antoine Urvumet","Olivier Jusvançon","Simon Dulvançon","Chloé Gorzard","Gabriel Pruveux","Manon Clovière","Karim Tolveval","Hugo Bérêçàuvïlle-Dœûmôntëÿ","Claire Gorzeron","Hélène Luskumet","Louis Fralvande","Émilie Selvault","Léa Neskumet","Isabelle Korvichon","Michel Obrande","Isabelle Luskeval","Fatima Tolvoubre","Zoé Gorzière","Sylvie Korvignac","Antoine Obreval","Camille Tolvumet","Marie Dulvesson","Guillaume Tolvignac","Gabriel Mirvotte","Paul Neskignac","Raphaël Ivrotte","Marc Luskouze","Sylvie Jusvotte","Véronique Bralmoubre","Pierre Selvard","Marie Hulveux","Karim Fralveval","Philippe Gorzignac","Étienne Selvouze","Louis Hulvichon","Sylvie Urvoubre","Pierre Pruveval","Guillaume Hulvotte","Geneviève Abrevignac","Amina Bralmignac","Olivier Bralmançon","Marc Luskoubre","Geneviève Abrevoubre","Raphaël Korvoubre","Pierre Mirvard","Camille Jusvumet","Samuel Cloveval","Antoine Selvière","Véronique Jusvouze","Paul Neskivet","Samuel Dulvande","Lucie Selveval","Olivier Tolvichon","Fatima Hulvard","Alexandre Ivreux","Félix Korveval","Karim Urvichon","Émilie Dulvichon","Luc Tolvouze","Amina Quilmault","François Ivrouze","Hélène Gorzumet","Sophie Ivrault","Louise Bralmière","Nicolas Korvande","Geneviève Ivrumet","Geneviève Obresson","Guillaume Obrançon","Fatima Urvignac","Claire Bralmotte","Félix Hulvignac","François Clovotte","Philippe Dulvoubre","Samuel Rozveron","Pierre Hulvoubre","Émilie Urvouze","Félix Korvançon","Émilie Neskande","Chantal Mirvumet","Alexandre Korvotte","Zoé Eskeval","Nathalie Voskoubre","Sophie Pruvière","Paul Obrichon","Nathalie Eskière","Caroline Ivreron","Véronique Neskoubre","Anne Urvivet","Olivier Hulvançon","Karim Clovançon","Zoé Quilmotte","Félix Eskouze","Amina Rozvichon","Simon Fralvière","Pierre Hulvière","Raphaël Jusvault","Pierre Fralvoubre","Hélène Selveux","Caroline Rozvançon","Olivier Korvière","Nicolas Ivrichon","Félix Korvumet","Guillaume Selvumet","Michel Urvotte","Émilie Eskault","Hélène Bralmeval","Guillaume Hulvesson","Caroline Jusvoubre","Félix Luskeux","Antoine Pruvouze","Julie Quilmignac","Hugo Voskumet","Manon Quilmumet","Marc Voskouze","Samuel Abrevard","Manon Clovesson","Simon Hulvumet","Lucie Voskeron","Jean Neskeron","Manon Pruvivet","Sophie Clovard","Étienne Gorzeval","Gabriel Luskault","Émilie Korvard","Thomas Quilmichon","Alexandre Eskançon","Émilie Luskançon","Marc Dulvault","Hélène Rozveval","Julie Pruvançon","Louis Mirveron","François Eskard","Louis Ivrançon","Karim Clovivet","Léa Rozvande","Amina Hulvouze","Étienne Eskesson","Philippe Abreveval","Émilie Quilmeux","Simon Voskotte","Chantal Obrignac","Guillaume Eskotte","Léa Obrard","Guillaume Gorzivet","Geneviève Mirvançon","Julie Selvotte","Amina Mirvesson","Isabelle Luskignac","Chloé Obrumet","Anne Abrevesson","Fatima Rozvumet","Guillaume Mirvoubre","Véronique Rozvoubre","Claire Gorzotte","Antoine Ivrière","Isabelle Selvichon","Isabelle Urvault","Julie Voskesson","Chantal Abrevotte","Amina Neskotte","Étienne Voskançon","Zoé Fralveron","Marc Rozvouze","Sylvie Abreveux","Karim Pruvignac","Zoé Mirveval","Philippe Fralvignac","Gabriel Gorzeux","Jean Urveval"],"theme":"clair","versionReelle":"2026.10.05.01"}, -{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"a618a3e15a9c6cdd290e610b27f8f7476a3f75e17d4f2a9244d0e2e14dbb60b7","etape":"5","etat":"730b6791b19e368d4b1c8beacf177d95231268071eaba0325fb2bd632c88a3c5","facteurEchelle":1,"fichier":"07b-nombre-de-tours","graine":null,"image":{"hauteur":700,"largeur":1366,"sha256":"03cef0232a140d8423b0b66e257491ec69dfae7defc4228cf41bd94a2c2342e1"},"instant":"2026-10-06T19:00:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-page-texte","ratio":16.19,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-page-texte","ratio":13.21,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Soirée d’essai","13 participants","2 tables · 18 sièges","3 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Produire","Badges","Tables et tours","Places par défaut","Nombre de tours","Passer de 3 à 2 tours ? Ce changement emporte :","Basile Lanterneau : réservation à la table 1 au tour 3, détruite","Annuler","Confirmer","Règle par défaut des objectifs","au moins une (OU)","toutes (ET)","Tables","2 tables · 18 sièges","Ajouter une table ronde","Ajouter une table carrée","Exporter les objectifs","Table","1","Ronde","Suit le défaut","Places","Supprimer","Objectif de la soirée","Règle de l'objectif","selon le réglage général (au moins une)","au moins une (OU)","toutes (ET)","Objectifs par tour","Table","2","Ronde","Surchargée","Places","Réaligner","Supprimer","Objectif de la soirée","Règle de l'objectif","selon le réglage général (au moins une)","au moins une (OU)","toutes (ET)","Objectifs par tour"],"theme":"clair","versionReelle":"2026.10.05.01"}, -{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"a0bf40574250872d4e9885290c3b86aa7cb9c94b30f57f124e533c5789f80e9c","etape":"6","etat":"35ff34c57ecc667cd737292aa7604b885bdc4149ee53480cf58d5f99d1229f88","facteurEchelle":1,"fichier":"08-animateurs-designes","graine":null,"image":{"hauteur":700,"largeur":1366,"sha256":"8631b3356260b7d77c13b40e2d73b0847454600b3471baabe4de5ceb1fceadf1"},"instant":"2026-10-06T19:00:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-chaise-pleine","ratio":15.09,"role":"marque","seuil":3},{"jeton":"--couleur-chaise-trait","ratio":7.44,"role":"marque","seuil":3},{"jeton":"--couleur-echelle","ratio":14.82,"role":"marque","seuil":3},{"jeton":"--couleur-hachure","ratio":16.48,"role":"marque","seuil":3},{"jeton":"--couleur-liste-texte","ratio":14.82,"role":"texte","seuil":4.5},{"jeton":"--couleur-marque","ratio":3.63,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":13.81,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5},{"jeton":"--couleur-poignee","ratio":7.44,"role":"marque","seuil":3},{"jeton":"--couleur-selection","ratio":4.57,"role":"marque","seuil":3},{"jeton":"--couleur-table-trait","ratio":7.44,"role":"marque","seuil":3}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-chaise-pleine","ratio":14.94,"role":"marque","seuil":3},{"jeton":"--couleur-chaise-trait","ratio":8.89,"role":"marque","seuil":3},{"jeton":"--couleur-echelle","ratio":14.62,"role":"marque","seuil":3},{"jeton":"--couleur-hachure","ratio":15.21,"role":"marque","seuil":3},{"jeton":"--couleur-marque","ratio":3.5,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":11.07,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5},{"jeton":"--couleur-poignee","ratio":11.32,"role":"marque","seuil":3},{"jeton":"--couleur-selection","ratio":4.18,"role":"marque","seuil":3},{"jeton":"--couleur-table-trait","ratio":5.59,"role":"marque","seuil":3}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Soirée d’essai","13 participants","2 tables · 18 sièges","3 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Produire","Badges","Plan","Réservations","Tour affiché","1","2","3","Zoom +","Zoom −","Ajuster","Listes de noms","Légende","Plein écran","1. (réservée, tous les tours)","Basile Lanterneau","—","animation","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","9. (libre)","10. (libre)","1. (libre)","— titre","animation","non pourvu","2. (réservée, tour 1)","Capucine Pommerel","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","1","m","disposition relative — l'encombrement dans la salle n'est pas vérifié","Diagnostic","Chœur de l’Anse","4 personnes : au moins 6 collisions cumulées sur les 3 tours, portées par au moins 2 paires distinctes","Société des Hérons","4 personnes : au moins 6 collisions cumulées sur les 3 tours, portées par au moins 2 paires distinctes","Cercle des Saules","3 personnes : au moins 3 collisions cumulées sur les 3 tours, portées par au moins 1 paire distincte","Tout l'événement","au moins 8 appartenances recroisées par personne","plafond a priori 11 rencontres pour 1 ancré et 11 mobiles","2 retours imposés par 1 ancrage","Listes de travail","Titres de place non pourvus","table 2 : titre","animation","non pourvu","Titres pressentis sans réservation","Gaspard Marbrelle","— titre pressenti","animation","Réserve","Personnes en attente au tour 1","Gaspard Marbrelle","Ysaline Sablonnet","Anselme Givrecœur","Côme Fenouillet","Apolline Coudraie","Basile Lanterneau","Brunœil","Faustine Ormelin","Edgar Ardoisier","Bertille Cressonnier","Table 2, siège 1","1. (libre)","— titre","animation","non pourvu","Choisissez d'abord une personne : dans la réserve, dans la liste des pressentis, ou par « Déplacer » dans son menu.","Portée","Tour 1","Tous les tours","Libellé du titre","Assigner","Réserver","Désigner","Retirer le titre"],"theme":"clair","versionReelle":"2026.10.05.01"}, -{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"edaf9f3298df2512b3e5d568c161b31ec9ce2ff0f0c81c3bb8f58e59ff70520c","etape":"7","etat":"35ff34c57ecc667cd737292aa7604b885bdc4149ee53480cf58d5f99d1229f88","facteurEchelle":1,"fichier":"09-refus-sur-place","graine":null,"image":{"hauteur":700,"largeur":1366,"sha256":"db6e14d4a0a151e4440a515f0638de0e62676e2049b59f44672815283aa47b4e"},"instant":"2026-10-06T19:00:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-chaise-pleine","ratio":15.09,"role":"marque","seuil":3},{"jeton":"--couleur-chaise-trait","ratio":7.44,"role":"marque","seuil":3},{"jeton":"--couleur-echelle","ratio":14.82,"role":"marque","seuil":3},{"jeton":"--couleur-hachure","ratio":16.48,"role":"marque","seuil":3},{"jeton":"--couleur-liste-texte","ratio":14.82,"role":"texte","seuil":4.5},{"jeton":"--couleur-marque","ratio":3.63,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":13.81,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5},{"jeton":"--couleur-poignee","ratio":7.44,"role":"marque","seuil":3},{"jeton":"--couleur-refus","ratio":8.34,"role":"texte","seuil":4.5},{"jeton":"--couleur-selection","ratio":4.57,"role":"marque","seuil":3},{"jeton":"--couleur-table-trait","ratio":7.44,"role":"marque","seuil":3}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-chaise-pleine","ratio":14.94,"role":"marque","seuil":3},{"jeton":"--couleur-chaise-trait","ratio":8.89,"role":"marque","seuil":3},{"jeton":"--couleur-echelle","ratio":14.62,"role":"marque","seuil":3},{"jeton":"--couleur-hachure","ratio":15.21,"role":"marque","seuil":3},{"jeton":"--couleur-marque","ratio":3.5,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":11.07,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5},{"jeton":"--couleur-poignee","ratio":11.32,"role":"marque","seuil":3},{"jeton":"--couleur-refus","ratio":8.14,"role":"texte","seuil":4.5},{"jeton":"--couleur-selection","ratio":4.18,"role":"marque","seuil":3},{"jeton":"--couleur-table-trait","ratio":5.59,"role":"marque","seuil":3}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Soirée d’essai","13 participants","2 tables · 18 sièges","3 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Produire","Badges","Plan","Réservations","Tour affiché","1","2","3","Zoom +","Zoom −","Ajuster","Listes de noms","Légende","Plein écran","1. (réservée, tous les tours)","Basile Lanterneau","—","animation","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","9. (libre)","10. (libre)","1. (libre)","— titre","animation","non pourvu","2. (réservée, tour 1)","Capucine Pommerel","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","Table 1, siège 1","Le siège 1 est réservé à une autre personne à tous les tours : déplacer sa réservation libère la place.","Choisir une place","Fermer","1","m","disposition relative — l'encombrement dans la salle n'est pas vérifié","Diagnostic","Chœur de l’Anse","4 personnes : au moins 6 collisions cumulées sur les 3 tours, portées par au moins 2 paires distinctes","Société des Hérons","4 personnes : au moins 6 collisions cumulées sur les 3 tours, portées par au moins 2 paires distinctes","Cercle des Saules","3 personnes : au moins 3 collisions cumulées sur les 3 tours, portées par au moins 1 paire distincte","Tout l'événement","au moins 8 appartenances recroisées par personne","plafond a priori 11 rencontres pour 1 ancré et 11 mobiles","2 retours imposés par 1 ancrage","Listes de travail","Titres de place non pourvus","table 2 : titre","animation","non pourvu","Titres pressentis sans réservation","Gaspard Marbrelle","— titre pressenti","animation","Réserve","Personnes en attente au tour 1","Gaspard Marbrelle","Ysaline Sablonnet","Anselme Givrecœur","Côme Fenouillet","Apolline Coudraie","Basile Lanterneau","Brunœil","Faustine Ormelin","Edgar Ardoisier","Bertille Cressonnier","Table 1, siège 1","1. (réservée, tous les tours)","Basile Lanterneau","—","animation","Personne choisie :","Gaspard Marbrelle","Assigner","Retirer la réservation","Retirer le titre","Oublier le choix","Menu de","Basile Lanterneau","Déplacer","Échanger","Retirer du tour","Déplacer sa réservation","Exclure","Mettre en évidence","Ouvrir la fiche"],"theme":"clair","versionReelle":"2026.10.05.01"}, +{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"a27c552a2445f180773c846045a4ed66165e5fae64cad9cd59fe6fa86782dd7c","etape":"5","etat":"4465469b8700855c418462b2f5b9c45b2497bde24a85cf97b82a09e70fcae56b","facteurEchelle":1,"fichier":"07b-nombre-de-tours","graine":null,"image":{"hauteur":700,"largeur":1366,"sha256":"223701b4afa8642086f70c472b13ddcaa64fdaba5660439a5cdf1b4e62bd53a1"},"instant":"2026-10-06T19:00:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-page-texte","ratio":16.19,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-page-texte","ratio":13.21,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Soirée d’essai","13 participants","2 tables · 18 sièges","3 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Produire","Badges","Tables et tours","Places par défaut","Nombre de tours","Passer de 3 à 2 tours ? Ce changement emporte :","Basile Lanterneau : réservation à la table 1 au tour 3, détruite","Annuler","Confirmer","Règle par défaut des objectifs","au moins une (OU)","toutes (ET)","Tables","2 tables · 18 sièges","Ajouter une table ronde","Ajouter une table carrée","Exporter les objectifs","Table","1","Ronde","Suit le défaut","Places","Supprimer","Objectif de la soirée","Règle de l'objectif","selon le réglage général (au moins une)","au moins une (OU)","toutes (ET)","Suit la règle par défaut","Retirer l'objectif","Objectifs par tour (1)","Table","2","Ronde","Surchargée","Places","Réaligner","Supprimer","Objectif de la soirée","Règle de l'objectif","selon le réglage général (au moins une)","au moins une (OU)","toutes (ET)","Règle propre","Retirer l'objectif","Objectifs par tour (1)"],"theme":"clair","versionReelle":"2026.10.05.01"}, +{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"a4d55a7a4ff633fddbc816170e1c6497c75ad91e7639d7019d51ace6608c1670","etape":"6","etat":"0229d0d8208ef262e3b3485bc2f606cad900fe487d038276d3733a5423cb6a5b","facteurEchelle":1,"fichier":"08-animateurs-designes","graine":null,"image":{"hauteur":700,"largeur":1366,"sha256":"8631b3356260b7d77c13b40e2d73b0847454600b3471baabe4de5ceb1fceadf1"},"instant":"2026-10-06T19:00:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-chaise-pleine","ratio":15.09,"role":"marque","seuil":3},{"jeton":"--couleur-chaise-trait","ratio":7.44,"role":"marque","seuil":3},{"jeton":"--couleur-echelle","ratio":14.82,"role":"marque","seuil":3},{"jeton":"--couleur-hachure","ratio":16.48,"role":"marque","seuil":3},{"jeton":"--couleur-liste-texte","ratio":14.82,"role":"texte","seuil":4.5},{"jeton":"--couleur-marque","ratio":3.63,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":13.81,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5},{"jeton":"--couleur-poignee","ratio":7.44,"role":"marque","seuil":3},{"jeton":"--couleur-selection","ratio":4.57,"role":"marque","seuil":3},{"jeton":"--couleur-table-trait","ratio":7.44,"role":"marque","seuil":3}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-chaise-pleine","ratio":14.94,"role":"marque","seuil":3},{"jeton":"--couleur-chaise-trait","ratio":8.89,"role":"marque","seuil":3},{"jeton":"--couleur-echelle","ratio":14.62,"role":"marque","seuil":3},{"jeton":"--couleur-hachure","ratio":15.21,"role":"marque","seuil":3},{"jeton":"--couleur-marque","ratio":3.5,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":11.07,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5},{"jeton":"--couleur-poignee","ratio":11.32,"role":"marque","seuil":3},{"jeton":"--couleur-selection","ratio":4.18,"role":"marque","seuil":3},{"jeton":"--couleur-table-trait","ratio":5.59,"role":"marque","seuil":3}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Soirée d’essai","13 participants","2 tables · 18 sièges","3 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Produire","Badges","Plan","Réservations","Tour affiché","1","2","3","Zoom +","Zoom −","Ajuster","Listes de noms","Légende","Plein écran","1. (réservée, tous les tours)","Basile Lanterneau","—","animation","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","9. (libre)","10. (libre)","1. (libre)","— titre","animation","non pourvu","2. (réservée, tour 1)","Capucine Pommerel","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","1","m","disposition relative — l'encombrement dans la salle n'est pas vérifié","Diagnostic","Chœur de l’Anse","4 personnes : au moins 6 collisions cumulées sur les 3 tours, portées par au moins 2 paires distinctes","Société des Hérons","4 personnes : au moins 6 collisions cumulées sur les 3 tours, portées par au moins 2 paires distinctes","Cercle des Saules","3 personnes : au moins 3 collisions cumulées sur les 3 tours, portées par au moins 1 paire distincte","Tout l'événement","au moins 8 appartenances recroisées par personne","plafond a priori 11 rencontres pour 1 ancré et 11 mobiles","2 retours imposés par 1 ancrage","Listes de travail","Titres de place non pourvus","table 2 : titre","animation","non pourvu","Titres pressentis sans réservation","Gaspard Marbrelle","— titre pressenti","animation","Réserve","Personnes en attente au tour 1","Gaspard Marbrelle","Ysaline Sablonnet","Anselme Givrecœur","Côme Fenouillet","Apolline Coudraie","Basile Lanterneau","Brunœil","Faustine Ormelin","Edgar Ardoisier","Bertille Cressonnier","Table 2, siège 1","1. (libre)","— titre","animation","non pourvu","Choisissez d'abord une personne : dans la réserve, dans la liste des pressentis, ou par « Déplacer » dans son menu.","Portée","Tour 1","Tous les tours","Libellé du titre","Assigner","Réserver","Désigner","Retirer le titre"],"theme":"clair","versionReelle":"2026.10.05.01"}, +{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"127826d1d2ae53997f9d467736f45d0e9ab663730f23ba53271fc87ce1f7fe73","etape":"7","etat":"0229d0d8208ef262e3b3485bc2f606cad900fe487d038276d3733a5423cb6a5b","facteurEchelle":1,"fichier":"09-refus-sur-place","graine":null,"image":{"hauteur":700,"largeur":1366,"sha256":"db6e14d4a0a151e4440a515f0638de0e62676e2049b59f44672815283aa47b4e"},"instant":"2026-10-06T19:00:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-chaise-pleine","ratio":15.09,"role":"marque","seuil":3},{"jeton":"--couleur-chaise-trait","ratio":7.44,"role":"marque","seuil":3},{"jeton":"--couleur-echelle","ratio":14.82,"role":"marque","seuil":3},{"jeton":"--couleur-hachure","ratio":16.48,"role":"marque","seuil":3},{"jeton":"--couleur-liste-texte","ratio":14.82,"role":"texte","seuil":4.5},{"jeton":"--couleur-marque","ratio":3.63,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":13.81,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5},{"jeton":"--couleur-poignee","ratio":7.44,"role":"marque","seuil":3},{"jeton":"--couleur-refus","ratio":8.34,"role":"texte","seuil":4.5},{"jeton":"--couleur-selection","ratio":4.57,"role":"marque","seuil":3},{"jeton":"--couleur-table-trait","ratio":7.44,"role":"marque","seuil":3}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-chaise-pleine","ratio":14.94,"role":"marque","seuil":3},{"jeton":"--couleur-chaise-trait","ratio":8.89,"role":"marque","seuil":3},{"jeton":"--couleur-echelle","ratio":14.62,"role":"marque","seuil":3},{"jeton":"--couleur-hachure","ratio":15.21,"role":"marque","seuil":3},{"jeton":"--couleur-marque","ratio":3.5,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":11.07,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5},{"jeton":"--couleur-poignee","ratio":11.32,"role":"marque","seuil":3},{"jeton":"--couleur-refus","ratio":8.14,"role":"texte","seuil":4.5},{"jeton":"--couleur-selection","ratio":4.18,"role":"marque","seuil":3},{"jeton":"--couleur-table-trait","ratio":5.59,"role":"marque","seuil":3}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Soirée d’essai","13 participants","2 tables · 18 sièges","3 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Produire","Badges","Plan","Réservations","Tour affiché","1","2","3","Zoom +","Zoom −","Ajuster","Listes de noms","Légende","Plein écran","1. (réservée, tous les tours)","Basile Lanterneau","—","animation","2. (libre)","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","9. (libre)","10. (libre)","1. (libre)","— titre","animation","non pourvu","2. (réservée, tour 1)","Capucine Pommerel","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","Table 1, siège 1","Le siège 1 est réservé à une autre personne à tous les tours : déplacer sa réservation libère la place.","Choisir une place","Fermer","1","m","disposition relative — l'encombrement dans la salle n'est pas vérifié","Diagnostic","Chœur de l’Anse","4 personnes : au moins 6 collisions cumulées sur les 3 tours, portées par au moins 2 paires distinctes","Société des Hérons","4 personnes : au moins 6 collisions cumulées sur les 3 tours, portées par au moins 2 paires distinctes","Cercle des Saules","3 personnes : au moins 3 collisions cumulées sur les 3 tours, portées par au moins 1 paire distincte","Tout l'événement","au moins 8 appartenances recroisées par personne","plafond a priori 11 rencontres pour 1 ancré et 11 mobiles","2 retours imposés par 1 ancrage","Listes de travail","Titres de place non pourvus","table 2 : titre","animation","non pourvu","Titres pressentis sans réservation","Gaspard Marbrelle","— titre pressenti","animation","Réserve","Personnes en attente au tour 1","Gaspard Marbrelle","Ysaline Sablonnet","Anselme Givrecœur","Côme Fenouillet","Apolline Coudraie","Basile Lanterneau","Brunœil","Faustine Ormelin","Edgar Ardoisier","Bertille Cressonnier","Table 1, siège 1","1. (réservée, tous les tours)","Basile Lanterneau","—","animation","Personne choisie :","Gaspard Marbrelle","Assigner","Retirer la réservation","Retirer le titre","Oublier le choix","Menu de","Basile Lanterneau","Déplacer","Échanger","Retirer du tour","Déplacer sa réservation","Exclure","Mettre en évidence","Ouvrir la fiche"],"theme":"clair","versionReelle":"2026.10.05.01"}, {"cadre":{"hauteur":700,"largeur":1366},"empreinte":"c35f4720e6dac6dc98262aba6615905ba8f6ab28d6c897551cdf07ed5c473d2c","etape":"8","etat":"4d37d30748068354162752743c26aa7e0ab00d6e9b2aa1996b6f9fb410848280","facteurEchelle":1,"fichier":"10-diagnostic","graine":null,"image":{"hauteur":700,"largeur":1366,"sha256":"6d9e4c48b101c40a4ef97fef2dc2241ab37bf5106aa362255b1d3357aecaef3d"},"instant":"2026-10-06T19:00:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":13.78,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":11.07,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Lecture","Liste des événements","Clair","Sombre","À propos","Lecture","Rien ne change ; « Modifier » passe en écriture.","Modifier","Lecture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Grande démonstration 1","260 participants","33 tables · 260 sièges","4 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Produire","Badges","Diagnostic","Tout l'événement","écart d'itinéraire maximal : plancher 1, au moins 24 mobiles finissent sous leur plafond a priori","aucune relance ne le réduit : il tient aux tables pleines dont les capacités ou les ancrages diffèrent","plafond a priori 24 rencontres pour 4 ancrés","seules les capacités et les réservations le changent : aucune relance ne le dépasse","plafond a priori 28 rencontres pour 29 ancrés et 227 mobiles","seules les capacités et les réservations le changent : aucune relance ne le dépasse","99 retours imposés par 33 ancrages","les réservations les imposent : ils ne comptent pas parmi les retours que choisit le moteur"],"theme":"clair","versionReelle":"2026.10.05.01"}, -{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"92df1b762ec96e262fa0a43a942faa68679d7ddc0742fd1274a6fa9065029072","etape":"9","etat":"9f6bd933d5b9f30eea6be42a7d0a56c0e92cdac5ab3ce7e1f363ca763eb63c7f","facteurEchelle":1,"fichier":"11-propositions","graine":4242,"image":{"hauteur":700,"largeur":1366,"sha256":"06603630ce33ce3713b0a1a195c329aac27eba9b1c87cd64a00ccd1617a06ba5"},"instant":"2026-10-06T19:02:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":14.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":11.02,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Soirée d’essai","13 participants","2 tables · 18 sièges","3 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Produire","Badges","Propositions","Propositions classées","Effacer les propositions","Ordre du classement, chaque critère au plus faible d'abord :","écart au plafond a priori",", puis","excédent de collisions",", puis","collisions cumulées",", puis","rencontres répétées",", puis","redondance d'appartenance",", puis","l'identifiant croissant",".","Personnes rencontrées","Collisions d'appartenance","Rencontres répétées et retours","Diversité d'appartenance","Manque et plafond a priori","Rang","Proposition","Personnes distinctes rencontrées, minimum : tous","Personnes distinctes rencontrées, minimum : mobiles","Personnes distinctes rencontrées, minimum : ancrés","Collisions cumulées (paire et tour)","Paires distinctes de même appartenance","Excédent de collisions (retrouvailles au-delà de la première)","Rencontres répétées choisies (paires)","Rencontres d'une même paire, au plus","Retours choisis à une table déjà occupée","Appartenances rencontrées A(p), minimum","Redondance d'appartenance, somme Σ r(p)","Taux de diversité d(p), minimum","Plus grand manque (personnes)","Personnes à qui il en manque","Écart d'itinéraire maximal (personnes)","Écart au plafond a priori maximal (personnes)","Certificat","Imposé par les réservations","Commandes","Placement retenu","3","Tel que la proposition n° 3.","11","11","11","26","15","11","30","3","11","3","85","0,27","0","0","0","0","minimum atteint","2 retours imposés par 1 ancrage.","Aucune rencontre répétée imposée.","Voir sur le plan","1","3","retenue","11","11","11","26","15","11","30","3","11","3","85","0,27","0","0","0","0","minimum atteint","2 retours imposés par 1 ancrage.","Aucune rencontre répétée imposée.","Voir sur le plan","Retenir","2","1","11","11","11","27","15","12","19","3","16","3","85","0,27","0","0","0","0","minimum atteint","2 retours imposés par 1 ancrage.","Aucune rencontre répétée imposée.","Voir sur le plan","Retenir","3","2","11","11","11","33","15","18","54","3","16","3","85","0,27","0","0","0","0","minimum atteint","2 retours imposés par 1 ancrage.","Aucune rencontre répétée imposée.","Voir sur le plan","Retenir","4","5","10","10","10","20","15","5","22","3","12","3","83","0,27","1","1","1","1","atteignabilité inconnue","2 retours imposés par 1 ancrage.","Aucune rencontre répétée imposée.","Voir sur le plan","Retenir","5","4","10","10","11","31","14","17","46","3","17","3","82","0,30","1","4","0","1","atteignabilité inconnue","2 retours imposés par 1 ancrage.","Aucune rencontre répétée imposée.","Voir sur le plan","Retenir","r(p) : le nombre de personnes que p rencontre et qui ont une appartenance, moins A(p), le nombre d'appartenances différentes qu'elles portent ; à 0, aucune appartenance n'est recroisée. La colonne donne la somme sur toutes les personnes, Σ r(p), critère du classement à la place que lui donne l'ordre écrit au-dessus du tableau. Plus elle est basse, mieux c'est.","Cible de la somme de redondance","La liste des événements montre, pour le placement retenu, la différence sans signe entre cette cible et la somme Σ r(p) de la colonne « Redondance d'appartenance ». Un nombre entier, 0 ou plus."],"theme":"clair","versionReelle":"2026.10.05.01"}, -{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"7a490a0996a770b8b52feea3af6421cbcb09a7efa2727572d8ac13409845cd12","etape":"11","etat":"9f6bd933d5b9f30eea6be42a7d0a56c0e92cdac5ab3ce7e1f363ca763eb63c7f","facteurEchelle":1,"fichier":"19-ajustement","graine":4242,"image":{"hauteur":700,"largeur":1366,"sha256":"628d4679190e73a8c50590eb755d688902318b43b2ee14c2aab0ec2ece724877"},"instant":"2026-10-06T19:02:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-chaise-pleine","ratio":15.09,"role":"marque","seuil":3},{"jeton":"--couleur-chaise-trait","ratio":7.44,"role":"marque","seuil":3},{"jeton":"--couleur-echelle","ratio":14.82,"role":"marque","seuil":3},{"jeton":"--couleur-fantome","ratio":4.34,"role":"marque","seuil":3},{"jeton":"--couleur-hachure","ratio":16.48,"role":"marque","seuil":3},{"jeton":"--couleur-liste-texte","ratio":14.82,"role":"texte","seuil":4.5},{"jeton":"--couleur-marque","ratio":3.63,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":13.81,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5},{"jeton":"--couleur-pastille-fond","ratio":13.44,"role":"marque","seuil":3},{"jeton":"--couleur-poignee","ratio":7.44,"role":"marque","seuil":3},{"jeton":"--couleur-table-trait","ratio":7.44,"role":"marque","seuil":3}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-chaise-pleine","ratio":14.94,"role":"marque","seuil":3},{"jeton":"--couleur-chaise-trait","ratio":8.89,"role":"marque","seuil":3},{"jeton":"--couleur-echelle","ratio":14.62,"role":"marque","seuil":3},{"jeton":"--couleur-fantome","ratio":4.1,"role":"marque","seuil":3},{"jeton":"--couleur-hachure","ratio":15.21,"role":"marque","seuil":3},{"jeton":"--couleur-marque","ratio":3.5,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":11.02,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5},{"jeton":"--couleur-pastille-fond","ratio":11.62,"role":"marque","seuil":3},{"jeton":"--couleur-pastille-texte","ratio":14.51,"role":"texte","seuil":4.5},{"jeton":"--couleur-poignee","ratio":11.32,"role":"marque","seuil":3},{"jeton":"--couleur-table-trait","ratio":5.59,"role":"marque","seuil":3}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Soirée d’essai","13 participants","2 tables · 18 sièges","3 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Produire","Badges","Plan","Placement retenu","Tour affiché","1","2","3","Zoom +","Zoom −","Ajuster","Listes de noms","Légende","Plein écran","9","1. (réservée, tous les tours)","Basile Lanterneau","—","animation","2.","Gaspard Marbrelle","3.","Ysaline Sablonnet","4.","Anselme Givrecœur","5.","Côme Fenouillet","6.","Apolline Coudraie","7.","Brunœil","8.","Faustine Ormelin","9.","Edgar Ardoisier","10.","Bertille Cressonnier","1.","Basile Lanterneau","— titre","animation","non pourvu","2. (réservée, tour 1)","Capucine Pommerel","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","Gaspard Marbrelle","déplace dans le placement retenu","1","m","disposition relative — l'encombrement dans la salle n'est pas vérifié","Diagnostic","Chœur de l’Anse","4 personnes : au moins 6 collisions cumulées sur les 3 tours, portées par au moins 2 paires distinctes","Société des Hérons","4 personnes : au moins 6 collisions cumulées sur les 3 tours, portées par au moins 2 paires distinctes","Cercle des Saules","3 personnes : au moins 3 collisions cumulées sur les 3 tours, portées par au moins 1 paire distincte","Tout l'événement","au moins 8 appartenances recroisées par personne","plafond a priori 11 rencontres pour 1 ancré et 11 mobiles","2 retours imposés par 1 ancrage","Listes de travail","Titres de place non pourvus","table 2 : titre","animation","non pourvu","Titres pressentis sans réservation","Gaspard Marbrelle","— titre pressenti","animation","Réserve","Personnes en attente au tour 1","Personne en attente à ce tour."],"theme":"clair","versionReelle":"2026.10.05.01"}, -{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"4a417f7a6cbad1fd9f89c4ecb7cc669bcef7fb8a38117d4e6a55c9b1d7ecf035","etape":"11","etat":"33c46c8fcafd16adbd616315240d975530137f5bf1c09e54e0149b52de4f94ac","facteurEchelle":1,"fichier":"20-mode-lecture","graine":4242,"image":{"hauteur":700,"largeur":1366,"sha256":"4f4cad699bed04e20bd932ff8f11dada090e01de4389928914d415b555e097df"},"instant":"2026-10-06T19:02:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-chaise-pleine","ratio":15.09,"role":"marque","seuil":3},{"jeton":"--couleur-chaise-trait","ratio":7.44,"role":"marque","seuil":3},{"jeton":"--couleur-conflit-appartenance","ratio":8.92,"role":"marque","seuil":3},{"jeton":"--couleur-contour-fort","ratio":12.3,"role":"marque","seuil":3},{"jeton":"--couleur-echelle","ratio":14.82,"role":"marque","seuil":3},{"jeton":"--couleur-hachure","ratio":16.48,"role":"marque","seuil":3},{"jeton":"--couleur-liste-texte","ratio":14.82,"role":"texte","seuil":4.5},{"jeton":"--couleur-marque","ratio":3.63,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":13.78,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5},{"jeton":"--couleur-pastille-fond","ratio":13.44,"role":"marque","seuil":3},{"jeton":"--couleur-poignee","ratio":7.44,"role":"marque","seuil":3},{"jeton":"--couleur-refus","ratio":8.34,"role":"texte","seuil":4.5},{"jeton":"--couleur-selection","ratio":4.57,"role":"marque","seuil":3},{"jeton":"--couleur-table-trait","ratio":7.44,"role":"marque","seuil":3}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-chaise-pleine","ratio":14.94,"role":"marque","seuil":3},{"jeton":"--couleur-chaise-trait","ratio":8.89,"role":"marque","seuil":3},{"jeton":"--couleur-conflit-appartenance","ratio":6.81,"role":"marque","seuil":3},{"jeton":"--couleur-contour-fort","ratio":11.62,"role":"marque","seuil":3},{"jeton":"--couleur-echelle","ratio":14.62,"role":"marque","seuil":3},{"jeton":"--couleur-hachure","ratio":15.21,"role":"marque","seuil":3},{"jeton":"--couleur-marque","ratio":3.5,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":11.02,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5},{"jeton":"--couleur-pastille-fond","ratio":11.62,"role":"marque","seuil":3},{"jeton":"--couleur-pastille-texte","ratio":14.51,"role":"texte","seuil":4.5},{"jeton":"--couleur-poignee","ratio":11.32,"role":"marque","seuil":3},{"jeton":"--couleur-refus","ratio":8.14,"role":"texte","seuil":4.5},{"jeton":"--couleur-selection","ratio":4.18,"role":"marque","seuil":3},{"jeton":"--couleur-table-trait","ratio":5.59,"role":"marque","seuil":3}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Lecture","Liste des événements","Clair","Sombre","À propos","Lecture","Rien ne change ; « Modifier » passe en écriture.","Modifier","Lecture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Soirée d’essai","13 participants","2 tables · 18 sièges","3 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Produire","Badges","Plan","Placement retenu","Tour affiché","1","2","3","Zoom +","Zoom −","Ajuster","Listes de noms","Légende","Plein écran","7","1. (réservée, tous les tours)","Basile Lanterneau","—","animation","2.","Ysaline Sablonnet","3.","Anselme Givrecœur","4.","Côme Fenouillet","5.","Apolline Coudraie","6.","Brunœil","7.","Faustine Ormelin","8.","Edgar Ardoisier","9.","Bertille Cressonnier","10. (libre)","1.","Gaspard Marbrelle","— titre","animation","non pourvu","2. (réservée, tour 1)","Capucine Pommerel","3.","Basile Lanterneau","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","Table 2, siège 4","L'événement est ouvert en lecture : « Modifier » permet de le changer.","Modifier","Fermer","1","m","disposition relative — l'encombrement dans la salle n'est pas vérifié","Diagnostic","Chœur de l’Anse","4 personnes : au moins 6 collisions cumulées sur les 3 tours, portées par au moins 2 paires distinctes","Société des Hérons","4 personnes : au moins 6 collisions cumulées sur les 3 tours, portées par au moins 2 paires distinctes","Cercle des Saules","3 personnes : au moins 3 collisions cumulées sur les 3 tours, portées par au moins 1 paire distincte","Tout l'événement","au moins 8 appartenances recroisées par personne","plafond a priori 11 rencontres pour 1 ancré et 11 mobiles","2 retours imposés par 1 ancrage","Listes de travail","Titres de place non pourvus","table 2 : titre","animation","non pourvu","Titres pressentis sans réservation","Gaspard Marbrelle","— titre pressenti","animation","Réserve","Personnes en attente au tour 1","Personne en attente à ce tour.","Table 2, siège 4","4. (libre)","Choisissez d'abord une personne : dans la réserve, dans la liste des pressentis, ou par « Déplacer » dans son menu.","Portée","Tour 1","Tous les tours","Libellé du titre","Assigner","Réserver","Donner un titre","Désigner"],"theme":"clair","versionReelle":"2026.10.05.01"}, -{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"157424157c0e73e2fbcd74ec125a6f13d3d1a8347aa14f70942bbc072b63083f","etape":"12","etat":"9f6bd933d5b9f30eea6be42a7d0a56c0e92cdac5ab3ce7e1f363ca763eb63c7f","facteurEchelle":1,"fichier":"22-plan-brouillon","graine":4242,"image":{"hauteur":700,"largeur":1366,"sha256":"e177c04ec9d589d11046f63c5299542c3cb5f7422446597e6e9cb497768d300d"},"instant":"2026-10-06T19:02:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":13.44,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-chaise-pleine","ratio":16.48,"role":"marque","seuil":3},{"jeton":"--couleur-chaise-trait","ratio":8.13,"role":"marque","seuil":3},{"jeton":"--couleur-echelle","ratio":16.18,"role":"marque","seuil":3},{"jeton":"--couleur-filigrane","ratio":5.1,"role":"marque","seuil":3},{"jeton":"--couleur-hachure","ratio":16.48,"role":"marque","seuil":3},{"jeton":"--couleur-liste-texte","ratio":16.18,"role":"texte","seuil":4.5},{"jeton":"--couleur-marque","ratio":3.63,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":16.19,"role":"texte","seuil":4.5},{"jeton":"--couleur-pastille-fond","ratio":13.44,"role":"marque","seuil":3},{"jeton":"--couleur-table-trait","ratio":8.13,"role":"marque","seuil":3}],"sombre":[{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-chaise-pleine","ratio":16.48,"role":"marque","seuil":3},{"jeton":"--couleur-chaise-trait","ratio":8.13,"role":"marque","seuil":3},{"jeton":"--couleur-echelle","ratio":16.18,"role":"marque","seuil":3},{"jeton":"--couleur-filigrane","ratio":5.1,"role":"marque","seuil":3},{"jeton":"--couleur-hachure","ratio":16.48,"role":"marque","seuil":3},{"jeton":"--couleur-marque","ratio":3.63,"role":"marque","seuil":3},{"jeton":"--couleur-papier","ratio":13.44,"role":"texte","seuil":4.5},{"jeton":"--couleur-pastille-fond","ratio":13.44,"role":"marque","seuil":3},{"jeton":"--couleur-table-trait","ratio":8.13,"role":"marque","seuil":3},{"jeton":"rgb(24, 33, 47)","ratio":16.19,"role":"texte","seuil":4.5},{"jeton":"rgb(28, 33, 40)","ratio":16.18,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Aperçu avant impression","Écriture","Plan de salle","Liste d'accueil","Feuilles par table","Tour imprimé","Tour 1","Tour 2","Tour 3","Listes de noms","Pages du plan","Découpage proposé","Tout sur une page","Découper en pages","Papier :","A4","Changer","Imprimer","Fermer l'aperçu","Page 888 sur 888 — colonne WW, rangée 888","au-dessus : page 888","à droite : page 888","au-dessous : page 888","à gauche : page 888","500","m","disposition relative — l'encombrement dans la salle n'est pas vérifié","listes de noms hors d'échelle — le plan à l'échelle du bâtiment s'imprime listes masquées","Soirée d’essai","Date non fixée","Tour 1","Placement du","6 octobre 2026, 19 h 00","Version","construction de documentation","6","1","1. (réservée, tous les tours)","Basile Lanterneau","—","animation","2.","Ysaline Sablonnet","3.","Anselme Givrecœur","4.","Côme Fenouillet","5.","Apolline Coudraie","6.","Brunœil","7.","Faustine Ormelin","8.","Edgar Ardoisier","9. (libre)","10. (libre)","1.","Gaspard Marbrelle","— titre","animation","non pourvu","2. (réservée, tour 1)","Capucine Pommerel","3.","Basile Lanterneau","4.","Bertille Cressonnier","5. (libre)","6. (libre)","7. (libre)","8. (libre)","Page 1 sur 1 — colonne A, rangée 1","2","m","disposition relative — l'encombrement dans la salle n'est pas vérifié","listes de noms hors d'échelle — le plan à l'échelle du bâtiment s'imprime listes masquées","Soirée d’essai","Date non fixée","Tour 1","Placement du","6 octobre 2026, 19 h 00","Version","construction de documentation","BROUILLON"],"theme":"clair","versionReelle":"2026.10.05.01"}, -{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"e717b07fa24dcf8efd109f9d827425d4e47d6a48b9fdb9955fa254f97bc9e0f7","etape":"12","etat":"9f6bd933d5b9f30eea6be42a7d0a56c0e92cdac5ab3ce7e1f363ca763eb63c7f","facteurEchelle":1,"fichier":"23-plan-retenu","graine":4242,"image":{"hauteur":700,"largeur":1366,"sha256":"e189fe3f4041809b0a789de0aab22233ad1d9e5822364b86285c62516028aa6b"},"instant":"2026-10-06T19:02:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":13.44,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-chaise-pleine","ratio":16.48,"role":"marque","seuil":3},{"jeton":"--couleur-chaise-trait","ratio":8.13,"role":"marque","seuil":3},{"jeton":"--couleur-conflit-appartenance","ratio":8.92,"role":"marque","seuil":3},{"jeton":"--couleur-contour-fort","ratio":13.44,"role":"marque","seuil":3},{"jeton":"--couleur-echelle","ratio":16.18,"role":"marque","seuil":3},{"jeton":"--couleur-hachure","ratio":16.48,"role":"marque","seuil":3},{"jeton":"--couleur-liste-texte","ratio":16.18,"role":"texte","seuil":4.5},{"jeton":"--couleur-marque","ratio":3.63,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":16.19,"role":"texte","seuil":4.5},{"jeton":"--couleur-pastille-fond","ratio":13.44,"role":"marque","seuil":3},{"jeton":"--couleur-table-trait","ratio":8.13,"role":"marque","seuil":3}],"sombre":[{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-chaise-pleine","ratio":16.48,"role":"marque","seuil":3},{"jeton":"--couleur-chaise-trait","ratio":8.13,"role":"marque","seuil":3},{"jeton":"--couleur-conflit-appartenance","ratio":8.92,"role":"marque","seuil":3},{"jeton":"--couleur-contour-fort","ratio":13.44,"role":"marque","seuil":3},{"jeton":"--couleur-echelle","ratio":16.18,"role":"marque","seuil":3},{"jeton":"--couleur-hachure","ratio":16.48,"role":"marque","seuil":3},{"jeton":"--couleur-marque","ratio":3.63,"role":"marque","seuil":3},{"jeton":"--couleur-papier","ratio":13.44,"role":"texte","seuil":4.5},{"jeton":"--couleur-pastille-fond","ratio":13.44,"role":"marque","seuil":3},{"jeton":"--couleur-table-trait","ratio":8.13,"role":"marque","seuil":3},{"jeton":"rgb(24, 33, 47)","ratio":16.19,"role":"texte","seuil":4.5},{"jeton":"rgb(28, 33, 40)","ratio":16.18,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Aperçu avant impression","Écriture","Plan de salle","Liste d'accueil","Feuilles par table","Tour imprimé","Tour 1","Tour 2","Tour 3","Listes de noms","Pages du plan","Découpage proposé","Tout sur une page","Découper en pages","Papier :","A4","Changer","Imprimer","Fermer l'aperçu","Page 888 sur 888 — colonne WW, rangée 888","au-dessus : page 888","à droite : page 888","au-dessous : page 888","à gauche : page 888","500","m","disposition relative — l'encombrement dans la salle n'est pas vérifié","listes de noms hors d'échelle — le plan à l'échelle du bâtiment s'imprime listes masquées","Soirée d’essai","Date non fixée","Tour 1","Placement du","6 octobre 2026, 19 h 02","Version","construction de documentation","9","1. (réservée, tous les tours)","Basile Lanterneau","—","animation","2.","Gaspard Marbrelle","3.","Ysaline Sablonnet","4.","Anselme Givrecœur","5.","Côme Fenouillet","6.","Apolline Coudraie","7.","Brunœil","8.","Faustine Ormelin","9.","Edgar Ardoisier","10.","Bertille Cressonnier","1.","Basile Lanterneau","— titre","animation","non pourvu","2. (réservée, tour 1)","Capucine Pommerel","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","Page 1 sur 1 — colonne A, rangée 1","2","m","disposition relative — l'encombrement dans la salle n'est pas vérifié","listes de noms hors d'échelle — le plan à l'échelle du bâtiment s'imprime listes masquées","Soirée d’essai","Date non fixée","Tour 1","Placement du","6 octobre 2026, 19 h 02","Version","construction de documentation"],"theme":"clair","versionReelle":"2026.10.05.01"}, -{"cadre":{"hauteur":1123,"largeur":794},"empreinte":"29cb888ad5e95394a40b4afd75c28fedeae8fc7ba0ee073e9ce192cdb8fabf07","etape":"12","etat":"9f6bd933d5b9f30eea6be42a7d0a56c0e92cdac5ab3ce7e1f363ca763eb63c7f","facteurEchelle":1,"fichier":"24-badges-controle","graine":4242,"image":{"hauteur":1123,"largeur":794,"sha256":"4731d411c33a6fa9a889acbfe92d1460a988c6f202f96578286b7d0e02109eb9"},"instant":"2026-10-06T19:03:00-04:00","mode":"pdfjs-dist-96ppp","pdf":"2f0f58fece0ba41d5a0825c83f30dea7931bc9b665e3890b4fe4f371d90559f4","source":"pdf","styles":{"clair":[],"sombre":[]},"texte":["0","50","100","Badge : 105 × 148 mm (A6)","Papier : A4, 210 × 297 mm","Imposition : feuille par feuille","Planches : 3","12 badges pour 13 participants, 1 exclu","Événement : Soirée d’essai","Source : le placement retenu","Placement du 6 octobre 2026 à 19:02:00","Version : construction de documentation","Imprimer en recto seul, à 100 %"],"theme":"clair","versionReelle":"2026.10.05.01"}, -{"cadre":{"hauteur":1123,"largeur":794},"empreinte":"ff6cc7b4a897224a5d31dbefb0d195845181a248cbddfaa5667637496e36d86b","etape":"12","etat":"9f6bd933d5b9f30eea6be42a7d0a56c0e92cdac5ab3ce7e1f363ca763eb63c7f","facteurEchelle":1,"fichier":"25-badges-planche","graine":4242,"image":{"hauteur":1123,"largeur":794,"sha256":"5375de3104896af92144a7b455746f989fc802cc320b8b6f52e1351c7718bf43"},"instant":"2026-10-06T19:03:00-04:00","mode":"pdfjs-dist-96ppp","pdf":"2f0f58fece0ba41d5a0825c83f30dea7931bc9b665e3890b4fe4f371d90559f4","source":"pdf","styles":{"clair":[],"sombre":[]},"texte":["Edgar Ardoisier","Société des Hérons","Tour 1 — table 1","Tour 2 — table 1","Tour 3 — table 2","Soirée d’essai","Placement du 6 octobre 2026 à 19:02:00","Brunœil","Cercle des Saules","Tour 1 — table 1","Tour 2 — table 2","Tour 3 — table 1","Soirée d’essai","Placement du 6 octobre 2026 à 19:02:00","Apolline Coudraie","Chœur de l’Anse","Tour 1 — table 1","Tour 2 — table 2","Tour 3 — table 1","Soirée d’essai","Placement du 6 octobre 2026 à 19:02:00","Bertille Cressonnier","Cercle des Saules","Tour 1 — table 1","Tour 2 — table 2","Tour 3 — table 1","Soirée d’essai","Placement du 6 octobre 2026 à 19:02:00"],"theme":"clair","versionReelle":"2026.10.05.01"} +{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"16eaaf9da585d8305ecb5975ddbb4b6f97ee2800ba9680389b55a1438c941efe","etape":"9","etat":"1025fe8c346e3a503f00abcaf78cf004f33fe2c01a46bebd87da1bbf4d0b3f53","facteurEchelle":1,"fichier":"10a-ordre-priorites","graine":null,"image":{"hauteur":700,"largeur":1366,"sha256":"097cbf2794eb21f94d10ca51df746ab4008a5bf17cba7aff2b4184670e70c7b6"},"instant":"2026-10-06T19:00:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":14.16,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":11.07,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Soirée d’essai","13 participants","2 tables · 18 sièges","3 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Produire","Badges","Génération","Meilleure proposition du classement","Aucune proposition classée : sans proposition comparable, le classement n'en désigne aucune.","Réglages de la génération","Graine (nombre entier, de 0 à 4 294 967 295)","Propositions par génération (nombre de propositions)","Compte d'arrêt (mouvements évalués par proposition)","Historique d'acceptation (longueur, en mouvements)","Contraintes de la génération","Séparer les appartenances","Nouveaux voisins à chaque tour","Nouvelle table à chaque tour","Varier les appartenances rencontrées","Respecter les objectifs des tables","Objectifs des tables : chercher d'abord","le plus de places servies","Le plus grand total de tours servis : le critère compare les tours hors objectif.","chacun au moins une fois","D'abord le plus de personnes servies à un tour au moins, puis le plus grand total : le critère compare les personnes jamais servies, puis les tours hors objectif.","l'équité d'abord","Le minimum d'abord, puis le total : d'abord la personne la plus mal servie, mesurée contre ses propres tours possibles, puis le plus grand total. Le critère compare le plus de tours hors objectif d'une personne, puis les tours hors objectif.","Rencontrer le plus d'animateurs différents","Attribuer les sièges","Ordre des priorités","Deux propositions se comparent palier par palier : un palier ne départage que des propositions égales sur ceux qui le précèdent. Dans un palier de plusieurs critères, chacun compte selon son poids.","Ordre réglé pour l'événement.","Palier 1 sur 6","écart au plafond a priori","Descendre « écart au plafond a priori » d'un palier","Palier 2 sur 6","excédent de collisions","Poids de « excédent de collisions » (nombre entier)","Monter le palier de « excédent de collisions »","Descendre le palier de « excédent de collisions »","Séparer « excédent de collisions » en palier propre","tours hors objectif","Poids de « tours hors objectif » (nombre entier)","Monter le palier de « tours hors objectif »","Descendre le palier de « tours hors objectif »","Séparer « tours hors objectif » en palier propre","Palier 3 sur 6","collisions cumulées","Monter « collisions cumulées » d'un palier","Descendre « collisions cumulées » d'un palier","Joindre « collisions cumulées » au palier du dessus","Palier 4 sur 6","rencontres répétées et retours","Monter « rencontres répétées et retours » d'un palier","Descendre « rencontres répétées et retours » d'un palier","Palier 5 sur 6","animateurs non rencontrés","décoché","Monter « animateurs non rencontrés » d'un palier","Descendre « animateurs non rencontrés » d'un palier","Palier 6 sur 6","redondance d'appartenance","Monter « redondance d'appartenance » d'un palier","Joindre « redondance d'appartenance » au palier du dessus","« tours hors objectif » est au palier 2 sur 6, avec « excédent de collisions ».","Rétablir l'ordre par défaut","Cœurs de calcul","Cœurs automatiques (un par processeur logique du poste)","Valeur automatique sur ce poste : 4 cœurs, un par processeur logique, hyperthreads compris.","Une génération n'emploie jamais plus de cœurs que de propositions demandées. Ce réglage vaut pour cette séance du logiciel sur ce poste : il ne s'enregistre pas dans l'événement.","Aucun calcul n'est encore mesuré sur ce poste pendant cette séance : la durée d'une génération est inconnue.","Générer"],"theme":"clair","versionReelle":"2026.10.05.01"}, +{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"df0e5d4dbc1191c7b5ae715c276a366d61b185c4f724009fc508d3c499b06c8a","etape":"9","etat":"b42451443701c80d433d632788edaab7dd1afea7a57add55a37fcedfdaee98ff","facteurEchelle":1,"fichier":"11-propositions","graine":4242,"image":{"hauteur":700,"largeur":1366,"sha256":"047dedcd90dd84347dc8637bccde6d56f8fbd990bdfc6c74eb8e3b3a5e08065f"},"instant":"2026-10-06T19:02:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":14.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":11.02,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Soirée d’essai","13 participants","2 tables · 18 sièges","3 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Produire","Badges","Propositions","Propositions classées","Effacer les propositions","Ordre du classement, chaque critère au plus faible d'abord :","écart au plafond a priori",", puis","ensemble,","excédent de collisions","(poids 1)",",","tours hors objectif","(poids 3)",", puis","collisions cumulées",", puis","rencontres répétées",", puis","redondance d'appartenance",", puis","l'identifiant croissant",".","Personnes rencontrées","Collisions d'appartenance","Rencontres répétées et retours","Diversité d'appartenance","Manque et plafond a priori","Objectifs des tables et animateurs","Rang","Proposition","Personnes distinctes rencontrées, minimum : tous","Personnes distinctes rencontrées, minimum : mobiles","Personnes distinctes rencontrées, minimum : ancrés","Collisions cumulées (paire et tour)","Paires distinctes de même appartenance","Excédent de collisions (retrouvailles au-delà de la première)","Rencontres répétées choisies (paires)","Rencontres d'une même paire, au plus","Retours choisis à une table déjà occupée","Appartenances rencontrées A(p), minimum","Redondance d'appartenance, somme Σ r(p)","Taux de diversité d(p), minimum","Plus grand manque (personnes)","Personnes à qui il en manque","Écart d'itinéraire maximal (personnes)","Écart au plafond a priori maximal (personnes)","Tours hors objectif (personne et tour)","Tours selon l'objectif s(p), minimum","Certificat","Imposé par les réservations","Commandes","Placement retenu","3","Tel que la proposition n° 3.","11","11","11","26","15","11","30","3","11","3","85","0,27","0","0","0","0","1","1","minimum atteint","2 retours imposés par 1 ancrage.","Aucune rencontre répétée imposée.","Voir sur le plan","1","3","retenue","11","11","11","26","15","11","30","3","11","3","85","0,27","0","0","0","0","1","1","minimum atteint","2 retours imposés par 1 ancrage.","Aucune rencontre répétée imposée.","Voir sur le plan","Retenir","2","2","11","11","11","33","15","18","54","3","16","3","85","0,27","0","0","0","0","2","1","minimum atteint","2 retours imposés par 1 ancrage.","Aucune rencontre répétée imposée.","Voir sur le plan","Retenir","3","5","10","10","10","20","15","5","22","3","12","3","83","0,27","1","1","1","1","1","1","atteignabilité inconnue","2 retours imposés par 1 ancrage.","Aucune rencontre répétée imposée.","Voir sur le plan","Retenir","4","1","10","10","11","29","15","14","46","3","13","3","82","0,30","1","4","0","1","0","2","atteignabilité inconnue","2 retours imposés par 1 ancrage.","Aucune rencontre répétée imposée.","Voir sur le plan","Retenir","5","4","10","10","11","31","14","17","46","3","17","3","82","0,30","1","4","0","1","0","2","atteignabilité inconnue","2 retours imposés par 1 ancrage.","Aucune rencontre répétée imposée.","Voir sur le plan","Retenir","Cible de la somme de redondance","La liste des événements montre, pour le placement retenu, la différence sans signe entre cette cible et la somme Σ r(p) de la colonne « Redondance d'appartenance ». Un nombre entier, 0 ou plus."],"theme":"clair","versionReelle":"2026.10.05.01"}, +{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"bcf0f6b2bd8f8f5118ba7afeaf82157ab445f462cac9177c9746b2da9638955f","etape":"11","etat":"b42451443701c80d433d632788edaab7dd1afea7a57add55a37fcedfdaee98ff","facteurEchelle":1,"fichier":"19-ajustement","graine":4242,"image":{"hauteur":700,"largeur":1366,"sha256":"628d4679190e73a8c50590eb755d688902318b43b2ee14c2aab0ec2ece724877"},"instant":"2026-10-06T19:02:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-chaise-pleine","ratio":15.09,"role":"marque","seuil":3},{"jeton":"--couleur-chaise-trait","ratio":7.44,"role":"marque","seuil":3},{"jeton":"--couleur-echelle","ratio":14.82,"role":"marque","seuil":3},{"jeton":"--couleur-fantome","ratio":4.34,"role":"marque","seuil":3},{"jeton":"--couleur-hachure","ratio":16.48,"role":"marque","seuil":3},{"jeton":"--couleur-liste-texte","ratio":14.82,"role":"texte","seuil":4.5},{"jeton":"--couleur-marque","ratio":3.63,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":13.81,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5},{"jeton":"--couleur-pastille-fond","ratio":13.44,"role":"marque","seuil":3},{"jeton":"--couleur-poignee","ratio":7.44,"role":"marque","seuil":3},{"jeton":"--couleur-table-trait","ratio":7.44,"role":"marque","seuil":3}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-chaise-pleine","ratio":14.94,"role":"marque","seuil":3},{"jeton":"--couleur-chaise-trait","ratio":8.89,"role":"marque","seuil":3},{"jeton":"--couleur-echelle","ratio":14.62,"role":"marque","seuil":3},{"jeton":"--couleur-fantome","ratio":4.1,"role":"marque","seuil":3},{"jeton":"--couleur-hachure","ratio":15.21,"role":"marque","seuil":3},{"jeton":"--couleur-marque","ratio":3.5,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":11.02,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5},{"jeton":"--couleur-pastille-fond","ratio":11.62,"role":"marque","seuil":3},{"jeton":"--couleur-pastille-texte","ratio":14.51,"role":"texte","seuil":4.5},{"jeton":"--couleur-poignee","ratio":11.32,"role":"marque","seuil":3},{"jeton":"--couleur-table-trait","ratio":5.59,"role":"marque","seuil":3}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Soirée d’essai","13 participants","2 tables · 18 sièges","3 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Produire","Badges","Plan","Placement retenu","Tour affiché","1","2","3","Zoom +","Zoom −","Ajuster","Listes de noms","Légende","Plein écran","9","1. (réservée, tous les tours)","Basile Lanterneau","—","animation","2.","Gaspard Marbrelle","3.","Ysaline Sablonnet","4.","Anselme Givrecœur","5.","Côme Fenouillet","6.","Apolline Coudraie","7.","Brunœil","8.","Faustine Ormelin","9.","Edgar Ardoisier","10.","Bertille Cressonnier","1.","Basile Lanterneau","— titre","animation","non pourvu","2. (réservée, tour 1)","Capucine Pommerel","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","Gaspard Marbrelle","déplace dans le placement retenu","1","m","disposition relative — l'encombrement dans la salle n'est pas vérifié","Diagnostic","Chœur de l’Anse","4 personnes : au moins 6 collisions cumulées sur les 3 tours, portées par au moins 2 paires distinctes","Société des Hérons","4 personnes : au moins 6 collisions cumulées sur les 3 tours, portées par au moins 2 paires distinctes","Cercle des Saules","3 personnes : au moins 3 collisions cumulées sur les 3 tours, portées par au moins 1 paire distincte","Tout l'événement","au moins 8 appartenances recroisées par personne","plafond a priori 11 rencontres pour 1 ancré et 11 mobiles","2 retours imposés par 1 ancrage","Listes de travail","Titres de place non pourvus","table 2 : titre","animation","non pourvu","Titres pressentis sans réservation","Gaspard Marbrelle","— titre pressenti","animation","Réserve","Personnes en attente au tour 1","Personne en attente à ce tour."],"theme":"clair","versionReelle":"2026.10.05.01"}, +{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"1ba00a6086f6d2f1b695469f1a26ec19092805835305fd30c07310a1911992d0","etape":"11","etat":"e60a6d4dbb76287b287857b2175d4a784996dcdb3cf6df8e8e30cc9d4d01c14d","facteurEchelle":1,"fichier":"20-mode-lecture","graine":4242,"image":{"hauteur":700,"largeur":1366,"sha256":"4f4cad699bed04e20bd932ff8f11dada090e01de4389928914d415b555e097df"},"instant":"2026-10-06T19:02:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-chaise-pleine","ratio":15.09,"role":"marque","seuil":3},{"jeton":"--couleur-chaise-trait","ratio":7.44,"role":"marque","seuil":3},{"jeton":"--couleur-conflit-appartenance","ratio":8.92,"role":"marque","seuil":3},{"jeton":"--couleur-contour-fort","ratio":12.3,"role":"marque","seuil":3},{"jeton":"--couleur-echelle","ratio":14.82,"role":"marque","seuil":3},{"jeton":"--couleur-hachure","ratio":16.48,"role":"marque","seuil":3},{"jeton":"--couleur-liste-texte","ratio":14.82,"role":"texte","seuil":4.5},{"jeton":"--couleur-marque","ratio":3.63,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":13.78,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5},{"jeton":"--couleur-pastille-fond","ratio":13.44,"role":"marque","seuil":3},{"jeton":"--couleur-poignee","ratio":7.44,"role":"marque","seuil":3},{"jeton":"--couleur-refus","ratio":8.34,"role":"texte","seuil":4.5},{"jeton":"--couleur-selection","ratio":4.57,"role":"marque","seuil":3},{"jeton":"--couleur-table-trait","ratio":7.44,"role":"marque","seuil":3}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-chaise-pleine","ratio":14.94,"role":"marque","seuil":3},{"jeton":"--couleur-chaise-trait","ratio":8.89,"role":"marque","seuil":3},{"jeton":"--couleur-conflit-appartenance","ratio":6.81,"role":"marque","seuil":3},{"jeton":"--couleur-contour-fort","ratio":11.62,"role":"marque","seuil":3},{"jeton":"--couleur-echelle","ratio":14.62,"role":"marque","seuil":3},{"jeton":"--couleur-hachure","ratio":15.21,"role":"marque","seuil":3},{"jeton":"--couleur-marque","ratio":3.5,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":11.02,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5},{"jeton":"--couleur-pastille-fond","ratio":11.62,"role":"marque","seuil":3},{"jeton":"--couleur-pastille-texte","ratio":14.51,"role":"texte","seuil":4.5},{"jeton":"--couleur-poignee","ratio":11.32,"role":"marque","seuil":3},{"jeton":"--couleur-refus","ratio":8.14,"role":"texte","seuil":4.5},{"jeton":"--couleur-selection","ratio":4.18,"role":"marque","seuil":3},{"jeton":"--couleur-table-trait","ratio":5.59,"role":"marque","seuil":3}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Lecture","Liste des événements","Clair","Sombre","À propos","Lecture","Rien ne change ; « Modifier » passe en écriture.","Modifier","Lecture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Soirée d’essai","13 participants","2 tables · 18 sièges","3 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Produire","Badges","Plan","Placement retenu","Tour affiché","1","2","3","Zoom +","Zoom −","Ajuster","Listes de noms","Légende","Plein écran","7","1. (réservée, tous les tours)","Basile Lanterneau","—","animation","2.","Ysaline Sablonnet","3.","Anselme Givrecœur","4.","Côme Fenouillet","5.","Apolline Coudraie","6.","Brunœil","7.","Faustine Ormelin","8.","Edgar Ardoisier","9.","Bertille Cressonnier","10. (libre)","1.","Gaspard Marbrelle","— titre","animation","non pourvu","2. (réservée, tour 1)","Capucine Pommerel","3.","Basile Lanterneau","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","Table 2, siège 4","L'événement est ouvert en lecture : « Modifier » permet de le changer.","Modifier","Fermer","1","m","disposition relative — l'encombrement dans la salle n'est pas vérifié","Diagnostic","Chœur de l’Anse","4 personnes : au moins 6 collisions cumulées sur les 3 tours, portées par au moins 2 paires distinctes","Société des Hérons","4 personnes : au moins 6 collisions cumulées sur les 3 tours, portées par au moins 2 paires distinctes","Cercle des Saules","3 personnes : au moins 3 collisions cumulées sur les 3 tours, portées par au moins 1 paire distincte","Tout l'événement","au moins 8 appartenances recroisées par personne","plafond a priori 11 rencontres pour 1 ancré et 11 mobiles","2 retours imposés par 1 ancrage","Listes de travail","Titres de place non pourvus","table 2 : titre","animation","non pourvu","Titres pressentis sans réservation","Gaspard Marbrelle","— titre pressenti","animation","Réserve","Personnes en attente au tour 1","Personne en attente à ce tour.","Table 2, siège 4","4. (libre)","Choisissez d'abord une personne : dans la réserve, dans la liste des pressentis, ou par « Déplacer » dans son menu.","Portée","Tour 1","Tous les tours","Libellé du titre","Assigner","Réserver","Donner un titre","Désigner"],"theme":"clair","versionReelle":"2026.10.05.01"}, +{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"7fc4ff24d0e38bac9ebc42cb6f38942b97e13a2aca9eb9b20e169cbdf0b87343","etape":"12","etat":"b42451443701c80d433d632788edaab7dd1afea7a57add55a37fcedfdaee98ff","facteurEchelle":1,"fichier":"22-plan-brouillon","graine":4242,"image":{"hauteur":700,"largeur":1366,"sha256":"d9be4f1916a5d0a6ed71358292fb6b92727e4cb04f422f4cff7a853f1e441d31"},"instant":"2026-10-06T19:02:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":13.44,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-chaise-pleine","ratio":16.48,"role":"marque","seuil":3},{"jeton":"--couleur-chaise-trait","ratio":8.13,"role":"marque","seuil":3},{"jeton":"--couleur-echelle","ratio":16.18,"role":"marque","seuil":3},{"jeton":"--couleur-filigrane","ratio":5.1,"role":"marque","seuil":3},{"jeton":"--couleur-hachure","ratio":16.48,"role":"marque","seuil":3},{"jeton":"--couleur-liste-texte","ratio":16.18,"role":"texte","seuil":4.5},{"jeton":"--couleur-marque","ratio":3.63,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":16.19,"role":"texte","seuil":4.5},{"jeton":"--couleur-pastille-fond","ratio":13.44,"role":"marque","seuil":3},{"jeton":"--couleur-table-trait","ratio":8.13,"role":"marque","seuil":3}],"sombre":[{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-chaise-pleine","ratio":16.48,"role":"marque","seuil":3},{"jeton":"--couleur-chaise-trait","ratio":8.13,"role":"marque","seuil":3},{"jeton":"--couleur-echelle","ratio":16.18,"role":"marque","seuil":3},{"jeton":"--couleur-filigrane","ratio":5.1,"role":"marque","seuil":3},{"jeton":"--couleur-hachure","ratio":16.48,"role":"marque","seuil":3},{"jeton":"--couleur-marque","ratio":3.63,"role":"marque","seuil":3},{"jeton":"--couleur-papier","ratio":13.44,"role":"texte","seuil":4.5},{"jeton":"--couleur-pastille-fond","ratio":13.44,"role":"marque","seuil":3},{"jeton":"--couleur-table-trait","ratio":8.13,"role":"marque","seuil":3},{"jeton":"rgb(24, 33, 47)","ratio":16.19,"role":"texte","seuil":4.5},{"jeton":"rgb(28, 33, 40)","ratio":16.18,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Aperçu avant impression","Écriture","Plan de salle","Liste d'accueil","Feuilles par table","Tour imprimé","Tour 1","Tour 2","Tour 3","Listes de noms","Pages du plan","Découpage proposé","Tout sur une page","Découper en pages","Papier :","A4","Changer","Imprimer","Fermer l'aperçu","Page 888 sur 888 — colonne WW, rangée 888","au-dessus : page 888","à droite : page 888","au-dessous : page 888","à gauche : page 888","500","m","disposition relative — l'encombrement dans la salle n'est pas vérifié","listes de noms hors d'échelle — le plan à l'échelle du bâtiment s'imprime listes masquées","Soirée d’essai","Date non fixée","Tour 1","Placement du","6 octobre 2026, 19 h 00","Version","construction de documentation","10","1","1. (réservée, tous les tours)","Basile Lanterneau","—","animation","2.","Gaspard Marbrelle","3.","Ysaline Sablonnet","4.","Anselme Givrecœur","5.","Apolline Coudraie","6.","Basile Lanterneau","7.","Brunœil","8.","Faustine Ormelin","9.","Edgar Ardoisier","10.","Bertille Cressonnier","1.","Côme Fenouillet","— titre","animation","non pourvu","2. (réservée, tour 1)","Capucine Pommerel","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","Page 1 sur 1 — colonne A, rangée 1","2","m","disposition relative — l'encombrement dans la salle n'est pas vérifié","listes de noms hors d'échelle — le plan à l'échelle du bâtiment s'imprime listes masquées","Soirée d’essai","Date non fixée","Tour 1","Placement du","6 octobre 2026, 19 h 00","Version","construction de documentation","BROUILLON"],"theme":"clair","versionReelle":"2026.10.05.01"}, +{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"6752947d76c6552da46b3ba5f7a29b8e7688f111876a84e9ec15722132323c9e","etape":"12","etat":"b42451443701c80d433d632788edaab7dd1afea7a57add55a37fcedfdaee98ff","facteurEchelle":1,"fichier":"23-plan-retenu","graine":4242,"image":{"hauteur":700,"largeur":1366,"sha256":"e189fe3f4041809b0a789de0aab22233ad1d9e5822364b86285c62516028aa6b"},"instant":"2026-10-06T19:02:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":13.44,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-chaise-pleine","ratio":16.48,"role":"marque","seuil":3},{"jeton":"--couleur-chaise-trait","ratio":8.13,"role":"marque","seuil":3},{"jeton":"--couleur-conflit-appartenance","ratio":8.92,"role":"marque","seuil":3},{"jeton":"--couleur-contour-fort","ratio":13.44,"role":"marque","seuil":3},{"jeton":"--couleur-echelle","ratio":16.18,"role":"marque","seuil":3},{"jeton":"--couleur-hachure","ratio":16.48,"role":"marque","seuil":3},{"jeton":"--couleur-liste-texte","ratio":16.18,"role":"texte","seuil":4.5},{"jeton":"--couleur-marque","ratio":3.63,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":16.19,"role":"texte","seuil":4.5},{"jeton":"--couleur-pastille-fond","ratio":13.44,"role":"marque","seuil":3},{"jeton":"--couleur-table-trait","ratio":8.13,"role":"marque","seuil":3}],"sombre":[{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-chaise-pleine","ratio":16.48,"role":"marque","seuil":3},{"jeton":"--couleur-chaise-trait","ratio":8.13,"role":"marque","seuil":3},{"jeton":"--couleur-conflit-appartenance","ratio":8.92,"role":"marque","seuil":3},{"jeton":"--couleur-contour-fort","ratio":13.44,"role":"marque","seuil":3},{"jeton":"--couleur-echelle","ratio":16.18,"role":"marque","seuil":3},{"jeton":"--couleur-hachure","ratio":16.48,"role":"marque","seuil":3},{"jeton":"--couleur-marque","ratio":3.63,"role":"marque","seuil":3},{"jeton":"--couleur-papier","ratio":13.44,"role":"texte","seuil":4.5},{"jeton":"--couleur-pastille-fond","ratio":13.44,"role":"marque","seuil":3},{"jeton":"--couleur-table-trait","ratio":8.13,"role":"marque","seuil":3},{"jeton":"rgb(24, 33, 47)","ratio":16.19,"role":"texte","seuil":4.5},{"jeton":"rgb(28, 33, 40)","ratio":16.18,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Aperçu avant impression","Écriture","Plan de salle","Liste d'accueil","Feuilles par table","Tour imprimé","Tour 1","Tour 2","Tour 3","Listes de noms","Pages du plan","Découpage proposé","Tout sur une page","Découper en pages","Papier :","A4","Changer","Imprimer","Fermer l'aperçu","Page 888 sur 888 — colonne WW, rangée 888","au-dessus : page 888","à droite : page 888","au-dessous : page 888","à gauche : page 888","500","m","disposition relative — l'encombrement dans la salle n'est pas vérifié","listes de noms hors d'échelle — le plan à l'échelle du bâtiment s'imprime listes masquées","Soirée d’essai","Date non fixée","Tour 1","Placement du","6 octobre 2026, 19 h 02","Version","construction de documentation","9","1. (réservée, tous les tours)","Basile Lanterneau","—","animation","2.","Gaspard Marbrelle","3.","Ysaline Sablonnet","4.","Anselme Givrecœur","5.","Côme Fenouillet","6.","Apolline Coudraie","7.","Brunœil","8.","Faustine Ormelin","9.","Edgar Ardoisier","10.","Bertille Cressonnier","1.","Basile Lanterneau","— titre","animation","non pourvu","2. (réservée, tour 1)","Capucine Pommerel","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","Page 1 sur 1 — colonne A, rangée 1","2","m","disposition relative — l'encombrement dans la salle n'est pas vérifié","listes de noms hors d'échelle — le plan à l'échelle du bâtiment s'imprime listes masquées","Soirée d’essai","Date non fixée","Tour 1","Placement du","6 octobre 2026, 19 h 02","Version","construction de documentation"],"theme":"clair","versionReelle":"2026.10.05.01"}, +{"cadre":{"hauteur":1123,"largeur":794},"empreinte":"8bf456355f4a90884fcbb65192bba98a0c23a564d8789d6466a63ddab96f1ea9","etape":"12","etat":"b42451443701c80d433d632788edaab7dd1afea7a57add55a37fcedfdaee98ff","facteurEchelle":1,"fichier":"24-badges-controle","graine":4242,"image":{"hauteur":1123,"largeur":794,"sha256":"4731d411c33a6fa9a889acbfe92d1460a988c6f202f96578286b7d0e02109eb9"},"instant":"2026-10-06T19:03:00-04:00","mode":"pdfjs-dist-96ppp","pdf":"2f0f58fece0ba41d5a0825c83f30dea7931bc9b665e3890b4fe4f371d90559f4","source":"pdf","styles":{"clair":[],"sombre":[]},"texte":["0","50","100","Badge : 105 × 148 mm (A6)","Papier : A4, 210 × 297 mm","Imposition : feuille par feuille","Planches : 3","12 badges pour 13 participants, 1 exclu","Événement : Soirée d’essai","Source : le placement retenu","Placement du 6 octobre 2026 à 19:02:00","Version : construction de documentation","Imprimer en recto seul, à 100 %"],"theme":"clair","versionReelle":"2026.10.05.01"}, +{"cadre":{"hauteur":1123,"largeur":794},"empreinte":"2a1281d94e7f8f7668ce80db098778050eac40976f0319d98c25b975889a3d48","etape":"12","etat":"b42451443701c80d433d632788edaab7dd1afea7a57add55a37fcedfdaee98ff","facteurEchelle":1,"fichier":"25-badges-planche","graine":4242,"image":{"hauteur":1123,"largeur":794,"sha256":"5375de3104896af92144a7b455746f989fc802cc320b8b6f52e1351c7718bf43"},"instant":"2026-10-06T19:03:00-04:00","mode":"pdfjs-dist-96ppp","pdf":"2f0f58fece0ba41d5a0825c83f30dea7931bc9b665e3890b4fe4f371d90559f4","source":"pdf","styles":{"clair":[],"sombre":[]},"texte":["Edgar Ardoisier","Société des Hérons","Tour 1 — table 1","Tour 2 — table 1","Tour 3 — table 2","Soirée d’essai","Placement du 6 octobre 2026 à 19:02:00","Brunœil","Cercle des Saules","Tour 1 — table 1","Tour 2 — table 2","Tour 3 — table 1","Soirée d’essai","Placement du 6 octobre 2026 à 19:02:00","Apolline Coudraie","Chœur de l’Anse","Tour 1 — table 1","Tour 2 — table 2","Tour 3 — table 1","Soirée d’essai","Placement du 6 octobre 2026 à 19:02:00","Bertille Cressonnier","Cercle des Saules","Tour 1 — table 1","Tour 2 — table 2","Tour 3 — table 1","Soirée d’essai","Placement du 6 octobre 2026 à 19:02:00"],"theme":"clair","versionReelle":"2026.10.05.01"} ],"format":1,"pilote":{"cadre":{"hauteur":700,"largeur":1366},"facteurEchelle":1,"mode":"chromium-headless-shell","navigateur":"chromium","versionNavigateur":"153.0.8010.12"},"reportees":[ {"etape":"10","fichier":"12-qualite-profil","raison":"iteration5"}, {"etape":"10","fichier":"13-qualite-collisions","raison":"iteration5"}, diff --git a/scripts/documentation/manifeste.js b/scripts/documentation/manifeste.js index b3a81dd..0ce3059 100644 --- a/scripts/documentation/manifeste.js +++ b/scripts/documentation/manifeste.js @@ -34,12 +34,16 @@ export const ETAPES = Object.freeze(['1', '1b', '2', '3', '4', '5', '6', '7', '8 const capture = (fichier, etape, configuration, source = 'navigateur') => Object.freeze({ fichier, etape, configuration, source }); -// La table du § 19.3 en données, avec 02b, 07a et 07b. « configuration » nomme -// ce que la capture exige : le répertoire neuf, le fichier d'import -// d'exemples/, l'identifiant de démonstration du catalogue, ou l'événement que -// le parcours construit puis retient. L'étape place une capture dans le guide, -// la configuration dit sur quoi elle se prend : les deux 07a, à l'étape 4, -// se photographient sur la grande démonstration que le parcours charge pour 10. +// La table du § 19.3 en données, avec 02b, 07a et 07b, et les quatre captures +// des étiquettes, des objectifs et de l'ordre des priorités : 04a, 05a, 05b, +// 10a (A22). « configuration » nomme ce que la capture exige : le répertoire +// neuf, le fichier d'import d'exemples/, l'identifiant de démonstration du +// catalogue, ou l'événement que le parcours construit puis retient. L'étape +// place une capture dans le guide, la configuration dit sur quoi elle se +// prend : les deux 07a, à l'étape 4, se photographient sur la grande +// démonstration que le parcours charge pour 10 ; 05b, sur l'exemple des +// objectifs importé dans l'événement construit ; 10a, à l'étape 9 où l'ordre +// des priorités se règle à côté de la génération (§ 2.1). export const CAPTURES = Object.freeze([ capture('01-premier-ecran', '1', 'repertoire-neuf'), capture('01b-passer-en-ecriture', '1b', 'repertoire-neuf'), @@ -47,7 +51,10 @@ export const CAPTURES = Object.freeze([ capture('02b-import-cp1252', '2', 'participants_cas_limites_cp1252.csv'), capture('03-import-rapport', '2', 'participants_cas_limites.csv'), capture('04-grille-participants', '3', 'evenement-construit'), + capture('04a-etiquettes', '3', 'evenement-construit'), capture('05-tables-etat', '4', 'evenement-construit'), + capture('05a-objectifs-tables', '4', 'evenement-construit'), + capture('05b-import-objectifs', '4', 'objectifs_cas_limites.csv'), capture('06-defaut-consequence', '4', 'evenement-construit'), capture('07-plan-tables', '4', 'evenement-construit'), capture('07a-cibles-sieges', '4', 'grande'), @@ -56,6 +63,7 @@ export const CAPTURES = Object.freeze([ capture('08-animateurs-designes', '6', 'evenement-construit'), capture('09-refus-sur-place', '7', 'evenement-construit'), capture('10-diagnostic', '8', 'grande'), + capture('10a-ordre-priorites', '9', 'evenement-construit'), capture('11-propositions', '9', 'evenement-construit'), capture('19-ajustement', '11', 'evenement-retenu'), capture('20-mode-lecture', '11', 'evenement-retenu'), diff --git a/scripts/documentation/manifeste.test.js b/scripts/documentation/manifeste.test.js index 9dffcd6..036f022 100644 --- a/scripts/documentation/manifeste.test.js +++ b/scripts/documentation/manifeste.test.js @@ -79,7 +79,7 @@ describe('manifeste : la liste déclarée (§ 19.3, Q8 a)', () => { assert.ok(Object.isFrozen(ETAPES)); }); - test('CAPTURES égale la table du contrat : vingt-deux entrées, leur étape et leur source', () => { + test('CAPTURES égale la table du contrat : vingt-six entrées, leur étape et leur source', () => { const table = CAPTURES.map((c) => [c.fichier, c.etape, c.source]); assert.deepEqual(table, [ ['01-premier-ecran', '1', 'navigateur'], @@ -88,7 +88,10 @@ describe('manifeste : la liste déclarée (§ 19.3, Q8 a)', () => { ['02b-import-cp1252', '2', 'navigateur'], ['03-import-rapport', '2', 'navigateur'], ['04-grille-participants', '3', 'navigateur'], + ['04a-etiquettes', '3', 'navigateur'], ['05-tables-etat', '4', 'navigateur'], + ['05a-objectifs-tables', '4', 'navigateur'], + ['05b-import-objectifs', '4', 'navigateur'], ['06-defaut-consequence', '4', 'navigateur'], ['07-plan-tables', '4', 'navigateur'], ['07a-cibles-sieges', '4', 'navigateur'], @@ -97,6 +100,7 @@ describe('manifeste : la liste déclarée (§ 19.3, Q8 a)', () => { ['08-animateurs-designes', '6', 'navigateur'], ['09-refus-sur-place', '7', 'navigateur'], ['10-diagnostic', '8', 'navigateur'], + ['10a-ordre-priorites', '9', 'navigateur'], ['11-propositions', '9', 'navigateur'], ['19-ajustement', '11', 'navigateur'], ['20-mode-lecture', '11', 'navigateur'], @@ -119,6 +123,12 @@ describe('manifeste : la liste déclarée (§ 19.3, Q8 a)', () => { assert.equal(configuration.get('02-import-apercu'), 'participants_cas_limites.csv'); assert.equal(configuration.get('02b-import-cp1252'), 'participants_cas_limites_cp1252.csv'); assert.equal(configuration.get('03-import-rapport'), 'participants_cas_limites.csv'); + // L'aperçu des objectifs se prend sur l'exemple d'objectifs, importé + // dans l'événement que le parcours construit (A22). + assert.equal(configuration.get('05b-import-objectifs'), 'objectifs_cas_limites.csv'); + for (const fichier of ['04a-etiquettes', '05a-objectifs-tables', '10a-ordre-priorites']) { + assert.equal(configuration.get(fichier), 'evenement-construit', fichier); + } assert.equal(configuration.get('10-diagnostic'), 'grande'); // Les deux 07a, à l'étape 4, se prennent sur la grande démonstration que // le parcours charge pour 10 (§ 19.3). diff --git a/src/interface/import/Apercu.svelte b/src/interface/import/Apercu.svelte index 6eaed12..3466070 100644 --- a/src/interface/import/Apercu.svelte +++ b/src/interface/import/Apercu.svelte @@ -220,10 +220,11 @@ {fusion.retenue} {t('import.apercu.orthographes')} + {format.nombre(fusion.lignes)} {t('import.apercu.lignesReecrites', { n: fusion.lignes })} @@ -401,7 +402,8 @@ padding-left: var(--espace-5); } - /* Les orthographes d'une étiquette fondue, en ligne, séparées d'un blanc. */ + /* Les orthographes d'une étiquette fondue, en ligne, séparées d'une + virgule ; un tiret les sépare du nombre de lignes réécrites. */ .orthographes { display: inline-flex; flex-wrap: wrap; diff --git a/src/interface/parcours.navigateur.test.js b/src/interface/parcours.navigateur.test.js index 7449117..2bc35a9 100644 --- a/src/interface/parcours.navigateur.test.js +++ b/src/interface/parcours.navigateur.test.js @@ -12,13 +12,16 @@ // d'erreurs vide et sans requête hors de la boucle locale (§ 19.11). // // Le parcours est le parcours photographié (§ 19.1, § 19.3) : il suit les -// captures du § 19.3 que l'itération photographie — 01, 01b, 02, 02b, 03 à -// 07, 07b, 08 à 10, les deux 07a sur la grande démonstration que 10 a -// chargée, 11, 19, 20, puis 22 et 23, l'aperçu avant impression d'une -// proposition et du retenu, puis 24 et 25, la feuille de contrôle et la -// première planche du PDF que la section Badges produit, tramées sous node -// (§ 19.6) —, ces sorties en lecture puis sur un plan bloqué, qui n'écrivent -// que la planche et reglages_locaux.json (§ 11.6), puis l'ordre de lecture du § 2.1 sur +// captures du § 19.3 que l'itération photographie — 01, 01b, 02, 02b, 03, +// 04, 04a, les étiquettes d'une fiche, 05, 05a, les objectifs posés à +// l'écran, 05b, l'aperçu du CSV des objectifs, 06, 07, 07b, 08 à 10, les deux +// 07a sur la grande démonstration que 10 a chargée, 10a, l'ordre des +// priorités réglé, 11, la génération sous ces objectifs et cet ordre (A22, +// D17), 19, 20, puis 22 et 23, l'aperçu avant impression d'une proposition +// et du retenu, puis 24 et 25, la feuille de contrôle et la première planche +// du PDF que la section Badges produit, tramées sous node (§ 19.6) —, ces +// sorties en lecture puis sur un plan bloqué, qui n'écrivent que la planche +// et reglages_locaux.json (§ 11.6), puis l'ordre de lecture du § 2.1 sur // l'événement retenu, les fenêtres — aucune pendant un geste non // destructeur, une qui nomme ce qui part pour chaque geste qui détruit —, // enfin chaque famille de geste modifiant en lecture puis sur un plan @@ -43,7 +46,8 @@ import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, test } from 'vitest'; import { cdp, commands } from 'vitest/browser'; import { flushSync } from 'svelte'; -import { bilanRemplacement, cleNormalisee } from '../application/csv.js'; +import { configurationDe } from '../application/configuration.js'; +import { apercevoirObjectifs, bilanRemplacement, cleNormalisee } from '../application/csv.js'; import { creerFormat } from '../application/format.js'; import { creerExecuteurDirect } from '../application/generation.js'; import { TABLES_APPLICATION, libelle } from '../application/libelles.js'; @@ -60,8 +64,10 @@ import { regimeCibles } from '../geometrie/designation.js'; import { echelleGraphique } from '../geometrie/echelle.js'; import { diametre, geometrieTable } from '../geometrie/tables.js'; import { vueDepuisTransform } from '../geometrie/vue.js'; -import { CRITERES, classer } from '../moteur/classement.js'; +import { classer } from '../moteur/classement.js'; import { indexerPlan, nombrePlaces, normaliser } from '../moteur/configuration.js'; +import { correspondA } from '../moteur/correspondance.js'; +import { PRIORITES_PAR_DEFAUT, compilationDe } from '../moteur/criteres.js'; import { diagnostiquer } from '../moteur/diagnostic.js'; import { mesurer } from '../moteur/indicateurs.js'; import { plafondsAPriori } from '../moteur/plafond.js'; @@ -70,9 +76,10 @@ import { serialiserCharge } from '../stockage/canonique.js'; import { configurationDepuisCharge } from '../stockage/document.js'; import { lireJournal } from '../stockage/journal.js'; import { SUFFIXES } from '../stockage/noms.js'; -import { planDepuisFichier } from '../stockage/placements.js'; +import { derive, planDepuisFichier } from '../stockage/placements.js'; import { VERSION } from '../version.genere.js'; import urlCp1252 from '../../exemples/participants_cas_limites_cp1252.csv?url'; +import urlObjectifs from '../../exemples/objectifs_cas_limites.csv?url'; import { CADRE, capturesPrises, @@ -107,14 +114,30 @@ const ECART_RETENUE_MS = 2 * 60 * 1000; // Le CSV des cas limites enregistré en windows-1252 (§ 10.3, capture 02b). const NOM_CP1252 = 'participants_cas_limites_cp1252.csv'; +// Le CSV des objectifs de table aux cas limites (§ 10.4, capture 05b) : ses +// lignes valides visent les tables 1 et 2 d'une soirée de moins de neuf +// tours, et l'une d'elles écrit en capitales une étiquette des participants. +const NOM_OBJECTIFS = 'objectifs_cas_limites.csv'; + +// La clé d'une étiquette que l'import des cas limites donne à plusieurs +// personnes, sous deux orthographes qu'il fond en une (§ 10.1) ; une +// orthographe voisine, que la fiche reçoit sous la retenue (capture 04a), et +// que le CSV des objectifs porte aussi (capture 05b). +const CLE_ETIQUETTE = 'finance'; +const ORTHOGRAPHE_VOISINE = 'FINANCE'; + // Ce qui tient lieu de version dans une construction de documentation. const MARQUE_PROVENANCE = versionVisible('documentation', VERSION.affichee, t); // La personne que l'ordre de lecture ajoute : un nom inventé. const AJOUTEE = { nom: 'Ombrelle', prenom: 'Iris' }; -// Les gestes non destructeurs que les fenêtres surveillent (§ 2.1, § 5.9), -// chacun exécuté au moins une fois par le parcours. +// Les gestes non destructeurs que les fenêtres surveillent (§ 2.1, § 5.9, +// D19), chacun exécuté au moins une fois par le parcours. Les gestes des +// étiquettes, des objectifs et des priorités portent le nom de leur +// commande ; les deux cases et le mode des objectifs passent par +// modifierReglage, que 10a exerce sur chacun d'eux, comme 11 sur le compte +// d'arrêt. const GESTES_NON_DESTRUCTEURS = Object.freeze([ 'ajouter', 'modifier', @@ -126,6 +149,61 @@ const GESTES_NON_DESTRUCTEURS = Object.freeze([ 'surcharger', 'appliquerDefaut', 'ajouterTour', + 'modifierReglage', + 'changerEtiquettes', + 'poserObjectif', + 'retirerObjectif', + 'changerRegleObjectifs', + 'importerObjectifs', + 'changerPriorites', + 'retablirPriorites', +]); + +// Les familles de geste modifiant que la lecture et le plan bloqué refusent +// (§ 8.4, § 9), dans l'ordre où toutesFamilles les tente ; gestes nomme +// ceux de GESTES_NON_DESTRUCTEURS que la famille tente sous ce nom, vide +// pour une famille qui n'en tente aucun. Leur nombre est celui de la +// liste : toutesFamilles affirme qu'elle les a tentées toutes, dans cet +// ordre, et chaque geste des étiquettes, des objectifs et des priorités y +// est tenté. Les deux cases et le mode passent par modifierReglage : la +// famille des réglages de génération les tente. +const FAMILLES_MODIFIANTES = Object.freeze( + [ + ['glisser une personne', []], + ['glisser une table', []], + ['tirer une poignée', []], + ['poser une réservation', ['reserver']], + ['titrer', ['titrer']], + ['désigner', ['designer']], + ['saisir dans une cellule', ['modifier']], + ['changer les étiquettes', ['changerEtiquettes']], + ['coller', []], + ['importer', []], + ['importer des objectifs', ['importerObjectifs']], + ['créer une table', []], + ['surcharger', ['surcharger']], + ['changer le défaut', []], + ['changer les tours', []], + ['poser ou retirer un objectif', ['poserObjectif', 'retirerObjectif']], + ['changer la règle par défaut', ['changerRegleObjectifs']], + ['changer l’état', []], + ['changer l’ordre des priorités', ['changerPriorites', 'retablirPriorites']], + ['changer un réglage de génération', ['modifierReglage']], + ].map(([nom, gestes]) => Object.freeze({ nom, gestes: Object.freeze(gestes) })), +); + +// Les gestes des étiquettes, des objectifs — les deux cases et le mode +// compris, par modifierReglage — et des priorités : chacun tenté par une +// famille de FAMILLES_MODIFIANTES. +const GESTES_DES_OBJECTIFS = Object.freeze([ + 'modifierReglage', + 'changerEtiquettes', + 'poserObjectif', + 'retirerObjectif', + 'changerRegleObjectifs', + 'importerObjectifs', + 'changerPriorites', + 'retablirPriorites', ]); // Les refus du § 5.9 qui subsistent à la pose, que la capture 09 peut @@ -345,6 +423,63 @@ async function glisserVers(depuis, vers) { await images(3); } +// Choisit au clavier la valeur d'un sélecteur, un cran de flèche à la fois, +// la page rendue à chaque cran : chaque cran est un choix, comme au clavier +// de l'opérateur. Au plus autant de crans que d'options. +async function choisirAuClavier(choix, valeur) { + choix.focus(); + const cible = [...choix.options].findIndex((option) => option.value === valeur); + expect(cible, `option ${valeur}`).toBeGreaterThanOrEqual(0); + for (let cran = 0; cran < choix.options.length && choix.selectedIndex !== cible; cran += 1) { + await touche(choix.selectedIndex < cible ? 'ArrowDown' : 'ArrowUp'); + flushSync(); + await images(2); + } + expect(choix.value, `le choix ${valeur}`).toBe(valeur); +} + +// Fait défiler le premier ancêtre défilant des éléments jusqu'à centrer la +// réunion de leurs boîtes, qui doit tenir dans sa hauteur visible : l'image +// les montre ensemble. Sans ancêtre défilant, la fenêtre défile. +async function cadrerDansLaSurface(elements) { + const boites = elements.map((element) => element.getBoundingClientRect()); + const haut = Math.min(...boites.map((b) => b.top)); + const bas = Math.max(...boites.map((b) => b.bottom)); + let porteur = elements[0].parentElement; + while (porteur !== null && !(porteur.scrollHeight > porteur.clientHeight && /auto|scroll/.test(getComputedStyle(porteur).overflowY))) { + porteur = porteur.parentElement; + } + if (porteur === null) { + await cadrerSur(elements); + return; + } + const cadre = porteur.getBoundingClientRect(); + const visibleHaut = Math.max(cadre.top + porteur.clientTop, 0); + const visibleBas = Math.min(cadre.top + porteur.clientTop + porteur.clientHeight, innerHeight); + expect(bas - haut, 'les éléments à montrer tiennent dans la hauteur visible de leur surface').toBeLessThanOrEqual(visibleBas - visibleHaut); + porteur.scrollTop += Math.round((haut + bas - visibleHaut - visibleBas) / 2); + await images(2); +} + +// Fait défiler en largeur le premier ancêtre des éléments qui défile ainsi, +// jusqu'à centrer la réunion de leurs boîtes, qui doit tenir dans sa largeur +// visible : l'image les montre ensemble. Un tel ancêtre est exigé. +async function cadrerEnLargeur(elements) { + const boites = elements.map((element) => element.getBoundingClientRect()); + const gauche = Math.min(...boites.map((b) => b.left)); + const droite = Math.max(...boites.map((b) => b.right)); + let porteur = elements[0].parentElement; + while (porteur !== null && !(porteur.scrollWidth > porteur.clientWidth && /auto|scroll/.test(getComputedStyle(porteur).overflowX))) { + porteur = porteur.parentElement; + } + expect(porteur, 'un ancêtre qui défile en largeur').not.toBeNull(); + const visibleGauche = porteur.getBoundingClientRect().left + porteur.clientLeft; + const visibleDroite = visibleGauche + porteur.clientWidth; + expect(droite - gauche, 'les éléments à montrer tiennent dans la largeur visible de leur ancêtre').toBeLessThanOrEqual(visibleDroite - visibleGauche); + porteur.scrollLeft += Math.round((gauche + droite - visibleGauche - visibleDroite) / 2); + await images(2); +} + // Ferme l'aperçu d'import ouvert, puis ouvre celui du fichier donné ; rend // l'aperçu, son nom de fichier affiché. async function ouvrirApercu(nom, octets) { @@ -570,9 +705,14 @@ async function fermerLaPose() { await attendre('la pose fermée', () => m.ui.etat().pose === null); } -// Le refus posé à côté d'un élément, dans le porteur donné, avec son remède. -async function refusPres(porteur, code, remede, geste) { - const refus = await attendre(`le refus ${code} de ${geste}`, () => porteur().querySelector(`[data-refus="${code}"]`)); +// Le refus posé à côté d'un élément, dans le porteur donné, avec son remède ; +// un refus autre que ancien, qu'un geste précédent a laissé dans le même +// porteur. +async function refusPres(porteur, code, remede, geste, ancien = null) { + const refus = await attendre(`le refus ${code} de ${geste}`, () => { + const lu = porteur().querySelector(`[data-refus="${code}"]`); + return lu !== ancien ? lu : null; + }); expect(refus.querySelector(`[data-commande="${remede}"]`)?.textContent, geste).toBe(t(`communs.remede.${remede}`)); return refus; } @@ -1021,7 +1161,74 @@ describe('le parcours par gestes, depuis un répertoire neuf', { timeout: DUREE }); }); + // Étape 3 (§ 4.5, § 10.2, A22) : la fiche d'une personne importée avec + // ses étiquettes. Une saisie d'une orthographe voisine d'une étiquette que + // d'autres portent reçoit l'existante, et le signal se pose contre le + // champ ; la légende chiffre chaque étiquette, exclues comprises. + test('04a la fiche : ses étiquettes en pastilles ; « FINANCE » reçu sous l’orthographe retenue, le signal contre le champ ; la légende chiffrée', async () => { + const section = () => dans('[data-section="participants"]'); + const portees = (p) => p.etiquettes ?? []; + // L'orthographe que l'import a retenue pour la clé, une seule, et que + // plusieurs personnes portent ; la voisine en diffère. + const retenues = [...new Set(charge().participants.flatMap(portees).filter((motCle) => cleNormalisee(motCle) === CLE_ETIQUETTE))]; + expect(retenues).toHaveLength(1); + const [existante] = retenues; + expect(charge().participants.filter((p) => portees(p).includes(existante)).length).toBeGreaterThan(1); + expect(cleNormalisee(ORTHOGRAPHE_VOISINE)).toBe(CLE_ETIQUETTE); + expect(ORTHOGRAPHE_VOISINE).not.toBe(existante); + memoire.etiquette = existante; + const personne = charge().participants.find((p) => !p.exclu && portees(p).length > 0 && !portees(p).includes(existante)); + expect(personne, 'une personne étiquetée, sans « finance »').toBeDefined(); + await cliquer(`[data-section="participants"] [data-participant="${personne.id}"] [data-commande="fiche"]`); + const fiche = await attendre('la fiche', () => dans(`[data-fiche="${personne.id}"]`)); + const pastilles = () => [...fiche.querySelectorAll('[data-etiquettes] li')].map((li) => texteDe(li.firstElementChild)); + expect(pastilles()).toEqual(personne.etiquettes); + + await sansFenetre('changerEtiquettes', async () => { + const r = revision(); + await saisir(fiche.querySelector('input[data-champ="etiquettes"]'), ORTHOGRAPHE_VOISINE); + await uneEntree(r, 'ajouter une étiquette'); + }); + const apres = charge().participants.find((p) => p.id === personne.id).etiquettes; + expect(apres).toContain(existante); + expect(apres).not.toContain(ORTHOGRAPHE_VOISINE); + expect(pastilles()).toEqual(apres); + const champ = fiche.querySelector('input[data-champ="etiquettes"]'); + expect(champ.value).toBe(''); + const signal = await attendre('le signal d’orthographe', () => fiche.querySelector('[data-avertissement="ORTHOGRAPHE_RETENUE"]')); + expect(texteDe(signal)).toBe(plat(t('ORTHOGRAPHE_RETENUE', { saisie: ORTHOGRAPHE_VOISINE, retenue: existante }))); + expect(champ.getAttribute('aria-describedby')).toBe(signal.id); + + // La légende : chaque étiquette de la liste, avec le nombre de personnes + // qui la portent, exclues comprises. + const comptes = new Map(); + for (const p of charge().participants) for (const motCle of portees(p)) comptes.set(motCle, (comptes.get(motCle) ?? 0) + 1); + const legende = section().querySelector('[data-legende-etiquettes]'); + expect(legende).not.toBeNull(); + const lus = [...legende.querySelectorAll('li')].map(texteDe).sort(); + const attendus = [...comptes].map(([nom, compte]) => plat(t('participants.legende.element', { nom, compte }))).sort(); + expect(lus).toEqual(attendus); + + // L'image montre le champ vidé, sans curseur ni anneau de focus. À + // 1 366 × 700, la fiche s'ouvre sous la grille : la légende, en tête de + // la section, n'entre pas dans la même fenêtre qu'elle, et 04 la montre. + document.activeElement?.blur(); + await images(2); + await photographier(m, '04a-etiquettes', { + condition: [ + `[data-fiche="${personne.id}"] [data-etiquettes]`, + `[data-fiche="${personne.id}"] input[data-champ="etiquettes"]`, + `[data-fiche="${personne.id}"] [data-avertissement="ORTHOGRAPHE_RETENUE"]`, + ], + }); + }); + test('05 deux tables à 8, l’une au défaut, l’autre surchargée à 8 : leurs états diffèrent à valeur égale', async () => { + // La fiche de 04a se ferme : elle reviendrait avec la section. + if (dans('[data-fiche]') !== null) { + await cliquer('[data-fiche] [data-commande="fermerFiche"]'); + await attendre('la fiche fermée', () => dans('[data-fiche]') === null); + } await ouvrirSection('tables'); let r = revision(); await cliquer('[data-section="tables"] [data-commande="creerTableRonde"]'); @@ -1048,6 +1255,145 @@ describe('le parcours par gestes, depuis un répertoire neuf', { timeout: DUREE }); }); + // Étape 4 (§ 4.5, D3, A22) : la règle par défaut, changée puis rendue ; + // l'objectif de la soirée de la première table, qui suit cette règle ; + // celui du tour 1 de la seconde, qui porte la sienne, « toutes », et + // qu'aucune personne présente ne remplit. La correspondance se juge par + // correspondA, la fonction du moteur, hors de l'écran (D18). Le choix de + // règle de l'objectif qui la suit nomme la règle par défaut, et l'image la + // montre par lui : la carte qui la règle, en tête de la section, n'entre + // pas dans la même fenêtre que les deux objectifs. + test('05a la règle par défaut ; la soirée de la table 1 la suit, le tour 1 de la table 2 porte la sienne ; l’objectif sans correspondant le dit', async () => { + const [premiere, seconde] = charge().tables.map(({ id }) => id); + const regleDefaut = () => dans('[data-regle-objectifs] select[data-champ="regleObjectifs"]'); + expect(regleDefaut().value).toBe('ou'); + await sansFenetre('changerRegleObjectifs', async () => { + for (const valeur of ['et', 'ou']) { + const r = revision(); + await choisirAuClavier(regleDefaut(), valeur); + await uneEntree(r, `la règle par défaut « ${valeur} »`); + } + }); + expect(charge().reglages.regleObjectifs).toBeUndefined(); + + const zone = (cle) => dans(`[data-section="tables"] [data-objectif="${cle}"]`); + const champ = (cle) => zone(cle).querySelector(`input[data-champ="objectif-${cle}"]`); + // Rangées par unités de code, comme la charge les écrit. + const visees = ['Montréal', 'bénévole']; + await sansFenetre('poserObjectif', async () => { + let r = revision(); + await saisir(champ(String(premiere)), memoire.etiquette); + await uneEntree(r, 'l’objectif de la soirée'); + await cliquer(`[data-section="tables"] [data-table="${seconde}"] [data-commande="basculerObjectifsTours"]`); + const cle = `${seconde}-1`; + await attendre('l’objectif du tour 1', () => zone(cle)); + // La règle d'un objectif neuf se choisit avant ses étiquettes, sans + // rien écrire. + r = revision(); + await choisirAuClavier(zone(cle).querySelector(`select[data-champ="regle-${cle}"]`), 'et'); + expect(revision()).toBe(r); + await saisir(champ(cle), visees.join(', ')); + await uneEntree(r, 'l’objectif du tour 1'); + }); + const objectifsDe = (id) => charge().tables.find((table) => table.id === id).objectifs; + expect(objectifsDe(premiere)).toEqual([{ portee: 'tous', tour: null, regle: null, etiquettes: [memoire.etiquette] }]); + expect(objectifsDe(seconde)).toEqual([{ portee: 'tour', tour: 1, regle: 'et', etiquettes: visees }]); + + // Les deux états de règle, en mots, différents. + const soiree = texteDe(zone(String(premiere))); + const tour = texteDe(zone(`${seconde}-1`)); + expect(soiree).toContain(t('tables.objectif.suitDefaut')); + expect(soiree).not.toContain(t('tables.objectif.reglePropre')); + expect(tour).toContain(t('tables.objectif.reglePropre')); + expect(tour).not.toContain(t('tables.objectif.suitDefaut')); + const regleSoiree = zone(String(premiere)).querySelector(`select[data-champ="regle-${premiere}"]`); + expect(regleSoiree.value).toBe(''); + expect(texteDe(regleSoiree.selectedOptions[0])).toBe(plat(t('tables.objectif.regleDefaut', { regle: 'ou' }))); + + // Aucune personne présente ne remplit l'objectif du tour 1 : son signal ; + // celui de la soirée a les siennes, et se tait. + const presents = charge().participants.filter(({ exclu }) => !exclu); + const remplit = (objectif, regle) => presents.some((p) => correspondA(p.etiquettes ?? [], { regle, etiquettes: objectif.etiquettes })); + expect(remplit(objectifsDe(seconde)[0], 'et')).toBe(false); + expect(remplit(objectifsDe(premiere)[0], 'ou')).toBe(true); + expect(zone(`${seconde}-1`).querySelector('[data-avertissement="OBJECTIF_SANS_CORRESPONDANT"]')).not.toBeNull(); + expect(zone(String(premiere)).querySelector('[data-avertissement="OBJECTIF_SANS_CORRESPONDANT"]')).toBeNull(); + + document.activeElement?.blur(); + await cadrerDansLaSurface([zone(String(premiere)), zone(`${seconde}-1`)]); + await photographier(m, '05a-objectifs-tables', { + condition: [ + `[data-objectif="${premiere}"]`, + `[data-objectif="${premiere}"] select[data-champ="regle-${premiere}"]`, + `[data-objectif="${seconde}-1"] select[data-champ="regle-${seconde}-1"]`, + `[data-objectif="${seconde}-1"] [data-avertissement="OBJECTIF_SANS_CORRESPONDANT"]`, + ], + }); + }); + + // Le CSV des objectifs aux cas limites (§ 10.4, A20, A22), sur la soirée + // construite : ses deux tables portent les numéros 1 et 2, et elle compte + // moins de neuf tours. L'aperçu, sous la nature « Objectifs de table » et + // le mode « Mettre à jour », se compare à apercevoirObjectifs, que l'écran + // n'appelle pas : séparateur, lignes refusées, orthographes fondues. + test('05b l’aperçu des objectifs : la nature nommée, le séparateur, les lignes refusées, « FINANCE » fondue ; tables 1 et 2, moins de 9 tours', async () => { + expect(charge().tables.map(({ numero }) => numero)).toEqual([1, 2]); + expect(charge().evenement.tours).toBeLessThan(9); + await ouvrirSection('import'); + await appuyer(dans('[data-nature-import] input[value="objectifs"]'), 'la nature « Objectifs de table »'); + const octets = new Uint8Array(await (await fetch(urlObjectifs)).arrayBuffer()); + const avant = fichiers(); + const apercu = await ouvrirApercu(NOM_OBJECTIFS, octets); + const { texte } = decoder(octets); + const attendu = apercevoirObjectifs(texte, charge(), { mode: 'mettreAJour' }); + expect(attendu.refusGlobal).toBeNull(); + + const nature = dans('[data-nature-import] input:checked'); + expect(nature.value).toBe('objectifs'); + expect(texteDe(nature.closest('label'))).toBe(t('import.nature.objectifs')); + expect(apercu.querySelector('[data-champ="mode"] input:checked').value).toBe('mettreAJour'); + expect(texteDe(apercu.querySelector('[data-separateur]'))).toBe(t(SEPARATEURS.get(attendu.separateur))); + const refusees = [...apercu.querySelectorAll('[data-refusees] [data-ligne]')]; + expect(refusees.map((ligne) => Number(ligne.dataset.ligne))).toEqual(attendu.refusees.map(({ ligne }) => ligne)); + expect(refusees.length).toBeGreaterThan(0); + for (const ligne of refusees) expect(texteDe(ligne.querySelector('[data-motif]')).length, ligne.dataset.ligne).toBeGreaterThan(0); + const fondues = [...apercu.querySelectorAll('[data-fusions-etiquettes] [data-affichee]')].map(texteDe); + expect(fondues).toEqual(attendu.fusionsEtiquettes.map(({ retenue }) => retenue)); + expect(fondues).toContain(memoire.etiquette); + expect(texteDe(apercu.querySelector('[data-fusions-etiquettes]'))).toContain(ORTHOGRAPHE_VOISINE); + memoire.objectifsImportes = attendu.lignes.map(({ champs }) => champs); + await rienEcrit(avant, 'l’aperçu des objectifs'); + // L'image montre les lignes refusées et la fusion ; la nature cochée et + // le séparateur, en tête de la section, n'entrent pas dans la même + // fenêtre qu'elles. + await cadrerDansLaSurface([apercu.querySelector('[data-refusees]'), apercu.querySelector('[data-fusions-etiquettes]')]); + await photographier(m, '05b-import-objectifs', { + condition: ['[data-apercu] [data-refusees]', '[data-apercu] [data-refusees] [data-ligne] [data-motif]', '[data-apercu] [data-fusions-etiquettes]'], + }); + }); + + test('05b « Importer » en « Mettre à jour » : une entrée, sans fenêtre ; les objectifs du fichier posés, celui du tour 1 de la table 2 gardé', async () => { + const [, seconde] = charge().tables.map(({ id }) => id); + const garde = charge().tables.find(({ id }) => id === seconde).objectifs.find(({ tour }) => tour === 1); + expect(garde).toBeDefined(); + await sansFenetre('importerObjectifs', async () => { + const r = revision(); + await cliquer('[data-apercu] [data-commande="importer"]'); + await uneEntree(r, 'importer les objectifs'); + }); + await attendre('le rapport', () => dans('[data-rapport]')); + const objectifs = charge().tables.flatMap(({ id, objectifs: siens = [] }) => siens.map((objectif) => ({ table: id, ...objectif }))); + for (const { table, tour, regle, etiquettes } of memoire.objectifsImportes) { + expect(objectifs, `table ${table}, tour ${tour}`).toContainEqual(expect.objectContaining({ table, tour, regle, etiquettes })); + } + expect(objectifs).toContainEqual({ table: seconde, ...garde }); + // La section revient à la nature par défaut : les imports de + // participants qui suivent la trouvent cochée. + await appuyer(dans('[data-nature-import] input[value="participants"]'), 'la nature « Participants »'); + expect(dans('[data-nature-import] input:checked').value).toBe('participants'); + await ouvrirSection('tables'); + }); + test('06 l’énoncé d’un changement de défaut, chiffré avant toute application : rien d’écrit', async () => { const avant = fichiers(); await saisir(dans('[data-section="tables"] input[data-champ="siegesParDefaut"]'), '10'); @@ -1115,7 +1461,7 @@ describe('le parcours par gestes, depuis un répertoire neuf', { timeout: DUREE await attendre('le tour 3 montré', () => m.ui.etat().tour === 3); await images(2); await regimeSieges(); - let r = revision(); + const r = revision(); const reservee = await choisir('[data-reserve]'); const libre = chaiseVue((c) => c.occupant === null && c.reservation === null && c.titre === null); await cliquerPointeur(chaise(libre.table, libre.siege)); @@ -1138,12 +1484,16 @@ describe('le parcours par gestes, depuis un répertoire neuf', { timeout: DUREE plat(t('tables.tours.reservation', { nom, numero, tour: 3 })), ); await rienEcrit(avant, 'l’annonce'); + memoire.annonce = { fenetre, avant }; await photographier(m, '07b-nombre-de-tours', { condition: ['dialog[open] h2', 'dialog[open] [data-commande="renoncer"]'] }); + }); + test('07b « Annuler » : rien d’écrit ; « Défaire » retire la réservation posée pour l’annonce', async () => { + const { fenetre, avant } = memoire.annonce; await appuyer(fenetre.querySelector('[data-commande="renoncer"]'), 'renoncer'); await attendre('l’annonce fermée', () => dans('dialog[open]') === null); await rienEcrit(avant, 'renoncer'); - r = revision(); + const r = revision(); await cliquer('[data-historique] [data-commande="defaire"]'); await uneEntree(r, 'défaire la réservation'); expect(charge().reservations).toEqual([]); @@ -1240,12 +1590,13 @@ describe('le parcours par gestes, depuis un répertoire neuf', { timeout: DUREE expect(vues).toEqual([]); await rienEcrit(avant, 'le refus sur la place'); await photographier(m, '09-refus-sur-place', { condition: [`[data-siege="${t1}:${reservee.siege}"]`] }); - await oublierChoix(); }); // La grande démonstration, chargée depuis le premier écran : l'échelle est // le propos (§ 19.3), et le diagnostic se lit avant toute génération. test('10 la grande démonstration, chargée depuis le premier écran : 99 retours imposés, plafond 24, plancher d’écart, égaux au moteur', async () => { + // Le choix que 09 a laissé en attente s'oublie avant de quitter la soirée. + await oublierChoix(); memoire.base = base(); await cliquer('[data-bandeau] [data-commande="liste"]'); await attendre('le premier écran', () => dans('[data-ecran="accueil"] [data-demonstration="grande"]')); @@ -1300,19 +1651,148 @@ describe('le parcours par gestes, depuis un répertoire neuf', { timeout: DUREE await photographier(m, '07a-cibles-tables', { condition: [`[data-plan] [data-table="${table}"]`] }); }); - test('11 rouvrir la soirée ; générer, graine écrite, compte réduit : trois propositions du moteur, dans l’ordre de sa clé ; diversité ; retenir', async () => { + // Étape 9 (§ 5.3, § 5.7, A11, A22) : la soirée rouverte, l'ordre des + // priorités se règle à côté de la génération — les tours hors objectif + // montés au palier de l'excédent de collisions, avec le poids 3 —, sous + // le mode par défaut et la case des animateurs décochée. Les paliers + // affichés sont ceux de la charge ; ceux que compile le moteur, ceux-là + // privés des critères qui ne comptent pas, et 11 les nomme. + test('10a la soirée rouverte, l’ordre réglé : excédent × 1 et tours hors objectif × 3 en un palier, animateurs décochés, mode par défaut', async () => { await cliquer('[data-bandeau] [data-commande="liste"]'); await cliquer(`[data-evenement="${memoire.base}"] [data-commande="ouvrir"]`); await attendre('la soirée rouverte', () => dans('[data-ecran="evenement"]') && etat().evenement?.base === memoire.base); await cliquer('[data-place-fixe] [data-commande="modifier"]'); await attendre('l’écriture', () => etat().mode === 'ecriture'); await ouvrirSection('generation'); + const editeur = () => dans('[data-section="generation"] [data-priorites]'); + const paliersAffiches = () => + [...editeur().querySelectorAll(':scope > [data-palier]')].map((palier) => + [...palier.querySelectorAll('[data-priorite]')].map((critere) => critere.dataset.priorite), + ); + const nomsDe = (liste) => liste.map((palier) => palier.map(({ critere }) => critere)); + expect(paliersAffiches()).toEqual(nomsDe(PRIORITES_PAR_DEFAUT)); + + // Les deux cases et le mode, chacun par modifierReglage, une entrée par + // geste, puis rendus à leur défaut, que la charge n'écrit pas : la case + // des animateurs cochée puis décochée, celle des objectifs décochée puis + // cochée, le mode « l'équité d'abord » puis « le plus de places + // servies ». Le mode se choisit avant que les tours hors objectif + // partagent un palier, que l'éditeur ne leur offre pas sous un mode qui + // compare deux valeurs (D23). + const caseDe = (cle) => dans(`[data-section="generation"] input[type="checkbox"][data-champ="${cle}"]`); + const choixDuMode = (valeur) => dans(`[data-section="generation"] [data-mode-objectifs] input[value="${valeur}"]`); + await sansFenetre('modifierReglage', async () => { + for (const [cle, valeurs] of [ + ['rencontrerAnimateurs', [true, false]], + ['respecterObjectifs', [false, true]], + ]) { + for (const valeur of valeurs) { + const r = revision(); + await appuyer(caseDe(cle), `la case ${cle} à ${valeur}`); + await uneEntree(r, `la case ${cle} à ${valeur}`); + expect(caseDe(cle).checked, cle).toBe(valeur); + } + } + for (const valeur of ['minimum', 'places']) { + const r = revision(); + await appuyer(choixDuMode(valeur), `le mode ${valeur}`); + await uneEntree(r, `le mode ${valeur}`); + expect(choixDuMode(valeur).checked, valeur).toBe(true); + expect(charge().reglages.modeObjectifs ?? 'places', valeur).toBe(valeur); + } + }); + for (const cle of ['rencontrerAnimateurs', 'respecterObjectifs', 'modeObjectifs']) expect(Object.hasOwn(charge().reglages, cle), cle).toBe(false); + + const critere = (nom) => editeur().querySelector(`[data-priorite="${nom}"]`); + await sansFenetre('changerPriorites', async () => { + let r = revision(); + await appuyer(critere('toursHorsObjectif').querySelector('[data-commande="monterCritere"]'), 'monter les tours hors objectif'); + await uneEntree(r, 'monter les tours hors objectif'); + r = revision(); + await appuyer(critere('toursHorsObjectif').querySelector('[data-commande="joindrePalier"]'), 'joindre au palier du dessus'); + await uneEntree(r, 'joindre au palier du dessus'); + r = revision(); + await saisir(critere('toursHorsObjectif').querySelector('input[data-champ="poids.toursHorsObjectif"]'), '3'); + await uneEntree(r, 'le poids 3'); + }); + const reglee = [ + [{ critere: 'ecartAuPlafondAPrioriMax', poids: 1 }], + [{ critere: 'excedentCollisions', poids: 1 }, { critere: 'toursHorsObjectif', poids: 3 }], + [{ critere: 'collisionsCumulees', poids: 1 }], + [{ critere: 'rencontresRepetees', poids: 1 }], + [{ critere: 'animateursNonRencontres', poids: 1 }], + [{ critere: 'redondance', poids: 1 }], + ]; + expect(charge().reglages.priorites).toEqual(reglee); + expect(paliersAffiches()).toEqual(nomsDe(reglee)); + const numeros = [...editeur().querySelectorAll(':scope > [data-palier]')].map((palier) => texteDe(palier.querySelector('p'))); + expect(numeros).toEqual(reglee.map((_, rang) => plat(t('generation.priorites.palier', { palier: rang + 1, paliers: reglee.length })))); + + // Le mode par défaut, la case des objectifs cochée, celle des + // animateurs décochée, et l'éditeur le dit en mots. + const section = dans('[data-section="generation"]'); + expect(section.querySelector('[data-mode-objectifs] input[value="places"]').checked).toBe(true); + expect(section.querySelector('input[data-champ="respecterObjectifs"]').checked).toBe(true); + expect(section.querySelector('input[data-champ="rencontrerAnimateurs"]').checked).toBe(false); + expect(texteDe(critere('animateursNonRencontres'))).toContain(t('generation.priorites.etat.decoche')); + expect(texteDe(critere('toursHorsObjectif'))).not.toContain(t('generation.priorites.etat.sansObjet')); + + // Ce que compile le moteur : la liste de la charge, chaque critère qui ne + // compte pas retiré. + const instance = normaliser(configurationDe(charge())); + const compte = new Set(instance.etatCriteres.filter(({ coche, sansObjet }) => coche && !sansObjet).map(({ nom }) => nom)); + expect(compte.has('animateursNonRencontres')).toBe(false); + expect(compte.has('toursHorsObjectif')).toBe(true); + const compilation = compilationDe(instance); + const appliques = compilation.paliers.map((palier) => palier.criteres.map(({ nom, poids }) => ({ critere: nom, poids }))); + expect(appliques).toEqual(reglee.map((palier) => palier.filter(({ critere }) => compte.has(critere))).filter((palier) => palier.length > 0)); + memoire.paliersRegles = appliques; + + // L'image montre le numéro du palier partagé, ses deux critères et leurs + // poids, et la ligne des animateurs qui dit « décoché » ; le choix du + // mode, au-dessus, le premier palier et « Rétablir l'ordre par + // défaut », au-dessous, n'entrent pas dans la même fenêtre qu'eux. + document.activeElement?.blur(); + await cadrerDansLaSurface([critere('excedentCollisions'), critere('animateursNonRencontres')]); + await photographier(m, '10a-ordre-priorites', { + condition: [ + '[data-priorites] > [data-palier="1"] > p', + '[data-priorites] [data-priorite="excedentCollisions"]', + '[data-priorites] input[data-champ="poids.excedentCollisions"]', + '[data-priorites] [data-priorite="toursHorsObjectif"]', + '[data-priorites] input[data-champ="poids.toursHorsObjectif"]', + '[data-priorites] [data-priorite="animateursNonRencontres"] .etat', + ], + }); + }); + + // Sous l'ordre de 10a, les tours hors objectif partagent un palier : un + // mode qui compare deux valeurs se refuse contre le choix du mode, nomme + // ce palier, et le choix revient au mode de la charge (D23). + test('10a « chacun au moins une fois » sur le palier partagé : refusé contre le choix du mode, rien d’écrit, le mode gardé', async () => { + const groupe = () => dans('[data-section="generation"] [data-mode-objectifs]'); + const partage = charge().reglages.priorites.findIndex((palier) => palier.some(({ critere }) => critere === 'toursHorsObjectif')); + expect(charge().reglages.priorites[partage].length).toBeGreaterThan(1); + const avant = fichiers(); + await sansFenetre('modifierReglage', async () => { + await appuyer(groupe().querySelector('input[value="chacun"]'), 'le mode « chacun au moins une fois »'); + const refus = await attendre('le refus du mode', () => groupe().querySelector('[data-refus="OBJECTIFS_PALIER_PARTAGE"]')); + expect(texteDe(refus.querySelector(':scope > p'))).toBe(plat(t('OBJECTIFS_PALIER_PARTAGE', { mode: 'chacun', palier: partage }))); + }); + await rienEcrit(avant, 'le mode refusé'); + expect(groupe().querySelector('input:checked').value).toBe('places'); + expect(Object.hasOwn(charge().reglages, 'modeObjectifs')).toBe(false); + }); + + test('11 générer sous objectifs et ordre réglé, graine écrite, compte réduit : trois propositions du moteur, phrase par paliers ; retenir', async () => { await taper(dans('[data-section="generation"] input[data-champ="graine"]'), String(GRAINE)); let r = revision(); - await saisir(dans('[data-section="generation"] input[data-champ="generation.arret"]'), String(ARRET)); - await uneEntree(r, 'le compte réduit'); + await sansFenetre('modifierReglage', async () => { + await saisir(dans('[data-section="generation"] input[data-champ="generation.arret"]'), String(ARRET)); + await uneEntree(r, 'le compte réduit'); + }); expect(charge().reglages.generation.arret).toBe(ARRET); - const configuration = configurationDepuisCharge(charge()); + const configuration = configurationDe(charge()); const { nombre, historique } = charge().reglages.generation; const attendues = rechercher(configuration, { graine: GRAINE, nombre, arret: ARRET, historique }); expect(attendues.length).toBeGreaterThanOrEqual(3); @@ -1328,17 +1808,34 @@ describe('le parcours par gestes, depuis un répertoire neuf', { timeout: DUREE await ouvrirSection('propositions'); const section = dans('[data-section="propositions"]'); const ids = () => [...section.querySelectorAll('[data-classement] tr[data-proposition]')].map((tr) => Number(tr.dataset.proposition)); - const instance = normaliser(configurationDepuisCharge(charge())); + const instance = normaliser(configurationDe(charge())); const aPriori = plafondsAPriori(instance); - const { ordre } = classer( + const { ordre, criteresAppliques, critereSaute } = classer( charge().propositions.map((p) => ({ id: p.id, mesures: mesurer(instance, indexerPlan(instance, planDepuisFichier(p))), plafondsAPriori: aPriori })), + compilationDe(instance), ); expect(ordre.length).toBeGreaterThanOrEqual(3); await attendre('le tableau classé', () => ids().length === ordre.length); expect(ids()).toEqual(ordre); - expect(texteDe(section.querySelector('[data-ordre]'))).toBe(t('propositions.ordre.criteres', { criteres: [...CRITERES] })); + // Le classement applique les paliers que 10a a réglés, et la phrase les + // nomme dans cet ordre : chaque valeur appliquée, puis l'identifiant ; + // le palier partagé, « ensemble », avec ses poids. + expect(critereSaute).toBeNull(); + expect(criteresAppliques.map((palier) => palier.criteres.map(({ nom, poids }) => ({ critere: nom, poids })))).toEqual(memoire.paliersRegles); + const phrase = section.querySelector('[data-ordre]'); + const nommes = [...phrase.querySelectorAll('[data-critere]')].map((nom) => nom.dataset.critere); + const attendus = criteresAppliques.flatMap((palier) => palier.criteres.flatMap(({ nom, valeurs }) => valeurs.map(() => nom))); + expect(nommes).toEqual([...attendus, 'identifiant']); + expect(texteDe(phrase)).toContain(plat(t('propositions.ordre.ensemble'))); + for (const poids of [1, 3]) expect(texteDe(phrase)).toContain(plat(t('propositions.ordre.poids', { poids }))); const colonnes = [...section.querySelectorAll('th[data-colonne]')].map((th) => th.dataset.colonne); for (const colonne of ['appartenancesVues', 'totalRedondance', 'diversite']) expect(colonnes, colonne).toContain(colonne); + // Le sixième groupe : les tours hors objectif, que le mode par défaut + // classe, et leur minimum ; rien des animateurs, décochés. + for (const colonne of ['toursHorsObjectif', 'toursSelonObjectif']) expect(colonnes, colonne).toContain(colonne); + for (const colonne of ['jamaisServies', 'horsObjectifMax', 'animateursRencontres', 'animateursNonRencontres']) { + expect(colonnes, colonne).not.toContain(colonne); + } // Le minimum des rencontres seul, jamais la moyenne ; r(p) par sa somme. expect(colonnes).not.toContain('redondance'); for (const th of section.querySelectorAll('th')) expect(texteDe(th)).not.toMatch(/moyenne/i); @@ -1356,7 +1853,20 @@ describe('le parcours par gestes, depuis un répertoire neuf', { timeout: DUREE expect(charge().retenu.proposition).toBe(ordre[0]); expect(charge().evenement.etat).toBe('retenu'); await attendre('la ligne du retenu', () => section.querySelector(`tr[data-retenu="${ordre[0]}"]`)); - await photographier(m, '11-propositions', { condition: ['[data-section="propositions"] [data-ordre]'], graine: GRAINE }); + // L'image montre la phrase de l'ordre au-dessus du tableau, défilé en + // largeur des colonnes de la diversité (§ 19.3) jusqu'au sixième groupe, + // celui des objectifs (D17) : le tableau déborde du cadre, et les + // colonnes du rang, de la proposition et des rencontres sortent de + // l'image. + const enTete = (nom) => section.querySelector(`th[data-colonne="${nom}"]`); + await cadrerEnLargeur([enTete('appartenancesVues'), enTete('toursSelonObjectif')]); + await photographier(m, '11-propositions', { + condition: [ + '[data-section="propositions"] [data-ordre]', + ...['appartenancesVues', 'diversite', 'toursHorsObjectif', 'toursSelonObjectif'].map((nom) => `[data-section="propositions"] th[data-colonne="${nom}"]`), + ], + graine: GRAINE, + }); }); test('19 un ajustement en cours : le glissement dit lequel des deux gestes, celui du placement retenu', async () => { @@ -1546,11 +2056,6 @@ describe('le parcours par gestes, depuis un répertoire neuf', { timeout: DUREE expect(window.scrollY).toBe(memoire.cadrage); barreHorsDeLImage(); await photographier(m, '23-plan-retenu', { condition: CONDITIONS_FEUILLE, graine: GRAINE }); - - await cliquer('[data-ecran="apercu"] [data-commande="fermerApercu"]'); - await attendre('le plan, de retour', () => dans('[data-ecran="evenement"] [data-section="plan"]')); - window.scrollTo(0, 0); - await images(2); }); // La planche du retenu, produite par la section Badges sur le papier que @@ -1559,6 +2064,11 @@ describe('le parcours par gestes, depuis un répertoire neuf', { timeout: DUREE // productions sous l'horloge pilotée donnent les mêmes octets, que // l'empreinte du manifeste suit. test('24 la planche du retenu par la section Badges : seul le PDF s’écrit, deux productions identiques ; la feuille de contrôle', async () => { + // L'aperçu de 23 se ferme : le plan revient, en haut. + await cliquer('[data-ecran="apercu"] [data-commande="fermerApercu"]'); + await attendre('le plan, de retour', () => dans('[data-ecran="evenement"] [data-section="plan"]')); + window.scrollTo(0, 0); + await images(2); expect(charge().evenement.etat).toBe('retenu'); expect(etat().papier).toBe('A4'); const avant = fichiers(); @@ -1634,14 +2144,14 @@ describe('le parcours par gestes, depuis un répertoire neuf', { timeout: DUREE for (const nomBadge of premiers) expect(texte, nomBadge).toContain(plat(nomBadge)); expect(texte).not.toContain(libelle('planche.brouillon')); }); - // Le parcours reprend sur le plan, comme 23 l'a laissé. - await ouvrirSection('plan'); }); // Les sorties vivent en lecture et sur un plan bloqué, et n'écrivent que // la planche et le papier de la machine (§ 11.6, § 8.4, § 9) ; le plan // débloqué, le parcours reprend sur le retenu, en écriture. test('lecture, puis bloqué : aperçu, impression, papier et planche ; seuls le PDF et reglages_locaux.json s’écrivent', async () => { + // Le parcours reprend sur le plan, comme 23 l'a laissé. + await ouvrirSection('plan'); expect(charge().evenement.etat).toBe('retenu'); await cliquer('[data-place-fixe] [data-commande="lecture"]'); await attendre('la lecture', () => etat().mode === 'lecture'); @@ -1766,6 +2276,36 @@ describe('l’ordre de lecture, pas une séquence imposée', { timeout: DUREE }, ); expect(suivant).toEqual([]); }); + + // Retirer un objectif et rétablir l'ordre par défaut détruisent chacun un + // seul objet, nommé contre sa commande, qu'un retour à l'instant précédent + // rend : aucune fenêtre (D19), et le retenu ne dérive pas (D13). + test('sur le retenu : retirer l’objectif du tour 1 de t2, rétablir l’ordre par défaut — une entrée chacun, sans fenêtre, sans dérive', async () => { + const [, t2] = charge().tables.map(({ id }) => id); + // Les raisons de dérive du retenu et de chaque proposition, que + // l'ajout d'une table et d'un tour ont posées : aucun des deux gestes + // n'en change une. + const raisons = () => [charge().retenu, ...charge().propositions].map((placement) => derive(placement, charge())); + const avant = raisons(); + await ouvrirSection('tables'); + await cliquer(`[data-section="tables"] [data-table="${t2}"] [data-commande="basculerObjectifsTours"]`); + const zone = await attendre('l’objectif du tour 1', () => dans(`[data-section="tables"] [data-objectif="${t2}-1"]`)); + await sansFenetre('retirerObjectif', async () => { + const r = revision(); + await appuyer(zone.querySelector('[data-commande="retirerObjectif"]'), 'retirer l’objectif du tour 1'); + await uneEntree(r, 'retirer l’objectif'); + }); + expect(charge().tables.find(({ id }) => id === t2).objectifs.some(({ tour }) => tour === 1)).toBe(false); + + await ouvrirSection('generation'); + await sansFenetre('retablirPriorites', async () => { + const r = revision(); + await cliquer('[data-section="generation"] [data-commande="retablirPriorites"]'); + await uneEntree(r, 'rétablir l’ordre par défaut'); + }); + expect(charge().reglages.priorites).toBeUndefined(); + expect(raisons()).toEqual(avant); + }); }); // --- Les fenêtres (§ 2.1, § 5.9) -------------------------------------------------------- @@ -1777,14 +2317,23 @@ describe('les fenêtres : seul un geste qui détruit en ouvre une', { timeout: D expect(fenetresVues).toEqual([]); }); - // « Remplacer », « Appliquer et réaligner », retirer un tour réservé, - // supprimer une personne ou une table réservées, « Retenir » sur un retenu - // ajusté. - test('cinq gestes destructeurs : une fenêtre qui nomme ce qui part ; Annuler n’écrit rien', async () => { + // « Remplacer », « Appliquer et réaligner », retirer un tour réservé qui + // porte un objectif de tour, supprimer une personne réservée ou une table + // réservée qui porte des objectifs, « Retenir » sur un retenu ajusté. + test('cinq gestes destructeurs : une fenêtre qui nomme ce qui part, objectifs compris ; Annuler n’écrit rien', async () => { expect(etat().mode).toBe('ecriture'); const [t1] = charge().tables.map(({ id }) => id); - // Préparation : une réservation au tour 4, un ajustement du retenu. + // Préparation : un objectif au tour 4 de t1, une réservation au tour 4, + // un ajustement du retenu. + await ouvrirSection('tables'); + await cliquer(`[data-section="tables"] [data-table="${t1}"] [data-commande="basculerObjectifsTours"]`); + const champTour4 = await attendre('l’objectif du tour 4', () => dans(`[data-section="tables"] input[data-champ="objectif-${t1}-4"]`)); + let r = revision(); + await saisir(champTour4, memoire.etiquette); + await uneEntree(r, 'l’objectif du tour 4'); + const objectif4 = charge().tables.find(({ id }) => id === t1).objectifs.find(({ tour }) => tour === 4); + expect(objectif4).toMatchObject({ portee: 'tour', etiquettes: [memoire.etiquette] }); await ouvrirPlan(); const selecteurTour = dans('[data-champ="tour"]'); selecteurTour.value = '4'; @@ -1792,7 +2341,7 @@ describe('les fenêtres : seul un geste qui détruit en ouvre une', { timeout: D await attendre('le tour 4 montré', () => m.ui.etat().tour === 4); await images(2); await regimeSieges(); - let r = revision(); + r = revision(); const auTour4 = await choisir('[data-reserve]'); const libre4 = chaiseVue((c) => c.occupant === null && c.reservation === null && c.titre === null); await cliquerPointeur(chaise(libre4.table, libre4.siege)); @@ -1871,16 +2420,23 @@ describe('les fenêtres : seul un geste qui détruit en ouvre une', { timeout: D }); await cliquer('[data-enonce="defaut"] [data-commande="garder"]'); - // Retirer le tour 4 : la réservation qui y tient, sa personne, sa table. + // Retirer le tour 4 : la réservation qui y tient, sa personne, sa table ; + // l'objectif du tour 4 de t1, sa table et ses étiquettes. const reservation4 = charge().reservations.find(({ participant, tour }) => participant === auTour4 && tour === 4); await fenetreAnnulee('retirer un tour réservé', () => saisir(dans('[data-section="tables"] input[data-champ="tours"]'), '3'), { titre: t('tables.tours.confirmation', { avant: 4, apres: 3 }), - parmi: [t('tables.tours.reservation', { nom: nomDe(auTour4), numero: numeroDe(reservation4.table), tour: 4 })], + parmi: [ + t('tables.tours.reservation', { nom: nomDe(auTour4), numero: numeroDe(reservation4.table), tour: 4 }), + t('tables.tours.objectif', { numero: numeroDe(t1), tour: 4, etiquettes: objectif4.etiquettes }), + ], }); expect(dans('[data-section="tables"] input[data-champ="tours"]').value).toBe('4'); // Supprimer t1 : son numéro, chaque réservation qu'elle tient avec le nom - // de sa personne, chaque titre posé à ses sièges. + // de sa personne, chaque titre posé à ses sièges, chacun de ses + // objectifs, de la soirée et des tours. + const objectifsT1 = charge().tables.find(({ id }) => id === t1).objectifs; + expect(objectifsT1.length).toBeGreaterThan(1); const deT1 = [ ...charge() .reservations.filter(({ table }) => table === t1) @@ -1888,6 +2444,7 @@ describe('les fenêtres : seul un geste qui détruit en ouvre une', { timeout: D ...charge() .titres.filter(({ table }) => table === t1) .map(({ siege, libelle }) => t('tables.suppression.titre', { siege, libelle })), + ...objectifsT1.map(({ tour, etiquettes }) => t('tables.suppression.objectif', { tour, etiquettes })), ]; expect(deT1.length).toBeGreaterThan(0); await fenetreAnnulee('supprimer une table réservée', () => cliquer(`[data-section="tables"] [data-table="${t1}"] [data-commande="supprimerTable"]`), { @@ -2003,6 +2560,19 @@ describe('lecture et bloqué : tout geste modifiant refusé, rien d’écrit', { await touche('Enter'); await refusPres(cellule, code, remede, 'saisir dans une cellule'); }); + // Une étiquette saisie dans la fiche, envoyée par Entrée : refusée contre + // le champ, la saisie gardée ; la fiche fermée ensuite. + await famille('changer les étiquettes', async () => { + const personne = charge().participants.find((p) => !p.exclu); + await cliquer(`[data-section="participants"] [data-participant="${personne.id}"] [data-commande="fiche"]`); + const fiche = await attendre('la fiche', () => dans(`[data-fiche="${personne.id}"]`)); + const champ = fiche.querySelector('input[data-champ="etiquettes"]'); + await saisir(champ, 'bénévole'); + await refusPres(() => fiche.querySelector('form'), code, remede, 'changer les étiquettes'); + expect(champ.value).toBe('bénévole'); + await cliquer('[data-fiche] [data-commande="fermerFiche"]'); + await attendre('la fiche fermée', () => dans('[data-fiche]') === null); + }); await famille('coller', async () => { const cellule = dans('[data-section="participants"] [role="grid"] [tabindex="0"]'); cellule.focus(); @@ -2023,6 +2593,19 @@ describe('lecture et bloqué : tout geste modifiant refusé, rien d’écrit', { await refusPres(() => dans('[data-apercu] [data-commande="importer"]').parentElement, code, remede, 'importer'); await cliquer('[data-apercu] [data-commande="fermerApercu"]'); }); + // Le CSV des objectifs, sous sa nature : l'aperçu s'ouvre, « Importer » + // est refusé à côté de lui ; la nature revient aux participants. + await famille('importer des objectifs', async () => { + await appuyer(dans('[data-nature-import] input[value="objectifs"]'), 'la nature « Objectifs de table »'); + const octets = new Uint8Array(await (await fetch(urlObjectifs)).arrayBuffer()); + m.fs.choisirFichierAImporter = async () => ({ nom: NOM_OBJECTIFS, octets }); + await cliquer('[data-section="import"] [data-commande="choisirFichier"]'); + await attendre('l’aperçu des objectifs', () => dans('[data-apercu] [data-commande="importer"]')); + await cliquer('[data-apercu] [data-commande="importer"]'); + await refusPres(() => dans('[data-apercu] [data-commande="importer"]').parentElement, code, remede, 'importer des objectifs'); + await cliquer('[data-apercu] [data-commande="fermerApercu"]'); + await appuyer(dans('[data-nature-import] input[value="participants"]'), 'la nature « Participants »'); + }); await ouvrirSection('tables'); await famille('créer une table', async () => { @@ -2052,11 +2635,62 @@ describe('lecture et bloqué : tout geste modifiant refusé, rien d’écrit', { await frapper(dans('[data-section="tables"] input[data-champ="tours"]')); await refusPres(() => dans('[data-tours]'), code, remede, 'changer les tours'); }); + // Une frappe dans l'objectif de la soirée de t2, puis « Retirer + // l'objectif » : chacun refusé à côté de lui. + await famille('poser ou retirer un objectif', async () => { + const zone = () => dans(`[data-section="tables"] [data-objectif="${t2}"]`); + await frapper(zone().querySelector(`input[data-champ="objectif-${t2}"]`)); + await refusPres(zone, code, remede, 'poser un objectif'); + const retirer = zone().querySelector('[data-commande="retirerObjectif"]'); + expect(retirer, 'la commande qui retire l’objectif de t2').not.toBeNull(); + await appuyer(retirer, 'retirer un objectif'); + await refusPres(() => retirer.parentElement, code, remede, 'retirer un objectif'); + }); + // Un cran de flèche sur la règle par défaut : refusé à côté d'elle, le + // choix rendu à la règle de la charge. + await famille('changer la règle par défaut', async () => { + const choix = dans('[data-regle-objectifs] select[data-champ="regleObjectifs"]'); + const avant = choix.value; + choix.scrollIntoView({ block: 'center' }); + choix.focus(); + await touche(choix.selectedIndex === 0 ? 'ArrowDown' : 'ArrowUp'); + flushSync(); + await refusPres(() => dans('[data-regle-objectifs]'), code, remede, 'changer la règle par défaut'); + expect(choix.value).toBe(avant); + }); await famille('changer l’état', async () => { await cliquer('[data-etat="brouillon"] [data-commande="etat"]'); await refusPres(() => dans('[data-etat="brouillon"]'), code, remede, 'changer l’état'); }); - expect(familles).toHaveLength(14); + + // Monter un critère, puis rétablir l'ordre par défaut : chacun refusé + // contre la liste des priorités, le second par un refus neuf. + await ouvrirSection('generation'); + await famille('changer l’ordre des priorités', async () => { + const groupe = () => dans('[data-section="generation"] [data-priorites]').closest('fieldset'); + const monter = dans('[data-priorites] [data-priorite="collisionsCumulees"] [data-commande="monterCritere"]'); + expect(monter, 'monter les collisions cumulées').not.toBeNull(); + await appuyer(monter, 'monter un critère'); + const premier = await refusPres(groupe, code, remede, 'monter un critère'); + await appuyer(dans('[data-section="generation"] [data-commande="retablirPriorites"]'), 'rétablir l’ordre par défaut'); + await refusPres(groupe, code, remede, 'rétablir l’ordre par défaut', premier); + }); + // Un clic sur la case des objectifs, puis sur un mode : chacun refusé à + // côté de lui, la case et le choix rendus à la valeur de la charge. + await famille('changer un réglage de génération', async () => { + const caseObjectifs = dans('[data-section="generation"] input[type="checkbox"][data-champ="respecterObjectifs"]'); + const cochee = caseObjectifs.checked; + await appuyer(caseObjectifs, 'la case des objectifs'); + await refusPres(() => caseObjectifs.parentElement, code, remede, 'la case des objectifs'); + expect(caseObjectifs.checked).toBe(cochee); + const groupe = () => dans('[data-section="generation"] [data-mode-objectifs]'); + const mode = groupe().querySelector('input:checked').value; + const autre = [...groupe().querySelectorAll('input[type="radio"]')].find((choix) => choix.value !== mode); + await appuyer(autre, 'un autre mode des objectifs'); + await refusPres(groupe, code, remede, 'un autre mode des objectifs'); + expect(groupe().querySelector('input:checked').value).toBe(mode); + }); + expect(familles).toEqual(FAMILLES_MODIFIANTES.map(({ nom }) => nom)); } // Le tri, le filtre et les listes de travail restent vivants. @@ -2084,7 +2718,14 @@ describe('lecture et bloqué : tout geste modifiant refusé, rien d’écrit', { // regarder admet (ecritureAdmise). const ecrituresDepuis = (rang) => m.trace.slice(rang).filter(([, , chemin]) => chemin !== '' && !ecritureAdmise(chemin)); - test('en lecture : quatorze familles refusées avec « Modifier », rien d’écrit ; tri, filtre, listes de travail vivants', async () => { + test('les familles : des noms uniques, des gestes surveillés, chaque geste des étiquettes, des objectifs et des priorités tenté', () => { + const tentes = FAMILLES_MODIFIANTES.flatMap(({ gestes }) => gestes); + expect(tentes.filter((geste) => !GESTES_NON_DESTRUCTEURS.includes(geste))).toEqual([]); + expect(GESTES_DES_OBJECTIFS.filter((geste) => !tentes.includes(geste))).toEqual([]); + expect(new Set(FAMILLES_MODIFIANTES.map(({ nom }) => nom)).size).toBe(FAMILLES_MODIFIANTES.length); + }); + + test('en lecture : chaque famille modifiante refusée avec « Modifier », rien d’écrit ; tri, filtre, listes de travail vivants', async () => { await cliquer('[data-place-fixe] [data-commande="lecture"]'); await attendre('la lecture', () => etat().mode === 'lecture'); const empreinte = serialiserCharge(charge()); @@ -2100,7 +2741,7 @@ describe('lecture et bloqué : tout geste modifiant refusé, rien d’écrit', { expect(ecrituresDepuis(rang)).toEqual([]); }); - test('plan bloqué : quatorze familles refusées avec « Débloquer », rien d’écrit ; tri, filtre, listes de travail vivants', async () => { + test('plan bloqué : chaque famille modifiante refusée avec « Débloquer », rien d’écrit ; tri, filtre, listes de travail vivants', async () => { await cliquer('[data-place-fixe] [data-commande="modifier"]'); await attendre('l’écriture', () => etat().mode === 'ecriture'); const r = revision();