From 91c844725b419fad781f90fc9967f1ad2eb96b6f Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Sun, 11 Oct 2026 06:56:17 -0400 Subject: [PATCH] [REF] event screen: no frame names, list summaries trimmed to use MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The event list shows only the retained plan's redundancy gap and the id of the best proposal, yet its summaries still carried cumulative collisions and redundancy totals. They now carry what the list reads. The mode frame is gone from the screen, so its names go too: the mode surface component, the mode colour tokens and the bar's mode label are named for what they are. Values, pixels and captures are unchanged. Checked: node 4039, navigateur 884 with the walkthrough, node-long 105. --- FR --- [REF] écran d'événement : sans noms de cadre, résumés de liste réduits La liste des événements ne montre que l'écart de redondance du retenu et l'identifiant de la meilleure proposition, mais ses résumés portaient encore les collisions cumulées et les totaux de redondance. Ils portent désormais ce que la liste lit. Le cadre de mode a quitté l'écran, ses noms aussi : le composant de surface, les jetons de couleur du mode et le libellé de mode de la barre portent le nom de ce qu'ils sont. Valeurs, pixels et captures inchangés. Vérifié : node 4039, navigateur 884 avec le parcours, node-long 105. Assisted-by: Claude Opus 5.5 --- src/application/evaluation.js | 50 +++++++++---------- src/application/evaluation.test.js | 29 ++++------- src/application/evenements.js | 6 +-- src/application/evenements.test.js | 21 ++++---- src/interface/accueil/modele.js | 3 +- src/interface/accueil/modele.test.js | 22 ++++---- src/interface/evenement/Avertissements.svelte | 2 +- src/interface/evenement/BandeMode.svelte | 11 ++-- .../evenement/EnteteEvenement.svelte | 14 +++--- .../evenement/Enveloppe.navigateur.test.js | 24 ++++----- src/interface/evenement/EtatsPlan.svelte | 4 +- .../evenement/Evenement.navigateur.test.js | 12 ++--- src/interface/evenement/Evenement.svelte | 14 +++--- ...dreMode.svelte => SurfaceEvenement.svelte} | 4 +- src/interface/impression/Apercu.svelte | 2 +- src/interface/jetons.css | 12 ++--- src/interface/libelles/evenement.js | 2 +- src/interface/marques.js | 6 +-- src/interface/marques.test.js | 2 +- src/interface/parcours.navigateur.test.js | 6 +-- src/interface/participants/Fiche.svelte | 6 +-- .../plan/Panneaux.navigateur.test.js | 6 +-- src/interface/plan/Vue.navigateur.test.js | 4 +- src/interface/transversal.navigateur.test.js | 4 +- test/navigateur/designations.js | 2 +- 25 files changed, 127 insertions(+), 141 deletions(-) rename src/interface/evenement/{CadreMode.svelte => SurfaceEvenement.svelte} (99%) diff --git a/src/application/evaluation.js b/src/application/evaluation.js index f69408b..dd7d170 100644 --- a/src/application/evaluation.js +++ b/src/application/evaluation.js @@ -21,13 +21,14 @@ // rencontres répétées imposées dépendent du plan, et chaque ligne les lit // dans ses mesures, à part des choisies. // -// resumeDuRetenu donne à la liste des événements deux nombres du retenu, -// lus dans la même mesure que sa ligne du tableau, sans le diagnostic ni -// les plafonds : la liste en résume chaque événement du dossier. -// premiereDuClassement est la seule définition de la proposition au rang 1 -// : la section de la génération la lit dans sa table, resumeDuMeilleur la -// donne à la liste, sur la même table d'évaluation, diagnostic compris — le -// premier critère du classement lit le plafond a priori. +// resumeDuRetenu donne à la liste des événements la différence à la cible +// du retenu, lue dans la même mesure que sa ligne du tableau, sans le +// diagnostic ni les plafonds : la liste en résume chaque événement du +// dossier. premiereDuClassement est la seule définition de la proposition +// au rang 1 : la section de la génération la lit dans sa table, +// resumeDuMeilleur en donne l'identifiant à la liste, sur la même table +// d'évaluation, diagnostic compris — le premier critère du classement lit +// le plafond a priori. import { classer } from '../moteur/classement.js'; import { indexerPlan, normaliser } from '../moteur/configuration.js'; import { diagnostiquer } from '../moteur/diagnostic.js'; @@ -162,16 +163,15 @@ export function evaluer(charge, { plafondsAPriori = 'calcul' } = {}) { /** * Le résumé du retenu que montre la liste des événements (§ 5.4, § 8.1, - * § 8.9) : ses collisions cumulées et sa somme de redondance Σ r(p), celles - * de mesurer, que la ligne du retenu d'evaluer porte aussi ; la cible de - * l'événement (cibleRedondance) ; et diffRedondance, la valeur absolue de la - * cible moins Σ r(p). null sans retenu, pour un retenu fautif ou en dérive, - * et quand la configuration ne se normalise pas : rien ne s'y mesure, et - * la liste écrit « — ». Ne modifie pas la charge. + * § 8.9) : diffRedondance, la valeur absolue de la cible de l'événement + * (cibleRedondance) moins la somme de redondance Σ r(p) du retenu, celle de + * mesurer, que la ligne du retenu d'evaluer porte aussi. null sans retenu, + * pour un retenu fautif ou en dérive, et quand la configuration ne se + * normalise pas : rien ne s'y mesure, et la liste écrit « — ». Ne modifie + * pas la charge. * * @param {import('../stockage/types.js').Charge} charge - * @returns {{collisionsCumulees: number, totalRedondance: number, - * cibleRedondance: number, diffRedondance: number}|null} + * @returns {{diffRedondance: number}|null} */ export function resumeDuRetenu(charge) { const { retenu } = charge; @@ -183,9 +183,8 @@ export function resumeDuRetenu(charge) { if (erreur instanceof ErreurConfiguration) return null; throw erreur; } - const { collisionsCumulees, totalRedondance } = mesurer(instance, indexerPlan(instance, planDepuisFichier(retenu))); - const cible = cibleRedondance(charge); - return { collisionsCumulees, totalRedondance, cibleRedondance: cible, diffRedondance: Math.abs(cible - totalRedondance) }; + const { totalRedondance } = mesurer(instance, indexerPlan(instance, planDepuisFichier(retenu))); + return { diffRedondance: Math.abs(cibleRedondance(charge) - totalRedondance) }; } /** @@ -204,15 +203,14 @@ export function premiereDuClassement(table) { /** * La meilleure proposition du classement que montre la liste des - * événements (§ 5.4, § 5.7, § 8.1) : l'identifiant de la proposition au - * rang 1 (premiereDuClassement) et ses collisions cumulées, celles de sa - * ligne d'evaluer. null sans proposition, quand aucune ne se compare — - * toutes fautives ou en dérive —, et quand la configuration ne se normalise - * pas : la liste écrit alors « — ». Le retenu n'y entre pas. Ne modifie pas - * la charge. + * événements (§ 5.4, § 5.7, § 8.1) : id, l'identifiant de la proposition au + * rang 1 (premiereDuClassement). null sans proposition, quand aucune ne se + * compare — toutes fautives ou en dérive —, et quand la configuration ne se + * normalise pas : la liste écrit alors « — ». Le retenu n'y entre pas. Ne + * modifie pas la charge. * * @param {import('../stockage/types.js').Charge} charge - * @returns {{id: number, collisionsCumulees: number}|null} + * @returns {{id: number}|null} */ export function resumeDuMeilleur(charge) { if (charge.propositions.length === 0) return null; @@ -224,5 +222,5 @@ export function resumeDuMeilleur(charge) { throw erreur; } const premiere = premiereDuClassement(table); - return premiere === null ? null : { id: premiere.id, collisionsCumulees: premiere.mesures.collisionsCumulees }; + return premiere === null ? null : { id: premiere.id }; } diff --git a/src/application/evaluation.test.js b/src/application/evaluation.test.js index 2ff003f..c518a7c 100644 --- a/src/application/evaluation.test.js +++ b/src/application/evaluation.test.js @@ -441,41 +441,33 @@ describe("évaluation : une configuration qui ne se tient pas", () => { }); }); -describe('resumeDuRetenu : les mesures du retenu que lit la liste des événements (§ 5.4, § 8.1, § 8.9)', () => { +describe('resumeDuRetenu : la différence à la cible que lit la liste des événements (§ 5.4, § 8.1, § 8.9)', () => { // La petite démonstration, trois propositions générées, la deuxième retenue. function retenue() { const generees = generee(chargeDemo('petite-conflit'), { graine: 3, nombre: 3, arret: 300 }); return executer(generees, 'retenirProposition', { id: generees.propositions[1].id }); } - test("les collisions cumulées et Σ r(p) du retenu, celles de la ligne du retenu d'evaluer, et la cible, 1000 par défaut", () => { + test("la seule différence à la cible, 1000 par défaut, contre le Σ r(p) de la ligne du retenu d'evaluer", () => { const charge = figer(retenue()); const resume = resumeDuRetenu(charge); const { mesures } = evaluer(charge).retenu; - assert.ok(mesures.collisionsCumulees > 0, 'la petite démonstration en conflit compte des collisions'); - assert.deepEqual(resume, { - collisionsCumulees: mesures.collisionsCumulees, - totalRedondance: mesures.totalRedondance, - cibleRedondance: 1000, - diffRedondance: Math.abs(1000 - mesures.totalRedondance), - }); + assert.ok(mesures.totalRedondance !== 1000, 'la différence se distingue de zéro'); + assert.deepEqual(resume, { diffRedondance: Math.abs(1000 - mesures.totalRedondance) }); const instance = normaliser(configurationDepuisCharge(charge)); const attendues = mesurer(instance, indexerPlan(instance, planDepuisFichier(charge.retenu))); - assert.equal(resume.totalRedondance, attendues.totalRedondance); - assert.equal(resume.collisionsCumulees, attendues.collisionsCumulees); + assert.equal(attendues.totalRedondance, mesures.totalRedondance); assert.equal(CIBLE_REDONDANCE_PAR_DEFAUT, 1000); assert.equal(cibleRedondance(charge), 1000); }); test("une cible propre à l'événement : la différence se lit contre elle, en valeur absolue, des deux côtés", () => { const charge = retenue(); - const total = resumeDuRetenu(charge).totalRedondance; + const total = evaluer(charge).retenu.mesures.totalRedondance; for (const cible of [0, total, total + 7, 5_000]) { const avecCible = executer(charge, 'changerCibleRedondance', { cible: String(cible) }); assert.equal(cibleRedondance(avecCible), cible); - const resume = resumeDuRetenu(avecCible); - assert.equal(resume.cibleRedondance, cible); - assert.equal(resume.diffRedondance, Math.abs(cible - total), String(cible)); + assert.deepEqual(resumeDuRetenu(avecCible), { diffRedondance: Math.abs(cible - total) }, String(cible)); } const dessous = executer(charge, 'changerCibleRedondance', { cible: '0' }); assert.equal(resumeDuRetenu(dessous).diffRedondance, total); @@ -507,7 +499,7 @@ describe('resumeDuRetenu : les mesures du retenu que lit la liste des événemen }); describe('resumeDuMeilleur : la proposition au rang 1 que lit la liste des événements (§ 5.4, § 5.7, § 8.1)', () => { - test("le rang 1 du classement, ni le plus petit identifiant ni le moins de collisions : son identifiant et ses collisions cumulées", () => { + test('le rang 1 du classement, ni le plus petit identifiant ni le moins de collisions : son seul identifiant', () => { // Le classement range les plans écrits à la main 3, 2, 1, 4 : la 3 vient // en tête avec 6 collisions cumulées, quand la 1 n'en porte que 4. const charge = structuredClone(chargeDemo('petite-conflit')); @@ -516,9 +508,10 @@ describe('resumeDuMeilleur : la proposition au rang 1 que lit la liste des évé figer(charge); const table = evaluer(charge); assert.deepEqual(table.classement.ordre, [3, 2, 1, 4]); - assert.deepEqual(resumeDuMeilleur(charge), { id: 3, collisionsCumulees: 6 }); + assert.deepEqual(resumeDuMeilleur(charge), { id: 3 }); assert.equal(premiereDuClassement(table), table.propositions[0]); assert.equal(premiereDuClassement(table).mesures.collisionsCumulees, 6); + assert.equal(table.propositions.find(({ id }) => id === 1).mesures.collisionsCumulees, 4); }); test("après des générations : la première ligne d'evaluer, comparable, et le retenu n'y change rien", () => { @@ -526,7 +519,7 @@ describe('resumeDuMeilleur : la proposition au rang 1 que lit la liste des évé charge = generee(charge, { graine: 9, nombre: 2, arret: 300 }); const [premiere] = evaluer(charge).propositions; assert.equal(premiere.statut, 'comparable'); - const attendu = { id: premiere.id, collisionsCumulees: premiere.mesures.collisionsCumulees }; + const attendu = { id: premiere.id }; assert.deepEqual(resumeDuMeilleur(figer(charge)), attendu); const derniere = charge.propositions.at(-1).id; const retenue = executer(charge, 'retenirProposition', { id: derniere }); diff --git a/src/application/evenements.js b/src/application/evenements.js index 5c04ce6..8138746 100644 --- a/src/application/evenements.js +++ b/src/application/evenements.js @@ -147,9 +147,9 @@ const AUCUN_RESUME = Object.freeze({ mesuresDuRetenu: null, meilleureDuClassemen // rattrape en mémoire, par la règle de rattraper, et examiner (§ 8.9, point // 3) en écarte une proposition fautive, dont l'identifiant se répète ou // atteint le compteur — le classement lève sur un identifiant répété. La -// liste nomme ainsi la proposition au rang 1, et son nombre, que le bloc de -// génération de l'événement ouvert nomme (§ 8.1). null pour un état absent -// ou qui ne s'ouvre pas. +// liste nomme ainsi la proposition au rang 1 que le bloc de génération de +// l'événement ouvert nomme (§ 8.1). null pour un état absent ou qui ne +// s'ouvre pas. async function chargeExaminee(fs, racine, base) { try { return (await ouvrirDepot(fs, racine, base)).charge; diff --git a/src/application/evenements.test.js b/src/application/evenements.test.js index 34219b6..37f5af2 100644 --- a/src/application/evenements.test.js +++ b/src/application/evenements.test.js @@ -639,7 +639,7 @@ describe('lister (§ 8.1, § 19.4)', () => { return serialiser(modifier(charge), { revision: 3, produitVersion: V1 }); } - test('les mesures du retenu : collisions cumulées, Σ r(p), la cible et la différence, celles de resumeDuRetenu ; null sans retenu ; rien d’écrit', async () => { + test('les mesures du retenu : la seule différence à la cible, celle de resumeDuRetenu ; null sans retenu ; rien d’écrit', async () => { const { fs, facade } = await deuxEvenements(); fs.deposer('portable', `retenue${SUFFIXES.etat}`, texteRetenu()); const avant = ecritures(fs); @@ -648,12 +648,7 @@ describe('lister (§ 8.1, § 19.4)', () => { const par = Object.fromEntries(lignes.map((ligne) => [ligne.base, ligne])); const charge = analyser(texteRetenu()).charge; const { mesures } = evaluer(charge).retenu; - assert.deepEqual(par.retenue.mesuresDuRetenu, { - collisionsCumulees: mesures.collisionsCumulees, - totalRedondance: mesures.totalRedondance, - cibleRedondance: 1000, - diffRedondance: Math.abs(1000 - mesures.totalRedondance), - }); + assert.deepEqual(par.retenue.mesuresDuRetenu, { diffRedondance: Math.abs(1000 - mesures.totalRedondance) }); assert.deepEqual(par.retenue.mesuresDuRetenu, resumeDuRetenu(charge)); assert.equal(par['soiree-a'].mesuresDuRetenu, null); assert.equal(par.petite.mesuresDuRetenu, null); @@ -665,8 +660,8 @@ describe('lister (§ 8.1, § 19.4)', () => { fs.deposer('portable', `retenue${SUFFIXES.etat}`, texte); const ligne = (await listerResume(facade)).find(({ base }) => base === 'retenue'); const { totalRedondance } = evaluer(analyser(texte).charge).retenu.mesures; - assert.equal(ligne.mesuresDuRetenu.cibleRedondance, 25); - assert.equal(ligne.mesuresDuRetenu.diffRedondance, Math.abs(25 - totalRedondance)); + assert.notEqual(Math.abs(25 - totalRedondance), Math.abs(1000 - totalRedondance)); + assert.deepEqual(ligne.mesuresDuRetenu, { diffRedondance: Math.abs(25 - totalRedondance) }); }); test('un retenu fautif, ou en dérive, et un état illisible : null, la liste entière rendue, rien d’écrit', async () => { @@ -716,7 +711,7 @@ describe('lister (§ 8.1, § 19.4)', () => { const charge = analyser(texte).charge; const [premiere] = evaluer(charge).propositions; assert.equal(premiere.statut, 'comparable', base); - assert.deepEqual(par[base].meilleureDuClassement, { id: premiere.id, collisionsCumulees: premiere.mesures.collisionsCumulees }, base); + assert.deepEqual(par[base].meilleureDuClassement, { id: premiere.id }, base); assert.deepEqual(par[base].meilleureDuClassement, resumeDuMeilleur(charge), base); } assert.equal(par.proposee.mesuresDuRetenu, null); @@ -724,7 +719,7 @@ describe('lister (§ 8.1, § 19.4)', () => { assert.equal(par.petite.meilleureDuClassement, null); }); - test("un journal en avance d'une entrée : la ligne porte la proposition et le nombre que montre le bloc après ouverture, sans rien écrire", async () => { + test("un journal en avance d'une entrée : la ligne porte la proposition que montre le bloc après ouverture, sans rien écrire", async () => { const montage = await deuxEvenements(); const { fs, facade } = montage; // L'état d'une soirée sans proposition ; le journal porte en plus la @@ -905,7 +900,9 @@ describe('lister (§ 8.1, § 19.4)', () => { fs.deposer('portable', `retenue${SUFFIXES.etat}`, plusTard); for (let pas = 0; pas < lignes.length; pas += 1) await unPas(horloge); await flux.fin; - assert.equal(recus.get('retenue').mesuresDuRetenu.cibleRedondance, 25); + const { totalRedondance } = evaluer(analyser(plusTard).charge).retenu.mesures; + assert.notEqual(Math.abs(25 - totalRedondance), Math.abs(1000 - totalRedondance)); + assert.equal(recus.get('retenue').mesuresDuRetenu.diffRedondance, Math.abs(25 - totalRedondance)); assert.deepEqual(recus.get('retenue'), resumesAttendus(plusTard)); }); diff --git a/src/interface/accueil/modele.js b/src/interface/accueil/modele.js index b705b64..067d4f9 100644 --- a/src/interface/accueil/modele.js +++ b/src/interface/accueil/modele.js @@ -148,7 +148,8 @@ export function signalementsDe(ligne) { * * @param {Object} ligne LigneListe (evenements.js) * @param {ReturnType} format - * @param {{mesuresDuRetenu: Object|null, meilleureDuClassement: Object|null}} [resume] + * @param {{mesuresDuRetenu: {diffRedondance: number}|null, + * meilleureDuClassement: {id: number}|null}} [resume] * @returns {{nom: string, date: string, etat: string, participants: string, * modification: string, chemin: string, enAttente: boolean, * diffRedondance: string, meilleure: {id: string}, diff --git a/src/interface/accueil/modele.test.js b/src/interface/accueil/modele.test.js index 00e055d..67277f5 100644 --- a/src/interface/accueil/modele.test.js +++ b/src/interface/accueil/modele.test.js @@ -335,15 +335,11 @@ describe('saisieDe : la saisie d’un nom pour copier ou renommer (§ 8.7)', () }); describe('ligneAffichee : les mesures du retenu (§ 5.4, § 8.1, § 8.9)', () => { - test('la différence à la cible, celle de la façade, mise en forme, sans calcul ici ; les collisions cumulées du retenu ne se montrent pas', () => { - const mesuresDuRetenu = { collisionsCumulees: 8765, totalRedondance: 1500, cibleRedondance: 1000, diffRedondance: 500 }; - const affichee = ligneAffichee(ligne(), format, { ...AUCUN, mesuresDuRetenu }); - assert.equal(affichee.diffRedondance, format.nombre(500)); - assert.ok(!Object.values(affichee).includes(format.nombre(8765))); - // La différence se lit telle que la façade la rend, jamais refaite - // depuis la cible et la somme. - const telleQuelle = ligneAffichee(ligne(), format, { ...AUCUN, mesuresDuRetenu: { ...mesuresDuRetenu, diffRedondance: 7 } }); - assert.equal(telleQuelle.diffRedondance, format.nombre(7)); + test('la différence à la cible, celle de la façade, mise en forme, sans calcul ici', () => { + for (const diffRedondance of [500, 7, 0]) { + const affichee = ligneAffichee(ligne(), format, { ...AUCUN, mesuresDuRetenu: { diffRedondance } }); + assert.equal(affichee.diffRedondance, format.nombre(diffRedondance), String(diffRedondance)); + } }); test('sans retenu mesurable, et pour une ligne illisible, la différence vaut « — »', () => { @@ -378,8 +374,8 @@ describe('ligneAffichee : les résumés en attente (§ 8.1)', () => { assert.deepEqual(attente.meilleure, { id: VIDE }); assert.equal(ligneAffichee(ligne(), format, AUCUN).enAttente, false); const recu = ligneAffichee(ligne(), format, { - mesuresDuRetenu: { collisionsCumulees: 12, totalRedondance: 990, cibleRedondance: 1000, diffRedondance: 10 }, - meilleureDuClassement: { id: 3, collisionsCumulees: 9 }, + mesuresDuRetenu: { diffRedondance: 10 }, + meilleureDuClassement: { id: 3 }, }); assert.equal(recu.enAttente, false); assert.equal(recu.diffRedondance, format.nombre(10)); @@ -401,8 +397,8 @@ describe('ligneAffichee : la meilleure proposition du classement (§ 5.4, § 5.7 return executer(charge, 'enregistrerGeneration', { propositions, configuration, produitVersion: VERSION.affichee }); } - test("l'identifiant que rend la façade, mis en forme, sans calcul ici ; ses collisions cumulées ne se montrent pas", () => { - const affichee = ligneAffichee(ligne(), format, { ...AUCUN, meilleureDuClassement: { id: 1234, collisionsCumulees: 5678 } }); + test("l'identifiant que rend la façade, mis en forme, sans calcul ici", () => { + const affichee = ligneAffichee(ligne(), format, { ...AUCUN, meilleureDuClassement: { id: 1234 } }); assert.deepEqual(affichee.meilleure, { id: format.nombre(1234) }); }); diff --git a/src/interface/evenement/Avertissements.svelte b/src/interface/evenement/Avertissements.svelte index f6b4146..ee3edd1 100644 --- a/src/interface/evenement/Avertissements.svelte +++ b/src/interface/evenement/Avertissements.svelte @@ -18,7 +18,7 @@ // écartées, placements en dérive — vient dessous, sur toute la largeur du // message : l'action n'étroitise que la première phrase. La zone des // annonces qui les porte prend la hauteur d'un avertissement ordinaire, - // action comprise, et défile au-delà (CadreMode.svelte). + // action comprise, et défile au-delà (SurfaceEvenement.svelte). import { getContext } from 'svelte'; import Commande from '../primitives/Commande.svelte'; import Icone from '../primitives/Icone.svelte'; diff --git a/src/interface/evenement/BandeMode.svelte b/src/interface/evenement/BandeMode.svelte index 7354474..5fb1684 100644 --- a/src/interface/evenement/BandeMode.svelte +++ b/src/interface/evenement/BandeMode.svelte @@ -9,8 +9,9 @@ // libellés, elle porte seule le mode : aucun trait n'entoure la surface de // travail. // - // Son fond et son filet sont ceux du mode, son icône de la teinte du mode - // (--couleur-cadre-…), son texte de l'encre de la page (marques.js : + // Son fond et son filet sont ceux du mode (--couleur-mode-…-fond et + // -filet), son icône de la teinte du mode (--couleur-mode-lecture, + // -ecriture, -bloque), son texte de l'encre de la page (marques.js : // bandeMode et les signes bandeLecture, bandeEcriture, bandeBloque). // Région d'état, elle annonce le mode quand il change. // @@ -68,14 +69,14 @@ .signe { display: flex; - color: var(--couleur-cadre-lecture); + color: var(--couleur-mode-lecture); } .ecriture .signe { - color: var(--couleur-cadre-ecriture); + color: var(--couleur-mode-ecriture); } .bloque .signe { - color: var(--couleur-cadre-bloque); + color: var(--couleur-mode-bloque); } diff --git a/src/interface/evenement/EnteteEvenement.svelte b/src/interface/evenement/EnteteEvenement.svelte index 72cb219..aed93cb 100644 --- a/src/interface/evenement/EnteteEvenement.svelte +++ b/src/interface/evenement/EnteteEvenement.svelte @@ -2,13 +2,13 @@ License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) -->
-
+
{#if commande === 'format'} @@ -115,7 +115,7 @@
{#if libelle !== null} - {t(libelle.cle)} diff --git a/src/interface/impression/Apercu.svelte b/src/interface/impression/Apercu.svelte index abe6cf2..776b00e 100644 --- a/src/interface/impression/Apercu.svelte +++ b/src/interface/impression/Apercu.svelte @@ -114,7 +114,7 @@

{t('impression.titre')}

{#if cleMode !== null} - {t(cleMode)} + {t(cleMode)} {/if}
diff --git a/src/interface/jetons.css b/src/interface/jetons.css index abee7de..e095abd 100644 --- a/src/interface/jetons.css +++ b/src/interface/jetons.css @@ -205,9 +205,9 @@ textarea { /* Bande de mode (§ 8.4) : la teinte de chaque mode, que porte son icône, puis son fond et son filet. */ - --couleur-cadre-lecture: #5c6878; - --couleur-cadre-ecriture: #2e7d32; - --couleur-cadre-bloque: #7b3fa0; + --couleur-mode-lecture: #5c6878; + --couleur-mode-ecriture: #2e7d32; + --couleur-mode-bloque: #7b3fa0; --couleur-mode-lecture-fond: #e9edf3; --couleur-mode-lecture-filet: #c3cbd6; --couleur-mode-ecriture-fond: #e3f4e8; @@ -311,9 +311,9 @@ textarea { --couleur-appartenance-6-fond: #152826; --couleur-appartenance-6-marque: #298e88; - --couleur-cadre-lecture: #9aa5b4; - --couleur-cadre-ecriture: #81c784; - --couleur-cadre-bloque: #ce93d8; + --couleur-mode-lecture: #9aa5b4; + --couleur-mode-ecriture: #81c784; + --couleur-mode-bloque: #ce93d8; --couleur-mode-lecture-fond: #1f252d; --couleur-mode-lecture-filet: #3a434f; --couleur-mode-ecriture-fond: #16291c; diff --git a/src/interface/libelles/evenement.js b/src/interface/libelles/evenement.js index f9e3e6d..6716e14 100644 --- a/src/interface/libelles/evenement.js +++ b/src/interface/libelles/evenement.js @@ -54,7 +54,7 @@ export const TABLE = new Map([ ['evenement.phase.produire', 'Produire'], // --- La barre de l'événement et sa place fixe (§ 8.3, § 8.4, § 8.5) ------ - ['evenement.cadre.commandes', 'Commandes de l\u{2019}événement'], + ['evenement.barre.commandes', 'Commandes de l\u{2019}événement'], ['evenement.commande.defaire', 'Défaire'], ['evenement.commande.refaire', 'Refaire'], diff --git a/src/interface/marques.js b/src/interface/marques.js index adf6f87..48cc1c3 100644 --- a/src/interface/marques.js +++ b/src/interface/marques.js @@ -102,9 +102,9 @@ export const SIGNES = Object.freeze([ marque('signeAvis', 'avis-marque', ['avis-fond']), marque('signeRefus', 'refus-marque', ['refus-fond']), marque('signeInformation', 'information-marque', ['information-fond']), - marque('bandeEcriture', 'cadre-ecriture', ['mode-ecriture-fond']), - marque('bandeLecture', 'cadre-lecture', ['mode-lecture-fond']), - marque('bandeBloque', 'cadre-bloque', ['mode-bloque-fond']), + marque('bandeEcriture', 'mode-ecriture', ['mode-ecriture-fond']), + marque('bandeLecture', 'mode-lecture', ['mode-lecture-fond']), + marque('bandeBloque', 'mode-bloque', ['mode-bloque-fond']), marque('actionPrincipale', 'action-fond', SURFACES), ]); diff --git a/src/interface/marques.test.js b/src/interface/marques.test.js index c2a9dbe..1c40195 100644 --- a/src/interface/marques.test.js +++ b/src/interface/marques.test.js @@ -208,7 +208,7 @@ describe('les signes des pastilles, des messages, de la bande de mode et de l’ // la bande. for (const mode of ['Ecriture', 'Lecture', 'Bloque']) { const signe = parNom(SIGNES, `bande${mode}`); - assert.deepEqual([signe.jeton, ...signe.fonds], [`--couleur-cadre-${mode.toLowerCase()}`, `--couleur-mode-${mode.toLowerCase()}-fond`]); + assert.deepEqual([signe.jeton, ...signe.fonds], [`--couleur-mode-${mode.toLowerCase()}`, `--couleur-mode-${mode.toLowerCase()}-fond`]); } }); diff --git a/src/interface/parcours.navigateur.test.js b/src/interface/parcours.navigateur.test.js index cf25db5..7449117 100644 --- a/src/interface/parcours.navigateur.test.js +++ b/src/interface/parcours.navigateur.test.js @@ -225,7 +225,7 @@ function exigerModeSansCadre(mode) { const style = getComputedStyle(surface); for (const cote of ['Top', 'Right', 'Bottom', 'Left']) expect(Number.parseFloat(style[`border${cote}Width`]), cote).toBe(0); const bande = dans('[data-ecran="evenement"] > [role="status"]'); - const libelle = dans('[data-mode-libelle="cadre"]'); + const libelle = dans('[data-mode-libelle="barre"]'); expect(visible(bande)).toBe(true); expect(visible(libelle)).toBe(true); expect(texteDe(libelle).length).toBeGreaterThan(0); @@ -860,7 +860,7 @@ describe('le parcours par gestes, depuis un répertoire neuf', { timeout: DUREE await rienEcrit(avant, 'créer une table en lecture'); expect(charge().tables).toHaveLength(0); await photographier(m, '01b-passer-en-ecriture', { - condition: ['[data-place-fixe] [data-commande="modifier"]', '[data-refus="MODE_LECTURE"]', '[data-mode-libelle="cadre"]'], + condition: ['[data-place-fixe] [data-commande="modifier"]', '[data-refus="MODE_LECTURE"]', '[data-mode-libelle="barre"]'], }); }); @@ -1446,7 +1446,7 @@ describe('le parcours par gestes, depuis un répertoire neuf', { timeout: DUREE await rienEcrit(avant, 'les quatre gestes en lecture'); expect(dans(`[data-table="${t2}"]`).getAttribute('transform')).toBeNull(); for (const t of etatMontre().tables) expect(tous(`[data-siege^="${t.id}:"]`), `table ${t.numero}`).toHaveLength(t.capacite); - await photographier(m, '20-mode-lecture', { condition: ['[data-mode-libelle="cadre"]', '[data-mode-libelle="bandeau"]'], graine: GRAINE }); + await photographier(m, '20-mode-lecture', { condition: ['[data-mode-libelle="barre"]', '[data-mode-libelle="bandeau"]'], graine: GRAINE }); }); test('20 « Défaire » en lecture : refusé avec « Modifier » ; en écriture, rend l’état d’avant 19', async () => { diff --git a/src/interface/participants/Fiche.svelte b/src/interface/participants/Fiche.svelte index 7b8b4b0..25fd755 100644 --- a/src/interface/participants/Fiche.svelte +++ b/src/interface/participants/Fiche.svelte @@ -149,9 +149,9 @@ font-size: var(--taille-texte); line-height: 1.4; overflow-wrap: anywhere; - /* Jamais plus haute que la surface qui la porte (CadreMode) : ouverte - sous la grille, dans une fenêtre étroite, elle se montre en entier, - et son contenu défile en elle. */ + /* Jamais plus haute que la surface qui la porte + (SurfaceEvenement.svelte) : ouverte sous la grille, dans une fenêtre + étroite, elle se montre en entier, et son contenu défile en elle. */ max-height: 100cqb; overflow-y: auto; } diff --git a/src/interface/plan/Panneaux.navigateur.test.js b/src/interface/plan/Panneaux.navigateur.test.js index 7cb3b1c..9231439 100644 --- a/src/interface/plan/Panneaux.navigateur.test.js +++ b/src/interface/plan/Panneaux.navigateur.test.js @@ -270,9 +270,9 @@ async function cliquerPoint({ x, y }) { } // Un clic réel au centre d'une chaise. Quand elle est hors du cadre du -// plan — les annonces du cadre de mode, avertissements compris, prennent -// leur hauteur à la surface —, la vue se déplace d'abord, par le cadrage de -// la séance, pour poser la chaise au centre du cadre, au même k. +// plan — les annonces de l'écran de l'événement, avertissements compris, +// prennent leur hauteur à la surface —, la vue se déplace d'abord, par le +// cadrage de la séance, pour poser la chaise au centre du cadre, au même k. async function cliquerChaise(m, table, siege) { const atteinte = () => { const { x, y } = pointChaise(m, table, siege); diff --git a/src/interface/plan/Vue.navigateur.test.js b/src/interface/plan/Vue.navigateur.test.js index de879a1..38cf746 100644 --- a/src/interface/plan/Vue.navigateur.test.js +++ b/src/interface/plan/Vue.navigateur.test.js @@ -808,7 +808,7 @@ describe('les commandes de vue n’écrivent rien et restent vivantes (§ 8.2, }); describe('le plein écran (§ 8.4, § 18.6)', () => { - test('la surface s’agrandit ; le cadre de mode, son libellé et le bandeau restent visibles ; ressorti, la surface retrouve sa boîte', async () => { + test('la surface s’agrandit ; la barre, la tête et la surface de l’événement, ses deux libellés de mode et le bandeau restent visibles ; ressorti, la surface retrouve sa boîte', async () => { const m = await petite(); await deuxImages(); const avant = boite(surface(m)); @@ -818,7 +818,7 @@ describe('le plein écran (§ 8.4, § 18.6)', () => { expect(plein.width * plein.height).toBeGreaterThan(avant.width * avant.height); expect(plein.height).toBeGreaterThan(avant.height); expect(plein.width).toBeGreaterThan(avant.width); - const temoins = [dans(m, '[data-mode]'), dans(m, '[data-mode-libelle="cadre"]'), dans(m, '[data-mode-libelle="bandeau"]'), dans(m, '[data-bandeau]')]; + const temoins = [dans(m, '[data-mode]'), dans(m, '[data-mode-libelle="barre"]'), dans(m, '[data-mode-libelle="bandeau"]'), dans(m, '[data-bandeau]')]; for (const temoin of temoins) { expect(temoin).not.toBeNull(); expect(visible(temoin)).toBe(true); diff --git a/src/interface/transversal.navigateur.test.js b/src/interface/transversal.navigateur.test.js index 73ed584..98f056f 100644 --- a/src/interface/transversal.navigateur.test.js +++ b/src/interface/transversal.navigateur.test.js @@ -466,7 +466,7 @@ function releverEtats(m) { function signatureMode(racine) { const surface = racine.querySelector('[data-mode]'); const bande = racine.querySelector('[data-ecran="evenement"] > [role="status"]'); - const libelle = racine.querySelector('[data-mode-libelle="cadre"]'); + const libelle = racine.querySelector('[data-mode-libelle="barre"]'); if (surface === null || bande === null || libelle === null) return null; const s = getComputedStyle(surface); const trait = ['Top', 'Right', 'Bottom', 'Left'].reduce((somme, cote) => somme + Number.parseFloat(s[`border${cote}Width`]), 0); @@ -517,7 +517,7 @@ export function fautesBandeau(racine, mode, { version = VERSION.affichee, proven if (libelle !== null) fautes.push(`libellé de mode « ${libelle.textContent.trim()} » sans événement ouvert`); return fautes; } - const barre = racine.querySelector('[data-mode-libelle="cadre"]'); + const barre = racine.querySelector('[data-mode-libelle="barre"]'); if (libelle === null) fautes.push(`libellé de mode absent du bandeau (${mode})`); else if (voir(libelle) !== true) fautes.push(`libellé de mode du bandeau non visible : ${voir(libelle)}`); if (barre === null) fautes.push(`libellé de mode absent de la barre (${mode})`); diff --git a/test/navigateur/designations.js b/test/navigateur/designations.js index f14214c..2669f1a 100644 --- a/test/navigateur/designations.js +++ b/test/navigateur/designations.js @@ -115,7 +115,7 @@ const ENTREES = [ ['data-mention', 'aperçu : une mention d’une page du plan imprimé — disposition relative, listes hors d’échelle', ['listes', 'relative']], ['data-menu', 'plan : le menu d’une personne', null], ['data-mode', 'événement : la barre, la tête et la surface de l’événement, par son mode', null], - ['data-mode-libelle', 'le libellé de mode', ['bandeau', 'cadre']], + ['data-mode-libelle', 'le libellé de mode', ['bandeau', 'barre']], ['data-motif', 'import : le motif d’une ligne refusée', ['']], ['data-multiligne', 'import : une ligne sur plusieurs lignes de texte', null], ['data-niveau', 'participants : le niveau d’un groupe ou d’un sélecteur', null],